1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224
|
<?php
/**
* The IMAP_Admin:: class allow managing of mailboxes on IMAP servers.
*
* Required parameters:<pre>
* 'admin_user' The name of a user with admin privileges.
* 'admin_password' The password of the adminstrator.</pre>
*
* Optional parameters:<pre>
* 'hostspec' The hostname or IP address of the server.
* DEFAULT: 'localhost'
* 'port' The server port to which we will connect.
* IMAP is generally 143, while IMAP-SSL is generally 993.
* DEFAULT: 143
* 'protocol' The connection protocol (e.g. 'imap', 'pop3', 'nntp').
* Protocol is one of 'imap/notls' (or only 'imap' if you
* have a c-client version 2000c or older), 'imap/ssl',
* or 'imap/ssl/novalidate-cert' (for a self-signed
* certificate).
* DEFAULT: 'imap'
* 'userhierarchy' The hierarchy where user mailboxes are stored.
* DEFAULT: 'user.'
* 'dsn' The full IMAP connection string.
* If not present, this is built from 'hostspec', 'port'
* and 'protocol' parameters.</pre>
*
* $Horde: framework/IMAP/IMAP/Admin.php,v 1.5.6.9 2006/05/31 19:39:47 slusarz Exp $
*
* Copyright 2004-2006 Jan Schneider <jan@horde.org>
*
* See the enclosed file COPYING for license information (LGPL). If you
* did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
*
* @author Jan Schneider <jan@horde.org>
* @since Horde 3.0
* @package Horde_IMAP
*/
class IMAP_Admin {
/**
* Parameter hash.
*
* @var array
*/
var $_params;
/**
* IMAP resource.
*
* @var resource
*/
var $_imap;
/**
* Constructor.
*
* @param array $params A hash with all necessary parameters
*/
function IMAP_Admin($params)
{
$default_params = array(
'hostspec' => 'localhost',
'port' => '143',
'protocol' => 'imap',
'userhierarchy' => 'user.'
);
$this->_params = array_merge($default_params, $params);
/* Create DSN string. */
if (!isset($this->_params['dsn'])) {
$this->_params['dsn'] = sprintf('{%s:%d/%s}',
$this->_params['hostspec'],
$this->_params['port'],
$this->_params['protocol']);
$this->_ref = $this->_params['dsn'];
} else {
if (preg_match('/^{([^:]+):(\d+)\/([^}]+)}/', $this->_params['dsn'], $matches)) {
$this->_params['hostspec'] = $matches[1];
$this->_params['port'] = $matches[2];
$this->_params['protocol'] = $matches[3];
$this->_ref = sprintf('{%s:%d/%s}',
$this->_params['hostspec'],
$this->_params['port'],
$this->_params['protocol']);
}
}
}
/**
* Connects to the IMAP server with the parameters passed to the
* constructor.
*
* @return resource|object An IMAP resource or a PEAR_Error on failure
*/
function _connect()
{
if (!isset($this->_imap)) {
$this->_imap = @imap_open($this->_ref,
$this->_params['admin_user'],
$this->_params['admin_password'],
OP_HALFOPEN);
if (!$this->_imap) {
$this->_imap = PEAR::raiseError(_("Authentication at IMAP server failed."), 'horde.error');
}
}
return $this->_imap;
}
/**
* Adds a mailbox.
*
* @param string $mailbox The mailbox name to add.
*
* @return mixed True on success or a PEAR_Error object on failure.
*/
function addMailbox($mailbox)
{
if (is_a($imap = $this->_connect(), 'PEAR_Error')) {
return $imap;
}
if (!@imap_createmailbox($imap, $this->_ref . $this->_params['userhierarchy'] . $mailbox)) {
return PEAR::raiseError(imap_last_error(), 'horde.warning');
}
return $this->_grantAdminPerms($mailbox);
}
/**
* Grant the admin user all rights on the mailbox.
*
* @access private
*
* @param string $mailbox the name of the mailbox on which we will
* grant the permission
* @return mixed True if successful, or PEAR_Error on failure
*/
function _grantAdminPerms($mailbox)
{
require_once dirname(__FILE__) . '/ACL.php';
$params = array('username' => $this->_params['admin_user'],
'password' => $this->_params['admin_password'],
'hostspec' => $this->_params['hostspec'],
'port' => $this->_params['port'],
'protocol' => $this->_params['protocol']);
$acl = &IMAP_ACL::factory('rfc2086', $params);
$result = $acl->createACL($this->_params['userhierarchy'] . $mailbox,
$this->_params['admin_user'],
array('l' => true,
'r' => true,
's' => true,
'w' => true,
'i' => true,
'p' => true,
'c' => true,
'd' => true,
'a' => true));
if (is_a($result, 'PEAR_Error')) {
return $result;
}
return true;
}
/**
* Deletes a mailbox.
*
* @param string $mailbox The mailbox to delete.
*
* @return mixed True on success or a PEAR_Error object on failure.
*/
function removeMailbox($mailbox)
{
if (is_a($imap = $this->_connect(), 'PEAR_Error')) {
return $imap;
}
$this->_grantAdminPerms($mailbox);
if (!@imap_deletemailbox($imap, $this->_ref . $this->_params['userhierarchy'] . $mailbox)) {
return PEAR::raiseError(imap_last_error(), 'horde.warning');
}
return true;
}
/**
* List all mailboxes.
*
* Note that this does not work on a virtual-domain enabled Cyrus (it will
* only return mailboxes in the default domain).
*
* @return mixed The array of mailboxes, or a PEAR_Error object on failure.
*/
function listMailboxes()
{
if (is_a($imap = $this->_connect(), 'PEAR_Error')) {
return $imap;
}
$list = @imap_list($imap, $this->_ref, $this->_params['userhierarchy'] . '%');
if (!$list) {
return array();
}
return preg_replace('/.*' . preg_quote($this->_params['userhierarchy'], '/') . '(.*)/', '\\1', $list);
}
/**
* Check whether a mailbox exists.
*
* @param string $mailbox The mailbox to check.
* @return mixed True if mailbox exists, false if not, or a PEAR_Error.
*/
function mailboxExists($mailbox)
{
if (is_a($imap = $this->_connect(), 'PEAR_Error')) {
return $imap;
}
$list = @imap_list($imap, $this->_ref, $this->_params['userhierarchy'] . $mailbox);
if ($list === false) {
return false;
}
return count($list) > 0;
}
}
|