auth.inc.php 10.2 KB
Newer Older
latham's avatar
latham committed
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
<?php

/*
Copyright (c) 2007, Till Brehm, projektfarm Gmbh
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.
*/

class auth {
	var $client_limits = null;

	public function get_user_id()
	{
36
		global $app;
Till Brehm's avatar
Till Brehm committed
37
		return $app->functions->intval($_SESSION['s']['user']['userid']);
latham's avatar
latham committed
38
	}
39

latham's avatar
latham committed
40
41
42
43
44
45
	public function is_admin() {
		if($_SESSION['s']['user']['typ'] == 'admin') {
			return true;
		} else {
			return false;
		}
46
	}
47
48
	
	public function is_superadmin() {
49
		if($_SESSION['s']['user']['typ'] == 'admin' && $_SESSION['s']['user']['userid'] == 1) {
50
51
52
53
54
			return true;
		} else {
			return false;
		}
	}
55

latham's avatar
latham committed
56
57
	public function has_clients($userid) {
		global $app, $conf;
58

59
		$userid = $app->functions->intval($userid);
60
		$client = $app->db->queryOneRecord("SELECT client.limit_client FROM sys_user, client WHERE sys_user.userid = ? AND sys_user.client_id = client.client_id", $userid);
61
		if($client['limit_client'] != 0) {
latham's avatar
latham committed
62
63
64
65
66
			return true;
		} else {
			return false;
		}
	}
67
68
69
70
71
72
73
74
75
76
77
78
79
80
	
	// Function to check if a client belongs to a reseller
	public function is_client_of_reseller($userid = 0) {
		global $app, $conf;
		
		if($userid == 0) $userid = $_SESSION['s']['user']['userid'];

		$client = $app->db->queryOneRecord("SELECT client.sys_userid, client.sys_groupid FROM sys_user, client WHERE sys_user.userid = ? AND sys_user.client_id = client.client_id", $userid);
		if($client['sys_userid'] > 1 || $client['sys_groupid'] > 1) {
			return true;
		} else {
			return false;
		}
	}
81

latham's avatar
latham committed
82
	//** This function adds a given group id to a given user.
83
	public function add_group_to_user($userid, $groupid) {
latham's avatar
latham committed
84
		global $app;
85

86
87
		$userid = $app->functions->intval($userid);
		$groupid = $app->functions->intval($groupid);
88

latham's avatar
latham committed
89
		if($userid > 0 && $groupid > 0) {
90
			$user = $app->db->queryOneRecord("SELECT * FROM sys_user WHERE userid = ?", $userid);
91
92
93
			$groups = explode(',', $user['groups']);
			if(!in_array($groupid, $groups)) $groups[] = $groupid;
			$groups_string = implode(',', $groups);
94
95
			$sql = "UPDATE sys_user SET groups = ? WHERE userid = ?";
			$app->db->query($sql, $groups_string, $userid);
latham's avatar
latham committed
96
97
98
99
100
101
102
103
104
105
			return true;
		} else {
			return false;
		}
	}

	//** This function returns given client limit as integer, -1 means no limit
	public function get_client_limit($userid, $limitname)
	{
		global $app;
Till Brehm's avatar
Till Brehm committed
106
107
		
		$userid = $app->functions->intval($userid);
108
		if(!preg_match('/^[a-zA-Z0-9\-\_]{1,64}$/',$limitname)) $app->error('Invalid limit name '.$limitname);
Till Brehm's avatar
Till Brehm committed
109
		
latham's avatar
latham committed
110
		// simple query cache
111
		if($this->client_limits===null)
112
			$this->client_limits = $app->db->queryOneRecord("SELECT client.* FROM sys_user, client WHERE sys_user.userid = ? AND sys_user.client_id = client.client_id", $userid);
113

latham's avatar
latham committed
114
115
116
		// isn't client -> no limit
		if(!$this->client_limits)
			return -1;
117

latham's avatar
latham committed
118
119
		if(isset($this->client_limits['limit_'.$limitname])) {
			return $this->client_limits['limit_'.$limitname];
120
121
122
		}
	}

latham's avatar
latham committed
123
	//** This function removes a given group id from a given user.
124
	public function remove_group_from_user($userid, $groupid) {
latham's avatar
latham committed
125
		global $app;
126

127
128
		$userid = $app->functions->intval($userid);
		$groupid = $app->functions->intval($groupid);
129

latham's avatar
latham committed
130
		if($userid > 0 && $groupid > 0) {
131
			$user = $app->db->queryOneRecord("SELECT * FROM sys_user WHERE userid = ?", $userid);
132
133
			$groups = explode(',', $user['groups']);
			$key = array_search($groupid, $groups);
latham's avatar
latham committed
134
			unset($groups[$key]);
135
			$groups_string = implode(',', $groups);
136
137
			$sql = "UPDATE sys_user SET groups = ? WHERE userid = ?";
			$app->db->query($sql, $groups_string, $userid);
latham's avatar
latham committed
138
139
140
141
142
			return true;
		} else {
			return false;
		}
	}
143

latham's avatar
latham committed
144
145
	public function check_module_permissions($module) {
		// Check if the current user has the permissions to access this module
Marius Cramer's avatar
Marius Cramer committed
146
		$module = trim(preg_replace('@\s+@', '', $module));
147
		$user_modules = explode(',',$_SESSION["s"]["user"]["modules"]);
Marius Cramer's avatar
Marius Cramer committed
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
		if(strpos($module, ',') !== false){
			$can_use_module = false;
			$tmp_modules = explode(',', $module);
			if(is_array($tmp_modules) && !empty($tmp_modules)){
				foreach($tmp_modules as $tmp_module){
					if($tmp_module != ''){
						if(in_array($tmp_module,$user_modules)) {
							$can_use_module = true;
							break;
						}
					}
				}
			}
			if(!$can_use_module){
				// echo "LOGIN_REDIRECT:/index.php";
				header("Location: /index.php");
				exit;
			}
		} else {
			if(!in_array($module,$user_modules)) {
				// echo "LOGIN_REDIRECT:/index.php";
				header("Location: /index.php");
				exit;
			}
latham's avatar
latham committed
172
173
		}
	}
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
	
	public function check_security_permissions($permission) {
		
		global $app;
		
		$app->uses('getconf');
		$security_config = $app->getconf->get_security_config('permissions');

		$security_check = false;
		if($security_config[$permission] == 'yes') $security_check = true;
		if($security_config[$permission] == 'superadmin' && $app->auth->is_superadmin()) $security_check = true;
		if($security_check !== true) {
			$app->error($app->lng('security_check1_txt').' '.$permission.' '.$app->lng('security_check2_txt'));
		}
		
	}
190

191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
	public function get_random_password($minLength = 8, $special = false) {
		if($minLength < 8) $minLength = 8;
		$maxLength = $minLength + 5;
		$length = mt_rand($minLength, $maxLength);
		
		$alphachars = "abcdefghijklmnopqrstuvwxyz";
		$upperchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		$numchars = "1234567890";
		$specialchars = "!@#_";
		
		$num_special = 0;
		if($special == true) {
			$num_special = intval(mt_rand(0, round($length / 4))) + 1;
		}
		$numericlen = mt_rand(1, 2);
		$alphalen = $length - $num_special - $numericlen;
		$upperlen = intval($alphalen / 2);
		$alphalen = $alphalen - $upperlen;
209
		$password = '';
210
211
212
213
214
215
216
217
218
219
220
		
		for($i = 0; $i < $alphalen; $i++) {
			$password .= substr($alphachars, mt_rand(0, strlen($alphachars) - 1), 1);
		}
		
		for($i = 0; $i < $upperlen; $i++) {
			$password .= substr($upperchars, mt_rand(0, strlen($upperchars) - 1), 1);
		}
		
		for($i = 0; $i < $num_special; $i++) {
			$password .= substr($specialchars, mt_rand(0, strlen($specialchars) - 1), 1);
221
		}
222
223
224
225
226
227
		
		for($i = 0; $i < $numericlen; $i++) {
			$password .= substr($numchars, mt_rand(0, strlen($numchars) - 1), 1);
		}
		
		return str_shuffle($password);
228
	}
229

230
231
232
233
	public function crypt_password($cleartext_password, $charset = 'UTF-8') {
		if($charset != 'UTF-8') {
			$cleartext_password = mb_convert_encoding($cleartext_password, $charset, 'UTF-8');
		}
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
		
		if(defined('CRYPT_SHA512') && CRYPT_SHA512 == 1) {
			$salt = '$6$rounds=5000$';
			$salt_length = 16;
		} elseif(defined('CRYPT_SHA256') && CRYPT_SHA256 == 1) {
			$salt = '$5$rounds=5000$';
			$salt_length = 16;
		} else {
			$salt = '$1$';
			$salt_length = 12;
		}
		
		if(function_exists('openssl_random_pseudo_bytes')) {
			$salt .= substr(bin2hex(openssl_random_pseudo_bytes($salt_length)), 0, $salt_length);
		} else {
			$base64_alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./';
			for($n = 0; $n < $salt_length; $n++) {
				$salt .= $base64_alphabet[mt_rand(0, 63)];
			}
253
		}
254
		$salt .= "$";
255
		return crypt($cleartext_password, $salt);
256
	}
Till Brehm's avatar
Till Brehm committed
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
	
	public function csrf_token_get($form_name) {
		/* CSRF PROTECTION */
		// generate csrf protection id and key
		$_csrf_id = uniqid($form_name . '_'); // form id
		$_csrf_key = sha1(uniqid(microtime(true), true)); // the key
		if(!isset($_SESSION['_csrf'])) $_SESSION['_csrf'] = array();
		if(!isset($_SESSION['_csrf_timeout'])) $_SESSION['_csrf_timeout'] = array();
		$_SESSION['_csrf'][$_csrf_id] = $_csrf_key;
		$_SESSION['_csrf_timeout'][$_csrf_id] = time() + 3600; // timeout hash in 1 hour
		
		return array('csrf_id' => $_csrf_id,'csrf_key' => $_csrf_key);
	}
	
	public function csrf_token_check() {
		global $app;
		
		if(isset($_POST) && is_array($_POST)) {
			$_csrf_valid = false;
			if(isset($_POST['_csrf_id']) && isset($_POST['_csrf_key'])) {
				$_csrf_id = trim($_POST['_csrf_id']);
				$_csrf_key = trim($_POST['_csrf_key']);
				if(isset($_SESSION['_csrf']) && isset($_SESSION['_csrf'][$_csrf_id]) && isset($_SESSION['_csrf_timeout']) && isset($_SESSION['_csrf_timeout'][$_csrf_id])) {
					if($_SESSION['_csrf'][$_csrf_id] === $_csrf_key && $_SESSION['_csrf_timeout'] >= time()) $_csrf_valid = true;
				}
			}
			if($_csrf_valid !== true) {
				$app->log('CSRF attempt blocked. Referer: ' . (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : 'unknown'), LOGLEVEL_WARN);
				$app->error($app->lng('err_csrf_attempt_blocked'));
			}
			$_SESSION['_csrf'][$_csrf_id] = null;
			$_SESSION['_csrf_timeout'][$_csrf_id] = null;
			unset($_SESSION['_csrf'][$_csrf_id]);
			unset($_SESSION['_csrf_timeout'][$_csrf_id]);
			
			if(isset($_SESSION['_csrf_timeout']) && is_array($_SESSION['_csrf_timeout'])) {
				$to_unset = array();
				foreach($_SESSION['_csrf_timeout'] as $_csrf_id => $timeout) {
					if($timeout < time()) $to_unset[] = $_csrf_id;
				}
				foreach($to_unset as $_csrf_id) {
					$_SESSION['_csrf'][$_csrf_id] = null;
					$_SESSION['_csrf_timeout'][$_csrf_id] = null;
					unset($_SESSION['_csrf'][$_csrf_id]);
					unset($_SESSION['_csrf_timeout'][$_csrf_id]);
				}
				unset($to_unset);
			}
		}
	}
307

latham's avatar
latham committed
308
309
}

310
?>