439 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			439 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PHP
		
	
	
	
| <?php
 | |
| /*
 | |
|  $Id: m_mail.php,v 2.00 2012/03/12 06:26:16 anarcat Exp $
 | |
|  ----------------------------------------------------------------------
 | |
|  LICENSE
 | |
| 
 | |
|  This program is free software; you can redistribute it and/or
 | |
|  modify it under the terms of the GNU General Public License (GPL)
 | |
|  as published by the Free Software Foundation; either version 2
 | |
|  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.
 | |
| 
 | |
|  To read the license please visit http://www.gnu.org/copyleft/gpl.html
 | |
|  ----------------------------------------------------------------------
 | |
|  Original Author of file: Benjamin Sonntag, Franck Missoum
 | |
|  Purpose of file: Manage Email accounts and aliases.
 | |
|  ----------------------------------------------------------------------
 | |
| */
 | |
| 
 | |
| /**
 | |
| * This class handle emails (pop and/or aliases and even wrapper for internal
 | |
| * classes) of hosted users.
 | |
| *
 | |
| * Copyleft {@link http://alternc.net/ AlternC Team}
 | |
| *
 | |
| * @copyright    AlternC-Team 2002-11-01 http://alternc.net/
 | |
| *
 | |
| */
 | |
| class m_mail {
 | |
| 
 | |
|   /** domain list
 | |
|    * @access private
 | |
|    */
 | |
|   var $domains;
 | |
| 
 | |
| 
 | |
|   /* ----------------------------------------------------------------- */
 | |
|   /**
 | |
|    * Constructor
 | |
|    */
 | |
|   function m_mail() {
 | |
|   }
 | |
| 
 | |
| 
 | |
|   /* ----------------------------------------------------------------- */
 | |
|   /**
 | |
|    * Quota list (hook for quota class)
 | |
|    */
 | |
|   function alternc_quota_names() {
 | |
|     return "mail";
 | |
|   }
 | |
| 
 | |
|   function alternc_get_quota($name) {
 | |
|     global $db,$err,$cuid;
 | |
|     if ($name=="mail") {
 | |
|       $err->log("mail","getquota");
 | |
|       $db->query("SELECT COUNT(*) AS cnt FROM address WHERE domain_id in(select id from domaines where compte=$cuid);");
 | |
|       $db->next_record();
 | |
|       return $db->f("cnt");
 | |
|     }
 | |
|   }
 | |
| 
 | |
| 
 | |
|   /**
 | |
|    * Password kind used in this class (hook for admin class)
 | |
|    */
 | |
|   function alternc_password_policy() {
 | |
|     return array("pop"=>"POP/IMAP account passwords");
 | |
|   }
 | |
| 
 | |
| 
 | |
|   /* ----------------------------------------------------------------- */
 | |
|   /** Returns the list of mail-hosted domains for a user
 | |
|    * @return array indexed array of hosted domains
 | |
|    */
 | |
|   function enum_domains() {
 | |
|       global $db,$err,$cuid;
 | |
|       $err->log("mail","enum_domains");
 | |
|       $db->query("select d.id, d.domaine, count(a.id) as nb_mail FROM domaines d left join address a on a.domain_id=d.id where d.compte = $cuid group by d.id order by d.domaine asc;");
 | |
|       while($db->next_record()){
 | |
|           $this->enum_domains[]=$db->Record;
 | |
|       }
 | |
|       //print_r("<pre>");print_r($this->enum_domains);die();
 | |
|       return $this->enum_domains;
 | |
| 
 | |
|   }
 | |
| 
 | |
|   /* function used to list every mail address hosted on a domain.
 | |
|    * @param : the technical domain id.
 | |
|    * @result : an array of each mail hosted under the domain.
 | |
|    */
 | |
|   function enum_domain_mails($dom_id = null){
 | |
|     global $db,$err,$cuid;
 | |
|     $err->log("mail","enum_domains_mail");
 | |
|     $db->query("select * from address where domain_id=$dom_id order by address asc;");
 | |
|     if (!$db->num_rows()) {
 | |
|       //TODO verifier numero erreur
 | |
|       $err->raise("mysql",19);
 | |
|       return false;
 | |
|     }
 | |
|     while($db->next_record()){
 | |
|       $this->enum_domain_mails[]=$db->Record;
 | |
|     }
 | |
|     return $this->enum_domain_mails;
 | |
|   }
 | |
| 
 | |
|   function enum_doms_mails_letters($mail_id) {
 | |
|     global $err,$cuid,$db;
 | |
|     $err->log("mail","enum_doms_mails_letters");
 | |
|     //$db->query("select distinct left(ad.address,1) as letter from address ad, domaines d where ad.domain_id = d.id and d.compte='$cuid' order by letter;");
 | |
|     $db->query("select distinct left(ad.address,1) as letter from address ad,where ad.id = $mail_id ;");
 | |
|     $res=array();
 | |
|     while($db->next_record()) {
 | |
|       $res[]=$db->f("letter");
 | |
|     }
 | |
|     return $res;
 | |
|   }
 | |
| 
 | |
|   /*
 | |
|    * Function used to insert a new mail into de the db
 | |
|    * @param: a domain_id (linked to the user ) and the left part of mail waiting to be inserted 
 | |
|    * @return: an hashtable containing the database id of the newly created mail, the state ( succes or failure ) of the operation, 
 | |
|    * and an error message if necessary.
 | |
|    * TODO piensar a enlever la contrainte d'unicité sur le champs address et en rajouter une sur adrresse+dom_id.
 | |
|    */ 
 | |
|   function create($dom_id, $mail_arg,$dom_name){
 | |
|     global $mail,$err,$db,$cuid,$quota;
 | |
|     $err->log("mail","create");
 | |
|   
 | |
|     $return = array ( 
 | |
|       "state" => true,
 | |
|       "mail_id" => null,
 | |
|       "error" => "OK");
 | |
| 
 | |
|     $m=$mail_arg."@".$dom_name;
 | |
|     if(checkmail($m) != 0){
 | |
|       $return["state"]=false;
 | |
|       $return["error"]="erreur d'appel a cancreate";
 | |
|       return $return;
 | |
|     }
 | |
|   
 | |
|     $return=$mail->cancreate($dom_id, $mail_arg);
 | |
|     //Si l'appel échoue
 | |
|     if(!$return ){
 | |
|       $return["state"]=false;
 | |
|       $return["error"]="erreur d'appel a cancreate";
 | |
|       return $return;
 | |
|     }
 | |
|     if($return["state"]==false){
 | |
|       $return["error"]="erreur d'appel a cancreate";
 | |
|       return ($return);
 | |
|     }    
 | |
|     // check appartenance domaine      
 | |
|     $test=$db->query("select id from domaines where compte=$cuid and id=$dom_id;");
 | |
|   
 | |
|     if(!$db->next_record($test)){
 | |
|         $return["state"]= false;
 | |
|         $return["error"]=" hophophop tu t'es prix pour un banquier ouquoi ?";
 | |
|         return $return;
 | |
|     }
 | |
| 
 | |
|     // Check the quota :
 | |
|     if (!$quota->cancreate("mail")) {
 | |
|       $err->raise("mail",10);
 | |
|       return false;
 | |
|     }
 | |
|   
 | |
| 		$db->query("insert into address (domain_id, address) VALUES ($dom_id, '$mail_arg');");
 | |
| 		$test=$db->query("select id from address where domain_id=$dom_id and address=\"$mail_arg\";");
 | |
| 
 | |
|     $db->next_record();
 | |
|     
 | |
|     $return["mail_id"]=$db->f("id");
 | |
|   
 | |
|     return $return;
 | |
|   }
 | |
| 
 | |
| /*
 | |
|  *Function used to check if a given mail address can be inserted a new mail into de the db
 | |
|  *@param: a domain_id (linked to the user ) and the left part of mail waiting to be inserted 
 | |
|  *@return: an hashtable containing the database id of the newly created mail, the state ( succes or failure ) of the operation, 
 | |
|  *and an error message if necessary.
 | |
|  */
 | |
|   function cancreate($dom_id,$mail_arg){
 | |
|     global $db,$err,$cuid,$hooks;
 | |
|     $err->log("mail","cancreate");
 | |
|   
 | |
|     $return = array ( 
 | |
|         "state" => true,
 | |
|         "mail_id" => null,
 | |
|         "error" => "");
 | |
|   
 | |
|     $return2 = array ();
 | |
|     $return2 = $hooks->invoke('hooks_mail_cancreate',array($dom_id,$mail_arg));
 | |
|   
 | |
|     foreach($return2 as $tab => $v){
 | |
|       if($v["state"] != true){
 | |
|         //print_r($tab);
 | |
|         $return["state"]=false;
 | |
|         $return["error"]="erreur lors du check de la classe $tab";
 | |
|         return $return; 
 | |
|       }
 | |
|     }
 | |
|     return $return; 
 | |
|   }
 | |
| 
 | |
|   function form($mail_id) {
 | |
|     global $mail, $err;
 | |
|     include('mail_edit.inc.php');
 | |
|   }
 | |
| 
 | |
| 
 | |
|   /*
 | |
|    * hooks called by the cancreate function
 | |
|    * @param: a domain_id (linked to the user ) and the left part of mail waiting to be inserted 
 | |
|    * @return: an hashtable containing the database id of the newly created mail, the state ( succes or failure ) of the operation, 
 | |
|    * and an error message if necessary.
 | |
|    *
 | |
|    */ 
 | |
|   function hooks_mail_cancreate($dom_id, $mail_arg) {
 | |
|     global $db,$err;
 | |
|     $err->log("mail","hooks_mail_cancreate");
 | |
|   
 | |
|     $return = array ( 
 | |
|         "state" => true,
 | |
|         "mail_id" => null,
 | |
|         "error" => "");
 | |
|   
 | |
|     $db->query("select count(*) as cnt from address where domain_id=$dom_id and address=\"$mail_arg\";"); 
 | |
|   
 | |
|     if($db->next_record()){
 | |
|       //if mail_arg not already in table "address"
 | |
|       if( $db->f("cnt") == "0") {
 | |
|         return $return;
 | |
|       }else{
 | |
|         $return["state"] = false;
 | |
|         $return["error"]="mail existe deja";
 | |
|         return $return;
 | |
|       }
 | |
|     } 
 | |
|     $return["error"]="erreur de requête";
 | |
|     return $return;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|   * @param : mail_id
 | |
|   * fonction used to invoque the "hooks" corresponding to each mail relative classes
 | |
|   * the two foreach are used to format the array the way we want.
 | |
|   */
 | |
|   function list_properties($mail_id) {
 | |
|     global $err,$hooks;
 | |
|     $err->log("mail","list_properties");
 | |
|     $prop = $hooks->invoke("hooks_mail_properties_list",array($mail_id));
 | |
|     $final=Array();
 | |
|   
 | |
|           /* Ici on :
 | |
|              - trie/fait du ménage
 | |
|              - prend en premier les properties non avancées
 | |
|              - prend en second les properties avancées (donc en bas)
 | |
|              - on pense a avoir un trie par label, histoire d'avoir une cohérence d'affichage
 | |
|           */
 | |
|     $f_simple=Array();
 | |
|     $f_adv=Array();
 | |
|     foreach ($prop as $k => $v ) {
 | |
|       if ( empty($v) ) continue; // on continue si le tableau était vide
 | |
|       if ( isset($v['label'] ) ) { // si c'est directement le tableau qu'on souhaite
 | |
|         if ( isset($v['advanced']) && $v['advanced']) {
 | |
|           $f_adv[] = $v;
 | |
|         } else { // option simple
 | |
|           $f_simple[] = $v;
 | |
|         }
 | |
|       } else {
 | |
|         foreach ($v as $k2 => $v2 ) { // sinon on joue avec les sous-tableau
 | |
|           if ( isset($v2['advanced']) && $v2['advanced']) {
 | |
|             $f_adv[] = $v2;
 | |
|           } else { // option simple
 | |
|             $f_simple[]=$v2;
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|     $v_simple=usort($f_simple,'list_properties_order');
 | |
|     $v_adv=usort($f_adv,'list_properties_order');
 | |
|   
 | |
|     $final=array_merge($f_simple,$f_adv);
 | |
|   
 | |
|     return $final;
 | |
|   }
 | |
|   
 | |
|   /* function used to get every information at our disposal concerning a mail.
 | |
|   *  @param: $mail_id, $recur (used to stop the fonction correctly when called from list alias.
 | |
|   *  @return: an hashtable of every usefull informations we can get about a mail.
 | |
|   */
 | |
| 
 | |
|   function mail_get_details($mail_id, $recur=true){
 | |
|     global $db, $err, $mail_redirection,$mail_alias, $mail_localbox;
 | |
|     $err->log("mail","mail_get_details");
 | |
|     
 | |
|     $details = array (
 | |
|         "address_id" => "",
 | |
|         "address" => "",
 | |
|         "domain" => "", 
 | |
|         "address_full" => "",
 | |
|         "password" => "",
 | |
|         "enabled" => false,
 | |
|         "is_local" => Array(),
 | |
|         "recipients" => Array(),
 | |
|         "alias" => Array(),
 | |
|         );
 | |
|   
 | |
|     //on recupere les info principales de toutes adresses
 | |
|     $db->query("select a.address,a.password,a.enabled, d.domaine from address a, domaines d where a.id=$mail_id and d.id=a.domain_id;");
 | |
|   
 | |
|     // Return if no entry in the database
 | |
|     if (! $db->next_record()) return false;
 | |
|   
 | |
|     $details["address_id"]  =$mail_id;
 | |
|     $details["address"]  =$db->f("address");
 | |
|     $details["password"]  =$db->f("password");
 | |
|     $details["enabled"]  =$db->f("enabled");
 | |
|     $details["domain"]  =$db->f("domaine");
 | |
|     $details["address_full"]=$details["address"].'@'.$details["domain"];
 | |
|   
 | |
|     if ($recur) {
 | |
|       // Get some human-usefull informations
 | |
|       $details["is_local"]=$mail_localbox->details($mail_id);
 | |
|       $details["recipients"] = $mail_redirection->list_recipients($mail_id);
 | |
|       $details["alias"] = $mail_alias->list_alias($details['address_full']);
 | |
|     }
 | |
|     
 | |
|     return $details;
 | |
|   }
 | |
| 
 | |
|  /** 
 | |
|   * activate a mail address.
 | |
|   * @param integer mail_id: unique mail identifier
 | |
|   */  
 | |
|   function enable($mail_id){
 | |
|     global $db,$err;
 | |
|     $err->log("mail","enable");
 | |
|     if( !$db->query("UPDATE address SET enabled=1 where id=$mail_id;"))return false;
 | |
|   }
 | |
| 
 | |
|  /** 
 | |
|   * disable a mail address.
 | |
|   * @param integer mail_id: unique mail identifier
 | |
|   */  
 | |
|   function disable($mail_id){
 | |
|     global $db,$err;
 | |
|     $err->log("mail","enable");
 | |
|     if( !$db->query("UPDATE address SET enabled=0 where id=$mail_id;")) return false;
 | |
|   }
 | |
| 
 | |
|  /** 
 | |
|   * setpasswd a mail address.
 | |
|   * @param integer mail_id: unique mail identifier
 | |
|   */  
 | |
|   function setpasswd($mail_id,$pass,$passwd_type){
 | |
|     global $db,$err,$admin;
 | |
|     $err->log("mail","setpasswd");
 | |
|     if(!$admin->checkPolicy("pop",$mail_full,$pass)) return false;
 | |
|     if(!$db->query("UPDATE address SET password='"._md5cr($pass)."' where id=$mail_id;")) return false;
 | |
|   }
 | |
| 
 | |
| 
 | |
|  /** 
 | |
|   * mail_delete a mail address.
 | |
|   * @param integer mail_id: unique mail identifier
 | |
| 	TODO: mail del
 | |
|   */  
 | |
|   function mail_delete($mail_id){
 | |
|     global $db,$err,$admin;
 | |
|     $err->log("mail","mail_delete");
 | |
|   
 | |
|    // $db->query("
 | |
|   /*supprimer de la table address
 | |
| 	supprimer la mailbox si il yen a une.
 | |
| 	supprimer alias et redirection.
 | |
|     supprimer les alias associé si il ne sont relié a aucunes autre addresses.
 | |
|   */
 | |
| 
 | |
|   }
 | |
| 
 | |
| /**
 | |
| * Export the mail information of an account 
 | |
| * @return: str, chaine de caractere containing every usefull mail informations.
 | |
| *
 | |
| */
 | |
| function alternc_export_conf() {
 | |
|      global $db,$err,$mail_localbox;
 | |
|      $err->log("mail","export");
 | |
|      $domain=$this->enum_domains();
 | |
|      $str="<mail>\n";
 | |
|      $onepop=false;
 | |
|      foreach ($domain as $d) {
 | |
|        $str.="  <domain>\n    <name>".xml_entities($d["domaine"])."</name>\n";
 | |
|        $s=$this->enum_domain_mails($d["id"]);
 | |
|        if (count($s)) {
 | |
|          while (list($key,$val)=each($s)){
 | |
|             $test=$this->mail_get_details($val['id']);
 | |
|            $str.="    <address>\n";
 | |
|            $str.="      <name>".xml_entities($val["address"])."</name>\n";
 | |
|            $str.="      <enabled>".xml_entities($val["enabled"])."</enabled>\n";
 | |
|            if(is_array($test["is_local"])){
 | |
|              $str.="      <islocal>oui</islocal>\n";
 | |
|              $str.="      <path>".$test["is_local"]["path"]."</path>\n";
 | |
|              $str.="      <quota>".$test["is_local"]["quota"]."</quota>\n";
 | |
|            }else{
 | |
|              $str.="      <islocal>non</islocal>\n";
 | |
|           }
 | |
|           if(!empty($test["recipients"])){
 | |
|               foreach($test["recipients"] as $recip){
 | |
|                 $str.="      <recipients>".$recip."<recipients>\n";
 | |
|               }
 | |
|           }
 | |
|           if(!empty($test["alias"])){
 | |
|               foreach($test["alias"] as $alias){
 | |
|                 $str.="      <alias>".$alias."<alias>\n";
 | |
|               }
 | |
|           }
 | |
|        $str.="    </address>\n";
 | |
|      }
 | |
|        }     
 | |
|        $str.="  </domain>\n";
 | |
|      }
 | |
|      $str.="</mail>\n";
 | |
|      return $str;
 | |
|    }
 | |
|  
 | |
| 
 | |
| } /* Class m_mail */
 | |
| 
 | |
| 
 | |
| ?>
 |