Blame


1 0fd75c45 2022-07-30 mischa <?php
2 0fd75c45 2022-07-30 mischa //
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
7 0fd75c45 2022-07-30 mischa //
8 0fd75c45 2022-07-30 mischa // File: functions.inc.php
9 0fd75c45 2022-07-30 mischa //
10 0fd75c45 2022-07-30 mischa //error_reporting (E_NOTICE | E_ERROR | E_WARNING | E_PARSE);
11 0fd75c45 2022-07-30 mischa
12 0fd75c45 2022-07-30 mischa if (preg_match ("/functions.inc.php/", $_SERVER['PHP_SELF']))
13 0fd75c45 2022-07-30 mischa {
14 0fd75c45 2022-07-30 mischa header ("Location: login.php");
15 0fd75c45 2022-07-30 mischa exit;
16 0fd75c45 2022-07-30 mischa }
17 0fd75c45 2022-07-30 mischa
18 0fd75c45 2022-07-30 mischa $version = "2.1.1-SP6-20210626";
19 0fd75c45 2022-07-30 mischa
20 0fd75c45 2022-07-30 mischa //
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 ()
24 0fd75c45 2022-07-30 mischa //
25 0fd75c45 2022-07-30 mischa function check_session ()
26 0fd75c45 2022-07-30 mischa {
27 0fd75c45 2022-07-30 mischa session_start ();
28 0fd75c45 2022-07-30 mischa if (!$_SESSION['sessid']['username'])
29 0fd75c45 2022-07-30 mischa {
30 0fd75c45 2022-07-30 mischa header ("Location: login.php");
31 0fd75c45 2022-07-30 mischa exit;
32 0fd75c45 2022-07-30 mischa }
33 0fd75c45 2022-07-30 mischa $SESSID_USERNAME = $_SESSION['sessid']['username'];
34 0fd75c45 2022-07-30 mischa return $SESSID_USERNAME;
35 0fd75c45 2022-07-30 mischa }
36 0fd75c45 2022-07-30 mischa
37 0fd75c45 2022-07-30 mischa function check_user_session ()
38 0fd75c45 2022-07-30 mischa {
39 0fd75c45 2022-07-30 mischa session_start ();
40 0fd75c45 2022-07-30 mischa if (!$_SESSION['sessid']['username'])
41 0fd75c45 2022-07-30 mischa {
42 0fd75c45 2022-07-30 mischa header ("Location: login.php");
43 0fd75c45 2022-07-30 mischa exit;
44 0fd75c45 2022-07-30 mischa }
45 0fd75c45 2022-07-30 mischa $USERID_USERNAME = $_SESSION['sessid']['username'];
46 0fd75c45 2022-07-30 mischa return $USERID_USERNAME;
47 0fd75c45 2022-07-30 mischa }
48 0fd75c45 2022-07-30 mischa
49 0fd75c45 2022-07-30 mischa
50 0fd75c45 2022-07-30 mischa
51 0fd75c45 2022-07-30 mischa //
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
55 0fd75c45 2022-07-30 mischa //
56 0fd75c45 2022-07-30 mischa function check_language ()
57 0fd75c45 2022-07-30 mischa {
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))
62 0fd75c45 2022-07-30 mischa {
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))
66 0fd75c45 2022-07-30 mischa {
67 0fd75c45 2022-07-30 mischa $lang = $lang_first;
68 0fd75c45 2022-07-30 mischa }
69 0fd75c45 2022-07-30 mischa else
70 0fd75c45 2022-07-30 mischa {
71 0fd75c45 2022-07-30 mischa $lang = $CONF['default_language'];
72 0fd75c45 2022-07-30 mischa }
73 0fd75c45 2022-07-30 mischa }
74 0fd75c45 2022-07-30 mischa else
75 0fd75c45 2022-07-30 mischa {
76 0fd75c45 2022-07-30 mischa $lang = $CONF['default_language'];
77 0fd75c45 2022-07-30 mischa }
78 0fd75c45 2022-07-30 mischa return $lang;
79 0fd75c45 2022-07-30 mischa }
80 0fd75c45 2022-07-30 mischa
81 0fd75c45 2022-07-30 mischa
82 0fd75c45 2022-07-30 mischa
83 0fd75c45 2022-07-30 mischa //
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)
87 0fd75c45 2022-07-30 mischa //
88 0fd75c45 2022-07-30 mischa function check_string ($var)
89 0fd75c45 2022-07-30 mischa {
90 0fd75c45 2022-07-30 mischa if (preg_match ('/^([A-Za-z0-9 ]+)+$/', $var))
91 0fd75c45 2022-07-30 mischa {
92 0fd75c45 2022-07-30 mischa return true;
93 0fd75c45 2022-07-30 mischa }
94 0fd75c45 2022-07-30 mischa else
95 0fd75c45 2022-07-30 mischa {
96 0fd75c45 2022-07-30 mischa return false;
97 0fd75c45 2022-07-30 mischa }
98 0fd75c45 2022-07-30 mischa }
99 0fd75c45 2022-07-30 mischa
100 0fd75c45 2022-07-30 mischa
101 0fd75c45 2022-07-30 mischa
102 0fd75c45 2022-07-30 mischa //
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)
106 0fd75c45 2022-07-30 mischa //
107 0fd75c45 2022-07-30 mischa function check_email ($email)
108 0fd75c45 2022-07-30 mischa {
109 0fd75c45 2022-07-30 mischa if (preg_match ('/^[-!#$%&\'*+\\.\/0-9=?A-Z^_{|}~]+' . '@' . '([-0-9A-Z]+\.)+' . '([0-9A-Z]){2,10}$/i', trim ($email)))
110 0fd75c45 2022-07-30 mischa {
111 0fd75c45 2022-07-30 mischa return true;
112 0fd75c45 2022-07-30 mischa }
113 0fd75c45 2022-07-30 mischa else
114 0fd75c45 2022-07-30 mischa {
115 0fd75c45 2022-07-30 mischa return false;
116 0fd75c45 2022-07-30 mischa }
117 0fd75c45 2022-07-30 mischa }
118 0fd75c45 2022-07-30 mischa
119 0fd75c45 2022-07-30 mischa
120 0fd75c45 2022-07-30 mischa
121 0fd75c45 2022-07-30 mischa //
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)
125 0fd75c45 2022-07-30 mischa //
126 0fd75c45 2022-07-30 mischa function escape_string ($string)
127 0fd75c45 2022-07-30 mischa {
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)
131 0fd75c45 2022-07-30 mischa # {
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);
135 0fd75c45 2022-07-30 mischa # }
136 0fd75c45 2022-07-30 mischa # else
137 0fd75c45 2022-07-30 mischa # {
138 0fd75c45 2022-07-30 mischa $escaped_string = $string;
139 0fd75c45 2022-07-30 mischa # }
140 0fd75c45 2022-07-30 mischa return $escaped_string;
141 0fd75c45 2022-07-30 mischa }
142 0fd75c45 2022-07-30 mischa
143 0fd75c45 2022-07-30 mischa
144 0fd75c45 2022-07-30 mischa
145 0fd75c45 2022-07-30 mischa //
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)
149 0fd75c45 2022-07-30 mischa //
150 0fd75c45 2022-07-30 mischa function get_domain_properties ($domain)
151 0fd75c45 2022-07-30 mischa {
152 0fd75c45 2022-07-30 mischa global $CONF;
153 0fd75c45 2022-07-30 mischa $list = array ();
154 0fd75c45 2022-07-30 mischa
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];
158 0fd75c45 2022-07-30 mischa
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")
163 0fd75c45 2022-07-30 mischa {
164 0fd75c45 2022-07-30 mischa $list['alias_count'] = $list['alias_count'] - $list['mailbox_count'];
165 0fd75c45 2022-07-30 mischa }
166 0fd75c45 2022-07-30 mischa else
167 0fd75c45 2022-07-30 mischa {
168 0fd75c45 2022-07-30 mischa $list['alias_count'] = $list['alias_count'];
169 0fd75c45 2022-07-30 mischa }
170 0fd75c45 2022-07-30 mischa
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'];
182 0fd75c45 2022-07-30 mischa
183 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "pgsql")
184 0fd75c45 2022-07-30 mischa {
185 0fd75c45 2022-07-30 mischa if ($row['active'] == "t")
186 0fd75c45 2022-07-30 mischa {
187 0fd75c45 2022-07-30 mischa $list['active'] = 1;
188 0fd75c45 2022-07-30 mischa }
189 0fd75c45 2022-07-30 mischa else
190 0fd75c45 2022-07-30 mischa {
191 0fd75c45 2022-07-30 mischa $list['active'] = 0;
192 0fd75c45 2022-07-30 mischa }
193 0fd75c45 2022-07-30 mischa
194 0fd75c45 2022-07-30 mischa if ($row['backupmx'] == "t")
195 0fd75c45 2022-07-30 mischa {
196 0fd75c45 2022-07-30 mischa $list['backupmx'] = 1;
197 0fd75c45 2022-07-30 mischa }
198 0fd75c45 2022-07-30 mischa else
199 0fd75c45 2022-07-30 mischa {
200 0fd75c45 2022-07-30 mischa $list['backupmx'] = 0;
201 0fd75c45 2022-07-30 mischa }
202 0fd75c45 2022-07-30 mischa }
203 0fd75c45 2022-07-30 mischa else
204 0fd75c45 2022-07-30 mischa {
205 0fd75c45 2022-07-30 mischa $list['active'] = $row['active'];
206 0fd75c45 2022-07-30 mischa $list['backupmx'] = $row['backupmx'];
207 0fd75c45 2022-07-30 mischa }
208 0fd75c45 2022-07-30 mischa
209 0fd75c45 2022-07-30 mischa return $list;
210 0fd75c45 2022-07-30 mischa }
211 0fd75c45 2022-07-30 mischa
212 0fd75c45 2022-07-30 mischa
213 0fd75c45 2022-07-30 mischa
214 0fd75c45 2022-07-30 mischa //
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)
218 0fd75c45 2022-07-30 mischa //
219 0fd75c45 2022-07-30 mischa function check_alias ($domain)
220 0fd75c45 2022-07-30 mischa {
221 0fd75c45 2022-07-30 mischa $limit = get_domain_properties ($domain);
222 0fd75c45 2022-07-30 mischa if ($limit['aliases'] == 0)
223 0fd75c45 2022-07-30 mischa {
224 0fd75c45 2022-07-30 mischa return true;
225 0fd75c45 2022-07-30 mischa }
226 0fd75c45 2022-07-30 mischa if ($limit['aliases'] < 0)
227 0fd75c45 2022-07-30 mischa {
228 0fd75c45 2022-07-30 mischa return false;
229 0fd75c45 2022-07-30 mischa }
230 0fd75c45 2022-07-30 mischa if ($limit['alias_count'] >= $limit['aliases'])
231 0fd75c45 2022-07-30 mischa {
232 0fd75c45 2022-07-30 mischa return false;
233 0fd75c45 2022-07-30 mischa }
234 0fd75c45 2022-07-30 mischa else
235 0fd75c45 2022-07-30 mischa {
236 0fd75c45 2022-07-30 mischa return true;
237 0fd75c45 2022-07-30 mischa }
238 0fd75c45 2022-07-30 mischa }
239 0fd75c45 2022-07-30 mischa
240 0fd75c45 2022-07-30 mischa
241 0fd75c45 2022-07-30 mischa
242 0fd75c45 2022-07-30 mischa //
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)
246 0fd75c45 2022-07-30 mischa //
247 0fd75c45 2022-07-30 mischa function check_mailbox ($domain)
248 0fd75c45 2022-07-30 mischa {
249 0fd75c45 2022-07-30 mischa $limit = get_domain_properties ($domain);
250 0fd75c45 2022-07-30 mischa if ($limit['mailboxes'] == 0)
251 0fd75c45 2022-07-30 mischa {
252 0fd75c45 2022-07-30 mischa return true;
253 0fd75c45 2022-07-30 mischa }
254 0fd75c45 2022-07-30 mischa if ($limit['mailboxes'] < 0)
255 0fd75c45 2022-07-30 mischa {
256 0fd75c45 2022-07-30 mischa return false;
257 0fd75c45 2022-07-30 mischa }
258 0fd75c45 2022-07-30 mischa if ($limit['mailbox_count'] >= $limit['mailboxes'])
259 0fd75c45 2022-07-30 mischa {
260 0fd75c45 2022-07-30 mischa return false;
261 0fd75c45 2022-07-30 mischa }
262 0fd75c45 2022-07-30 mischa else
263 0fd75c45 2022-07-30 mischa {
264 0fd75c45 2022-07-30 mischa return true;
265 0fd75c45 2022-07-30 mischa }
266 0fd75c45 2022-07-30 mischa }
267 0fd75c45 2022-07-30 mischa
268 0fd75c45 2022-07-30 mischa
269 0fd75c45 2022-07-30 mischa
270 0fd75c45 2022-07-30 mischa //
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)
274 0fd75c45 2022-07-30 mischa //
275 0fd75c45 2022-07-30 mischa function check_quota ($quota, $domain)
276 0fd75c45 2022-07-30 mischa {
277 0fd75c45 2022-07-30 mischa $limit = get_domain_properties ($domain);
278 0fd75c45 2022-07-30 mischa if ($limit['maxquota'] == 0)
279 0fd75c45 2022-07-30 mischa {
280 0fd75c45 2022-07-30 mischa return true;
281 0fd75c45 2022-07-30 mischa }
282 0fd75c45 2022-07-30 mischa if (($limit['maxquota'] < 0) and ($quota < 0))
283 0fd75c45 2022-07-30 mischa {
284 0fd75c45 2022-07-30 mischa return true;
285 0fd75c45 2022-07-30 mischa }
286 0fd75c45 2022-07-30 mischa if (($limit['maxquota'] > 0) and ($quota == 0))
287 0fd75c45 2022-07-30 mischa {
288 0fd75c45 2022-07-30 mischa return false;
289 0fd75c45 2022-07-30 mischa }
290 0fd75c45 2022-07-30 mischa if ($quota > $limit['maxquota'])
291 0fd75c45 2022-07-30 mischa {
292 0fd75c45 2022-07-30 mischa return false;
293 0fd75c45 2022-07-30 mischa }
294 0fd75c45 2022-07-30 mischa else
295 0fd75c45 2022-07-30 mischa {
296 0fd75c45 2022-07-30 mischa return true;
297 0fd75c45 2022-07-30 mischa }
298 0fd75c45 2022-07-30 mischa }
299 0fd75c45 2022-07-30 mischa
300 0fd75c45 2022-07-30 mischa
301 0fd75c45 2022-07-30 mischa
302 0fd75c45 2022-07-30 mischa //
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)
306 0fd75c45 2022-07-30 mischa //
307 0fd75c45 2022-07-30 mischa function check_owner ($username, $domain)
308 0fd75c45 2022-07-30 mischa {
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)
311 0fd75c45 2022-07-30 mischa {
312 0fd75c45 2022-07-30 mischa return false;
313 0fd75c45 2022-07-30 mischa }
314 0fd75c45 2022-07-30 mischa else
315 0fd75c45 2022-07-30 mischa {
316 0fd75c45 2022-07-30 mischa return true;
317 0fd75c45 2022-07-30 mischa }
318 0fd75c45 2022-07-30 mischa }
319 0fd75c45 2022-07-30 mischa
320 0fd75c45 2022-07-30 mischa
321 0fd75c45 2022-07-30 mischa
322 0fd75c45 2022-07-30 mischa //
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)
326 0fd75c45 2022-07-30 mischa //
327 0fd75c45 2022-07-30 mischa function list_domains_for_admin ($username)
328 0fd75c45 2022-07-30 mischa {
329 0fd75c45 2022-07-30 mischa $list = array ();
330 0fd75c45 2022-07-30 mischa
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)
333 0fd75c45 2022-07-30 mischa {
334 0fd75c45 2022-07-30 mischa $i = 0;
335 0fd75c45 2022-07-30 mischa while ($row = db_array ($result['result']))
336 0fd75c45 2022-07-30 mischa {
337 0fd75c45 2022-07-30 mischa $list[$i] = $row['domain'];
338 0fd75c45 2022-07-30 mischa $i++;
339 0fd75c45 2022-07-30 mischa }
340 0fd75c45 2022-07-30 mischa }
341 0fd75c45 2022-07-30 mischa return $list;
342 0fd75c45 2022-07-30 mischa }
343 0fd75c45 2022-07-30 mischa
344 0fd75c45 2022-07-30 mischa
345 0fd75c45 2022-07-30 mischa
346 0fd75c45 2022-07-30 mischa //
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 ()
350 0fd75c45 2022-07-30 mischa //
351 0fd75c45 2022-07-30 mischa function list_domains ()
352 0fd75c45 2022-07-30 mischa {
353 0fd75c45 2022-07-30 mischa $list = array();
354 0fd75c45 2022-07-30 mischa
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)
357 0fd75c45 2022-07-30 mischa {
358 0fd75c45 2022-07-30 mischa $i = 0;
359 0fd75c45 2022-07-30 mischa while ($row = db_array ($result['result']))
360 0fd75c45 2022-07-30 mischa {
361 0fd75c45 2022-07-30 mischa $list[$i] = $row['domain'];
362 0fd75c45 2022-07-30 mischa $i++;
363 0fd75c45 2022-07-30 mischa }
364 0fd75c45 2022-07-30 mischa }
365 0fd75c45 2022-07-30 mischa return $list;
366 0fd75c45 2022-07-30 mischa }
367 0fd75c45 2022-07-30 mischa
368 0fd75c45 2022-07-30 mischa
369 0fd75c45 2022-07-30 mischa
370 0fd75c45 2022-07-30 mischa //
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)
374 0fd75c45 2022-07-30 mischa //
375 0fd75c45 2022-07-30 mischa // was check_admin
376 0fd75c45 2022-07-30 mischa //
377 0fd75c45 2022-07-30 mischa function admin_exist ($username)
378 0fd75c45 2022-07-30 mischa {
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)
381 0fd75c45 2022-07-30 mischa {
382 0fd75c45 2022-07-30 mischa return false;
383 0fd75c45 2022-07-30 mischa }
384 0fd75c45 2022-07-30 mischa else
385 0fd75c45 2022-07-30 mischa {
386 0fd75c45 2022-07-30 mischa return true;
387 0fd75c45 2022-07-30 mischa }
388 0fd75c45 2022-07-30 mischa }
389 0fd75c45 2022-07-30 mischa
390 0fd75c45 2022-07-30 mischa //
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)
394 0fd75c45 2022-07-30 mischa //
395 0fd75c45 2022-07-30 mischa function domain_exist ($domain)
396 0fd75c45 2022-07-30 mischa {
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)
399 0fd75c45 2022-07-30 mischa {
400 0fd75c45 2022-07-30 mischa return false;
401 0fd75c45 2022-07-30 mischa }
402 0fd75c45 2022-07-30 mischa else
403 0fd75c45 2022-07-30 mischa {
404 0fd75c45 2022-07-30 mischa return true;
405 0fd75c45 2022-07-30 mischa }
406 0fd75c45 2022-07-30 mischa }
407 0fd75c45 2022-07-30 mischa
408 0fd75c45 2022-07-30 mischa
409 0fd75c45 2022-07-30 mischa //
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 ()
413 0fd75c45 2022-07-30 mischa //
414 0fd75c45 2022-07-30 mischa // was admin_list_admins
415 0fd75c45 2022-07-30 mischa //
416 0fd75c45 2022-07-30 mischa function list_admins ()
417 0fd75c45 2022-07-30 mischa {
418 0fd75c45 2022-07-30 mischa $list = array();
419 0fd75c45 2022-07-30 mischa
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)
422 0fd75c45 2022-07-30 mischa {
423 0fd75c45 2022-07-30 mischa $i = 0;
424 0fd75c45 2022-07-30 mischa while ($row = db_array ($result['result']))
425 0fd75c45 2022-07-30 mischa {
426 0fd75c45 2022-07-30 mischa $list[$i] = $row['username'];
427 0fd75c45 2022-07-30 mischa $i++;
428 0fd75c45 2022-07-30 mischa }
429 0fd75c45 2022-07-30 mischa }
430 0fd75c45 2022-07-30 mischa return $list;
431 0fd75c45 2022-07-30 mischa }
432 0fd75c45 2022-07-30 mischa
433 0fd75c45 2022-07-30 mischa
434 0fd75c45 2022-07-30 mischa
435 0fd75c45 2022-07-30 mischa //
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)
440 0fd75c45 2022-07-30 mischa {
441 0fd75c45 2022-07-30 mischa $list = array ();
442 0fd75c45 2022-07-30 mischa
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];
446 0fd75c45 2022-07-30 mischa
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;
453 0fd75c45 2022-07-30 mischa }
454 0fd75c45 2022-07-30 mischa
455 0fd75c45 2022-07-30 mischa
456 0fd75c45 2022-07-30 mischa
457 0fd75c45 2022-07-30 mischa //
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)
461 0fd75c45 2022-07-30 mischa //
462 0fd75c45 2022-07-30 mischa function encode_header ($string, $default_charset)
463 0fd75c45 2022-07-30 mischa {
464 0fd75c45 2022-07-30 mischa if (strtolower ($default_charset) == 'iso-8859-1')
465 0fd75c45 2022-07-30 mischa {
466 0fd75c45 2022-07-30 mischa $string = str_replace ("\240",' ',$string);
467 0fd75c45 2022-07-30 mischa }
468 0fd75c45 2022-07-30 mischa
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;
475 0fd75c45 2022-07-30 mischa
476 0fd75c45 2022-07-30 mischa for ($i = 0; $i < $j; ++$i)
477 0fd75c45 2022-07-30 mischa {
478 0fd75c45 2022-07-30 mischa switch ($string{$i})
479 0fd75c45 2022-07-30 mischa {
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)
487 0fd75c45 2022-07-30 mischa {
488 0fd75c45 2022-07-30 mischa $iEncStart = $i;
489 0fd75c45 2022-07-30 mischa }
490 0fd75c45 2022-07-30 mischa $cur_l+=3;
491 0fd75c45 2022-07-30 mischa if ($cur_l > ($max_l-2))
492 0fd75c45 2022-07-30 mischa {
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;
499 0fd75c45 2022-07-30 mischa }
500 0fd75c45 2022-07-30 mischa else
501 0fd75c45 2022-07-30 mischa {
502 0fd75c45 2022-07-30 mischa $ret .= sprintf ("=%02X",ord($string{$i}));
503 0fd75c45 2022-07-30 mischa }
504 0fd75c45 2022-07-30 mischa break;
505 0fd75c45 2022-07-30 mischa case '(':
506 0fd75c45 2022-07-30 mischa case ')':
507 0fd75c45 2022-07-30 mischa if ($iEncStart !== false)
508 0fd75c45 2022-07-30 mischa {
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;
515 0fd75c45 2022-07-30 mischa }
516 0fd75c45 2022-07-30 mischa break;
517 0fd75c45 2022-07-30 mischa case ' ':
518 0fd75c45 2022-07-30 mischa if ($iEncStart !== false)
519 0fd75c45 2022-07-30 mischa {
520 0fd75c45 2022-07-30 mischa $cur_l++;
521 0fd75c45 2022-07-30 mischa if ($cur_l > $max_l)
522 0fd75c45 2022-07-30 mischa {
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;
529 0fd75c45 2022-07-30 mischa }
530 0fd75c45 2022-07-30 mischa else
531 0fd75c45 2022-07-30 mischa {
532 0fd75c45 2022-07-30 mischa $ret .= '_';
533 0fd75c45 2022-07-30 mischa }
534 0fd75c45 2022-07-30 mischa }
535 0fd75c45 2022-07-30 mischa break;
536 0fd75c45 2022-07-30 mischa default:
537 0fd75c45 2022-07-30 mischa $k = ord ($string{$i});
538 0fd75c45 2022-07-30 mischa if ($k > 126)
539 0fd75c45 2022-07-30 mischa {
540 0fd75c45 2022-07-30 mischa if ($iEncStart === false)
541 0fd75c45 2022-07-30 mischa {
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);
549 0fd75c45 2022-07-30 mischa }
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))
553 0fd75c45 2022-07-30 mischa {
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;
560 0fd75c45 2022-07-30 mischa }
561 0fd75c45 2022-07-30 mischa $enc_init = true;
562 0fd75c45 2022-07-30 mischa $ret .= sprintf ("=%02X", $k);
563 0fd75c45 2022-07-30 mischa }
564 0fd75c45 2022-07-30 mischa else
565 0fd75c45 2022-07-30 mischa {
566 0fd75c45 2022-07-30 mischa if ($iEncStart !== false)
567 0fd75c45 2022-07-30 mischa {
568 0fd75c45 2022-07-30 mischa $cur_l++;
569 0fd75c45 2022-07-30 mischa if ($cur_l > $max_l)
570 0fd75c45 2022-07-30 mischa {
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 = '';
577 0fd75c45 2022-07-30 mischa }
578 0fd75c45 2022-07-30 mischa else
579 0fd75c45 2022-07-30 mischa {
580 0fd75c45 2022-07-30 mischa $ret .= $string{$i};
581 0fd75c45 2022-07-30 mischa }
582 0fd75c45 2022-07-30 mischa }
583 0fd75c45 2022-07-30 mischa }
584 0fd75c45 2022-07-30 mischa break;
585 0fd75c45 2022-07-30 mischa }
586 0fd75c45 2022-07-30 mischa }
587 0fd75c45 2022-07-30 mischa if ($enc_init)
588 0fd75c45 2022-07-30 mischa {
589 0fd75c45 2022-07-30 mischa if ($iEncStart !== false)
590 0fd75c45 2022-07-30 mischa {
591 0fd75c45 2022-07-30 mischa $aRet[] = substr ($string,$iOffset,$iEncStart-$iOffset);
592 0fd75c45 2022-07-30 mischa $aRet[] = "=?$default_charset?Q?$ret?=";
593 0fd75c45 2022-07-30 mischa }
594 0fd75c45 2022-07-30 mischa else
595 0fd75c45 2022-07-30 mischa {
596 0fd75c45 2022-07-30 mischa $aRet[] = substr ($string,$iOffset);
597 0fd75c45 2022-07-30 mischa }
598 0fd75c45 2022-07-30 mischa $string = implode ('',$aRet);
599 0fd75c45 2022-07-30 mischa }
600 0fd75c45 2022-07-30 mischa return $string;
601 0fd75c45 2022-07-30 mischa }
602 0fd75c45 2022-07-30 mischa
603 0fd75c45 2022-07-30 mischa
604 0fd75c45 2022-07-30 mischa
605 0fd75c45 2022-07-30 mischa //
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 ()
609 0fd75c45 2022-07-30 mischa //
610 0fd75c45 2022-07-30 mischa function generate_password ()
611 0fd75c45 2022-07-30 mischa {
612 0fd75c45 2022-07-30 mischa $password = substr (md5 (mt_rand ()), 0, 8);
613 0fd75c45 2022-07-30 mischa return $password;
614 0fd75c45 2022-07-30 mischa }
615 0fd75c45 2022-07-30 mischa
616 0fd75c45 2022-07-30 mischa
617 0fd75c45 2022-07-30 mischa
618 0fd75c45 2022-07-30 mischa //
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
623 0fd75c45 2022-07-30 mischa //
624 0fd75c45 2022-07-30 mischa function pacrypt ($pw)
625 0fd75c45 2022-07-30 mischa {
626 0fd75c45 2022-07-30 mischa global $CONF;
627 0fd75c45 2022-07-30 mischa $password = "";
628 0fd75c45 2022-07-30 mischa $salt = "";
629 0fd75c45 2022-07-30 mischa
630 0fd75c45 2022-07-30 mischa if ($CONF['encrypt'] == 'bcrypt')
631 0fd75c45 2022-07-30 mischa {
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);
635 0fd75c45 2022-07-30 mischa }
636 0fd75c45 2022-07-30 mischa
637 0fd75c45 2022-07-30 mischa if ($CONF['encrypt'] == 'md5crypt')
638 0fd75c45 2022-07-30 mischa {
639 0fd75c45 2022-07-30 mischa $password = md5crypt ($pw, $salt);
640 0fd75c45 2022-07-30 mischa }
641 0fd75c45 2022-07-30 mischa
642 0fd75c45 2022-07-30 mischa if ($CONF['encrypt'] == 'system')
643 0fd75c45 2022-07-30 mischa {
644 0fd75c45 2022-07-30 mischa $password = crypt ($pw, $salt);
645 0fd75c45 2022-07-30 mischa }
646 0fd75c45 2022-07-30 mischa
647 0fd75c45 2022-07-30 mischa if ($CONF['encrypt'] == 'cleartext')
648 0fd75c45 2022-07-30 mischa {
649 0fd75c45 2022-07-30 mischa $password = $pw;
650 0fd75c45 2022-07-30 mischa }
651 0fd75c45 2022-07-30 mischa
652 0fd75c45 2022-07-30 mischa return $password;
653 0fd75c45 2022-07-30 mischa }
654 0fd75c45 2022-07-30 mischa
655 0fd75c45 2022-07-30 mischa
656 0fd75c45 2022-07-30 mischa
657 0fd75c45 2022-07-30 mischa //
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)
661 0fd75c45 2022-07-30 mischa //
662 0fd75c45 2022-07-30 mischa $MAGIC = "$1$";
663 0fd75c45 2022-07-30 mischa $ITOA64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
664 0fd75c45 2022-07-30 mischa
665 0fd75c45 2022-07-30 mischa function md5crypt ($pw, $salt="", $magic="")
666 0fd75c45 2022-07-30 mischa {
667 0fd75c45 2022-07-30 mischa global $MAGIC;
668 0fd75c45 2022-07-30 mischa
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];
673 0fd75c45 2022-07-30 mischa
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));
677 0fd75c45 2022-07-30 mischa
678 0fd75c45 2022-07-30 mischa for ($i=strlen ($pw); $i>0; $i-=16)
679 0fd75c45 2022-07-30 mischa {
680 0fd75c45 2022-07-30 mischa if ($i > 16)
681 0fd75c45 2022-07-30 mischa {
682 0fd75c45 2022-07-30 mischa $ctx .= substr ($final,0,16);
683 0fd75c45 2022-07-30 mischa }
684 0fd75c45 2022-07-30 mischa else
685 0fd75c45 2022-07-30 mischa {
686 0fd75c45 2022-07-30 mischa $ctx .= substr ($final,0,$i);
687 0fd75c45 2022-07-30 mischa }
688 0fd75c45 2022-07-30 mischa }
689 0fd75c45 2022-07-30 mischa $i = strlen ($pw);
690 0fd75c45 2022-07-30 mischa
691 0fd75c45 2022-07-30 mischa while ($i > 0)
692 0fd75c45 2022-07-30 mischa {
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;
696 0fd75c45 2022-07-30 mischa }
697 0fd75c45 2022-07-30 mischa $final = convertHex2bin (md5 ($ctx));
698 0fd75c45 2022-07-30 mischa
699 0fd75c45 2022-07-30 mischa for ($i=0;$i<1000;$i++)
700 0fd75c45 2022-07-30 mischa {
701 0fd75c45 2022-07-30 mischa $ctx1 = "";
702 0fd75c45 2022-07-30 mischa if ($i & 1)
703 0fd75c45 2022-07-30 mischa {
704 0fd75c45 2022-07-30 mischa $ctx1 .= $pw;
705 0fd75c45 2022-07-30 mischa }
706 0fd75c45 2022-07-30 mischa else
707 0fd75c45 2022-07-30 mischa {
708 0fd75c45 2022-07-30 mischa $ctx1 .= substr ($final,0,16);
709 0fd75c45 2022-07-30 mischa }
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)
713 0fd75c45 2022-07-30 mischa {
714 0fd75c45 2022-07-30 mischa $ctx1 .= substr ($final,0,16);
715 0fd75c45 2022-07-30 mischa }
716 0fd75c45 2022-07-30 mischa else
717 0fd75c45 2022-07-30 mischa {
718 0fd75c45 2022-07-30 mischa $ctx1 .= $pw;
719 0fd75c45 2022-07-30 mischa }
720 0fd75c45 2022-07-30 mischa $final = convertHex2bin (md5 ($ctx1));
721 0fd75c45 2022-07-30 mischa }
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";
730 0fd75c45 2022-07-30 mischa }
731 0fd75c45 2022-07-30 mischa
732 0fd75c45 2022-07-30 mischa function create_salt ()
733 0fd75c45 2022-07-30 mischa {
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;
737 0fd75c45 2022-07-30 mischa }
738 0fd75c45 2022-07-30 mischa
739 0fd75c45 2022-07-30 mischa function convertHex2bin ($str)
740 0fd75c45 2022-07-30 mischa {
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)
744 0fd75c45 2022-07-30 mischa {
745 0fd75c45 2022-07-30 mischa $num = sscanf (substr ($str,$i,2), "%x");
746 0fd75c45 2022-07-30 mischa $nstr.=chr ($num[0]);
747 0fd75c45 2022-07-30 mischa }
748 0fd75c45 2022-07-30 mischa return $nstr;
749 0fd75c45 2022-07-30 mischa }
750 0fd75c45 2022-07-30 mischa
751 0fd75c45 2022-07-30 mischa function to64 ($v, $n)
752 0fd75c45 2022-07-30 mischa {
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)
756 0fd75c45 2022-07-30 mischa {
757 0fd75c45 2022-07-30 mischa $n--;
758 0fd75c45 2022-07-30 mischa $ret .= $ITOA64[$v & 0x3f];
759 0fd75c45 2022-07-30 mischa $v = $v >> 6;
760 0fd75c45 2022-07-30 mischa }
761 0fd75c45 2022-07-30 mischa return $ret;
762 0fd75c45 2022-07-30 mischa }
763 0fd75c45 2022-07-30 mischa
764 0fd75c45 2022-07-30 mischa
765 0fd75c45 2022-07-30 mischa
766 0fd75c45 2022-07-30 mischa //
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)
770 0fd75c45 2022-07-30 mischa //
771 0fd75c45 2022-07-30 mischa function smtp_mail ($to, $from, $data)
772 0fd75c45 2022-07-30 mischa {
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";
779 0fd75c45 2022-07-30 mischa
780 0fd75c45 2022-07-30 mischa $fh = @fsockopen ($smtp_server, $smtp_port, $errno, $errstr, $timeout);
781 0fd75c45 2022-07-30 mischa
782 0fd75c45 2022-07-30 mischa if (!$fh)
783 0fd75c45 2022-07-30 mischa {
784 0fd75c45 2022-07-30 mischa return false;
785 0fd75c45 2022-07-30 mischa }
786 0fd75c45 2022-07-30 mischa else
787 0fd75c45 2022-07-30 mischa {
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);
801 0fd75c45 2022-07-30 mischa }
802 0fd75c45 2022-07-30 mischa return true;
803 0fd75c45 2022-07-30 mischa }
804 0fd75c45 2022-07-30 mischa
805 0fd75c45 2022-07-30 mischa
806 0fd75c45 2022-07-30 mischa
807 0fd75c45 2022-07-30 mischa $DEBUG_TEXT = "\n
808 0fd75c45 2022-07-30 mischa <p />\n
809 0fd75c45 2022-07-30 mischa Please check the documentation and website for more information.\n
810 0fd75c45 2022-07-30 mischa <p />\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
813 0fd75c45 2022-07-30 mischa ";
814 0fd75c45 2022-07-30 mischa
815 0fd75c45 2022-07-30 mischa //
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 ()
819 0fd75c45 2022-07-30 mischa //
820 0fd75c45 2022-07-30 mischa function db_connect ()
821 0fd75c45 2022-07-30 mischa {
822 0fd75c45 2022-07-30 mischa global $CONF;
823 0fd75c45 2022-07-30 mischa global $DEBUG_TEXT;
824 0fd75c45 2022-07-30 mischa $link = "";
825 0fd75c45 2022-07-30 mischa
826 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "mysql")
827 0fd75c45 2022-07-30 mischa {
828 0fd75c45 2022-07-30 mischa if (function_exists ("mysql_connect"))
829 0fd75c45 2022-07-30 mischa {
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");
832 0fd75c45 2022-07-30 mischa }
833 0fd75c45 2022-07-30 mischa else
834 0fd75c45 2022-07-30 mischa {
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";
836 0fd75c45 2022-07-30 mischa die;
837 0fd75c45 2022-07-30 mischa }
838 0fd75c45 2022-07-30 mischa }
839 0fd75c45 2022-07-30 mischa
840 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "mysqli")
841 0fd75c45 2022-07-30 mischa {
842 0fd75c45 2022-07-30 mischa if (function_exists ("mysqli_connect"))
843 0fd75c45 2022-07-30 mischa {
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");
846 0fd75c45 2022-07-30 mischa }
847 0fd75c45 2022-07-30 mischa else
848 0fd75c45 2022-07-30 mischa {
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";
850 0fd75c45 2022-07-30 mischa die;
851 0fd75c45 2022-07-30 mischa }
852 0fd75c45 2022-07-30 mischa }
853 0fd75c45 2022-07-30 mischa
854 0fd75c45 2022-07-30 mischa if ($CONF['database_type'] == "pgsql")
855 0fd75c45 2022-07-30 mischa {
856 0fd75c45 2022-07-30 mischa if (function_exists ("pg_connect"))
857 0fd75c45 2022-07-30 mischa {
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");
860 0fd75c45 2022-07-30 mischa }
861 0fd75c45 2022-07-30 mischa else
862 0fd75c45 2022-07-30 mischa {
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";
864 0fd75c45 2022-07-30 mischa die;
865 0fd75c45 2022-07-30 mischa }
866 0fd75c45 2022-07-30 mischa }
867 0fd75c45 2022-07-30 mischa
868 0fd75c45 2022-07-30 mischa if ($link)
869 0fd75c45 2022-07-30 mischa {
870 0fd75c45 2022-07-30 mischa return $link;
871 0fd75c45 2022-07-30 mischa }
872 0fd75c45 2022-07-30 mischa else
873 0fd75c45 2022-07-30 mischa {
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;
879 0fd75c45 2022-07-30 mischa die;
880 0fd75c45 2022-07-30 mischa }
881 0fd75c45 2022-07-30 mischa }
882 0fd75c45 2022-07-30 mischa
883 0fd75c45 2022-07-30 mischa
884 0fd75c45 2022-07-30 mischa
885 0fd75c45 2022-07-30 mischa //
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)
889 0fd75c45 2022-07-30 mischa //
890 0fd75c45 2022-07-30 mischa function db_query ($query)
891 0fd75c45 2022-07-30 mischa {
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 = "";
896 0fd75c45 2022-07-30 mischa
897 0fd75c45 2022-07-30 mischa $link = db_connect ();
898 0fd75c45 2022-07-30 mischa
899 0fd75c45 2022-07-30 mischa // database prefix workaround
900 0fd75c45 2022-07-30 mischa if (!empty ($CONF['database_prefix']))
901 0fd75c45 2022-07-30 mischa {
902 0fd75c45 2022-07-30 mischa if (preg_match ("/^SELECT/i", $query))
903 0fd75c45 2022-07-30 mischa {
904 0fd75c45 2022-07-30 mischa $query = substr ($query, 0, 14) . $CONF['database_prefix'] . substr ($query, 14);
905 0fd75c45 2022-07-30 mischa }
906 0fd75c45 2022-07-30 mischa else
907 0fd75c45 2022-07-30 mischa {
908 0fd75c45 2022-07-30 mischa $query = substr ($query, 0, 6) . $CONF['database_prefix'] . substr ($query, 7);
909 0fd75c45 2022-07-30 mischa }
910 0fd75c45 2022-07-30 mischa }
911 0fd75c45 2022-07-30 mischa
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")
915 0fd75c45 2022-07-30 mischa {
916 0fd75c45 2022-07-30 mischa if (preg_match ("/LIMIT/i", $query))
917 0fd75c45 2022-07-30 mischa {
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);
921 0fd75c45 2022-07-30 mischa }
922 0fd75c45 2022-07-30 mischa $result = @pg_query ($link, $query) or die ("<p />DEBUG INFORMATION:<br />Invalid query: " . pg_last_error() . "$DEBUG_TEXT");
923 0fd75c45 2022-07-30 mischa }
924 0fd75c45 2022-07-30 mischa
925 0fd75c45 2022-07-30 mischa if (preg_match ("/^SELECT/i", $query))
926 0fd75c45 2022-07-30 mischa {
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);
931 0fd75c45 2022-07-30 mischa }
932 0fd75c45 2022-07-30 mischa else
933 0fd75c45 2022-07-30 mischa {
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);
939 0fd75c45 2022-07-30 mischa }
940 0fd75c45 2022-07-30 mischa
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);
944 0fd75c45 2022-07-30 mischa
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
948 0fd75c45 2022-07-30 mischa );
949 0fd75c45 2022-07-30 mischa return $return;
950 0fd75c45 2022-07-30 mischa }
951 0fd75c45 2022-07-30 mischa
952 0fd75c45 2022-07-30 mischa
953 0fd75c45 2022-07-30 mischa
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)
957 0fd75c45 2022-07-30 mischa //
958 0fd75c45 2022-07-30 mischa function db_row ($result)
959 0fd75c45 2022-07-30 mischa {
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;
966 0fd75c45 2022-07-30 mischa }
967 0fd75c45 2022-07-30 mischa
968 0fd75c45 2022-07-30 mischa
969 0fd75c45 2022-07-30 mischa
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)
973 0fd75c45 2022-07-30 mischa //
974 0fd75c45 2022-07-30 mischa function db_array ($result)
975 0fd75c45 2022-07-30 mischa {
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;
982 0fd75c45 2022-07-30 mischa }
983 0fd75c45 2022-07-30 mischa
984 0fd75c45 2022-07-30 mischa
985 0fd75c45 2022-07-30 mischa
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)
989 0fd75c45 2022-07-30 mischa //
990 0fd75c45 2022-07-30 mischa function db_assoc ($result)
991 0fd75c45 2022-07-30 mischa {
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;
998 0fd75c45 2022-07-30 mischa }
999 0fd75c45 2022-07-30 mischa
1000 0fd75c45 2022-07-30 mischa
1001 0fd75c45 2022-07-30 mischa
1002 0fd75c45 2022-07-30 mischa //
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)
1006 0fd75c45 2022-07-30 mischa //
1007 0fd75c45 2022-07-30 mischa function db_delete ($table,$where,$delete)
1008 0fd75c45 2022-07-30 mischa {
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)
1011 0fd75c45 2022-07-30 mischa {
1012 0fd75c45 2022-07-30 mischa return $result['rows'];
1013 0fd75c45 2022-07-30 mischa }
1014 0fd75c45 2022-07-30 mischa else
1015 0fd75c45 2022-07-30 mischa {
1016 0fd75c45 2022-07-30 mischa return true;
1017 0fd75c45 2022-07-30 mischa }
1018 0fd75c45 2022-07-30 mischa }
1019 0fd75c45 2022-07-30 mischa
1020 0fd75c45 2022-07-30 mischa
1021 0fd75c45 2022-07-30 mischa
1022 0fd75c45 2022-07-30 mischa //
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)
1026 0fd75c45 2022-07-30 mischa //
1027 0fd75c45 2022-07-30 mischa function db_log ($username,$domain,$action,$data)
1028 0fd75c45 2022-07-30 mischa {
1029 0fd75c45 2022-07-30 mischa global $CONF;
1030 0fd75c45 2022-07-30 mischa $REMOTE_ADDR = $_SERVER['REMOTE_ADDR'];
1031 0fd75c45 2022-07-30 mischa
1032 0fd75c45 2022-07-30 mischa if ($CONF['logging'] == 'YES')
1033 0fd75c45 2022-07-30 mischa {
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)
1036 0fd75c45 2022-07-30 mischa {
1037 0fd75c45 2022-07-30 mischa return false;
1038 0fd75c45 2022-07-30 mischa }
1039 0fd75c45 2022-07-30 mischa else
1040 0fd75c45 2022-07-30 mischa {
1041 0fd75c45 2022-07-30 mischa return true;
1042 0fd75c45 2022-07-30 mischa }
1043 0fd75c45 2022-07-30 mischa }
1044 0fd75c45 2022-07-30 mischa }
1045 0fd75c45 2022-07-30 mischa
1046 0fd75c45 2022-07-30 mischa ?>