mail_user_edit.php 14.4 KB
Newer Older
tbrehm's avatar
tbrehm committed
1 2
<?php
/*
3
Copyright (c) 2005 - 2009, Till Brehm, projektfarm Gmbh
tbrehm's avatar
tbrehm committed
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
All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice,
      this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
    * Neither the name of ISPConfig nor the names of its contributors
      may be used to endorse or promote products derived from this software without
      specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/


/******************************************
* Begin Form configuration
******************************************/

tbrehm's avatar
tbrehm committed
35
$tform_def_file = "form/mail_user.tform.php";
tbrehm's avatar
tbrehm committed
36 37 38 39 40 41 42 43

/******************************************
* End Form configuration
******************************************/

require_once('../../lib/config.inc.php');
require_once('../../lib/app.inc.php');

44 45
//* Check permissions for module
$app->auth->check_module_permissions('mail');
tbrehm's avatar
tbrehm committed
46 47 48 49 50 51 52

// Loading classes
$app->uses('tpl,tform,tform_actions');
$app->load('tform_actions');

class page_action extends tform_actions {
	
tbrehm's avatar
tbrehm committed
53 54 55 56 57 58
	
	function onShowNew() {
		global $app, $conf;
		
		// we will check only users, not admins
		if($_SESSION["s"]["user"]["typ"] == 'user') {
59 60 61 62 63
			if(!$app->tform->checkClientLimit('limit_mailbox')) {
				$app->error($app->tform->wordbook["limit_mailbox_txt"]);
			}
			if(!$app->tform->checkResellerLimit('limit_mailbox')) {
				$app->error('Reseller: '.$app->tform->wordbook["limit_mailbox_txt"]);
tbrehm's avatar
tbrehm committed
64 65 66 67 68 69
			}
		}
		
		parent::onShowNew();
	}
	
tbrehm's avatar
tbrehm committed
70 71 72 73 74 75 76 77
	function onShowEnd() {
		global $app, $conf;
		
		$email = $this->dataRecord["email"];
		$email_parts = explode("@",$email);
		$app->tpl->setVar("email_local_part",$email_parts[0]);
		
		// Getting Domains of the user
78 79
		// $sql = "SELECT domain, server_id FROM mail_domain WHERE ".$app->tform->getAuthSQL('r').' ORDER BY domain';
		$sql = "SELECT domain, server_id FROM mail_domain WHERE domain NOT IN (SELECT SUBSTR(source,2) FROM mail_forwarding WHERE type = 'aliasdomain') AND ".$app->tform->getAuthSQL('r')." ORDER BY domain";
tbrehm's avatar
tbrehm committed
80 81
		$domains = $app->db->queryAllRecords($sql);
		$domain_select = '';
tbrehm's avatar
tbrehm committed
82 83
		if(is_array($domains)) {
			foreach( $domains as $domain) {
84
				$selected = ($domain["domain"] == @$email_parts[1])?'SELECTED':'';
tbrehm's avatar
tbrehm committed
85 86
				$domain_select .= "<option value='$domain[domain]' $selected>$domain[domain]</option>\r\n";
			}
tbrehm's avatar
tbrehm committed
87 88
		}
		$app->tpl->setVar("email_domain",$domain_select);
tbrehm's avatar
tbrehm committed
89 90 91 92 93 94 95
		unset($domains);
		unset($domain_select);
		
		// Get the spamfilter policys for the user
		$tmp_user = $app->db->queryOneRecord("SELECT policy_id FROM spamfilter_users WHERE email = '".$this->dataRecord["email"]."'");
		$sql = "SELECT id, policy_name FROM spamfilter_policy WHERE ".$app->tform->getAuthSQL('r');
		$policys = $app->db->queryAllRecords($sql);
96
		$policy_select = "<option value='0'>".$app->tform->lng("no_policy")."</option>";
tbrehm's avatar
tbrehm committed
97 98 99 100 101 102 103 104 105 106
		if(is_array($policys)) {
			foreach( $policys as $p) {
				$selected = ($p["id"] == $tmp_user["policy_id"])?'SELECTED':'';
				$policy_select .= "<option value='$p[id]' $selected>$p[policy_name]</option>\r\n";
			}
		}
		$app->tpl->setVar("policy",$policy_select);
		unset($policys);
		unset($policy_select);
		unset($tmp_user);
tbrehm's avatar
tbrehm committed
107
		
tbrehm's avatar
tbrehm committed
108
		// Convert quota from Bytes to MB
tbrehm's avatar
tbrehm committed
109
		if($this->dataRecord["quota"] != -1) $app->tpl->setVar("quota",$this->dataRecord["quota"] / 1024 / 1024);
tbrehm's avatar
tbrehm committed
110
		
111 112 113 114 115 116 117
		// Is autoresponder set?
		if ($this->dataRecord['autoresponder'] == 'y') {
			$app->tpl->setVar("ar_active", 'checked="checked"');
		} else {
			$app->tpl->setVar("ar_active", '');
		}
		
118 119 120 121 122 123 124 125
    $app->uses('getconf');
    $mail_config = $app->getconf->get_global_config('mail');
		if($mail_config["enable_custom_login"] == "y") {
		    $app->tpl->setVar("enable_custom_login", 1);
		} else {
		    $app->tpl->setVar("enable_custom_login", 0);
		}
		
tbrehm's avatar
tbrehm committed
126 127 128 129 130 131
		parent::onShowEnd();
	}
	
	function onSubmit() {
		global $app, $conf;
		
132
		//* Check if Domain belongs to user
133 134
		if(isset($_POST["email_domain"])) {
			$domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r'));
135
			if($domain["domain"] != $_POST["email_domain"]) $app->tform->errorMessage .= $app->tform->lng("no_domain_perm");
136
		}
tbrehm's avatar
tbrehm committed
137
		
tbrehm's avatar
tbrehm committed
138
		
139
		//* if its an insert, check that the password is not empty
tbrehm's avatar
tbrehm committed
140
		if($this->id == 0 && $_POST["password"] == '') {
141
			$app->tform->errorMessage .= $app->tform->lng("error_no_pwd")."<br>";
tbrehm's avatar
tbrehm committed
142 143
		}
		
144
		//* Check the client limits, if user is not the admin
tbrehm's avatar
tbrehm committed
145 146 147 148
		if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin
			// Get the limits of the client
			$client_group_id = $_SESSION["s"]["user"]["default_group"];
			$client = $app->db->queryOneRecord("SELECT limit_mailbox, limit_mailquota FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
tbrehm's avatar
tbrehm committed
149
			
tbrehm's avatar
tbrehm committed
150

tbrehm's avatar
tbrehm committed
151
			// Check if the user may add another mailbox.
tbrehm's avatar
tbrehm committed
152
			if($this->id == 0 && $client["limit_mailbox"] >= 0) {
tbrehm's avatar
tbrehm committed
153 154
				$tmp = $app->db->queryOneRecord("SELECT count(mailuser_id) as number FROM mail_user WHERE sys_groupid = $client_group_id");
				if($tmp["number"] >= $client["limit_mailbox"]) {
155
					$app->tform->errorMessage .= $app->tform->lng("limit_mailbox_txt")."<br>";
tbrehm's avatar
tbrehm committed
156 157 158
				}
				unset($tmp);
			}
tbrehm's avatar
tbrehm committed
159 160
			
			// Check the quota and adjust
161
			if(isset($_POST["quota"]) && $client["limit_mailquota"] >= 0) {
162
				$tmp = $app->db->queryOneRecord("SELECT sum(quota) as mailquota FROM mail_user WHERE mailuser_id != ".intval($this->id)." AND ".$app->tform->getAuthSQL('u'));
163
				$mailquota = $tmp["mailquota"] / 1024 / 1024;
tbrehm's avatar
tbrehm committed
164
				$new_mailbox_quota = intval($this->dataRecord["quota"]);
165
				if(($mailquota + $new_mailbox_quota > $client["limit_mailquota"]) || ($new_mailbox_quota == 0 && $client["limit_mailquota"] != -1)) {
tbrehm's avatar
tbrehm committed
166
					$max_free_quota = $client["limit_mailquota"] - $mailquota;
167
					$app->tform->errorMessage .= $app->tform->lng("limit_mailquota_txt").": ".$max_free_quota."<br>";
tbrehm's avatar
tbrehm committed
168 169 170 171 172
					// Set the quota field to the max free space
					$this->dataRecord["quota"] = $max_free_quota;
				}
				unset($tmp);
				unset($tmp_quota);
tbrehm's avatar
tbrehm committed
173
			}
tbrehm's avatar
tbrehm committed
174
		} // end if user is not admin
tbrehm's avatar
tbrehm committed
175
		
tbrehm's avatar
tbrehm committed
176

177 178 179
    $app->uses('getconf');
    $mail_config = $app->getconf->get_server_config($domain["server_id"],'mail');
		
180
		//* compose the email field
181
		if(isset($_POST["email_local_part"]) && isset($_POST["email_domain"])) {
182
			$this->dataRecord["email"] = strtolower($_POST["email_local_part"]."@".$_POST["email_domain"]);
183 184 185
		
			// Set the server id of the mailbox = server ID of mail domain.
			$this->dataRecord["server_id"] = $domain["server_id"];
tbrehm's avatar
tbrehm committed
186
		
187 188
			unset($this->dataRecord["email_local_part"]);
			unset($this->dataRecord["email_domain"]);
tbrehm's avatar
tbrehm committed
189
		
190
			// Convert quota from MB to Bytes
tbrehm's avatar
tbrehm committed
191
			if($this->dataRecord["quota"] != -1) $this->dataRecord["quota"] = $this->dataRecord["quota"] * 1024 * 1024;
tbrehm's avatar
tbrehm committed
192
		
193 194
			// setting Maildir, Homedir, UID and GID
			$maildir = str_replace("[domain]",$domain["domain"],$mail_config["maildir_path"]);
195
			$maildir = str_replace("[localpart]",strtolower($_POST["email_local_part"]),$maildir);
196 197 198 199
			$this->dataRecord["maildir"] = $maildir;
			$this->dataRecord["homedir"] = $mail_config["homedir_path"];
			$this->dataRecord["uid"] = $mail_config["mailuser_uid"];
			$this->dataRecord["gid"] = $mail_config["mailuser_gid"];
200 201
			
			//* Check if there is no alias or forward with this address
202
			$tmp = $app->db->queryOneRecord("SELECT count(forwarding_id) as number FROM mail_forwarding WHERE active = 'y' AND source = '".$app->db->quote($this->dataRecord["email"])."'");
203 204 205
			if($tmp['number'] > 0) $app->tform->errorMessage .= $app->tform->lng("duplicate_alias_or_forward_txt")."<br>";
			unset($tmp);
			
206
		}
tbrehm's avatar
tbrehm committed
207
		
208 209 210 211 212 213 214
    $sys_config = $app->getconf->get_global_config('mail');
    if($sys_config["enable_custom_login"] == "y") {
        if(!isset($_POST["login"])) $this->dataRecord["login"] = $this->dataRecord["email"];
        elseif(strpos($_POST["login"], '@') !== false && $_POST["login"] != $this->dataRecord["email"]) $app->tform->errorMessage .= $app->tform->lng("error_login_email_txt")."<br>";
		} else {
        $this->dataRecord["login"] = $this->dataRecord["email"];
		}
215 216 217 218 219 220
		//* if autoresponder checkbox not selected, do not save dates
		if (!isset($_POST['autoresponder']) && array_key_exists('autoresponder_start_date', $_POST)) {
			$this->dataRecord['autoresponder_start_date'] = array_map(create_function('$item','return 0;'), $this->dataRecord['autoresponder_start_date']);
			$this->dataRecord['autoresponder_end_date'] = array_map(create_function('$item','return 0;'), $this->dataRecord['autoresponder_end_date']);
		}
		
tbrehm's avatar
tbrehm committed
221 222 223
		parent::onSubmit();
	}
	
tbrehm's avatar
tbrehm committed
224 225 226 227
	function onAfterInsert() {
		global $app, $conf;
		
		// Set the domain owner as mailbox owner
tbrehm's avatar
tbrehm committed
228
		$domain = $app->db->queryOneRecord("SELECT sys_groupid, server_id FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r'));
tbrehm's avatar
tbrehm committed
229
		$app->db->query("UPDATE mail_user SET sys_groupid = ".$domain["sys_groupid"]." WHERE mailuser_id = ".$this->id);
tbrehm's avatar
tbrehm committed
230 231 232 233
		
		// Spamfilter policy
		$policy_id = intval($this->dataRecord["policy"]);
		if($policy_id > 0) {
234
			$tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = '".$app->db->quote($this->dataRecord["email"])."'");
tbrehm's avatar
tbrehm committed
235 236
			if($tmp_user["id"] > 0) {
				// There is already a record that we will update
237
				$app->db->datalogUpdate('spamfilter_users', "policy_id = $policy_id", 'id', $tmp_user["id"]);
tbrehm's avatar
tbrehm committed
238 239
			} else {
				// We create a new record
240
				$insert_data = "(`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `priority`, `policy_id`, `email`, `fullname`, `local`) 
241
				        VALUES (".$_SESSION["s"]["user"]["userid"].", ".$domain["sys_groupid"].", 'riud', 'riud', '', ".$domain["server_id"].", 10, ".$policy_id.", '".$app->db->quote($this->dataRecord["email"])."', '".$app->db->quote($this->dataRecord["email"])."', 'Y')";
242
				$app->db->datalogInsert('spamfilter_users', $insert_data, 'id');
tbrehm's avatar
tbrehm committed
243 244 245
			}
		}  // endif spamfilter policy
		
246 247 248 249 250 251 252 253
		
		// Set the fields for dovecot
		if(isset($this->dataRecord["email"])) {
			$disableimap = ($this->dataRecord["disableimap"])?'y':'n';
			$disablepop3 = ($this->dataRecord["disablepop3"])?'y':'n';
			$disabledeliver = ($this->dataRecord["postfix"] == 'y')?'n':'y';
			$disablesmtp = ($this->dataRecord["postfix"] == 'y')?'n':'y';
		
254
			$sql = "UPDATE mail_user SET disableimap = '$disableimap', disablesieve = '$disableimap', disablepop3 = '$disablepop3', disablesmtp = '$disablesmtp', disabledeliver = '$disabledeliver', disablelda = '$disabledeliver' WHERE mailuser_id = ".$this->id;
255 256
			$app->db->query($sql);
		}
tbrehm's avatar
tbrehm committed
257 258 259 260 261 262
	}
	
	function onAfterUpdate() {
		global $app, $conf;
		
		// Set the domain owner as mailbox owner
263 264 265
		if(isset($_POST["email_domain"])) {
			$domain = $app->db->queryOneRecord("SELECT sys_groupid, server_id FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r'));
			$app->db->query("UPDATE mail_user SET sys_groupid = ".$domain["sys_groupid"]." WHERE mailuser_id = ".$this->id);
tbrehm's avatar
tbrehm committed
266
		
267 268
			// Spamfilter policy
			$policy_id = intval($this->dataRecord["policy"]);
269
			$tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = '".$app->db->quote($this->dataRecord["email"])."'");
270 271 272
			if($policy_id > 0) {
				if($tmp_user["id"] > 0) {
					// There is already a record that we will update
273
					$app->db->datalogUpdate('spamfilter_users', "policy_id = $policy_id", 'id', $tmp_user["id"]);
274 275
				} else {
					// We create a new record
276
					$insert_data = "(`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `priority`, `policy_id`, `email`, `fullname`, `local`) 
277
				        	VALUES (".$_SESSION["s"]["user"]["userid"].", ".$domain["sys_groupid"].", 'riud', 'riud', '', ".$domain["server_id"].", 10, ".$policy_id.", '".$app->db->quote($this->dataRecord["email"])."', '".$app->db->quote($this->dataRecord["email"])."', 'Y')";
278
					$app->db->datalogInsert('spamfilter_users', $insert_data, 'id');
279 280 281 282
				}
			}else {
				if($tmp_user["id"] > 0) {
					// There is already a record but the user shall have no policy, so we delete it
283
					$app->db->datalogDelete('spamfilter_users', 'id', $tmp_user["id"]);
284 285 286
				}
			} // endif spamfilter policy
		}
tbrehm's avatar
tbrehm committed
287
		
288 289 290 291 292 293 294
		// Set the fields for dovecot
		if(isset($this->dataRecord["email"])) {
			$disableimap = ($this->dataRecord["disableimap"])?'y':'n';
			$disablepop3 = ($this->dataRecord["disablepop3"])?'y':'n';
			$disabledeliver = ($this->dataRecord["postfix"] == 'y')?'n':'y';
			$disablesmtp = ($this->dataRecord["postfix"] == 'y')?'n':'y';
		
295
			$sql = "UPDATE mail_user SET disableimap = '$disableimap', disablesieve = '$disableimap', disablepop3 = '$disablepop3', disablesmtp = '$disablesmtp', disabledeliver = '$disabledeliver', disablelda = '$disabledeliver' WHERE mailuser_id = ".$this->id;
296 297 298
			$app->db->query($sql);
		}
		
tbrehm's avatar
tbrehm committed
299
		//** If the email address has been changed, change it in all aliases too
300 301
		if(isset($this->dataRecord['email']) && $this->oldDataRecord['email'] != $this->dataRecord['email']) {
		//if($this->oldDataRecord['email'] != $this->dataRecord['email']) {
tbrehm's avatar
tbrehm committed
302 303 304 305 306 307 308 309 310 311 312 313
			
			//* Update the aliases
			$forwardings = $app->db->queryAllRecords("SELECT * FROM mail_forwarding WHERE destination = '".$app->db->quote($this->oldDataRecord['email'])."'");
			if(is_array($forwardings)) {
				foreach($forwardings as $rec) {
					$destination = $app->db->quote($this->dataRecord['email']);
					$app->db->datalogUpdate('mail_forwarding', "destination = '$destination'", 'forwarding_id', $rec['forwarding_id']);
				}
			}
			
		} // end if email addess changed
		
tbrehm's avatar
tbrehm committed
314 315
	}
	
tbrehm's avatar
tbrehm committed
316 317 318 319 320
}

$app->tform_actions = new page_action;
$app->tform_actions->onLoad();

321
?>