Comment: | La gestion de la queue de mail sera externalisée, ce qui fait plus de sens pour les fermes à Garradin |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | dev |
Files: | files | file ages | folders |
SHA1: |
ac0720b762a50aa893d679029da36fd0 |
User & Date: | bohwaz on 2018-08-06 13:42:18 |
Other Links: | branch diff | manifest | tags |
2018-08-10
| ||
20:37 | Permettre de désactiver la fonction site web public check-in: 2d9f291194 user: bohwaz tags: dev | |
2018-08-06
| ||
13:42 | La gestion de la queue de mail sera externalisée, ce qui fait plus de sens pour les fermes à Garradin check-in: ac0720b762 user: bohwaz tags: dev | |
2018-08-04
| ||
00:42 | Ajout possibilité de remettre à zéro la base de données (réinstallation en fait) check-in: d489756c8e user: bohwaz tags: dev | |
Modified src/config.dist.php from [705b238773] to [90199df4e4].
︙ | ︙ | |||
234 235 236 237 238 239 240 | * STARTTLS = utilisation de STARTTLS (moyennement sécurisé) * * Défaut : STARTTLS */ const SMTP_SECURITY = 'STARTTLS'; /** | | | | < | < > > > | > > > > | | | 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 | * STARTTLS = utilisation de STARTTLS (moyennement sécurisé) * * Défaut : STARTTLS */ const SMTP_SECURITY = 'STARTTLS'; /** * Personnalisation de la méthode utilisée pour l'envoi d'emails * * Doit être un callback valide en PHP : string ou tableau * Les fonctions anonymes ne sont pas acceptées. * * Utile pour par exemple déléguer l'envoi d'email à une queue d'envoi * ou autre. * * Les arguments passé à la méthode seront : * @param string $recipient Adresse email du destinataire * @param string $subject Sujet du mail * @param string $content Contenu du mail * @param integer|null $id_membre ID unique du membre (ou null si le destinataire n'est pas un membre) * @param string|null $pgp_key Clé PGP du destinataire si le message doit être chiffré * * Défaut : ['Garradin\Utils', 'mail'] */ const SEND_EMAIL_CALLBACK = ['Garradin\Utils', 'mail']; /** * Activer les sauvegardes automatiques * * Utile à désactiver si vous avez déjà des sauvegardes effectuées * automatiquement au niveau du système. * |
︙ | ︙ |
Modified src/cron.php from [3bfc0d1c2d] to [0a002d599e].
︙ | ︙ | |||
16 17 18 19 20 21 22 | $rappels = new Rappels; if ($rappels->countAll()) { $rappels->sendPending(); } | < < | 16 17 18 19 20 21 22 23 24 | $rappels = new Rappels; if ($rappels->countAll()) { $rappels->sendPending(); } // Nettoyage du cache statique Static_Cache::clean(); |
Modified src/include/init.php from [da50a8b3c5] to [be38061631].
︙ | ︙ | |||
105 106 107 108 109 110 111 | 'SMTP_HOST' => false, 'SMTP_USER' => null, 'SMTP_PASSWORD' => null, 'SMTP_PORT' => 587, 'SMTP_SECURITY' => 'STARTTLS', 'ADMIN_URL' => WWW_URL . 'admin/', 'NTP_SERVER' => 'fr.pool.ntp.org', | | | 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | 'SMTP_HOST' => false, 'SMTP_USER' => null, 'SMTP_PASSWORD' => null, 'SMTP_PORT' => 587, 'SMTP_SECURITY' => 'STARTTLS', 'ADMIN_URL' => WWW_URL . 'admin/', 'NTP_SERVER' => 'fr.pool.ntp.org', 'SEND_EMAIL_CALLBACK' => ['Garradin\Utils', 'mail'], 'ENABLE_AUTOMATIC_BACKUPS' => true, ]; foreach ($default_config as $const => $value) { $const = sprintf('Garradin\\%s', $const); |
︙ | ︙ |
Deleted src/include/lib/Garradin/Email.php version [14773bb5c2].
|
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
Modified src/include/lib/Garradin/Membres.php from [d2c0429520] to [006b53db46].
︙ | ︙ | |||
497 498 499 500 501 502 503 | if ($champs->get('lettre_infos')) { $where .= ' AND lettre_infos = 1'; } } $db = DB::getInstance(); | | < < | | 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 | if ($champs->get('lettre_infos')) { $where .= ' AND lettre_infos = 1'; } } $db = DB::getInstance(); $res = $db->iterate('SELECT email, id FROM membres WHERE LENGTH(email) > 0 AND '.$where.' ORDER BY id;'); foreach ($res as $row) { Utils::sendEmail($row->email, $sujet, $message, $row->id); } return true; } public function searchSQL($query) { |
︙ | ︙ |
Modified src/include/lib/Garradin/Membres/Session.php from [3934882d0a] to [4c8faabf48].
1 2 3 4 5 6 7 8 9 | <?php namespace Garradin\Membres; use Garradin\Config; use Garradin\DB; use Garradin\Utils; use Garradin\Membres; use Garradin\UserException; | < | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php namespace Garradin\Membres; use Garradin\Config; use Garradin\DB; use Garradin\Utils; use Garradin\Membres; use Garradin\UserException; use const Garradin\SECRET_KEY; use const Garradin\WWW_URL; use const Garradin\ADMIN_URL; use KD2\Security; use KD2\Security_OTP; |
︙ | ︙ | |||
189 190 191 192 193 194 195 | $query = sprintf('%s.%s.%s', $id, $expire, $hash); $message = "Bonjour,\n\nVous avez oublié votre mot de passe ? Pas de panique !\n\n"; $message.= "Il vous suffit de cliquer sur le lien ci-dessous pour recevoir un nouveau mot de passe.\n\n"; $message.= ADMIN_URL . 'password.php?c=' . $query; $message.= "\n\nSi vous n'avez pas demandé à recevoir ce message, ignorez-le, votre mot de passe restera inchangé."; | | | 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 | $query = sprintf('%s.%s.%s', $id, $expire, $hash); $message = "Bonjour,\n\nVous avez oublié votre mot de passe ? Pas de panique !\n\n"; $message.= "Il vous suffit de cliquer sur le lien ci-dessous pour recevoir un nouveau mot de passe.\n\n"; $message.= ADMIN_URL . 'password.php?c=' . $query; $message.= "\n\nSi vous n'avez pas demandé à recevoir ce message, ignorez-le, votre mot de passe restera inchangé."; return Utils::sendEmail($membre->email, 'Mot de passe perdu ?', $message, $membre->id, $membre->clef_pgp); } static public function recoverPasswordConfirm($code) { if (substr_count($code, '.') !== 2) { return false; |
︙ | ︙ | |||
240 241 242 243 244 245 246 | $message.= "Votre nouveau mot de passe : ".$password."\n\n"; $message.= "Si vous n'avez pas demandé à recevoir ce message, merci de nous le signaler."; $password = Membres::hashPassword($password); $db->update('membres', ['passe' => $password], 'id = :id', ['id' => (int)$id]); | | | 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 | $message.= "Votre nouveau mot de passe : ".$password."\n\n"; $message.= "Si vous n'avez pas demandé à recevoir ce message, merci de nous le signaler."; $password = Membres::hashPassword($password); $db->update('membres', ['passe' => $password], 'id = :id', ['id' => (int)$id]); return Utils::sendEmail($membre->email, 'Nouveau mot de passe', $message, $membre->id, $membre->clef_pgp); } public function editUser($data) { (new Membres)->edit($this->user->id, $data, false); $this->refresh(); |
︙ | ︙ | |||
291 292 293 294 295 296 297 | $user = $this->getUser(); $content = "Ce message vous a été envoyé par :\n"; $content.= sprintf("%s\n%s\n\n", $user->identite, $user->email); $content.= str_repeat('=', 70) . "\n\n"; $content.= $message; | < < | | | 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 | $user = $this->getUser(); $content = "Ce message vous a été envoyé par :\n"; $content.= sprintf("%s\n%s\n\n", $user->identite, $user->email); $content.= str_repeat('=', 70) . "\n\n"; $content.= $message; if ($copie) { Utils::sendEmail($user->email, $sujet, $content, $user->id); } return Utils::sendEmail($dest, $sujet, $content); } public function editSecurity(Array $data = []) { $allowed_fields = ['passe', 'clef_pgp', 'secret_otp']; foreach ($data as $key=>$value) |
︙ | ︙ |
Modified src/include/lib/Garradin/Rappels_Envoyes.php from [9c988c2ebc] to [7f341d0949].
︙ | ︙ | |||
146 147 148 149 150 151 152 | $replace['nb_jours'] = abs($replace['nb_jours']); $replace['delai'] = abs($replace['delai']); $subject = $this->replaceTagsInContent($data->sujet, $replace); $text = $this->replaceTagsInContent($data->texte, $replace); // Envoi du mail | | | 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | $replace['nb_jours'] = abs($replace['nb_jours']); $replace['delai'] = abs($replace['delai']); $subject = $this->replaceTagsInContent($data->sujet, $replace); $text = $this->replaceTagsInContent($data->texte, $replace); // Envoi du mail Utils::sendEmail($data->email, $subject, $text, $data->id); // Enregistrement en DB $this->add([ 'id_cotisation' => $data->id_cotisation, 'id_membre' => $data->id, 'id_rappel' => $data->id_rappel, 'media' => Rappels_Envoyes::MEDIA_EMAIL, |
︙ | ︙ |
Modified src/include/lib/Garradin/Template.php from [f111533e27] to [8050b58d78].
︙ | ︙ | |||
49 50 51 52 53 54 55 | $this->register_function('html_champ_membre', [$this, 'formChampMembre']); $this->register_function('custom_colors', [$this, 'customColors']); $this->register_function('plugin_url', ['Garradin\Utils', 'plugin_url']); $this->register_function('diff', [$this, 'diff']); $this->register_function('pagination', [$this, 'pagination']); $this->register_function('format_droits', [$this, 'formatDroits']); | < | 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | $this->register_function('html_champ_membre', [$this, 'formChampMembre']); $this->register_function('custom_colors', [$this, 'customColors']); $this->register_function('plugin_url', ['Garradin\Utils', 'plugin_url']); $this->register_function('diff', [$this, 'diff']); $this->register_function('pagination', [$this, 'pagination']); $this->register_function('format_droits', [$this, 'formatDroits']); $this->register_function('csrf_field', function ($params) { return Form::tokenHTML($params['key']); }); $this->register_modifier('strlen', 'strlen'); $this->register_modifier('get_country_name', ['Garradin\Utils', 'getCountryName']); |
︙ | ︙ | |||
112 113 114 115 116 117 118 | return preg_replace_callback('!<a href="([^/.:@]+)">!i', function ($matches) use ($prefix) { return '<a href="' . $prefix . Wiki::transformTitleToURI($matches[1]) . '">'; }, $str); }); } | < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | return preg_replace_callback('!<a href="([^/.:@]+)">!i', function ($matches) use ($prefix) { return '<a href="' . $prefix . Wiki::transformTitleToURI($matches[1]) . '">'; }, $str); }); } protected function formErrors($params) { $form = $this->getTemplateVars('form'); if (!$form->hasErrors()) { return ''; |
︙ | ︙ |
Modified src/include/lib/Garradin/Utils.php from [c92830dc0e] to [f7ad314b8e].
︙ | ︙ | |||
649 650 651 652 653 654 655 | array_walk($row, function (&$field) { $field = strtr($field, ['"' => '""', "\r\n" => "\n"]); }); return sprintf("\"%s\"\r\n", implode('","', $row)); } | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 | array_walk($row, function (&$field) { $field = strtr($field, ['"' => '""', "\r\n" => "\n"]); }); return sprintf("\"%s\"\r\n", implode('","', $row)); } static public function sendEmail($recipient, $subject, $content, $id_membre = null, $pgp_key = null) { // Ne pas envoyer de mail à des adresses invalides if (!SMTP::checkEmailIsValid($recipient, false)) { throw new UserException('Adresse email invalide: ' . $recipient); } return call_user_func(SEND_EMAIL_CALLBACK, $recipient, $id_membre, $subject, $content, $pgp_key); } static public function mail($to, $subject, $content, $id_membre, $pgp_key) { $headers = []; $config = Config::getInstance(); $content = wordwrap($content); $content = trim($content); $content .= sprintf("\n\n-- \n%s\n%s\n\n", $config->get('nom_asso'), $config->get('site_asso')); $content .= "Vous recevez ce message car vous êtes inscrit comme membre de\nl'association.\n"; $content .= "Pour ne plus recevoir de message de notre part merci de nous contacter :\n" . $config->get('email_asso'); $content = preg_replace("#(?<!\r)\n#si", "\r\n", $content); if ($pgp_key) { $content = Security::encryptWithPublicKey($pgp_key, $content); } $subject = sprintf('[%s] %s', $config->get('nom_asso'), $subject); $headers['From'] = sprintf('"%s" <%s>', sprintf('=?UTF-8?B?%s?=', base64_encode($config->get('nom_asso'))), $config->get('email_asso')); $headers['Return-Path'] = $config->get('email_asso'); $headers['MIME-Version'] = '1.0'; $headers['Content-type'] = 'text/plain; charset=UTF-8'; $hash = sha1(uniqid() . var_export([$headers, $to, $subject, $content], true)); $headers['Message-ID'] = sprintf('%s@%s', $hash, isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : gethostname()); if (SMTP_HOST) { $const = '\KD2\SMTP::' . strtoupper(SMTP_SECURITY); if (!defined($const)) { throw new \LogicException('Configuration: SMTP_SECURITY n\'a pas une valeur reconnue. Valeurs acceptées: STARTTLS, TLS, SSL, NONE.'); } $secure = constant($const); $smtp = new SMTP(SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASSWORD, $secure); return $smtp->send($to, $subject, $content, $headers); } else { // Encodage du sujet $subject = sprintf('=?UTF-8?B?%s?=', base64_encode($subject)); $raw_headers = ''; // Sérialisation des entêtes foreach ($headers as $name=>$value) { $raw_headers .= sprintf("%s: %s\r\n", $name, $value); } return \mail($to, $subject, $content, $raw_headers); } } } |
Modified src/templates/admin/membres/fiche.tpl from [ee27111687] to [cbce2b6a23].
︙ | ︙ | |||
87 88 89 90 91 92 93 | <dd> {if $c_config.type == 'checkbox'} {if $membre->$c}Oui{else}Non{/if} {elseif empty($membre->$c)} <em>(Non renseigné)</em> {elseif $c == $c_config.champ_identite} <strong>{$membre->$c}</strong> | < < | > > > | 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | <dd> {if $c_config.type == 'checkbox'} {if $membre->$c}Oui{else}Non{/if} {elseif empty($membre->$c)} <em>(Non renseigné)</em> {elseif $c == $c_config.champ_identite} <strong>{$membre->$c}</strong> {elseif $c_config.type == 'email'} <a href="mailto:{$membre->$c|escape:'url'}">{$membre->$c}</a> {if $c == 'email'} | <a href="{$admin_url}membres/message.php?id={$membre.id}"><b class="icn action">✉</b> Envoyer un message</a> {/if} {elseif $c_config.type == 'tel'} <a href="tel:{$membre->$c}">{$membre->$c|format_tel}</a> {elseif $c_config.type == 'country'} {$membre->$c|get_country_name} {elseif $c_config.type == 'date' || $c_config.type == 'datetime'} {$membre->$c|format_sqlite_date_to_french} {elseif $c_config.type == 'password'} |
︙ | ︙ |
Modified src/templates/admin/membres/message.tpl from [6ceb73fe1d] to [3012105144].
1 2 3 4 5 6 7 8 9 10 | {include file="admin/_head.tpl" title="Contacter un membre" current="membres"} {form_errors} <form method="post" action="{$self_url}"> <fieldset class="memberMessage"> <legend>Message</legend> <dl> <dt>Expéditeur</dt> <dd>{$user.identite} <{$user.email}></dd> | < < < | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | {include file="admin/_head.tpl" title="Contacter un membre" current="membres"} {form_errors} <form method="post" action="{$self_url}"> <fieldset class="memberMessage"> <legend>Message</legend> <dl> <dt>Expéditeur</dt> <dd>{$user.identite} <{$user.email}></dd> <dt>Destinataire</dt> <dd>{$membre.identite} ({$categorie.nom})</dd> <dt><label for="f_sujet">Sujet</label> <b title="(Champ obligatoire)">obligatoire</b></dt> <dd><input type="text" name="sujet" id="f_sujet" value="{form_field name=sujet}" required="required" /></dd> <dt><label for="f_message">Message</label> <b title="(Champ obligatoire)">obligatoire</b></dt> <dd><textarea name="message" id="f_message" cols="72" rows="25" required="required">{form_field name=message}</textarea></dd> <dd> |
︙ | ︙ |
Deleted src/www/admin/email.php version [0a473d143d].
|
| < < < < < < < < < < < < < < < < < < |
Modified src/www/admin/static/admin.css from [b7ae410275] to [fad6836c1b].
︙ | ︙ | |||
185 186 187 188 189 190 191 | color: #090; } span.alert, b.alert { color: #990; } | < < < < | 185 186 187 188 189 190 191 192 193 194 195 196 197 198 | color: #090; } span.alert, b.alert { color: #990; } p.error, div.error { border: 1px solid #c00; background: #fcc; padding: 0.5em; margin-bottom: 1em; } |
︙ | ︙ |