diff --git a/gosa-plugins/mail/personal/mail/class_mail-methods.inc b/gosa-plugins/mail/personal/mail/class_mail-methods.inc
index 7f58a4520274b839ba79906308347e81c56e2201..7b4abf37473245aac27d15e95a0cd29205ee8815 100644 (file)
<?php
-/*
- This code is part of GOsa (https://gosa.gonicus.de)
- Copyright (C) 2004 Cajus Pollmeier
- 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 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.
+class mailMethod{
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
+ /* Allow modification of account_ids for existing mail accounts */
+ protected $modifyableMail = TRUE;
+ /* Enforces same value for 'mail' as used for 'cn' */
+ protected $mailEqualsCN = FALSE;
+
+ /* the attribute used to create accounts */
+ protected $uattrib = "mail"; // Naming attribute for accounts, e.g. imap.
+
+ /* The account prefixes, keep the '.' here! See FAQ cyrusUseSlashes */
+ protected $user_prefix = "user.";
+ protected $share_prefix = "share.";
+
+ /* Create accounts in cyrus style with '/' instead of '.' */
+ protected $cyrusUseSlashes= FALSE;
+
+ /* The atribute mapping for this class Source --> Destination */
+ protected $attributes = array();
+ protected $userObjectClasses = array();
+ protected $shareObjectClasses = array();
+
+ /* Enabled mail domain selection. If enabled getMailDomains must the domain parts */
+ protected $enableDomainSelection= FALSE;
+ protected $enableQuota = TRUE;
+ protected $enableSieveManager = FALSE;
+ protected $enableVacationRange = TRUE;
+ protected $enableFolderTypes = FALSE;
+
+ /* Default values */
+ protected $quotaValue = 0;
+ protected $quotaUsage = 0;
+
+ /* Method internal */
+ protected $type = "user";
+ protected $account_id = "";
+ protected $initial_account_id = "";
+ protected $connected = FALSE;
+ protected $error = "";
+ protected $parent = NULL;
+ protected $MailServer = "";
+
+ protected $acl_map = array(
+ "lrsw" => "read",
+ "lrswp" => "post",
+ "p" => "external post",
+ "lrswip" => "append",
+ "lrswipcd" => "write",
+ "lrswipcda"=> "admin",
+ " " => "none");
+
+ protected $acl_mapping = array();
+
+
+ /*! \brief Constructs the mail class
+ @param Object Config The GOsa configuration object
+ @param Object Plugin The initator
+ @param String Open "user" or "group" account.
+ */
+ function __construct(&$config, &$parent, $type = "user")
+ {
+ $this->parent = $parent;
+ $this->config = $config;
+
+ /* Create a refernce to the mail selected server
+ */
+ if(isset($this->parent->gosaMailServer)){
+ $this->MailServer = &$this->parent->gosaMailServer;
+ }else{
+ trigger_error("mailMethod with invalid parent object initialized.");
+ }
+
+ if(!in_array($this->type,array("user","group"))){
+ trigger_error("Unknown mail class type used '".$type."'.");
+ }else{
+ $this->type = $type;
+ }
+ }
-class mailMethod
-{
- var $uattrib= "uid";
- function mailMethod(&$config)
+ /*! \brief Intialize attributes and config settings.
+ */
+ protected function init()
{
+ /* Get config value for cyrusUseSlashes
+ */
+ if ($this->config->get_cfg_value("cyrusUseSlashes") == "true"){
+ $this->cyrusUseSlashes = TRUE;
+ @DEBUG (DEBUG_MAIL, __LINE__, __FUNCTION__, __FILE__, "cyrusUseSlashes: <b>Enabled</b>","");
+ }else{
+ @DEBUG (DEBUG_MAIL, __LINE__, __FUNCTION__, __FILE__, "cyrusUseSlashes: <b>Disabled</b>","");
+ }
+
/* Check if the mail account identification attribute
is overridden in the configuration file
*/
- if(isset($config->current['MAIL_ATTRIB']) && !empty($config->current['MAIL_ATTRIB'])){
- $new_uattrib= strtolower($config->current['MAIL_ATTRIB']);
+ if($this->config->get_cfg_value("mailAttribute","mail") != ""){
+ $new_uattrib= strtolower($this->config->get_cfg_value("mailAttribute"));
if(in_array($new_uattrib,array("mail","uid"))){
$this->uattrib = $new_uattrib;
}else{
- trigger_error(sprintf("Unsupported MAIL_ATTRIB in gosa configuration specified, use 'mail' or 'uid', instead of '%s'.", $new_uattrib));
+ @DEBUG (DEBUG_MAIL, __LINE__, __FUNCTION__, __FILE__, "<b>".$new_uattrib."</b>",
+ "Unsupported 'mailAttribute' in gosa configuration specified");
+ msg_dialog::display(_("Configuration error"),
+ sprintf(_("The configured mail attribute '%s' is unsupported!"), $new_uattrib), ERROR_DIALOG);
+ }
+ }
+
+ /* Create ACL map */
+ foreach($this->acl_map as $acl => $name){
+ $this->acl_mapping[$acl] = _($name);
+ }
+
+ $this->build_account_id();
+ $this->initial_account_id = $this->account_id;
+ }
+
+
+ public function fixAttributesOnLoad()
+ {
+ foreach($this->attributes as $source => $dest){
+ if(isset($this->parent->attrs[$source])){
+ $this->parent->attrs[$dest] = $this->parent->attrs[$source];
+ }
+ if(isset($this->parent->$source)){
+ $this->parent->$dest = $this->parent->$source;
+ }
+ if(isset($this->parent->attrs[$source][0])){
+ $this->parent->saved_attributes[$source] = $this->parent->attrs[$source][0];
+ }
+ }
+ }
+
+
+ public function mailEqualsCN()
+ {
+ return($this->mailEqualsCN);
+ }
+
+
+ public function fixAttributesOnRemove()
+ {
+ /* Remove objectClasses
+ */
+ if($this->type == "user"){
+ $this->parent->attrs['objectClass'] =
+ array_remove_entries_ics($this->userObjectClasses, $this->parent->attrs['objectClass']);
+ }else{
+ $this->parent->attrs['objectClass'] =
+ array_remove_entries_ics($this->shareObjectClasses, $this->parent->attrs['objectClass']);
+ }
+ foreach($this->attributes as $source => $dest){
+ $this->attrs[$dest] = array();
+ $this->attrs[$source] = array();
+ }
+ }
+
+ public function fixAttributesOnStore()
+ {
+ foreach($this->attributes as $source => $dest){
+ if(isset($this->parent->attrs[$dest])){
+ $this->parent->attrs[$source] = $this->parent->attrs[$dest ];
+ }
+ if(isset($this->parent->$dest)){
+ $this->parent->$source = $this->parent->$dest;
+ }
+ }
+
+ if($this->type == "user"){
+ $ocs = $this->userObjectClasses;
+ }else{
+ $ocs = $this->shareObjectClasses;
+ }
+ foreach($ocs as $oc){
+ if(!in_array($oc, $this->parent->attrs['objectClass'])){
+ $this->parent->attrs['objectClass'][] = $oc;
+ }
+ }
+ }
+
+
+ /*! \brief Connect services like imap.
+ Not necessary for the base class.
+ @return Boolean True if this method is connected else false.
+ */
+ public function connect()
+ {
+ $this->reset_error();
+ @DEBUG (DEBUG_MAIL, __LINE__, __FUNCTION__, __FILE__,"<b>Connect method</b>: ".get_class($this),"");
+ @DEBUG (DEBUG_MAIL, __LINE__, __FUNCTION__, __FILE__,"<b>Current server</b>: ".$this->MailServer,"");
+
+ $this->connected = TRUE;
+ return(TRUE);
+ }
+
+
+ /*! \brief Returns the connection status of this method.
+ @return Boolean True if this method is connected else false.
+ */
+ public function is_connected()
+ {
+ return($this->connected);
+ }
+
+
+ /*! \brief Disconnect this method. Close services like imap connection.
+ Not necessary for the base class.
+ */
+ public function disconnect()
+ {
+ $this->reset_error();
+ if($this->is_connected()){
+ @DEBUG (DEBUG_MAIL, __LINE__, __FUNCTION__, __FILE__,"<b>Disconnect method</b>: ".get_class($this),"");
+ $this->connected =FALSE;
+ }
+ }
+
+
+ /*! \brief Returns true the current object represents a valid account
+ (Some methods may check imap accounts here.)
+ @return Boolean TRUE if this is a valid account else FALSE
+ */
+ public function account_exists()
+ {
+ $this->reset_error();
+ return(TRUE);
+ }
+
+
+ /*! \brief Returns the last error occurred
+ @return String The last error message.
+ */
+ public function get_error(){
+ return($this->error);
+ }
+
+
+ public function isModifyableMail()
+ {
+ return($this->modifyableMail);
+ }
+
+
+ /*! \brief Returns TRUE if the action caused an error.
+ @return Boolean TRUE on error else FALSE
+ */
+ public function is_error(){
+ return($this->error != "");
+ }
+
+
+ /*! \brief Resets the error message.
+ */
+ public function reset_error(){
+ $this->error = "";
+ }
+
+
+ public function get_account_id()
+ {
+ $this->build_account_id();
+ return($this->account_id);
+ }
+
+ /*! \brief Create a new account id, like 'user/name@domain.com'.
+ */
+ protected function build_account_id()
+ {
+ /* Build account identicator */
+ if($this->type == "user"){
+ $str = $this->user_prefix;
+ }else{
+ $str = $this->share_prefix;
+ }
+
+ /* Create account prefix and respect "cyrusUseSlashes"
+ Do not replace escaped dots for cyrusUseSlashes.
+ */
+ $uattrib = $this->uattrib;
+ if($this->cyrusUseSlashes){
+ $str = preg_replace('/([^\\\\])\./',"\\1/",$str);
+ }
+ $str = preg_replace("/\\\\([\.\/])/","\\1",$str);
+ $str = trim(strtolower($str . $this->parent->$uattrib));
+
+ if($this->account_id != $str){
+ $this->account_id = $str;
+ @DEBUG (DEBUG_MAIL, __LINE__, __FUNCTION__, __FILE__, "accountID generated: <b>".$str."</b>","");
+ }
+ }
+
+
+ /*! \brief Creates a valid folder id for a given folder name.
+ e.g. $folder_id = "INBOX/test" && $this->account_id = "share/mailbox@domain.de"
+ will result in "share/mailbox/test@domain.de"
+ This function is mainly used to read and write folder permissions.
+ @return String A valid folder id
+ */
+ public function create_folder_id($folder, $type = "")
+ {
+
+ if(!empty($folder)){
+ $folder = trim(preg_replace("/^INBOX[\.\/]*/i","",$folder));
+ }
+ if(!empty($folder)){
+ $folder = "/".$folder;
+ }
+
+ /* Build account identicator */
+ if($type == ""){
+ $type = $this->type;
+ }
+ if($type == "user"){
+ $str = $this->user_prefix;
+ }else{
+ $str = $this->share_prefix;
+ }
+
+ /* Create account prefix and respect "cyrusUseSlashes"
+ Do not replace escaped dots for cyrusUseSlashes.
+ */
+ $uattrib = $this->uattrib;
+ if($this->cyrusUseSlashes){
+ $str = preg_replace('/([^\\\\])\./',"\\1/",$str);
+ }
+ $str = preg_replace("/\\\\([\.\/])/","\\1",$str);
+ $str = trim(strtolower($str . $this->parent->$uattrib));
+
+ if(preg_match("/\@/",$this->parent->$uattrib)){
+ list($mail,$domain) = split("\@",$this->parent->$uattrib);
+ $str = trim(strtolower($str . $mail . $folder . "@" . $domain));
+ }else{
+ $str = trim(strtolower($str . $this->parent->$uattrib));
+ }
+ return($str) ;
+ }
+
+
+ /*! \brief Returns the configured mail method for the given parent object,
+ initialized and read for use.
+ @return mailMethod The configured mailMethod.
+ */
+ public function get_method()
+ {
+ $methods = mailMethod::get_methods();
+ if ($this->config->get_cfg_value("mailmethod") != ""){
+ $method= $this->config->get_cfg_value("mailmethod");
+ $cls = get_correct_class_name("mailMethod$method");
+ if(isset($methods[$cls])){
+ @DEBUG (DEBUG_MAIL, __LINE__, __FUNCTION__, __FILE__, "Selected mailMethod: <b>".$cls."</b>","");
+ $tmp = new $cls($this->config,$this->parent,$this->type);
+ $tmp->init();
+ return($tmp);
+ }else{
+ @DEBUG (DEBUG_MAIL, __LINE__, __FUNCTION__, __FILE__, "Invalid mailMethod defined <b>".$cls.
+ "</b> falling back to <b>".get_class($this)."</b>","");
+
+ /* Print out configuration errors directly, we can't catch them everywhere.
+ */
+ msg_dialog::display(_("Configuration error"),
+ sprintf(_("Mail method '%s' is unknown!"), $method), ERROR_DIALOG);
}
}
+
+ /* If no valued mailMethod could be detected, return the base class.
+ */
+ $this->init();
+ return($this);
}
- function connect($gosaMailServer)
+
+ /*! \brief Saves sieve settings
+ */
+ public function saveSieveSettings()
{
- return (TRUE);
+ $this->reset_error();
+ return(TRUE);
}
- function disconnect()
+
+ /*! \brief Creates or Updates the mailAccount represented by this class.
+ */
+ public function updateMailbox()
{
+ $this->reset_error();
+ return(TRUE);
}
- function getQuota($folder)
+
+ /*! \brief Update shared folder dependencies
+ */
+ public function updateSharedFolder()
{
- return (array('quotaUsage' => 0, 'gosaMailQuota' => 0));
+ $this->reset_error();
+ return(TRUE);
}
- function getMailboxList($folder, $uid)
+
+ /*! \brief Removes the mailbox represented by this class,
+ and update shared folder ACLs .
+ */
+ public function deleteMailbox()
{
- return (array("INBOX"));
+ $this->reset_error();
+
+ @DEBUG (DEBUG_MAIL, __LINE__, __FUNCTION__, __FILE__, "<b>".$this->account_id."</b>" ,
+ "<b>Remove account</b> from server :".$this->MailServer);
+
+ return(TRUE);
+
+ /* No imap actions here, just updated shared folder membership
+ */
+ $ldap = $this->config->get_ldap_link();
+ $ldap->cd($this->config->current['BASE']);
+ $ldap->search("(&(objectClass=posixGroup)(objectClass=gosaMailAccount)(memberUid=".$account."))",array('dn','cn'));
+ if(class_exists("grouptabs")){
+ while($attrs = $ldap->fetch()){
+ $tmp = new grouptabs($this->config, $this->config->data['TABS']['GROUPTABS'], $attrs['dn']);
+ if(isset($tmp->by_object['mailgroup'])){
+ $tmp->by_object['mailgroup']->members= $tmp->by_object['group']->memberUid;
+ if(!$this->is_account){
+ $tmp->by_object['mailgroup']->removeUserAcl($account);
+ $tmp->by_object['mailgroup']->removeUserAcl($this->mail);
+ }
+ $tmp->by_object['mailgroup']->save();
+ }
+ }
+ }
+ return(TRUE);
}
- function setQuota($folder, $gosaMailQuota)
+
+ /*! \brief Returns the used mail attribute (mail,uid)
+ @param String One out of 'mail','uid'
+ */
+ public function getUAttrib()
{
- return (TRUE);
+ return($this->uattrib);
}
- function updateMailbox($folder)
+
+ /*! \brief Returns the used mail attribute (mail,uid)
+ @param String One out of 'mail','uid'
+ */
+ public function getUAttribValue()
{
+ $uattrib = $this->getUAttrib();
+ return($this->parent->$uattrib);
}
- function deleteMailbox($folder)
+
+ /*! \brief Returns whether the quota settings are enabled or not
+ @return Boolean TRUE if enabled else FALSE
+ */
+ public function quotaEnabled()
{
- return (TRUE);
+ return($this->enableQuota);
}
- function setSharedFolderPermissions($folder, $permissions)
+
+ /*! \brief Returns the used quota
+ @return Integer Quota used.
+ */
+ public function getQuotaUsage()
{
+ return(-1);
}
- function configureFilter($user, $gosaMailDeliveryMode,
- $mail, $gosaMailAlternateAddress,
- $gosaMailMaxSize,
- $gosaSpamMailbox, $gosaSpamSortLevel,
- $gosaVacationMessage)
+
+ /*! \brief Returns the quota restrictions.
+ @return Integer Quota restrictions.
+ */
+ public function getQuota($quotaValue)
+ {
+ return($quotaValue);
+ }
+
+
+ /*! \brief Sets the mail quota
+ */
+ public function setQuota($number)
+ {
+ if(!is_numeric($number)){
+ $number = (int) $number;
+ if(!$number){
+ $number = 0;
+ }
+ }
+ $this->quotaValue = $number;
+ return(TRUE);
+ }
+
+
+ /*! \brief Returns true whether the domain is selectable or not
+ */
+ public function domainSelectionEnabled()
+ {
+ return($this->enableDomainSelection);
+ }
+
+
+ /*! \brief Returns a list of configured mail domains
+ @return Array A list of mail domains
+ */
+ public function getMailDomains()
+ {
+ return(array("Unconfigured"));
+ }
+
+
+ /*! \brief Returns the used Spamlevels for this mailmethod
+ */
+ public function getSpamLevels()
{
+ $spamlevel= array();
+ for ($i= 0; $i<21; $i++){
+ $spamlevel[]= $i;
+ }
+ return($spamlevel);
}
- function fixAttributesOnLoad(&$mailObject)
+
+ /*! \brief Returns the list of configured mailbox folders
+ @return Array The mailbox folders.
+ */
+ public function getMailboxList()
{
+ return(array("INBOX"));
}
- function fixAttributesOnStore(&$mailObject)
+
+ /*! \brief Returns whether the vacation range is selectable or not
+ @return Boolean TRUE, FALSE
+ */
+ public function vacationRangeEnabled()
{
+ return($this->enableVacationRange);
}
- function fixAttributesOnRemove(&$mailObject)
+
+ /*! \brief Returns true if the sieveManagement is allowed
+ @return Boolean TRUE, FALSE
+ */
+ public function allowSieveManagement()
{
+ return($this->enableSieveManager);
+ }
+
+
+ /*! \brief Checks dependencies to other GOsa plugins.
+ */
+ public function accountCreateable(&$reason = ""){
+ return(TRUE);
+ }
+
+
+ /*! \brief Checks whether this account is removeable or not.
+ There may be some dependencies left, eg. kolab.
+ */
+ public function accountRemoveable(&$reason = ""){
+ return(TRUE);
+ }
+
+
+ /*! \brief Returns all mail servers configured in GOsa
+ that are useable with this mailMethod.
+ @return Array All useable mail servers.
+ */
+ public function getMailServers()
+ {
+ $mailserver = array();
+ $ui = get_userinfo();
+ foreach ($this->config->data['SERVERS']['IMAP'] as $key => $val){
+ if( $this->MailServer == $key ||
+ preg_match("/r/",$ui->get_permissions($val['server_dn'],"server/goImapServer",""))){
+ $mailserver[]= $key;
+ }
+ }
+ return($mailserver);
+ }
+
+
+ /*! \brief Returns the available mailMethods
+ @return Array A list of all avaialable mailMethods_
+ */
+ static protected function get_methods()
+ {
+ global $class_mapping;
+ $available = array();
+ foreach($class_mapping as $class => $path){
+ if($class == "mailMethod") continue;
+ if(preg_match("/^mailMethod/",$class)){
+ $available[$class] = $class;
+ }
+ }
+ return($available);
+ }
+
+
+ /* \brief Some method require special folder types, "kolab" for example.
+ !! Those values are dummy values, the base class doesn't use folder types;
+ @return Array Return folder types.
+ */
+ public function getAvailableFolderTypes()
+ {
+ $ret = array();
+ $ret['CAT'][''] = _("None");
+ $ret['SUB_CAT'][''][''] = _("None");
+ return($ret);
+ }
+
+
+ /* \brief Returns the selected folder type.
+ !! Those values are dummy values, the base class doesn't use folder types;
+ @return Array The folde type.
+ */
+ public function getFolderType($default)
+ {
+ return($default);
+ }
+
+
+ /* \brief Returns the selected folder type.
+ !! Those values are dummy values, the base class doesn't use folder types;
+ @return Array The folde type.
+ */
+ public function setFolderType($type)
+ {
+ return(TRUE) ;
+ }
+
+
+ /*! \brief Returns configured acls
+ */
+ public function getFolderACLs($folder_acls)
+ {
+ /* Merge given ACL with acl mapping
+ This ensures that no ACL will accidentally overwritten by gosa.
+ */
+ foreach($folder_acls as $user => $acl){
+ if(!isset($this->acl_mapping[$acl])){
+ $this->acl_mapping[$acl] = $acl;
+ }
+ }
+
+ return($folder_acls);
+ }
+
+
+ /*! \brief Write ACLs back to imap or what ever
+ */
+ public function setFolderACLs($array)
+ {
+ return(TRUE);
+ }
+
+
+ /*! \brief Returns a list of all possible acls.
+ @return Array ACLs.
+ */
+ public function getAclTypes()
+ {
+ return( $this->acl_mapping);
+ }
+
+ public function folderTypesEnabled()
+ {
+ return($this->enableFolderTypes);
+ }
+
+ public function allow_remove(&$reason)
+ {
+ return(TRUE);
+ }
+
+
+ /*! \brief Returns the configured mailMethod
+ @return String the configured mail method or ""
+ */
+ static public function get_current_method($config)
+ {
+ global $class_mapping;
+ $method= $config->get_cfg_value("mailmethod");
+ $cls = get_correct_class_name("mailMethod$method");
+ foreach($class_mapping as $class => $path){
+ if($class == $cls){
+ return($class);
+ }
+ }
+ return("");
}
}
+
// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
?>