2 /************************************************************************
3 * Mailer v0.2.1-FINAL Start: 04/29/2004 *
4 * =================== Last change: 10/29/2004 *
6 * -------------------------------------------------------------------- *
7 * File : ext-user.php *
8 * -------------------------------------------------------------------- *
9 * Short description : Swapped out user management *
10 * -------------------------------------------------------------------- *
11 * Kurzbeschreibung : Ausgelagertes Mitglieder-Management *
12 * -------------------------------------------------------------------- *
15 * $Tag:: 0.2.1-FINAL $ *
17 * -------------------------------------------------------------------- *
18 * Copyright (c) 2003 - 2009 by Roland Haeder *
19 * Copyright (c) 2009 - 2012 by Mailer Developer Team *
20 * For more information visit: http://mxchange.org *
22 * This program is free software; you can redistribute it and/or modify *
23 * it under the terms of the GNU General Public License as published by *
24 * the Free Software Foundation; either version 2 of the License, or *
25 * (at your option) any later version. *
27 * This program is distributed in the hope that it will be useful, *
28 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
29 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
30 * GNU General Public License for more details. *
32 * You should have received a copy of the GNU General Public License *
33 * along with this program; if not, write to the Free Software *
34 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, *
36 ************************************************************************/
38 // Some security stuff...
39 if (!defined('__SECURITY')) {
44 setThisExtensionVersion('0.5.7');
46 // Version history array (add more with , '0.0.1' and so on)
47 setExtensionVersionHistory(array('0.0.0', '0.1.0', '0.1.1', '0.1.2', '0.1.3', '0.1.4', '0.1.5', '0.1.6', '0.1.7', '0.1.8', '0.1.9', '0.2.0', '0.2.1', '0.2.2', '0.2.3', '0.2.4', '0.2.5', '0.2.6', '0.2.7', '0.2.8', '0.2.9', '0.3.0', '0.3.1', '0.3.2', '0.3.3', '0.3.4', '0.3.5', '0.3.6', '0.3.7', '0.3.8', '0.3.9', '0.4.0', '0.4.1', '0.4.2', '0.4.3', '0.4.4', '0.4.5', '0.4.6', '0.4.7', '0.4.8', '0.4.9', '0.5.0', '0.5.1', '0.5.2', '0.5.3', '0.5.4', '0.5.5', '0.5.6', '0.5.7'));
49 // Keep this extension always active!
50 setExtensionAlwaysActive('Y');
52 switch (getExtensionMode()) {
53 case 'register': // Do stuff when installation is running
54 addDropTableSql('user_cats');
55 addCreateTableSql('user_cats', "
56 `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
57 `userid` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
58 `cat_id` TINYINT(3) UNSIGNED NOT NULL DEFAULT 0,
62 'User->category connection data');
64 addDropTableSql('user_data');
65 addCreateTableSql('user_data', "
66 `userid` BIGINT(20) NOT NULL AUTO_INCREMENT,
67 `surname` VARCHAR(255) NOT NULL DEFAULT '',
68 `family` VARCHAR(255) NOT NULL DEFAULT '',
69 `street_nr` VARCHAR(255) NOT NULL DEFAULT '',
70 `country` VARCHAR(4) NOT NULL DEFAULT '',
71 `zip` VARCHAR(6) NOT NULL DEFAULT '',
72 `city` VARCHAR(255) NOT NULL DEFAULT '',
73 `email` VARCHAR(255) NOT NULL DEFAULT '',
74 `birth_day` CHAR(2) NOT NULL DEFAULT '01',
75 `birth_month` CHAR(2) NOT NULL DEFAULT '01',
76 `birth_year` VARCHAR(4) NOT NULL DEFAULT '1970',
77 `password` VARCHAR(255) NOT NULL DEFAULT '',
78 `max_mails` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
79 `receive_mails` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
80 `refid` BIGINT(20) NOT NULL DEFAULT 0,
81 `status` ENUM('UNCONFIRMED','CONFIRMED','LOCKED') NOT NULL DEFAULT 'UNCONFIRMED',
82 `user_hash` VARCHAR(255) NULL DEFAULT NULL,
83 `REMOTE_ADDR` VARCHAR(15) NOT NULL DEFAULT '0.0.0.0',
84 `last_online` VARCHAR(10) NOT NULL DEFAULT 0,
85 `last_module` VARCHAR(255) NULL DEFAULT NULL,
86 `ref_clicks` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
87 `total_logins` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
88 `gender` ENUM('M','F') NOT NULL DEFAULT 'M',
89 `used_points` FLOAT(20,5) UNSIGNED NOT NULL DEFAULT 0.00000,
90 `emails_sent` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
91 `joined` VARCHAR(10) NOT NULL DEFAULT 0,
92 `last_update` VARCHAR(10) NOT NULL DEFAULT 0,
93 `last_profile_sent` VARCHAR(10) NOT NULL DEFAULT 0,
94 `notified` ENUM('Y','N') NOT NULL DEFAULT 'N',
95 `ref_payout` TINYINT(3) UNSIGNED NOT NULL DEFAULT 0,
96 `last_login` VARCHAR(10) NOT NULL DEFAULT 0,
97 `login_failures` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
98 `last_failure` TIMESTAMP NULL DEFAULT NULL,
99 PRIMARY KEY (`userid`),
100 UNIQUE INDEX (`user_hash`),
102 INDEX `status_mails` (`status`, `max_mails`)",
105 addDropTableSql('user_points');
106 addCreateTableSql('user_points', "
107 `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
108 `userid` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
109 `ref_depth` TINYINT(3) UNSIGNED NOT NULL DEFAULT 0,
110 `points` FLOAT(20,5) UNSIGNED NOT NULL DEFAULT 0.00000,
111 `locked_points` FLOAT(20,5) UNSIGNED NOT NULL DEFAULT 0.00000,
114 'User points (no used points)');
116 addDropTableSql('user_links');
117 addCreateTableSql('user_links', "
118 `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
119 `stats_id` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
120 `userid` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
121 `link_type` VARCHAR(255) NOT NULL DEFAULT 'NORMAL',
125 'Unconfirmed mails per user');
127 addDropTableSql('user_stats');
128 addCreateTableSql('user_stats', "
129 `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
130 `userid` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
131 `cat_id` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
132 `payment_id` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
133 `subject` VARCHAR(255) NOT NULL DEFAULT '',
134 `url` TINYTEXT NOT NULL,
135 `max_rec` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
136 `clicks` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
137 `timestamp_ordered` VARCHAR(10) NOT NULL DEFAULT '',
138 `pool_id` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
139 `timestamp_sstart` VARCHAR(10) NOT NULL DEFAULT '',
140 `timestamp_send` VARCHAR(10) NOT NULL DEFAULT '',
141 `is_stats` ENUM('Y','N') NOT NULL DEFAULT 'N',
145 INDEX (`payment_id`),
147 'Mail statistics per user order');
149 addDropTableSql('user_stats_data');
150 addCreateTableSql('user_stats_data', "
151 `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
152 `userid` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
153 `stats_type` VARCHAR(255) NOT NULL DEFAULT 'unknown',
154 `stats_data` VARCHAR(255) NOT NULL DEFAULT '',
155 `inserted` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
158 INDEX (`stats_type`)",
159 'Member statistics data');
162 addAdminMenuSql('user', NULL, 'Mitglieder-Management', 'Mitglieder freischalten, sperren, Accounts editieren, Neuanmeldungen verwalten, {OPEN_CONFIG}POINTS{CLOSE_CONFIG} gutschreiben und abziehen und und und...', 3);
163 addAdminMenuSql('user', 'del_user', 'Mitglied löschen', 'Löschen Sie hier Mitglied, die gegen die AGBs mehrmals verstossen haben. Bitte seien Sie nett zu Ihren Mitgliedern und löschen Sie nicht gleich.', 1);
164 addAdminMenuSql('user', 'lock_user', 'Mitglied sperren / entsperren', 'Sperren Sie Mitglied, die zu viele unbestätigte Mails haben oder gegen Ihre AGBs verstossen haben über diesen Menüpunkt.', 3);
165 addAdminMenuSql('user', 'list_user', 'Mitglieder auflisten', 'Listen Sie alle Mitglied oder eingeschränkt nach Suchkritieren Ihre Userdatenbank auf. Sie könen per Klick auf die Usernummer sich Details zum Mitglied ansehen.', 4);
166 addAdminMenuSql('user', 'add_points', '{OPEN_CONFIG}POINTS{CLOSE_CONFIG} gutschreiben', 'Buchen Sie einem Mitglied direkt {OPEN_CONFIG}POINTS{CLOSE_CONFIG} auf. Sie können dazu auch einen Kommentar mitsenden.', 5);
167 addAdminMenuSql('user', 'edit_user', 'Account editieren', 'Daten eines Mitglieder-Accountes ändern.', 6);
168 addAdminMenuSql('user', 'list_refs', 'Referrals anzeigen', 'Mit diesem Menüpunkt können Sie die generierten Referrals eines Mitgliedes auflisten.', 7);
169 addAdminMenuSql('user', 'list_links', 'Unbestätigte Mails', 'Mit diesem Menüpunkt können Sie die vom Mitglied nicht bestätigten Mails anzeigen.', 8);
170 addAdminMenuSql('user', 'list_cats', 'Kategorien anzeigen', 'Listet die ausgewählten Kategorien eines Mitgliedes auf.', 9);
173 case 'remove': // Do stuff when removing extension
174 // SQL commands to run
175 addDropTableSql('user_del');
176 addDropTableSql('user_cats');
177 addDropTableSql('user_data');
178 addDropTableSql('user_points');
179 addDropTableSql('user_links');
180 addDropTableSql('user_refs');
181 addDropTableSql('user_stats');
182 addDropTableSql('user_stats_data');
183 addDropTableSql('user_subids');
184 addDropTableSql('subid_log');
185 addExtensionSql("DELETE LOW_PRIORITY FROM `{?_MYSQL_PREFIX?}_admin_menu` WHERE `what` = 'config_user' OR `action`='user'");
186 addExtensionSql("DELETE LOW_PRIORITY FROM `{?_MYSQL_PREFIX?}_member_menu` WHERE `what` IN ('subids')");
188 // Register new filters for gathering points
189 unregisterFilter(__FILE__, __LINE__, 'get_total_points', 'USER_POINTS', TRUE, isExtensionDryRun());
190 unregisterFilter(__FILE__, __LINE__, 'get_own_points', 'USER_POINTS', TRUE, isExtensionDryRun());
191 unregisterFilter(__FILE__, __LINE__, 'get_locked_points', 'LOCKED_USER_POINTS', TRUE, isExtensionDryRun());
192 unregisterFilter(__FILE__, __LINE__, 'get_all_point_columns', 'GET_ALL_USER_POINTS_COLUMN_NAMES', TRUE, isExtensionDryRun());
193 unregisterFilter(__FILE__, __LINE__, 'user_exclusion_sql', 'TESTER_USER_EXCLUSION_SQL', TRUE, isExtensionDryRun());
194 unregisterFilter(__FILE__, __LINE__, 'user_inclusion_sql', 'TESTER_USER_INCLUSION_SQL', TRUE, isExtensionDryRun());
195 unregisterFilter(__FILE__, __LINE__, 'pre_user_registration', 'TESTER_USER_REGISTRATION_ADD_SQL_COLUMNS', TRUE, isExtensionDryRun());
196 unregisterFilter(__FILE__, __LINE__, 'convert_user_data_columns', 'ADD_USER_DATA_CONVERT_SQL_COLUMNS', TRUE, isExtensionDryRun());
197 unregisterFilter(__FILE__, __LINE__, 'post_refid_validation', 'HANDLE_USER_SUBID', TRUE, isExtensionDryRun());
198 unregisterFilter(__FILE__, __LINE__, 'pre_user_registration', 'SUBID_USER_REGISTRATION_ADD_SQL_COLUMNS', TRUE, isExtensionDryRun());
199 unregisterFilter(__FILE__, __LINE__, 'update_referral_data', 'GENERIC_UPDATE_USER_REFERRAL', TRUE, isExtensionDryRun());
200 unregisterFilter(__FILE__, __LINE__, 'update_referral_data', 'UPDATE_USER_SUBID', TRUE, isExtensionDryRun());
201 unregisterFilter(__FILE__, __LINE__, 'member_admin_actions', 'ADD_USER_SUBID_MEMBER_ACTION', TRUE, isExtensionDryRun());
202 unregisterFilter(__FILE__, __LINE__, 'member_reflink_extra_content', 'MEMBER_REFLINK_USER_SUBIDS_CONTENT', TRUE, isExtensionDryRun());
205 case 'activate': // Do stuff when admin activates this extension
206 // SQL commands to run
210 case 'deactivate': // Do stuff when admin deactivates this extension
211 // SQL commands to run
215 case 'update': // Update an extension
216 switch (getCurrentExtensionVersion()) {
217 case '0.1.0': // SQL queries for v0.1
218 addConfigAddSql('user_limit', 'INT(7) UNSIGNED NOT NULL DEFAULT 20');
220 // Update notes (these will be set as task text!)
221 setExtensionUpdateNotes("Seitenweises Anzeigen der User-Liste ist nun möglich.");
224 case '0.1.1': // SQL queries for v0.1.1
225 // This update depends on ext-sql_patches update!
226 addExtensionDependency('sql_patches');
228 // Update notes (these will be set as task text!)
229 setExtensionUpdateNotes("Ungültiges Update.");
232 case '0.1.2': // SQL queries for v0.1.2
233 addExtensionAddTableColumnSql('online', 'mails_confirmed', 'BIGINT(20) UNSIGNED NOT NULL DEFAULT 0');
235 // Update notes (these will be set as task text!)
236 setExtensionUpdateNotes("Dem Mitglied wird nun angezeigt, wie viele Mails er bestätigt hat. Alle vor dieser Version best. Mails werden leider nicht mehr berücksichtigt! Bitte teilen Sie dies Ihren Mitgliedern mit.");
239 case '0.1.3': // SQL queries for v0.1.3
240 // Update notes (these will be set as task text!)
241 setExtensionUpdateNotes("Den Pfad <span class=\"bad\">Sie sind hier</span> im Menüpunkt <u>Online-Liste</u> erweitert.");
244 case '0.1.4': // SQL queries for v0.1.4
245 addExtensionAddTableColumnSql('online', 'emails_received', 'BIGINT(20) UNSIGNED NOT NULL DEFAULT 0');
247 // Update notes (these will be set as task text!)
248 setExtensionUpdateNotes("Anzahl empfangener Mails wird angezeigt. <big>Diese Anzeige kann fehlerhaft sein, wenn Sie bereits Mitglieder in Ihrem {?mt_word?} haben sollen!</big>");
251 case '0.1.5': // SQL queries for v0.1.5
252 // Update notes (these will be set as task text!)
253 setExtensionUpdateNotes("Fehler beseitigt, wenn error_reporting=E_ALL gesetzt ist.");
256 case '0.1.6': // SQL queries for v0.1.6
257 // Update notes (these will be set as task text!)
258 setExtensionUpdateNotes("Fehler beseitigt, wenn error_reporting=E_ALL gesetzt ist.");
261 case '0.1.7': // SQL queries for v0.1.7
262 // Update notes (these will be set as task text!)
263 setExtensionUpdateNotes("Erweiterung bleibt wegen integrierten Schalters immer aktiv.");
266 case '0.1.8': // SQL queries for v0.1.8
267 // Update notes (these will be set as task text!)
268 setExtensionUpdateNotes("Seit <strong>Patch 340</strong> überflüssige HTML-Tags entfernt.");
271 case '0.1.9': // SQL queries for v0.1.9
272 // Update notes (these will be set as task text!)
273 setExtensionUpdateNotes("Link zum Mitgliedsprofil in Funktion <u>generateUserProfileLink()</u> ausgelagert.");
276 case '0.2.0': // SQL queries for v0.2.0
277 // Update notes (these will be set as task text!)
278 setExtensionUpdateNotes("User-Liste ausgelagert in Templates und überbreite Zeile in 2er-Zeile umgewandelt.");
281 case '0.2.1': // SQL queries for v0.2.1
282 addConfigAddSql('user_alpha', 'TINYINT(3) UNSIGNED NOT NULL DEFAULT 10');
283 addAdminMenuSql('setup','config_user','Mitgliederliste','Anzahl Mitglieder pro Seite, Anzahl Buchstaben pro Zeile usw.', 8);
285 // Update notes (these will be set as task text!)
286 setExtensionUpdateNotes("User-Liste ist konfigurierbar: Anzahl Mitglieder pro Seite und Anzahl Buchstaben pro Zeile; Template-Fehler beseitigt.");
289 case '0.2.2': // SQL queries for v0.2.2
290 addExtensionChangeTableColumnSql('user_data', 'gender', 'gender', "ENUM('M','F','C') NOT NULL DEFAULT 'M'");
292 // Update notes (these will be set as task text!)
293 setExtensionUpdateNotes("Anrede "Firma" hinzugefügt.");
296 case '0.2.3': // SQL queries for v0.2.3
297 // Update notes (these will be set as task text!)
298 setExtensionUpdateNotes("Datumsformat festgelegt auf ausführlich.");
301 case '0.2.4': // SQL queries for v0.2.4
302 // Update notes (these will be set as task text!)
303 setExtensionUpdateNotes("Wörter <strong>{?mt_word?}</strong>, <strong>{?mt_word2?}</strong> und <strong>{?mt_word3?}</strong> sind austauschbar.");
306 case '0.2.5': // SQL queries for v0.2.5
307 // Update notes (these will be set as task text!)
308 setExtensionUpdateNotes("SQL-Anweisungen abgesichert.");
311 case '0.2.6': // SQL queries for v0.2.6
312 // Update notes (these will be set as task text!)
313 setExtensionUpdateNotes("Abspeichern von Einstellungen repariert.");
316 case '0.2.7': // SQL queries for v0.2.7
317 // Update notes (these will be set as task text!)
318 setExtensionUpdateNotes("Sicherheitsupdate für die Include-Befehle.");
321 case '0.2.8': // SQL queries for v0.2.8
322 // Update notes (these will be set as task text!)
323 setExtensionUpdateNotes("if-Anweisungen auf Funktion <strong>empty()</strong> umgestellt.");
326 case '0.2.9': // SQL queries for v0.2.9
327 addAdminMenuSql('user','user_contct','Mitglied kontaktieren','Kontaktieren Sie hier Ihre Mitglieder ganz direkt über ein Webformular. Sie brauchen somit kein EMail-Programm mehr starten!', 8);
329 // Update notes (these will be set as task text!)
330 setExtensionUpdateNotes("Admin-Kontaktformular hinzugefügt.");
333 case '0.3.0': // SQL queries for v0.3.0
334 // Update notes (these will be set as task text!)
335 setExtensionUpdateNotes("Hash-Erstellung von <strong>md5()</strong> auf bessere Funktion <strong>generateHash()</strong> umgestellt.<br />Diverse Fixes für <span class=\"bad\">0.2.1-Beta1</span> Release.");
338 case '0.3.1': // SQL queries for v0.3.1
339 addExtensionSql("UPDATE `{?_MYSQL_PREFIX?}_admin_menu` SET `title` = 'Mitglieder-Management' WHERE `action`='user' AND (`what`='' OR `what` IS NULL) LIMIT 1");
341 // Update notes (these will be set as task text!)
342 setExtensionUpdateNotes("Verwaltung auf Management umgestellt");
345 case '0.3.2': // SQL queries for v0.3.2
346 // Update notes (these will be set as task text!)
347 setExtensionUpdateNotes("PHP-Hinweis in Userauflistung gefixt (trat bei fehlender Erweiterung <span class=\"data\">ext-nickname</span> auf) und Darstellungsfehler von <strong>0.00000</strong> unbestätigten Mails gefixt.");
350 case '0.3.3': // SQL queries for v0.3.3
351 // Update notes (these will be set as task text!)
352 setExtensionUpdateNotes("Mitglieder sind nun per Formular kontaktierbar (es wird eine EMail versendet), gesperrte und bestätigte Mitglieder-Accounts sind seperat oder gemeinsam auflistbar (seperat nur mit der Erweiterung <span class=\"bad\">task</span>!)");
355 case '0.3.4': // SQL queries for v0.3.4
356 addConfigAddSql('select_user_zero_refid', "ENUM('Y','N') NOT NULL DEFAULT 'Y'");
357 addConfigAddSql('user_min_confirmed', 'SMALLINT(5) UNSIGNED NOT NULL DEFAULT 10');
358 addExtensionAddTableColumnSql('online', 'rand_confirmed', 'BIGINT(20) UNSIGNED NOT NULL DEFAULT 0');
360 // Update notes (these will be set as task text!)
361 setExtensionUpdateNotes("Mitglieder werden per Zufall als Referral-Id ausgewählt, die eine Mindestanzahl an bestätigten Mails haben, wenn die Ref-Id 0 ist.");
364 case '0.3.5': // SQL queries for v0.3.5
365 addExtensionAddTableColumnSql('user_data', 'lock_reason', 'TINYTEXT');
366 addExtensionAddTableColumnSql('user_data', 'lock_timestamp', 'TIMESTAMP NULL DEFAULT NULL');
367 addConfigAddSql('user_delete_purge', 'BIGINT(20) UNSIGNED NOT NULL DEFAULT ' . (getOneDay() * 30));
368 addAdminMenuSql('user', 'list_user_del', 'Löschungen auflisten', 'Listet die Löschungen von Usern auf.', 9);
369 addDropTableSql('user_del');
370 addCreateTableSql('user_del', "
371 `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
372 `userid` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
373 `email` VARCHAR(255) NOT NULL DEFAULT '',
374 `surname` VARCHAR(255) NOT NULL DEFAULT '',
375 `family` VARCHAR(255) NOT NULL DEFAULT '',
376 `joined` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
377 `last_online` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
378 `del_timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
379 `del_reason` TINYTEXT NOT NULL,
382 'List of deleted users');
384 // Update notes (these will be set as task text!)
385 setExtensionUpdateNotes("Der Sperrgrund wird nun mit abgespeichert und beim Löschen des Users mit ausgesendet.");
388 case '0.3.6': // SQL queries for v0.3.6
389 addExtensionSql('ALTER TABLE `{?_MYSQL_PREFIX?}_user_cats` DROP INDEX `userid`');
390 addExtensionSql('ALTER TABLE `{?_MYSQL_PREFIX?}_user_cats` ADD UNIQUE `userid_catid` (`userid`, `cat_id`)');
392 // Update notes (these will be set as task text!)
393 setExtensionUpdateNotes("Der Sperrgrund wird nun mit abgespeichert und beim Löschen des Users mit ausgesendet.");
396 case '0.3.7': // SQL queries for v0.3.7
397 addExtensionChangeTableColumnSql('user_points', 'id', 'id', 'BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT');
398 addExtensionChangeTableColumnSql('user_points', 'userid', 'userid', 'BIGINT(20) UNSIGNED NULL DEFAULT NULL');
399 addExtensionChangeTableColumnSql('user_points', 'cat_id', 'cat_id', 'TINYINT(3) UNSIGNED NULL DEFAULT NULL');
400 addExtensionChangeTableColumnSql('user_data', 'userid', 'userid', 'BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT');
401 addExtensionChangeTableColumnSql('user_del', 'userid', 'userid', 'BIGINT(20) UNSIGNED NULL DEFAULT NULL');
402 addExtensionChangeTableColumnSql('user_links', 'stats_id', 'stats_id', 'BIGINT(20) UNSIGNED NULL DEFAULT NULL');
403 addExtensionChangeTableColumnSql('user_links', 'userid', 'userid', 'BIGINT(20) UNSIGNED NULL DEFAULT NULL');
404 addExtensionChangeTableColumnSql('user_points', 'userid', 'userid', 'BIGINT(20) UNSIGNED NULL DEFAULT NULL');
405 addExtensionChangeTableColumnSql('user_points', 'ref_depth', 'ref_depth', 'TINYINT(3) UNSIGNED NULL DEFAULT NULL');
406 addExtensionChangeTableColumnSql('user_stats', 'userid', 'userid', 'BIGINT(20) UNSIGNED NULL DEFAULT NULL');
407 addExtensionChangeTableColumnSql('user_stats', 'cat_id', 'cat_id', 'BIGINT(20) UNSIGNED NULL DEFAULT NULL');
408 addExtensionChangeTableColumnSql('user_stats', 'payment_id', 'payment_id', 'BIGINT(20) UNSIGNED NULL DEFAULT NULL');
409 addExtensionChangeTableColumnSql('user_stats', 'pool_id', 'pool_id', 'BIGINT(20) UNSIGNED NULL DEFAULT NULL');
410 addExtensionChangeTableColumnSql('user_stats_data', 'userid', 'userid', 'BIGINT(20) UNSIGNED NULL DEFAULT NULL');
413 addExtensionSql('DELETE LOW_PRIORITY FROM `{?_MYSQL_PREFIX?}_user_cats` WHERE `userid` IS NULL OR `cat_id` IS NULL');
414 addExtensionSql('DELETE LOW_PRIORITY FROM `{?_MYSQL_PREFIX?}_user_del` WHERE `userid` IS NULL');
415 addExtensionSql('UPDATE `{?_MYSQL_PREFIX?}_user_links` SET `stats_id`=NULL WHERE `stats_id`=0');
416 addExtensionSql('DELETE LOW_PRIORITY FROM `{?_MYSQL_PREFIX?}_user_links` WHERE `userid` IS NULL');
417 addExtensionSql('UPDATE `{?_MYSQL_PREFIX?}_user_points` SET `ref_depth`=NULL WHERE `ref_depth`=0');
418 addExtensionSql('DELETE LOW_PRIORITY FROM `{?_MYSQL_PREFIX?}_user_points` WHERE `userid` IS NULL');
419 addExtensionSql('UPDATE `{?_MYSQL_PREFIX?}_user_stats` SET `cat_id`=NULL WHERE `cat_id`=0');
420 addExtensionSql('UPDATE `{?_MYSQL_PREFIX?}_user_stats` SET `payment_id`=NULL WHERE `payment_id`=0');
421 addExtensionSql('UPDATE `{?_MYSQL_PREFIX?}_user_stats` SET `pool_id`=NULL WHERE `pool_id`=0');
422 addExtensionSql('DELETE LOW_PRIORITY FROM `{?_MYSQL_PREFIX?}_user_stats` WHERE `userid` IS NULL');
424 // Update notes (these will be set as task text!)
425 setExtensionUpdateNotes("NULL ist wichtiger als 0 und UNSIGNED auch.");
428 case '0.3.8': // SQL queries for v0.3.8
429 addExtensionChangeTableColumnSql('user_data', 'last_failure', 'last_failure', 'TIMESTAMP NULL DEFAULT NULL');
431 // Update notes (these will be set as task text!)
432 setExtensionUpdateNotes("Ausgangswert ist nicht mehr 0000-00-00 00:00:00, sondern einfach NULL.");
435 case '0.3.9': // SQL queries for v0.3.9
436 // Update notes (these will be set as task text!)
437 setExtensionUpdateNotes("Update verschoben nach ext-order (da es Werbeguthaben ist und nichts mit dem Mitglied selbst zu tun hat).");
440 case '0.4.0': // SQL queries for v0.4.0
441 // Register new filters for gathering points
442 registerFilter(__FILE__, __LINE__, 'get_total_points', 'USER_POINTS', FALSE, TRUE, isExtensionDryRun());
443 registerFilter(__FILE__, __LINE__, 'get_own_points', 'USER_POINTS', FALSE, TRUE, isExtensionDryRun());
445 // Update notes (these will be set as task text!)
446 setExtensionUpdateNotes("Filter registriert, die das eigene {?POINTS?}-Guthaben des Mitgliedes zurückliefern.");
449 case '0.4.1': // SQL queries for v0.4.1
450 // Add special fix include to fix filters
451 addIncludeToPool('extension', 'inc/fix_user_points.php');
453 // Update notes (these will be set as task text!)
454 setExtensionUpdateNotes("Das Mitgliederguthaben musste repariert werden, da für Referral-Ebene 0, noch NULL geschrieben wurde.");
457 case '0.4.2': // SQL queries for v0.4.2
458 // Add special fix include to fix filters
459 addExtensionSql("DELETE LOW_PRIORITY FROM `{?_MYSQL_PREFIX?}_admin_menu` WHERE `what`='chk_regs' LIMIT 1");
461 // Update notes (these will be set as task text!)
462 setExtensionUpdateNotes("Überflüssiges Menü <strong>chk_regs</strong> entfernt, dies kann mit <strong>list_user</strong> übernommen werden.");
465 case '0.4.3': // SQL queries for v0.4.3
466 // Add special fix include to fix filters
467 addExtensionChangeTableColumnSql('user_data', 'refid', 'refid', 'BIGINT(20) NULL DEFAULT NULL');
469 // Update notes (these will be set as task text!)
470 setExtensionUpdateNotes("Überflüssiges Menü <strong>chk_regs</strong> entfernt, dies kann mit <strong>list_user</strong> übernommen werden.");
473 case '0.4.4': // SQL queries for v0.4.4
474 addDropTableSql('user_refs');
475 addCreateTableSql('user_refs', "
476 `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
477 `userid` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
478 `level` smallINT(6) UNSIGNED NOT NULL DEFAULT 0,
479 `refid` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
481 UNIQUE `user_refid` (`userid`, `level`, `refid`),
486 // Load ext-refback's special include to regenerate the referral table
487 addIncludeToPool('extension', 'inc/fix_refsystem.php');
489 // Update notes (these will be set as task text!)
490 setExtensionUpdateNotes("Neues Tabellenlayout und verschoben von ext-refback.");
493 case '0.4.5': // SQL queries for v0.4.5
494 addExtensionChangeTableColumnSql('user_links', 'link_type', 'link_type', "VARCHAR(255) NOT NULL DEFAULT 'NORMAL'");
496 // Update notes (these will be set as task text!)
497 setExtensionUpdateNotes("Die Spalte <strong>link_type</strong> ist nun kein ENUM mehr, um weitere Mailtypen zu erlauben.");
500 case '0.4.6': // SQL queries for v0.4.6
501 addExtensionSql("UPDATE `{?_MYSQL_PREFIX?}_admin_menu` SET `title`='{OPEN_CONFIG}POINTS{CLOSE_CONFIG} gutschreiben' WHERE `what` = 'add_points' LIMIT 1");
502 addExtensionSql("UPDATE `{?_MYSQL_PREFIX?}_admin_menu` SET `title`='{OPEN_CONFIG}POINTS{CLOSE_CONFIG} abziehen' WHERE `what` = 'sub_points' LIMIT 1");
503 addAdminMenuSql('user','sub_points','{OPEN_CONFIG}POINTS{CLOSE_CONFIG} abziehen','Allen oder einem Mitglied {OPEN_CONFIG}POINTS{CLOSE_CONFIG} abziehen.', 8);
505 // This update depends on ext-menu update
506 addExtensionDependency('menu');
508 // Update notes (these will be set as task text!)
509 setExtensionUpdateNotes("Abzug von {?POINTS?} sollte nun dabei sein und Hinzufügen gefixt (war zu kurze Spalte).");
512 case '0.4.7': // SQL queries for v0.4.7
513 addExtensionChangeTableColumnSql('user_data', 'lock_timestamp', 'lock_timestamp', 'TIMESTAMP NULL DEFAULT NULL');
514 addExtensionSql("UPDATE `{?_MYSQL_PREFIX?}_user_data` SET `lock_timestamp`=NULL WHERE `lock_timestamp`='0000-00-00 00:00:00'");
516 // Update notes (these will be set as task text!)
517 setExtensionUpdateNotes("0000-00-00 00:00:00 ist kein Standardwert mehr, NULL ist dies.");
520 case '0.4.8': // SQL queries for v0.4.8
521 // Update notes (these will be set as task text!)
522 setExtensionUpdateNotes("Dieses Update ist nicht mehr gültig.");
525 case '0.4.9': // SQL queries for v0.4.9
526 addExtensionChangeTableColumnSql('user_data', 'last_module', 'last_what', 'VARCHAR(255) NULL DEFAULT NULL');
528 // Register filter locked points
529 registerFilter(__FILE__, __LINE__, 'get_locked_points', 'LOCKED_USER_POINTS', FALSE, TRUE, isExtensionDryRun());
531 // Register filter for all column names
532 registerFilter(__FILE__, __LINE__, 'get_all_point_columns', 'GET_ALL_USER_POINTS_COLUMN_NAMES', FALSE, TRUE, isExtensionDryRun());
534 // Update notes (these will be set as task text!)
535 setExtensionUpdateNotes("Die Spalte <strong>last_module</strong> ist nach <strong>last_what</strong> umbenannt und hat nun NULL als Ausgangswert und Filter für gesperrtes Guthaben hinzugefügt.");
538 case '0.5.0': // SQL queries for v0.5.0
539 // Prefix for all test accounts
540 addConfigAddSql('tester_user_maximum', 'INT(5) UNSIGNED ZEROFILL NOT NULL DEFAULT 00999');
541 addConfigAddSql('tester_user_gender', "ENUM('M','F') NOT NULL DEFAULT 'M'");
542 addConfigAddSql('tester_user_surname_prefix', "VARCHAR(255) NOT NULL DEFAULT 'tester_'");
543 addConfigAddSql('tester_user_family', "VARCHAR(255) NOT NULL DEFAULT 'Testbenutzer'");
544 addConfigAddSql('tester_user_street_nr', "VARCHAR(255) NOT NULL DEFAULT 'Teststraße 123'");
545 addConfigAddSql('tester_user_zip', 'INT(6) UNSIGNED NOT NULL DEFAULT 12345');
546 addConfigAddSql('tester_user_city', "VARCHAR(255) NOT NULL DEFAULT 'Teststadt'");
547 addConfigAddSql('tester_user_email', "VARCHAR(255) NOT NULL DEFAULT '{OPEN_CONFIG}WEBMASTER{CLOSE_CONFIG}'");
548 addConfigAddSql('tester_user_default_refid', 'BIGINT(20) NULL DEFAULT NULL');
549 addConfigAddSql('tester_user_password', "VARCHAR(255) NOT NULL DEFAULT ''");
550 addConfigAddSql('tester_user_check_cat', "ENUM('Y','N') NOT NULL DEFAULT 'Y'");
553 addAdminMenuSql('user', 'add_tester_user', 'Testbenutzer anlegen', 'Es können hier bis zu 100 Testbenutzer angelegt werden. Diese haben als Vornamen immer den Präfix <span class="data">{?tester_user_surname_prefix?}</span> und werden bei Null anfangend bis 99 hochgezält.', 1);
554 addExtensionSql("UPDATE `{?_MYSQL_PREFIX?}_admin_menu` SET `title`='Mitglieder auflisten' WHERE `what`='list_user' LIMIT 1");
556 // Change 'zip' to INT(6)
557 addExtensionChangeTableColumnSql('user_data', 'zip', 'zip', 'INT(6) NOT NULL DEFAULT 0');
559 // Register filter for WHERE/AND exclusion/inclusion statements
560 registerFilter(__FILE__, __LINE__, 'user_exclusion_sql', 'TESTER_USER_EXCLUSION_SQL', FALSE, TRUE, isExtensionDryRun());
561 registerFilter(__FILE__, __LINE__, 'user_inclusion_sql', 'TESTER_USER_INCLUSION_SQL', FALSE, TRUE, isExtensionDryRun());
563 // Update notes (these will be set as task text!)
564 setExtensionUpdateNotes("Es können nun Test-Benutzer angelegt werden. Noch müssen diese überall ausgeschlossen werden, damit die Mediadaten nicht unnötig verfälscht werden.");
567 case '0.5.1': // SQL queries for v0.5.1
569 registerFilter(__FILE__, __LINE__, 'pre_user_registration', 'TESTER_USER_REGISTRATION_ADD_SQL_COLUMNS', FALSE, TRUE, isExtensionDryRun());
571 // Update notes (these will be set as task text!)
572 setExtensionUpdateNotes("Filter zum Hinzufügen von SQL-Spalten für die Mitgliederanmeldung hinzugefügt.");
575 case '0.5.2': // SQL queries for v0.5.2
577 registerFilter(__FILE__, __LINE__, 'convert_user_data_columns', 'ADD_USER_DATA_CONVERT_SQL_COLUMNS', FALSE, TRUE, isExtensionDryRun());
579 // Update notes (these will be set as task text!)
580 setExtensionUpdateNotes("Filter zum Hinzufügen von SQL-Spalten für die Mitgliederanmeldung hinzugefügt.");
583 case '0.5.3': // SQL queries for v0.5.3
585 registerFilter(__FILE__, __LINE__, 'post_refid_validation', 'HANDLE_USER_SUBID', FALSE, TRUE, isExtensionDryRun());
586 registerFilter(__FILE__, __LINE__, 'pre_user_registration', 'SUBID_USER_REGISTRATION_ADD_SQL_COLUMNS', FALSE, TRUE, isExtensionDryRun());
589 addAdminMenuSql('user', 'list_user_subid', 'Sub-Ids', 'Listet alle pro vom Mitglied eingegebenen Sub-Ids und ermittelten Referral-URLs auf.', 7);
592 addMemberMenuSql('extras', 'subids', 'Sub-Id Tracking', 4);
594 // Add table for subids
595 addDropTableSql('user_subids');
596 addCreateTableSql('user_subids', "
597 `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
598 `userid` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
599 `subid` VARCHAR(255) NOT NULL DEFAULT '',
600 `subid_added` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
602 UNIQUE `user_subid` (`userid`, `subid`),
606 // Add table for subid logging
607 addDropTableSql('subid_log');
608 addCreateTableSql('subid_log', "
609 `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
610 `refid` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
611 `subid` VARCHAR(255) NOT NULL DEFAULT '',
612 `referral_url` TINYTEXT NOT NULL,
613 `remote_address` VARCHAR(15) NOT NULL DEFAULT '0.0.0.0',
614 `entry_added` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
620 // For saving used subid in user_data table
621 addExtensionAddTableColumnSql('online', 'subid', 'VARCHAR(255) NULL DEFAULT NULL');
622 addExtensionSql('ALTER TABLE `{?_MYSQL_PREFIX?}_user_data` ADD INDEX (`subid`)');
624 // Configuration entry for purging old subid logs (7 days default)
625 addConfigAddSql('user_subid_purge', 'BIGINT(20) UNSIGNED NOT NULL DEFAULT ' . (getOneDay() * 7));
627 // Update notes (these will be set as task text!)
628 setExtensionUpdateNotes("Filter, Datenbanktabelle und Menüpunkte für SubId-Tracking hinzugefügt.");
631 case '0.5.4': // SQL queries for v0.5.4
633 registerFilter(__FILE__, __LINE__, 'update_referral_data', 'GENERIC_UPDATE_USER_REFERRAL', FALSE, TRUE, isExtensionDryRun());
634 registerFilter(__FILE__, __LINE__, 'update_referral_data', 'UPDATE_USER_SUBID', FALSE, TRUE, isExtensionDryRun());
637 addExtensionAddTableColumnSql('subid_log', 'user_agent', 'TINYTEXT NOT NULL AFTER `remote_address`');
639 // Update notes (these will be set as task text!)
640 setExtensionUpdateNotes("Weitere Filter für Referral-Counter und Sub-Id hinzugefügt.");
643 case '0.5.5': // SQL queries for v0.5.5
645 registerFilter(__FILE__, __LINE__, 'member_admin_actions', 'ADD_USER_SUBID_MEMBER_ACTION', FALSE, TRUE, isExtensionDryRun());
647 // Update notes (these will be set as task text!)
648 setExtensionUpdateNotes("Weiteren Filter für Mitglieder-Aktionen im Adminbereich hinzugefügt.");
651 case '0.5.6': // SQL queries for v0.5.6
653 registerFilter(__FILE__, __LINE__, 'member_reflink_extra_content', 'MEMBER_REFLINK_USER_SUBIDS_CONTENT', FALSE, TRUE, isExtensionDryRun());
655 // Update notes (these will be set as task text!)
656 setExtensionUpdateNotes("Weiteren Filter für Mitglieder-Aktionen im Adminbereich hinzugefügt.");
659 case '0.5.7': // SQL queries for v0.5.7
661 addAdminMenuSql('user', 'list_user_amounts', 'Guthaben anzeigen', 'Listet alle Mitglieder und deren Guthaben inklusive Abzug auf.', 8);
663 // Update notes (these will be set as task text!)
664 setExtensionUpdateNotes("Menü zum Auflisten des Guthabens hinzugefügt. Diese Daten sollen noch später weiter verarbeitet werden. Zum Beispiel soll dann schnell feststellbar sein, welche Verdienstgruppe das meiste und wenigste {?POINTS?}-Volumen besitzt.");
669 case 'modify': // When the extension got modified
672 case 'test': // For testing purposes
675 case 'init': // Do stuff when extension is initialized
678 default: // Unknown extension mode
679 logDebugMessage(__FILE__, __LINE__, sprintf("Unknown extension mode %s in extension %s detected.", getExtensionMode(), getCurrentExtensionName()));