root/trunk/gui/client/ftp_add.php

Revision 1408, 19.5 kB (checked in by scitech, 4 days ago)

Add default user with password to statistics

Line 
1 <?php
2 /**
3  * ispCP ω (OMEGA) a Virtual Hosting Control System
4  *
5  * @copyright     2001-2006 by moleSoftware GmbH
6  * @copyright     2006-2008 by ispCP | http://isp-control.net
7  * @version     SVN: $Id$
8  * @link         http://isp-control.net
9  * @author         ispCP Team
10  *
11  * @license
12  *   This program is free software; you can redistribute it and/or modify it under
13  *   the terms of the MPL General Public License as published by the Free Software
14  *   Foundation; either version 1.1 of the License, or (at your option) any later
15  *   version.
16  *   You should have received a copy of the MPL Mozilla Public License along with
17  *   this program; if not, write to the Open Source Initiative (OSI)
18  *   http://opensource.org | osi@opensource.org
19  */
20
21 require '../include/ispcp-lib.php';
22 require '../include/class.vfs.php';
23
24 check_login(__FILE__);
25
26 $tpl = new pTemplate();
27
28 $tpl->define_dynamic('page', Config::get('CLIENT_TEMPLATE_PATH') . '/ftp_add.tpl');
29 $tpl->define_dynamic('page_message', 'page');
30 $tpl->define_dynamic('logged_from', 'page');
31 $tpl->define_dynamic('als_list', 'page');
32 $tpl->define_dynamic('sub_list', 'page');
33 $tpl->define_dynamic('to_subdomain', 'page');
34 $tpl->define_dynamic('to_alias_domain', 'page');
35 // JavaScript
36 $tpl->define_dynamic('js_to_subdomain', 'page');
37 $tpl->define_dynamic('js_to_alias_domain', 'page');
38 $tpl->define_dynamic('js_to_all_domain', 'page');
39 $tpl->define_dynamic('js_not_domain', 'page');
40
41 // page functions.
42
43 function get_alias_mount_point(&$sql, $alias_name) {
44     $query = <<<SQL_QUERY
45         select
46             alias_mount
47         from
48             domain_aliasses
49         where
50             alias_name = ?
51 SQL_QUERY;
52
53     $rs = exec_query($sql, $query, array($alias_name));
54     return $rs->fields['alias_mount'];
55 }
56
57 function gen_page_form_data(&$tpl, $dmn_name, $post_check) {
58     $dmn_name = decode_idna($dmn_name);
59     if ($post_check === 'no') {
60         $tpl->assign(array(
61                         'USERNAME' => '',
62                         'DOMAIN_NAME' => $dmn_name,
63                         'DMN_TYPE_CHECKED' => 'checked',
64                         'ALS_TYPE_CHECKED' => '',
65                         'SUB_TYPE_CHECKED' => '',
66                         'OTHER_DIR' => '',
67                         'USE_OTHER_DIR_CHECKED' => ''
68                 ));
69     } else {
70         $tpl->assign(array(
71                         'USERNAME' => clean_input($_POST['username']),
72                         'DOMAIN_NAME' => $dmn_name,
73                         'DMN_TYPE_CHECKED' => ($_POST['dmn_type'] === 'dmn') ? 'checked' : '',
74                         'ALS_TYPE_CHECKED' => ($_POST['dmn_type'] === 'als') ? 'checked' : '',
75                         'SUB_TYPE_CHECKED' => ($_POST['dmn_type'] === 'sub') ? 'checked' : '',
76                         'OTHER_DIR' => clean_input($_POST['other_dir']),
77                         'USE_OTHER_DIR_CHECKED' => (isset($_POST['use_other_dir']) && $_POST['use_other_dir'] === 'on') ? 'checked' : ''
78                 ));
79     }
80 }
81
82 function gen_dmn_als_list(&$tpl, &$sql, $dmn_id, $post_check) {
83     $ok_status = Config::get('ITEM_OK_STATUS');
84
85     $query = <<<SQL_QUERY
86         SELECT
87           alias_id, alias_name
88         FROM
89           domain_aliasses
90         WHERE
91             domain_id = ?
92           AND
93             alias_status = ?
94         ORDER BY
95           alias_name
96 SQL_QUERY;
97
98     $rs = exec_query($sql, $query, array($dmn_id, $ok_status));
99     if ($rs->RecordCount() == 0) {
100         $tpl->assign(array(
101                         'ALS_ID' => 'n/a',
102                         'ALS_SELECTED' => 'selected',
103                         'ALS_NAME' => tr('Empty List')
104                 ));
105         $tpl->parse('ALS_LIST', 'als_list');
106         $tpl->assign('TO_ALIAS_DOMAIN', '');
107         $_SESSION['alias_count'] = "no";
108     } else {
109         $first_passed = false;
110         while (!$rs->EOF) {
111             if ($post_check === 'yes') {
112                 if (!isset($_POST['als_id'])) {
113                     $als_id = "";
114                 } else {
115                     $als_id = $_POST['als_id'];
116                 }
117
118                 if ($als_id == $rs->fields['alias_name']) {
119                     $als_selected = 'selected';
120                 } else {
121                     $als_selected = '';
122                 }
123             } else {
124                 if (!$first_passed) {
125                     $als_selected = 'selected';
126                 } else {
127                     $als_selected = '';
128                 }
129             }
130
131             $als_menu_name = decode_idna($rs->fields['alias_name']);
132
133             $tpl->assign(array('ALS_ID' => $rs->fields['alias_name'],
134                     'ALS_SELECTED' => $als_selected,
135                     'ALS_NAME' => $als_menu_name));
136
137             $tpl->parse('ALS_LIST', '.als_list');
138             $rs->MoveNext();
139
140             if (!$first_passed) $first_passed = true;
141         }
142     }
143 }
144
145 function gen_dmn_sub_list(&$tpl, &$sql, $dmn_id, $dmn_name, $post_check) {
146     $ok_status = Config::get('ITEM_OK_STATUS');
147     $query = <<<SQL_QUERY
148         SELECT
149             subdomain_id AS sub_id, subdomain_name AS sub_name
150         FROM
151             subdomain
152         WHERE
153             domain_id = ?
154           AND
155             subdomain_status = ?
156         ORDER BY
157             subdomain_name
158 SQL_QUERY;
159
160     $rs = exec_query($sql, $query, array($dmn_id, $ok_status));
161
162     if ($rs->RecordCount() == 0) {
163         $tpl->assign(array(
164                         'SUB_ID' => 'n/a',
165                         'SUB_SELECTED' => 'selected',
166                         'SUB_NAME' => tr('Empty list')
167                 ));
168
169         $tpl->parse('SUB_LIST', 'sub_list');
170         $tpl->assign('TO_SUBDOMAIN', '');
171         $_SESSION['subdomain_count'] = "no";
172     } else {
173         $first_passed = false;
174         while (!$rs->EOF) {
175             if ($post_check === 'yes') {
176                 if (!isset($_POST['sub_id'])) {
177                     $sub_id = "";
178                 } else {
179                     $sub_id = $_POST['sub_id'];
180                 }
181
182                 if ($sub_id == $rs->fields['sub_name']) {
183                     $sub_selected = 'selected';
184                 } else {
185                     $sub_selected = '';
186                 }
187             } else {
188                 if (!$first_passed) {
189                     $sub_selected = 'selected';
190                 } else {
191                     $sub_selected = '';
192                 }
193             }
194
195             $sub_menu_name = decode_idna($rs->fields['sub_name']);
196             $dmn_menu_name = decode_idna($dmn_name);
197             $tpl->assign(array(
198                             'SUB_ID' => $rs->fields['sub_name'],
199                             'SUB_SELECTED' => $sub_selected,
200                             'SUB_NAME' => $sub_menu_name . '.' . $dmn_menu_name
201                         ));
202             $tpl->parse('SUB_LIST', '.sub_list');
203             $rs->MoveNext();
204             if (!$first_passed) $first_passed = true;
205         }
206     }
207 }
208
209 function get_ftp_user_gid(&$sql, $dmn_name, $ftp_user) {
210     global $last_gid;
211     global $max_gid;
212
213     $query = <<<SQL_QUERY
214           select gid, members from ftp_group where groupname = ?
215 SQL_QUERY;
216
217     $rs = exec_query($sql, $query, array($dmn_name));
218
219     if ($rs->RecordCount() == 0) { // there is no such group. we'll need a new one.
220         list($temp_dmn_id,
221             $temp_dmn_name,
222             $temp_dmn_gid,
223             $temp_dmn_uid,
224             $temp_dmn_created_id,
225             $temp_dmn_created,
226             $temp_dmn_last_modified,
227             $temp_dmn_mailacc_limit,
228             $temp_dmn_ftpacc_limit,
229             $temp_dmn_traff_limit,
230             $temp_dmn_sqld_limit,
231             $temp_dmn_sqlu_limit,
232             $temp_dmn_status,
233             $temp_dmn_als_limit,
234             $temp_dmn_subd_limit,
235             $temp_dmn_ip_id,
236             $temp_dmn_disk_limit,
237             $temp_dmn_disk_usage,
238             $temp_dmn_php,
239             $temp_dmn_cgi) = get_domain_default_props($sql, $_SESSION['user_id']);
240
241         $query = <<<SQL_QUERY
242               insert into ftp_group
243                  (groupname, gid, members)
244               values
245                  (?, ?, ?)
246 SQL_QUERY;
247
248         $rs = exec_query($sql, $query, array($dmn_name, $temp_dmn_gid, $ftp_user));
249         // add entries in the quota tables
250         // first check if we have it by one or other reason
251         $query = "SELECT count(name) as cnt from quotalimits where name=?";
252         $rs = exec_query($sql, $query, array($temp_dmn_name));
253         if ($rs->fields['cnt'] == 0) {
254             // ok insert it
255             if ($temp_dmn_disk_limit == 0) {
256                 $dlim = 0;
257             } else {
258                 $dlim = $temp_dmn_disk_limit * 1024 * 1024;
259             }
260
261             $query = <<<SQL_QUERY
262               INSERT INTO quotalimits
263                 (name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail)
264               VALUES
265                 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
266 SQL_QUERY;
267
268             $rs = exec_query($sql, $query, array($temp_dmn_name, 'group', 'false', 'hard', $dlim, 0, 0, 0, 0, 0));
269         }
270
271         return $temp_dmn_gid;
272     } else {
273         $ftp_gid = $rs->fields['gid'];
274         $members = $rs->fields['members'];
275
276         if (preg_match("/" . $ftp_user . "/", $members) == 0) {
277             $members .= ",$ftp_user";
278         }
279
280         $query = <<<SQL_QUERY
281             update
282                 ftp_group
283             set
284                 members = ?
285             where
286                 gid = ?
287             and
288                 groupname = ?
289 SQL_QUERY;
290
291         $rs = exec_query($sql, $query, array($members, $ftp_gid, $dmn_name));
292         return $ftp_gid;
293     }
294 }
295
296 function get_ftp_user_uid(&$sql, $dmn_name, $ftp_user, $ftp_user_gid) {
297     global $max_uid;
298
299     $query = <<<SQL_QUERY
300           select
301             uid
302           from
303             ftp_users
304           where
305             userid = ?
306           and
307             gid = ?
308 SQL_QUERY;
309
310     $rs = exec_query($sql, $query, array($ftp_user, $ftp_user_gid));
311     if ($rs->RecordCount() > 0) {
312         set_page_message(tr('FTP account already exists!'));
313         return -1;
314     }
315
316     list($temp_dmn_id,
317         $temp_dmn_name,
318         $temp_dmn_gid,
319         $temp_dmn_uid,
320         $temp_dmn_created_id,
321         $temp_dmn_created,
322         $temp_dmn_last_modified,
323         $temp_dmn_mailacc_limit,
324         $temp_dmn_ftpacc_limit,
325         $temp_dmn_traff_limit,
326         $temp_dmn_sqld_limit,
327         $temp_dmn_sqlu_limit,
328         $temp_dmn_status,
329         $temp_dmn_als_limit,
330         $temp_dmn_subd_limit,
331         $temp_dmn_ip_id,
332         $temp_dmn_disk_limit,
333         $temp_dmn_disk_usage,
334         $temp_dmn_php,
335         $temp_dmn_cgi) = get_domain_default_props($sql, $_SESSION['user_id']);
336
337     return $temp_dmn_uid;
338 }
339
340 function add_ftp_user(&$sql, $dmn_name) {
341     $username = strtolower(clean_input($_POST['username']));
342     $res_uname = preg_match("/\./", $username, $match);
343     if ($res_uname == 1) {
344         set_page_message(tr("Incorrect username length or syntax!"));
345         return;
346     }
347
348     if (!chk_username($username)) {
349         set_page_message(tr("Incorrect username length or syntax!"));
350         return;
351     }
352     // Set default values ($ftp_home may be overriden if user
353     // has specified a mount point
354     switch ($_POST['dmn_type']) {
355         // Default moint point for a domain
356         case 'dmn':
357             $ftp_user = $username . Config::get('FTP_USERNAME_SEPARATOR') . $dmn_name;
358             $ftp_home = Config::get('FTP_HOMEDIR') . "/$dmn_name";
359             break;
360         // Default mount point for an alias domain
361         case 'als':
362             $ftp_user = $username . Config::get('FTP_USERNAME_SEPARATOR') . $_POST['als_id'];
363             $alias_mount_point = get_alias_mount_point($sql, $_POST['als_id']);
364             $ftp_home = Config::get('FTP_HOMEDIR') . "/$dmn_name" . $alias_mount_point;
365             break;
366         // Default mount point for a subdomain
367         case 'sub':
368             $ftp_user = $username . Config::get('FTP_USERNAME_SEPARATOR') . $_POST['sub_id'] . '.' . $dmn_name;
369             $ftp_home = Config::get('FTP_HOMEDIR') . "/$dmn_name/" . clean_input($_POST['sub_id']);
370             break;
371         // Unknown domain type (?)
372         default:
373             set_page_message(tr('Unknown domain type'));
374             return;
375             break;
376     }
377     // User-specified mount point
378     if (isset($_POST['use_other_dir']) && $_POST['use_other_dir'] === 'on') {
379         $ftp_vhome = clean_input($_POST['other_dir'], false);
380         // Strip possible double-slashes
381         $ftp_vhome = str_replace('//', '/', $ftp_vhome);
382         // Check for updirs ".."
383         $res = preg_match("/\.\./", $ftp_vhome);
384         if ($res !== 0) {
385             set_page_message(tr('Incorrect mount point length or syntax'));
386             return;
387         }
388         $ftp_home = Config::get('FTP_HOMEDIR') . "/$dmn_name/" . $ftp_vhome;
389         // Strip possible double-slashes
390         $ftp_home = str_replace('//', '/', $ftp_home);
391         // Check for $ftp_vhome existance
392         // Create a virtual filesystem (it's important to use =&!)
393         $vfs =& new vfs($dmn_name, $sql);
394         // Check for directory existance
395         $res = $vfs->exists($ftp_vhome);
396
397         if (!$res) {
398             set_page_message(tr('%s does not exist', $ftp_vhome));
399             return;
400         }
401     } // End of user-specified mount-point
402     $ftp_gid = get_ftp_user_gid($sql, $dmn_name, $ftp_user);
403     $ftp_uid = get_ftp_user_uid($sql, $dmn_name, $ftp_user, $ftp_gid);
404
405     if ($ftp_uid == -1) return;
406
407     $ftp_shell = Config::get('CMD_SHELL');
408     $ftp_passwd = crypt_user_pass_with_salt($_POST['pass']);
409
410     $query = <<<SQL_QUERY
411         insert into ftp_users
412             (userid, passwd, uid, gid, shell, homedir)
413         values
414             (?, ?, ?, ?, ?, ?)
415 SQL_QUERY;
416
417     $rs = exec_query($sql, $query, array($ftp_user, $ftp_passwd, $ftp_uid, $ftp_gid, $ftp_shell, $ftp_home));
418     write_log($_SESSION['user_logged'] . ": add new FTP account: $ftp_user");
419     set_page_message(tr('FTP account added!'));
420     header('Location: ftp_accounts.php');
421     exit(0);
422 }
423
424 function check_ftp_acc_data(&$tpl, &$sql, $dmn_id, $dmn_name) {
425     if (!isset($_POST['username']) || $_POST['username'] === '') {
426         set_page_message(tr('Please enter FTP account username!'));
427         return;
428     }
429
430     if (!isset($_POST['pass']) || empty($_POST['pass']) || !isset($_POST['pass_rep']) || $_POST['pass_rep'] === '') {
431         set_page_message(tr('Password data is missing!'));
432         return;
433     }
434
435     if ($_POST['pass'] !== $_POST['pass_rep']) {
436         set_page_message(tr('Entered passwords differ from the another!'));
437         return;
438     }
439
440     if (!chk_password($_POST['pass'])) {
441         if(Config::get('PASSWD_STRONG')){
442           set_page_message(sprintf(tr('The password must be at least %s long and contain letters and numbers to be valid.'), Config::get('PASSWD_CHARS')));
443         } else {
444           set_page_message(sprintf(tr('Password data is shorter than %s signs or includes not permitted signs!'), Config::get('PASSWD_CHARS')));
445         }
446         return;
447     }
448
449     if ($_POST['dmn_type'] === 'sub' && $_POST['sub_id'] === 'n/a') {
450         set_page_message(tr('Subdomain list is empty! You can not add FTP accounts there!'));
451         return;
452     }
453
454     if ($_POST['dmn_type'] === 'als' && $_POST['als_id'] === 'n/a') {
455         set_page_message(tr('Alias list is empty! You can not add FTP accounts there!'));
456         return;
457     }
458
459     if (isset($_POST['use_other_dir']) && $_POST['use_other_dir'] === 'on' && empty($_POST['other_dir'])) {
460         set_page_message(tr('Please specify other FTP account dir!'));
461         return;
462     }
463
464     add_ftp_user($sql, $dmn_name);
465 }
466
467 function gen_page_ftp_acc_props(&$tpl, &$sql, $user_id) {
468     list($dmn_id,
469         $dmn_name,
470         $dmn_gid,
471         $dmn_uid,
472         $dmn_created_id,
473         $dmn_created,
474         $dmn_last_modified,
475         $dmn_mailacc_limit,
476         $dmn_ftpacc_limit,
477         $dmn_traff_limit,
478         $dmn_sqld_limit,
479         $dmn_sqlu_limit,
480         $dmn_status,
481         $dmn_als_limit,
482         $dmn_subd_limit,
483         $dmn_ip_id,
484         $dmn_disk_limit,
485         $dmn_disk_usage,
486         $dmn_php,
487         $dmn_cgi) = get_domain_default_props($sql, $user_id);
488
489     list($ftp_acc_cnt, $dmn_ftp_acc_cnt, $sub_ftp_acc_cnt, $als_ftp_acc_cnt) = get_domain_running_ftp_acc_cnt($sql, $dmn_id);
490