source: trunk/scripts/db-strip @ 1184

Revision 1179, 9.3 KB checked in by adrian.budau, 2 months ago (diff)

Added task security(private, protected, public) and also fixed some
problems like the fact that users could add hidden tasks to user-rounds
during contests or cache crashing during task creation.
Reviewboard URL: http://reviewboard.infoarena.ro/r/203/

  • Property svn:eol-style set to native
  • Property svn:executable set to *
Line 
1#! /usr/bin/env php
2<?php
3
4require_once(dirname($argv[0]) . "/utilities.php");
5require_once(dirname($argv[0]) . "/../common/db/round_task.php");
6
7db_connect();
8$smfprefix = IA_SMF_DB_PREFIX;
9
10// Set password=username for all users.
11log_print("Clearing passwords for all users.");
12db_query("UPDATE ia_user
13          SET `password` = SHA1(CONCAT(LCASE(username), LCASE(username)))");
14db_query("UPDATE {$smfprefix}members
15          SET `passwd` = SHA1(CONCAT(LCASE(memberName), LCASE(memberName)))");
16
17// Delete emails.
18log_print("Clearing emails for all users.");
19db_query("UPDATE ia_user
20          SET email = CONCAT(username, '@example.com')");
21db_query("UPDATE {$smfprefix}members
22          SET emailAddress = CONCAT(memberName, '@example.com')");
23
24// Delete smf private data.
25log_print("Clearing private data and ip information.");
26db_query("UPDATE {$smfprefix}members
27          SET secretQuestion = '', secretAnswer='', memberIP='',
28              memberIP2=''");
29// Delete ip information.
30db_query("UPDATE ia_file SET remote_ip_info = NULL");
31db_query("UPDATE ia_job SET remote_ip_info = NULL");
32db_query("UPDATE ia_textblock SET remote_ip_info = NULL");
33db_query("UPDATE ia_textblock_revision SET remote_ip_info = NULL");
34
35// Delete all attachments except noimage.
36log_print("Deleting all attachments.");
37db_query("DELETE FROM ia_file
38          WHERE name <> 'noimage'");
39
40// Delete submissions.
41log_print("Clearing all submissions.");
42db_query("UPDATE ia_job SET file_contents='--gone--'");
43
44// Delete private tasks.
45log_print("Deleting private tasks.");
46db_query("DELETE FROM ia_task WHERE security = 'private'");
47
48// Only keep first 100 tasks to keep the dump small.
49log_print("Deleting all tasks except for the first 100.");
50$del_task_count = db_query_value("SELECT COUNT(0) FROM ia_task") - 100;
51if ($del_task_count > 0) {
52    db_query("DELETE FROM ia_task ORDER BY `order` DESC LIMIT $del_task_count");
53}
54
55// Delete extra users. Only kill mortals.
56log_print("Deleting all normal users except for 200.");
57$del_user_count = db_query_value("SELECT COUNT(*) FROM ia_user") - 200;
58if ($del_user_count > 0) {
59    db_query("DELETE FROM ia_user ".
60             "WHERE security_level = 'normal' ".
61             "ORDER BY RAND() LIMIT $del_user_count");
62}
63
64// Delete orphan smf members.
65db_query("DELETE ia_smf_members FROM ia_smf_members ".
66        "LEFT JOIN ia_user on ia_user.username = ia_smf_members.memberName ".
67        "WHERE (ia_user.username IS NULL) ");
68
69// Delete orphan user-defined rounds.
70log_print("Deleting orphan user defined rounds.");
71db_query("DELETE ia_round FROM ia_round
72    LEFT JOIN ia_user ON ia_round.user_id = ia_user.id
73    WHERE (ia_user.id IS NULL)");
74
75// Delete orphan users registered in rounds.
76log_print("Deleting orphan users registered in rounds.");
77db_query("DELETE ia_user_round FROM ia_user_round
78    LEFT JOIN ia_user ON ia_user_round.user_id = ia_user.id
79    LEFT JOIN ia_round ON ia_user_round.round_id = ia_round.id
80    WHERE (ia_user.id IS NULL) OR (ia_round.id IS NULL)");
81
82// Delete orphan tasks in rounds.
83log_print("Deleting orphan tasks in rounds.");
84db_query("DELETE ia_round_task FROM ia_round_task
85    LEFT JOIN ia_task ON ia_round_task.task_id = ia_task.id
86    LEFT JOIN ia_round ON ia_round_task.round_id = ia_round.id
87    WHERE (ia_task.id IS NULL) OR (ia_round.id IS NULL)");
88
89// Recompute round task order
90$rounds = db_fetch_all("SELECT DISTINCT `round_id` AS `id` FROM ia_round_task");
91foreach ($rounds as $round) {
92    round_task_recompute_order($round['id']);
93}
94
95// Delete orphan task ratings.
96log_print("Deleting orphan task_ratings");
97db_query("DELETE ia_task_ratings FROM ia_task_ratings
98    LEFT JOIN ia_task ON ia_task_ratings.task_id = ia_task.id
99    LEFT JOIN ia_user on ia_task_ratings.user_id = ia_user.id
100    WHERE (ia_user.id IS NULL) OR (ia_task.id IS NULL)");
101
102// Delete orphan scores.
103log_print("Deleting orphan scores.");
104db_query("DELETE ia_score_user_round_task FROM ia_score_user_round_task ".
105         "LEFT JOIN ia_user on ia_user.id = ia_score_user_round_task.user_id ".
106         "LEFT JOIN ia_task on ia_task.id = ia_score_user_round_task.task_id ".
107         "LEFT JOIN ia_round on ia_round.id = ia_score_user_round_task.round_id ".
108         "WHERE (ia_score_user_round_task.user_id IS NOT NULL AND ia_user.id IS NULL) ".
109         "OR (ia_score_user_round_task.task_id IS NOT NULL AND ia_task.id IS NULL) ".
110         "OR (ia_score_user_round_task.round_id IS NOT NULL AND ia_round.id IS NULL)");
111
112// Recompute ia_score_user_round
113db_query("DELETE FROM ia_score_user_round");
114$rounds = db_fetch_all("SELECT id FROM ia_round");
115
116foreach ($rounds as $round) {
117    round_recompute_score($round['id']);
118}
119
120// Delete orphan rating entries
121db_query("DELETE ia_rating FROM ia_rating ".
122        "LEFT JOIN ia_user on ia_user.id = ia_rating.user_id ".
123        "LEFT JOIN ia_round on ia_round.id = ia_rating.round_id ".
124        "WHERE (ia_rating.user_id IS NOT NULL AND ia_user.id IS NULL) ".
125        "OR (ia_rating.round_id IS NOT NULL AND ia_round.id IS NULL)");
126
127// Delete orphan jobs.
128log_print("Deleting orphan jobs.");
129db_query("DELETE ia_job FROM ia_job ".
130        "LEFT JOIN ia_user on ia_user.id = ia_job.user_id ".
131        "LEFT JOIN ia_task on ia_task.id = ia_job.task_id ".
132        "WHERE (ia_user.id IS NULL) OR (ia_task.id IS NULL)");
133
134// Delete extra jobs.
135log_print("Deleting all but last 1000 submissions.");
136$del_job_count = db_query_value("SELECT COUNT(*) FROM ia_job") - 1000;
137if ($del_job_count > 0) {
138    db_query("DELETE FROM ia_job ORDER BY id ASC LIMIT $del_job_count");
139}
140
141// Delete orphan job tests.
142log_print("Deleting orphan job tests.");
143db_query("DELETE ia_job_test FROM ia_job_test ".
144        "LEFT JOIN ia_job on ia_job_test.job_id = ia_job.id ".
145        "WHERE (ia_job.id IS NULL)");
146
147// Delete private pages.
148log_print("Deleting private pages.");
149db_query("DELETE FROM `ia_textblock` WHERE security='private'");
150
151// Delete task pages.
152// This is needed to avoid leaking secret statements.
153log_print("Deleting orphan task pages.");
154db_query("DELETE FROM `ia_textblock` ".
155         "WHERE name LIKE 'problema/%' AND name NOT IN ".
156         "(SELECT page_name FROM ia_task)");
157
158// Delete orphan user pages.
159// They take a huge amount of space.
160log_print("Deleting orphan user pages.");
161db_query("DELETE FROM `ia_textblock` ".
162         "WHERE name LIKE 'utilizator/%' AND name NOT IN ".
163         "(SELECT CONCAT('utilizator/', username) FROM ia_user)");
164
165// Delete orphan revisions.
166log_print("Deleting orphan revisions.");
167db_query("DELETE `ia_textblock_revision` FROM ia_textblock_revision ".
168         "LEFT JOIN ia_textblock ON ia_textblock_revision.name = ia_textblock.name ".
169         "WHERE ia_textblock.name IS NULL");
170
171// Erase worthless history.
172log_print("Erasing much of textblock history.");
173$del_revision_count = db_query_value("SELECT COUNT(*) FROM ia_textblock_revision") - 2000;
174if ($del_revision_count > 0) {
175    db_query("DELETE FROM ia_textblock_revision ".
176             "ORDER BY RAND() LIMIT $del_revision_count");
177}
178
179// Delete orphan task tags.
180log_print("Deleting orphan task tags.");
181db_query("DELETE ia_task_tags FROM ia_task_tags
182    LEFT JOIN ia_task ON ia_task_tags.task_id = ia_task.id
183    WHERE (ia_task.id IS NULL)");
184
185// Delete orphan round tags.
186log_print("Deleting orphan round tags.");
187db_query("DELETE ia_round_tags FROM ia_round_tags
188    LEFT JOIN ia_round ON ia_round_tags.round_id = ia_round.id
189    WHERE (ia_round.id IS NULL)");
190
191// Delete orphan textblock tags.
192log_print("Deleting orphan textblock tags.");
193db_query("DELETE ia_textblock_tags FROM ia_textblock_tags
194    LEFT JOIN ia_textblock ON ia_textblock_tags.textblock_id = ia_textblock.name
195    WHERE (ia_textblock.name IS NULL)");
196
197// Censor forum. FIXME: only censor private stuff.
198// We could look inside smf and only delete some things, but it's hard.
199//  - personal and public SMF messages (we have some private threads)
200log_print("Deleting everything from forum.");
201db_query("DELETE FROM `{$smfprefix}messages`");
202db_query("DELETE FROM `{$smfprefix}personal_messages`");
203db_query("DELETE FROM `{$smfprefix}pm_recipients`");
204db_query("DELETE FROM `{$smfprefix}polls`");
205db_query("DELETE FROM `{$smfprefix}poll_choices`");
206db_query("DELETE FROM `{$smfprefix}sessions`");
207db_query("DELETE FROM `{$smfprefix}topics`");
208db_query("DELETE FROM `{$smfprefix}collapsed_categories`");
209//   - SMF logs
210db_query("DELETE FROM `{$smfprefix}log_actions`");
211db_query("DELETE FROM `{$smfprefix}log_activity`");
212db_query("DELETE FROM `{$smfprefix}log_banned`");
213db_query("DELETE FROM `{$smfprefix}log_boards`");
214db_query("DELETE FROM `{$smfprefix}log_errors`");
215db_query("DELETE FROM `{$smfprefix}log_floodcontrol`");
216db_query("DELETE FROM `{$smfprefix}log_karma`");
217db_query("DELETE FROM `{$smfprefix}log_mark_read`");
218db_query("DELETE FROM `{$smfprefix}log_notify`");
219db_query("DELETE FROM `{$smfprefix}log_online`");
220db_query("DELETE FROM `{$smfprefix}log_polls`");
221db_query("DELETE FROM `{$smfprefix}log_search_messages`");
222db_query("DELETE FROM `{$smfprefix}log_search_results`");
223db_query("DELETE FROM `{$smfprefix}log_search_subjects`");
224db_query("DELETE FROM `{$smfprefix}log_search_topics`");
225db_query("DELETE FROM `{$smfprefix}log_search_words`");
226db_query("DELETE FROM `{$smfprefix}log_topics`");
227
228foreach (db_fetch_all("SHOW TABLES") as $row) {
229    $row = array_values($row);
230    $table = $row[0];
231    db_query("OPTIMIZE TABLE $table");
232    db_query("ANALYZE TABLE $table");
233}
234
235?>
Note: See TracBrowser for help on using the repository browser.