function message_oubli($email, $param) { $r = formulaires_oubli_mail($email); if (is_array($r) AND $r[1]) { include_spip('inc/acces'); # pour creer_uniqid include_spip('inc/texte'); # pour corriger_typo $cookie = creer_uniqid(); sql_updateq("spip_auteurs", array("cookie_oubli" => $cookie), "id_auteur=" . $r[1]['id_auteur']); $nom = textebrut(corriger_typo($GLOBALS['meta']["nom_site"])); $envoyer_mail = charger_fonction('envoyer_mail','inc'); if ($envoyer_mail($email, ("[$nom] " . _T('pass_oubli_mot')), _T('pass_mail_passcookie', array('nom_site_spip' => $nom, 'adresse_site' => url_de_base(), 'sendcookie' => generer_url_public('spip_pass', "$param=$cookie", true)))) ) return _T('pass_recevoir_mail'); else return _T('pass_erreur_probleme_technique'); } return _T('pass_erreur_probleme_technique'); }
function formulaires_editer_profil_traiter_dist($id_auteur, $retour = '') { $res = array(); $res['nom'] = _request('nom'); $res['prenom'] = _request('prenom'); $res['activite'] = _request('activite'); $res['email'] = _request('email'); $pass = _request('new_pass'); $pass2 = _request('new_pass2'); if ($pass) { if ($pass == $pass2) { include_spip('inc/acces'); $htpass = generer_htpass($pass); $alea_actuel = creer_uniqid(); $alea_futur = creer_uniqid(); $new_pass = md5($alea_actuel . $pass); $res['pass'] = $new_pass; $res['htpass'] = $htpass; $res['alea_actuel'] = $alea_actuel; $res['alea_futur'] = $alea_futur; $res['low_sec'] = ''; } } if ($id_auteur = intval($id_auteur)) { sql_updateq('spip_auteurs', $res, "id_auteur={$id_auteur}"); $res['message_ok'] = _T('fraap_candidatures:form_profil_modifie'); } else { $res['message_erreur'] = _T('fraap_candidatures:form_probleme'); } return $res; }
function cache_signature(&$page) { if (!isset($GLOBALS['meta']['cache_signature'])) { include_spip('inc/acces'); include_spip('auth/sha256.inc'); ecrire_meta('cache_signature', _nano_sha256($_SERVER["DOCUMENT_ROOT"] . $_SERVER["SERVER_SIGNATURE"] . creer_uniqid()), 'non'); } return crc32($GLOBALS['meta']['cache_signature'] . $page['texte']); }
/** * Cree au besoin la copie locale d'un fichier distant * * * Prend en argument un chemin relatif au rep racine, ou une URL * Renvoie un chemin relatif au rep racine, ou false * * http://doc.spip.org/@copie_locale * * @param $source * @param string $mode * 'test' - ne faire que tester * 'auto' - charger au besoin * 'modif' - Si deja present, ne charger que si If-Modified-Since * 'force' - charger toujours (mettre a jour) * @param string $local * permet de specifier le nom du fichier local (stockage d'un cache par exemple, et non document IMG) * @return bool|string */ function copie_locale($source, $mode='auto') { // si c'est la protection de soi-meme, retourner le path if ($mode !== 'force' AND preg_match(_REGEXP_COPIE_LOCALE, $source, $local)) { $source = substr(_DIR_IMG,strlen(_DIR_RACINE)) . urldecode($local[1]); return @file_exists($source) ? $source : false; } $local = fichier_copie_locale($source); $localrac = _DIR_RACINE.$local; $t = ($mode=='force') ? false : @file_exists($localrac); // test d'existence du fichier if ($mode=='test') return $t ? $local : ''; // si $local = '' c'est un fichier refuse par fichier_copie_locale(), // par exemple un fichier qui ne figure pas dans nos documents ; // dans ce cas on n'essaie pas de le telecharger pour ensuite echouer if (!$local) return false; // sinon voir si on doit/peut le telecharger if ($local==$source OR !preg_match(',^\w+://,', $source)) return $local; if ($mode=='modif' OR !$t){ // passer par un fichier temporaire unique pour gerer les echecs en cours de recuperation // et des eventuelles recuperations concurantes include_spip("inc/acces"); $localractmp = "$localrac.".creer_uniqid().".tmp"; $res = recuperer_page($source, $localractmp, false, _COPIE_LOCALE_MAX_SIZE, '', '', false, $t ? filemtime($localrac) : ''); if ($res) { // si OK on supprime l'ancien fichier et on renomme spip_log("copie_locale : recuperation $source sur $localractmp taille $res OK, renommage en $localrac"); spip_unlink($localrac); @rename($localractmp, $localrac); } else { // sinon on supprime le fichier temporaire qui a echoue et qui est sans doute corrompu... spip_log("copie_locale : Echec recuperation $source sur $localractmp, fichier supprime",_LOG_INFO_IMPORTANTE); spip_unlink($localractmp); } if (!$res) return $t ? $local : false; // pour une eventuelle indexation pipeline('post_edition', array( 'args' => array( 'operation' => 'copie_locale', 'source' => $source, 'fichier' => $local ), 'data' => null ) ); } return $local; }
/** * Cree au besoin la copie locale d'un fichier distant * * * Prend en argument un chemin relatif au rep racine, ou une URL * Renvoie un chemin relatif au rep racine, ou false * * http://doc.spip.org/@copie_locale * * @param $source * @param string $mode * 'test' - ne faire que tester * 'auto' - charger au besoin * 'modif' - Si deja present, ne charger que si If-Modified-Since * 'force' - charger toujours (mettre a jour) * @param string $local * permet de specifier le nom du fichier local (stockage d'un cache par exemple, et non document IMG) * @return bool|string */ function copie_locale($source, $mode = 'auto', $local = null) { // si c'est la protection de soi-meme $reg = ',' . $GLOBALS['meta']['adresse_site'] . "/?spip.php[?]action=acceder_document.*file=(.*)\$,"; if (preg_match($reg, $source, $m)) { return substr(_DIR_IMG, strlen(_DIR_RACINE)) . urldecode($m[1]); } if (is_null($local)) { $local = fichier_copie_locale($source); } else { if (_DIR_RACINE and strncmp(_DIR_RACINE, $local, strlen(_DIR_RACINE)) == 0) { $local = substr($local, strlen(_DIR_RACINE)); } } $localrac = _DIR_RACINE . $local; $t = $mode == 'force' ? false : @file_exists($localrac); // test d'existence du fichier if ($mode == 'test') { return $t ? $local : ''; } // si $local = '' c'est un fichier refuse par fichier_copie_locale(), // par exemple un fichier qui ne figure pas dans nos documents ; // dans ce cas on n'essaie pas de le telecharger pour ensuite echouer if (!$local) { return false; } // sinon voir si on doit/peut le telecharger if ($local == $source or !preg_match(',^\\w+://,', $source)) { return $local; } if ($mode == 'modif' or !$t) { // passer par un fichier temporaire unique pour gerer les echecs en cours de recuperation // et des eventuelles recuperations concurantes include_spip("inc/acces"); $localractmp = "{$localrac}." . creer_uniqid() . ".tmp"; $res = recuperer_page($source, $localractmp, false, _COPIE_LOCALE_MAX_SIZE, '', '', false, $t ? filemtime($localrac) : ''); if ($res) { // si OK on supprime l'ancien fichier et on renomme spip_log("copie_locale : recuperation {$source} sur {$localractmp} taille {$res} OK, renommage en {$localrac}"); spip_unlink($localrac); @rename($localractmp, $localrac); } else { // sinon on supprime le fichier temporaire qui a echoue et qui est sans doute corrompu... spip_log("copie_locale : Echec recuperation {$source} sur {$localractmp}, fichier supprime", _LOG_INFO_IMPORTANTE); spip_unlink($localractmp); } if (!$res) { return $t ? $local : false; } // pour une eventuelle indexation pipeline('post_edition', array('args' => array('operation' => 'copie_locale', 'source' => $source, 'fichier' => $local), 'data' => null)); } return $local; }
function renouvelle_alea() { if (!isset($GLOBALS['meta']['alea_ephemere'])){ include_spip('base/abstract_sql'); $GLOBALS['meta']['alea_ephemere'] = sql_getfetsel('valeur', 'spip_meta', "nom='alea_ephemere'"); } ecrire_meta('alea_ephemere_ancien', @$GLOBALS['meta']['alea_ephemere'], 'non'); $GLOBALS['meta']['alea_ephemere'] = md5(creer_uniqid()); ecrire_meta('alea_ephemere', $GLOBALS['meta']['alea_ephemere'], 'non'); ecrire_meta('alea_ephemere_date', time(), 'non'); spip_log("renouvellement de l'alea_ephemere"); }
function formulaires_register_traiter_dist() { $login = _request('login'); $name = _request('name'); $password = _request('password'); $re_password = _request('re_password'); $email = _request('email'); include_spip('inc/acces'); include_spip('auth/sha256.inc'); $alea_actuel = creer_uniqid(); $alea_futur = creer_uniqid(); $pass = _nano_sha256($alea_actuel . $password); $sql = 'Insert into spip_auteurs (nom,email,login,pass,htpass,statut,alea_actuel,alea_futur)values("' . $name . '","' . $email . '","' . $login . '","' . $pass . '","' . generer_htpass($password) . '","6forum","' . $alea_actuel . '","' . $alea_futur . '")'; sql_query($sql); $id_user = mysql_insert_id(); ppr('Новый пользователь с номером : ' . $id_user); }
/** * Ecrire le status de migration * @param string $direction * @param bool|array $raz * @return array */ function ecrire_migration_status($direction, $raz = false){ if (!in_array($direction,array('depuis','vers'))) return false; $meta = 'migration_'.$direction.'_status'; $file = _DIR_TMP.$meta.".txt"; if ($raz===true) { spip_unlink($file); return false; } elseif(is_array($raz)){ $s = $raz; ecrire_fichier($file,serialize($s)); } elseif (!$s = lire_migration_status($direction)){ include_spip('inc/acces'); $s = array( 'status'=>'init', 'timestamp'=>time(), 'key'=> substr(md5(creer_uniqid()),0,8), ); ecrire_fichier($file,serialize($s)); } return $s; }
/** * Attribuer un jeton temporaire pour un auteur * en assurant l'unicite du jeton * @param int $id_auteur * @return string */ function auteur_attribuer_jeton($id_auteur) { include_spip('inc/acces'); // s'assurer de l'unicite du jeton pour le couple (email,cookie) do { $jeton = creer_uniqid(); sql_updateq("spip_auteurs", array("cookie_oubli" => $jeton), "id_auteur=" . intval($id_auteur)); } while (sql_countsel("spip_auteurs", "cookie_oubli=" . sql_quote($jeton)) > 1); return $jeton; }
function recuperer_body($f, $taille_max = _INC_DISTANT_MAX_SIZE, $fichier = '') { $taille = 0; $result = ''; $fp = false; if ($fichier) { include_spip("inc/acces"); $tmpfile = "{$fichier}." . creer_uniqid() . ".tmp"; $fp = spip_fopen_lock($tmpfile, 'w', LOCK_EX); if (!$fp and file_exists($fichier)) { return filesize($fichier); } if (!$fp) { return false; } $result = 0; // on renvoie la taille du fichier } while (!feof($f) and $taille < $taille_max) { $res = fread($f, 16384); $taille += strlen($res); if ($fp) { fwrite($fp, $res); $result = $taille; } else { $result .= $res; } } if ($fp) { spip_fclose_unlock($fp); spip_unlink($fichier); @rename($tmpfile, $fichier); if (!file_exists($fichier)) { return false; } } return $result; }
function exec_spiplistes_courrier_edit(){ include_spip('inc/barre'); include_spip('inc/documents'); include_spip('base/spiplistes_tables'); include_spip('inc/spiplistes_api'); include_spip('inc/spiplistes_api_presentation'); include_spip('inc/spiplistes_dater_envoi'); include_spip('inc/spiplistes_api_courrier'); include_spip('public/assembler'); include_spip('inc/spiplistes_naviguer_paniers'); global $connect_statut , $connect_toutes_rubriques , $connect_id_auteur , $spip_ecran , $compteur_block ; $eol = "\n"; $id_temp = false; $type = _request('type'); $id_courrier = intval(_request('id_courrier')); foreach(array('btn_courrier_apercu') as $key) { $$key = _request($key); } if($id_courrier > 0) { /////////////////////////// // Edition /modification d'un courrier $sql_select_array = array('titre','texte','message_texte','type','statut','id_auteur'); if($row = spiplistes_courriers_premier($id_courrier, $sql_select_array)) { foreach($sql_select_array as $key) { $$key = $row[$key]; } $titre = entites_html($titre); $texte = entites_html($texte); } else { $id_courrier = false; } } // n'existe pas encore ? // placer un marqueur pour les documents joints else { $id_temp = 0-intval(substr(creer_uniqid(),0,5)); } // l'edition du courrier est reservee aux super-admins // ou aux admin createur du courrier $flag_editable = (($connect_statut == "0minirezo") && ($connect_toutes_rubriques || ($connect_id_auteur == $id_auteur) || !$id_courrier)); if($flag_editable) { if(!$id_courrier) { // si pas de ID courrier, c'est une creation $statut = _SPIPLISTES_COURRIER_STATUT_REDAC; $type = _SPIPLISTES_COURRIER_TYPE_NEWSLETTER; $new = 'oui'; $titre = _T('spiplistes:Nouveau_courrier'); $clearonfocus = " onfocus=\"if(!antifocus){this.value='';antifocus=true;}\""; } else { $clearonfocus = ""; } $gros_bouton_retour = ($id_courrier) ? icone( _T('spiplistes:retour_link') , generer_url_ecrire(_SPIPLISTES_EXEC_COURRIER_GERER, "id_courrier=$id_courrier") , spiplistes_items_get_item('icon', $statut) , "rien.gif" , "" , false ) : "" ; $boite_documents = afficher_documents_colonne( ($id_courrier ? $id_courrier : $id_temp ) , 'courrier'); } //////////////////////////////////// // PAGE CONTENU //////////////////////////////////// $titre_page = _T('spiplistes:edition_du_courrier'); // Permet entre autres d'ajouter les classes a' la page : <body class='$rubrique $sous_rubrique'> $rubrique = _SPIPLISTES_PREFIX; $sous_rubrique = "courrier_edit"; $commencer_page = charger_fonction('commencer_page', 'inc'); echo($commencer_page(_T('spiplistes:spiplistes') . " - " . $titre_page, $rubrique, $sous_rubrique)); if(!$flag_editable) { die (spiplistes_terminer_page_non_autorisee() . fin_page()); } $page_result = "" . "<br /><br /><br />\n" . spiplistes_gros_titre($titre_page, '', true) . barre_onglets($rubrique, $sous_rubrique) . debut_gauche($rubrique, true) . spiplistes_boite_info_id(_T('spiplistes:Courrier_numero_'), $id_courrier, true) . spiplistes_naviguer_paniers_courriers(_T('spiplistes:aller_au_panier_'), true) . $boite_documents . pipeline('affiche_gauche', array('args'=>array('exec'=>$sous_rubrique),'data'=>'')) //. creer_colonne_droite($rubrique, true) // spiplistes_boite_raccourcis() s'en occupe . spiplistes_boite_raccourcis(true) //. spiplistes_boite_autocron() // ne pas gener l'edition . pipeline('affiche_droite', array('args'=>array('exec'=>$sous_rubrique),'data'=>'')) . debut_droite($rubrique, true) ; $page_result .= "" // le bloc pour apercu (retour ajax) . "<div id='apercu-courrier' style='clear:both;tex-align:center'></div>\n" // . debut_cadre_formulaire('', true) . "<a name='haut-block' id='haut-block'></a>\n" // // // bloc titre . "\n<table cellpadding='0' cellspacing='0' border='0' width='100%'>\n" . "<tr width='100%'>" . "<td>" . $gros_bouton_retour . "</td>" . "<td><img src='"._DIR_IMG_PACK."/rien.gif' width='10'></td>\n" . "<td width='100%'>" . ($id_courrier ? _T('spiplistes:Modifier_un_courrier__') : _T('spiplistes:Creer_un_courrier_') )."<br />\n" . spiplistes_gros_titre($titre, '', true) . "</td>\n" . "</tr></table>\n" . "<hr />\n" ; // // debut formulaire $page_result .= "" . "<form action='".generer_url_ecrire(_SPIPLISTES_EXEC_COURRIER_GERER , ($id_courrier ? "id_courrier=$id_courrier" : "") ) ."' method='post' name='formulaire_courrier_edit' id='formulaire_courrier_edit'>\n" . "<input type='hidden' name='modifier_message' value=\"oui\" />\n" . "<input type='hidden' name='id_courrier' value='$id_courrier' />\n" // // bloc sujet du courrier . "<label for='sujet_courrier'>"._T('spiplistes:sujet_courrier').":</label>\n" . "<input id='sujet_courrier' type='text' class='formo' name='titre' value=\"$titre\" size='40' $clearonfocus />\n" . "<p style='margin-bottom:1.75em;'>"._T('spiplistes:Courrier_edit_desc')."</p>\n" ; $titre_block_depliable = _T('spiplistes:Generer_le_contenu'); $page_result .= '' // // generer le contenu // Reprise du Formulaire adapte de abomailman () // MaZiaR - NetAktiv // tech@netaktiv.com . debut_cadre_relief(_DIR_PLUGIN_SPIPLISTES_IMG_PACK.'stock_insert-slide.gif', true) //. bouton_block_invisible(md5(_T('spiplistes:charger_patron'))) . spiplistes_bouton_block_depliable($titre_block_depliable, false, md5(_T('spiplistes:charger_patron'))) . "<span class='verdana2 triangle_label' onclick=\"javascript:$('#triangle".$compteur_block."').click();\">" . (spiplistes_spip_est_inferieur_193() ? $titre_block_depliable : "") . "</span>\n" . spiplistes_debut_block_invisible(md5(_T('spiplistes:charger_patron'))) // . '<div id="ajax-loader" align="right">' . '<script type="text/javascript">'.$eol . 'document.write(\'<img src="' . _DIR_PLUGIN_SPIPLISTES_IMG_PACK . 'ajax_indicator.gif" alt="" />\');' . '</script>'.$eol . '<noscript>'.$eol . spiplistes_boite_alerte (_T('spiplistes:javascript_inactif'), true) . $eol . '</noscript>'.$eol //. '<img src="' . _DIR_PLUGIN_SPIPLISTES_IMG_PACK . 'ajax_indicator.gif" alt="" />' . '</div>'.$eol ; if(strpos($GLOBALS['meta']['langues_multilingue'], ",") !== false) { $page_result .= "" // selecteur de langues . "<div class='boite-generer-option'>\n" . "<label class='verdana2'>"._T('spiplistes:Langue_du_courrier_') . "<select name='lang' class='fondo'>\n" . liste_options_langues('changer_lang') . "</select></label>\n" . "</div>\n" ; } $page_result .= "" // Prendre en compte a partir de quelle date ? . spiplistes_dater_envoi( 'courrier', $id_courrier, $statut , $flag_editable , _T('spiplistes:Contenu_a_partir_de_date_') , normaliser_date(time()), 'btn_changer_date' , false ) ; $page_result .= "" // texte introduction a placer avant le patron et sommaire . '<div class="boite-generer-option">'.$eol . '<label class="verdana2">' . '<input type="checkbox" id="avec_intro" name="avec_intro" value="non" />' . _T('spiplistes:avec_introduction') . '</label>'.$eol . '<div id="choisir_intro" class="option">'.$eol . '<label class="verdana2" style="display:block;" for="message_intro">' . _T('spiplistes:introduction_du_courrier_').':</label>'.$eol . afficher_barre('document.formulaire_courrier_edit.message_intro') . '<textarea id="message_intro" name="message_intro" '.$GLOBALS['browser_caret'].' rows="5" cols="40" wrap="soft" style="width:100%">'.$eol . '</textarea>' . '</div>'.$eol . '</div>'.$eol ; // selection du patron $page_result .= '' . "<div class='boite-generer-option'>\n" . "<label class='verdana2'>" . "<input type='checkbox' id='avec_patron' name='avec_patron' value='non' />" . _T('spiplistes:a_partir_de_patron') . "</label>\n" . "<div id='choisir_patron' class='option'>" . "<label class='verdana2'>" . _T('spiplistes:choisir_un_patron_').":</label>\n" . spiplistes_boite_selection_patrons ("", true, _SPIPLISTES_PATRONS_DIR, "patron", 1) . "<div id='patron_pos' style='display:none'>\n" . "<span class='verdana2'>" . _T('spiplistes:generer_patron_'). "</span>\n" . spiplistes_form_input_radio ('patron_pos', 'avant', _T('spiplistes:generer_patron_avant'), true, true, false) . spiplistes_form_input_radio ('patron_pos', 'apres', _T('spiplistes:generer_patron_apres'), false, true, false) . "</div>\n" . "</div>\n" . "</div>\n" ; // Generer un sommaire $page_result .= "" . "<div class='boite-generer-option'>\n" . "<label class='verdana2'>" . "<input type='checkbox' id='avec_sommaire' name='avec_sommaire' value='non' />" . _T('spiplistes:generer_un_sommaire') . "</label>\n" . "<div id='choisir_sommaire' class='option'>"; $page_result .= "" // // selecteur de rubriques . "<label class='verdana2' for='ajouter_rubrique'>"._T('spiplistes:Lister_articles_de_rubrique').":</label>\n" . "<select name='id_rubrique' id='ajouter_rubrique' class='formo'>\n" . "<option value=''></option>\n" . spiplistes_arbo_rubriques() . "</select>\n" . "<br />\n" // // selecteur des mots-cles . "<label class='verdana2' for='ajouter_motcle'>"._T('spiplistes:Lister_articles_mot_cle').":</label>\n" . "<select name='id_mot' id='ajouter_motcle' class='formo'>\n" . "<option value=''></option>\n" ; if (version_compare($GLOBALS['spip_version_code'], '1.9300', '<')){ $rqt_gmc = sql_select (array('id_groupe','titre'), 'spip_groupes_mots', "articles=".sql_quote('oui')); }else{ $rqt_gmc = sql_select (array('id_groupe','titre'), 'spip_groupes_mots', "tables_liees LIKE '%articles%'"); } while ($row = sql_fetch($rqt_gmc)) { $id_groupe = intval($row['id_groupe']); $titre = $row['titre']; $page_result .= "<option value='' disabled='disabled'>". supprimer_numero (typo($titre)) . "</option>\n"; $rqt_mc = sql_select (array('id_mot','titre'), 'spip_mots', "id_groupe=".sql_quote($id_groupe)); while ($row = sql_fetch($rqt_mc)) { $id_mot = intval($row['id_mot']); $titre = supprimer_numero (typo($row['titre'])); $page_result .= "<option value='$id_mot'>-- $titre</option>\n"; } } $page_result .= "" . "</select><br />\n" // // a partir de la date selectionnee plus haut . spiplistes_form_input_item ('checkbox', 'date_sommaire', 'oui' , _T('spiplistes:sommaire_date_debut'), $sommaire_date == 'oui', true, false) . "</div>\n" . "</div>\n" ; // fin generer le sommaire // choisir son patron de pied $page_result .= "" . "<div class='boite-generer-option'>\n" . "<label class='verdana2'>" . _T('spiplistes:avec_patron_pied__') . spiplistes_boite_selection_patrons (_SPIPLISTES_PATRONS_PIED_DEFAUT, true, _SPIPLISTES_PATRONS_PIED_DIR, "pied_patron", 1) . "</label>\n" . "</div>\n" ; $page_result .= "" . "<p class='verdana2'>\n" . _T('spiplistes:Cliquez_Generer_desc' , array('titre_bouton'=>_T('spiplistes:generer_Apercu'), 'titre_champ_texte'=>_T('spiplistes:texte_courrier')) ) . "</p>\n" . "<p class='verdana2'>\n" ._T('spiplistes:calcul_patron_attention') . "</p>\n" . spiplistes_form_bouton_valider ('Valider', _T('spiplistes:generer_Apercu')) . fin_block() // fin_block_invisible . fin_cadre_relief(true) . "<br />\n" ; // // bloc du courrier (titre, texte), toujours visible $page_result .= '' . '<label for="texte_courrier">'._T('spiplistes:texte_courrier').'</label>' . afficher_barre('document.formulaire_courrier_edit.message') . '<textarea id="texte_courrier" name="message" '.$GLOBALS['browser_caret'].' class="porte_plume_partout barre_inserer formo" rows="20" cols="40" wrap=soft>'.$eol . $texte . '</textarea>'.$eol . (!$id_courrier ? '<input type="hidden" name="new" value="oui" />'.$eol : '') // . '<p style="text-align:right;">'.$eol . '<input type="submit" onclick="this.value=\'oui\';" id="btn_courrier_edit" ' . ' name="btn_courrier_valider" value="'._T('bouton_valider').'" class="fondo" /></p>'.$eol // le marqueur pour les documents joints . (($id_temp!==false) ? '<input type="hidden" name="id_temp" value="' . $id_temp . '" />'.$eol : '') // // fin formulaire . '</form>'.$eol . fin_cadre_formulaire(true) ; echo($page_result); // COURRIER EDIT FIN --------------------------------------------------------------- echo pipeline('affiche_milieu',array('args'=>array('exec'=>$sous_rubrique),'data'=>'')) , spiplistes_html_signature(_SPIPLISTES_PREFIX) , fin_gauche(), fin_page(); }
/** * Modifier le mot de passe de l'auteur sur le serveur concerne * en s'occupant du hash et companie * @param string $login * @param string $new_pass * @param int $id_auteur * @param string $serveur * @return bool */ function auth_spip_modifier_pass($login, $new_pass, $id_auteur, $serveur = '') { if (is_null($new_pass) or auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') { return false; } if (!($id_auteur = intval($id_auteur)) or !sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur)) { return false; } $c = array(); include_spip('inc/acces'); include_spip('auth/sha256.inc'); $htpass = generer_htpass($new_pass); $alea_actuel = creer_uniqid(); $alea_futur = creer_uniqid(); $pass = _nano_sha256($alea_actuel . $new_pass); $c['pass'] = $pass; $c['htpass'] = $htpass; $c['alea_actuel'] = $alea_actuel; $c['alea_futur'] = $alea_futur; $c['low_sec'] = ''; include_spip('action/editer_auteur'); auteur_modifier($id_auteur, $c, true); // manque la gestion de $serveur return true; // on a bien modifie le pass }
function install_etape_3b_dist() { $login = _request('login'); $email = _request('email'); $nom = _request('nom'); $pass = _request('pass'); $pass_verif = _request('pass_verif'); $server_db = defined('_INSTALL_SERVER_DB') ? _INSTALL_SERVER_DB : _request('server_db'); if (!defined('_PASS_LONGUEUR_MINI')) { define('_PASS_LONGUEUR_MINI', 6); } if (!defined('_LOGIN_TROP_COURT')) { define('_LOGIN_TROP_COURT', 4); } if ($login) { $echec = $pass != $pass_verif ? _T('info_passes_identiques') : (strlen($pass) < _PASS_LONGUEUR_MINI ? _T('info_passe_trop_court_car_pluriel', array('nb' => _PASS_LONGUEUR_MINI)) : (strlen($login) < _LOGIN_TROP_COURT ? _T('info_login_trop_court') : '')); include_spip('inc/filtres'); if (!$echec and $email and !email_valide($email)) { $echec = _T('form_email_non_valide'); } if ($echec) { echo minipres('AUTO', info_progression_etape(3, 'etape_', 'install/', true) . "<div class='error'><h3>{$echec}</h3>\n" . "<p>" . _T('avis_connexion_echec_2') . "</p>" . "</div>"); exit; } } if (@file_exists(_FILE_CHMOD_TMP)) { include _FILE_CHMOD_TMP; } else { redirige_url_ecrire('install'); } if (!@file_exists(_FILE_CONNECT_TMP)) { redirige_url_ecrire('install'); } # maintenant on connait le vrai charset du site s'il est deja configure # sinon par defaut lire_meta reglera _DEFAULT_CHARSET # (les donnees arrivent de toute facon postees en _DEFAULT_CHARSET) lire_metas(); if ($login) { include_spip('inc/charsets'); $nom = importer_charset($nom, _DEFAULT_CHARSET); $login = importer_charset($login, _DEFAULT_CHARSET); $email = importer_charset($email, _DEFAULT_CHARSET); # pour le passwd, bizarrement il faut le convertir comme s'il avait # ete tape en iso-8859-1 ; car c'est en fait ce que voit md5.js $pass = unicode2charset(utf_8_to_unicode($pass), 'iso-8859-1'); include_spip('auth/sha256.inc'); include_spip('inc/acces'); $htpass = generer_htpass($pass); $alea_actuel = creer_uniqid(); $alea_futur = creer_uniqid(); $shapass = _nano_sha256($alea_actuel . $pass); // prelablement, creer le champ webmestre si il n'existe pas (install neuve // sur une vieille base $t = sql_showtable("spip_auteurs", true); if (!isset($t['field']['webmestre'])) { @sql_alter("TABLE spip_auteurs ADD webmestre varchar(3) DEFAULT 'non' NOT NULL"); } $id_auteur = sql_getfetsel("id_auteur", "spip_auteurs", "login="******"nom" => $nom, 'email' => $email, 'login' => $login, 'pass' => $shapass, 'alea_actuel' => $alea_actuel, 'alea_futur' => $alea_futur, 'htpass' => $htpass, 'statut' => '0minirezo'), "id_auteur={$id_auteur}"); } else { $id_auteur = sql_insertq('spip_auteurs', array('nom' => $nom, 'email' => $email, 'login' => $login, 'pass' => $shapass, 'htpass' => $htpass, 'alea_actuel' => $alea_actuel, 'alea_futur' => $alea_futur, 'statut' => '0minirezo')); } // le passer webmestre separrement du reste, au cas ou l'alter n'aurait pas fonctionne @sql_updateq('spip_auteurs', array('webmestre' => 'oui'), "id_auteur={$id_auteur}"); // inserer email comme email webmaster principal // (sauf s'il est vide: cas de la re-installation) if ($email) { ecrire_meta('email_webmaster', $email); } // Connecter directement celui qui vient de (re)donner son login // mais sans cookie d'admin ni connexion longue include_spip('inc/auth'); if (!($auteur = auth_identifier_login($login, $pass)) or !auth_loger($auteur, true)) { spip_log("login automatique impossible {$auth_spip} {$session}" . count($row)); } } // installer les metas $config = charger_fonction('config', 'inc'); $config(); // activer les plugins // leur installation ne peut pas se faire sur le meme hit, il faudra donc // poursuivre au hit suivant include_spip('inc/plugin'); actualise_plugins_actifs(); include_spip('inc/distant'); redirige_par_entete(parametre_url(self(), 'etape', '4', '&')); }
function protege_js_modeles($t) { if (isset($GLOBALS['visiteur_session'])) { if (preg_match_all(',<script.*?($|</script.),isS', $t, $r, PREG_SET_ORDER)) { if (!defined('_PROTEGE_JS_MODELES')) { include_spip('inc/acces'); define('_PROTEGE_JS_MODELES', creer_uniqid()); } foreach ($r as $regs) { $t = str_replace($regs[0], code_echappement($regs[0], 'javascript' . _PROTEGE_JS_MODELES), $t); } } if (preg_match_all(',<\\?php.*?($|\\?' . '>),isS', $t, $r, PREG_SET_ORDER)) { if (!defined('_PROTEGE_PHP_MODELES')) { include_spip('inc/acces'); define('_PROTEGE_PHP_MODELES', creer_uniqid()); } foreach ($r as $regs) { $t = str_replace($regs[0], code_echappement($regs[0], 'php' . _PROTEGE_PHP_MODELES), $t); } } } return $t; }
function auth_spip_modifier_pass($login, $new_pass, $id_auteur, $serveur=''){ if (is_null($new_pass) OR auth_spip_verifier_pass($login, $new_pass,$id_auteur,$serveur)!='') return false; if (!$id_auteur = intval($id_auteur) OR !$auteur = sql_fetsel('login','spip_auteurs','id_auteur='.intval($id_auteur),'','','','',$serveur)) return false; $c = array(); include_spip('inc/acces'); include_spip('auth/sha256.inc'); $htpass = generer_htpass($new_pass); $alea_actuel = creer_uniqid(); $alea_futur = creer_uniqid(); $pass = _nano_sha256($alea_actuel.$new_pass); $c['pass'] = $pass; $c['htpass'] = $htpass; $c['alea_actuel'] = $alea_actuel; $c['alea_futur'] = $alea_futur; $c['low_sec'] = ''; include_spip('inc/modifier'); revision_auteur($id_auteur, $c); // manque la gestion de $serveur }
/** * Renvoyer le secret du site, et le generer si il n'existe pas encore * Le secret du site doit rester aussi secret que possible, et est eternel * On ne doit pas l'exporter * * http://doc.spip.org/@secret_du_site * * @return string */ function secret_du_site() { if (!isset($GLOBALS['meta']['secret_du_site'])) { include_spip('base/abstract_sql'); $GLOBALS['meta']['secret_du_site'] = sql_getfetsel('valeur', 'spip_meta', "nom='secret_du_site'"); } if (!isset($GLOBALS['meta']['secret_du_site']) or strlen($GLOBALS['meta']['secret_du_site']) < 64) { include_spip('inc/acces'); include_spip('auth/sha256.inc'); ecrire_meta('secret_du_site', _nano_sha256($_SERVER["DOCUMENT_ROOT"] . $_SERVER["SERVER_SIGNATURE"] . creer_uniqid()), 'non'); lire_metas(); // au cas ou ecrire_meta() ne fonctionne pas } return $GLOBALS['meta']['secret_du_site']; }
/** * Écrit un fichier de manière un peu sûre * * Cette écriture s’exécute de façon sécurisée en posant un verrou sur * le fichier avant sa modification. Les fichiers .gz sont compressés. * * @uses raler_fichier() Si le fichier n'a pu peut être écrit * @see lire_fichier() * @see supprimer_fichier() * * @param string $fichier * Chemin du fichier * @param string $contenu * Contenu à écrire * @param bool $ignorer_echec * - true pour ne pas raler en cas d'erreur * - false affichera un message si on est webmestre * @param bool $truncate * Écriture avec troncation ? * @return bool * - true si l’écriture s’est déroulée sans problème. **/ function ecrire_fichier($fichier, $contenu, $ignorer_echec = false, $truncate = true) { #spip_timer('ecrire_fichier'); // verrouiller le fichier destination if ($fp = spip_fopen_lock($fichier, 'a', LOCK_EX)) { // ecrire les donnees, compressees le cas echeant // (on ouvre un nouveau pointeur sur le fichier, ce qui a l'avantage // de le recreer si le locker qui nous precede l'avait supprime...) if (substr($fichier, -3) == '.gz') { $contenu = gzencode($contenu); } // si c'est une ecriture avec troncation , on fait plutot une ecriture complete a cote suivie unlink+rename // pour etre sur d'avoir une operation atomique // y compris en NFS : http://www.ietf.org/rfc/rfc1094.txt // sauf sous wintruc ou ca ne marche pas $ok = false; if ($truncate and _OS_SERVEUR != 'windows') { if (!function_exists('creer_uniqid')) { include_spip('inc/acces'); } $id = creer_uniqid(); // on ouvre un pointeur sur un fichier temporaire en ecriture +raz if ($fp2 = spip_fopen_lock("{$fichier}.{$id}", 'w', LOCK_EX)) { $s = @fputs($fp2, $contenu, $a = strlen($contenu)); $ok = $s == $a; spip_fclose_unlock($fp2); spip_fclose_unlock($fp); // unlink direct et pas spip_unlink car on avait deja le verrou // a priori pas besoin car rename ecrase la cible // @unlink($fichier); // le rename aussitot, atomique quand on est pas sous windows // au pire on arrive en second en cas de concourance, et le rename echoue // --> on a la version de l'autre process qui doit etre identique @rename("{$fichier}.{$id}", $fichier); // precaution en cas d'echec du rename if (!_TEST_FILE_EXISTS or @file_exists("{$fichier}.{$id}")) { @unlink("{$fichier}.{$id}"); } if ($ok) { $ok = file_exists($fichier); } } else { spip_fclose_unlock($fp); } } // sinon ou si methode precedente a echoueee // on se rabat sur la methode ancienne if (!$ok) { // ici on est en ajout ou sous windows, cas desespere if ($truncate) { @ftruncate($fp, 0); } $s = @fputs($fp, $contenu, $a = strlen($contenu)); $ok = $s == $a; spip_fclose_unlock($fp); } // liberer le verrou et fermer le fichier @chmod($fichier, _SPIP_CHMOD & 0666); if ($ok) { if (strpos($fichier, ".php") !== false) { spip_clear_opcode_cache(realpath($fichier)); } return $ok; } } if (!$ignorer_echec) { include_spip('inc/autoriser'); if (autoriser('chargerftp')) { raler_fichier($fichier); } spip_unlink($fichier); } spip_log("Ecriture fichier {$fichier} impossible", _LOG_INFO_IMPORTANTE); return false; }
/** * Synchroniser les utilisateurs Galette vers Spip. * * @param boolean $forcer Forcer la synchronisation. * @return int Retourne en cas de réussite le nombre de fiches mis à jour ; * _ 0 lorsqu'une erreur inconnue est survenue ; * _ -1 si la synchronisation a échouée ; * _ -2 lorsque des erreurs sont survenues lors de la connexion à la BDD ; * _ -10 si la synchronisation est inutile. **/ function galettonuts_synchroniser($forcer = false) { // Lecture de la configuration if (!class_exists('L2_Spip_Plugin_Metas')) { include_spip('lib/L2/Spip/Plugin/Metas.class'); } $config = new L2_Spip_Plugin_Metas('galettonuts_config'); // Connexion à la base Galette $link = galettonuts_galette_db($config->lire('adresse_db'), $config->lire('login_db'), $config->lire('pass_db'), $config->lire('choix_db')); if (!$link) { spip_log('cron: Galettonuts, echec de connexion a la bdd de galette'); return -2; } $synchro = new L2_Spip_Plugin_Metas('galettonuts_synchro'); // La synchronisation est inutile. if (!$forcer && !is_null($synchro->lire('maj')) && galettonuts_a_jour($synchro->lire('maj'), $config->lire('prefix_db'), $link)) { return -10; } else { // Compteur d'utilisateurs traités $compteur = 0; // Tableau associatif zones/auteurs $ids = array(); $maintenant = time(); // Récupération des adhérents Galette $req = "SELECT `id_adh` AS `id`, `nom_adh` AS `nom`, `prenom_adh` AS `prenom`, `activite_adh` AS `actif`, " . "`login_adh` AS `login`, `mdp_adh` AS `pass`, `email_adh` AS `email` " . "FROM `" . $config->lire('prefix_db') . "adherents` WHERE 1;"; $res = @mysql_query($req, $link); // Pour chaque adhérent de galette while ($adh = @mysql_fetch_assoc($res)) { include_spip('inc/acces'); include_spip('inc/charsets'); // Formatage des informations de l'auteur à destination de Spip $login = unicode2charset(charset2unicode($adh['login'], 'iso-8859-15', 'forcer')); $email = unicode2charset(charset2unicode($adh['email'], 'iso-8859-15', 'forcer')); $nom = unicode2charset(charset2unicode(ucfirst($adh['prenom']) . ' ' . ucfirst($adh['nom']), 'iso-8859-15', 'forcer')); $alea_actuel = creer_uniqid(); $alea_futur = creer_uniqid(); $pass = $adh['pass']; $htpass = generer_htpass($pass); $mdpass = md5($alea_actuel . $pass); // Récupération de l'identifiant de l'auteur Spip, s'il existe $res2 = spip_query("SELECT `id_auteur` FROM `spip_galettonuts` WHERE `id_adh` = '{$adh['id']}';"); if (spip_mysql_count($res2)) { $id_auteur = (int) @mysql_result($res2, 0); } else { $id_auteur = null; } // Mise à jour de l'auteur Spip if ($id_auteur) { $req = "UPDATE `spip_auteurs` SET " . "`nom` = " . _q($nom) . ", `email` = " . _q($email) . ", `login` = " . _q($login) . ", `pass` = " . _q($mdpass) . ", `htpass` = " . _q($htpass) . ", `alea_actuel` = " . _q($alea_actuel) . ", `alea_futur` = " . _q($alea_futur); if (1 != $adh['actif']) { $req .= ", `statut` = " . _q('5poubelle'); } $req .= ", `maj` = NOW()" . " WHERE `id_auteur` = " . _q($id_auteur); spip_query($req); } else { $statut = 1 == $adh['actif'] ? '6forum' : '5poubelle'; $req = "INSERT INTO `spip_auteurs` (`nom`, `email`, `login`, `pass`, `htpass`, `alea_actuel`, `alea_futur`, `statut`) " . "VALUES (" . _q($nom) . ', ' . _q($email) . ', ' . _q($login) . ', ' . _q($mdpass) . ', ' . _q($htpass) . ', ' . _q($alea_actuel) . ', ' . _q($alea_futur) . ', ' . _q($statut) . ");"; spip_query($req); unset($req); // Puisque la colonne id_auteur de la table spip_auteurs est // de type BIGINT, on ne peut utiliser mysql_insert_id() de PHP. $id_auteur = @mysql_result(spip_query("SELECT LAST_INSERT_ID();"), 0); $req = "INSERT INTO `spip_galettonuts` (`id_auteur`, `id_adh`) VALUES (" . _q($id_auteur) . ', ' . _q($adh['id']) . ');'; spip_query($req); } spip_free_result($res2); // Hop, un utilisateur de synchronisé en plus ++$compteur; // Dans le cas où le plugin Accès Restreint est présent, on stocke // les identifiants des auteurs fraichement synchronisés associés // à une/des zone(s) définie lors de la configuration de Galettonuts if ($zones = $config->lire('zones')) { $ids[$id_auteur] = $zones; unset($zones); } } // while // La synchronisation est complète, on le sauvegarde $synchro->ajouter(array('maj' => $maintenant), true); // Association de zones aux auteurs synchronisés if (0 < count($ids)) { galettonuts_associer_zones($ids); } return $compteur; } }
function spiplistes_formulaire_abonnement ( $type , $acces_membres , $formulaire , $nom_site_spip , $inscription_redacteur , $inscription_visiteur ) { $mail_inscription_ = trim(strtolower(_request('mail_inscription_'))); $nom_inscription_ = trim(_request('nom_inscription_')); $type_abo = _request('suppl_abo') ; $listes_demande = _request('list'); $desabo = ($type_abo == 'non') ? 'oui' : 'non'; $adresse_site = $GLOBALS['meta']['adresse_site']; $reponse_formulaire = ''; $email_a_envoyer = $mode_modifier = $sql_where = false; $abonne = array(); // traiter d'abord si retour de mail lien cookie $d = _request('d'); if(!empty($d)) { $sql_where = array( 'cookie_oubli='.sql_quote($d) , 'statut<>'.sql_quote('5poubelle') , 'pass<>'.sql_quote('') ); } // ou si identifie' else if($connect_id_auteur = intval($GLOBALS['auteur_session']['id_auteur'])) { $sql_where = array("id_auteur=$connect_id_auteur"); } if($sql_where) { // cherche les coordonnees de l'abonne' $sql_select = 'id_auteur,statut,nom,email,cookie_oubli'; $sql_result = sql_select( $sql_select , 'spip_auteurs' , $sql_where , '', '', 1 ); if($row = sql_fetch($sql_result)) { foreach(explode(',', $sql_select) as $key) { $abonne[$key] = $row[$key]; } } $abonne['format'] = spiplistes_format_abo_demande($abonne['id_auteur']); } // si identifie' par cookie ou login... effectuer les modifications demandees if(count($abonne)) { // toujours rester en mode modif pour permettre la correction $mode_modifier = 'oui'; if($desabo == 'oui') { spiplistes_format_abo_modifier($abonne['id_auteur']); $reponse_formulaire = _T('spiplistes:vous_etes_desabonne'); $email_a_envoyer = true; } else if($listes_demande) { //spiplistes_debug_log("demande modification abonnements listes " . implode(",", $listes_demande)); if(is_array($listes_demande) && count($listes_demande)) { $listes_ajoutees = spiplistes_abonnements_ajouter($abonne['id_auteur'] , array_map('intval', $listes_demande) ); $curr_abos_auteur = spiplistes_abonnements_listes_auteur($abonne['id_auteur']); foreach($curr_abos_auteur as $id_liste) { if(!in_array($id_liste, $listes_demande)) { spiplistes_abonnements_auteur_desabonner($abonne['id_auteur'] , $id_liste ); } } } // modifier le format de reception ? if(spiplistes_format_valide($type_abo) && ($type_abo != $abonne['format'])) { spiplistes_format_abo_modifier($abonne['id_auteur'], $abonne['format'] = $type_abo); //$abonne['ids_abos'] = spiplistes_abonnements_listes_auteur($abonne['id_auteur']); } $reponse_formulaire = _T('spiplistes:demande_enregistree_retour_mail'); $email_a_envoyer = true; } else { //spiplistes_debug_log('pas de demande, afficher formulaire de modif au complet'); $reponse_formulaire = '' . '<span class="nom">' . $abonne['nom'] . "</span>\n" . '<span class="souhait">' . _T('spiplistes:effectuez_modif_validez', array('s'=>$abonne['nom'])). "</span>\n" ; } $id_abonne = $abonne['id_auteur']; $objet_email = _T('spiplistes:votre_abo_listes'); $contexte = array('titre' => $objet_email); } else // non identifie' ? gestion par cookie_oubli. { $texte_intro = _T('form_forum_message_auto') . '<br /><br />'._T('spiplistes:bonjour') . "<br />\n"; $abonne = array('email' => email_valide($mail_inscription_)); if($abonne['email']) { // si l'abonne existe deja mais pas d'action demandee, // affiche formulaire complet //if($row = sql_fetch( if ($row = spiplistes_auteurs_auteur_select ('id_auteur,login,nom,statut,lang', 'email='.sql_quote($abonne['email'])) ) { $abonne['id_auteur'] = intval($row['id_auteur']); $abonne['statut'] = $row['statut']; $abonne['login'] = $row['login']; $abonne['nom'] = $row['nom']; $abonne['lang'] = $row['lang']; $abonne['format'] = ($f = spiplistes_format_abo_demande($abonne['id_auteur'])) ? $f : 'texte' ; if($abonne['statut'] == '5poubelle') { $reponse_formulaire = _T('form_forum_access_refuse'); } // si encore nouveau, c'est qu'il ne s'est jamais identifie' else if($abonne['statut'] == 'nouveau') { // le supprimer. Il sera re-cree plus loin spiplistes_auteurs_auteur_delete('id_auteur='.sql_quote($abonne['id_auteur'])); $abonne['id_auteur'] = false; } else { // demande de modifier l'abonnement ? envoie le cookie de relance par mail spiplistes_auteurs_cookie_oubli_updateq($abonne['cookie_oubli'] = creer_uniqid(), $abonne['email']); $objet_email = _T('spiplistes:abonnement_titre_mail'); $texte_email = spiplistes_texte_inventaire_abos($abonne['id_auteur'], $type_abo, $nom_site_spip); $contexte = array('titre' => $objet_email); $id_abonne = $abonne['id_auteur']; } } // l'adresse mail n'existe pas dans la base. else { $abonne['login'] = spiplistes_login_from_email($abonne['email']); $abonne['nom'] = (($acces_membres == 'non') || empty($nom_inscription_)) ? ucfirst($abonne['login']) : $nom_inscription_ ; // ajouter l'abonne $pass = creer_pass_aleatoire(8, $abonne['email']); $abonne['zepass'] = $pass; $abonne['mdpass'] = md5($pass); $abonne['htpass'] = generer_htpass($pass); $abonne['cookie_oubli'] = creer_uniqid(); $abonne['statut'] = ($inscription_redacteur == 'oui') ? 'nouveau' : '6forum'; // format d'envoi par defaut pour le premier envoi de confirmation $abonne['format'] = 'texte'; // creation du compte ... if($id_abonne = spiplistes_auteurs_auteur_insertq( array( 'nom' => $abonne['nom'] , 'email' => $abonne['email'] , 'login' => $abonne['login'] , 'pass' => $abonne['mdpass'] , 'statut' => $abonne['statut'] , 'htpass' => $abonne['htpass'] , 'cookie_oubli' => $abonne['cookie_oubli'] ) )) { // creation .htpasswd & LDAP si besoin systeme ecrire_acces(); // premier format de reception par defaut spiplistes_format_abo_modifier($id_abonne, $abonne['format']); } $objet_email = _T('spiplistes:confirmation_inscription'); $contexte = array( 'titre' => $objet_email , 'nouvel_inscription' => 'oui' , 'inscription_redacteur' => $inscription_redacteur , 'inscription_visiteur' => $inscription_visiteur ); } $email_a_envoyer = true; } else if(!empty($mail_inscription_)) { //Non email o non valida return(array(true, _T('spiplistes:erreur_adresse'), $mode_modifier, false)); } } if($id_abonne && $email_a_envoyer) { $abonne['ids_abos'] = spiplistes_abonnements_listes_auteur($abonne['id_auteur']); $abonne['format'] = spiplistes_format_valide($abonne['format']); $email_a_envoyer = spiplistes_preparer_message( ($objet_email = "[$nom_site_spip] " . $objet_email) , spiplistes_patron_message() , array_merge($contexte, $abonne) ); if( spiplistes_envoyer_mail( $abonne['email'] , $objet_email , $email_a_envoyer , false , '' , $abonne['format'] ) ) { $reponse_formulaire = ($acces_membres == 'oui') ? _T('form_forum_identifiant_mail') : _T('spiplistes:demande_enregistree_retour_mail') ; } else { $reponse_formulaire = _T('form_forum_probleme_mail'); } } return(array(true, $reponse_formulaire, $mode_modifier, $abonne)); } // end spiplistes_formulaire_abonnement()
/** * Unlock an nfslock()ed file * * This can get tricky because the lock may have expired (perhaps even * during a process that should be "atomic"). We have to make sure we don't * unlock some other process' lock, and return a panic code if we think our * lock file has been broken illegally. What's done in reaction to that panic * (of anything) is up to the caller. See the comments on nfslock()! * * args: path = path to directory of lock file (/net/u/1/a/alexis/.mailspool) * namelock = file name of lock file (alexis.lock) * max_age = age of lockfile, in seconds, after which the lock is stale. * stale locks are always broken. Defaults to DEFAULT_LOCKTIME * if zero. Panix mail locks go stale at 300 seconds, the default. * birth = time the lock was created (as returned by nfslock()). * * Returns NFSL_OK if successful, NFSL_LOST if the lock has been lost * legitimately (because more than max_age has passed since the lock was * created), and NFSL_STOLEN if it's been tampered with illegally (i.e. * while this program is within the expiry period). Returns NFSL_SYSF if * another system failure prevents it from even trying to unlock the file. * * Note that for many programs, a return code of NFSL_LOST or NFSL_STOLEN is * equally disastrous; a NFSL_STOLEN means that some other program may have * trashed your file, but a NFSL_LOST may mean that _you_ have trashed someone * else's file (if in fact you wrote the file that you locked after you lost * the lock) or that you read inconsistent information. * * In practice, a return code of NFSL_LOST or NFSL_STOLEN will virtually never * happen unless someone is violating the locking protocol. * * @author Alexis Rosen <*****@*****.**> * @see spip_nfslock() * * @param string $fichier Chemin du fichier * @param bool $birth Timestamp de l'heure de création du verrou * @param int $max_age Age maximum du verrou * @param bool $test Mode de test * return bool true si déverrouillé, false sinon */ function spip_nfsunlock($fichier, $birth, $max_age = 0, $test = false) { $id = creer_uniqid(); if (!$max_age) { $max_age = _DEFAULT_LOCKTIME; } /* * 1. Build a temp file and stat that to get an idea of what the server * thinks the current time is (our_tmp.st_ctime).. */ $tpath = _DIR_TMP . "stime.{$id}"; $tmpfd = @fopen($tpath, 'w'); if (!$tmpfd or @fputs($tmpfd, "zz", 2) != 2 or !($our_tmp = fstat($tmpfd))) { /* The open failed, or we can't write the file, or we can't stat it */ @fclose($tmpfd); spip_unlink($tpath); return false; //(NFSL_SYSF); } @fclose($tmpfd); /* We don't need this once we have our_tmp.st_ctime. */ spip_unlink($tpath); /* * 2. make fullpath, a buffer for the full pathname of the lock file */ $lock_file = _DIR_TMP . _NAME_LOCK . "-" . substr(md5($fichier), 0, 8); /* * 3. If the ctime hasn't been modified, unlink the file and return. If the * lock has expired, sleep the usual random interval before returning. * If we didn't sleep, there could be a race if the caller immediately * tries to relock the file. */ if (($old_stat = @lstat($lock_file)) && $old_stat['ctime'] == $birth) { /* hasn't been modified since birth */ if (!$test) { spip_unlink($lock_file); } /* so the lock is ours to remove */ if ($our_tmp['ctime'] >= $birth + $max_age) { /* the lock has expired */ if (!$test) { return false; } //(NFSL_LOST); sleep(1 + random(0, 4)); /* so sleep a bit */ } return true; //(NFSL_OK); /* success */ } /* * 4. Either ctime has been modified, or the entire lock file is missing. * If the lock should still be ours, based on the ctime of the temp * file, return with NFSL_STOLEN. If not, then our lock is expired and * someone else has grabbed the file, so return NFSL_LOST. */ if ($our_tmp['ctime'] < $birth + $max_age) { return false; } //(NFSL_STOLEN); return false; //(NFSL_LOST); /* The lock must have expired first. */ }
/** * Envoie le courrier pret au depart * * Prend dans le panier des courriers a envoyer (spip_courriers) les encours * - formate le titre, texte pour l'envoi * * * les etiquettes sont dans la queue d'envois (spip_auteurs_courriers) * - id_auteur (pour reprendre l'adresse mail de id_auteur) * - id_courrier (le courrier a dupliquer/envoyer) * * la queue (spip_auteurs_courriers) a ete remplie par cron_spiplistes_cron() * se sert de la queue pour ventiler les envois par lots * le courrier (spip_courriers) doit avoir date <= time() et statut 'encour' * si email_test, la meleuse envoie le courrier a email_test, * supprime email_test du courrier * et repositionne le statut du courrier en 'redac' * si pas email_test mais id_liste, * regarde la queue d'envois (spip_auteurs_courriers) * et passe le statut du courrier (spip_courriers) a : * 'publie' si type == 'nl' (newsletter) * 'auto' si type == 'auto' (liste programmee) * et envoie les courriers precises aux abonnes de cette liste * et supprime l'identifiant du courrier dans la queue d'envois (spip_auteurs_courriers) * renvoie: * - nul, si la tache n'a pas a etre effectuee * - positif, si la tache a ete effectuee * - negatif, si la tache doit etre poursuivie ou recommencee * * @package spiplistes * @param int $last_time * @return int */ function spiplistes_meleuse ($last_time) { //spiplistes_debug_log('spiplistes_meleuse()'); include_spip('inc/meta'); include_spip('inc/texte'); include_spip('inc/filtres'); include_spip('inc/acces'); include_spip('inc/spiplistes_api'); include_spip('inc/spiplistes_api_courrier'); include_once(_DIR_PLUGIN_SPIPLISTES.'inc/spiplistes_mail.inc.php'); // initialise les options (preferences) foreach(array( 'opt_simuler_envoi' , 'opt_suspendre_meleuse' , 'opt_lien_en_tete_courrier', 'lien_patron' , 'opt_ajout_pied_courrier', 'pied_patron' , 'opt_ajout_tampon_editeur' , 'opt_personnaliser_courrier' , 'opt_log_voir_destinataire' , 'opt_ajout_lien_desabo' ) as $key) { $$key = spiplistes_pref_lire($key); } $sql_vide = sql_quote(''); $nb_etiquettes = spiplistes_courriers_en_queue_compter('etat='.$sql_vide); $prefix_log = _SPIPLISTES_PREFIX_LOG; // si meleuse suspendue, signale en log if($opt_suspendre_meleuse == 'oui') { spiplistes_log($prefix_log.'SUSPEND MODE !!!'); return(0 - $last_time); } if($nb_etiquettes) { $eol = "\n"; $eol2 =$eol.$eol; $body_html_debut = '<html>'.$eol2.'<body style="margin:0;padding:0;">'.$eol2; $body_html_fin = $eol2.'</body></html>'; $charset_spip = $GLOBALS['meta']['charset']; $charset_dest = $GLOBALS['meta']['spiplistes_charset_envoi']; spiplistes_log($prefix_log.$nb_etiquettes.' job(s), distribution...'); $log_voir_destinataire = ($opt_log_voir_destinataire == 'oui'); $simuler_envoi = ($opt_simuler_envoi == 'oui'); // signale en log si mode simulation if($simuler_envoi) { spiplistes_log($prefix_log.'SIMULATION MODE !!!'); } // prepare le tampon editeur if($opt_ajout_tampon_editeur == 'oui') { list($tampon_html, $tampon_texte) = spiplistes_tampon_assembler_patron(); } else { $tampon_html = $tampon_texte = ''; } // prendre la premiere etiquette sur le tas et traiter son courrier $sql_courrier_select = array( 'titre', 'texte', 'message_texte', 'type' , 'id_courrier', 'id_liste', 'email_test', 'total_abonnes', 'date_debut_envoi' ); if($id_courrier = intval(spiplistes_courriers_en_queue_premier('id_courrier', 'etat='.$sql_vide)) ) { $sql_courrier_a_traiter = spiplistes_courriers_casier_premier( $sql_courrier_select , 'id_courrier='.sql_quote($id_courrier) ); spiplistes_debug_log ($prefix_log.'etiquette en cours pour id_courrier #'.$id_courrier); } else { // un vieux bug dans une ancienne version, eradique depuis (j'espere ;-) //spiplistes_log($prefix_log."premiere etiquette en erreur. id_courier = 0. Supprimer cette etiquette manuellement !"); spiplistes_log(_T('spiplistes:erreur_queue_supprimer_courrier' , array('s' => $prefix_log)) ); } // boucle (sur LIMIT 1) pour pouvoir sortir par break si erreur while($row = sql_fetch($sql_courrier_a_traiter)) { foreach($sql_courrier_select as $key) { $$key = $row[$key]; } foreach(array('id_courrier','id_liste','total_abonnes') as $key) { $$key = intval($$key); } // objet (subject) ne peut pas être en html ?! // sauf pour le webmail (et encore) $objet_html = filtrer_entites(typo(spiplistes_calculer_balise_titre(extraire_multi($titre)))); $page_html = stripslashes($texte); $message_texte = stripslashes($message_texte); $nb_emails = array(); // compteur pour la session uniquement // le total de chaque sera ajoute en fin de session $nb_emails_envoyes = $nb_emails_echec = $nb_emails_non_envoyes = $nb_emails['texte'] = $nb_emails['html'] = 0 ; $str_log = 'id_courrier #'.$id_courrier; ////////////////////////// // Determiner email de l emetteur if($is_a_test = email_valide($email_test)) { // courrier a destination adresse email de test $str_log .= ' TO: '.$email_test.' (TEST)'; } else if($id_liste > 0) { // courrier a destination des abonnes d'une liste $total_abonnes = spiplistes_listes_nb_abonnes_compter($id_liste); $str_log .= ' TO id_liste #'.$id_liste.' ('.$total_abonnes.' users)'; $lang = spiplistes_listes_langue($id_liste); if($lang != '') { $GLOBALS['spip_lang'] = $lang; } $contexte = array('lang' => $lang); list($pied_html, $pied_texte) = spiplistes_pied_page_assembler_patron($id_liste, $lang); } else { // erreur dans un script d'appel ? Ou url ? Ou base erreur ? $str_log .= ' [ERROR] MISSING PARAMS (id_liste AND email_test)'; spiplistes_courrier_statut_modifier($id_courrier, _SPIPLISTES_COURRIER_STATUT_ERREUR); // quitte while() principal break; } ////////////////////////////// // email emetteur $email_envoi = spiplistes_listes_email_emetteur($id_liste); if(!$is_a_test && !($email_envoi)) { $str_log .= ' [ERROR] ID_LISTE #'.$id_liste.' or from email MISSING'; spiplistes_courrier_statut_modifier($id_courrier, _SPIPLISTES_COURRIER_STATUT_ERREUR); // quitte while() principal break; } $from = $email_envoi; if($from_valide = email_valide($from)) { if(strpos($from, '<') === false) { $fromname = spiplistes_nom_site_texte ($lang); $fromname = extraire_multi($GLOBALS['meta']['nom_site']); if ($charset_dest!=$charset_spip) { include_spip('inc/charsets'); $fromname = unicode2charset(charset2unicode($fromname),$charset_dest); } } } else { spiplistes_log('[ERROR] from address incorrect: '.$from); if($is_a_test) { spiplistes_courriers_statut_redac ($id_courrier); } // break; // garder pour incrementer les erreurs des listes } $email_reply_to = spiplistes_pref_lire_defaut('email_reply_to', $from); $return_path = spiplistes_pref_lire_defaut('email_return_path_defaut', $from); //////////////////////////////////// // Prepare la version texte $objet_texte = $titre; $page_texte = ($message_texte !='') ? $message_texte : spiplistes_courrier_version_texte($page_html) ; //////////////////////////////////// // Ajoute lien tete de courrier if( ($opt_lien_en_tete_courrier == 'oui') && !empty($lien_patron) ) { list($lien_html, $lien_texte) = spiplistes_courriers_assembler_patron ( _SPIPLISTES_PATRONS_TETE_DIR . $lien_patron , array('id_courrier' => $id_courrier , 'lang' => $lang) ); $page_html = $lien_html . $page_html; $page_texte = $lien_texte . $page_texte; } //////////////////////////////////// // La petite ligne du renvoi du cookie pour modifier son abonnement //$pied_rappel_html = _T('spiplistes:modif_abonnement_html'); //$pied_rappel_texte = _T('spiplistes:modif_abonnement_text'); // transcrire le contenu if($charset_dest != $charset_spip){ include_spip('inc/charsets'); foreach(array( 'objet_html', 'objet_texte' , 'page_html', 'page_texte' , 'pied_html', 'pied_texte' //, 'pied_rappel_html', 'pied_rappel_texte' , 'tampon_html', 'tampon_texte') as $key) { if(!empty($$key)) { $$key = spiplistes_translate_2_charset( $$key , $charset_dest , (strpos($key, 'texte') === false) ); } } } // corrige les liens relatifs (celui de texte a deja ete corrige par la trieuse (cron) foreach(array('pied_html', 'pied_texte' //, 'pied_rappel_html', 'pied_rappel_texte' , 'tampon_html', 'tampon_texte') as $key) { if(!empty($$key)) { $$key = spiplistes_liens_absolus ($$key); } } $email_a_envoyer = array(); $email_a_envoyer['texte'] = new phpMail('', $objet_texte, '' , $page_texte, $charset_dest); $email_a_envoyer['texte']->From = $from ; if($fromname) $email_a_envoyer['texte']->FromName = $fromname ; // Errors-To:, Non-standard @see: http://www.ietf.org/rfc/rfc2076.txt //$email_a_envoyer['texte']->AddCustomHeader('Errors-To: '.$return_path); $email_a_envoyer['texte']->AddCustomHeader('Reply-To: '.$email_reply_to); $email_a_envoyer['texte']->AddCustomHeader('Return-Path: '.$return_path); $email_a_envoyer['texte']->SMTPKeepAlive = true; //$email_a_envoyer['html'] = new phpMail('', $objet_html, $page_html, $page_texte, $charset_dest); $email_a_envoyer['html'] = new phpMail('' , $objet_html , $page_html , $page_texte , $charset_dest ); $email_a_envoyer['html']->From = $from ; if($fromname) { $email_a_envoyer['html']->FromName = $fromname ; } //$email_a_envoyer['html']->AddCustomHeader('Errors-To: '.$return_path); $email_a_envoyer['html']->AddCustomHeader('Reply-To: '.$email_reply_to); $email_a_envoyer['html']->AddCustomHeader('Return-Path: '.$return_path); $email_a_envoyer['html']->SMTPKeepAlive = true; $str_log .= ' REPLY-TO: '.$email_reply_to.' RETURN-PATH: '.$return_path; if($total_abonnes) { $limit = intval($GLOBALS['meta']['spiplistes_lots']); // nombre de messages envoyes par boucles. if($is_a_test) { $sql_adresses_dest = sql_select('id_auteur,nom,email', 'spip_auteurs' , 'email='.sql_quote($email_test).' LIMIT 1'); } else { // Pour memo: les etiquettes sont creees par la trieuse // ou directement en backoffice // - pour les envois de test // - pour les envoyer maintenant des courriers // Traitement d'une liasse d'etiquettes // un id pour ce processus (le tampon est unique par liasse) $id_process = intval(substr(creer_uniqid(),0,5)); $prefix_log .= '['.$id_process.'] '; // un coup de tampon sur les etiquettes // des courriers qui vont partir spiplistes_courriers_en_queue_modifier( array( 'etat' => sql_quote($id_process)) , 'etat='.$sql_vide.' AND id_courrier='.sql_quote($id_courrier).' LIMIT '.$limit ); // prendre la liasse des etiquettes tamponnees $sql_adresses_dest = sql_select( array('a.nom', 'a.id_auteur', 'a.email') , array('spip_auteurs AS a', 'spip_auteurs_courriers AS b') , array( 'etat='.sql_quote($id_process) , 'a.id_auteur=b.id_auteur' , 'b.id_courrier='.sql_quote($id_courrier) ) , 'a.email' ); } $nb_destinataires = sql_count($sql_adresses_dest); spiplistes_log($prefix_log.'nb etiquettes a traiter: '.$nb_destinataires); if($nb_destinataires > 0) { spiplistes_debug_log($prefix_log.'total_abos: '.$total_abonnes.', en cours: '.$nb_destinataires.', limit: '.$limit); /* // CP:20100215: inutile de compter AVANT // si process en //, le chiffre est faux // replacer les compteurs if($row = sql_fetch(sql_select( "nb_emails_envoyes,nb_emails_echec,nb_emails_non_envoyes,nb_emails_texte,nb_emails_html" , 'spip_courriers' , 'id_courrier='.sql_quote($id_courrier) , '', '', 1 )) ) { $nb_emails_envoyes = intval($row['nb_emails_envoyes']); $nb_emails_echec = intval($row['nb_emails_echec']); $nb_emails_non_envoyes = intval($row['nb_emails_non_envoyes']); $nb_emails['texte'] = intval($row['nb_emails_texte']); $nb_emails['html'] = intval($row['nb_emails_html']); } */ //envoyer le lot d'emails selectionne' (la liasse) while($adresse = sql_fetch($sql_adresses_dest)) { if($log_voir_destinataire) { $str_temp = ''; } $id_auteur = intval($adresse['id_auteur']); $nom_auteur = $adresse['nom']; $email = $adresse['email']; // Marquer le debut de l'envoi if(!intval($date_debut_envoi)) { spiplistes_courrier_modifier ($id_courrier, array('date_debut_envoi' => 'NOW()'), false); } $format_abo = spiplistes_format_abo_demande($id_auteur); $total++; if($log_voir_destinataire) { $str_temp .= $nom_auteur.'('.$format_abo.') - '.$email; } unset ($cookie); if(($format_abo=='html') || ($format_abo=='texte')) { $cookie = creer_uniqid(); spiplistes_auteurs_cookie_oubli_updateq($cookie, $email); if($from_valide) { //$_url = generer_url_public('abonnement','d='.$cookie); if($opt_personnaliser_courrier == 'oui') { list($ventre_html, $ventre_texte) = spiplistes_personnaliser_courrier( $page_html , $page_texte , $id_auteur , $format_abo ); } else { $ventre_html = $page_html; $ventre_texte = $page_texte; } // le & semble poser probleme sur certains MUA. A suivre... //$_url = preg_replace(',(&),','&', $_url); // Pour le moment (27/03/2011), un seul patron connu $lien_rappel = 'lien_standard'; list($pied_rappel_html, $pied_rappel_texte) = spiplistes_courriers_assembler_patron ( _SPIPLISTES_PATRONS_LIEN_DIR . $lien_rappel , array('id_courrier' => $id_courrier , 'id_liste' => $id_liste , '_url' => generer_url_public() , 'lang' => $lang , 'd' => $cookie , 'lien_desabo' => ($opt_ajout_lien_desabo == 'oui') ) ); $pied_rappel_texte = spiplistes_translate_2_charset ($pied_rappel_texte , $charset_dest , true); switch($format_abo) { case 'html': // Si on ne trouve pas les tags HTML alors on les ajoutes if (FALSE === strpos($ventre_html, '</html>')) { $email_a_envoyer[$format_abo]->Body = $body_html_debut . $eol . $ventre_html . $eol . $pied_html . $eol . $pied_rappel_html . $eol . $tampon_html . $eol . $body_html_fin ; } else { // Si on trouve les tags HTML cela veut dire que l'auteur // veut pouvoir gerer lui meme la partie <head> ainsi que le lien de desabonnement // donc on ne prend en compte que la partie ventre_html. $tags_perso = array('http://%URL_ABONNEMENT%' => generer_url_public('abonnement','d='.$cookie),); $email_a_envoyer[$format_abo]->Body = str_replace(array_keys($tags_perso), array_values($tags_perso), $ventre_html); } // la version alternative texte $email_a_envoyer[$format_abo]->AltBody = $ventre_texte .$eol2 . $pied_texte . $eol2 . $pied_rappel_texte . $eol2 . $tampon_texte ; break; case 'texte': $email_a_envoyer[$format_abo]->Body = $ventre_texte .$eol2 . $pied_texte . $eol2 . $pied_rappel_texte . $eol2 . $tampon_texte ; break; } $email_a_envoyer[$format_abo]->SetAddress($email, $nom_auteur); // envoie le mail if($simuler_envoi || $email_a_envoyer[$format_abo]->send()) { $nb_emails_envoyes++; $nb_emails[$format_abo]++; if($log_voir_destinataire) { $str_temp .= ' [OK]'; } } else { $nb_emails_echec++; if($log_voir_destinataire) { $str_temp .= _T('spiplistes:erreur_mail'); } } } else { $nb_emails_echec++; if($log_voir_destinataire) { $str_temp .= _T('spiplistes:sans_adresse'); } } } // end if(($format_abo=='html') || ($format_abo=='texte')) else { $nb_emails_non_envoyes++; if($log_voir_destinataire) { $str_temp .= ' '._T('spiplistes:msg_abonne_sans_format'); } // prevenir qu'il manque le format spiplistes_log($prefix_log.' destination format MISSING FOR ID_AUTEUR #'.$id_auteur); } /* fin abo*/ if($log_voir_destinataire) { spiplistes_log($prefix_log.$str_temp); } } // fin while // supprime la liasse de la queue d'envois spiplistes_debug_log($prefix_log."envoi OK. Supprimer queue $id_process"); spiplistes_courriers_en_queue_supprimer('etat='.sql_quote($id_process)); // si c'est un test on repasse le courrier en redac if($is_a_test) { spiplistes_courriers_statut_redac ($id_courrier); } $email_a_envoyer['texte']->SmtpClose(); $email_a_envoyer['html']->SmtpClose(); } // end if } else { //aucun destinataire connu pour ce message spiplistes_debug_log($prefix_log._T('spiplistes:erreur_sans_destinataire') . '---' . _T('spiplistes:envoi_annule') ); spiplistes_courrier_statut_modifier($id_courrier, _SPIPLISTES_COURRIER_STATUT_IGNORE); spiplistes_courrier_supprimer_queue_envois('id_courrier', $id_courrier); $str_log .= ' END #'.$id_courrier; // break; } if(!$is_a_test) { // faire le bilan apres l'envoi d'un lot $sql_set_array = array( 'nb_emails_envoyes' => sql_quote('nb_emails_envoyes').'+'.$nb_emails_envoyes , 'nb_emails_texte' => sql_quote('nb_emails_texte').'+'.$nb_emails['texte'] , 'nb_emails_html' => sql_quote('nb_emails_html').'+'.$nb_emails['html'] ); if($nb_emails_echec) { $sql_set_array['nb_emails_echec'] = sql_quote('nb_emails_echec').'+'.$nb_emails_echec; } if($nb_emails_non_envoyes) { $sql_set_array['nb_emails_non_envoyes'] = sql_quote('nb_emails_non_envoyes').'+'.$nb_emails_non_envoyes; } spiplistes_log($prefix_log.$str_log); $str_log = spiplistes_trace_compteur ($id_courrier , $nb_emails_envoyes , $nb_emails['html'] , $nb_emails['texte'] , $nb_emails_non_envoyes , $nb_emails_echec , 'SESSION'); // si courrier pas termine, redemande la main au CRON, sinon nettoyage. if($t = spiplistes_courriers_en_queue_compter('id_courrier='.sql_quote($id_courrier))) { $str_log .= ' LEFT '.$t.' jobs'; } else { $statut = ($type == _SPIPLISTES_COURRIER_TYPE_NEWSLETTER) ? _SPIPLISTES_COURRIER_STATUT_PUBLIE : _SPIPLISTES_COURRIER_STATUT_AUTO; spiplistes_debug_log($prefix_log."nouveau statut $statut"); $sql_set_array['statut'] = sql_quote($statut); $sql_set_array['date_fin_envoi'] = 'NOW()'; $str_log .= ' END #'.$id_courrier; } spiplistes_courrier_modifier($id_courrier, $sql_set_array, false); // placer en log le suivi des compteurs si mode debug if (spiplistes_debug_log()) { if ($row = sql_fetch(sql_select( 'nb_emails_envoyes,nb_emails_echec,nb_emails_non_envoyes,nb_emails_texte,nb_emails_html' , 'spip_courriers' , 'id_courrier='.sql_quote($id_courrier) , '', '', 1 )) ) { spiplistes_log($prefix_log.$str_log); $str_log = spiplistes_trace_compteur ($id_courrier , $row['nb_emails_envoyes'] , $row['nb_emails_html'] , $row['nb_emails_texte'] , $row['nb_emails_non_envoyes'] , $row['nb_emails_echec'] , 'FROM_DB') . ' END #'.$id_courrier; ; } } } } // end while() } // end if($nb_etiquettes) else { $str_log = 'no job'; } spiplistes_log($prefix_log.$str_log); if(($ii = spiplistes_courriers_total_abonnes()) > 0) { // il en reste apres la meleuse ? Signale au CRON tache non terminee $nb_etiquettes = spiplistes_courriers_en_queue_compter('etat='.$sql_vide); spiplistes_log($prefix_log.'courriers prets au depart ('.$nb_etiquettes.'/'.$ii.')'); $last_time = -$last_time; } return($last_time); } // end spiplistes_meleuse()
function ecrire_fichier ($fichier, $contenu, $ecrire_quand_meme = false, $truncate=true) { #spip_timer('ecrire_fichier'); // verrouiller le fichier destination if ($fp = spip_fopen_lock($fichier, 'a',LOCK_EX)) { // ecrire les donnees, compressees le cas echeant // (on ouvre un nouveau pointeur sur le fichier, ce qui a l'avantage // de le recreer si le locker qui nous precede l'avait supprime...) if (substr($fichier, -3) == '.gz') $contenu = gzencode($contenu); // si c'est une ecriture avec troncation , on fait plutot une ecriture complete a cote suivie unlink+rename // pour etre sur d'avoir une operation atomique // y compris en NFS : http://www.ietf.org/rfc/rfc1094.txt // sauf sous wintruc ou ca ne marche pas $ok = false; if ($truncate AND _OS_SERVEUR != 'windows'){ include_spip('inc/acces'); $id = creer_uniqid(); // on ouvre un pointeur sur un fichier temporaire en ecriture +raz if ($fp2 = spip_fopen_lock("$fichier.$id", 'w',LOCK_EX)) { $s = @fputs($fp2, $contenu, $a = strlen($contenu)); $ok = ($s == $a); spip_fclose_unlock($fp2); spip_fclose_unlock($fp); // unlink direct et pas spip_unlink car on avait deja le verrou @unlink($fichier); // le rename aussitot, atomique quand on est pas sous windows // au pire on arrive en second en cas de concourance, et le rename echoue // --> on a la version de l'autre process qui doit etre identique @rename("$fichier.$id",$fichier); // precaution en cas d'echec du rename if (!_TEST_FILE_EXISTS OR @file_exists("$fichier.$id")) @unlink("$fichier.$id"); if ($ok) $ok = file_exists($fichier); } else // echec mais penser a fermer .. spip_fclose_unlock($fp); } // sinon ou si methode precedente a echoueee // on se rabat sur la methode ancienne if (!$ok){ // ici on est en ajout ou sous windows, cas desespere if ($truncate) @ftruncate($fp,0); $s = @fputs($fp, $contenu, $a = strlen($contenu)); $ok = ($s == $a); spip_fclose_unlock($fp); } // liberer le verrou et fermer le fichier @chmod($fichier, _SPIP_CHMOD & 0666); if ($ok) { if (!defined('_OPCACHE_BUG') AND function_exists('opcache_invalidate')) opcache_invalidate($fichier, true); return $ok; } } include_spip('inc/autoriser'); if (autoriser('chargerftp')) raler_fichier($fichier); spip_unlink($fichier); return false; }
function formulaires_spip_listes_inscription_traiter_dist ($id_liste='') { // enregistre dans spip_auteurs, spip_auteurs_elargis, spip_auteurs_listes $val['email'] = _request('email'); $val['nom'] = _request('email'); $alea_actuel = creer_uniqid(); $alea_futur = creer_uniqid(); $val['alea_actuel'] = $alea_actuel; $val['alea_futur'] = $alea_futur; $val['low_sec'] = ''; $val['statut'] = 'aconfirmer'; $format = _request('format_abo'); $listes = _request('listes'); // si l'auteur existe deja, $auteur = spiplistes_auteurs_auteur_select('id_auteur,statut,lang' , 'email='.sql_quote($val['email'])); if ($auteur) { $id_auteur = $auteur['id_auteur']; // reactiver le compte si necessaire if ($auteur['statut'] == '5poubelle') { spiplistes_auteurs_auteur_statut_modifier ($id_auteur, 'aconfirmer'); } spiplistes_debug_log ('inscription auteur #'.$id_auteur.' email:'.$val['email']); } else { // creer le compte abonne' if ($id_auteur = spiplistes_auteurs_auteur_insertq ($val)) { sql_insertq( 'spip_auteurs_elargis' , array('id_auteur'=>$id_auteur ,'spip_listes_format'=>$format ) ); } spiplistes_debug_log ('NEW inscription email:'.$val['email']); $lang = $GLOBALS['meta']['langue_site']; } if ($listes) { foreach($listes as $liste) { sql_insertq ('spip_auteurs_listes' , array('id_auteur'=>$id_auteur ,'id_liste'=>$liste ) ); } } // envoyer mail de confirmation if ( spiplistes_envoyer_mail ( $val['email'] , _T('spiplistes:confirmation_inscription') , _T('spiplistes:inscription_reponses_s' , array('s' => spiplistes_nom_site_texte ($lang)) ) ) ) { $contexte = array('message_ok'=>_T('spiplistes:demande_ok'),'editable' => false,); } else { $contexte = array('message_ok'=>_T('spiplistes:demande_ko'),'editable' => false,); } return ($contexte); }