summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--actions/shownotice.php8
-rw-r--r--actions/twitapistatuses.php10
-rwxr-xr-xclasses/Deleted_notice.php44
-rw-r--r--classes/Fave.php2
-rw-r--r--classes/Notice.php17
-rw-r--r--classes/Profile.php2
-rw-r--r--classes/User.php2
-rwxr-xr-x[-rw-r--r--]classes/laconica.ini11
-rw-r--r--db/laconica.sql14
-rw-r--r--db/laconica_pg.sql42
-rw-r--r--lib/common.php2
-rw-r--r--lib/rssaction.php6
-rwxr-xr-xscripts/twitterstatusfetcher.php2
-rw-r--r--theme/cloudy/css/display.css222
-rw-r--r--theme/cloudy/css/ie.css20
15 files changed, 336 insertions, 68 deletions
diff --git a/actions/shownotice.php b/actions/shownotice.php
index 8f73dc824..3d7319489 100644
--- a/actions/shownotice.php
+++ b/actions/shownotice.php
@@ -84,7 +84,13 @@ class ShownoticeAction extends OwnerDesignAction
$this->notice = Notice::staticGet($id);
if (empty($this->notice)) {
- $this->clientError(_('No such notice.'), 404);
+ // Did we used to have it, and it got deleted?
+ $deleted = Deleted_notice::staticGet($id);
+ if (!empty($deleted)) {
+ $this->clientError(_('Notice deleted.'), 410);
+ } else {
+ $this->clientError(_('No such notice.'), 404);
+ }
return false;
}
diff --git a/actions/twitapistatuses.php b/actions/twitapistatuses.php
index c9943698d..e3d366ecc 100644
--- a/actions/twitapistatuses.php
+++ b/actions/twitapistatuses.php
@@ -396,8 +396,14 @@ class TwitapistatusesAction extends TwitterapiAction
} else {
// XXX: Twitter just sets a 404 header and doens't bother
// to return an err msg
- $this->clientError(_('No status with that ID found.'),
- 404, $apidata['content-type']);
+ $deleted = Deleted_notice::staticGet($notice_id);
+ if (!empty($deleted)) {
+ $this->clientError(_('Status deleted.'),
+ 410, $apidata['content-type']);
+ } else {
+ $this->clientError(_('No status with that ID found.'),
+ 404, $apidata['content-type']);
+ }
}
}
diff --git a/classes/Deleted_notice.php b/classes/Deleted_notice.php
new file mode 100755
index 000000000..474d0b6f4
--- /dev/null
+++ b/classes/Deleted_notice.php
@@ -0,0 +1,44 @@
+<?php
+/*
+ * Laconica - a distributed open-source microblogging tool
+ * Copyright (C) 2008, 2009, Control Yourself, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+if (!defined('LACONICA')) { exit(1); }
+
+/**
+ * Table Definition for notice
+ */
+require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
+
+class Deleted_notice extends Memcached_DataObject
+{
+ ###START_AUTOCODE
+ /* the code below is auto generated do not remove the above tag */
+
+ public $__table = 'deleted_notice'; // table name
+ public $id; // int(4) primary_key not_null
+ public $profile_id; // int(4) not_null
+ public $uri; // varchar(255) unique_key
+ public $created; // datetime() not_null
+ public $deleted; // datetime() not_null
+
+ /* Static get */
+ function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Deleted_notice',$k,$v); }
+
+ /* the code above is auto generated do not remove the tag below */
+ ###END_AUTOCODE
+}
diff --git a/classes/Fave.php b/classes/Fave.php
index 4b28d06b4..11e876ff1 100644
--- a/classes/Fave.php
+++ b/classes/Fave.php
@@ -59,7 +59,7 @@ class Fave extends Memcached_DataObject
$qry = 'SELECT fave.* FROM fave ';
$qry .= 'INNER JOIN notice ON fave.notice_id = notice.id ';
$qry .= 'WHERE fave.user_id = ' . $user_id . ' ';
- $qry .= 'AND notice.is_local != ' . NOTICE_GATEWAY . ' ';
+ $qry .= 'AND notice.is_local != ' . Notice::GATEWAY . ' ';
}
if ($since_id != 0) {
diff --git a/classes/Notice.php b/classes/Notice.php
index 7f002d838..4e9aff4f5 100644
--- a/classes/Notice.php
+++ b/classes/Notice.php
@@ -32,7 +32,6 @@ define('NOTICE_CACHE_WINDOW', 61);
define('NOTICE_LOCAL_PUBLIC', 1);
define('NOTICE_REMOTE_OMB', 0);
define('NOTICE_LOCAL_NONPUBLIC', -1);
-define('NOTICE_GATEWAY', -2);
define('MAX_BOXCARS', 128);
@@ -63,6 +62,8 @@ class Notice extends Memcached_DataObject
/* the code above is auto generated do not remove the tag below */
###END_AUTOCODE
+ const GATEWAY = -2;
+
function getProfile()
{
return Profile::staticGet('id', $this->profile_id);
@@ -74,7 +75,21 @@ class Notice extends Memcached_DataObject
$this->blowFavesCache(true);
$this->blowSubsCache(true);
+ // For auditing purposes, save a record that the notice
+ // was deleted.
+
+ $deleted = new Deleted_notice();
+
+ $deleted->id = $this->id;
+ $deleted->profile_id = $this->profile_id;
+ $deleted->uri = $this->uri;
+ $deleted->created = $this->created;
+ $deleted->deleted = common_sql_now();
+
$this->query('BEGIN');
+
+ $deleted->insert();
+
//Null any notices that are replies to this notice
$this->query(sprintf("UPDATE notice set reply_to = null WHERE reply_to = %d", $this->id));
$related = array('Reply',
diff --git a/classes/Profile.php b/classes/Profile.php
index 372005cdd..f926b2cef 100644
--- a/classes/Profile.php
+++ b/classes/Profile.php
@@ -199,7 +199,7 @@ class Profile extends Memcached_DataObject
$query .= ' order by id DESC';
if (!is_null($offset)) {
- $query .= " limit $offset, $limit";
+ $query .= " LIMIT $limit OFFSET $offset";
}
$notice->query($query);
diff --git a/classes/User.php b/classes/User.php
index 6c1f149e4..bea47a3b0 100644
--- a/classes/User.php
+++ b/classes/User.php
@@ -443,7 +443,7 @@ class User extends Memcached_DataObject
'SELECT notice.* ' .
'FROM notice JOIN subscription ON notice.profile_id = subscription.subscribed ' .
'WHERE subscription.subscriber = %d ' .
- 'AND notice.is_local != ' . NOTICE_GATEWAY;
+ 'AND notice.is_local != ' . Notice::GATEWAY;
return Notice::getStream(sprintf($qry, $this->id),
'user:notices_with_friends:' . $this->id,
$offset, $limit, $since_id, $before_id,
diff --git a/classes/laconica.ini b/classes/laconica.ini
index 766bed75d..f8d4eebd3 100644..100755
--- a/classes/laconica.ini
+++ b/classes/laconica.ini
@@ -38,6 +38,17 @@ modified = 384
[consumer__keys]
consumer_key = K
+[deleted_notice]
+id = 129
+profile_id = 129
+uri = 2
+created = 142
+deleted = 142
+
+[deleted_notice__keys]
+id = K
+uri = U
+
[design]
id = 129
backgroundcolor = 1
diff --git a/db/laconica.sql b/db/laconica.sql
index 2c04f680a..f01107176 100644
--- a/db/laconica.sql
+++ b/db/laconica.sql
@@ -534,4 +534,16 @@ create table session (
index session_modified_idx (modified)
-) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; \ No newline at end of file
+) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
+
+create table deleted_notice (
+
+ id integer primary key comment 'identity of notice',
+ profile_id integer not null comment 'author of the notice',
+ uri varchar(255) unique key comment 'universally unique identifier, usually a tag URI',
+ created datetime not null comment 'date the notice record was created',
+ deleted datetime not null comment 'date the notice record was created',
+
+ index deleted_notice_profile_id_idx (profile_id)
+
+) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
diff --git a/db/laconica_pg.sql b/db/laconica_pg.sql
index 71c99f24f..31210fd1e 100644
--- a/db/laconica_pg.sql
+++ b/db/laconica_pg.sql
@@ -1,4 +1,3 @@
-
/* local and remote users have profiles */
create sequence profile_seq;
@@ -41,6 +40,19 @@ create table sms_carrier (
modified timestamp /* comment 'date this record was modified ' */
);
+create sequence design_seq;
+create table design (
+ id bigint default nextval('design_seq') /* comment 'design ID'*/,
+ backgroundcolor integer /* comment 'main background color'*/ ,
+ contentcolor integer /*comment 'content area background color'*/ ,
+ sidebarcolor integer /*comment 'sidebar background color'*/ ,
+ textcolor integer /*comment 'text color'*/ ,
+ linkcolor integer /*comment 'link color'*/,
+ backgroundimage varchar(255) /*comment 'background image, if any'*/,
+ disposition int default 1 /*comment 'bit 1 = hide background image, bit 2 = display background image, bit 4 = tile background image'*/,
+ primary key (id)
+);
+
/* local users */
create table "user" (
@@ -72,6 +84,8 @@ create table "user" (
autosubscribe integer default 0 /* comment 'automatically subscribe to users who subscribe to us' */,
urlshorteningservice varchar(50) default 'ur1.ca' /* comment 'service to use for auto-shortening URLs' */,
inboxed integer default 0 /* comment 'has an inbox been created for this user?' */,
+ design_id integer /* comment 'id of a design' */references design(id),
+ viewdesigns integer default 1 /* comment 'whether to view user-provided designs'*/,
created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */,
modified timestamp /* comment 'date this record was modified' */
@@ -376,20 +390,6 @@ create table profile_block (
);
-create sequence design_seq;
-create table design (
- id bigint default nextval('design_seq') /* comment 'design ID'*/,
- backgroundcolor integer /* comment 'main background color'*/ ,
- contentcolor integer /*comment 'content area background color'*/ ,
- sidebarcolor integer /*comment 'sidebar background color'*/ ,
- textcolor integer /*comment 'text color'*/ ,
- linkcolor integer /*comment 'link color'*/,
- backgroundimage varchar(255) /*comment 'background image, if any'*/,
- disposition int default 1 /*comment 'bit 1 = hide background image, bit 2 = display background image, bit 4 = tile background image'*/,
- primary key (id)
-);
-
-
create sequence user_group_seq;
create table user_group (
@@ -462,8 +462,7 @@ create table file (
create sequence file_oembed_seq;
create table file_oembed (
- id bigint default nextval('file_oembed_seq') primary key /* comment 'unique identifier' */,
- file_id bigint unique,
+ file_id bigint default nextval('file_oembed_seq') primary key /* comment 'unique identifier' */,
version varchar(20),
type varchar(20),
provider varchar(50),
@@ -479,8 +478,7 @@ create table file_oembed (
create sequence file_redirection_seq;
create table file_redirection (
- id bigint default nextval('file_redirection_seq') primary key /* comment 'unique identifier' */,
- url varchar(255) unique,
+ url varchar(255) primary key,
file_id bigint,
redirections integer,
httpcode integer
@@ -488,8 +486,7 @@ create table file_redirection (
create sequence file_thumbnail_seq;
create table file_thumbnail (
- id bigint default nextval('file_thumbnail_seq') primary key /* comment 'unique identifier' */,
- file_id bigint unique,
+ file_id bigint primary key,
url varchar(255) unique,
width integer,
height integer
@@ -497,11 +494,10 @@ create table file_thumbnail (
create sequence file_to_post_seq;
create table file_to_post (
- id bigint default nextval('file_to_post_seq') primary key /* comment 'unique identifier' */,
file_id bigint,
post_id bigint,
- unique(file_id, post_id)
+ primary key (file_id, post_id)
);
create table group_block (
diff --git a/lib/common.php b/lib/common.php
index 764c5a077..9d7954fa9 100644
--- a/lib/common.php
+++ b/lib/common.php
@@ -19,7 +19,7 @@
if (!defined('LACONICA')) { exit(1); }
-define('LACONICA_VERSION', '0.9.0dev');
+define('LACONICA_VERSION', '0.8.1dev');
define('AVATAR_PROFILE_SIZE', 96);
define('AVATAR_STREAM_SIZE', 48);
diff --git a/lib/rssaction.php b/lib/rssaction.php
index 6c982705e..0aca96566 100644
--- a/lib/rssaction.php
+++ b/lib/rssaction.php
@@ -123,11 +123,7 @@ class Rss10Action extends Action
}
// Get the list of notices
- if (empty($this->tag)) {
- $this->notices = $this->getNotices($this->limit);
- } else {
- $this->notices = $this->getTaggedNotices($this->tag, $this->limit);
- }
+ $this->notices = $this->getNotices($this->limit);
$this->showRss();
}
diff --git a/scripts/twitterstatusfetcher.php b/scripts/twitterstatusfetcher.php
index e2ba1d003..e1745cfc0 100755
--- a/scripts/twitterstatusfetcher.php
+++ b/scripts/twitterstatusfetcher.php
@@ -330,7 +330,7 @@ class TwitterStatusFetcher extends Daemon
$notice->rendered = common_render_content($notice->content, $notice);
$notice->source = 'twitter';
$notice->reply_to = null; // XXX lookup reply
- $notice->is_local = NOTICE_GATEWAY;
+ $notice->is_local = Notice::GATEWAY;
if (Event::handle('StartNoticeSave', array(&$notice))) {
$id = $notice->insert();
diff --git a/theme/cloudy/css/display.css b/theme/cloudy/css/display.css
index 12f186a56..82a1a1e4e 100644
--- a/theme/cloudy/css/display.css
+++ b/theme/cloudy/css/display.css
@@ -12,12 +12,12 @@ img { display:block; border:0; }
a abbr { cursor: pointer; border-bottom:0; }
table { border-collapse:collapse; }
ol { list-style-position:inside; }
-html { font-size: 100%; background-color:#fff; }
+html { font-size: 87.5%; }
body {
background-color:#fff;
color:#000;
font-family:sans-serif;
-font-size:0.75em;
+font-size:1em;
line-height:normal;
position:relative;
height:100%;
@@ -471,6 +471,24 @@ margin-bottom:7px;
#form_notice #notice_submit label {
display:none;
}
+#form_notice label[for=notice_data-attach],
+#form_notice #notice_data-attach {
+position:absolute;
+top:87px;
+cursor:pointer;
+}
+#form_notice label[for=notice_data-attach] {
+text-indent:-9999px;
+left:82%;
+width:16px;
+height:16px;
+}
+#form_notice #notice_data-attach {
+left:34.6%;
+padding:0;
+height:16px;
+}
+
#form_notice .form_note {
position:absolute;
top:-10px;
@@ -488,6 +506,7 @@ font-weight:bold;
line-height:1.15;
padding:1px 2px;
}
+
#form_notice #notice_action-submit {
width:14%;
height:35px;
@@ -505,6 +524,26 @@ margin-bottom:7px;
margin-left:18px;
float:left;
}
+#form_notice .error,
+#form_notice .success {
+float:left;
+clear:both;
+width:81.5%;
+margin-bottom:0;
+line-height:1.618;
+}
+#form_notice #notice_data-attach_selected code {
+float:left;
+width:90%;
+display:block;
+font-size:1.1em;
+line-height:1.8;
+overflow:auto;
+}
+#form_notice #notice_data-attach_selected button {
+float:right;
+font-size:0.8em;
+}
/* entity_profile */
@@ -746,17 +785,18 @@ float:left;
width:100%;
border-top-width:1px;
border-top-style:dotted;
-font-size:1.2em;
}
.notices li {
list-style-type:none;
line-height:1.1;
-width:94%;
-padding-right:5%;
-padding-left:1%;
min-height:47px;
}
-
+.notices .notices {
+margin-top:7px;
+margin-left:2%;
+width:98%;
+float:left;
+}
/* NOTICES */
#notices_primary {
@@ -805,13 +845,17 @@ text-decoration:underline;
.notice .entry-title {
float:none;
-display:inline;
-width:100%;
overflow:hidden;
+display:inline;
}
#shownotice .notice .entry-title {
font-size:2.2em;
}
+#conversation .notice .entry-title {
+display:block;
+width:90%;
+}
+
.notice p.entry-content {
display:inline;
@@ -887,13 +931,12 @@ outline:none;
.notice-options {
padding-left:2%;
float:left;
-width:50%;
font-size:0.95em;
-width:12.5%;
+width:16px;
float:right;
display:none;
}
-.notices li.hover div.notice-options {
+.notices li:hover div.notice-options {
display:block;
}
@@ -917,7 +960,7 @@ top:30px;
right:7px;
}
.notice-options .notice_delete {
-bottom:7px;
+top:47px;
right:7px;
}
.notice-options .notice_reply dt {
@@ -958,6 +1001,97 @@ border:0;
padding:0;
}
+.notice .attachment {
+position:relative;
+padding-left:16px;
+}
+#attachments .attachment {
+padding-left:0;
+}
+.notice .attachment img {
+position:absolute;
+top:18px;
+left:0;
+z-index:99;
+}
+#shownotice .notice .attachment img {
+position:static;
+}
+
+#attachments {
+clear:both;
+float:left;
+width:100%;
+margin-top:18px;
+}
+#attachments dt {
+font-weight:bold;
+font-size:1.3em;
+margin-bottom:4px;
+}
+
+#attachments ol li {
+margin-bottom:18px;
+list-style-type:decimal;
+float:left;
+clear:both;
+}
+
+#jOverlayContent,
+#jOverlayContent #content,
+#jOverlayContent #content_inner {
+width: auto !important;
+margin-bottom:0;
+}
+#jOverlayContent #content {
+padding:11px;
+min-height:auto;
+}
+#jOverlayContent .external span {
+display:block;
+margin-bottom:11px;
+}
+#jOverlayContent button {
+position:absolute;
+top:0;
+right:0;
+width:29px;
+height:29px;
+text-align:center;
+font-weight:bold;
+padding:0;
+}
+#jOverlayContent h1 {
+max-width:425px;
+}
+#jOverlayContent #content {
+border-radius:7px;
+-moz-border-radius:7px;
+-webkit-border-radius:7px;
+}
+#jOverlayLoading {
+top:5%;
+left:40%;
+}
+#attachment_view img {
+max-width:480px;
+max-height:480px;
+}
+#attachment_view #oembed_info {
+margin-top:11px;
+}
+#attachment_view #oembed_info dt,
+#attachment_view #oembed_info dd {
+float:left;
+}
+#attachment_view #oembed_info dt {
+clear:left;
+margin-right:11px;
+font-weight:bold;
+}
+#attachment_view #oembed_info dt:after {
+content: ":";
+}
#usergroups #new_group {
float: left;
@@ -1218,7 +1352,8 @@ clear:both;
#outbox.user_in #content,
#subscriptions.user_in #content,
#subscribers.user_in #content,
-#showgroup.user_in #content {
+#showgroup.user_in #content,
+#conversation.user_in #content {
padding-top:160px;
}
@@ -1243,6 +1378,14 @@ padding-top:160px;
display:none;
}
+#jOverlayContent #core #content {
+padding-top:11px;
+}
+#jOverlayContent #core {
+background:none;
+padding-top:0;
+}
+
html,
body,
@@ -1311,24 +1454,23 @@ border-top-color:#87B4C8;
}
-#content .notice p.entry-content a:visited {
-background-color:#fcfcfc;
-}
-#content .notice p.entry-content .vcard a {
-background-color:#fcfffc;
-}
-
#aside_primary {
background-color:#DDFFCC;
}
-
#notice_text-count {
-color:#333;
+color:#000000;
}
#form_notice.warning #notice_text-count {
-color:#000;
+color:#000000;
}
+#form_notice label[for=notice_data-attach] {
+background:transparent url(../../base/images/icons/twotone/green/clip-01.gif) no-repeat 0 45%;
+}
+#form_notice #notice_data-attach {
+opacity:0;
+}
+
#form_notice.processing #notice_action-submit {
background:#fff url(../../base/images/icons/icon_processing.gif) no-repeat 47% 47%;
cursor:wait;
@@ -1426,8 +1568,11 @@ background-image:url(../images/icons/twotone/green/shield.gif);
/* NOTICES */
-.notices li.over {
-background-color:#fcfcfc;
+.notice .attachment {
+background:transparent url(../../base/images/icons/twotone/green/clip-02.gif) no-repeat 0 45%;
+}
+#attachments .attachment {
+background:none;
}
.notice-options .notice_reply a,
@@ -1451,10 +1596,24 @@ background:transparent url(../images/icons/icon_trash.gif) no-repeat 0 45%;
.notices div.notice-options {
opacity:0.4;
}
-.notices li.hover div.entry-content,
-.notices li.hover div.notice-options {
+.notices li:hover div.entry-content,
+.notices li:hover div.notice-options {
opacity:1;
}
+.notices .notices {
+background-color:rgba(200, 200, 200, 0.01);
+}
+.notices .notices .notices {
+background-color:rgba(200, 200, 200, 0.02);
+}
+.notices .notices .notices .notices {
+background-color:rgba(200, 200, 200, 0.03);
+}
+.notices .notices .notices .notices .notices {
+background-color:rgba(200, 200, 200, 0.04);
+}
+
+
div.entry-content {
color:#333;
}
@@ -1462,8 +1621,11 @@ div.notice-options a,
div.notice-options input {
font-family:sans-serif;
}
-.notices li.hover {
-background-color:#fcfcfc;
+#content .notices li:hover {
+background-color:rgba(240, 240, 240, 0.2);
+}
+#conversation .notices li:hover {
+background-color:transparent;
}
/*END: NOTICES */
diff --git a/theme/cloudy/css/ie.css b/theme/cloudy/css/ie.css
index 095122100..94c2093b1 100644
--- a/theme/cloudy/css/ie.css
+++ b/theme/cloudy/css/ie.css
@@ -8,6 +8,16 @@ color:#fff;
background-color:#ddffcc;
}
+#form_notice .form_note + label {
+position:absolute;
+top:25px;
+left:83%;
+text-indent:-9999px;
+height:16px;
+width:16px;
+display:block;
+}
+
#aside_primary {
width:181px;
}
@@ -32,3 +42,13 @@ top:158px;
#subscribers #content {
padding-top:138px;
}
+
+.notice {
+z-index:1;
+}
+.notice:hover {
+z-index:9999;
+}
+.notice .thumbnail img {
+z-index:9999;
+}