* Copyright (C) 2002-2003 Jean-Louis Bergamo * Copyright (C) 2004-2013 Laurent Destailleur * Copyright (C) 2004 Sebastien Di Cintio * Copyright (C) 2004 Benoit Mortier * Copyright (C) 2009 Regis Houssin * Copyright (C) 2012 Marcos GarcĂ­a * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /** * \file htdocs/mailmanspip/class/mailmanspip.class.php * \ingroup member * \brief File of class to manage mailman and spip actions */ require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php'; require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; /** * Class to manage mailman and spip */ class MailmanSpip { var $db; var $error; var $mladded_ok; var $mladded_ko; var $mlremoved_ok; var $mlremoved_ko; /** * Constructor * * @param DoliDB $db Database handler */ function __construct($db) { $this->db = $db; } /** * Function used to check if SPIP is enabled on the system * * @return boolean */ function isSpipEnabled() { if (defined("ADHERENT_USE_SPIP") && (ADHERENT_USE_SPIP == 1)) { return true; } return false; } /** * Function used to check if the SPIP config is correct * * @return boolean */ function checkSpipConfig() { if (defined('ADHERENT_SPIP_SERVEUR') && defined('ADHERENT_SPIP_USER') && defined('ADHERENT_SPIP_PASS') && defined('ADHERENT_SPIP_DB')) { if (ADHERENT_SPIP_SERVEUR != '' && ADHERENT_SPIP_USER != '' && ADHERENT_SPIP_PASS != '' && ADHERENT_SPIP_DB != '') { return true; } } return false; } /** * Function used to connect to SPIP * * @return boolean|DoliDB Boolean of DoliDB */ function connectSpip() { $resource = getDoliDBInstance('mysql', ADHERENT_SPIP_SERVEUR, ADHERENT_SPIP_USER, ADHERENT_SPIP_PASS, ADHERENT_SPIP_DB, ADHERENT_SPIP_PORT); if ($resource->ok) { return $resource; } dol_syslog('Error when connecting to SPIP '.ADHERENT_SPIP_SERVEUR.' '.ADHERENT_SPIP_USER.' '.ADHERENT_SPIP_PASS.' '.ADHERENT_SPIP_DB, LOG_ERR); return false; } /** * Function used to connect to Mailman * * @param Adherent $object Object with the data * @param string $url Mailman URL to be called with patterns * @param string $list Name of mailing-list * @return mixed Boolean or string */ private function callMailman($object, $url, $list) { global $conf; //Patterns that are going to be replaced with their original value $patterns = array( '%LISTE%', '%EMAIL%', '%PASSWORD%', '%MAILMAN_ADMINPW%' ); $replace = array( $list, $object->email, $object->pass, $conf->global->ADHERENT_MAILMAN_ADMINPW ); $curl_url = str_replace($patterns, $replace, $url); dol_syslog('Calling Mailman: '.$curl_url); $ch = curl_init($curl_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FAILONERROR, true); @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, empty($conf->global->MAIN_USE_CONNECT_TIMEOUT)?5:$conf->global->MAIN_USE_CONNECT_TIMEOUT); curl_setopt($ch, CURLOPT_TIMEOUT, empty($conf->global->MAIN_USE_RESPONSE_TIMEOUT)?30:$conf->global->MAIN_USE_RESPONSE_TIMEOUT); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $result = curl_exec($ch); dol_syslog('result curl_exec='.$result); //An error was found, we store it in $this->error for later if ($result === false || curl_errno($ch) > 0) { $this->error = curl_errno($ch).' '.curl_error($ch); dol_syslog('Error using curl '.$this->error, LOG_ERR); } curl_close($ch); return $result; } /** * Fonction qui donne les droits redacteurs dans spip * * @param Adherent $object Object with data (->firstname, ->lastname, ->email and ->login) * @return int =0 if KO, >0 if OK */ function add_to_spip($object) { dol_syslog(get_class($this)."::add_to_spip"); if ($this->isSpipEnabled()) { if ($this->checkSpipConfig()) { $mydb = $this->connectSpip(); if ($mydb) { require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php'; $mdpass=dol_hash($object->pass); $htpass=crypt($object->pass,makesalt()); $query = "INSERT INTO spip_auteurs (nom, email, login, pass, htpass, alea_futur, statut) VALUES(\"".dolGetFirstLastname($object->firstname,$object->lastname)."\",\"".$object->email."\",\"".$object->login."\",\"$mdpass\",\"$htpass\",FLOOR(32000*RAND()),\"1comite\")"; $result = $mydb->query($query); $mydb->close(); if ($result) { return 1; } else $this->error = $mydb->lasterror(); } else $this->error = 'Failed to connect to SPIP'; } else $this->error = 'BadSPIPConfiguration'; } else $this->error = 'SPIPNotEnabled'; return 0; } /** * Fonction qui enleve les droits redacteurs dans spip * * @param Adherent $object Object with data (->login) * @return int =0 if KO, >0 if OK */ function del_to_spip($object) { dol_syslog(get_class($this)."::del_to_spip"); if ($this->isSpipEnabled()) { if ($this->checkSpipConfig()) { $mydb = $this->connectSpip(); if ($mydb) { $query = "DELETE FROM spip_auteurs WHERE login='".$object->login."'"; $result = $mydb->query($query); $mydb->close(); if ($result) { return 1; } else $this->error = $mydb->lasterror(); } else $this->error = 'Failed to connect to SPIP'; } else $this->error = 'BadSPIPConfiguration'; } else $this->error = 'SPIPNotEnabled'; return 0; } /** * Fonction qui dit si cet utilisateur est un redacteur existant dans spip * * @param object $object Object with data (->login) * @return int 1=exists, 0=does not exists, -1=error */ function is_in_spip($object) { if ($this->isSpipEnabled()) { if ($this->checkSpipConfig()) { $mydb = $this->connectSpip(); if ($mydb) { $query = "SELECT login FROM spip_auteurs WHERE login='".$object->login."'"; $result = $mydb->query($query); if ($result) { if ($mydb->num_rows($result)) { // nous avons au moins une reponse $mydb->close($result); return 1; } else { // nous n'avons pas de reponse => n'existe pas $mydb->close($result); return 0; } } else { $this->error = $mydb->lasterror(); $mydb->close(); } } else $this->error = 'Failed to connect to SPIP'; } else $this->error = 'BadSPIPConfiguration'; } else $this->error = 'SPIPNotEnabled'; return -1; } /** * Subscribe an email to all mailing-lists * * @param Adherent $object Object with data (->email, ->pass, ->element, ->type) * @param array $listes To force mailing-list (string separated with ,) * @return int <0 if KO, >=0 if OK */ function add_to_mailman($object,$listes='') { global $conf,$langs,$user; dol_syslog(get_class($this)."::add_to_mailman"); $this->mladded_ok=array(); $this->mladded_ko=array(); if (! function_exists("curl_init")) { $langs->load("errors"); $this->error=$langs->trans("ErrorFunctionNotAvailableInPHP","curl_init"); return -1; } if ($conf->adherent->enabled) // Synchro for members { if (! empty($conf->global->ADHERENT_MAILMAN_URL)) { if ($listes == '' && ! empty($conf->global->ADHERENT_MAILMAN_LISTS)) $lists=explode(',',$conf->global->ADHERENT_MAILMAN_LISTS); else $lists=explode(',',$listes); $categstatic=new Categorie($this->db); foreach ($lists as $list) { // Filter on type something (ADHERENT_MAILMAN_LISTS = "mailinglist0,TYPE:typevalue:mailinglist1,CATEG:categvalue:mailinglist2") $tmp=explode(':',$list); if (! empty($tmp[2])) { $list=$tmp[2]; if ($object->element == 'member' && $tmp[0] == 'TYPE' && $object->type != $tmp[1]) // Filter on member type label { dol_syslog("We ignore list ".$list." because object member type ".$object->type." does not match ".$tmp[1], LOG_DEBUG); continue; } if ($object->element == 'member' && $tmp[0] == 'CATEG' && ! in_array($tmp[1], $categstatic->containing($object->id, 'member', 'label'))) // Filter on member category { dol_syslog("We ignore list ".$list." because object member is not into category ".$tmp[1], LOG_DEBUG); continue; } } //We call Mailman to subscribe the user $result = $this->callMailman($object, $conf->global->ADHERENT_MAILMAN_URL, $list); if ($result === false) { $this->mladded_ko[$list]=$object->email; return -2; } else $this->mladded_ok[$list]=$object->email; } return count($lists); } else { $this->error="ADHERENT_MAILMAN_URL not defined"; return -1; } } } /** * Unsubscribe an email from all mailing-lists * Used when a user is resiliated * * @param Adherent $object Object with data (->email, ->pass, ->element, ->type) * @param array $listes To force mailing-list (string separated with ,) * @return int <0 if KO, >=0 if OK */ function del_to_mailman($object,$listes='') { global $conf,$langs,$user; dol_syslog(get_class($this)."::del_to_mailman"); $this->mlremoved_ok=array(); $this->mlremoved_ko=array(); if (! function_exists("curl_init")) { $langs->load("errors"); $this->error=$langs->trans("ErrorFunctionNotAvailableInPHP","curl_init"); return -1; } if ($conf->adherent->enabled) // Synchro for members { if (! empty($conf->global->ADHERENT_MAILMAN_UNSUB_URL)) { if ($listes=='' && ! empty($conf->global->ADHERENT_MAILMAN_LISTS)) $lists=explode(',',$conf->global->ADHERENT_MAILMAN_LISTS); else $lists=explode(',',$listes); $categstatic=new Categorie($this->db); foreach ($lists as $list) { // Filter on type something (ADHERENT_MAILMAN_LISTS = "mailinglist0,TYPE:typevalue:mailinglist1,CATEG:categvalue:mailinglist2") $tmp=explode(':',$list); if (! empty($tmp[2])) { $list=$tmp[2]; if ($object->element == 'member' && $tmp[0] == 'TYPE' && $object->type != $tmp[1]) // Filter on member type label { dol_syslog("We ignore list ".$list." because object member type ".$object->type." does not match ".$tmp[1], LOG_DEBUG); continue; } if ($object->element == 'member' && $tmp[0] == 'CATEG' && ! in_array($tmp[1], $categstatic->containing($object->id, 'member', 'label'))) // Filter on member category { dol_syslog("We ignore list ".$list." because object member is not into category ".$tmp[1], LOG_DEBUG); continue; } } //We call Mailman to unsubscribe the user $result = $this->callMailman($object, $conf->global->ADHERENT_MAILMAN_UNSUB_URL, $list); if ($result === false) { $this->mlremoved_ko[$list]=$object->email; return -2; } else $this->mlremoved_ok[$list]=$object->email; } return count($lists); } else { $this->error="ADHERENT_MAILMAN_UNSUB_URL not defined"; return -1; } } } }