From f01538a54f68c172e09aabed90e2651ca2305675 Mon Sep 17 00:00:00 2001 From: Friendika Date: Tue, 15 Mar 2011 17:31:49 -0700 Subject: [PATCH] content expiration --- boot.php | 2 +- database.sql | 1 + include/expire.php | 44 +++++++++++++++++++++++++++++ include/items.php | 46 +++++++++++++++++++++++++++++++ include/notifier.php | 34 +++++++++++++++-------- include/poller.php | 11 ++++++++ mod/item.php | 2 +- mod/settings.php | 6 +++- update.php | 8 +++++- view/de/settings.tpl | 6 +++- view/en/settings.tpl | 7 +++-- view/fr/settings.tpl | 5 +++- view/it/settings.tpl | 5 +++- view/theme/duepuntozero/style.css | 4 +++ view/theme/loozah/style.css | 4 +++ 15 files changed, 165 insertions(+), 20 deletions(-) create mode 100644 include/expire.php diff --git a/boot.php b/boot.php index baecdc9c3f..b03221bf80 100644 --- a/boot.php +++ b/boot.php @@ -4,7 +4,7 @@ set_time_limit(0); define ( 'FRIENDIKA_VERSION', '2.1.919' ); define ( 'DFRN_PROTOCOL_VERSION', '2.1' ); -define ( 'DB_UPDATE_VERSION', 1042 ); +define ( 'DB_UPDATE_VERSION', 1043 ); define ( 'EOL', "
\r\n" ); define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' ); diff --git a/database.sql b/database.sql index 3a58decd12..0ecf0ea200 100644 --- a/database.sql +++ b/database.sql @@ -379,6 +379,7 @@ CREATE TABLE IF NOT EXISTS `user` ( `page-flags` int(11) unsigned NOT NULL DEFAULT '0', `pwdreset` char(255) NOT NULL, `maxreq` int(11) NOT NULL DEFAULT '10', + `expire` int(11) unsigned NOT NULL DEFAULT '0', `allow_cid` mediumtext NOT NULL, `allow_gid` mediumtext NOT NULL, `deny_cid` mediumtext NOT NULL, diff --git a/include/expire.php b/include/expire.php new file mode 100644 index 0000000000..3c30e01c1b --- /dev/null +++ b/include/expire.php @@ -0,0 +1,44 @@ +set_baseurl(get_config('system','url')); + + + logger('expire: start'); + + $r = q("SELECT `uid`,`username`,`expire` FROM `user` WHERE `expire` != 0"); + if(count($r)) { + foreach($r as $rr) { + logger('Expire: ' . $rr['username'] . ' interval: ' . $rr['expire'], LOGGER_DEBUG); + item_expire($rr['uid'],$rr['expire']); + } + } + + return; +} + +if (array_search(__file__,get_included_files())===0){ + expire_run($argv,$argc); + killme(); +} diff --git a/include/items.php b/include/items.php index 2294fe294a..0516593218 100644 --- a/include/items.php +++ b/include/items.php @@ -1507,3 +1507,49 @@ function atom_entry($item,$type,$author,$owner,$comment = false) { return $o; } +function item_expire($uid,$days) { + + if((! $uid) || (! $days)) + return; + + $r = q("SELECT * FROM `item` + WHERE `uid` = %d + AND `created` < UTC_TIMESTAMP() - INTERVAL %d DAY + AND `id` = `parent` + AND `deleted` = 0", + intval($uid), + intval($days) + ); + + if(! count($r)) + return; + + logger('expire: # items=' . count($r) ); + + foreach($r as $item) { + + // Only expire posts, not photos and photo comments + + if(strlen($item['resource-id'])) + continue; + + $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s' WHERE `id` = %d LIMIT 1", + dbesc(datetime_convert()), + dbesc(datetime_convert()), + intval($item['id']) + ); + + // kill the kids + + $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s' WHERE `parent-uri` = '%s' AND `uid` = %d ", + dbesc(datetime_convert()), + dbesc(datetime_convert()), + dbesc($item['parent-uri']), + intval($item['uid']) + ); + + } + + proc_run('php',"include/notifier.php","expire","$uid"); + +} \ No newline at end of file diff --git a/include/notifier.php b/include/notifier.php index 648a07062c..ca2304845e 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -40,6 +40,7 @@ function notifier_run($argv, $argc){ break; } + $expire = false; $top_level = false; $recipients = array(); $url_recipients = array(); @@ -57,6 +58,17 @@ function notifier_run($argv, $argc){ $item = $message[0]; } + elseif($cmd === 'expire') { + $expire = true; + $items = q("SELECT * FROM `item` WHERE `uid` = %d AND `wall` = 1 + AND `deleted` = 1 AND `changed` > UTC_TIMESTAMP - INTERVAL 10 MINUTE", + intval($item_id) + ); + $uid = $item_id; + $item_id = 0; + if(! count($items)) + return; + } else { // find ancestors @@ -76,11 +88,10 @@ function notifier_run($argv, $argc){ intval($parent_id) ); - if(! count($items)){ + if(! count($items)) { return; } - // avoid race condition with deleting entries if($items[0]['deleted']) { @@ -98,11 +109,11 @@ function notifier_run($argv, $argc){ intval($uid) ); - if(count($r)) - $owner = $r[0]; - else { + if(! count($r)) return; - } + + $owner = $r[0]; + $hub = get_config('system','huburl'); // If this is a public conversation, notify the feed hub @@ -117,7 +128,7 @@ function notifier_run($argv, $argc){ $parent = $items[0]; - if($parent['type'] === 'remote') { + if($parent['type'] === 'remote' && (! $expire)) { // local followup to remote post $followup = true; $notify_hub = false; // not public @@ -235,6 +246,7 @@ function notifier_run($argv, $argc){ } else { foreach($items as $item) { + if(! $item['parent']) continue; @@ -242,9 +254,9 @@ function notifier_run($argv, $argc){ if(! $contact) continue; - $atom .= atom_entry($item,'text',$contact,$owner,true); + $atom .= atom_entry($item,'text',$contact,$owner,true); - if(($top_level) && ($notify_hub) && ($item['author-link'] === $item['owner-link'])) + if(($top_level) && ($notify_hub) && ($item['author-link'] === $item['owner-link']) && (! $expire)) $slaps[] = atom_entry($item,'html',$contact,$owner,true); } } @@ -319,7 +331,7 @@ function notifier_run($argv, $argc){ // only send salmon if public - e.g. if it's ok to notify // a public hub, it's ok to send a salmon - if(count($slaps) && $notify_hub) { + if((count($slaps)) && ($notify_hub) && (! $expire)) { logger('notifier: slapdelivery: ' . $contact['name']); foreach($slaps as $slappy) { if($contact['notify']) { @@ -350,7 +362,7 @@ function notifier_run($argv, $argc){ // send additional slaps to mentioned remote tags (@foo@example.com) - if($slap && count($url_recipients) && $followup && $notify_hub) { + if($slap && count($url_recipients) && $followup && $notify_hub && (! $expire)) { foreach($url_recipients as $url) { if($url) { logger('notifier: urldelivery: ' . $url); diff --git a/include/poller.php b/include/poller.php index a093190a60..8619697d96 100644 --- a/include/poller.php +++ b/include/poller.php @@ -29,6 +29,17 @@ function poller_run($argv, $argc){ proc_run('php',"include/queue.php"); + // once daily run expire in background + + $d1 = get_config('system','last_expire_day'); + $d2 = intval(datetime_convert('UTC','UTC','now','d')); + + if($d2 != intval($d1)) { + set_config('system','last_expire_day',$d2); + proc_run('php','include/expire.php'); + } + + // clear old cache q("DELETE FROM `cache` WHERE `updated` < '%s'", dbesc(datetime_convert('UTC','UTC',"now - 30 days"))); diff --git a/mod/item.php b/mod/item.php index 5989d09674..90fb546bce 100644 --- a/mod/item.php +++ b/mod/item.php @@ -532,7 +532,7 @@ function item_content(&$a) { require_once('include/security.php'); - $uid = $_SESSION['uid']; + $uid = local_user(); if(($a->argc == 3) && ($a->argv[1] === 'drop') && intval($a->argv[2])) { diff --git a/mod/settings.php b/mod/settings.php index ebe07612eb..85029b3d72 100644 --- a/mod/settings.php +++ b/mod/settings.php @@ -63,6 +63,7 @@ function settings_post(&$a) { $defloc = ((x($_POST,'defloc')) ? notags(trim($_POST['defloc'])) : ''); $openid = ((x($_POST,'openid_url')) ? notags(trim($_POST['openid_url'])) : ''); $maxreq = ((x($_POST,'maxreq')) ? intval($_POST['maxreq']) : 0); + $expire = ((x($_POST,'expire')) ? intval($_POST['expire']) : 0); $allow_location = (((x($_POST,'allow_location')) && (intval($_POST['allow_location']) == 1)) ? 1: 0); $publish = (((x($_POST,'profile_in_directory')) && (intval($_POST['profile_in_directory']) == 1)) ? 1: 0); @@ -139,7 +140,7 @@ function settings_post(&$a) { $openidserver = ''; } - $r = q("UPDATE `user` SET `username` = '%s', `email` = '%s', `openid` = '%s', `timezone` = '%s', `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s', `notify-flags` = %d, `page-flags` = %d, `default-location` = '%s', `allow_location` = %d, `theme` = '%s', `maxreq` = %d, `openidserver` = '%s' WHERE `uid` = %d LIMIT 1", + $r = q("UPDATE `user` SET `username` = '%s', `email` = '%s', `openid` = '%s', `timezone` = '%s', `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s', `notify-flags` = %d, `page-flags` = %d, `default-location` = '%s', `allow_location` = %d, `theme` = '%s', `maxreq` = %d, `expire` = %d, `openidserver` = '%s' WHERE `uid` = %d LIMIT 1", dbesc($username), dbesc($email), dbesc($openid), @@ -154,6 +155,7 @@ function settings_post(&$a) { intval($allow_location), dbesc($theme), intval($maxreq), + intval($expire), dbesc($openidserver), intval(local_user()) ); @@ -238,6 +240,7 @@ function settings_content(&$a) { $defloc = $a->user['default-location']; $openid = $a->user['openid']; $maxreq = $a->user['maxreq']; + $expire = ((intval($a->user['expire'])) ? $a->user['expire'] : ''); if(! strlen($a->user['timezone'])) $timezone = date_default_timezone_get(); @@ -358,6 +361,7 @@ function settings_content(&$a) { '$sel_notify4' => (($notify & NOTIFY_COMMENT) ? ' checked="checked" ' : ''), '$sel_notify5' => (($notify & NOTIFY_MAIL) ? ' checked="checked" ' : ''), '$maxreq' => $maxreq, + '$expire' => $expire, '$theme' => $theme_selector, '$pagetype' => $pagetype )); diff --git a/update.php b/update.php index 7a885193cd..0be919f3f1 100644 --- a/update.php +++ b/update.php @@ -400,4 +400,10 @@ function update_1040() { function update_1041() { q("ALTER TABLE `profile` CHANGE `keywords` `prv_keywords` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL "); q("ALTER TABLE `profile` ADD `pub_keywords` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL AFTER `religion` "); -} \ No newline at end of file +} + +function update_1042() { + q("ALTER TABLE `user` ADD `expire` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `maxreq` "); +} + + diff --git a/view/de/settings.tpl b/view/de/settings.tpl index 0ef50546f4..675ef675f5 100644 --- a/view/de/settings.tpl +++ b/view/de/settings.tpl @@ -78,7 +78,7 @@ $profile_in_net_dir
- +
+
Automatically expire (delete) posts older than days
+
+ +
diff --git a/view/en/settings.tpl b/view/en/settings.tpl index 97d67cbf61..39b18c1262 100644 --- a/view/en/settings.tpl +++ b/view/en/settings.tpl @@ -76,9 +76,8 @@ $profile_in_dir $profile_in_net_dir -
- +
+
Automatically expire (delete) posts older than days
+
+ +
diff --git a/view/fr/settings.tpl b/view/fr/settings.tpl index 97d67cbf61..eb386579f0 100644 --- a/view/fr/settings.tpl +++ b/view/fr/settings.tpl @@ -78,7 +78,7 @@ $profile_in_net_dir
- +
+
Automatically expire (delete) posts older than days
+
+
diff --git a/view/it/settings.tpl b/view/it/settings.tpl index 3b68923cf4..87f40f26fc 100644 --- a/view/it/settings.tpl +++ b/view/it/settings.tpl @@ -79,7 +79,7 @@ $profile_in_net_dir
- +
+
Automatically expire (delete) posts older than days
+
+
diff --git a/view/theme/duepuntozero/style.css b/view/theme/duepuntozero/style.css index ca8764283c..54a522881f 100644 --- a/view/theme/duepuntozero/style.css +++ b/view/theme/duepuntozero/style.css @@ -373,6 +373,10 @@ input#dfrn-url { margin-bottom: 30px; } +#settings-expire-end { + margin-bottom: 30px; +} + #settings-username-end, #settings-email-end, #settings-nick-end, diff --git a/view/theme/loozah/style.css b/view/theme/loozah/style.css index aadfbd3c4f..f1de801cb0 100644 --- a/view/theme/loozah/style.css +++ b/view/theme/loozah/style.css @@ -506,6 +506,10 @@ input#dfrn-url { margin-bottom: 30px; } +#settings-expire-end { + margin-bottom: 30px; +} + #settings-username-end, #settings-email-end, #settings-nick-end,