3 0fd75c45 2022-07-30 mischa // Postfix Admin
4 0fd75c45 2022-07-30 mischa // by Mischa Peters <mischa at high5 dot nl>
5 0fd75c45 2022-07-30 mischa // Copyright (c) 2002 - 2005, 2021 High5!
6 0fd75c45 2022-07-30 mischa // License Info: http://www.postfixadmin.com/?file=LICENSE.TXT
8 0fd75c45 2022-07-30 mischa // File: functions.inc.php
10 0fd75c45 2022-07-30 mischa //error_reporting (E_NOTICE | E_ERROR | E_WARNING | E_PARSE);
12 0fd75c45 2022-07-30 mischa if (preg_match ("/functions.inc.php/", $_SERVER['PHP_SELF']))
14 0fd75c45 2022-07-30 mischa header ("Location: login.php");
18 0fd75c45 2022-07-30 mischa $version = "2.1.1-SP6-20210626";
21 0fd75c45 2022-07-30 mischa // check_session
22 0fd75c45 2022-07-30 mischa // Action: Check if a session already exists, if not redirect to login.php
23 0fd75c45 2022-07-30 mischa // Call: check_session ()
25 0fd75c45 2022-07-30 mischa function check_session ()
27 0fd75c45 2022-07-30 mischa session_start ();
28 0fd75c45 2022-07-30 mischa if (!$_SESSION['sessid']['username'])
30 0fd75c45 2022-07-30 mischa header ("Location: login.php");
33 0fd75c45 2022-07-30 mischa $SESSID_USERNAME = $_SESSION['sessid']['username'];
34 0fd75c45 2022-07-30 mischa return $SESSID_USERNAME;
37 0fd75c45 2022-07-30 mischa function check_user_session ()
39 0fd75c45 2022-07-30 mischa session_start ();
40 0fd75c45 2022-07-30 mischa if (!$_SESSION['sessid']['username'])
42 0fd75c45 2022-07-30 mischa header ("Location: login.php");
45 0fd75c45 2022-07-30 mischa $USERID_USERNAME = $_SESSION['sessid']['username'];
46 0fd75c45 2022-07-30 mischa return $USERID_USERNAME;
52 0fd75c45 2022-07-30 mischa // check_language
53 0fd75c45 2022-07-30 mischa // Action: checks what language the browser uses
54 0fd75c45 2022-07-30 mischa // Call: check_language
56 0fd75c45 2022-07-30 mischa function check_language ()
58 0fd75c45 2022-07-30 mischa global $CONF;
59 0fd75c45 2022-07-30 mischa $supported_languages = array ('bg', 'ca', 'cn', 'cs', 'da', 'de', 'en', 'es', 'et', 'eu', 'fi', 'fo', 'fr', 'hu', 'is', 'it', 'mk', 'nl', 'nn', 'pl', 'pt-br', 'ru', 'sl', 'sv', 'tr', 'tw');
60 0fd75c45 2022-07-30 mischa $lang_array = preg_split ('/(\s*,\s*)/', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
61 0fd75c45 2022-07-30 mischa if (is_array ($lang_array))
63 0fd75c45 2022-07-30 mischa $lang_first = strtolower ((trim (strval ($lang_array[0]))));
64 0fd75c45 2022-07-30 mischa $lang_first = substr ($lang_first, 0, 2);
65 0fd75c45 2022-07-30 mischa if (in_array ($lang_first, $supported_languages))
67 0fd75c45 2022-07-30 mischa $lang = $lang_first;
71 0fd75c45 2022-07-30 mischa $lang = $CONF['default_language'];
76 0fd75c45 2022-07-30 mischa $lang = $CONF['default_language'];
78 0fd75c45 2022-07-30 mischa return $lang;
84 0fd75c45 2022-07-30 mischa // check_string
85 0fd75c45 2022-07-30 mischa // Action: checks if a string is valid and returns TRUE is this is the case.
86 0fd75c45 2022-07-30 mischa // Call: check_string (string var)
88 0fd75c45 2022-07-30 mischa function check_string ($var)
90 0fd75c45 2022-07-30 mischa if (preg_match ('/^([A-Za-z0-9 ]+)+$/', $var))
92 0fd75c45 2022-07-30 mischa return true;
96 0fd75c45 2022-07-30 mischa return false;
103 0fd75c45 2022-07-30 mischa // check_email
104 0fd75c45 2022-07-30 mischa // Action: Checks if email is valid and returns TRUE if this is the case.
105 0fd75c45 2022-07-30 mischa // Call: check_email (string email)
107 0fd75c45 2022-07-30 mischa function check_email ($email)
109 0fd75c45 2022-07-30 mischa if (preg_match ('/^[-!#$%&\'*+\\.\/0-9=?A-Z^_{|}~]+' . '@' . '([-0-9A-Z]+\.)+' . '([0-9A-Z]){2,10}$/i', trim ($email)))
111 0fd75c45 2022-07-30 mischa return true;
115 0fd75c45 2022-07-30 mischa return false;
122 0fd75c45 2022-07-30 mischa // escape_string
123 0fd75c45 2022-07-30 mischa // Action: Escape a string
124 0fd75c45 2022-07-30 mischa // Call: escape_string (string string)
126 0fd75c45 2022-07-30 mischa function escape_string ($string)
128 0fd75c45 2022-07-30 mischa global $CONF;
129 0fd75c45 2022-07-30 mischa # mysql_real_escape changed in PHP 5.4, needs fixing!
130 0fd75c45 2022-07-30 mischa # if (get_magic_quotes_gpc () == 0)
132 0fd75c45 2022-07-30 mischa # if ($CONF['database_type'] == "mysql") $escaped_string = mysql_real_escape_string ($string);
133 0fd75c45 2022-07-30 mischa # if ($CONF['database_type'] == "mysqli") $escaped_string = mysqli_real_escape_string ($string);
134 0fd75c45 2022-07-30 mischa # if ($CONF['database_type'] == "pgsql") $escaped_string = pg_escape_string ($string);
138 0fd75c45 2022-07-30 mischa $escaped_string = $string;
140 0fd75c45 2022-07-30 mischa return $escaped_string;
146 0fd75c45 2022-07-30 mischa // get_domain_properties
147 0fd75c45 2022-07-30 mischa // Action: Get all the properties of a domain.
148 0fd75c45 2022-07-30 mischa // Call: get_domain_properties (string domain)
150 0fd75c45 2022-07-30 mischa function get_domain_properties ($domain)
152 0fd75c45 2022-07-30 mischa global $CONF;
153 0fd75c45 2022-07-30 mischa $list = array ();
155 0fd75c45 2022-07-30 mischa $result = db_query ("SELECT COUNT(*) FROM alias WHERE domain='$domain'");
156 0fd75c45 2022-07-30 mischa $row = db_row ($result['result']);
157 0fd75c45 2022-07-30 mischa $list['alias_count'] = $row[0];
159 0fd75c45 2022-07-30 mischa $result = db_query ("SELECT COUNT(*) FROM mailbox WHERE domain='$domain'");
160 0fd75c45 2022-07-30 mischa $row = db_row ($result['result']);
161 0fd75c45 2022-07-30 mischa $list['mailbox_count'] = $row[0];
162 0fd75c45 2022-07-30 mischa if ($CONF['alias_control'] == "NO")
164 0fd75c45 2022-07-30 mischa $list['alias_count'] = $list['alias_count'] - $list['mailbox_count'];
168 0fd75c45 2022-07-30 mischa $list['alias_count'] = $list['alias_count'];
171 0fd75c45 2022-07-30 mischa $result = db_query ("SELECT * FROM domain WHERE domain='$domain'");
172 0fd75c45 2022-07-30 mischa $row = db_array ($result['result']);
173 0fd75c45 2022-07-30 mischa $list['description'] = $row['description'];
174 0fd75c45 2022-07-30 mischa $list['aliases'] = $row['aliases'];
175 0fd75c45 2022-07-30 mischa $list['mailboxes'] = $row['mailboxes'];
176 0fd75c45 2022-07-30 mischa $list['maxquota'] = $row['maxquota'];
177 0fd75c45 2022-07-30 mischa $list['transport'] = $row['transport'];
178 0fd75c45 2022-07-30 mischa $list['backupmx'] = $row['backupmx'];
179 0fd75c45 2022-07-30 mischa $list['created'] = $row['created'];
180 0fd75c45 2022-07-30 mischa $list['modified'] = $row['modified'];
181 0fd75c45 2022-07-30 mischa $list['active'] = $row['active'];
183 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "pgsql")
185 0fd75c45 2022-07-30 mischa if ($row['active'] == "t")
187 0fd75c45 2022-07-30 mischa $list['active'] = 1;
191 0fd75c45 2022-07-30 mischa $list['active'] = 0;
194 0fd75c45 2022-07-30 mischa if ($row['backupmx'] == "t")
196 0fd75c45 2022-07-30 mischa $list['backupmx'] = 1;
200 0fd75c45 2022-07-30 mischa $list['backupmx'] = 0;
205 0fd75c45 2022-07-30 mischa $list['active'] = $row['active'];
206 0fd75c45 2022-07-30 mischa $list['backupmx'] = $row['backupmx'];
209 0fd75c45 2022-07-30 mischa return $list;
215 0fd75c45 2022-07-30 mischa // check_alias
216 0fd75c45 2022-07-30 mischa // Action: Checks if the domain is still able to create aliases.
217 0fd75c45 2022-07-30 mischa // Call: check_alias (string domain)
219 0fd75c45 2022-07-30 mischa function check_alias ($domain)
221 0fd75c45 2022-07-30 mischa $limit = get_domain_properties ($domain);
222 0fd75c45 2022-07-30 mischa if ($limit['aliases'] == 0)
224 0fd75c45 2022-07-30 mischa return true;
226 0fd75c45 2022-07-30 mischa if ($limit['aliases'] < 0)
228 0fd75c45 2022-07-30 mischa return false;
230 0fd75c45 2022-07-30 mischa if ($limit['alias_count'] >= $limit['aliases'])
232 0fd75c45 2022-07-30 mischa return false;
236 0fd75c45 2022-07-30 mischa return true;
243 0fd75c45 2022-07-30 mischa // check_mailbox
244 0fd75c45 2022-07-30 mischa // Action: Checks if the domain is still able to create mailboxes.
245 0fd75c45 2022-07-30 mischa // Call: ceck_mailbox (string domain)
247 0fd75c45 2022-07-30 mischa function check_mailbox ($domain)
249 0fd75c45 2022-07-30 mischa $limit = get_domain_properties ($domain);
250 0fd75c45 2022-07-30 mischa if ($limit['mailboxes'] == 0)
252 0fd75c45 2022-07-30 mischa return true;
254 0fd75c45 2022-07-30 mischa if ($limit['mailboxes'] < 0)
256 0fd75c45 2022-07-30 mischa return false;
258 0fd75c45 2022-07-30 mischa if ($limit['mailbox_count'] >= $limit['mailboxes'])
260 0fd75c45 2022-07-30 mischa return false;
264 0fd75c45 2022-07-30 mischa return true;
271 0fd75c45 2022-07-30 mischa // check_quota
272 0fd75c45 2022-07-30 mischa // Action: Checks if the user is creating a mailbox with the correct quota
273 0fd75c45 2022-07-30 mischa // Call: check_quota (string domain)
275 0fd75c45 2022-07-30 mischa function check_quota ($quota, $domain)
277 0fd75c45 2022-07-30 mischa $limit = get_domain_properties ($domain);
278 0fd75c45 2022-07-30 mischa if ($limit['maxquota'] == 0)
280 0fd75c45 2022-07-30 mischa return true;
282 0fd75c45 2022-07-30 mischa if (($limit['maxquota'] < 0) and ($quota < 0))
284 0fd75c45 2022-07-30 mischa return true;
286 0fd75c45 2022-07-30 mischa if (($limit['maxquota'] > 0) and ($quota == 0))
288 0fd75c45 2022-07-30 mischa return false;
290 0fd75c45 2022-07-30 mischa if ($quota > $limit['maxquota'])
292 0fd75c45 2022-07-30 mischa return false;
296 0fd75c45 2022-07-30 mischa return true;
303 0fd75c45 2022-07-30 mischa // check_owner
304 0fd75c45 2022-07-30 mischa // Action: Checks if the admin is the owner of the domain.
305 0fd75c45 2022-07-30 mischa // Call: check_owner (string admin, string domain)
307 0fd75c45 2022-07-30 mischa function check_owner ($username, $domain)
309 0fd75c45 2022-07-30 mischa $result = db_query ("SELECT * FROM domain_admins WHERE username='$username' AND domain='$domain' AND active='1'");
310 0fd75c45 2022-07-30 mischa if ($result['rows'] != 1)
312 0fd75c45 2022-07-30 mischa return false;
316 0fd75c45 2022-07-30 mischa return true;
323 0fd75c45 2022-07-30 mischa // list_domains_for_admin
324 0fd75c45 2022-07-30 mischa // Action: Lists all the domains for an admin.
325 0fd75c45 2022-07-30 mischa // Call: list_domains_for_admin (string admin)
327 0fd75c45 2022-07-30 mischa function list_domains_for_admin ($username)
329 0fd75c45 2022-07-30 mischa $list = array ();
331 0fd75c45 2022-07-30 mischa $result = db_query ("SELECT * FROM domain LEFT JOIN domain_admins ON domain.domain=domain_admins.domain WHERE domain_admins.username='$username' AND domain.active='1' AND domain.backupmx='0' ORDER BY domain_admins.domain");
332 0fd75c45 2022-07-30 mischa if ($result['rows'] > 0)
335 0fd75c45 2022-07-30 mischa while ($row = db_array ($result['result']))
337 0fd75c45 2022-07-30 mischa $list[$i] = $row['domain'];
341 0fd75c45 2022-07-30 mischa return $list;
347 0fd75c45 2022-07-30 mischa // list_domains
348 0fd75c45 2022-07-30 mischa // Action: List all available domains.
349 0fd75c45 2022-07-30 mischa // Call: list_domains ()
351 0fd75c45 2022-07-30 mischa function list_domains ()
353 0fd75c45 2022-07-30 mischa $list = array();
355 0fd75c45 2022-07-30 mischa $result = db_query ("SELECT * FROM domain ORDER BY domain");
356 0fd75c45 2022-07-30 mischa if ($result['rows'] > 0)
359 0fd75c45 2022-07-30 mischa while ($row = db_array ($result['result']))
361 0fd75c45 2022-07-30 mischa $list[$i] = $row['domain'];
365 0fd75c45 2022-07-30 mischa return $list;
371 0fd75c45 2022-07-30 mischa // admin_exist
372 0fd75c45 2022-07-30 mischa // Action: Checks if the admin already exists.
373 0fd75c45 2022-07-30 mischa // Call: admin_exist (string admin)
375 0fd75c45 2022-07-30 mischa // was check_admin
377 0fd75c45 2022-07-30 mischa function admin_exist ($username)
379 0fd75c45 2022-07-30 mischa $result = db_query ("SELECT * FROM admin WHERE username='$username'");
380 0fd75c45 2022-07-30 mischa if ($result['rows'] != 1)
382 0fd75c45 2022-07-30 mischa return false;
386 0fd75c45 2022-07-30 mischa return true;
391 0fd75c45 2022-07-30 mischa // domain_exist
392 0fd75c45 2022-07-30 mischa // Action: Checks if the domain already exists.
393 0fd75c45 2022-07-30 mischa // Call: domain_exist (string domain)
395 0fd75c45 2022-07-30 mischa function domain_exist ($domain)
397 0fd75c45 2022-07-30 mischa $result = db_query ("SELECT * FROM domain WHERE domain='$domain'");
398 0fd75c45 2022-07-30 mischa if ($result['rows'] != 1)
400 0fd75c45 2022-07-30 mischa return false;
404 0fd75c45 2022-07-30 mischa return true;
410 0fd75c45 2022-07-30 mischa // list_admins
411 0fd75c45 2022-07-30 mischa // Action: Lists all the admins
412 0fd75c45 2022-07-30 mischa // Call: list_admins ()
414 0fd75c45 2022-07-30 mischa // was admin_list_admins
416 0fd75c45 2022-07-30 mischa function list_admins ()
418 0fd75c45 2022-07-30 mischa $list = array();
420 0fd75c45 2022-07-30 mischa $result = db_query ("SELECT * FROM admin ORDER BY username");
421 0fd75c45 2022-07-30 mischa if ($result['rows'] > 0)
424 0fd75c45 2022-07-30 mischa while ($row = db_array ($result['result']))
426 0fd75c45 2022-07-30 mischa $list[$i] = $row['username'];
430 0fd75c45 2022-07-30 mischa return $list;
436 0fd75c45 2022-07-30 mischa // get_admin_properties
437 0fd75c45 2022-07-30 mischa // Action: Get all the admin properties.
438 0fd75c45 2022-07-30 mischa // Call: get_admin_properties (string admin)
439 0fd75c45 2022-07-30 mischa function get_admin_properties ($username)
441 0fd75c45 2022-07-30 mischa $list = array ();
443 0fd75c45 2022-07-30 mischa $result = db_query ("SELECT COUNT(*) FROM domain_admins WHERE username='$username'");
444 0fd75c45 2022-07-30 mischa $row = db_row ($result['result']);
445 0fd75c45 2022-07-30 mischa $list['domain_count'] = $row[0];
447 0fd75c45 2022-07-30 mischa $result = db_query ("SELECT * FROM admin WHERE username='$username'");
448 0fd75c45 2022-07-30 mischa $row = db_array ($result['result']);
449 0fd75c45 2022-07-30 mischa $list['created'] = $row['created'];
450 0fd75c45 2022-07-30 mischa $list['modified'] = $row['modified'];
451 0fd75c45 2022-07-30 mischa $list['active'] = $row['active'];
452 0fd75c45 2022-07-30 mischa return $list;
458 0fd75c45 2022-07-30 mischa // encode_header
459 0fd75c45 2022-07-30 mischa // Action: Encode a string according to RFC 1522 for use in headers if it contains 8-bit characters.
460 0fd75c45 2022-07-30 mischa // Call: encode_header (string header, string charset)
462 0fd75c45 2022-07-30 mischa function encode_header ($string, $default_charset)
464 0fd75c45 2022-07-30 mischa if (strtolower ($default_charset) == 'iso-8859-1')
466 0fd75c45 2022-07-30 mischa $string = str_replace ("\240",' ',$string);
469 0fd75c45 2022-07-30 mischa $j = strlen ($string);
470 0fd75c45 2022-07-30 mischa $max_l = 75 - strlen ($default_charset) - 7;
471 0fd75c45 2022-07-30 mischa $aRet = array ();
472 0fd75c45 2022-07-30 mischa $ret = '';
473 0fd75c45 2022-07-30 mischa $iEncStart = $enc_init = false;
474 0fd75c45 2022-07-30 mischa $cur_l = $iOffset = 0;
476 0fd75c45 2022-07-30 mischa for ($i = 0; $i < $j; ++$i)
478 0fd75c45 2022-07-30 mischa switch ($string{$i})
480 0fd75c45 2022-07-30 mischa case '=':
481 0fd75c45 2022-07-30 mischa case '<':
482 0fd75c45 2022-07-30 mischa case '>':
483 0fd75c45 2022-07-30 mischa case ',':
484 0fd75c45 2022-07-30 mischa case '?':
485 0fd75c45 2022-07-30 mischa case '_':
486 0fd75c45 2022-07-30 mischa if ($iEncStart === false)
488 0fd75c45 2022-07-30 mischa $iEncStart = $i;
490 0fd75c45 2022-07-30 mischa $cur_l+=3;
491 0fd75c45 2022-07-30 mischa if ($cur_l > ($max_l-2))
493 0fd75c45 2022-07-30 mischa $aRet[] = substr ($string,$iOffset,$iEncStart-$iOffset);
494 0fd75c45 2022-07-30 mischa $aRet[] = "=?$default_charset?Q?$ret?=";
495 0fd75c45 2022-07-30 mischa $iOffset = $i;
496 0fd75c45 2022-07-30 mischa $cur_l = 0;
497 0fd75c45 2022-07-30 mischa $ret = '';
498 0fd75c45 2022-07-30 mischa $iEncStart = false;
502 0fd75c45 2022-07-30 mischa $ret .= sprintf ("=%02X",ord($string{$i}));
505 0fd75c45 2022-07-30 mischa case '(':
506 0fd75c45 2022-07-30 mischa case ')':
507 0fd75c45 2022-07-30 mischa if ($iEncStart !== false)
509 0fd75c45 2022-07-30 mischa $aRet[] = substr ($string,$iOffset,$iEncStart-$iOffset);
510 0fd75c45 2022-07-30 mischa $aRet[] = "=?$default_charset?Q?$ret?=";
511 0fd75c45 2022-07-30 mischa $iOffset = $i;
512 0fd75c45 2022-07-30 mischa $cur_l = 0;
513 0fd75c45 2022-07-30 mischa $ret = '';
514 0fd75c45 2022-07-30 mischa $iEncStart = false;
517 0fd75c45 2022-07-30 mischa case ' ':
518 0fd75c45 2022-07-30 mischa if ($iEncStart !== false)
520 0fd75c45 2022-07-30 mischa $cur_l++;
521 0fd75c45 2022-07-30 mischa if ($cur_l > $max_l)
523 0fd75c45 2022-07-30 mischa $aRet[] = substr ($string,$iOffset,$iEncStart-$iOffset);
524 0fd75c45 2022-07-30 mischa $aRet[] = "=?$default_charset?Q?$ret?=";
525 0fd75c45 2022-07-30 mischa $iOffset = $i;
526 0fd75c45 2022-07-30 mischa $cur_l = 0;
527 0fd75c45 2022-07-30 mischa $ret = '';
528 0fd75c45 2022-07-30 mischa $iEncStart = false;
532 0fd75c45 2022-07-30 mischa $ret .= '_';
537 0fd75c45 2022-07-30 mischa $k = ord ($string{$i});
538 0fd75c45 2022-07-30 mischa if ($k > 126)
540 0fd75c45 2022-07-30 mischa if ($iEncStart === false)
542 0fd75c45 2022-07-30 mischa // do not start encoding in the middle of a string, also take the rest of the word.
543 0fd75c45 2022-07-30 mischa $sLeadString = substr ($string,0,$i);
544 0fd75c45 2022-07-30 mischa $aLeadString = explode (' ',$sLeadString);
545 0fd75c45 2022-07-30 mischa $sToBeEncoded = array_pop ($aLeadString);
546 0fd75c45 2022-07-30 mischa $iEncStart = $i - strlen ($sToBeEncoded);
547 0fd75c45 2022-07-30 mischa $ret .= $sToBeEncoded;
548 0fd75c45 2022-07-30 mischa $cur_l += strlen ($sToBeEncoded);
550 0fd75c45 2022-07-30 mischa $cur_l += 3;
551 0fd75c45 2022-07-30 mischa // first we add the encoded string that reached it's max size
552 0fd75c45 2022-07-30 mischa if ($cur_l > ($max_l-2))
554 0fd75c45 2022-07-30 mischa $aRet[] = substr ($string,$iOffset,$iEncStart-$iOffset);
555 0fd75c45 2022-07-30 mischa $aRet[] = "=?$default_charset?Q?$ret?= ";
556 0fd75c45 2022-07-30 mischa $cur_l = 3;
557 0fd75c45 2022-07-30 mischa $ret = '';
558 0fd75c45 2022-07-30 mischa $iOffset = $i;
559 0fd75c45 2022-07-30 mischa $iEncStart = $i;
561 0fd75c45 2022-07-30 mischa $enc_init = true;
562 0fd75c45 2022-07-30 mischa $ret .= sprintf ("=%02X", $k);
566 0fd75c45 2022-07-30 mischa if ($iEncStart !== false)
568 0fd75c45 2022-07-30 mischa $cur_l++;
569 0fd75c45 2022-07-30 mischa if ($cur_l > $max_l)
571 0fd75c45 2022-07-30 mischa $aRet[] = substr ($string,$iOffset,$iEncStart-$iOffset);
572 0fd75c45 2022-07-30 mischa $aRet[] = "=?$default_charset?Q?$ret?=";
573 0fd75c45 2022-07-30 mischa $iEncStart = false;
574 0fd75c45 2022-07-30 mischa $iOffset = $i;
575 0fd75c45 2022-07-30 mischa $cur_l = 0;
576 0fd75c45 2022-07-30 mischa $ret = '';
580 0fd75c45 2022-07-30 mischa $ret .= $string{$i};
587 0fd75c45 2022-07-30 mischa if ($enc_init)
589 0fd75c45 2022-07-30 mischa if ($iEncStart !== false)
591 0fd75c45 2022-07-30 mischa $aRet[] = substr ($string,$iOffset,$iEncStart-$iOffset);
592 0fd75c45 2022-07-30 mischa $aRet[] = "=?$default_charset?Q?$ret?=";
596 0fd75c45 2022-07-30 mischa $aRet[] = substr ($string,$iOffset);
598 0fd75c45 2022-07-30 mischa $string = implode ('',$aRet);
600 0fd75c45 2022-07-30 mischa return $string;
606 0fd75c45 2022-07-30 mischa // generate_password
607 0fd75c45 2022-07-30 mischa // Action: Generates a random password
608 0fd75c45 2022-07-30 mischa // Call: generate_password ()
610 0fd75c45 2022-07-30 mischa function generate_password ()
612 0fd75c45 2022-07-30 mischa $password = substr (md5 (mt_rand ()), 0, 8);
613 0fd75c45 2022-07-30 mischa return $password;
619 0fd75c45 2022-07-30 mischa // pacrypt
620 0fd75c45 2022-07-30 mischa // Action: Encrypts password based on config settings
621 0fd75c45 2022-07-30 mischa // Call: pacrypt (string cleartextpassword)
622 0fd75c45 2022-07-30 mischa // Note: bcrypt replace 2y for 2b so OpenSMTPd accepts it
624 0fd75c45 2022-07-30 mischa function pacrypt ($pw)
626 0fd75c45 2022-07-30 mischa global $CONF;
627 0fd75c45 2022-07-30 mischa $password = "";
628 0fd75c45 2022-07-30 mischa $salt = "";
630 0fd75c45 2022-07-30 mischa if ($CONF['encrypt'] == 'bcrypt')
632 0fd75c45 2022-07-30 mischa $options = ['cost' => 8];
633 0fd75c45 2022-07-30 mischa $password = password_hash ($pw, PASSWORD_BCRYPT, $options);
634 0fd75c45 2022-07-30 mischa $password = preg_replace ('/\$2y\$/', '\$2b\$', $password);
637 0fd75c45 2022-07-30 mischa if ($CONF['encrypt'] == 'md5crypt')
639 0fd75c45 2022-07-30 mischa $password = md5crypt ($pw, $salt);
642 0fd75c45 2022-07-30 mischa if ($CONF['encrypt'] == 'system')
644 0fd75c45 2022-07-30 mischa $password = crypt ($pw, $salt);
647 0fd75c45 2022-07-30 mischa if ($CONF['encrypt'] == 'cleartext')
649 0fd75c45 2022-07-30 mischa $password = $pw;
652 0fd75c45 2022-07-30 mischa return $password;
658 0fd75c45 2022-07-30 mischa // md5crypt
659 0fd75c45 2022-07-30 mischa // Action: Creates MD5 encrypted password
660 0fd75c45 2022-07-30 mischa // Call: md5crypt (string cleartextpassword)
662 0fd75c45 2022-07-30 mischa $MAGIC = "$1$";
663 0fd75c45 2022-07-30 mischa $ITOA64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
665 0fd75c45 2022-07-30 mischa function md5crypt ($pw, $salt="", $magic="")
667 0fd75c45 2022-07-30 mischa global $MAGIC;
669 0fd75c45 2022-07-30 mischa if ($magic == "") $magic = $MAGIC;
670 0fd75c45 2022-07-30 mischa if ($salt == "") $salt = create_salt ();
671 0fd75c45 2022-07-30 mischa $slist = explode ("$", $salt);
672 0fd75c45 2022-07-30 mischa if ($slist[0] == "1") $salt = $slist[1];
674 0fd75c45 2022-07-30 mischa $salt = substr ($salt, 0, 8);
675 0fd75c45 2022-07-30 mischa $ctx = $pw . $magic . $salt;
676 0fd75c45 2022-07-30 mischa $final = convertHex2bin (md5 ($pw . $salt . $pw));
678 0fd75c45 2022-07-30 mischa for ($i=strlen ($pw); $i>0; $i-=16)
680 0fd75c45 2022-07-30 mischa if ($i > 16)
682 0fd75c45 2022-07-30 mischa $ctx .= substr ($final,0,16);
686 0fd75c45 2022-07-30 mischa $ctx .= substr ($final,0,$i);
689 0fd75c45 2022-07-30 mischa $i = strlen ($pw);
691 0fd75c45 2022-07-30 mischa while ($i > 0)
693 0fd75c45 2022-07-30 mischa if ($i & 1) $ctx .= chr (0);
694 0fd75c45 2022-07-30 mischa else $ctx .= $pw[0];
695 0fd75c45 2022-07-30 mischa $i = $i >> 1;
697 0fd75c45 2022-07-30 mischa $final = convertHex2bin (md5 ($ctx));
699 0fd75c45 2022-07-30 mischa for ($i=0;$i<1000;$i++)
701 0fd75c45 2022-07-30 mischa $ctx1 = "";
702 0fd75c45 2022-07-30 mischa if ($i & 1)
704 0fd75c45 2022-07-30 mischa $ctx1 .= $pw;
708 0fd75c45 2022-07-30 mischa $ctx1 .= substr ($final,0,16);
710 0fd75c45 2022-07-30 mischa if ($i % 3) $ctx1 .= $salt;
711 0fd75c45 2022-07-30 mischa if ($i % 7) $ctx1 .= $pw;
712 0fd75c45 2022-07-30 mischa if ($i & 1)
714 0fd75c45 2022-07-30 mischa $ctx1 .= substr ($final,0,16);
718 0fd75c45 2022-07-30 mischa $ctx1 .= $pw;
720 0fd75c45 2022-07-30 mischa $final = convertHex2bin (md5 ($ctx1));
722 0fd75c45 2022-07-30 mischa $passwd = "";
723 0fd75c45 2022-07-30 mischa $passwd .= to64 (((ord ($final[0]) << 16) | (ord ($final[6]) << 8) | (ord ($final[12]))), 4);
724 0fd75c45 2022-07-30 mischa $passwd .= to64 (((ord ($final[1]) << 16) | (ord ($final[7]) << 8) | (ord ($final[13]))), 4);
725 0fd75c45 2022-07-30 mischa $passwd .= to64 (((ord ($final[2]) << 16) | (ord ($final[8]) << 8) | (ord ($final[14]))), 4);
726 0fd75c45 2022-07-30 mischa $passwd .= to64 (((ord ($final[3]) << 16) | (ord ($final[9]) << 8) | (ord ($final[15]))), 4);
727 0fd75c45 2022-07-30 mischa $passwd .= to64 (((ord ($final[4]) << 16) | (ord ($final[10]) << 8) | (ord ($final[5]))), 4);
728 0fd75c45 2022-07-30 mischa $passwd .= to64 (ord ($final[11]), 2);
729 0fd75c45 2022-07-30 mischa return "$magic$salt\$$passwd";
732 0fd75c45 2022-07-30 mischa function create_salt ()
734 0fd75c45 2022-07-30 mischa srand ((double) microtime ()*1000000);
735 0fd75c45 2022-07-30 mischa $salt = substr (md5 (rand (0,9999999)), 0, 8);
736 0fd75c45 2022-07-30 mischa return $salt;
739 0fd75c45 2022-07-30 mischa function convertHex2bin ($str)
741 0fd75c45 2022-07-30 mischa $len = strlen ($str);
742 0fd75c45 2022-07-30 mischa $nstr = "";
743 0fd75c45 2022-07-30 mischa for ($i=0;$i<$len;$i+=2)
745 0fd75c45 2022-07-30 mischa $num = sscanf (substr ($str,$i,2), "%x");
746 0fd75c45 2022-07-30 mischa $nstr.=chr ($num[0]);
748 0fd75c45 2022-07-30 mischa return $nstr;
751 0fd75c45 2022-07-30 mischa function to64 ($v, $n)
753 0fd75c45 2022-07-30 mischa global $ITOA64;
754 0fd75c45 2022-07-30 mischa $ret = "";
755 0fd75c45 2022-07-30 mischa while (($n - 1) >= 0)
758 0fd75c45 2022-07-30 mischa $ret .= $ITOA64[$v & 0x3f];
759 0fd75c45 2022-07-30 mischa $v = $v >> 6;
761 0fd75c45 2022-07-30 mischa return $ret;
767 0fd75c45 2022-07-30 mischa // smtp_mail
768 0fd75c45 2022-07-30 mischa // Action: Sends email to new account.
769 0fd75c45 2022-07-30 mischa // Call: smtp_mail (string To, string From, string Data)
771 0fd75c45 2022-07-30 mischa function smtp_mail ($to, $from, $data)
773 0fd75c45 2022-07-30 mischa global $CONF;
774 0fd75c45 2022-07-30 mischa $smtp_server = $CONF['smtp_server'];
775 0fd75c45 2022-07-30 mischa $smtp_port = $CONF['smtp_port'];
776 0fd75c45 2022-07-30 mischa $errno = "0";
777 0fd75c45 2022-07-30 mischa $errstr = "0";
778 0fd75c45 2022-07-30 mischa $timeout = "30";
780 0fd75c45 2022-07-30 mischa $fh = @fsockopen ($smtp_server, $smtp_port, $errno, $errstr, $timeout);
782 0fd75c45 2022-07-30 mischa if (!$fh)
784 0fd75c45 2022-07-30 mischa return false;
788 0fd75c45 2022-07-30 mischa fputs ($fh, "EHLO $smtp_server\r\n");
789 0fd75c45 2022-07-30 mischa $res = fgets ($fh, 256);
790 0fd75c45 2022-07-30 mischa fputs ($fh, "MAIL FROM:<$from>\r\n");
791 0fd75c45 2022-07-30 mischa $res = fgets ($fh, 256);
792 0fd75c45 2022-07-30 mischa fputs ($fh, "RCPT TO:<$to>\r\n");
793 0fd75c45 2022-07-30 mischa $res = fgets ($fh, 256);
794 0fd75c45 2022-07-30 mischa fputs ($fh, "DATA\r\n");
795 0fd75c45 2022-07-30 mischa $res = fgets ($fh, 256);
796 0fd75c45 2022-07-30 mischa fputs ($fh, "$data\r\n.\r\n");
797 0fd75c45 2022-07-30 mischa $res = fgets ($fh, 256);
798 0fd75c45 2022-07-30 mischa fputs ($fh, "QUIT\r\n");
799 0fd75c45 2022-07-30 mischa $res = fgets ($fh, 256);
800 0fd75c45 2022-07-30 mischa fclose ($fh);
802 0fd75c45 2022-07-30 mischa return true;
807 0fd75c45 2022-07-30 mischa $DEBUG_TEXT = "\n
809 0fd75c45 2022-07-30 mischa Please check the documentation and website for more information.\n
811 0fd75c45 2022-07-30 mischa <a href=\"http://high5.net/postfixadmin/\">Postfix Admin</a><br />\n
812 0fd75c45 2022-07-30 mischa <a href=\"http://forums.high5.net/index.php?showforum=7\">Knowledge Base</a>\n
816 0fd75c45 2022-07-30 mischa // db_connect
817 0fd75c45 2022-07-30 mischa // Action: Makes a connection to the database if it doesn't exist
818 0fd75c45 2022-07-30 mischa // Call: db_connect ()
820 0fd75c45 2022-07-30 mischa function db_connect ()
822 0fd75c45 2022-07-30 mischa global $CONF;
823 0fd75c45 2022-07-30 mischa global $DEBUG_TEXT;
824 0fd75c45 2022-07-30 mischa $link = "";
826 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "mysql")
828 0fd75c45 2022-07-30 mischa if (function_exists ("mysql_connect"))
830 0fd75c45 2022-07-30 mischa $link = @mysql_connect ($CONF['database_host'], $CONF['database_user'], $CONF['database_password']) or die ("<p />DEBUG INFORMATION:<br />Connect: " . mysql_error () . "$DEBUG_TEXT");
831 0fd75c45 2022-07-30 mischa $succes = @mysql_select_db ($CONF['database_name'], $link) or die ("<p />DEBUG INFORMATION:<br />MySQL Select Database: " . mysql_error () . "$DEBUG_TEXT");
835 0fd75c45 2022-07-30 mischa print "<p />DEBUG INFORMATION:<br />MySQL 3.x / 4.0 functions not available!<br />database_type = 'mysql' in config.inc.php, are you using a different database? $DEBUG_TEXT";
840 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "mysqli")
842 0fd75c45 2022-07-30 mischa if (function_exists ("mysqli_connect"))
844 0fd75c45 2022-07-30 mischa $link = @mysqli_connect ($CONF['database_host'], $CONF['database_user'], $CONF['database_password']) or die ("<p />DEBUG INFORMATION:<br />Connect: " . mysqli_connect_error () . "$DEBUG_TEXT");
845 0fd75c45 2022-07-30 mischa $succes = @mysqli_select_db ($link, $CONF['database_name']) or die ("<p />DEBUG INFORMATION:<br />MySQLi Select Database: " . mysqli_error () . "$DEBUG_TEXT");
849 0fd75c45 2022-07-30 mischa print "<p />DEBUG INFORMATION:<br />MySQL 4.1 functions not available!<br />database_type = 'mysqli' in config.inc.php, are you using a different database? $DEBUG_TEXT";
854 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "pgsql")
856 0fd75c45 2022-07-30 mischa if (function_exists ("pg_connect"))
858 0fd75c45 2022-07-30 mischa $connect_string = "host=" . $CONF['database_host'] . " dbname=" . $CONF['database_name'] . " user=" . $CONF['database_user'] . " password=" . $CONF['database_password'];
859 0fd75c45 2022-07-30 mischa $link = @pg_connect ($connect_string) or die ("<p />DEBUG INFORMATION:<br />Connect: " . pg_last_error () . "$DEBUG_TEXT");
863 0fd75c45 2022-07-30 mischa print "<p />DEBUG INFORMATION:<br />PostgreSQL functions not available!<br />database_type = 'pgsql' in config.inc.php, are you using a different database? $DEBUG_TEXT";
868 0fd75c45 2022-07-30 mischa if ($link)
870 0fd75c45 2022-07-30 mischa return $link;
874 0fd75c45 2022-07-30 mischa print "DEBUG INFORMATION:<br />\n";
875 0fd75c45 2022-07-30 mischa print "Connect: Unable to connect to database<br />\n";
876 0fd75c45 2022-07-30 mischa print "<br />\n";
877 0fd75c45 2022-07-30 mischa print "Make sure that you have set the correct database type in the config.inc.php file<br />\n";
878 0fd75c45 2022-07-30 mischa print $DEBUG_TEXT;
886 0fd75c45 2022-07-30 mischa // db_query
887 0fd75c45 2022-07-30 mischa // Action: Sends a query to the database and returns query result and number of rows
888 0fd75c45 2022-07-30 mischa // Call: db_query (string query)
890 0fd75c45 2022-07-30 mischa function db_query ($query)
892 0fd75c45 2022-07-30 mischa global $CONF;
893 0fd75c45 2022-07-30 mischa global $DEBUG_TEXT;
894 0fd75c45 2022-07-30 mischa $result = "";
895 0fd75c45 2022-07-30 mischa $number_rows = "";
897 0fd75c45 2022-07-30 mischa $link = db_connect ();
899 0fd75c45 2022-07-30 mischa // database prefix workaround
900 0fd75c45 2022-07-30 mischa if (!empty ($CONF['database_prefix']))
902 0fd75c45 2022-07-30 mischa if (preg_match ("/^SELECT/i", $query))
904 0fd75c45 2022-07-30 mischa $query = substr ($query, 0, 14) . $CONF['database_prefix'] . substr ($query, 14);
908 0fd75c45 2022-07-30 mischa $query = substr ($query, 0, 6) . $CONF['database_prefix'] . substr ($query, 7);
912 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "mysql") $result = @mysql_query ($query, $link) or die ("<p />DEBUG INFORMATION:<br />Invalid query: " . mysql_error() . "$DEBUG_TEXT");
913 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "mysqli") $result = @mysqli_query ($link, $query) or die ("<p />DEBUG INFORMATION:<br />Invalid query: " . mysqli_error() . "$DEBUG_TEXT");
914 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "pgsql")
916 0fd75c45 2022-07-30 mischa if (preg_match ("/LIMIT/i", $query))
918 0fd75c45 2022-07-30 mischa $search = "/LIMIT (\w+), (\w+)/";
919 0fd75c45 2022-07-30 mischa $replace = "LIMIT \$2 OFFSET \$1";
920 0fd75c45 2022-07-30 mischa $query = preg_replace ($search, $replace, $query);
922 0fd75c45 2022-07-30 mischa $result = @pg_query ($link, $query) or die ("<p />DEBUG INFORMATION:<br />Invalid query: " . pg_last_error() . "$DEBUG_TEXT");
925 0fd75c45 2022-07-30 mischa if (preg_match ("/^SELECT/i", $query))
927 0fd75c45 2022-07-30 mischa // if $query was a SELECT statement check the number of rows with [database_type]_num_rows ().
928 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "mysql") $number_rows = mysql_num_rows ($result);
929 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "mysqli") $number_rows = mysqli_num_rows ($result);
930 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "pgsql") $number_rows = pg_num_rows ($result);
934 0fd75c45 2022-07-30 mischa // if $query was something else, UPDATE, DELETE or INSERT check the number of rows with
935 0fd75c45 2022-07-30 mischa // [database_type]_affected_rows ().
936 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "mysql") $number_rows = mysql_affected_rows ($link);
937 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "mysqli") $number_rows = mysqli_affected_rows ($link);
938 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "pgsql") $number_rows = pg_affected_rows ($result);
941 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "mysql") mysql_close ($link);
942 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "mysqli") mysqli_close ($link);
943 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "pgsql") pg_close ($link);
945 0fd75c45 2022-07-30 mischa $return = array (
946 0fd75c45 2022-07-30 mischa "result" => $result,
947 0fd75c45 2022-07-30 mischa "rows" => $number_rows
949 0fd75c45 2022-07-30 mischa return $return;
954 0fd75c45 2022-07-30 mischa // db_row
955 0fd75c45 2022-07-30 mischa // Action: Returns a row from a table
956 0fd75c45 2022-07-30 mischa // Call: db_row (int result)
958 0fd75c45 2022-07-30 mischa function db_row ($result)
960 0fd75c45 2022-07-30 mischa global $CONF;
961 0fd75c45 2022-07-30 mischa $row = "";
962 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "mysql") $row = mysql_fetch_row ($result);
963 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "mysqli") $row = mysqli_fetch_row ($result);
964 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "pgsql") $row = pg_fetch_row ($result);
965 0fd75c45 2022-07-30 mischa return $row;
970 0fd75c45 2022-07-30 mischa // db_array
971 0fd75c45 2022-07-30 mischa // Action: Returns a row from a table
972 0fd75c45 2022-07-30 mischa // Call: db_array (int result)
974 0fd75c45 2022-07-30 mischa function db_array ($result)
976 0fd75c45 2022-07-30 mischa global $CONF;
977 0fd75c45 2022-07-30 mischa $row = "";
978 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "mysql") $row = mysql_fetch_array ($result);
979 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "mysqli") $row = mysqli_fetch_array ($result);
980 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "pgsql") $row = pg_fetch_array ($result);
981 0fd75c45 2022-07-30 mischa return $row;
986 0fd75c45 2022-07-30 mischa // db_assoc
987 0fd75c45 2022-07-30 mischa // Action: Returns a row from a table
988 0fd75c45 2022-07-30 mischa // Call: db_assoc(int result)
990 0fd75c45 2022-07-30 mischa function db_assoc ($result)
992 0fd75c45 2022-07-30 mischa global $CONF;
993 0fd75c45 2022-07-30 mischa $row = "";
994 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "mysql") $row = mysql_fetch_assoc ($result);
995 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "mysqli") $row = mysqli_fetch_assoc ($result);
996 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "pgsql") $row = pg_fetch_assoc ($result);
997 0fd75c45 2022-07-30 mischa return $row;
1003 0fd75c45 2022-07-30 mischa // db_delete
1004 0fd75c45 2022-07-30 mischa // Action: Deletes a row from a specified table
1005 0fd75c45 2022-07-30 mischa // Call: db_delete (string table, string where, string delete)
1007 0fd75c45 2022-07-30 mischa function db_delete ($table,$where,$delete)
1009 0fd75c45 2022-07-30 mischa $result = db_query ("DELETE FROM $table WHERE $where='$delete'");
1010 0fd75c45 2022-07-30 mischa if ($result['rows'] >= 1)
1012 0fd75c45 2022-07-30 mischa return $result['rows'];
1016 0fd75c45 2022-07-30 mischa return true;
1023 0fd75c45 2022-07-30 mischa // db_log
1024 0fd75c45 2022-07-30 mischa // Action: Logs actions from admin
1025 0fd75c45 2022-07-30 mischa // Call: db_delete (string username, string domain, string action, string data)
1027 0fd75c45 2022-07-30 mischa function db_log ($username,$domain,$action,$data)
1029 0fd75c45 2022-07-30 mischa global $CONF;
1030 0fd75c45 2022-07-30 mischa $REMOTE_ADDR = $_SERVER['REMOTE_ADDR'];
1032 0fd75c45 2022-07-30 mischa if ($CONF['logging'] == 'YES')
1034 0fd75c45 2022-07-30 mischa $result = db_query ("INSERT INTO log (timestamp,username,domain,action,data) VALUES (NOW(),'$username ($REMOTE_ADDR)','$domain','$action','$data')");
1035 0fd75c45 2022-07-30 mischa if ($result['rows'] != 1)
1037 0fd75c45 2022-07-30 mischa return false;
1041 0fd75c45 2022-07-30 mischa return true;