1: <?php
2: /**
3: * Implementation of the Quota API for servers using Maildir++ quota files on
4: * the local filesystem.
5: *
6: * Copyright 2007-2012 Horde LLC (http://www.horde.org/)
7: *
8: * See the enclosed file COPYING for license information (GPL). If you
9: * did not receive this file, see http://www.horde.org/licenses/gpl.
10: *
11: * @author Eric Rostetter <eric.rostetter@physics.utexas.edu>
12: * @category Horde
13: * @license http://www.horde.org/licenses/gpl GPL
14: * @package IMP
15: */
16: class IMP_Quota_Maildir extends IMP_Quota_Base
17: {
18: /**
19: * Constructor.
20: *
21: * @param array $params Parameters:
22: * <pre>
23: * 'msg_count' - (boolean) Display information on the message limit rather
24: * than the storage limit?
25: * DEFAULT: false
26: * 'path' - (string) The path to the user's Maildir directory. You may use
27: * the two-character sequence "~U" to represent the user's
28: * account name, and the actual username will be substituted in
29: * that location.
30: * E.g., '/home/~U/Maildir/' or '/var/mail/~U/Maildir/'
31: * DEFAULT: ''
32: * </pre>
33: */
34: public function __construct($params = array())
35: {
36: parent::__construct(array_merge(array(
37: 'msg_count' => false,
38: 'path' => ''
39: ), $params));
40: }
41:
42: /**
43: * Returns quota information (used/allocated), in bytes.
44: *
45: * @return array An array with the following keys:
46: * <pre>
47: * 'limit' = Maximum quota allowed.
48: * 'usage' = Currently used portion of quota (in bytes).
49: * </pre>
50: * @throws IMP_Exception
51: */
52: public function getQuota()
53: {
54: $limit = $used = 0;
55:
56: // Get the full path to the quota file.
57: $full = $this->_params['path'] . '/maildirsize';
58:
59: // Substitute the username in the string if needed.
60: $full = str_replace('~U', $this->_params['username'], $full);
61:
62: // Read in the quota file and parse it, if possible.
63: if (!is_file($full)) {
64: throw new IMP_Exception(_("Unable to retrieve quota"));
65: }
66:
67: // Read in maildir quota file.
68: $lines = file($full);
69:
70: // Parse the lines.
71: foreach ($lines as $line_number => $line) {
72: if ($line_number == 0) {
73: // First line, quota header.
74: $line = preg_replace('/[ \t\n\r\0\x0B]/', '', $line);
75: list($v1, $t1, $v2, $t2) = sscanf($line, '%ld%[CS],%ld%[CS]');
76: if (is_null($v1) || is_null($t1)) {
77: $v1 = 0;
78: }
79: if (is_null($v2) || is_null($t2)) {
80: $v2 = 0;
81: }
82:
83: if ($this->_params['msg_count']) {
84: if ($t1 == 'C') {
85: $limit = $v1;
86: }
87: if ($t2 == 'C') {
88: $limit = $v2;
89: }
90: } else {
91: if ($t1 == 'S') {
92: $limit = $v1;
93: }
94: if ($t2 == 'S') {
95: $limit = $v2;
96: }
97: }
98: } else {
99: // Any line other than the first line.
100: // The quota used is the sum of all lines found.
101: list($storage, $message) = sscanf(trim($line), '%ld %d');
102: if ($this->_params['msg_count'] && !is_null($message)) {
103: $used += $message;
104: } elseif (!$this->_params['msg_count'] && !is_null($storage)) {
105: $used += $storage;
106: }
107: }
108: }
109:
110: return array(
111: 'limit' => $limit,
112: 'usage' => $used
113: );
114: }
115:
116: }
117: