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
|
<?php
/**
* Implementation of the Quota API for MDaemon servers.
*
* Parameters required:
* 'app_location' -- TODO
*
* $Horde: imp/lib/Quota/mdaemon.php,v 1.11.10.11 2008/01/02 11:32:06 jan Exp $
*
* Copyright 2002-2008 The Horde Project (http://www.horde.org/)
*
* See the enclosed file COPYING for license information (GPL). If you
* did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
*
* @author Mike Cochrane <mike@graftonhall.co.nz>
* @package IMP_Quota
*/
class IMP_Quota_mdaemon extends IMP_Quota {
/**
* Get quota information (used/allocated), in bytes.
*
* @return mixed An associative array.
* 'limit' = Maximum quota allowed
* 'usage' = Currently used portion of quota (in bytes)
* Returns PEAR_Error on failure.
*/
function getQuota()
{
$userDetails = $this->_getUserDetails($_SESSION['imp']['user'], $_SESSION['imp']['maildomain']);
if ($userDetails !== false) {
$userHome = trim(substr($userDetails, 105, 90));
$total = intval(substr($userDetails, 229, 6)) * 1024;
if ($total == 0) {
return array('usage' => 0, 'limit' => 0);
}
if (($taken = $this->_mailboxSize($userHome)) !== false) {
return array('usage' => $taken, 'limit' => $total);
}
}
return PEAR::raiseError(_("Unable to retrieve quota"), 'horde.error');
}
/**
* Get the size of a mailbox
*
* @access private
*
* @param string $path The full path of the mailbox to fetch the quota
* for including trailing backslash.
*
* @return mixed The number of bytes in the mailbox (integer) or false
* (boolean) on error.
*/
function _mailboxSize($path)
{
$contents = file_get_contents($path . '\imap.mrk');
$pointer = 36;
$size = 0;
while ($pointer < strlen($contents)) {
$details = unpack('a17Filename/a11Crap/VSize', substr($contents, $pointer, 36));
$size += $details['Size'];
$pointer += 36;
}
/* Recursivly check subfolders. */
$d = dir($path);
while (($entry = $d->read()) !== false) {
if (($entry != '.') &&
($entry != '..') &&
(substr($entry, -5, 5) == '.IMAP')) {
$size += $this->_mailboxSize($path . $entry . '\\');
}
}
$d->close();
return $size;
}
/**
* Retrieve relevant line from userlist.dat.
*
* @param string $user The username for which to retrieve detals.
* @param string $realm The realm (domain) for the user.
*
* @return mixed Line from userlist.dat (string) or false (boolean).
*/
function _getUserDetails($user, $realm)
{
$searchString = str_pad($realm, 45) . str_pad($user, 30);
if (!($fp = fopen($this->_params['app_location'] . '/userlist.dat', 'rb'))) {
return false;
}
while (!feof($fp)) {
$line = fgets($fp, 4096);
if (substr($line, 0, strlen($searchString)) == $searchString) {
fclose($fp);
return $line;
}
}
fclose($fp);
return false;
}
}
|