server: when deleting user, remove related DB records

When deleting a user (from the delete_spammers.php script),
remove records that refer to that user in
private_messages, notify, credit_user, badge_user, and friend tables.

Notes:
- This change eliminates some dangling references,
  but in general a BOINC DB doesn't have referential integrity.
  The code should check for dangling references.
- Functions like BoincUser::delete() should delete a user record,
  not try to remove things that refer to it.
  The function delete_user() (in user.inc) does this.
This commit is contained in:
David Anderson 2014-10-08 12:14:34 -07:00
parent 644690b100
commit 40d68bc688
4 changed files with 49 additions and 13 deletions

View File

@ -663,6 +663,10 @@ class BoincCreditUser {
$db = BoincDb::get();
return $db->update_aux('credit_user', $clause);
}
static function delete_user($user) {
$db = BoincDb::get();
$db->delete_aux('credit_user', "userid=$user->id");
}
}
class BoincCreditTeam {

View File

@ -270,6 +270,10 @@ class BoincFriend {
$db = BoincDb::get();
return $db->enum('friend', 'BoincFriend', $clause);
}
static function delete_aux($clause) {
$db = BoincDb::get();
return $db->delete_aux('friend', $clause);
}
static function delete($id1, $id2) {
$db = BoincDb::get();
$db->delete_aux('friend', "user_src=$id1 and user_dest=$id2");

View File

@ -363,6 +363,7 @@ function show_community_private($user) {
if ($n) {
foreach($friends as $friend) {
$fuser = BoincUser::lookup_id($friend->user_dest);
if (!$fuser) continue;
$x .= friend_links($fuser);
}
row2(tra("Friends")." ($n)", $x);
@ -415,6 +416,7 @@ function get_community_links_object($user){
$friends = BoincFriend::enum("user_src=$user->id and reciprocated=1");
foreach($friends as $friend) {
$fuser = BoincUser::lookup_id($friend->user_dest);
if (!$fuser) continue;
$cache_object->friends[] = $fuser;
}
return $cache_object;
@ -552,6 +554,29 @@ function make_user(
}
}
// delete a user and all associated records except
// result
// host
// batch
// team
// user_submit
// user_submit_app
// credited_job
// donation_paypal
// sent_email
//
function delete_user($user) {
delete_profile($user);
forum_delete_user($user);
// deletes post, thread, subscription, forum_preferences, forum_logging
BoincPrivateMessage::delete_aux("userid=$user->id or senderid=$user->id");
BoincNotify::delete_aux("userid=$user->id");
BoincCreditUser::delete_user($user);
BoincBadgeUser::delete("user_id=$user->id");
BoincFriend::delete_aux("user_src=$user->id or user_dest=$user->id");
$user->delete();
}
$cvs_version_tracker[]="\$Id$"; //Generated automatically - do not edit
?>

View File

@ -68,19 +68,19 @@ $test = false;
// delete a spammer account, and everything associated with it
//
function delete_user($user) {
function do_delete_user($user) {
global $test;
$age = (time() - $user->create_time) / 86400;
echo "----------------\ndeleting user $user->id email $user->email_addr name $user->name age $age days\n";
echo "deleting user\n";
echo " ID: $user->id\n";
echo " email: $user->email_addr\n";
echo " name: $user->name\n";
echo " age:$age days\n";
if ($test) {
echo " (test mode - nothing deleted)\n";
return;
}
delete_profile($user);
forum_delete_user($user);
BoincPrivateMessage::delete_aux("userid=$user->id or senderid=$user->id");
BoincNotify::delete_aux("userid=$user->id");
$q = "delete from user where id=$user->id";
_mysql_query($q);
delete_user($user);
}
function delete_list($fname) {
@ -91,7 +91,7 @@ function delete_list($fname) {
if (!is_numeric($s)) die("bad ID $s\n");
$user = BoincUser::lookup_id((int)$s);
if ($user) {
delete_user($user);
do_delete_user($user);
} else {
echo "no user ID $s\n";
}
@ -123,7 +123,7 @@ function delete_forums() {
}
$n = BoincHost::count("userid=$p->userid");
if ($n) continue;
delete_user($user);
do_delete_user($user);
}
}
@ -147,7 +147,7 @@ function delete_profiles() {
$n = BoincPost::count("user=$p->userid");
if ($n) continue;
delete_user($user);
do_delete_user($user);
if ($test) {
echo "\n$p->userid\n$p->response1\n$p->response2\n";
}
@ -162,7 +162,7 @@ function delete_banished() {
$user = BoincUser::lookup_id($fp->userid);
if (!$user) continue;
if ($user->create_time < time() - $days*86400) continue;
delete_user($user);
do_delete_user($user);
}
}
@ -209,11 +209,14 @@ for ($i=1; $i<$argc; $i++) {
if (!is_numeric($id1) || !is_numeric($id2)) {
die ("bad args\n");
}
if ($id2 < $id1) {
die("bad args\n");
}
for ($i=$id1; $i <= $id2; $i++) {
$user = BoincUser::lookup_id($i);
if ($user) {
echo "deleting user $i\n";
delete_user($user);
do_delete_user($user);
}
}
} else if ($argv[$i] == "--banished") {