From 7de5c7ebe1fba7757f06762d26dae478c9de5389 Mon Sep 17 00:00:00 2001 From: zottel Date: Fri, 2 Nov 2012 21:43:47 +0100 Subject: [PATCH 1/3] Changes to make contacts delete all content from the user when a user is deleted. NOTE: I didn't add "AND account_removed = 0" to facebook.php because I don't have a clone of the addons repository. Please someone do that for me. Thanks. Please check carefully. I tested locally on my server, but not with other servers. --- include/Contact.php | 8 ++++++-- include/api.php | 2 +- include/auth.php | 4 ++-- include/delivery.php | 2 +- include/diaspora.php | 2 +- include/notifier.php | 16 +++++++++++++++- include/oauth.php | 2 +- include/poller.php | 12 +++++++++++- mod/dfrn_notify.php | 4 ++-- mod/openid.php | 2 +- mod/post.php | 2 +- mod/profile.php | 2 +- mod/pubsub.php | 4 ++-- mod/receive.php | 2 +- mod/salmon.php | 2 +- 15 files changed, 47 insertions(+), 19 deletions(-) diff --git a/include/Contact.php b/include/Contact.php index ecc271a8e..1a7a1676a 100644 --- a/include/Contact.php +++ b/include/Contact.php @@ -22,7 +22,8 @@ function user_remove($uid) { $r[0]['nickname'] ); - q("DELETE FROM `contact` WHERE `uid` = %d", intval($uid)); + // don't delete yet, will be done later when contacts have deleted my stuff + // q("DELETE FROM `contact` WHERE `uid` = %d", intval($uid)); q("DELETE FROM `gcign` WHERE `uid` = %d", intval($uid)); q("DELETE FROM `group` WHERE `uid` = %d", intval($uid)); q("DELETE FROM `group_member` WHERE `uid` = %d", intval($uid)); @@ -41,7 +42,10 @@ function user_remove($uid) { q("DELETE FROM `pconfig` WHERE `uid` = %d", intval($uid)); q("DELETE FROM `search` WHERE `uid` = %d", intval($uid)); q("DELETE FROM `spam` WHERE `uid` = %d", intval($uid)); - q("DELETE FROM `user` WHERE `uid` = %d", intval($uid)); + // don't delete yet, will be done later when contacts have deleted my stuff + // q("DELETE FROM `user` WHERE `uid` = %d", intval($uid)); + q("UPDATE `user` SET `account_removed` = 1, `account_expires_on` = UTC_TIMESTAMP() WHERE `uid` = %d", intval($uid)); + proc_run('php', "include/notifier.php", "removeme", $uid); if($uid == local_user()) { unset($_SESSION['authenticated']); unset($_SESSION['uid']); diff --git a/include/api.php b/include/api.php index 456d984de..7517abb70 100644 --- a/include/api.php +++ b/include/api.php @@ -74,7 +74,7 @@ // process normal login request $r = q("SELECT * FROM `user` WHERE ( `email` = '%s' OR `nickname` = '%s' ) - AND `password` = '%s' AND `blocked` = 0 AND `account_expired` = 0 AND `verified` = 1 LIMIT 1", + AND `password` = '%s' AND `blocked` = 0 AND `account_expired` = 0 AND `account_removed` = 0 AND `verified` = 1 LIMIT 1", dbesc(trim($user)), dbesc(trim($user)), dbesc($encrypted) diff --git a/include/auth.php b/include/auth.php index c4f1f0865..523de88ce 100644 --- a/include/auth.php +++ b/include/auth.php @@ -59,7 +59,7 @@ if((isset($_SESSION)) && (x($_SESSION,'authenticated')) && ((! (x($_POST,'auth-p } $r = q("SELECT `user`.*, `user`.`pubkey` as `upubkey`, `user`.`prvkey` as `uprvkey` - FROM `user` WHERE `uid` = %d AND `blocked` = 0 AND `account_expired` = 0 AND `verified` = 1 LIMIT 1", + FROM `user` WHERE `uid` = %d AND `blocked` = 0 AND `account_expired` = 0 AND `account_removed` = 0 AND `verified` = 1 LIMIT 1", intval($_SESSION['uid']) ); @@ -147,7 +147,7 @@ else { $r = q("SELECT `user`.*, `user`.`pubkey` as `upubkey`, `user`.`prvkey` as `uprvkey` FROM `user` WHERE ( `email` = '%s' OR `nickname` = '%s' ) - AND `password` = '%s' AND `blocked` = 0 AND `account_expired` = 0 AND `verified` = 1 LIMIT 1", + AND `password` = '%s' AND `blocked` = 0 AND `account_expired` = 0 AND `account_removed` = 0 AND `verified` = 1 LIMIT 1", dbesc(trim($_POST['username'])), dbesc(trim($_POST['username'])), dbesc($encrypted) diff --git a/include/delivery.php b/include/delivery.php index 14226e4fb..613453bc7 100644 --- a/include/delivery.php +++ b/include/delivery.php @@ -323,7 +323,7 @@ function delivery_run($argv, $argc){ WHERE `contact`.`blocked` = 0 AND `contact`.`pending` = 0 AND `contact`.`network` = '%s' AND `user`.`nickname` = '%s' $sql_extra - AND `user`.`account_expired` = 0 LIMIT 1", + AND `user`.`account_expired` = 0 AND `user`.`account_removed` = 0 LIMIT 1", dbesc(NETWORK_DFRN), dbesc($nickname) ); diff --git a/include/diaspora.php b/include/diaspora.php index c5b724509..f645aeb39 100755 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -16,7 +16,7 @@ function diaspora_dispatch_public($msg) { return; } - $r = q("SELECT `user`.* FROM `user` WHERE `user`.`uid` IN ( SELECT `contact`.`uid` FROM `contact` WHERE `contact`.`network` = '%s' AND `contact`.`addr` = '%s' ) AND `account_expired` = 0 ", + $r = q("SELECT `user`.* FROM `user` WHERE `user`.`uid` IN ( SELECT `contact`.`uid` FROM `contact` WHERE `contact`.`network` = '%s' AND `contact`.`addr` = '%s' ) AND `account_expired` = 0 AND `account_removed` = 0 ", dbesc(NETWORK_DIASPORA), dbesc($msg['author']) ); diff --git a/include/notifier.php b/include/notifier.php index 171b55fc3..a999c3297 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -134,6 +134,20 @@ function notifier_run($argv, $argc){ $recipients[] = $suggest[0]['cid']; $item = $suggest[0]; } + elseif($cmd === 'removeme') { + $r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", intval($item_id)); + $user = $r[0]; + $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 1 LIMIT 1", intval($item_id)); + $self = $r[0]; + $r = q("SELECT * FROM `contact` WHERE `self` = 0 AND `uid` = %d", intval($item_id)); + if(! count($r)) + return; + require_once('include/Contact.php'); + foreach($r as $contact) { + terminate_friendship($user, $self, $contact); + } + return; + } else { // find ancestors @@ -575,7 +589,7 @@ function notifier_run($argv, $argc){ AND `contact`.`pending` = 0 AND `contact`.`network` = '%s' AND `user`.`nickname` = '%s' $sql_extra - AND `user`.`account_expired` = 0 LIMIT 1", + AND `user`.`account_expired` = 0 AND `user`.`account_removed` = 0 LIMIT 1", dbesc(NETWORK_DFRN), dbesc($nickname) ); diff --git a/include/oauth.php b/include/oauth.php index 103d4c2fa..28ac4428f 100644 --- a/include/oauth.php +++ b/include/oauth.php @@ -133,7 +133,7 @@ class FKOAuth1 extends OAuthServer { function loginUser($uid){ logger("FKOAuth1::loginUser $uid"); $a = get_app(); - $r = q("SELECT * FROM `user` WHERE uid=%d AND `blocked` = 0 AND `account_expired` = 0 AND `verified` = 1 LIMIT 1", + $r = q("SELECT * FROM `user` WHERE uid=%d AND `blocked` = 0 AND `account_expired` = 0 AND `account_removed` = 0 AND `verified` = 1 LIMIT 1", intval($uid) ); if(count($r)){ diff --git a/include/poller.php b/include/poller.php index fefc9b381..ce8399a48 100644 --- a/include/poller.php +++ b/include/poller.php @@ -67,6 +67,16 @@ function poller_run($argv, $argc){ q("UPDATE user SET `account_expired` = 1 where `account_expired` = 0 AND `account_expires_on` != '0000-00-00 00:00:00' AND `account_expires_on` < UTC_TIMESTAMP() "); + + // delete user and contact records for recently removed accounts + + $r = q("SELECT * FROM `user` WHERE `account_removed` = 1 AND `account_expires_on` < UTC_TIMESTAMP() - INTERVAL 3 DAY"); + if (count($r)) { + foreach($r as $user) { + q("DELETE FROM `contact` WHERE `uid` = %d", intval($user['uid'])); + q("DELETE FROM `user` WHERE `uid` = %d", intval($user['uid'])); + } + } $abandon_days = intval(get_config('system','account_abandon_days')); if($abandon_days < 1) @@ -154,7 +164,7 @@ function poller_run($argv, $argc){ $sql_extra AND `self` = 0 AND `contact`.`blocked` = 0 AND `contact`.`readonly` = 0 AND `contact`.`archive` = 0 - AND `user`.`account_expired` = 0 $abandon_sql ORDER BY RAND()", + AND `user`.`account_expired` = 0 AND `user`.`account_removed` = 0 $abandon_sql ORDER BY RAND()", intval(CONTACT_IS_SHARING), intval(CONTACT_IS_FRIEND), dbesc(NETWORK_DIASPORA), diff --git a/mod/dfrn_notify.php b/mod/dfrn_notify.php index e55da5572..476212b7a 100644 --- a/mod/dfrn_notify.php +++ b/mod/dfrn_notify.php @@ -77,7 +77,7 @@ function dfrn_notify_post(&$a) { FROM `contact` LEFT JOIN `user` ON `contact`.`uid` = `user`.`uid` WHERE `contact`.`blocked` = 0 AND `contact`.`pending` = 0 - AND `user`.`nickname` = '%s' AND `user`.`account_expired` = 0 $sql_extra LIMIT 1", + AND `user`.`nickname` = '%s' AND `user`.`account_expired` = 0 AND `user`.`account_removed` = 0 $sql_extra LIMIT 1", dbesc($a->argv[1]) ); @@ -220,7 +220,7 @@ function dfrn_notify_content(&$a) { $r = q("SELECT `contact`.*, `user`.`nickname`, `user`.`page-flags` FROM `contact` LEFT JOIN `user` ON `user`.`uid` = `contact`.`uid` WHERE `contact`.`blocked` = 0 AND `contact`.`pending` = 0 AND `user`.`nickname` = '%s' - AND `user`.`account_expired` = 0 $sql_extra LIMIT 1", + AND `user`.`account_expired` = 0 AND `user`.`account_removed` = 0 $sql_extra LIMIT 1", dbesc($a->argv[1]) ); diff --git a/mod/openid.php b/mod/openid.php index e2cea7d85..5d5539f00 100644 --- a/mod/openid.php +++ b/mod/openid.php @@ -27,7 +27,7 @@ function openid_content(&$a) { $r = q("SELECT `user`.*, `user`.`pubkey` as `upubkey`, `user`.`prvkey` as `uprvkey` FROM `user` WHERE `openid` = '%s' AND `blocked` = 0 - AND `account_expired` = 0 AND `verified` = 1 LIMIT 1", + AND `account_expired` = 0 AND `account_removed` = 0 AND `verified` = 1 LIMIT 1", dbesc($authid) ); diff --git a/mod/post.php b/mod/post.php index 4a7e33b23..c0e783a6a 100644 --- a/mod/post.php +++ b/mod/post.php @@ -20,7 +20,7 @@ function post_post(&$a) { else { $nickname = $a->argv[2]; $r = q("SELECT * FROM `user` WHERE `nickname` = '%s' - AND `account_expired` = 0 LIMIT 1", + AND `account_expired` = 0 AND `account_removed` = 0 LIMIT 1", dbesc($nickname) ); if(! count($r)) diff --git a/mod/profile.php b/mod/profile.php index 6a80909e7..827166f92 100644 --- a/mod/profile.php +++ b/mod/profile.php @@ -12,7 +12,7 @@ function profile_init(&$a) { if($a->argc > 1) $which = $a->argv[1]; else { - $r = q("select nickname from user where blocked = 0 and account_expired = 0 and verified = 1 order by rand() limit 1"); + $r = q("select nickname from user where blocked = 0 and account_expired = 0 and account_removed = 0 and verified = 1 order by rand() limit 1"); if(count($r)) { goaway($a->get_baseurl() . '/profile/' . $r[0]['nickname']); } diff --git a/mod/pubsub.php b/mod/pubsub.php index 64fbda289..0e29628b8 100644 --- a/mod/pubsub.php +++ b/mod/pubsub.php @@ -44,7 +44,7 @@ function pubsub_init(&$a) { $subscribe = (($hub_mode === 'subscribe') ? 1 : 0); - $r = q("SELECT * FROM `user` WHERE `nickname` = '%s' AND `account_expired` = 0 LIMIT 1", + $r = q("SELECT * FROM `user` WHERE `nickname` = '%s' AND `account_expired` = 0 AND `account_removed` = 0 LIMIT 1", dbesc($nick) ); if(! count($r)) { @@ -112,7 +112,7 @@ function pubsub_post(&$a) { $nick = (($a->argc > 1) ? notags(trim($a->argv[1])) : ''); $contact_id = (($a->argc > 2) ? intval($a->argv[2]) : 0 ); - $r = q("SELECT * FROM `user` WHERE `nickname` = '%s' AND `account_expired` = 0 LIMIT 1", + $r = q("SELECT * FROM `user` WHERE `nickname` = '%s' AND `account_expired` = 0 AND `account_removed` = 0 LIMIT 1", dbesc($nick) ); if(! count($r)) diff --git a/mod/receive.php b/mod/receive.php index 2bd3cc65b..0523fd9cc 100644 --- a/mod/receive.php +++ b/mod/receive.php @@ -31,7 +31,7 @@ function receive_post(&$a) { $guid = $a->argv[2]; - $r = q("SELECT * FROM `user` WHERE `guid` = '%s' AND `account_expired` = 0 LIMIT 1", + $r = q("SELECT * FROM `user` WHERE `guid` = '%s' AND `account_expired` = 0 AND `account_removed` = 0 LIMIT 1", dbesc($guid) ); if(! count($r)) diff --git a/mod/salmon.php b/mod/salmon.php index 1e16f9d14..5df1e1c9e 100644 --- a/mod/salmon.php +++ b/mod/salmon.php @@ -30,7 +30,7 @@ function salmon_post(&$a) { $nick = (($a->argc > 1) ? notags(trim($a->argv[1])) : ''); $mentions = (($a->argc > 2 && $a->argv[2] === 'mention') ? true : false); - $r = q("SELECT * FROM `user` WHERE `nickname` = '%s' AND `account_expired` = 0 LIMIT 1", + $r = q("SELECT * FROM `user` WHERE `nickname` = '%s' AND `account_expired` = 0 AND `account_removed` = 0 LIMIT 1", dbesc($nick) ); if(! count($r)) From 2871fd4793a6bdb2f31a3ae1b39c354d58d619ed Mon Sep 17 00:00:00 2001 From: zottel Date: Fri, 2 Nov 2012 23:54:03 +0100 Subject: [PATCH 2/3] Depublish public posts when archiving a contact --- include/Contact.php | 1 + mod/contacts.php | 3 +++ 2 files changed, 4 insertions(+) diff --git a/include/Contact.php b/include/Contact.php index 1a7a1676a..d39d7a28b 100644 --- a/include/Contact.php +++ b/include/Contact.php @@ -169,6 +169,7 @@ function mark_for_death($contact) { q("update contact set `archive` = 1 where id = %d limit 1", intval($contact['id']) ); + q("UPDATE `item` SET `private` = 2 WHERE `contact-id` = %d AND `uid` = %d", intval($contact['id']), intval($contact['uid'])); //contact_remove($contact['id']); diff --git a/mod/contacts.php b/mod/contacts.php index 8a36fa4cb..7668b45b3 100644 --- a/mod/contacts.php +++ b/mod/contacts.php @@ -211,6 +211,9 @@ function contacts_content(&$a) { intval($contact_id), intval(local_user()) ); + if ($archived) { + q("UPDATE `item` SET `private` = 2 WHERE `contact-id` = %d AND `uid` = %d", intval($contact_id), intval(local_user())); + } if($r) { //notice( t('Contact has been ') . (($archived) ? t('archived') : t('unarchived')) . EOL ); info( (($archived) ? t('Contact has been archived') : t('Contact has been unarchived')) . EOL ); From dd1e735efb27b0faff50883ca5379df26d9afe67 Mon Sep 17 00:00:00 2001 From: zottel Date: Sun, 4 Nov 2012 11:07:11 +0100 Subject: [PATCH 3/3] Worked in fermionic's comments (not count($r)). --- include/poller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/poller.php b/include/poller.php index ce8399a48..1af23eb13 100644 --- a/include/poller.php +++ b/include/poller.php @@ -71,7 +71,7 @@ function poller_run($argv, $argc){ // delete user and contact records for recently removed accounts $r = q("SELECT * FROM `user` WHERE `account_removed` = 1 AND `account_expires_on` < UTC_TIMESTAMP() - INTERVAL 3 DAY"); - if (count($r)) { + if ($r) { foreach($r as $user) { q("DELETE FROM `contact` WHERE `uid` = %d", intval($user['uid'])); q("DELETE FROM `user` WHERE `uid` = %d", intval($user['uid']));