function cron_galettonuts_cron($t) { if (!class_exists('L2_Spip_Plugin_Metas')) { include_spip('lib/L2/Spip/Plugin/Metas.class'); } $config = new L2_Spip_Plugin_Metas('galettonuts_config'); // La synchronisation automatique est désactivée if (!$config->lire('activer_cron')) { spip_log('cron: galettonuts_cron, desactivee.'); return null; } include_spip('inc/galettonuts_fonctions'); $code = (int) galettonuts_synchroniser(); $synchro = new L2_Spip_Plugin_Metas('galettonuts_synchro'); if (-2 == $code || -1 == $code || 0 == $code) { spip_log('cron: galettonuts_cron, echec.'); return 0 - $t; } else { if (-10 == $code) { spip_log('cron: galettonuts_cron, auteurs a jour.'); return null; } else { spip_log('cron: galettonuts_cron, synchronisation de ' . $code . ' auteurs galette dans spip.'); return 1; } } }
function exec_admin_galettonuts() { // Seuls les super-admins sont authorisés réaliser des synchros, // et par conséquent de configurer le plugin if (!('0minirezo' === $GLOBALS['auteur_session']['statut'] && $GLOBALS['connect_toutes_rubriques'])) { echo minipres(_T('avis_non_acces_page')); exit; } $erreurs = array(); $icone_base = _DIR_PLUGIN_GALETTONUTS . 'img_pack/galettonuts-sql_status-'; $icone_src = 'config-168.png'; $icone_title = _T('galettonuts:icone_db_config'); include_spip('inc/galettonuts_fonctions'); // 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'); $contexte = $config->lire(); $activer_cron = array_key_exists('activer_cron', $contexte) ? $contexte['activer_cron'] : true; // {{{ Traitement des données reçues if (_request('_galettonuts_ok')) { $champs = array('adresse_db' => _request('adresse_db'), 'login_db' => _request('login_db'), 'pass_db' => _request('pass_db'), 'prefix_db' => _request('prefix_db'), 'choix_db' => _request('choix_db')); // Des champs sont-ils vides ? $champs = array_map('trim', $champs); if (false === (!in_array(null, $champs) || !in_array('', $champs))) { $erreurs[] = _T('galettonuts:texte_erreur_1'); } // Activer la synchronisation automatique ? if ('oui' == _request('activer_cron')) { $activer_cron = true; } else { $activer_cron = false; } if ($activer_cron) { $champs['heures'] = intval(_request('heures')); $champs['minutes'] = intval(_request('minutes')); $synchro = new L2_Spip_Plugin_Metas('galettonuts_synchro'); $frequence = 3600 * $champs['heures'] + 60 * $champs['minutes']; if ($frequence !== $synchro->lire('frequence')) { $synchro->ajouter(array('frequence' => $frequence), true); $fichier = '<?php define(\'_GALETTONUTS_DELAIS_CRON\', ' . $frequence . '); ?>'; ecrire_fichier(_DIR_TMP . 'galettonuts_cron.php', $fichier, true); unset($fichier); } } else { // On s'assure de bien supprimer le fichier de vérouillage // pour forcer la resynchronisation tenant compte de la nouvelle // configuration. if (file_exists(_DIR_TMP . 'galettonuts_cron.lock')) { unlink(_DIR_TMP . 'galettonuts_cron.lock'); } if (file_exists(_DIR_TMP . 'galettonuts_cron.php')) { unlink(_DIR_TMP . 'galettonuts_cron.php'); } } $contexte['activer_cron'] = $activer_cron; // Prise en compte dans le contexte $contexte = array_merge($contexte, $champs); unset($champs); // Test de connexion à la BDD Galette if (!count($erreurs)) { $link = galettonuts_galette_db($contexte['adresse_db'], $contexte['login_db'], $contexte['pass_db']); if (-1 === $link) { $erreurs[] = _T('galettonuts:avis_connexion_echec_1'); $icone_src = 'error-168.png'; $icone_title = _T('galettonuts:icone_db_erreur'); } else { if (-2 === galettonuts_galette_db($contexte['choix_db'], $link)) { $erreurs[] = _T('galettonuts:avis_connexion_echec_2'); $icone_src = 'error-168.png'; $icone_title = _T('galettonuts:icone_db_erreur'); } else { $icone_src = 'ok-168.png'; $icone_title = _T('galettonuts:icone_db_ok'); $contexte['db_ok'] = true; } } if (0 < $link) { mysql_close($link); } unset($link); } // Interraction avec Accès Restreint if (defined('_DIR_PLUGIN_ACCESRESTREINT')) { if ($config->existe('zones')) { galettonuts_dissocier_zones($config->lire('zones')); } $zones = _request('zones'); if (is_array($zones) && 0 < count($zones)) { $contexte['zones'] = $zones; } else { $config->supprimer(array('zones' => null)); unset($contexte['zones']); } unset($zones); } // Mémorisation de la configuration à la base de données Galette if (!count($erreurs)) { $config->ajouter($contexte, true); } // Lancer une synchronisation if (0 == count($erreurs)) { galettonuts_synchroniser(true); } } else { if (!empty($contexte['adresse_db']) && !empty($contexte['login_db']) && !empty($contexte['pass_db'])) { $link = galettonuts_galette_db($contexte['adresse_db'], $contexte['login_db'], $contexte['pass_db']); if (0 > $link) { $icone_src = 'error-168.png'; $icone_title = _T('galettonuts:icone_db_erreur'); $config->ajouter(array('db_ok' => false)); } else { $icone_src = 'ok-168.png'; $icone_title = _T('galettonuts:icone_db_ok'); $config->ajouter(array('db_ok' => true)); mysql_close($link); unset($link); } } } // }}} // {{{ Affichage // Haut de page $commencer_page = charger_fonction('commencer_page', 'inc'); echo $commencer_page(_T('galettonuts:titre_page_admin'), '', 'galettonuts'), '<br/><br/><br/>'; gros_titre(_T('galettonuts:titre_admin')); // Boîte d'informations debut_gauche(); debut_boite_info(); echo _T('galettonuts:texte_info_admin'); fin_boite_info(); // Message(s) d'erreur(s) debut_droite(); if ($c = count($erreurs)) { if (1 == $c) { $erreur_titre = _T('galettonuts:texte_erreur'); $erreur_texte = (string) $erreurs[0]; } else { $erreur_titre = _T('galettonuts:texte_erreurs'); $erreur_texte = '<ul>'; for ($i = 0; $c < $i; ++$i) { $erreur_texte .= '<li>' . $erreurs[$i] . '</li>'; } $erreur_texte .= '</ul>'; } echo '<div style="background-color:#fee;color:red;border:1px solid red;padding:.5em;margin-bottom:25px" class="verdana2"><strong>', $erreur_titre, '</strong> :<br />', $erreur_texte, '</div>'; } echo generer_url_post_ecrire('admin_galettonuts'); // Accès à la BDD debut_cadre_trait_couleur('base-24.gif', false, '', _T('galettonuts:info_bdd')); echo '<div style="float:right;width:175px" class="verdana2">', _T('galettonuts:texte_info_bdd'), '<div>', '<div style="position:absolute;bottom:35px;width:168px;height:168px">', '<img src="', $icone_base, $icone_src, '" width="168" height="168" alt="" title="', $icone_title, '" />', '</div>', '</div>', '</div>'; echo '<div style="width:298px">'; debut_cadre_couleur(); echo '<p><label for="adresse_db" style="font-weight:bold;cursor:pointer">', _T('galettonuts:entree_db_adresse'), '</label><br/>', '<input type="text" name="adresse_db" value="', $contexte['adresse_db'], '" id="adresse_db" class="fondl" style="width:278px" tabindex="504"/>', '</p>'; echo '<p><label for="login_db" style="font-weight:bold;cursor:pointer">', _T('galettonuts:entree_db_login'), '</label><br/>', '<input type="text" name="login_db" value="', $contexte['login_db'], '" id="login_db" class="fondl" style="width:278px" tabindex="508"/>', '</p>'; echo '<p><label for="pass_db" style="font-weight:bold;cursor:pointer">', _T('galettonuts:entree_db_mdp'), '</label><br/>', '<input type="password" name="pass_db" value="', $contexte['pass_db'], '" id="pass_db" class="fondl" style="width:278px" tabindex="512"/>', '</p>'; echo '<p><label for="prefix_db" style="font-weight:bold;cursor:pointer">', _T('galettonuts:entree_db_prefix'), '</label><br/>', '<input type="text" name="prefix_db" value="', $contexte['prefix_db'], '" id="prefix_db" class="fondl" style="width:278px" tabindex="516"/>', '</p>'; echo '<p><label for="choix_db" style="font-weight:bold;cursor:pointer">', _T('galettonuts:entree_db_choix'), '</label><br/>', '<input type="text" name="choix_db" value="', $contexte['choix_db'], '" id="choix_db" class="fondl" style="width:278px" tabindex="520"/>', '</p>'; fin_cadre_couleur(); echo '</div>'; echo '<div style="text-align:right;padding:0 2px;margin-top:.5em" id="buttons">', '<input type="submit" name="_galettonuts_ok" value="', _T('bouton_valider'), '" class="fondo" style="cursor:pointer" tabindex="560"/></div>'; fin_cadre_trait_couleur(); // Synchronisation automatique echo '<br />'; debut_cadre_relief('synchro-24.gif', false, '', _T('galettonuts:info_cron')); echo '<p class="verdana2">', _T('galettonuts:texte_info_cron'), '</p>'; echo '<p class="verdana2">', '<label', $activer_cron ? ' style="font-weight:bold"' : '', '>', '<input type="radio" name="activer_cron" value="oui" id="activer_cron_oui" tabindex="602" ', $activer_cron ? ' checked="checked" ' : '', 'onclick="changeVisible(this.checked, \'config-cron\', \'block\', \'none\');"', '/>', _T('galettonuts:entree_cron_utiliser'), '</label><br />', '<label', !$activer_cron ? ' style="font-weight:bold"' : '', '>', '<input type="radio" name="activer_cron" value="non" id="activer_cron_non" tabindex="604" ', !$activer_cron ? ' checked="checked" ' : '', 'onclick="changeVisible(this.checked, \'config-cron\', \'none\', \'block\');"', '/>', _T('galettonuts:entree_cron_utiliser_non'), '</label>', '</p>'; echo '<div id="config-cron"', !$activer_cron ? ' style="display:none"' : '', '><hr />'; echo '<p class="verdana2">', _T('galettonuts:frequence'), '</p>'; echo '<p class="verdana2" style="text-align:center">', '<input type="text" name="heures" value="', $contexte['heures'], '" id="cron_heures" size="2" maxlength="2" tabindex="606" class="fondl" style="text-align:right"/>', '<label for="cron_heures" style="font-weight:bold;cursor:pointer">', _T('galettonuts:heures'), '</label>', '<input type="text" name="minutes" value="', $contexte['minutes'], '" id="cron_minutes" size="2" maxlength="2" tabindex="606" class="fondl" style="text-align:right"/>', '<label for="cron_minutes" style="font-weight:bold;cursor:pointer">', _T('galettonuts:minutes'), '</label>', '</p>'; echo '</div>'; echo '<div style="text-align:right;padding:0 2px;margin-top:.5em" id="buttons">', '<input type="submit" name="_galettonuts_ok" value="', _T('bouton_valider'), '" class="fondo" style="cursor:pointer" tabindex="660"/></div>'; fin_cadre_relief(); // Liaison avec le plugin Accès restreint if (defined('_DIR_PLUGIN_ACCESRESTREINT')) { $zones = spip_query("SELECT `id_zone`, `titre`, `descriptif` FROM `spip_zones` WHERE 1;"); if (spip_num_rows($zones)) { global $couleur_foncee; $i = 0; $zone['num'] = _T('accesrestreint:colonne_id'); $zone['titre'] = _T('accesrestreint:titre'); $zone['descriptif'] = _T('accesrestreint:descriptif'); $tabindex = 700; $tab_zones = <<<HTML <table class="arial2" border="0" cellpadding="2" cellspacing="0" style="width:100%;border:1px solid #AAA;"> <thead> <tr style="background-color:{$couleur_foncee};color:#fff;font-weight=bold"> <th scope="col" style="text-align:left;padding-left:5px;padding-right:5px" width="40">{$zone['num']}</th> <th scope="col" style="text-align:left;border-left:1px inset #fff;padding-left:5px;padding-right:5px">{$zone['titre']}</th> <th scope="col" style="text-align:left;border-left:1px inset #fff;padding-left:5px;padding-right:5px">{$zone['descriptif']}</th> <th scope="col" style="text-align:center;border-left:1px inset #fff;padding-left:5px;padding-right:5px" width="16"> </th> </tr> </thead> <tbody> HTML; while ($zone = spip_fetch_array($zones)) { ++$tabindex; $bgcolor = alterner(++$i, '#FEFEFE', '#EEE'); if (array_key_exists('zones', $contexte)) { $checked = in_array($zone['id_zone'], $contexte['zones']) ? ' checked="checked"' : ''; } else { $checked = ''; } $tab_zones .= <<<HTML <tr style="background-color:{$bgcolor}"> <td style="text-align:left;padding-left:5px;padding-right:5px">{$zone['id_zone']}</td> <td style="text-align:left;padding-left:5px;padding-right:5px">{$zone['titre']}</td> <td style="text-align:left;padding-left:5px;padding-right:5px">{$zone['descriptif']}</td> <td style="text-align:center"> <input type="checkbox" name="zones[]" value="{$zone['id_zone']}" class="fondl" tabindex="{$tabindex}"{$checked} /> </td> </tr> HTML; } $tab_zones .= '</tbody></table>'; echo '<br />'; debut_cadre_relief(_DIR_PLUGIN_ACCESRESTREINT . 'img_pack/zones-acces-24.gif', false, '', _T('galettonuts:info_liaison_access_restreint')); echo '<p class="verdana2">', _T('galettonuts:texte_liaison_access_restreint_1'), '</p>'; echo '<p class="verdana2">', _T('galettonuts:texte_liaison_access_restreint_2'), '</p>'; echo $tab_zones; echo '<div style="text-align:right;padding:0 2px;margin-top:.5em" id="buttons">', '<input type="submit" name="_galettonuts_ok" value="', _T('bouton_valider'), '" class="fondo" style="cursor:pointer" tabindex="760"/></div>'; fin_cadre_relief(); } } echo '</form>'; // Fin de page echo fin_gauche() . fin_page(); // }}} }
function galettonuts_formulaire_synchro() { global $spip_lang_left, $spip_lang_right; include_spip('inc/config'); // Détermine si on dépli le cadre if ('oui' == _request('galettonuts_synchro_ok')) { $visibilite = 'visible'; } else { $visibilite = 'invisible'; } $return = debut_cadre_couleur('synchro-24.gif', true, '', call_user_func('bouton_block_' . $visibilite, 'galettonuts_synchro') . _T('galettonuts:titre_formulaire_synchro')); $return .= call_user_func('debut_block_' . $visibilite, 'galettonuts_synchro'); // Le plugin n'a pas encore été configuré if (!class_exists('L2_Spip_Plugin_Metas')) { include_spip('lib/L2/Spip/Plugin/Metas.class'); } $config = new L2_Spip_Plugin_Metas('galettonuts_config'); if (!$config || !$config->lire('db_ok')) { $return .= debut_cadre_relief('', true); $return .= http_img_pack('warning.gif', _T('info_avertissement'), 'style="width:48px;height:48px;float:right;margin:5px;"'); $return .= '<p class="verdana2"><strong>'; $return .= _T('galettonuts:configuration_manquante'); $return .= '</strong><br />'; $return .= _T('galettonuts:configuration_lien', array('url' => generer_url_ecrire('admin_galettonuts'))); $return .= '</p>'; $return .= fin_cadre_relief(true); $return .= fin_block(); $return .= fin_cadre_couleur(true); return $return; } unset($config); // Affichage des erreurs if ($statut = (int) _request('code_retour')) { switch ($statut) { // Une erreur inconnue est survenue. case 0: $msg = '<p class="verdana2"><strong>' . _T('info_avertissement') . '</strong><br />'; $msg .= _T('galettonuts:etat_synchro_erreur') . '</p>'; $alt = _T('info_avertissement'); $img = _DIR_PLUGIN_GALETTONUTS . 'img_pack/error-48.png'; break; // Des erreurs sont survenues lors de la connexion à la BDD. // Des erreurs sont survenues lors de la connexion à la BDD. case -2: $msg = '<p class="verdana2"><strong>' . _T('info_avertissement') . '</strong><br />'; $msg .= _T('galettonuts:etat_synchro_erreur_bdd') . '</p>'; $alt = _T('info_avertissement'); $img = _DIR_PLUGIN_GALETTONUTS . 'img_pack/error-48.png'; break; // La synchronisation a échouée. // La synchronisation a échouée. case -1: $msg = '<p class="verdana2"><strong>' . _T('info_avertissement') . '</strong><br />'; $msg .= _T('galettonuts:etat_synchro_echec') . '</p>'; $alt = _T('info_avertissement'); $img = _DIR_PLUGIN_GALETTONUTS . 'img_pack/error-48.png'; break; // La synchronisation est inutile. // La synchronisation est inutile. case -10: $msg = '<p class="verdana2"><strong>' . _T('galettonuts:info_information') . '</strong><br />'; $msg .= _T('galettonuts:etat_synchro_inutile') . '</p>'; $alt = _T('galettonuts:info_information'); $img = _DIR_PLUGIN_GALETTONUTS . 'img_pack/information-48.png'; break; // La synchronisation s'est déroulée correctement // La synchronisation s'est déroulée correctement default: $msg = '<p class="verdana2"><strong>' . _T('galettonuts:info_information') . '</strong><br />'; $msg .= _T('galettonuts:etat_synchro_ok', array('nb' => $statut)) . '</p>'; $alt = _T('galettonuts:info_information'); $img = _DIR_PLUGIN_GALETTONUTS . 'img_pack/information-48.png'; break; } $return .= debut_cadre_relief('', true); $return .= http_img_pack($img, $alt, 'style="width:48px;height:48px;float:right;margin:5px;"'); $return .= $msg; $return .= fin_cadre_relief(true); } $voir_statut = _request('statut'); if ($voir_statut) { $voir_statut = '&statut=' . $voir_statut; } $action = generer_action_auteur('galettonuts_cron_manuel', 'galettonuts-0.1&' . $voir_statut, 'auteurs'); $return .= '<p class="verdana2">' . _T('galettonuts:texte_synchro_manuelle') . '</p>'; $return .= '<form action="' . $action . '" method="post>"'; $return .= form_hidden($action); // Dernière mise à jour $synchro = new L2_Spip_Plugin_Metas('galettonuts_synchro'); if ('' != ($maj = $synchro->lire('maj'))) { $return .= '<p class="verdana2">' . _T('galettonuts:derniere_maj', array('annee' => date('Y', $maj), 'mois' => date('m', $maj), 'jour' => date('d', $maj), 'heures' => date('G', $maj), 'minutes' => date('i', $maj), 'secondes' => date('s', $maj))); $return .= '</p>'; } // Bouton de validation $return .= '<div style="text-align:right;padding:0 2px;margin-top:.5em" id="buttons">'; $return .= '<input type="submit" name="_galettonuts_ok" value="' . _T('galettonuts:entree_synchroniser') . '" class="fondo" style="cursor:pointer"/></div>'; $return .= '</form>'; $return .= fin_block(); $return .= fin_cadre_couleur(true); return $return; }
/** * 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; } }