diff --git a/emailadmin/inc/class.defaultimap.inc.php b/emailadmin/inc/class.defaultimap.inc.php new file mode 100644 index 0000000000..59b62245b1 --- /dev/null +++ b/emailadmin/inc/class.defaultimap.inc.php @@ -0,0 +1,552 @@ +mbAvailable = TRUE; + } + + $this->restoreSessionData(); + + // construtor for Net_IMAP stuff + $this->Net_IMAPProtocol(); + } + + /** + * Magic method to re-connect with the imapserver, if the object get's restored from the session + */ + function __wakeup() + { + #$this->openConnection($this->isAdminConnection); // we need to re-connect + } + + /** + * adds a account on the imap server + * + * @param array $_hookValues + * @return bool true on success, false on failure + */ + function addAccount($_hookValues) + { + return true; + } + + /** + * updates a account on the imap server + * + * @param array $_hookValues + * @return bool true on success, false on failure + */ + function updateAccount($_hookValues) + { + return true; + } + + /** + * deletes a account on the imap server + * + * @param array $_hookValues + * @return bool true on success, false on failure + */ + function deleteAccount($_hookValues) + { + return true; + } + + function disconnect() + { + //error_log(__METHOD__.function_backtrace()); + $retval = parent::disconnect(); + if( PEAR::isError($retval)) error_log(__METHOD__.$retval->message); + $this->_connected = false; + } + + /** + * converts a foldername from current system charset to UTF7 + * + * @param string $_folderName + * @return string the encoded foldername + */ + function encodeFolderName($_folderName) + { + if($this->mbAvailable) { + return mb_convert_encoding($_folderName, "UTF7-IMAP", $GLOBALS['egw']->translation->charset()); + } + + // if not + // we can encode only from ISO 8859-1 + return imap_utf7_encode($_folderName); + } + + /** + * returns the supported capabilities of the imap server + * return false if the imap server does not support capabilities + * + * @return array the supported capabilites + */ + function getCapabilities() + { + if(!is_array($this->sessionData['capabilities'][$this->host])) { + return false; + } + + return $this->sessionData['capabilities'][$this->host]; + } + + /** + * return the delimiter used by the current imap server + * + * @return string the delimimiter + */ + function getDelimiter() + { + return isset($this->sessionData['delimiter'][$this->host]) ? $this->sessionData['delimiter'][$this->host] : $this->mailboxDelimiter; + } + + /** + * Create transport string + * + * @return string the transportstring + */ + function _getTransportString() + { + if($this->encryption == 2) { + $connectionString = "tls://". $this->host; + } elseif($this->encryption == 3) { + $connectionString = "ssl://". $this->host; + } else { + // no tls + $connectionString = $this->host; + } + + return $connectionString; + } + + /** + * Create the options array for SSL/TLS connections + * + * @return string the transportstring + */ + function _getTransportOptions() + { + if($this->validatecert === false) { + if($this->encryption == 2) { + return array( + 'tls' => array( + 'verify_peer' => false, + 'allow_self_signed' => true, + ) + ); + } elseif($this->encryption == 3) { + return array( + 'ssl' => array( + 'verify_peer' => false, + 'allow_self_signed' => true, + ) + ); + } + } else { + if($this->encryption == 2) { + return array( + 'tls' => array( + 'verify_peer' => true, + 'allow_self_signed' => false, + ) + ); + } elseif($this->encryption == 3) { + return array( + 'ssl' => array( + 'verify_peer' => true, + 'allow_self_signed' => false, + ) + ); + } + } + + return null; + } + + /** + * get the effective Username for the Mailbox, as it is depending on the loginType + * @param string $_username + * @return string the effective username to be used to access the Mailbox + */ + function getMailBoxUserName($_username) + { + if ($this->loginType == 'email') + { + $_username = $_username; + $accountID = $GLOBALS['egw']->accounts->name2id($_username); + $accountemail = $GLOBALS['egw']->accounts->id2name($accountID,'account_email'); + //$accountemail = $GLOBALS['egw']->accounts->read($GLOBALS['egw']->accounts->name2id($_username,'account_email')); + if (!empty($accountemail)) + { + list($lusername,$domain) = explode('@',$accountemail,2); + if (strtolower($domain) == strtolower($this->domainName) && !empty($lusername)) + { + $_username = $lusername; + } + } + } + return $_username; + } + + /** + * Create mailbox string from given mailbox-name and user-name + * + * @param string $_folderName='' + * @return string utf-7 encoded (done in getMailboxName) + */ + function getUserMailboxString($_username, $_folderName='') + { + $nameSpaces = $this->getNameSpaces(); + + if(!isset($nameSpaces['others'])) { + return false; + } + + $_username = $this->getMailBoxUserName($_username); + if($this->loginType == 'vmailmgr' || $this->loginType == 'email') { + $_username .= '@'. $this->domainName; + } + + $mailboxString = $nameSpaces['others'][0]['name'] . $_username . (!empty($_folderName) ? $nameSpaces['others'][0]['delimiter'] . $_folderName : ''); + + return $mailboxString; + } + /** + * get list of namespaces + * + * @return array array containing information about namespace + */ + function getNameSpaces() + { + if(!$this->_connected) { + return false; + } + $retrieveDefault = false; + if($this->hasCapability('NAMESPACE')) { + $nameSpace = $this->getNamespace(); + if( PEAR::isError($nameSpace)) { + if ($this->debug) error_log("emailadmin::defaultimap->getNameSpaces:".print_r($nameSpace,true)); + $retrieveDefault = true; + } else { + $result = array(); + + $result['personal'] = $nameSpace['personal']; + + if(is_array($nameSpace['others'])) { + $result['others'] = $nameSpace['others']; + } + + if(is_array($nameSpace['shared'])) { + $result['shared'] = $nameSpace['shared']; + } + } + } + if (!$this->hasCapability('NAMESPACE') || $retrieveDefault) { + $delimiter = $this->getHierarchyDelimiter(); + if( PEAR::isError($delimiter)) $delimiter = '/'; + + $result['personal'] = array( + 0 => array( + 'name' => '', + 'delimiter' => $delimiter + ) + ); + } + + return $result; + } + + /** + * returns the quota for given foldername + * gets quota for the current user only + * + * @param string $_folderName + * @return string the current quota for this folder + */ + # function getQuota($_folderName) + # { + # if(!is_resource($this->mbox)) { + # $this->openConnection(); + # } + # + # if(function_exists('imap_get_quotaroot') && $this->supportsCapability('QUOTA')) { + # $quota = @imap_get_quotaroot($this->mbox, $this->encodeFolderName($_folderName)); + # if(is_array($quota) && isset($quota['STORAGE'])) { + # return $quota['STORAGE']; + # } + # } + # + # return false; + # } + + /** + * return the quota for another user + * used by admin connections only + * + * @param string $_username + * @return string the quota for specified user + */ + function getQuotaByUser($_username) + { + $mailboxName = $this->getUserMailboxString($_username); + //error_log(__METHOD__.$mailboxName); + $storageQuota = $this->getStorageQuota($mailboxName); + //error_log(__METHOD__.$_username); + //error_log(__METHOD__.$mailboxName); + if ( PEAR::isError($storageQuota)) error_log(__METHOD__.$storageQuota->message); + if(is_array($storageQuota) && isset($storageQuota['QMAX'])) { + return (int)$storageQuota['QMAX']; + } + + return false; + } + + /** + * returns information about a user + * currently only supported information is the current quota + * + * @param string $_username + * @return array userdata + */ + function getUserData($_username) + { + if($this->_connected === true) { + //error_log(__METHOD__."try to disconnect"); + $this->disconnect(); + } + + $this->openConnection(true); + $userData = array(); + + if($quota = $this->getQuotaByUser($_username)) { + $userData['quotaLimit'] = $quota / 1024; + } + + $this->disconnect(); + + return $userData; + } + + /** + * opens a connection to a imap server + * + * @param bool $_adminConnection create admin connection if true + * + * @return resource the imap connection + */ + function openConnection($_adminConnection=false) + { + //error_log(__METHOD__.function_backtrace()); + unset($this->_connectionErrorObject); + + if($_adminConnection) { + $username = $this->adminUsername; + $password = $this->adminPassword; + $options = ''; + $this->isAdminConnection = true; + } else { + $username = $this->loginName; + $password = $this->password; + $options = $_options; + $this->isAdminConnection = false; + } + + $this->setStreamContextOptions($this->_getTransportOptions()); + $this->setTimeout(20); + if( PEAR::isError($status = parent::connect($this->_getTransportString(), $this->port, $this->encryption == 1)) ) { + error_log(__METHOD__."Could not connect"); + error_log(__METHOD__.$status->message); + $this->_connectionErrorObject = $status; + return false; + } + if( PEAR::isError($status = parent::login($username, $password, 'LOGIN', !$this->isAdminConnection)) ) { + error_log(__METHOD__."Could not log in"); + error_log(__METHOD__.$status->message); + $this->_connectionErrorObject = $status; + return false; + } + + return true; + } + + /** + * restore session variable + * + */ + function restoreSessionData() + { + $this->sessionData = $GLOBALS['egw']->session->appsession('imap_session_data'); + } + + /** + * save session variable + * + */ + function saveSessionData() + { + $GLOBALS['egw']->session->appsession('imap_session_data','',$this->sessionData); + } + + /** + * set userdata + * + * @param string $_username username of the user + * @param int $_quota quota in bytes + * @return bool true on success, false on failure + */ + function setUserData($_username, $_quota) + { + return true; + } + + /** + * check if imap server supports given capability + * + * @param string $_capability the capability to check for + * @return bool true if capability is supported, false if not + */ + function supportsCapability($_capability) + { + return $this->hasCapability($_capability); + } + } +?>