subscribe.plugin.php 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. <?php
  2. //Cette fonction va generer une page quand on clique sur subscribe dans menu
  3. function subscribe_page(){
  4. global $_;
  5. if(!isset($_['module']) || $_['module'] !='subscribe') return;
  6. $page = !isset($_['page']) ? 'subscribe' : $_['page'];
  7. $page = str_replace('..','',$page);
  8. $file = __DIR__.SLASH.'page.'.$page.'.php';
  9. if(!file_exists($file)) throw new Exception("Page ".$page." inexistante");
  10. require_once($file);
  11. }
  12. //captcha simple
  13. function subscribe_captcha($code = null){
  14. //réponse captcha
  15. if(isset($code)){
  16. if($code == 'off'){
  17. unset($_SESSION['subscribe-captcha']);
  18. return;
  19. }
  20. if(!isset($_SESSION['subscribe-captcha'])) throw new Exception("Question anti-robot non initialisée");
  21. if($code != $_SESSION['subscribe-captcha']) throw new Exception("Réponse anti-robot invalide");
  22. return;
  23. }
  24. //question captcha
  25. $operators = array('+','-','*');
  26. $cssChars = array(
  27. '1'=>'<i class="boell"></i>',
  28. 'un'=>'<i class="boell"></i>',
  29. '+'=>'<i class="lecoq"></i>',
  30. 'plus'=>'<i class="lecoq"></i>',
  31. '-'=>'<i class="narboni"></i>',
  32. 'moins'=>'<i class="narboni"></i>',
  33. '5'=>'<i class="carruesco"></i>'
  34. );
  35. $literalOperators = array('plus','moins','fois');
  36. $literalNumbers = array('zero','un','deux','trois','quatre','cinq','six','sept','huit','neuf','dix');
  37. $questionBefore = array('Quel est le résultat du calcul suivant : ','Combien font ','Calculer ', 'Trouvez le résultat de ');
  38. $first = mt_rand(0,10);
  39. $second = mt_rand(0,10);
  40. $html = $questionBefore[mt_rand(0,count($questionBefore)-1)];
  41. $html .= mt_rand(0,1) ? $literalNumbers[$first] : $first;
  42. $operator = $operators[mt_rand(0,2)];
  43. $literalOperator = $operator;
  44. $literalOperator = mt_rand(0,1) ? str_replace($operators,$literalOperators,$literalOperator) : $literalOperator;
  45. $html .= ' '.$literalOperator.' ';
  46. $html .= mt_rand(0,1) ? $literalNumbers[$second] : $second;
  47. $_SESSION['subscribe-captcha'] = $first;
  48. switch ($operator) {
  49. case '+': $_SESSION['subscribe-captcha']+= $second; break;
  50. case '-': $_SESSION['subscribe-captcha']-= $second; break;
  51. case '*': $_SESSION['subscribe-captcha']*= $second; break;
  52. }
  53. $htmlParts = array();
  54. foreach (explode(' ',$html) as $key => $word) {
  55. if(is_numeric($word) || strlen($word)<=1) {
  56. $htmlParts[] = $word;
  57. continue;
  58. }
  59. $wordParts = str_split($word,strlen($word)/(mt_rand(1,2)));
  60. foreach ($wordParts as $key=>$part) {
  61. if(mt_rand(0,10) > 7){
  62. $wordParts[$key] = str_replace(array_keys($cssChars), array_values($cssChars), $wordParts[$key]);
  63. continue;
  64. }
  65. $wordParts[$key] = subscribe_text_image($wordParts[$key],mt_rand(0,1));
  66. }
  67. $htmlParts[] = implode($wordParts);
  68. }
  69. return '<div class="subscribe-captcha-block">'.implode(' ',$htmlParts).'</div>';
  70. }
  71. function subscribe_text_image($text,$svg = false){
  72. if($svg){
  73. $width = mb_strlen($text)*8;
  74. return '<svg height="20" style="margin-top: 1.5px;" width="'.$width.'">
  75. <text id="15 + 5 - 6 * 9" style="margin-top:5px;font-variant:normal;font-weight:normal;font-size:16px;font-family: \'subscribe-captcha\';-inkscape-font-specification:CourierNewPSMT;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" x="0" y="15">'.htmlentities($text).'</text>
  76. </svg>';
  77. }
  78. $width = mb_strlen($text)*8.5;
  79. ob_start();
  80. // Création de l'image
  81. $im = imagecreatetruecolor($width, 30);
  82. // Création de quelques couleurs
  83. $white = imagecolorallocate($im, 255, 255, 255);
  84. $black = imagecolorallocate($im, 33, 37, 41);
  85. imagefilledrectangle($im, 0, 0, 399, 29, $white);
  86. $font = __DIR__.SLASH.'font'.SLASH.'captcha.ttf';
  87. // Ajout du texte
  88. imagettftext($im, 13, 0, 0, 17, $black, $font, $text);
  89. imagepng($im);
  90. imagedestroy($im);
  91. $imgstream = ob_get_clean();
  92. return '<img style="width:'.$width .'px;height:30px;" src="data:image/png;base64,'.base64_encode($imgstream).'"/>';
  93. }
  94. //Fonction executée lors de l'activation du plugin
  95. function subscribe_install($id){
  96. if($id != 'fr.core.subscribe') return;
  97. Entity::install(__DIR__);
  98. /* LISTE DE VALEUR : Domaines blacklistés */
  99. if(!$list = Dictionary::bySlug('subscribe_domain_blacklist')){
  100. $list = new Dictionary;
  101. $list->slug = 'subscribe_domain_blacklist';
  102. $list->label = "Domaines blacklistés à l'inscription";
  103. $list->parent = 0;
  104. $list->state = Dictionary::ACTIVE;
  105. $list->save();
  106. }
  107. /* LISTE DE VALEUR : Domaines whitelistés */
  108. if(!$list = Dictionary::bySlug('subscribe_domain_whitelist')){
  109. $list = new Dictionary;
  110. $list->slug = 'subscribe_domain_whitelist';
  111. $list->label = "Domaines whitelistés à l'inscription";
  112. $list->parent = 0;
  113. $list->state = Dictionary::ACTIVE;
  114. $list->save();
  115. }
  116. }
  117. //Fonction executée lors de la désactivation du plugin
  118. function subscribe_uninstall($id){
  119. if($id != 'fr.core.subscribe') return;
  120. Entity::uninstall(__DIR__);
  121. }
  122. //Déclaration des sections de droits du plugin
  123. Right::register("subscribe",array('label'=>"Gestion des droits sur le plugin subscribe"));
  124. //Comprends toutes les actions du plugin qui ne nécessitent pas de vue html
  125. require_once(__DIR__.SLASH.'action.php');
  126. function subscribe_menu_login(&$loginMenu){
  127. global $conf;
  128. if(!$conf->get('subscribe_login_link')) return;
  129. $loginMenu[] = array(
  130. 'sort' => 1,
  131. 'icon' => 'fas fa-sign-in-alt',
  132. 'label' => "S'inscrire",
  133. 'url' => 'index.php?module=subscribe',
  134. 'custom' => '<a title="Inscription" class="btn btn-secondary btn-sm" href="index.php?module=subscribe">S\'inscrire</a>'
  135. );
  136. }
  137. //Déclaration du menu de réglages
  138. function subscribe_menu_setting(&$settingMenu){
  139. global $myUser;
  140. if(!$myUser->can('subscribe','configure')) return;
  141. $settingMenu[] = array(
  142. 'sort' =>1,
  143. 'url' => 'setting.php?section=global.subscribe',
  144. 'icon' => 'fas fa-angle-right',
  145. 'label' => 'Inscription'
  146. );
  147. }
  148. //Déclaration des pages de réglages
  149. function subscribe_content_setting(){
  150. global $_;
  151. if(file_exists(__DIR__.SLASH.'setting.'.$_['section'].'.php'))
  152. require_once(__DIR__.SLASH.'setting.'.$_['section'].'.php');
  153. }
  154. //Cron réalisé tous les jours pour supprimer
  155. //les comptes n'ayant validé leur inscription
  156. function subscribe_cron($time){
  157. global $_,$conf;
  158. if(date('H:i', $time)!='00:00' || empty($conf->get('subscribe_registered_expire'))) return;
  159. foreach(User::loadAll(array('state'=>'registered')) as $user){
  160. if($user->state!='registered' || (time()-$user->created) <= strtotime(intval($conf->get('subscribe_registered_expire')).' days', 0)) continue;
  161. User::deleteById($user->id);
  162. }
  163. }
  164. //Déclaration des settings de base
  165. Configuration::setting('subscribe',array(
  166. "Général",
  167. 'subscribe_login_link' => array("label"=>"Lien d'inscription dans l'encart de login", "legend"=>"Afficher le lien d'inscription dans le menu déroulant de connexion","type"=>"boolean"),
  168. 'subscribe_short_login' => array("label"=>"Utiliser les identifiants courts","legend"=>"Tronquer l'email renseigné sans la partie @ pour générer l'identifiant","type"=>"boolean"),
  169. 'subscribe_firm' => array("label"=>"Établissement attribué par défaut","legend"=>"Établissement attribué automatiquement aux utilisateurs validés après inscription","type"=>"firm"),
  170. 'subscribe_rank' => array("label"=>"Rang attribué par défaut","legend"=>"Rang attribué automatiquement aux utilisateurs validés après inscription","type"=>"rank"),
  171. 'subscribe_registered_expire' => array("label"=>"Expiration comptes inscrits non-validés","legend"=>"Délai en jours avant suppression des comptes n'ayant pas confirmé leur inscription","type"=>"integer", "placeholder"=>"eg. 28"),
  172. "Vérification",
  173. 'subscribe_enable_captcha' => array("label"=>"Activer le captcha","legend"=>"Oblige les utilisateurs à renseigner la validation anti-robot pour s'inscrire","type"=>"boolean"),
  174. 'subscribe_disable_paste' => array("label"=>"Désactiver le copier/coller","legend"=>"Si coché, oblige les utilisateurs à re-taper leur adresse mail pour la confirmation","type"=>"boolean"),
  175. 'subscribe_mail_expire' => array("label"=>"Expiration lien d'inscription","legend"=>"Délai en jours avant expiration du lien d'inscription envoyé par mail (0 pour aucune expiration)","type"=>"integer", "placeholder"=>"eg. 06"),
  176. 'subscribe_reply_mail' => array("label"=>"Adresse mail expéditeur","legend"=>"L'adresse mail indiqué comme expéditeur du mail d'inscription","type"=>"mail", "placeholder"=>"eg. no-reply@core.fr"),
  177. 'subscribe_disable_mail' => array("label"=>"Désactiver la vérification par e-mail","legend"=>"<strong class=\"text-danger\">(Déconseillé)</strong> Si coché, aucun mail de confirmation d'inscription ne sera envoyé","type"=>"boolean"),
  178. "Gestion des domaines",
  179. 'subscribe_enable_blacklist' => array("label"=>"Activer la liste noire des domaines","legend"=>"Empêche les domaines renseignés à l'inscription","type"=>"boolean"),
  180. 'subscribe_enable_whitelist' => array("label"=>"Activer la liste blanche des domaines","legend"=>"Autorise uniquement les domaines renseignés à l'inscription","type"=>"boolean"),
  181. ));
  182. //Déclation des assets
  183. Plugin::addCss("/css/main.css");
  184. Plugin::addJs("/js/main.js");
  185. //Mapping hook / fonctions
  186. Plugin::addHook("install", "subscribe_install");
  187. Plugin::addHook("uninstall", "subscribe_uninstall");
  188. Plugin::addHook("page", "subscribe_page");
  189. Plugin::addHook("menu_setting", "subscribe_menu_setting");
  190. Plugin::addHook("content_setting", "subscribe_content_setting");
  191. Plugin::addHook("menu_login", "subscribe_menu_login");
  192. Plugin::addHook("content_setting", "subscribe_content_setting");
  193. Plugin::addHook("cron", "subscribe_cron");
  194. ?>