action.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <?php
  2. global $_,$conf;
  3. switch($_['action']){
  4. //Récuperation d'une liste d'utilisateurs en attente de validation
  5. case 'subscribe_search':
  6. Action::write(function(&$response){
  7. global $myUser,$_;
  8. User::check_access('subscribe','read');
  9. });
  10. break;
  11. //Ajout ou modification d'élément
  12. case 'subscribe_save':
  13. Action::write(function(&$response){
  14. global $myUser,$_,$conf;
  15. Plugin::callHook('subscribe_validate',array());
  16. if(empty($_['firstname'])) throw new Exception('Le champ "Prénom" est obligatoire');
  17. if(empty($_['name'])) throw new Exception('Le champ "Nom" est obligatoire');
  18. $_['mail'] = mb_strtolower(trim($_['mail']));
  19. if(empty($_['mail'])) throw new Exception('Le champ "Email" est obligatoire');
  20. if(!check_mail($_['mail'])) throw new Exception('Le format du champ "Email" est invalide');
  21. if(empty($_['mail_confirm']) || $_['mail'] != $_['mail_confirm']) throw new Exception('Champs "Email" et "Confirmation email" non similaires');
  22. //Récupération du domaine
  23. preg_match("/.*@(.*)/i", $_['mail'], $matches);
  24. if(!empty($conf->get('subscribe_enable_blacklist'))) {
  25. $blacklist = array();
  26. foreach(Dictionnary::bySlug('subscribe_domain_blacklist', true) as $domain)
  27. $blacklist[] = trim($domain->label);
  28. if(!isset($matches[1]) || in_array($matches[1], $blacklist)) throw new Exception("Le domaine utilisé pour l'adresse mail n'est pas autorisé");
  29. }
  30. if(!empty($conf->get('subscribe_enable_whitelist'))) {
  31. $whitelist = array();
  32. foreach(Dictionnary::bySlug('subscribe_domain_whitelist', true) as $domain)
  33. $whitelist[] = trim($domain->label);
  34. if(!isset($matches[1]) || !in_array($matches[1], $whitelist)) throw new Exception("Le domaine utilisé pour l'adresse mail n'est pas autorisé");
  35. }
  36. if(empty($_['password_initialisation'])) throw new Exception("Mot de passe obligatoire");
  37. if(!empty($conf->get('password_forbidden_char')) && preg_match('|['.preg_quote(htmlspecialchars_decode($conf->get('password_forbidden_char'))).']|i', htmlspecialchars_decode($_['password_initialisation']), $match))
  38. throw new Exception("Caractère ".$match[0]." interdit dans le mot de passe");
  39. $_['password_initialisation'] = trim($_['password_initialisation']);
  40. $_['password_confirm'] = trim($_['password_confirm']);
  41. if(empty($_['password_confirm']) || $_['password_initialisation'] != $_['password_confirm']) throw new Exception("Mot de passe et confirmation non similaires");
  42. $passwordErrors = User::check_password_format(html_entity_decode($_['password_initialisation']));
  43. if(count($passwordErrors)!=0) throw new Exception("Le format de mot de passe ne respecte pas les conditions suivantes : <br>".implode("<br>",$passwordErrors));
  44. if($conf->get('subscribe_enable_captcha')){
  45. //Vérification du code captcha
  46. if(!isset($_['captcha']) || (empty($_['captcha']) && $_['captcha'] != 0)) throw new Exception('Veuillez remplir le champ anti-robots');
  47. subscribe_captcha($_['captcha']);
  48. }
  49. if(empty($conf->get('subscribe_firm'))) throw new Exception("Module non configuré (établissement), merci de contacter un administrateur");
  50. if(empty($conf->get('subscribe_rank')) && empty($conf->get('connected_default_rank'))) throw new Exception("Module non configuré (rang), merci de contacter un administrateur");
  51. $user = new User;
  52. $user->firstname = ucfirst(mb_strtolower($_['firstname']));
  53. $user->name = mb_strtoupper($_['name']);
  54. $user->login = $_['mail'];
  55. if($conf->get('subscribe_short_login')) $user->login = preg_replace('/^([^@]+)@.*\.[a-z]{2,6}/im', '$1', $user->login);
  56. $user->mail = $_['mail'];
  57. if($_['password_initialisation']==$user->mail) throw new Exception("Le mot de passe ne peut pas être identique à l'adresse mail");
  58. if($_['password_initialisation']==$user->login) throw new Exception("Le mot de passe ne peut pas être identique à l'identifiant");
  59. foreach(User::getAll(array('right'=>false, 'force'=>true)) as $existingUser){
  60. if($existingUser->mail == trim($user->mail)) throw new Exception("Un utilisateur existe déjà avec cette adresse email, ".(!empty($conf->get('password_allow_lost'))?"veuillez utiliser le système de mot de passe oublié":"veuillez contacter un administrateur"));
  61. if($existingUser->login == $user->login) throw new Exception("Un utilisateur existe déjà avec cet identifiant, ".(!empty($conf->get('password_allow_lost'))?"veuillez utiliser le système de mot de passe oublié":"veuillez contacter un administrateur"));
  62. }
  63. $user->state = $conf->get('subscribe_disable_mail') ? User::ACTIVE : 'registered';
  64. $user->password = User::password_encrypt($_['password_initialisation']);
  65. $user->preference('passwordTime',time());
  66. $token = base64_encode(sha1($user->login.mt_rand(0,1000).time()));
  67. $user->token = $token;
  68. $user->save();
  69. //clear du captcha utilisé
  70. subscribe_captcha('off');
  71. //validation par mail si non désactivé
  72. if(!$conf->get('subscribe_disable_mail')){
  73. $expDays = intval($conf->get('subscribe_mail_expire'));
  74. $parameters = array('token' => $user->token,'step' => 1,);
  75. $link = ROOT_URL.'/index.php?module=subscribe&page=validation&token='.base64_encode(json_encode($parameters));
  76. $mail = new Mail();
  77. $mail->title = "Inscription sur ".ROOT_URL;
  78. $mail->expeditor = !empty($conf->get('subscribe_reply_mail')) ? $conf->get('subscribe_reply_mail') : "no-reply@core.fr";
  79. $mail->reply = !empty($conf->get('subscribe_reply_mail')) ? $conf->get('subscribe_reply_mail') : "no-reply@core.fr";
  80. $mail->template(__DIR__.SLASH.'mail.subscription.html',array(
  81. 'link' => $link,
  82. 'url' => ROOT_URL,
  83. 'name' => $user->name,
  84. 'firstname' => $user->firstname,
  85. 'accountExpiration' => !empty($conf->get('subscribe_registered_expire')) ? intval($conf->get('subscribe_registered_expire')) : '',
  86. 'expDays' => $expDays,
  87. 'expDate' => !empty($expDays) ? date("d/m/Y à H:i", strtotime($expDays." days")) : ''
  88. ),true);
  89. $mail->recipients['to'][] = $user->mail;
  90. $mail->send();
  91. } else {
  92. $response['login'] = $user->login;
  93. }
  94. if(isset($_SESSION['users_rights'])) unset($_SESSION['users_rights']);
  95. if(isset($_SESSION['users_norights'])) unset($_SESSION['users_norights']);
  96. Log::put("Inscription de l'utilisateur ".$user->toText(),'Utilisateur');
  97. Plugin::callHook('subscribe_save',array(&$fields));
  98. });
  99. break;
  100. //Édition d'utilisateur en attente de validation
  101. case 'subscribe_edit':
  102. Action::write(function(&$response){
  103. global $myUser,$_;
  104. User::check_access('subscribe','delete');
  105. });
  106. break;
  107. //Suppression d'utilisateur en attente de validation
  108. case 'subscribe_delete':
  109. Action::write(function(&$response){
  110. global $myUser,$_;
  111. User::check_access('subscribe','delete');
  112. });
  113. break;
  114. //Sauvegarde des configurations de subscribe
  115. case 'subscribe_setting_save':
  116. Action::write(function(&$response){
  117. global $myUser,$_,$conf;
  118. User::check_access('subscribe','configure');
  119. foreach(Configuration::setting('subscribe') as $key=>$value){
  120. if(!is_array($value)) continue;
  121. $allowed[] = $key;
  122. }
  123. foreach ($_['fields'] as $key => $value)
  124. if(in_array($key, $allowed)){
  125. if($key == 'subscribe_mail_expire' && (!is_numeric($value) || $value<0)) $value = 0;
  126. $conf->put($key,$value);
  127. }
  128. });
  129. break;
  130. //Récupération card des règles de mot de passe
  131. case 'subscribe_password_card':
  132. Action::write(function(&$response){
  133. global $_,$conf;
  134. $selectedFormats = json_decode($conf->get('password_format'),true);
  135. $passwordInput = isset($_['password']) ? trim($_['password']) : '';
  136. $formats = array();
  137. foreach (User::password_formats() as $format)
  138. $formats[$format['pattern']] = $format;
  139. ob_start();
  140. require_once(__DIR__.SLASH.'card.subscribe.password.php');
  141. $stream = ob_get_clean();
  142. $response['content'] = $stream;
  143. });
  144. break;
  145. }