source: extensions/NBC_UserAdvManager/trunk/main.inc.php @ 4164

Last change on this file since 4164 was 4164, checked in by Eric, 14 years ago

[NBC_UserAdvManager]
Bug 1226 fixed - "duplicate key error" when lastvisit table is not empty and on using Ghost Tracker init function

  • Property svn:eol-style set to LF
File size: 16.5 KB
Line 
1<?php
2/*
3Plugin Name: NBC UserAdvManager
4Version: 2.12.3
5Description: Permet de renforcer les possibilités de gestion des utilisateurs - Enforce users management
6Plugin URI: http://fr.piwigo.org/ext/extension_view.php?eid=216
7Author: Nicco, Eric
8Author URI: http://gallery-nicco.no-ip.org, http://www.infernoweb.net
9*/
10
11/*
12 ***** Plugin history (branch 2.10)*****
13
14-- 2.10.0-beta : Initial beta release for Piwigo compatibility
15-- 2.10.1-beta : Small correction on generated path
16-- 2.10.2-beta : Bug resolved on register validation page
17
18-- 2.10.3 : Final and fully functional release
19                                                Bug resolved on plugin activation
20
21-- 2.10.4 : Bug fixed on profiles update
22
23-- 2.10.5 : Improved code on profiles update
24
25-- 2.10.6 : Old language packs (iso) deleted (forget from PWG 1.7.x version)
26
27-- 2.10.7 : Bug fixed on user's validation email sending
28
29-- 2.10.8 : ConfirmMail page looks better (Sylvia theme only)
30                                                Improved code for checking author on guest comments
31
32-- 2.10.9 : Bug fixed - Missing english translation
33                                                Bug fixed - Notice on forbidden characters function use
34                                                Bug fixed - Audit on forbidden characters in username didn't work
35                                                Adding of email provider exclusion (like *@hotmail.com) - Warning ! -> Known bug : This feature doesn't work on user profile page. So, already registered users can change their email address to a forbiden one.
36
37-- 2.10.9a : Email provider exclusion is no longer case sensitive
38
39-- 2.10.9b : Bug fixed - Home icon wasn't linked to gallery url in ConfirmMail page. If GALLERY_URL is not set, Home icon gets the pwg root path.
40
41-- 2.10.9c : Bug fixed - If Email provider exclusion is set off, new registered user will have a PHP notice on "Undefined variable: ncsemail"
42
43-- 2.10.9d : Code simplification - need no more ""template"" sub-directory in plugin directory for enhance "back link" icon in ConfirMail.tpl
44
45-- 2.10.9e : Compatibility improvement with PHP 5.3 - Some old functions will be deprecated like :
46                                                        ereg replaced by preg_match
47                                                        eregi replace by preg_match with "i" moderator
48                                                        split replace by preg_split
49                               
50-- 2.10.9f : Compatibility bug fixed when used with DynamicRecentPeriod plugin
51
52-- 2.11.0 : New tabsheet menu to manage ConfirMail functions (setting a timeout without validation, Cleanup expired user's accounts, Force confirmation, Renew validation key, list unvalidated users,...)
53                                                Beautify plugin's main admin panel
54                                               
55-- 2.11.1 : Bug fixed with install and upgrade functions
56                                                Language files correction
57
58-- 2.11.2 : Bug fixed on bad query for unvalidated users display in unvalidated users list
59                                                Bug fixed : Sql syntax error on plugin activation
60
61-- 2.11.3 : On Patricia's request (french forum and bug 1173), the unvalidated users management tab shows users according with the settings of unvalidated group and / or unvalidated status.
62                                                Feature 1172 added : Email providers exclusion list can be set with CR/LF between each entry. The comma seperator (,) is still mandatory.
63                                                Bug 1175 fixed : Bad translation tag in french language file.
64                                                Improvement of unvalidated users management tab (feature 1174)- Expired users are displayed in red color text.
65
66-- 2.11.4 : Bug 1177 fixed : Width of excluded email providers list reset to ancient value (80 col)
67                                                Bug 1179 fixed : Adding a notice in plugin inline documentation for use of validation groups and status. A default group must be set in Piwigo's groups settings and the "Guest" (or another user) must be set as default for status values.
68                                                Bug 1182 fixed : Language tag missing in confirmation email generation
69
70-- 2.11.5 : Bug 1195 fixed : Registration displays the good title
71
72-- 2.12.0 : Bug 1206 fixed : All plugin functionnalities work in user's profile page
73                Plugin's core code and admin panel refactoring
74                Password control and enforcement : A complexity score is computed on user registration. If this score is less than the goal set by admin, the password choosen is rejected.
75                Feature 1194 "Ghost Tracker" added : New plugin tab displays users who don't comes back to the gallery since x days. Ability to send email reminders and to delete reminded but "dead" users. It's the reason why this feature is called "Ghost Tracker".
76
77-- 2.12.1 : Rollback on admin panel improvement (it was a bad idea)
78
79-- 2.12.2 : Bug 1221 fixed - Adding of a new funtion to populate the lastvisit table on Ghost Tracker activation
80            Bug 1224 fixed - Error in database after plugin activation
81            Bug 1225 fixed - "Reminder" status don't change from "false" to "true" after the sent of a reminder email
82            Some code beautify (SQL requests and HTML 4 strict for tpl)
83
84-- 2.12.3 : Bug 1226 fixed - "duplicate key error" when lastvisit table is not empty and on using Ghost Tracker init function
85*/
86
87/*
88
89 ***** TODO List *****
90++ No validation needed for admins users comments (new trigger needed in comments.php ?)
91
92++ No single email check for admins (new trigger needed in functions_user.inc.php ?)
93
94++ Password control and enforcement
95  ?? Can not be the same as username -> Could password score control be sufficient ?
96 
97++ Security : Blocking brut-force attacks !
98              -> Way to do that : Count the number of failed attempts to connect and lock the targetted account after x attempts. Where x will be settable by admin.
99              To unlock the locked account :
100               -> A new table in admin's plugin panel which would display the locked accounts.
101               -> Sending an email to account owner to inform him his account is blocked due to multiple failed connexions attempts. This email could have a link with a security key to unlock the account.
102               -> Both of above solutions ?
103
104++ Opportunity to copy a registered user for new user creation
105  ++ new copied user will (or not) belong to the same groups
106  ++ new copied user will (or not) get the same status (visitor, admin, webmaster, guest (??))
107  ++ new copied user will (or not) get the same properties
108  ++ new copied user will (or not) get the same language
109  ... and so on
110 
111*/
112
113
114if (!defined('PHPWG_ROOT_PATH'))
115{
116  die('Hacking attempt!');
117}
118
119define('NBC_UserAdvManager_DIR' , basename(dirname(__FILE__)));
120define('NBC_UserAdvManager_PATH' , PHPWG_PLUGINS_PATH.basename(dirname(__FILE__)).'/');
121
122include_once (NBC_UserAdvManager_PATH.'include/constants.php');
123include_once (NBC_UserAdvManager_PATH.'include/functions_UserAdvManager.inc.php');
124
125load_language('plugin.lang', NBC_UserAdvManager_PATH);
126
127
128/* Plugin admin */
129add_event_handler('get_admin_plugin_menu_links', 'nbc_UserAdvManager_admin_menu');
130
131function nbc_UserAdvManager_admin_menu($menu)
132{
133  array_push($menu,
134    array(
135      'NAME' => 'UserAdvManager',
136      'URL'  => get_admin_plugin_menu_link(NBC_UserAdvManager_PATH.'/admin/UserAdvManager_admin.php')
137    )
138  );
139
140  return $menu;
141}
142
143
144add_event_handler('loc_begin_index', 'UserAdvManager_GhostTracker');
145
146function UserAdvManager_GhostTracker()
147{
148  global $conf, $user;
149 
150  $conf_nbc_UserAdvManager = isset($conf['nbc_UserAdvManager']) ? explode(";" , $conf['nbc_UserAdvManager']) : array();
151
152  if (isset($conf_nbc_UserAdvManager[17]) and $conf_nbc_UserAdvManager[17] == 'true' and !is_admin() and !is_a_guest())
153  {
154
155    $userid = get_userid($user['username']);
156         
157    /* Looking for existing entry in last visit table */
158    $query = '
159SELECT *
160  FROM '.USER_LASTVISIT_TABLE.'
161WHERE user_id = '.$userid.'
162;';
163       
164    $count = mysql_num_rows(pwg_query($query));
165         
166    if ($count == 0)
167    {
168      /* If not, data are inserted in table */
169      $query = '
170INSERT INTO '.USER_LASTVISIT_TABLE.' (user_id, lastvisit, reminder)
171VALUES ('.$userid.', now(), "false")
172;';
173      pwg_query($query);
174    }
175    else if ($count > 0)
176    {
177      /* If yes, data are updated in table */
178      $query = '
179UPDATE '.USER_LASTVISIT_TABLE.'
180SET lastvisit = now(), reminder = "false"
181WHERE user_id = '.$userid.'
182LIMIT 1
183;';
184      pwg_query($query);
185    }
186  }
187}
188
189
190/* User creation */
191add_event_handler('register_user', 'UserAdvManager_Adduser');
192
193function UserAdvManager_Adduser($register_user)
194{
195  global $conf;
196 
197  $conf_nbc_UserAdvManager = isset($conf['nbc_UserAdvManager']) ? explode(";" , $conf['nbc_UserAdvManager']) : array();
198 
199  /* Sending registration confirmation by email */
200  if ((isset($conf_nbc_UserAdvManager[0]) and $conf_nbc_UserAdvManager[0] == 'true') or (isset($conf_nbc_UserAdvManager[2]) and $conf_nbc_UserAdvManager[2] == 'true'))
201  {
202    SendMail2User(1, $register_user['id'], $register_user['username'], $_POST['password'], $register_user['email'], true);
203  }
204}
205
206
207
208/* User deletion */
209add_event_handler('delete_user', 'UserAdvManager_Deluser');
210
211function UserAdvManager_Deluser($user_id)
212{
213  /* Cleanup for ConfirmMail table */
214  DeleteConfirmMail($user_id);
215  /* Cleanup for LastVisit table */
216  DeleteLastVisit($user_id);
217}
218
219
220/* Check users registration */
221add_event_handler('register_user_check', 'UserAdvManager_RegistrationCheck', EVENT_HANDLER_PRIORITY_NEUTRAL, 2);
222
223function UserAdvManager_RegistrationCheck($err, $user)
224{
225  global $errors, $conf;
226
227  $PasswordCheck = 0;
228 
229  $conf_nbc_UserAdvManager = isset($conf['nbc_UserAdvManager']) ? explode(";" , $conf['nbc_UserAdvManager']) : array();
230
231  /* Password enforcement control */
232  if (isset($conf_nbc_UserAdvManager[14]) and $conf_nbc_UserAdvManager[14] == 'true' and !empty($conf_nbc_UserAdvManager[15]))
233  {
234    if (!empty($user['password']) and !is_admin())
235    {
236      $PasswordCheck = testpassword($user['password']);
237 
238      if ($PasswordCheck < $conf_nbc_UserAdvManager[15])
239      {
240        $message = get_l10n_args('reg_err_login4_%s', $PasswordCheck);
241        return($lang['reg_err_pass'] = l10n_args($message).$conf_nbc_UserAdvManager[15]);
242      }
243    }
244    else if (!empty($user['password']) and is_admin() and isset($conf_nbc_UserAdvManager[16]) and $conf_nbc_UserAdvManager[16] == 'true')
245    { 
246      $PasswordCheck = testpassword($user['password']);
247 
248      if ($PasswordCheck < $conf_nbc_UserAdvManager[15])
249      {
250        $message = get_l10n_args('reg_err_login4_%s', $PasswordCheck);
251        return($lang['reg_err_pass'] = l10n_args($message).$conf_nbc_UserAdvManager[15]);
252      }
253    }
254  }
255
256  /* Username non case sensitive */
257  if (isset($conf_nbc_UserAdvManager[1]) and $conf_nbc_UserAdvManager[1] == 'true')
258  {
259    $new_username =  NotSensibleSearchUsername($_POST['login']);
260    $_POST['login'] = $new_username == '' ? $_POST['login'] : $new_username;
261  }
262
263  /* Username without forbidden keys */
264  if (isset($conf_nbc_UserAdvManager[7]) and $conf_nbc_UserAdvManager[7] == 'true' and !empty($_POST['login']) and !ValidateUsername($_POST['login']))
265  {
266    $_POST['login'] = '';
267    return($lang['reg_err_login1'] = l10n('reg_err_login6')."'".$conf_nbc_UserAdvManager[8]."'");
268  }
269
270  /* Email without forbidden domains */
271  if (isset($conf_nbc_UserAdvManager[12]) and $conf_nbc_UserAdvManager[12] == 'true' and !empty($_POST['mail_address']) and !ValidateEmailProvider($_POST['mail_address']))
272  {
273    $_POST['login'] = '';
274    return($lang['reg_err_login1'] = l10n('reg_err_login7')."'".$conf_nbc_UserAdvManager[13]."'");
275  }
276}
277
278
279if (script_basename() == 'profile')
280{
281  add_event_handler('loc_begin_profile', 'UserAdvManager_Profile_Init');
282
283  function UserAdvManager_Profile_Init()
284  {
285    global $conf, $user, $template;
286
287    $conf_nbc_UserAdvManager = isset($conf['nbc_UserAdvManager']) ? explode(";" , $conf['nbc_UserAdvManager']) : array();
288
289    if (isset($_POST['validate']))
290    {
291      /* Email without forbidden domains */
292      if (isset($conf_nbc_UserAdvManager[12]) and $conf_nbc_UserAdvManager[12] == 'true' and !empty($_POST['mail_address']))
293      {
294        if (!ValidateEmailProvider($_POST['mail_address']))
295        {
296          $template->append('errors', l10n('reg_err_login7')."'".$conf_nbc_UserAdvManager[13]."'");
297          unset($_POST['validate']);
298        }
299      }
300
301      $typemail = 3;
302     
303      if (!empty($_POST['use_new_pwd']))
304      {
305        $typemail = 2;
306       
307        /* Password enforcement control */
308        if (isset($conf_nbc_UserAdvManager[14]) and $conf_nbc_UserAdvManager[14] == 'true' and !empty($conf_nbc_UserAdvManager[15]))
309        {
310          $PasswordCheck = testpassword($_POST['use_new_pwd']);
311         
312          if ($PasswordCheck < $conf_nbc_UserAdvManager[15])
313          {
314            $message = get_l10n_args('reg_err_login4_%s', $PasswordCheck);
315            $template->append('errors', l10n_args($message).$conf_nbc_UserAdvManager[15]);
316            unset($_POST['use_new_pwd']);
317            unset($_POST['validate']);
318          }
319        }
320      }
321     
322      /* Sending registration confirmation by email */
323      if (( isset($conf_nbc_UserAdvManager[0]) and $conf_nbc_UserAdvManager[0] == 'true') or ( isset($conf_nbc_UserAdvManager[2]) and $conf_nbc_UserAdvManager[2] == 'true'))
324      {
325        $confirm_mail_need = false;
326             
327        if (!empty($_POST['mail_address']) and ValidateEmailProvider($_POST['mail_address']))
328        {
329          $query = '
330SELECT '.$conf['user_fields']['email'].' AS email
331FROM '.USERS_TABLE.'
332WHERE '.$conf['user_fields']['id'].' = \''.$user['id'].'\'
333;';
334         
335          list($current_email) = mysql_fetch_row(pwg_query($query));
336     
337          if ( $_POST['mail_address'] != $current_email and ( isset($conf_nbc_UserAdvManager[2]) and $conf_nbc_UserAdvManager[2] == 'true') )
338       
339            $confirm_mail_need = true;
340        }
341       
342        if ((!empty($_POST['use_new_pwd']) and ( isset($conf_nbc_UserAdvManager[0]) and $conf_nbc_UserAdvManager[0] == 'true') or $confirm_mail_need) )
343        {
344          $query = '
345SELECT '.$conf['user_fields']['username'].'
346FROM '.USERS_TABLE.'
347WHERE '.$conf['user_fields']['id'].' = \''.$user['id'].'\'
348;';
349       
350          list($username) = mysql_fetch_row(pwg_query($query));
351
352          SendMail2User($typemail, $user['id'], $username, $_POST['use_new_pwd'], $_POST['mail_address'], $confirm_mail_need);
353        }
354      }
355    }
356  }
357}
358
359
360add_event_handler('init', 'UserAdvManager_InitPage');
361 
362function UserAdvManager_InitPage()
363{
364  load_language('plugin.lang', NBC_UserAdvManager_PATH);
365  global $conf, $template, $page, $lang, $errors;
366
367  $conf_nbc_UserAdvManager = isset($conf['nbc_UserAdvManager']) ? explode(";" , $conf['nbc_UserAdvManager']) : array();
368 
369  /* Username non case sensitive */
370  if (isset($conf_nbc_UserAdvManager[1]) and $conf_nbc_UserAdvManager[1] == 'true')
371  {
372    $lang['reg_err_login5'] = l10n('reg_err_login5');
373  }
374 
375
376 
377/* User identification */
378  if (script_basename() == 'identification')
379  {
380    if (isset($_POST['login']))
381    {
382      /* User non case sensitive */
383      if (isset($conf_nbc_UserAdvManager[1]) and $conf_nbc_UserAdvManager[1] == 'true' )
384      {
385        $new_username =  NotSensibleSearchUsername($_POST['username']);
386        $_POST['username'] = $new_username == '' ? $_POST['username'] : $new_username;
387      }
388    }
389  }
390
391
392/* Admin user management */
393  if (script_basename() == 'admin' and isset($_GET['page']) and $_GET['page'] == 'user_list')
394  {
395    if (isset($_POST['submit_add']))
396    {
397      /* User non case sensitive */
398      if (isset($conf_nbc_UserAdvManager[1]) and $conf_nbc_UserAdvManager[1] == 'true' )
399      {
400        $new_username =  NotSensibleSearchUsername($_POST['login']);
401        $_POST['login'] = $new_username == '' ? $_POST['login'] : $new_username;
402      }
403
404      /* Username without forbidden keys */
405      if (isset($conf_nbc_UserAdvManager[7]) and $conf_nbc_UserAdvManager[7] == 'true' and !empty($_POST['login']) and !ValidateUsername($_POST['login']))
406      {
407        $template->append('errors', l10n('reg_err_login6')."'".$conf_nbc_UserAdvManager[8]."'");
408        unset($_POST['submit_add']);
409      }
410
411      /* Email without forbidden domains */
412      if (isset($conf_nbc_UserAdvManager[12]) and $conf_nbc_UserAdvManager[12] == 'true' and !empty($_POST['email']) and !ValidateEmailProvider($_POST['email']))
413      {
414        $template->append('errors', l10n('reg_err_login7')."'".$conf_nbc_UserAdvManager[13]."'");
415        unset($_POST['submit_add']);
416      }
417    }
418  }
419}
420
421
422add_event_handler('user_comment_check', 'UserAdvManager_CheckEmptyCommentAuthor', 50, 2);
423
424function UserAdvManager_CheckEmptyCommentAuthor($comment_action, $comm)
425{
426  load_language('plugin.lang', NBC_UserAdvManager_PATH);
427  global $infos, $conf, $template;
428
429  $conf_nbc_UserAdvManager = isset($conf['nbc_UserAdvManager']) ? explode(";" , $conf['nbc_UserAdvManager']) : array();
430
431/* User creation OR update */
432  if (isset($conf_nbc_UserAdvManager[6]) and $conf_nbc_UserAdvManager[6] == 'true' and $conf['comments_forall'] == 'true' and $comm['author'] == 'guest')
433  {
434    $comment_action = 'reject';
435
436    array_push($infos, l10n('UserAdvManager_Empty Author'));
437  }
438
439  return $comment_action;
440}
441
442?>
Note: See TracBrowser for help on using the repository browser.