summaryrefslogtreecommitdiffstats
path: root/lib/model/Mailbox.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/model/Mailbox.php')
-rw-r--r--lib/model/Mailbox.php187
1 files changed, 187 insertions, 0 deletions
diff --git a/lib/model/Mailbox.php b/lib/model/Mailbox.php
new file mode 100644
index 0000000..c29e1db
--- /dev/null
+++ b/lib/model/Mailbox.php
@@ -0,0 +1,187 @@
+<?php
+
+/**
+ * Subclass for representing a row from the 'mailbox' table.
+ *
+ *
+ *
+ * @package lib.model
+ */
+class Mailbox extends BaseMailbox
+{
+ protected $imap = null;
+
+ public function __construct()
+ {
+ // set defaults
+ $this->setMaxQuota(sfConfig::get('app_domain_default_mailbox_quota'));
+ $this->setMaxAddressCount(sfConfig::get('app_mailbox_max_address_count'));
+ }
+
+ public function getImapName()
+ {
+ return "user.".$this->getName();
+ }
+
+ public function getExistsOnImapServer()
+ {
+ $this->requireIMAPAdminConnection();
+ $exists = $this->imap->getlist($this->getImapName(), '%');
+ if(is_array($exists) && (count($exists)!=0))
+ {
+ return true;
+ }
+ return false;
+ }
+
+ protected function requireIMAPAdminConnection()
+ {
+ if(!$this->imap)
+ $this->imap = IMAPManager::getAdminConnection();
+ }
+
+ protected $quota = null;
+ protected function updateIMAPQuota()
+ {
+ $this->requireIMAPAdminConnection();
+ $quota = $this->imap->getquota("user.".$this->getName());
+ if($quota)
+ $this->quota = $quota;
+ }
+
+ public function getQuota()
+ {
+ if($this->quota == null)
+ $this->updateIMAPQuota();
+
+ return $this->quota;
+ }
+
+ public function save($con = null)
+ {
+ // create or update resources on IMAP server
+ if($this->isNew())
+ {
+ $this->requireIMAPAdminConnection();
+
+ // mailbox
+ $this->imap->create($this->getImapName());
+
+ // acl
+ $this->imap->setacl($this->getImapName(), IMAPManager::getAdminUsername(), $this->imap->getAvailableACL());
+
+ // quota
+ $this->imap->setquota($this->getImapName(), $this->getMaxQuota());
+
+ // default folders
+
+ }
+ else // update
+ {
+ // mailbox name changed?
+ if($this->isColumnModified(MailboxPeer::NAME))
+ {
+ $this->requireIMAPAdminConnection();
+
+ $oldmailbox = MailboxPeer::retrieveByPk($this->getId());
+ if($oldmailbox->getName() != $this->getName())
+ {
+ // requires "allowusermoves: 1" in /etc/imapd.conf
+ // mailbox
+ $this->imap->rename($oldmailbox->getImapName(), $this->getImapName());
+ }
+ }
+
+ // quota changed?
+ if($this->isColumnModified(MailboxPeer::MAX_QUOTA))
+ {
+ $this->requireIMAPAdminConnection();
+
+ $this->imap->setquota($this->getImapName(), $this->getMaxQuota());
+ }
+ }
+
+ return parent::save($con);
+ }
+
+ public function delete($con = null)
+ {
+ // remove resources on IMAP server
+ if(!$this->isNew())
+ {
+ $this->requireIMAPAdminConnection();
+
+ // grant all rights to admin to be able to delete mailbox
+ $this->imap->setacl($this->getImapName(), IMAPManager::getAdminUsername(), $this->imap->getAvailableACL());
+
+ // mailbox
+ $this->imap->delete($this->getImapName());
+ }
+
+ return parent::delete($con);
+ }
+
+ // TODO: extract password logic into own library
+ public function isPasswordEqual($password)
+ {
+ // check crypt type
+ $server_settings = sfConfig::get('app_server_default');
+ $crypt_type = $server_settings['pam']['crypt'];
+
+ switch($crypt_type)
+ {
+ case 0: // plain
+ return ($password == $this->getPassword());
+ case 1: // crypt
+ return (crypt($password, substr($this->getPassword(), 0, 2)) == $this->getPassword());
+ case 2: // md5
+ return (md5($password) == $this->getPassword());
+ case 3: // sha1
+ return (sha1($password) == $this->getPassword());
+ break;
+ }
+
+ return false;
+ }
+
+ public function setPassword($password)
+ {
+ if($password=='')
+ return false;
+ // check crypt type
+ $server_settings = sfConfig::get('app_server_default');
+ $crypt_type = $server_settings['pam']['crypt'];
+
+ switch($crypt_type)
+ {
+ case 0: // plain
+ break;
+ case 1: // crypt
+ $password = crypt($password, substr($password, 0, 8));
+ break;
+ case 2: // md5
+ $password = md5($password);
+ break;
+ case 3: // sha1
+ $password = sha1($password);
+ break;
+ }
+
+ return parent::setPassword($password);
+ }
+
+ public function setNewPassword($password)
+ {
+ return $this->setPassword($password);
+ }
+
+ public function getAddressCount()
+ {
+ return $this->countAddresss();
+ }
+
+ public function __toString()
+ {
+ return $this->getName();
+ }
+}