1<?php
2/**
3 * EGroupware Api: Support for DBMail IMAP with qmailUser LDAP schema
4 *
5 * @link http://www.stylite.de
6 * @package api
7 * @subpackage mail
8 * @author Ralf Becker <rb@stylite.de>
9 * @author Klaus Leithoff <kl@stylite.de>
10 * @author Lars Kneschke
11 * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
12 * @version $Id$
13 */
14
15namespace EGroupware\Api\Mail\Imap;
16
17use EGroupware\Api\Mail;
18use EGroupware\Api\Ldap;
19
20/**
21 * Support for DBMail IMAP with qmailUser LDAP schema
22 *
23 * @todo base this class on dbmaildbmailuser or the other way around
24 */
25class Dbmailqmailuser extends Mail\Imap
26{
27	/**
28	 * Label shown in EMailAdmin
29	 */
30	const DESCRIPTION = 'DBMail (qmailUser Schema)';
31
32	/**
33	 * Capabilities of this class (pipe-separated): default, sieve, admin, logintypeemail
34	 */
35	const CAPABILITIES = 'default|sieve';
36
37	function addAccount($_hookValues)
38	{
39		return $this->updateAccount($_hookValues);
40	}
41
42	#function deleteAccount($_hookValues) {
43	#}
44	function getUserData($_username)
45	{
46		$userData = array();
47
48		$ds = Ldap::factory();
49
50		if(!is_resource($ds)) {
51			return false;
52		}
53
54		$filter		= '(&(objectclass=posixaccount)(uid='. $_username .')(qmailGID='. sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])) .'))';
55		$justthese	= array('dn', 'objectclass', 'mailQuota');
56		if(($sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese))) {
57
58			if(($info = ldap_get_entries($ds, $sri))) {
59				if(isset($info[0]['mailquota'][0])) {
60					$userData['quotaLimit'] = $info[0]['mailquota'][0] / 1048576;
61				}
62			}
63		}
64		return $userData;
65	}
66
67	function updateAccount($_hookValues) {
68		if(!$uidnumber = (int)$_hookValues['account_id']) {
69			return false;
70		}
71
72		$ds = Ldap::factory();
73
74		if(!is_resource($ds)) {
75			return false;
76		}
77
78		$filter		= '(&(objectclass=posixaccount)(uidnumber='. $uidnumber .'))';
79		$justthese	= array('dn', 'objectclass', 'qmailUID', 'qmailGID', 'mail');
80		$sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese);
81
82		if(($info = ldap_get_entries($ds, $sri))) {
83			if(!in_array('qmailuser',$info[0]['objectclass']) && $info[0]['email']) {
84				$newData['objectclass'] = $info[0]['objectclass'];
85				unset($newData['objectclass']['count']);
86				$newData['objectclass'][] = 'qmailuser';
87				sort($newData['objectclass']);
88				$newData['qmailGID']	= sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id']));
89				#$newData['qmailUID']	= (!empty($this->domainName)) ? $_username .'@'. $this->domainName : $_username;
90
91				ldap_modify($ds, $info[0]['dn'], $newData);
92
93				return true;
94			} else {
95				$newData = array();
96				$newData['qmailGID']	= sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id']));
97				#$newData['qmailUID']	= (!empty($this->domainName)) ? $_username .'@'. $this->domainName : $_username;
98
99				if(!ldap_modify($ds, $info[0]['dn'], $newData)) {
100					#print ldap_error($ds);
101					#return false;
102				}
103			}
104		}
105
106		return false;
107	}
108
109	function setUserData($_username, $_quota) {
110		$ds = Ldap::factory();
111
112		if(!is_resource($ds)) {
113			return false;
114		}
115
116		$filter		= '(&(objectclass=posixaccount)(uid='. $_username .'))';
117		$justthese	= array('dn', 'objectclass', 'qmailGID', 'mail');
118		$sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese);
119
120		if(($info = ldap_get_entries($ds, $sri))) {
121			#_debug_array($info);
122			if(!in_array('qmailuser',$info[0]['objectclass']) && $info[0]['email']) {
123				$newData['objectclass'] = $info[0]['objectclass'];
124				unset($newData['objectclass']['count']);
125				$newData['objectclass'][] = 'qmailuser';
126				sort($newData['objectclass']);
127				$newData['qmailGID']	= sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id']));
128
129				ldap_modify($ds, $info[0]['dn'], $newData);
130			} else {
131				if (in_array('qmailuser',$info[0]['objectclass']) && !$info[0]['qmailgid']) {
132					$newData = array();
133					$newData['qmailGID']	= sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id']));
134
135					if(!ldap_modify($ds, $info[0]['dn'], $newData)) {
136						#print ldap_error($ds);
137						#return false;
138					}
139				}
140			}
141
142			$newData = array();
143
144			if((int)$_quota >= 0) {
145				$newData['mailQuota'] = (int)$_quota * 1048576;
146			} else {
147				$newData['mailQuota'] = array();
148			}
149
150			if(!ldap_modify($ds, $info[0]['dn'], $newData)) {
151				#print ldap_error($ds);
152				return false;
153			}
154
155			return true;
156		}
157
158		return false;
159	}
160}
161