/** * Calcule la description de chaque paquet local * * Les paquets peuvent être stockés à 3 endroits : * plugins, plugins-dist, plugins-supp définis par les constantes respectives * _DIR_PLUGINS, _DIR_PLUGINS_DIST, _DIR_PLUGINS_SUPP * * @param array $erreurs_xml * Les erreurs XML éventuelles des paquet.xml se retrouvent dedans s'il y en a * @return array * Descriptions des paquets (intégrant un hash), stockés par * constante, puis par chemin. * array[_DIR_PLUGIN*][$chemin] = description **/ function svp_descriptions_paquets_locaux(&$erreurs_xml = array()) { include_spip('inc/plugin'); liste_plugin_files(_DIR_PLUGINS); liste_plugin_files(_DIR_PLUGINS_DIST); $get_infos = charger_fonction('get_infos', 'plugins'); $paquets_locaux = array('_DIR_PLUGINS' => $get_infos(array(), false, _DIR_PLUGINS), '_DIR_PLUGINS_DIST' => $get_infos(array(), false, _DIR_PLUGINS_DIST)); if (defined('_DIR_PLUGINS_SUPPL') and _DIR_PLUGINS_SUPPL) { liste_plugin_files(_DIR_PLUGINS_SUPPL); $paquets_locaux['_DIR_PLUGINS_SUPPL'] = $get_infos(array(), false, _DIR_PLUGINS_SUPPL); } // creer la liste des signatures foreach ($paquets_locaux as $const_dir => $paquets) { foreach ($paquets as $chemin => $paquet) { // on propose le paquet uniquement s'il n'y a pas eu d'erreur de lecture XML bloquante if (!isset($paquet['erreur'])) { $paquets_locaux[$const_dir][$chemin]['signature'] = md5($const_dir . $chemin . serialize($paquet)); } else { // Erreur XML ! unset($paquets_locaux[$const_dir][$chemin]); spip_log("Impossible de lire la description XML de {$chemin} . Erreurs :", 'svp.' . _LOG_ERREUR); spip_log($paquet['erreur'], 'svp.' . _LOG_ERREUR); $erreurs_xml[] = $paquet['erreur'][0]; } } } return $paquets_locaux; }
function action_dereferencer_traduction_rubrique_dist() { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); list($type, $id_objet) = explode('/', $arg); if (!$type = objet_type($type) or !$id_objet = intval($id_objet)) { if (!_AJAX) { include_spip('inc/minipres'); minipres('Arguments incompris'); } else { spip_log('Arguments incompris dans action dereferencer_traduction_rubrique'); return false; } } $objet = table_objet($type); $_id_objet = id_table_objet($objet); $table = table_objet_sql($objet); $id_trad_old = sql_getfetsel('id_trad', $table, "$_id_objet = " . sql_quote($id_objet)); if ($id_trad_old) { include_spip('inc/modifier'); modifier_contenu($objet, $id_objet, array('invalideur' => "id='$objet/$id_objet'"), array('id_trad' => 0)); // si la deliaison fait qu'il ne reste plus que la source // dans le groupe de traduction on lui remet l'id_trad a 0 if (1 == $nb_dans_groupe = sql_countsel($table, array('id_trad = ' . sql_quote($id_trad_old)))) { modifier_contenu($objet, $id_trad_old, array('invalideur' => "id='$objet/$id_trad_old'"), array('id_trad' => 0)); } } }
/** * Editer ou créer un auteur * * @link http://doc.spip.org/@action_editer_auteur_dist * @global array $GLOBALS['visiteur_session'] * @param array $arg * @return array */ function action_editer_auteur_dist($arg = null) { if (is_null($arg)) { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); } // si id_auteur n'est pas un nombre, c'est une creation if (!($id_auteur = intval($arg))) { if (($id_auteur = auteur_inserer()) > 0) { # cf. GROS HACK # recuperer l'eventuel logo charge avant la creation # ils ont un id = 0-id_auteur de la session $id_hack = 0 - $GLOBALS['visiteur_session']['id_auteur']; $chercher_logo = charger_fonction('chercher_logo', 'inc'); if (list($logo) = $chercher_logo($id_hack, 'id_auteur', 'on')) { rename($logo, str_replace($id_hack, $id_auteur, $logo)); } if (list($logo) = $chercher_logo($id_hack, 'id_auteur', 'off')) { rename($logo, str_replace($id_hack, $id_auteur, $logo)); } } } // Enregistre l'envoi dans la BD $err = ""; if ($id_auteur > 0) { $err = auteur_modifier($id_auteur); } if ($err) { spip_log("echec editeur auteur: {$err}", _LOG_ERREUR); } return array($id_auteur, $err); }
function genie_clevermail_auto_ajout_abonnes_dist() { if ($autoListes = sql_select("lst_id, lst_name, lst_auto_subscribers, lst_auto_subscribers_mode", "spip_cm_lists", "lst_auto_subscribers != '' AND lst_auto_subscribers_updated < " . (time() - 60 * 60 * 24))) { include_spip('inc/distant'); while ($liste = sql_fetch($autoListes)) { if ($adresses = recuperer_page($liste['lst_auto_subscribers'])) { if (!clevermail_verification_adresses_email($adresses)) { // XXX : log en chaîne de langue spip_log('Le format des adresses e-mail ne semble pas bon dans le fichier distant d\'adresses de la liste « ' . $liste['lst_name'] . ' » (id=' . $liste['lst_id'] . ') : ' . $liste['lst_auto_subscribers'], 'clevermail'); } else { $retour = clevermail_abonnes_ajout(array($liste['lst_id']), intval($liste['lst_auto_subscribers_mode']), $adresses); sql_updateq("spip_cm_lists", array('lst_auto_subscribers_updated' => time()), "lst_id=" . $liste['lst_id']); // XXX : log en chaîne de langue $msg = 'Ajout automatique d\'abonnés à la liste « ' . $liste['lst_name'] . ' » (id=' . $liste['lst_id'] . ') à partir du fichier ' . $liste['lst_auto_subscribers'] . ' : '; if ($retour === false) { $msg .= _T('clevermail:aucun_nouvel_abonne'); } else { $msg .= $retour['nb_nouv'] > 0 ? $retour['nb_nouv'] . _T('clevermail:n_nouveaux_abonnes') : _T('clevermail:aucun_nouvel_abonne'); $msg .= $retour['nb_nouv'] > 0 && $retour['nb_maj'] > 0 ? _T('clevermail:nouveaux_abonnes_et') : ''; $msg .= $retour['nb_maj'] > 0 ? $retour['nb_maj'] . _T('clevermail:changements_mode_abonnement') : ''; spip_log($msg, 'clevermail'); } } } else { // XXX : log en chaîne de langue spip_log('Impossible de télécharger le fichier distant d\'adresses de la liste « ' . $liste['lst_name'] . ' » (id=' . $liste['lst_id'] . ') : ' . $liste['lst_auto_subscribers'], 'clevermail'); } } } return 1; }
/** * mise a jour des donnees si envoi via formulaire * * @link http://doc.spip.org/@enregistre_modif_plugin * @global array $GLOBALS['visiteur_session'] * @global array $GLOBALS['meta'] * @return void */ function enregistre_modif_plugin() { include_spip('inc/plugin'); // recuperer les plugins dans l'ordre des $_POST $test = array(); foreach (liste_plugin_files() as $file) { $test['s' . substr(md5($file), 0, 16)] = $file; } $plugin = array(); foreach ($_POST as $choix => $val) { if (isset($test[$choix]) && $val == 'O') { $plugin[] = $test[$choix]; } } spip_log("Changement des plugins actifs par l'auteur " . $GLOBALS['visiteur_session']['id_auteur'] . ": " . join(',', $plugin)); ecrire_plugin_actifs($plugin); // Chaque fois que l'on valide des plugins, on memorise la liste de ces plugins comme etant "interessants", avec un score initial, qui sera decremente a chaque tour : ainsi un plugin active pourra reter visible a l'ecran, jusqu'a ce qu'il tombe dans l'oubli. $plugins_interessants = @unserialize($GLOBALS['meta']['plugins_interessants']); if (!is_array($plugins_interessants)) { $plugins_interessants = array(); } $plugins_interessants2 = array(); foreach ($plugins_interessants as $plug => $score) { if ($score > 1) { $plugins_interessants2[$plug] = $score - 1; } } foreach ($plugin as $plug) { $plugins_interessants2[$plug] = 10; } // score initial ecrire_meta('plugins_interessants', serialize($plugins_interessants2)); }
function inc_meta_dist($table = 'meta') { // Lire les meta, en cache si present, valide et lisible // en cas d'install ne pas faire confiance au meta_cache eventuel $cache = cache_meta($table); if ((_request('exec') !== 'install' or !test_espace_prive()) and $new = jeune_fichier($cache, _META_CACHE_TIME) and lire_fichier_securise($cache, $meta) and $meta = @unserialize($meta)) { $GLOBALS[$table] = $meta; } if (isset($GLOBALS[$table]['touch']) and $GLOBALS[$table]['touch'] < time() - _META_CACHE_TIME) { $GLOBALS[$table] = array(); } // sinon lire en base if (!$GLOBALS[$table]) { $new = !lire_metas($table); } // renouveller l'alea general si trop vieux ou sur demande explicite if (test_espace_prive() || isset($_GET['renouvelle_alea']) and $GLOBALS[$table] and time() > _RENOUVELLE_ALEA + $GLOBALS['meta']['alea_ephemere_date']) { // si on n'a pas l'acces en ecriture sur le cache, // ne pas renouveller l'alea sinon le cache devient faux if (supprimer_fichier($cache)) { include_spip('inc/acces'); renouvelle_alea(); $new = false; } else { spip_log("impossible d'ecrire dans " . $cache); } } // et refaire le cache si on a du lire en base if (!$new) { touch_meta(false, $table); } }
/** * http://code.spip.net/@action_copier_local_post * * @param $id_document * @return bool|mixed|string */ function action_copier_local_post($id_document) { // Il faut la source du document pour le copier $row = sql_fetsel("mode,fichier, descriptif, credits", "spip_documents", "id_document={$id_document}"); $source = $row['fichier']; include_spip('inc/distant'); // pour 'copie_locale' $fichier = copie_locale($source); if ($fichier) { $fichier = _DIR_RACINE . $fichier; $files[] = array('tmp_name' => $fichier, 'name' => basename($fichier)); $ajouter_documents = charger_fonction('ajouter_documents', 'action'); spip_log("convertit doc {$id_document} en local: {$source} => {$fichier}"); $liste = array(); $ajouter_documents($id_document, $files, '', 0, $row['mode'], $liste); spip_unlink($fichier); // ajouter l'origine du document aux credits include_spip('action/editer_document'); document_modifier($id_document, array('credits' => ($row['credits'] ? $row['credits'] . ', ' : '') . $source)); return true; } else { spip_log("echec copie locale {$source}"); } return _T('medias:erreur_copie_fichier', array('nom' => $source)); }
function pack_cQuery($chemin) { $flux = spip_file_get_contents($chemin); $flux = str_replace('jQuery', 'cQuery', $flux); // On ne compacte PAS deux fois (c'est inutile et en plus ca bugge) if (!strlen($flux) // mode debug des crayons OR _request('debug_crayons') // le vieil auto_compress_js OR ($GLOBALS['meta']['auto_compress_js'] == 'oui' AND @file_exists(_DIR_RESTREINT.'inc/compacte_js.php')) // ou l'espace prive OR !function_exists('test_espace_prive') OR test_espace_prive()) return $flux; include_spip('lib/JavaScriptPacker/class.JavaScriptPacker'); $packer = new JavaScriptPacker($flux, 0, true, false); // en cas d'echec (?) renvoyer l'original if (strlen($t = $packer->pack())) return $t; // erreur spip_log('erreur de pack_js'); return $flux; }
/** * Log une information * * @param mixed $contenu * Contenu à loger * @param bool $important * Est-ce une info importante à loger ? */ function extras_log($contenu, $important=false) { if ($important) { spip_log($contenu, 'extras.'. _LOG_INFO); } else { spip_log($contenu, 'extras.'. _LOG_INFO_IMPORTANTE); } }
/** * Jamais appele directement dans le plugin bank/ * mais par une eventuelle methode abos/resilier d'un plugin externe * * @param string $uid * @param array|string $config * @return bool */ function presta_stripe_call_resilier_abonnement_dist($uid, $config = 'stripe') { include_spip('inc/bank'); $trans = sql_fetsel("mode, pay_id", "spip_transactions", "abo_uid=" . sql_quote($uid) . " AND mode LIKE " . sql_quote($config . '%'), '', 'id_transaction', '0,1'); if (!is_array($config)) { $config = bank_config($trans['mode']); } $mode = $config['presta']; // charger l'API Stripe avec la cle stripe_init_api($config); $erreur = $erreur_code = ''; try { if ($sub = \Stripe\Subscription::retrieve($uid)) { $res = $sub->cancel(); if ($res->status != 'canceled') { $erreur = 'cancel failed' . var_export((array) $res, true); } } else { $erreur = "unknown subscription"; } } catch (Exception $e) { if ($body = $e->getJsonBody()) { $err = $body['error']; list($erreur_code, $erreur) = stripe_error_code($err); } else { $erreur = $e->getMessage(); $erreur_code = 'error'; } } if ($erreur or $erreur_code) { spip_log($s = "call_resilier_abonnement {$uid} : erreur {$erreur_code} - {$erreur}", $mode . _LOG_ERREUR); return false; } return true; }
function notifications_instituerarticle_dist($quoi, $id_article, $options) { // ne devrait jamais se produire if ($options['statut'] == $options['statut_ancien']) { spip_log("statut inchange", 'notifications'); return; } include_spip('inc/texte'); $modele = ""; if ($options['statut'] == 'publie') { if ($GLOBALS['meta']["post_dates"] == 'non' and strtotime($options['date']) > time()) { $modele = "notifications/article_valide"; } else { $modele = "notifications/article_publie"; } } if ($options['statut'] == 'prop' and $options['statut_ancien'] != 'publie') { $modele = "notifications/article_propose"; } if ($modele) { $destinataires = array(); if ($GLOBALS['meta']["suivi_edito"] == "oui") { $destinataires = explode(',', $GLOBALS['meta']["adresse_suivi"]); } $destinataires = pipeline('notifications_destinataires', array('args' => array('quoi' => $quoi, 'id' => $id_article, 'options' => $options), 'data' => $destinataires)); $texte = email_notification_article($id_article, $modele); notifications_envoyer_mails($destinataires, $texte); } }
function action_clevermail_list_subscriber_clear_dist() { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); if (sql_countsel("spip_cm_lists_subscribers AS list, spip_cm_subscribers AS sub", "list.sub_id = sub.sub_id AND sub.sub_email LIKE '*****@*****.**'")) { $subscribers = sql_select("sub.sub_id", "spip_cm_lists_subscribers AS list, spip_cm_subscribers AS sub", "list.sub_id = sub.sub_id AND sub.sub_email LIKE '*****@*****.**'", "list.sub_id", "", ""); $sub_deleted = ""; while ($subscriber = sql_fetch($subscribers)) { sql_delete("spip_cm_lists_subscribers", "sub_id = " . intval($subscriber['sub_id'])); sql_delete("spip_cm_pending", "sub_id = " . intval($subscriber['sub_id'])); $sub_deleted = $sub_deleted . ' ' . intval($subscriber['sub_id']); } spip_log('Suppression des abonnements ' . $sub_deleted, 'clevermail'); } else { spip_log('Il n\'y a pas d\'abonnement à supprimer', 'clevermail'); } if (sql_countsel("spip_cm_lists_subscribers", "", "lsr_id", "count(lsr_id) > 1") > 1) { $doublons = sql_select("lsr_id", "spip_cm_lists_subscribers", "", "lsr_id", "", "", "count(lsr_id) > 1"); while ($doublon = sql_fetch($doublons)) { $lists = sql_select("lst_id, sub_id", "spip_cm_lists_subscribers", "lsr_id ='" . $doublon['lsr_id'] . "'"); while ($list = sql_fetch($lists)) { sql_updateq("spip_cm_lists_subscribers", array('lsr_id' => md5('subscribe#' . intval($list['lst_id']) . '#' . intval($list['sub_id']) . '#' . time())), "lst_id=" . sql_quote($list['lst_id']) . " AND sub_id=" . sql_quote($list['sub_id'])); } } } //Récupération du timestamp du mois dernier $today = time(); $date_today = date("d:m:Y", $today); $today_exploded = explode(":", $date_today); $mois = (int) $today_exploded[1]; $mois = --$mois; $valid_date = mktime(0, 0, 0, $mois, $today_exploded[0], $today_exploded[2]); sql_delete("spip_cm_pending", "pnd_action_date <" . $valid_date); spip_log('Suppression des abonnements en attente depuis plus d\'un mois', 'clevermail'); }
/** * Vérifier si une table a crashé * * Pour cela, on vérifie si on peut se connecter à la base de données. * * @see message_crash_tables() * * @return bool|array * Si pas de table de crashée, on retourne `false`. * Sinon, retourne un tableau contenant tous les noms * des tables qui ont crashé. */ function verifier_crash_tables() { if (spip_connect()) { include_spip('base/serial'); include_spip('base/auxiliaires'); $crash = array(); foreach (array('tables_principales', 'tables_auxiliaires') as $com) { foreach ($GLOBALS[$com] as $table => $desc) { if (!sql_select('*', $table, '', '', '', 1) and !defined('spip_interdire_cache')) { # cas "LOST CONNECTION" $crash[] = $table; } } } #$crash[] = 'test'; if ($crash) { ecrire_meta('message_crash_tables', serialize($crash)); spip_log('crash des tables', 'err'); spip_log($crash, 'err'); } else { effacer_meta('message_crash_tables'); } return $crash; } return false; }
function action_autoriser_dist() { $arg = intval(_request('arg')); if (!autoriser('voir', 'document', $arg) or !($row = sql_fetsel("fichier", "spip_documents", "id_document=" . intval($arg))) or !($file = $row['fichier']) or !file_exists($file)) { spip_log("Acces refuse (restreint) au document " . $arg . ': ' . $file); redirige_par_entete('./?page=404'); } else { if (!function_exists('mime_content_type')) { // http://doc.spip.org/@mime_content_type function mime_content_type($f) { preg_match("/\\.(\\w+)/", $f, $r); return $r[1]; } } $ct = mime_content_type($file); $cl = filesize($file); $filename = basename($file); header("Content-Type: " . $ct); header("Content-Disposition: attachment; filename=\"" . $filename . "\";"); if ($dcc) { header("Content-Description: " . $dcc); } if ($cl) { header("Content-Length: " . $cl); } header("Content-Transfer-Encoding: binary"); readfile($file); } }
function profils_creer_auteur($set) { include_spip("action/editer_auteur"); include_spip('inc/acces'); $id_auteur = auteur_inserer(); spip_log($id_auteur, 'profils'); spip_log($set, 'profils'); if ($id_auteur) { $set['pass'] = creer_pass_aleatoire(); $set['statut'] = '6forum'; autoriser_exception('modifier', 'auteur', $id_auteur); autoriser_exception('instituer', 'auteur', $id_auteur); auteur_modifier($id_auteur, $set); autoriser_exception('modifier', 'auteur', $id_auteur, false); autoriser_exception('instituer', 'auteur', $id_auteur, false); // verifier $row = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . intval($id_auteur)); if (!$row['login'] or !$row['email']) { spip_log("Erreur creation profil {$id_auteur} " . var_export($set, true), "profils" . _LOG_ERREUR); return false; } $row['pass'] = $set['pass']; return $row; } return false; }
function action_referencer_traduction_dist() { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); if (preg_match(",^(\d+)$,", $arg, $r) AND $trad = intval(_request('lier_trad'))) { include_spip('action/editer_article'); if ($err = article_referent($r[1], array('lier_trad' => $trad))) redirige_par_entete(urldecode(_request('redirect')) . $err); } elseif (preg_match(",^(\d+)\D-(\d+)$,", $arg, $r)) { // supprimer le lien de traduction sql_updateq("spip_articles", array("id_trad" => 0), "id_article=" . $r[1]); // Verifier si l'ancien groupe ne comporte plus qu'un seul article. Alors mettre a zero. $cpt = sql_countsel("spip_articles", "id_trad=" . $r[2]); if ($cpt == 1) sql_updateq("spip_articles", array("id_trad" => 0), "id_trad=" . $r[2]); } elseif (preg_match(",^(\d+)\D(\d+)\D(\d+)$,", $arg, $r)) { // modifier le groupe de traduction de $r[1] (SQL le trouvera) sql_update('spip_articles', array("id_trad" => $r[3]), "id_trad=" . $r[2]); } elseif (preg_match(",^(\d+)\D(\d+)$,", $arg, $r)) { instituer_langue_article($r[1],$r[2]); } else { spip_log("action_referencer_traduction_dist $arg pas compris"); } }
/** * Dissocier un document * * @param string $arg * fournit les arguments de la fonction dissocier_document * sous la forme `$id_objet-$objet-$document-suppr-safe` * * - 4eme arg : suppr = true, false sinon * - 5eme arg : safe = true, false sinon * * @return void */ function action_dissocier_document_dist($arg = null) { if (is_null($arg)) { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); } // attention au cas ou id_objet est negatif ! if (strncmp($arg, '-', 1) == 0) { $arg = explode('-', substr($arg, 1)); list($id_objet, $objet, $document) = $arg; $id_objet = -$id_objet; } else { $arg = explode('-', $arg); list($id_objet, $objet, $document) = $arg; } $suppr = $check = false; if (count($arg) > 3 and $arg[3] == 'suppr') { $suppr = true; } if (count($arg) > 4 and $arg[4] == 'safe') { $check = true; } if ($id_objet = intval($id_objet) and ($id_objet < 0 and $id_objet == -$GLOBALS['visiteur_session']['id_auteur'] or autoriser('dissocierdocuments', $objet, $id_objet))) { dissocier_document($document, $objet, $id_objet, $suppr, $check); } else { spip_log("Interdit de modifier {$objet} {$id_objet}", "spip"); } }
/** * recuperer la transaction et son abonnement associe par id_transaction ou par abo_uid * et verifier que c'est bien le bon * noter dessus qu'on a eventuellement reussi le paiement, * passer l'abonnement en etat actif si besoin, et mettre a jour la date de fin si validite fournie * * Attention, avec certains prestataires ou modes de paiement (SEPA), on va arriver ici parce que l'abonnement a bien * ete cree, mais la premiere echeance n'est pas encore reglee (et ne le sera que dans 2 semaines) * C'est a l'abonnement de voir si il s'active temporairement en periode d'essai en attendant le vrai paiement * ou si il ne fait rien et attend le paiement de la premiere echeance * Dans ce cas de figure, on reviendra a nouveau ici une seconde fois, quand la premiere echeance sera reellement reglee * * * @param int $id_transaction * @param string $abo_uid * numero d'abonne chez le presta bancaire * @param string $mode_paiement * mode de paiement (presta bancaire) * @param string $validite * date de fin validite du moyen de paiement (expiration de la CB) * ou "echeance" pour dire que l'abonnement s'arrete automatiquement a la prochaine echeance * @param int $id_auteur * @return bool|int * false si pas reussi */ function abos_activer_abonnement_dist($id_transaction, $abo_uid, $mode_paiement, $validite = "", $id_auteur = 0) { $id_abonnement = 0; spip_log("abos/activer_abonnement id_transaction={$id_transaction} abo_uid={$abo_uid} mode={$mode_paiement} validite={$validite}", "bank"); $id_abonnement = pipeline('bank_abos_activer_abonnement', array('args' => array('id_transaction' => $id_transaction, 'abo_uid' => $abo_uid, 'mode_paiement' => $mode_paiement, 'validite' => $validite, 'id_auteur' => $id_auteur), 'data' => $id_abonnement)); return $id_abonnement; }
/** * il faut avoir un id_transaction et un transaction_hash coherents * pour se premunir d'une tentative d'appel exterieur * * * @return array */ function presta_virement_call_response() { // recuperer la reponse en post et la decoder $id_transaction = _request('id_transaction'); $transaction_hash = _request('hash'); $mode = 'virement'; if (!($row = sql_fetsel('*', 'spip_commandes_transactions', 'id_transaction=' . intval($id_transaction)))) { spip_log("id_transaction {$id_transaction} non trouve", 'gratuit.' . _LOG_ERREUR); return array($id_transaction, false); } if ($transaction_hash != $row['transaction_hash']) { spip_log("id_transaction {$id_transaction}, hash {$transaction_hash} non conforme", 'gratuit.' . _LOG_ERREUR); return array($id_transaction, false); } if ($row['statut'] == 'ok') { spip_log("Check:Transaction {$id_transaction} deja validee", "virement"); return array($id_transaction, true); } // si pages publiques, c'est le client qui demande à payer par virement if (!test_espace_prive()) { $bank_recoit_notification = charger_fonction('recoit_notification', 'bank'); return bank_recoit_notification($id_transaction, $transaction_hash, $mode); //retourne $id_transaction,true } return array($id_transaction, false); }
function action_bank_response_dist($cancel = null, $auto = null) { if (isset($GLOBALS['meta']['bank_paiement']) and $prestas = unserialize($GLOBALS['meta']['bank_paiement']) and count($prestas = $prestas['presta'])) { $auto = $auto ? "auto" : ""; $result = false; // intercepter les retours depuis un presta actif if ($p = _request('bankp') and (isset($prestas[$p]) and $prestas[$p] or $p == 'gratuit')) { $call_response = charger_fonction('response', "presta/{$p}/call"); spip_log('call_' . $auto . 'response : ' . $_SERVER['REQUEST_URI'], "{$p}{$auto}"); list($id_transaction, $result) = $call_response(); spip_log('call_' . $auto . 'response : ' . "{$id_transaction}/{$result}", "{$p}{$auto}"); } else { spip_log("Prestataire {$p} inconnu ou inactif", 'bank_response'); } // fall back si le presta n'a rien renvoye de lisible // et qu'on a bien id=id_transaction;hash dans l'url if (!$result and !$id_transaction and $id = _request('id') and $id = explode(';', $id) and count($id) == 2 and $id_transaction = reset($id) and $hash = end($id)) { $id_transaction = sql_getfetsel("id_transaction", "spip_transactions", "id_transaction=" . intval($id_transaction) . " AND transaction_hash=" . sql_quote($hash)); if ($id_transaction) { sql_updateq("spip_transactions", array('message' => 'Transaction annulée', 'statut' => 'echec', 'mode' => $p), 'id_transaction=' . intval($id_transaction) . " AND statut='commande'"); } } if (!$auto) { redirige_apres_retour_transaction($p, 'acte', $cancel ? false : $result, $id_transaction); } die; // mourir silencieusement } else { spip_log('Aucun prestataire de paiement configure', 'bank_response'); } die; }
/** * Exec de la page de destruction des tables de SPIP **/ function exec_base_delete_all_dist() { include_spip('inc/autoriser'); if (!autoriser('detruire')) { include_spip('inc/minipres'); echo minipres(); } else { include_spip('base/dump'); $res = base_lister_toutes_tables('', array(), array(), true); if (!$res) { include_spip('inc/minipres'); spip_log("Erreur base de donnees"); echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique') . "<p><tt>" . sql_errno() . " " . sql_error() . "</tt></p>"); } else { $res = base_saisie_tables('delete', $res); include_spip('inc/headers'); $res = "\n<ol style='text-align:left'><li>\n" . join("</li>\n<li>", $res) . '</li></ol>'; $admin = charger_fonction('admin', 'inc'); $res = $admin('delete_all', _T('titre_page_delete_all'), $res); if (!$res) { redirige_url_ecrire('install', ''); } else { echo $res; } } } }
/** * Generer un ticket resume de la transaction * pour les admins indiques dans la configuration * * @param int $id_transaction * @param string $sujet */ function inc_bank_editer_ticket_admin_dist($id_transaction, $sujet = "Transaction OK") { // il faut avoir configure un ou des emails de notification $c = unserialize($GLOBALS['meta']['bank_paiement']); if (!isset($c['email_ticket_admin']) or !strlen($email = $c['email_ticket_admin'])) { spip_log(var_export($GLOBALS['meta']['bank_paiement'], true), 'bank_ticket'); return; } $ticket = ""; if ($row = sql_fetsel("*", "spip_transactions", "id_transaction=" . intval($id_transaction))) { $montant = $row['montant_regle']; $ticket .= "<h2>Transaction {$id_transaction}</h2>\n<table border='1'>"; foreach ($row as $k => $v) { $ticket .= "<tr><td>{$k}</td><td>{$v}</td></tr>"; } $ticket .= "</table>"; } // ensuite un pipeline pour editer le ticket $ticket = pipeline('bank_editer_ticket_reglement', array('args' => array('id_transaction' => $id_transaction), 'data' => $ticket)); $ticket = "<html>{$ticket}</html>"; $header = "MIME-Version: 1.0\n" . "Content-Type: text/html; charset=" . $GLOBALS['meta']['charset'] . "\n" . "Content-Transfer-Encoding: 8bit\n"; $sujet = "{$sujet} #{$id_transaction} [" . affiche_monnaie($montant) . "]"; if (!isset($c['email_from_ticket_admin']) or !strlen($email_from = $c['email_from_ticket_admin'])) { $url = parse_url($GLOBALS['meta']['adresse_site']); $email_from = "reglements@" . ltrim($url['host'], 'w.'); } $envoyer_mail = charger_fonction('envoyer_mail', 'inc'); $envoyer_mail($email, $sujet, $ticket, $email_from, $header); }
/** * Envoi du Mail des nouveautés * * Ce mail est basé sur le squelette nouveautes.html * * La meta `dernier_envoi_neuf` permet de marquer la date du dernier envoi * et de determiner les nouveautes publiees depuis cette date * * @param int $t * @return int */ function genie_mail_dist($t) { $adresse_neuf = $GLOBALS['meta']['adresse_neuf']; $jours_neuf = $GLOBALS['meta']['jours_neuf']; $now = time(); if (!isset($GLOBALS['meta']['dernier_envoi_neuf'])) { ecrire_meta('dernier_envoi_neuf', date('Y-m-d H:i:s', $now - 3600 * 24 * $jours_neuf)); } $page = recuperer_fond('nouveautes', array('date' => $GLOBALS['meta']['dernier_envoi_neuf'], 'jours_neuf' => $jours_neuf), array('raw' => true)); if (strlen(trim($page['texte']))) { // recuperer les entetes envoyes par #HTTP_HEADER $headers = ""; if (isset($page['entetes']) and count($page['entetes'])) { foreach ($page['entetes'] as $k => $v) { $headers .= (strlen($v) ? "{$k}: {$v}" : $k) . "\n"; } } include_spip("inc/notifications"); notifications_envoyer_mails($adresse_neuf, $page['texte'], "", "", $headers); ecrire_meta('dernier_envoi_neuf', date('Y-m-d H:i:s', $now)); } else { spip_log("mail nouveautes : rien de neuf depuis {$jours_neuf} jours"); } return 1; }
/** * Renseigner les informations de taille et dimension d'un document * * Récupère les informations de taille (largeur / hauteur / type_image / taille) d'un document * Utilise pour cela les fonctions du répertoire metadatas/* * * Ces fonctions de récupérations peuvent retourner d'autres champs si ces champs sont définis * comme editable dans la déclaration de la table spip_documents * * TODO Renommer cette fonction sans "_image" * * @param string $fichier * Le fichier à examiner * @param string $ext * L'extension du fichier à examiner * @return array|string $infos * Si c'est une chaine, c'est une erreur * Si c'est un tableau, l'ensemble des informations récupérées du fichier */ function renseigner_taille_dimension_image($fichier, $ext) { $infos = array('largeur' => 0, 'hauteur' => 0, 'type_image' => '', 'taille' => 0); // Quelques infos sur le fichier if (!$fichier or !@file_exists($fichier) or !($infos['taille'] = @intval(filesize($fichier)))) { spip_log("Echec copie du fichier {$fichier}"); return _T('medias:erreur_copie_fichier', array('nom' => $fichier)); } // chercher une fonction de description $meta = array(); if ($metadata = charger_fonction($ext, "metadata", true)) { $meta = $metadata($fichier); } else { $media = sql_getfetsel('media_defaut', 'spip_types_documents', 'extension=' . sql_quote($ext)); if ($metadata = charger_fonction($media, "metadata", true)) { $meta = $metadata($fichier); } } $meta = pipeline('renseigner_document', array('args' => array('extension' => $ext, 'fichier' => $fichier), 'data' => $meta)); include_spip('inc/filtres'); # pour objet_info() $editables = objet_info('document', 'champs_editables'); foreach ($meta as $m => $v) { if (isset($infos[$m]) or in_array($m, $editables)) { $infos[$m] = $v; } } return $infos; }
/** * Envoi une requette de conversion a zencoder. * * @param int $id_document l'id du document original * @param int $id_objet */ function zencoder_new_job($id_document) { spip_log('start zencoder_new_job', 'zencoder'); $cwd = getcwd(); chdir(realpath(_DIR_ZENCODER_LIB)); require_once "Services/Zencoder.php"; chdir($cwd); include_spip('inc/config'); include_spip('inc/utils'); $api_key = lire_config('zencoder/api_key'); $document = generer_url_entite_absolue($id_document, 'document'); $url_notification = generer_url_action('zencoder_notification', 'id_document=' . $id_document, true, false); $clip_length = '10'; try { // Initialize the Services_Zencoder class $zencoder = new Services_Zencoder($api_key); // New Encoding Job $encoding_job = $zencoder->jobs->create(array("input" => $document, "outputs" => array(array("label" => "webm", "size" => "640x480", "format" => "webm", "notifications" => array("format" => "json", "url" => $url_notification, "clip_length" => $clip_length)), array("label" => "ogg", "format" => "ogg", "size" => "640x480", "notifications" => array("format" => "json", "url" => $url_notification, "clip_length" => $clip_length)), array("label" => "mp4 low", "size" => "640x480", "notifications" => array("format" => "json", "url" => $url_notification, "clip_length" => $clip_length))))); // Success if we got here spip_log('success- Job ID: ' . $encoding_job->id . ' Output ID:' . $encoding_job->outputs['web']->id, 'zencoder'); } catch (Services_Zencoder_Exception $e) { // If were here, an error occured spip_log('error: ' . print_r($e), 'zencoder'); } return; }
function hal_parse($url) { $url = trim(html_entity_decode($url), "\"' "); $infos = parse_url($url); $ip = gethostbyname($infos['host']); if ($ip != '193.48.96.10') { spip_log("Url invalid", _LOG_ERREUR); return; } spip_log(sprintf("[hal_parse] init_http(%s)", $url), _LOG_DEBUG); $content = recuperer_page($url); spip_log(sprintf("[hal_parse] init_http(%s): Done", $url), _LOG_DEBUG); $dom = new DomDocument('1.0', 'UTF-8'); $dom->preserveWhiteSpace = false; $str = mb_convert_encoding($content, "HTML-ENTITIES"); @$dom->loadHTML($str); $xpath = new DOMXpath($dom); $entries = $xpath->query('//div[@id="res_script"]'); if ($entries->length == 0) { spip_log("No tag found ...", _LOG_ERREUR); return; } $res_script = $dom->saveXML($entries->item(0)); return $res_script; }
function action_editer_message_dist($arg=null) { if (is_null($arg)){ $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); } if (preg_match(',^(\d+)$,', $arg, $r)) action_editer_message_post_vieux($arg); elseif (preg_match(',^-(\d+)$,', $arg, $r)) action_editer_message_post_supprimer($r[1]); elseif (preg_match(',^(\d+)\W$,', $arg, $r)) action_editer_message_post_choisir($r[1]); elseif (preg_match(',^(\d+)\W@(\d+)$,', $arg, $r)) action_editer_message_post_ajouter($r[1], $r[2]); elseif (preg_match(',^(\d+)\W:(\d+)$,', $arg, $r)) action_editer_message_post_vu($r[1], $r[2]); elseif (preg_match(',^(\d+)\W-(\d+)$,', $arg, $r)) action_editer_message_post_retirer($r[1], $r[2]); elseif (preg_match(',^(\d+)\W(\w+)$,', $arg, $r)) action_editer_message_post_envoyer($r[1], $r[2]); elseif (preg_match(',^(\w+)$,', $arg, $r)) action_editer_message_post_nouveau($arg); elseif (preg_match(',^(\w+)\W(\d+)$,', $arg, $r)) action_editer_message_post_nouveau($r[1], $r[2]); elseif (preg_match(',^(\w+)\W(\d+-\d+-\d+)$,', $arg, $r)) action_editer_message_post_nouveau($r[1], '', $r[2]); else spip_log("action_editer_message_dist $arg pas compris"); }
/** * Action de mise à jour en base de données de la liste des plugins * d'un ou de tous les dépots */ function action_actualiser_depot_dist() { // Securisation: aucun argument attendu $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); // Verification des autorisations if (!autoriser('webmestre')) { include_spip('inc/minipres'); echo minipres(); exit; } // Actualisation des plugins du depot ou de tous les plugins suivant l'argument de l'action // Le depot lui-meme n'est mis a jour que partiellement via le fichier XML une fois que // la premiere insertion a ete effectuee. En effet, seules les infos non editables dans le prive // peuvent etre actualisees lors de cette action include_spip('inc/svp_depoter_distant'); if ($arg === 'tout') { if ($ids_depots = sql_allfetsel('id_depot', 'spip_depots')) { $ids_depots = array_map('reset', $ids_depots); foreach ($ids_depots as $_id_depot) { svp_actualiser_depot($_id_depot); } // On consigne l'action spip_log("ACTION ACTUALISER TOUS LES DEPOTS (manuel)", 'svp_actions.' . _LOG_INFO); } } else { if ($id_depot = intval($arg)) { svp_actualiser_depot($id_depot); // On consigne l'action spip_log("ACTION ACTUALISER DEPOT (manuel) : id_depot = " . $id_depot, 'svp_actions.' . _LOG_INFO); } } }
function wha_check_offer_dist($id_abonnement) { $res = spip_query('SELECT * FROM spip_abonnements WHERE id_abonnement=' . intval($id_abonnement)); if (!($row = spip_fetch_array($res))) { return false; } if ($row['mode_paiement'] != 'wha' or !($uoid = $row['abonne_uid'])) { spip_log("wha_check_offer :Erreur : abonnement {$id_abonnement} n'a pas ete souscrit avec wha (ou pas d'uoid)", 'wha_abo_check'); return false; } if (!($confirm = $row['confirm']) or !($confirm = unserialize($confirm))) { spip_log("wha_check_offer :Erreur : abonnement {$id_abonnement} n'a pas d'url node enregistree", 'wha_abo_check'); return false; } $config = array('MERCHANT_ID' => $confirm['partner'], 'KEY_ID' => $confirm['key'], 'node' => $confirm['node']); $url_check = wha_url_check_abo($uoid, 'love', $config); include_spip('inc/distant'); $ack = @recuperer_page($url_check); spip_log($t = "wha_check_offer : reponse a {$url_check} : {$ack}", 'wha_abo_check'); if (!$ack or !($unsign = wha_unsign($ack)) or !($args = wha_extract_args(reset($unsign)))) { spip_log($t = "wha_check_offer : pas de reponse valide {$url_check} : {$ack}", 'wha_abo_check'); return null; } if (isset($args['c']) and $args['c'] == 'ack') { return true; } if (isset($args['e']) and in_array($args['e'], array(0, 1, 14, 15))) { return false; } return null; }
function minipres($titre='', $corps="", $onload='') { if (!defined('_AJAX')) define('_AJAX', false); if (!$titre) { if (!_AJAX) http_status(403); if (!$titre = _request('action') AND !$titre = _request('exec') AND !$titre = _request('page')) $titre = '?'; $titre = htmlspecialchars($titre); $titre = ($titre == 'install') ? _T('avis_espace_interdit') : $titre . ' : '. _T('info_acces_interdit'); $corps = generer_form_ecrire('accueil', '','',_T('public:accueil_site')); spip_log($GLOBALS['visiteur_session']['nom'] . " $titre " . $_SERVER['REQUEST_URI']); } if (!_AJAX) return install_debut_html($titre, $onload) . $corps . install_fin_html(); else { include_spip('inc/headers'); include_spip('inc/actions'); $url = self('&',true); foreach ($_POST as $v => $c) $url = parametre_url($url, $v, $c, '&'); echo ajax_retour("<div>".$titre . redirige_formulaire($url)."</div>",false); } }