Beispiel #1
0
/**
 * 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));
		}
	}
}
Beispiel #3
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;
}
Beispiel #5
0
/**
 * 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));
}
Beispiel #6
0
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));
}
Beispiel #8
0
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;
}
Beispiel #9
0
/**
 * 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);
	}
}
Beispiel #10
0
/**
 * 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');
}
Beispiel #13
0
/**
 * 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;
}
Beispiel #14
0
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);
    }
}
Beispiel #15
0
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;
}
Beispiel #16
0
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");
    }
}
Beispiel #18
0
/**
 * 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;
}
Beispiel #19
0
/**
 * 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);
}
Beispiel #20
0
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&eacute;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;
}
Beispiel #21
0
/**
 * 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);
}
Beispiel #23
0
/**
 * 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;
}
Beispiel #24
0
/**
 * 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;
}
Beispiel #25
0
/**
 * 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;
}
Beispiel #27
0
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");
}
Beispiel #28
0
/**
 * 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);
        }
    }
}
Beispiel #29
0
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;
}
Beispiel #30
0
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 . '&nbsp;: '. _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);
	}
}