diff --git a/form/ftp_bd_service.tform.php b/form/ftp_bd_service.tform.php new file mode 100755 index 0000000..dfd7060 --- /dev/null +++ b/form/ftp_bd_service.tform.php @@ -0,0 +1,230 @@ + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + Form Definition + + Tabledefinition + + Datatypes: + - INTEGER (Forces the input to Int) + - DOUBLE + - CURRENCY (Formats the values to currency notation) + - VARCHAR (no format check, maxlength: 255) + - TEXT (no format check) + - DATE (Dateformat, automatic conversion to timestamps) + + Formtype: + - TEXT (Textfield) + - TEXTAREA (Textarea) + - PASSWORD (Password textfield, input is not shown when edited) + - SELECT (Select option field) + - RADIO + - CHECKBOX + - CHECKBOXARRAY + - FILE + + VALUE: + - Wert oder Array + + Hint: + The ID field of the database table is not part of the datafield definition. + The ID field must be always auto incement (int or bigint). + + Search: + - searchable = 1 or searchable = 2 include the field in the search + - searchable = 1: this field will be the title of the search result + - searchable = 2: this field will be included in the description of the search result + + +*/ + +$form["title"] = "Baicon, queso y Ftp con BBDD"; +$form["description"] = ""; +$form["name"] = "ftp_bd_service"; +$form["action"] = "ftp_bd_service.php"; +$form["db_table"] = "server"; +$form["db_table_idx"] = "server_id"; +$form["db_history"] = "no"; +$form["tab_default"] = "client"; +$form["auth"] = 'yes'; // yes / no + +$form["auth_preset"]["userid"] = 0; // 0 = id of the user, > 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['client'] = array( + 'title' => "Ftp vs BBDD", + 'description' => 'Create domain, mail domain, site, database and ftp/ssh', + 'width' => 100, + 'template' => "templates/ftp_bd_service.htm", + 'fields' => array ( + 'domain' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'filters' => array( + 0 => array( 'event' => 'SAVE', + 'type' => 'IDNTOASCII'), + 1 => array( 'event' => 'SHOW', + 'type' => 'IDNTOUTF8'), + 2 => array( 'event' => 'SAVE', + 'type' => 'TOLOWER') + ), + 'validators' => array ( + 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'domain_error_empty'), + 2 => array ( 'type' => 'REGEX', + 'regex' => '/^[\w\.\-]{2,255}\.[a-zA-Z0-9\-]{2,30}$/', + 'errmsg'=> 'domain_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'client_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => "SELECT sys_group.groupid, sys_group.client_id, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id > 0 ORDER BY client.company_name, client.contact_name, sys_group.name", + 'keyfield'=> 'client_id', + 'valuefield'=> 'contactname' + ), + 'value' => '' + ), + 'template_id' => array( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT template_id, template_name FROM wizard_template WHERE {AUTHSQL} ORDER BY template_name', + 'keyfield'=> 'template_id', + 'valuefield'=> 'template_name' + ), + 'value' => '', + ), + 'db' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n', 1 => 'y') + ), + 'db_type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'default' => 'mysql', + 'value' => array( + //'mongo' => 'MongoDB', + 'mysql' => 'MySQL' + ) + ), + 'ftp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n', 1 => 'y') + ), + 'ssh' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n', 1 => 'y') + ), + 'mail' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n', 1 => 'y') + ), + 'mailboxes' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'default' => '', + 'value' => '', + 'width' => '30', + ), + 'dkim' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n', 1 => 'y') + ), + 'dkim_private' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'default' => '', + 'value' => '', + 'cols' => '30', + 'rows' => '10', + 'validators' => array ( 0 => array ('type' => 'CUSTOM', + 'class' => 'validate_dkim', + 'function' => 'check_private_key', + 'errmsg'=> 'dkim_private_key_error'), + ), + ), + 'dkim_public' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + 'default' => '', + 'value' => '', + 'cols' => '30', + 'rows' => '10' + ), + 'dkim_selector' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'default', + 'value' => 'default', + 'width' => '20', + 'maxlength' => '63', + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-z0-9]{0,63}$/', + 'errmsg'=> 'dkim_selector_error'), + ), + ), + 'dns' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n', 1 => 'y') + ), + 'dns_template_id' => array( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => "SELECT template_id, name FROM dns_template WHERE visible = 'Y' ORDER BY name ASC", + 'keyfield'=> 'template_id', + 'valuefield'=> 'name' + ), + 'value' => '', + ), + ) +); \ No newline at end of file diff --git a/ftp_bd_service.php b/ftp_bd_service.php new file mode 100755 index 0000000..31f1c23 --- /dev/null +++ b/ftp_bd_service.php @@ -0,0 +1,618 @@ + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +/****************************************** +* Begin Form configuration +******************************************/ + +$tform_def_file = "form/ftp_bd_service.tform.php"; + +/****************************************** +* End Form configuration +******************************************/ + +require_once '../../lib/config.inc.php'; +require_once '../../lib/app.inc.php'; + +//* Check permissions for module +$app->auth->check_module_permissions('webdns'); + +// Loading classes +$app->uses('tpl,tform,remoting'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onShowEnd() { + global $app, $conf; + + $fields = $app->tform->encode($this->dataRecord, $app->tform->getCurrentTab(), true); + + // select first template as default + if($fields['dns_template_id'] == 0) + { + $first_template = $app->db->queryOneRecord("SELECT template_id FROM dns_template WHERE visible = 'Y' ORDER BY name ASC"); + $fields['dns_template_id'] = $first_template['template_id']; + } + + $template_record = $app->db->queryOneRecord("SELECT * FROM dns_template WHERE template_id = ?", $fields['dns_template_id']); + $fields = explode(',', $template_record['fields']); + if(is_array($fields)) { + foreach($fields as $field) { + $app->tpl->setVar($field."_VISIBLE", 1); + $field = strtolower($field); + $app->tpl->setVar($field, $_POST['dns_'.$field]); + } + } + + parent::onShowEnd(); + } + + function onSubmit() { + global $app, $conf; + + $fields = $app->tform->encode($this->dataRecord, $app->tform->getCurrentTab(), true); + + // check for domain unique name + if($app->db->queryOneRecord('SELECT domain_id FROM domain WHERE domain = "'.$fields['domain'].'"')) { + $app->tform->errorMessage = $app->tform->wordbook['domain_error_unique']; + } + + if($app->tform->errorMessage) + { + $this->onError(); + return; + } + + if($_POST['create'] != 1) + { + $app->tform->errorMessage = 'DUMMY'; + $app->tpl->setVar($this->dataRecord); + $this->onShow(); + return; + } + + // Domain OK, continue + $remote = new remote_actions; + + // load template + $template = $app->db->queryOneRecord("SELECT * FROM wizard_template WHERE template_id = ? LIMIT 0,1", $fields['template_id']); + + // client prefix and group id + $res = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ".$app->functions->intval($fields['client_id'])); + $client_group_id = $res['groupid']; + $client_prefix = 'c'.$fields['client_id']; + + // add domain + $domain_id = $remote->insert_query('../client/form/domain.tform.php', $fields['client_id'], array('domain' => $fields['domain'])); + + // DNS Zone + if($fields['dns']) + { + if(isset($_POST['dns_ns1']) && $_POST['dns_ns1'] != ''){ + $_POST['dns_ns1'] = $app->functions->idn_encode($_POST['dns_ns1']); + $_POST['dns_ns1'] = strtolower($_POST['dns_ns1']); + } + if(isset($_POST['dns_ns2']) && $_POST['dns_ns2'] != ''){ + $_POST['dns_ns2'] = $app->functions->idn_encode($_POST['dns_ns2']); + $_POST['dns_ns2'] = strtolower($_POST['dns_ns2']); + } + if(isset($_POST['dns_email']) && $_POST['dns_email'] != ''){ + $_POST['dns_email'] = $app->functions->idn_encode($_POST['dns_email']); + $_POST['dns_email'] = strtolower($_POST['dns_email']); + } + + $dns_error = ''; + + if(isset($_POST['dns_ip']) && $_POST['dns_ip'] == '') $dns_error .= $app->lng('error_ip_empty').'
'; + + if(isset($_POST['dns_ipv6']) && $_POST['dns_ipv6'] == '') $dns_error .= $app->lng('error_ipv6_empty').'
'; + + if(isset($_POST['dns_ns1']) && $_POST['dns_ns1'] == '') $dns_error .= $app->lng('error_ns1_empty').'
'; + elseif(isset($_POST['ns1']) && !preg_match('/^[\w\.\-]{2,64}\.[a-zA-Z0-9]{2,30}$/', $_POST['ns1'])) $dns_error .= $app->lng('error_ns1_regex').'
'; + + if(isset($_POST['dns_ns2']) && $_POST['dns_ns2'] == '') $dns_error .= $app->lng('error_ns2_empty').'
'; + elseif(isset($_POST['ns2']) && !preg_match('/^[\w\.\-]{2,64}\.[a-zA-Z0-9]{2,30}$/', $_POST['ns2'])) $dns_error .= $app->lng('error_ns2_regex').'
'; + + if(isset($_POST['dns_email']) && $_POST['dns_email'] == '') $dns_error .= $app->lng('error_email_empty').'
'; + elseif(isset($_POST['dns_email']) && filter_var($_POST['dns_email'], FILTER_VALIDATE_EMAIL) === false) $dns_error .= $app->lng('error_email_regex').'
'; + + // check for dns errors + if($dns_error) + { + $app->tform->errorMessage = $dns_error; + $this->onError(); + return; + } + + $tform_def_file = "../dns/form/dns_soa.tform.php"; + $app->tform->loadFormDef($tform_def_file); + + // replace template placeholders + $template_record = $app->db->queryOneRecord("SELECT * FROM dns_template WHERE template_id = ?", $fields['dns_template_id']); + $tpl_content = $template_record['template']; + $tpl_content = str_replace('{DOMAIN}', $fields['domain'], $tpl_content); + if($_POST['dns_ip'] != '') $tpl_content = str_replace('{IP}', $_POST['dns_ip'], $tpl_content); + if($_POST['dns_ipv6'] != '') $tpl_content = str_replace('{IPV6}',$_POST['dns_ipv6'],$tpl_content); + if($_POST['dns_ns1'] != '') $tpl_content = str_replace('{NS1}', $_POST['dns_ns1'], $tpl_content); + if($_POST['dns_ns2'] != '') $tpl_content = str_replace('{NS2}', $_POST['dns_ns2'], $tpl_content); + if($_POST['dns_email'] != '') $tpl_content = str_replace('{EMAIL}', $_POST['dns_email'], $tpl_content); + + $enable_dnssec = (($_POST['dns_dnssec'] == 'Y') ? 'Y' : 'N'); + + // Parse the template + $tpl_rows = explode("\n", $tpl_content); + $section = ''; + $vars = array(); + $vars['xfer']=''; + $dns_rr = array(); + foreach($tpl_rows as $row) { + $row = trim($row); + if(substr($row, 0, 1) == '[') { + if($row == '[ZONE]') { + $section = 'zone'; + } elseif($row == '[DNS_RECORDS]') { + $section = 'dns_records'; + } else { + die('Unknown section type'); + } + } else { + if($row != '') { + // Handle zone section + if($section == 'zone') { + $parts = explode('=', $row); + $key = trim($parts[0]); + $val = trim($parts[1]); + if($key != '') $vars[$key] = $val; + } + // Handle DNS Record rows + if($section == 'dns_records') { + $parts = explode('|', $row); + $dns_rr[] = array( + 'name' => $parts[1], + 'type' => $parts[0], + 'data' => $parts[2], + 'aux' => $parts[3], + 'ttl' => $parts[4] + ); + } + } + } + + } // end foreach + + $dns_error = ''; + + if($vars['origin'] == '') $dns_error .= $app->lng('error_origin_empty').'
'; + if($vars['ns'] == '') $dns_error .= $app->lng('error_ns_empty').'
'; + if($vars['mbox'] == '') $dns_error .= $app->lng('error_mbox_empty').'
'; + if($vars['refresh'] == '') $dns_error .= $app->lng('error_refresh_empty').'
'; + if($vars['retry'] == '') $dns_error .= $app->lng('error_retry_empty').'
'; + if($vars['expire'] == '') $dns_error .= $app->lng('error_expire_empty').'
'; + if($vars['minimum'] == '') $dns_error .= $app->lng('error_minimum_empty').'
'; + if($vars['ttl'] == '') $dns_error .= $app->lng('error_ttl_empty').'
'; + + // check for dns errors + if($dns_error) + { + $app->tform->errorMessage = $dns_error; + $this->onError(); + return; + } + + // Insert the soa record + $sys_userid = $_SESSION['s']['user']['userid']; + $origin = $vars['origin']; + $ns = $vars['ns']; + $mbox = str_replace('@', '.', $vars['mbox']); + $refresh = $vars['refresh']; + $retry = $vars['retry']; + $expire = $vars['expire']; + $minimum = $vars['minimum']; + $ttl = $vars['ttl']; + $xfer = $vars['xfer']; + $also_notify = $vars['also_notify']; + $update_acl = $vars['update_acl']; + $serial = $app->validate_dns->increase_serial(0); + + $insert_data = array( + "sys_userid" => $sys_userid, + "sys_groupid" => $client_group_id, + "sys_perm_user" => 'riud', + "sys_perm_group" => 'riud', + "sys_perm_other" => '', + "server_id" => $template['dns_server_id'], + "origin" => $origin, + "ns" => $ns, + "mbox" => $mbox, + "serial" => $serial, + "refresh" => $refresh, + "retry" => $retry, + "expire" => $expire, + "minimum" => $minimum, + "ttl" => $ttl, + "active" => 'Y', + "xfer" => $xfer, + "also_notify" => $also_notify, + "update_acl" => $update_acl, + "dnssec_wanted" => $enable_dnssec + ); + $dns_soa_id = $app->db->datalogInsert('dns_soa', $insert_data, 'id'); + + // Insert the dns_rr records + if(is_array($dns_rr) && $dns_soa_id > 0) { + foreach($dns_rr as $rr) { + $insert_data = array( + "sys_userid" => $sys_userid, + "sys_groupid" => $client_group_id, + "sys_perm_user" => 'riud', + "sys_perm_group" => 'riud', + "sys_perm_other" => '', + "server_id" => $template['dns_server_id'], + "zone" => $dns_soa_id, + "name" => $rr['name'], + "type" => $rr['type'], + "data" => $rr['data'], + "aux" => $rr['aux'], + "ttl" => $rr['ttl'], + "active" => 'Y' + ); + $dns_rr_id = $app->db->datalogInsert('dns_rr', $insert_data, 'id'); + } + + if($fields['dkim']) + { + $insert_data = array( + "sys_userid" => $sys_userid, + "sys_groupid" => $client_group_id, + "sys_perm_user" => 'riud', + "sys_perm_group" => 'riud', + "sys_perm_other" => '', + "server_id" => $template['dns_server_id'], + "zone" => $dns_soa_id, + "name" => $fields['dkim_selector'].'._domainkey.'.$fields['domain'].'.', + "type" => 'TXT', + "data" => 'v=DKIM1; t=s; p='.str_replace(array('-----BEGIN PUBLIC KEY-----','-----END PUBLIC KEY-----',"\r","\n"), '', $_POST['dkim_public']), + "aux" => 0, + "ttl" => 86400, + "active" => 'Y' + ); + $dns_rr_id = $app->db->datalogInsert('dns_rr', $insert_data, 'id'); + } + } + + $tform_def_file = "form/ftp_bd_service.tform.php"; + $app->tform->loadFormDef($tform_def_file); + } + + if($fields['mail']) + { + // add mail domain + $params = array( + 'server_id' => $template['mail_server_id'], + 'domain' => $fields['domain'], + 'dkim' => $fields['dkim'], + 'dkim_private' => $_POST['dkim_private'], + 'dkim_public' => $_POST['dkim_public'], + 'dkim_selector' => $fields['dkim_selector'], + 'active' => 'y' + ); + + $mail_domain_id = $remote->insert_query('../mail/form/mail_domain.tform.php', $fields['client_id'], $params); + + if($template['policy']) + { + $params = array( + 'server_id' => $template['mail_server_id'], + 'policy_id' => $template['policy'], + 'priority' => 5, + 'email' => '@'.$fields['domain'], + 'fullname' => '@'.$fields['domain'], + 'local' => 'Y', + ); + + $remote->insert_query('../mail/form/spamfilter_users.tform.php', $fields['client_id'], $params); + } + + if($fields['mailboxes']) + { + $mailboxes = explode(',', $fields['mailboxes']); + $mailbox_passwords = array(); + + foreach($mailboxes as $alias) + { + $alias = strtolower($app->functions->idn_encode($alias)); + $mailbox = $alias.'@'.$fields['domain']; + + // validate, on error skip + if( ! preg_match('/^[_a-z0-9][\w\.\-_\+@]{1,63}$/', $mailbox)) continue; + + $mailbox_passwords[$mailbox] = substr(sha1(rand()), 0, 10); + + $params = array( + 'server_id' => $template['mail_server_id'], + 'uid' => -1, + 'gid' => -1, + 'email' => $mailbox, + 'login' => $mailbox, + 'password' => $mailbox_passwords[$mailbox], + 'quota' => $template['mailbox_quota']*1024*1024, + 'postfix' => 'y', + 'disableimap' => ($template['enableimap'] == 'y' ? 'n' : 'y'), + 'disablepop3' => ($template['enablepop3'] == 'y' ? 'n' : 'y'), + 'disablesmtp' => ($template['enablesmtp'] == 'y' ? 'n' : 'y'), + 'maildir' => '/var/vmail/'.$fields['domain'].'/'.$alias, + 'homedir' => '/var/vmail', + ); + + $remote->insert_query('../mail/form/mail_user.tform.php', $fields['client_id'], $params); + } + } + } + + // add site + $params = array( + 'type' => 'vhost', + 'domain' => $fields['domain'], + 'server_id' => $template['web_server_id'], + 'ip_address' => $template['ip_address'], + 'ipv6_address' => $template['ipv6_address'], + 'traffic_quota' => $template['traffic_quota'], + 'hd_quota' => $template['hd_quota'], + 'cgi' => $template['cgi'], + 'ssi' => $template['ssi'], + 'suexec' => $template['suexec'], + 'ruby' => $template['ruby'], + 'python' => $template['python'], + 'perl' => $template['perl'], + 'errordocs' => $template['errordocs'], + 'subdomain' => $template['subdomain'], + 'php' => $template['php'], + 'fastcgi_php_version' => $template['fastcgi_php_version'], + 'seo_redirect' => $template['seo_redirect'], + 'rewrite_to_https' => $template['rewrite_to_https'], + 'allow_override' => $template['allow_override'], + 'http_port' => $template['http_port'], + 'https_port' => $template['https_port'], + 'apache_directives' => $template['apache_directives'], + 'nginx_directives' => $template['nginx_directives'], + 'php_fpm_use_socket' => $template['php_fpm_use_socket'], + 'pm' => $template['pm'], + 'pm_max_children' => $template['pm_max_children'], + 'pm_start_servers' => $template['pm_start_servers'], + 'pm_min_spare_servers' => $template['pm_min_spare_servers'], + 'pm_max_spare_servers' => $template['pm_max_spare_servers'], + 'pm_process_idle_timeout' => $template['pm_process_idle_timeout'], + 'pm_max_requests' => $template['pm_max_requests'], + 'custom_php_ini' => $template['custom_php_ini'], + 'active' => 'y', + 'document_root' => '-', + 'system_user' => '-', + 'system_group' => '-', + 'client_group_id' => $client_group_id, + ); + + $site_id = $remote->insert_query('../sites/form/web_vhost_domain.tform.php', $fields['client_id'], $params, 'sites:web_vhost_domain:on_after_insert'); + + // get site data + $app->uses('remoting_lib'); + $app->remoting_lib->loadFormDef('../sites/form/web_vhost_domain.tform.php'); + $site_data = $app->remoting_lib->getDataRecord($site_id); + + // generate username + $generated_username = $client_prefix.substr(sha1(rand()), 0, 8); + + if($fields['db']) + { + // add database user + $db_user_params = array( + 'server_id' => $template['database_server_id'], + 'database_user' => $generated_username, + 'database_password' => substr(sha1(rand()), 0, 10) + ); + $db_user_id = $remote->insert_query('../sites/form/database_user.tform.php', $fields['client_id'], $db_user_params, 'sites:web_database_user:on_after_insert'); + + // add database + $params = array( + 'server_id' => $template['database_server_id'], + 'parent_domain_id' => $site_id, + 'type' => $fields['db_type'], + 'database_quota' => $template['database_quota'], + 'database_name' => $db_user_params['database_user'], + 'database_user_id' => $db_user_id, + 'database_charset' => $template['database_charset'], + 'remote_access' => $template['database_remote_access'], + 'remote_ips' => $template['database_remote_ips'], + 'active' => 'y' + ); + $remote->sites_database_add($fields['client_id'], $params); + } + + if($fields['ftp']) { + // add ftp user + $ftp_params = array( + 'server_id' => $template['web_server_id'], + 'parent_domain_id' => $site_id, + 'username' => $generated_username, + 'password' => substr(sha1(rand()), 0, 10), + 'quota_size' => $template['hd_quota'], + 'dir' => $site_data['document_root'], + 'uid' => $site_data['system_user'], + 'gid' => $site_data['system_group'], + 'sys_groupid' => $site_data['sys_groupid'], + 'quota_files' => $template['quota_files'], + 'ul_ratio' => $template['ul_ratio'], + 'dl_ratio' => $template['dl_ratio'], + 'ul_bandwidth' => $template['ul_bandwidth'], + 'dl_bandwidth' => $template['dl_bandwidth'], + 'active' => 'y', + ); + $remote->insert_query('../sites/form/ftp_user.tform.php', $fields['client_id'], $ftp_params); + } + + if($fields['ssh']) { + // add ssh user + $ssh_params = array( + 'server_id' => $template['web_server_id'], + 'parent_domain_id' => $site_id, + 'quota_size' => $template['hd_quota'], + 'dir' => $site_data['document_root'], + 'puser' => $site_data['system_user'], + 'pgroup' => $site_data['system_group'], + 'sys_groupid' => $site_data['sys_groupid'], + 'chroot' => $template['shell_chroot'], + 'shell' => $template['shell'], + 'active' => 'y', + 'username' => $generated_username, + ); + + // username, password + if(isset($ftp_params)) { + $ssh_params['password'] = $ftp_params['password']; + } else { + $ssh_params['password'] = substr(sha1(rand()), 0, 10); + } + + $remote->insert_query('../sites/form/shell_user.tform.php', $fields['client_id'], $ssh_params); + } + + // results + echo ' + +
+ + + + + + + '; + if(isset($db_user_params)) { + echo + ' + + + + + + + '; + } + if(isset($ftp_params)) { + echo' + + + + + + + + '; + } + if(isset($ssh_params)) { + echo' + + + + + + + + '; + } + if(isset($mailbox_passwords) and (bool)count($mailbox_passwords)) + { + echo ' + + + + '; + foreach($mailbox_passwords as $mail => $pass) + { + echo' + + + + '; + } + } + echo' + +
'.$fields['domain'].'
DB name/userDB password
'.$db_user_params['database_user'].''.$db_user_params['database_password'].'
FTP userFTP password
'.$ftp_params['username'].''.$ftp_params['password'].'
SSH userSSH password
'.$ssh_params['username'].''.$ssh_params['password'].'
MailboxPassword
'.$mail.''.$pass.'
+
+ '; + } + + private function clean_private_key($key) + { + return str_replace('\r\n', '', $key); + } + +} + +class remote_actions extends remoting { + public function insert_query($formdef_file, $client_id, $params, $event_identifier = '') { + return $this->insertQuery($formdef_file, $client_id, $params, $event_identifier); + } + + public function sites_database_add($client_id, $params) + { + global $app; + + $sql = $this->insertQueryPrepare('../sites/form/database.tform.php', $client_id, $params); + if($sql !== false) { + $app->uses('sites_database_plugin'); + + $this->id = 0; + $this->dataRecord = $params; + $app->sites_database_plugin->processDatabaseInsert($this); + + $retval = $this->insertQueryExecute($sql, $params); + + // set correct values for backup_interval and backup_copies + if(isset($params['backup_interval']) || isset($params['backup_copies'])){ + $sql_set = array(); + if(isset($params['backup_interval'])) $sql_set[] = "backup_interval = '".$app->db->quote($params['backup_interval'])."'"; + if(isset($params['backup_copies'])) $sql_set[] = "backup_copies = ".$app->functions->intval($params['backup_copies']); + //$app->db->query("UPDATE web_database SET ".implode(', ', $sql_set)." WHERE database_id = ".$retval); + $this->updateQueryExecute("UPDATE web_database SET ".implode(', ', $sql_set)." WHERE database_id = ".$retval, $retval, $params); + } + + return $retval; + } + + return false; + } +} + +$page = new page_action; +$page->onLoad(); diff --git a/lib/lang/en_ftp_bd_service.lng b/lib/lang/en_ftp_bd_service.lng new file mode 100644 index 0000000..a2102e2 --- /dev/null +++ b/lib/lang/en_ftp_bd_service.lng @@ -0,0 +1,188 @@ += 0.'; +$wb["pm_ondemand_hint_txt"] = 'Please note that you must have PHP version >= 5.3.9 in order to use the ondemand process manager. If you select ondemand for an older PHP version, PHP will not start anymore!'; +$wb['generate_password_txt'] = 'Generate Password'; +$wb['repeat_password_txt'] = 'Repeat Password'; +$wb['password_mismatch_txt'] = 'The passwords do not match.'; +$wb['password_match_txt'] = 'The passwords do match.'; +$wb['available_php_directive_snippets_txt'] = 'Available PHP Directive Snippets:'; +$wb['available_apache_directive_snippets_txt'] = 'Available Apache Directive Snippets:'; +$wb['available_nginx_directive_snippets_txt'] = 'Available nginx Directive Snippets:'; +$wb['proxy_directives_txt'] = 'Proxy Directives'; +$wb['available_proxy_directive_snippets_txt'] = 'Available Proxy Directive Snippets:'; +$wb['no_server_error'] = 'No server selected.'; +$wb['no_backup_txt'] = 'No backup'; +$wb['daily_backup_txt'] = 'Daily'; +$wb['weekly_backup_txt'] = 'Weekly'; +$wb['monthly_backup_txt'] = 'Monthly'; +$wb['rewrite_rules_txt'] = 'Rewrite Rules'; +$wb['invalid_rewrite_rules_txt'] = 'Invalid Rewrite Rules'; +$wb['allowed_rewrite_rule_directives_txt'] = 'Allowed Directives:'; +$wb['configuration_error_txt'] = "CONFIGURATION ERROR"; +$wb['variables_txt'] = 'Variables'; +$wb['added_by_txt'] = 'Added by'; +$wb['added_date_txt'] = 'Added date'; +$wb['backup_excludes_txt'] = 'Excluded Directories'; +$wb['backup_excludes_note_txt'] = '(Separate multiple directories with commas. Example: web/cache/*,web/backup)'; +$wb['backup_excludes_error_regex'] = 'The excluded directories contain invalid characters.'; +$wb['invalid_custom_php_ini_settings_txt'] = 'Invalid php.ini settings'; +$wb['invalid_system_user_or_group_txt'] = 'Invalid system user or group'; +$wb['apache_directive_blocked_error'] = 'Apache directive blocked by security settings:'; +$wb['http_port_txt'] = 'HTTP Port'; +$wb['https_port_txt'] = 'HTTPS Port'; +$wb['http_port_error_regex'] = 'HTTP Port invalid.'; +$wb['https_port_error_regex'] = 'HTTPS Port invalid.'; +$wb['error_dominio_mas_puntos'] = 'El dominio no es correcto, hay 3 puntos o más.'; +$wb['error_dominio_www'] = 'El dominio no es correcto. No escriba "www" antes del dominio.'; +$wb['error_no_existe_dominio_padre'] = 'El dominio padre para este subdominio, no existe.'; +$wb['error_no_ip'] = 'No tiene ip, necesita añadirla en la configuración.'; +$wb['error_subdominio_existe'] = 'Este subdominio existe.'; +?> \ No newline at end of file diff --git a/lib/lang/en_template.lng b/lib/lang/en_template.lng index 758a98f..47164be 100644 --- a/lib/lang/en_template.lng +++ b/lib/lang/en_template.lng @@ -1,81 +1,86 @@ = 0.'; $wb["pm_ondemand_hint_txt"] = 'Please note that you must have PHP version >= 5.3.9 in order to use the ondemand process manager. If you select ondemand for an older PHP version, PHP will not start anymore!'; -$wb["pm_max_children_txt"] = 'PHP-FPM pm.max_children'; -$wb["pm_start_servers_txt"] = 'PHP-FPM pm.start_servers'; -$wb["pm_min_spare_servers_txt"] = 'PHP-FPM pm.min_spare_servers'; -$wb["pm_max_spare_servers_txt"] = 'PHP-FPM pm.max_spare_servers'; $wb["error_php_fpm_pm_settings_txt"] = 'Values of PHP-FPM pm settings must be as follows: pm.max_children >= pm.max_spare_servers >= pm.start_servers >= pm.min_spare_servers > 0'; $wb["pm_max_children_error_regex"] = 'PHP-FPM pm.max_children must be a positive integer value.'; $wb["pm_start_servers_error_regex"] = 'PHP-FPM pm.start_servers must be a positive integer value.'; $wb["pm_min_spare_servers_error_regex"] = 'PHP-FPM pm.min_spare_servers must be a positive integer value.'; $wb["pm_max_spare_servers_error_regex"] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; -$wb["apache_directives_txt"] = 'Apache Directives'; -$wb["nginx_directives_txt"] = 'Nginx Directives'; $wb["proxy_directives_txt"] = 'Proxy Directives'; -$wb["custom_php_ini_txt"] = 'Custom php.ini settings'; -$wb["seo_redirect_txt"] = 'SEO Redirect'; -$wb['rewrite_to_https_txt'] = 'Rewrite HTTP to HTTPS'; $wb["no_redirect_txt"] = 'No redirect'; $wb["none_txt"] = 'None'; -$wb["php_fpm_use_socket_txt"] = 'Use Socket For PHP-FPM'; $wb["traffic_quota_error_regex"] = 'Traffic quota is invalid.'; -$wb['traffic_quota_error_empty'] = 'Traffic quota is empty.'; -$wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; -$wb['hd_quota_error_empty'] = 'Harddisk quota is 0 or empty.'; +$wb["traffic_quota_error_empty"] = 'Traffic quota is empty.'; +$wb["hd_quota_error_regex"] = 'Harddisk quota is invalid.'; +$wb["hd_quota_error_empty"] = 'Harddisk quota is 0 or empty.'; $wb["btn_save_txt"] = 'Save'; $wb["btn_cancel_txt"] = 'Cancel'; $wb["variables_txt"] = 'Variables'; $wb["disabled_txt"] = 'Disabled'; -$wb["template_name_txt"] = 'Template name'; $wb["template_name_error_empty"] = 'Template name can not be empty!'; $wb["policy_txt"] = 'Spamfilter'; $wb["no_policy"] = '- not enabled -'; $wb["dkim_txt"] = 'Enable DKIM'; -$wb['dkim_selector_txt'] = 'DKIM-Selector'; -$wb['dkim_selector_error'] = 'Invalid DKIM-Selector. Use only lower-case alphanumeric characters (a-z or 0-9) up to 63 chars'; +$wb["dkim_selector_txt"] = 'DKIM-Selector'; +$wb["dkim_selector_error"] = 'Invalid DKIM-Selector. Use only lower-case alphanumeric characters (a-z or 0-9) up to 63 chars'; $wb["remote_access_txt"] = 'Remote Access'; $wb["remote_ips_txt"] = 'Remote Access IPs (separate by , and leave blank for any)'; $wb["database_charset_txt"] = 'Database charset'; $wb["database_remote_error_ips"] = 'At least one of the entered ip addresses is invalid.'; -$wb['limit_database_quota_txt'] = 'Database quota'; -$wb['limit_database_quota_error_notint'] = 'The database quota limit must be a number.'; +$wb["limit_database_quota_txt"] = 'Database quota'; +$wb["limit_database_quota_error_notint"] = 'The database quota limit must be a number.'; $wb["quota_files_txt"] = 'Filequota'; $wb["quota_files_unity_txt"] = 'Files'; $wb["ul_ratio_txt"] = 'Upload ratio'; $wb["dl_ratio_txt"] = 'Download ratio'; $wb["ul_bandwidth_txt"] = 'Upload bandwidth'; $wb["dl_bandwidth_txt"] = 'Download bandwidth'; -$wb['shell_txt'] = "Shell"; -$wb['chroot_txt'] = "Chroot Shell"; -$wb['shell_error_regex'] = 'Invalid shell'; -$wb['shell_error_empty'] = 'Shell is empty!'; +$wb["shell_txt"] = 'Shell'; +$wb["chroot_txt"] = 'Chroot Shell'; +$wb["shell_error_regex"] = 'Invalid shell'; +$wb["shell_error_empty"] = 'Shell is empty!'; $wb["enablesmtp_txt"] = 'Enable SMTP (sending)'; $wb["enableimap_txt"] = 'Enable IMAP'; $wb["enablepop3_txt"] = 'Enable POP3'; $wb["mailbox_quota_txt"] = 'Mailbox quota (0 for unlimited)'; $wb["quota_error_isint"] = 'Mailbox size must be a number.'; $wb["quota_error_value"] = 'Invalid quota value. Allowed values are: 0 for unlimited or numbers > 1'; -$wb['http_port_txt'] = 'HTTP Port'; -$wb['https_port_txt'] = 'HTTPS Port'; \ No newline at end of file +?> \ No newline at end of file diff --git a/lib/lang/es_ftp_bd_service.lng b/lib/lang/es_ftp_bd_service.lng new file mode 100644 index 0000000..8758f43 --- /dev/null +++ b/lib/lang/es_ftp_bd_service.lng @@ -0,0 +1,188 @@ + www'; +$wb['www_to_non_www_txt'] = 'www -> non-www'; +$wb['php_fpm_use_socket_txt'] = 'Usar Socket para PHP-FPM'; +$wb['error_no_sni_txt'] = 'SNI para SSL no está activado en este servidor. Sólo es posible activar un certificado SSL en cada dirección IP.'; +$wb['python_txt'] = 'Python'; +$wb['pm_max_children_txt'] = 'PHP-FPM pm.max_children'; +$wb['pm_start_servers_txt'] = 'PHP-FPM pm.start_servers'; +$wb['pm_min_spare_servers_txt'] = 'PHP-FPM pm.min_spare_servers'; +$wb['pm_max_spare_servers_txt'] = 'PHP-FPM pm.max_spare_servers'; +$wb['error_php_fpm_pm_settings_txt'] = 'Los valores de configuración de PHP-FPM pm debe ser como sigue: pm.max_children> = pm.max_spare_servers> = pm.start_servers> = pm.min_spare_servers> 0'; +$wb['pm_max_children_error_regex'] = 'PHP-FPM pm.max_children debe ser un valor entero positivo.'; +$wb['pm_start_servers_error_regex'] = 'PHP-FPM pm.start_servers debe ser un valor entero positivo.'; +$wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers debe ser un valor entero positivo.'; +$wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers debe ser un valor entero positivo.'; +$wb['ssl_key_txt'] = 'SSL Key'; +$wb['web_folder_error_regex'] = 'Invalid folder entered. Please do not enter a slash.'; +$wb['domain_error_autosub'] = 'There is already a subdomain with these settings.'; +$wb['perl_txt'] = 'Perl'; +$wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; +$wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; +$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['pm_txt'] = 'PHP-FPM Process Manager'; +$wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; +$wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; +$wb['pm_process_idle_timeout_error_regex'] = 'PHP-FPM pm.process_idle_timeout must be a positive integer value.'; +$wb['pm_max_requests_error_regex'] = 'PHP-FPM pm.max_requests must be an integer value >= 0.'; +$wb['pm_ondemand_hint_txt'] = 'Please note that you must have PHP version >= 5.3.9 in order to use the ondemand process manager. If you select ondemand for an older PHP version, PHP will not start anymore!'; +$wb['generate_password_txt'] = 'Generate Password'; +$wb['repeat_password_txt'] = 'Repeat Password'; +$wb['password_mismatch_txt'] = 'The passwords do not match.'; +$wb['password_match_txt'] = 'The passwords do match.'; +$wb['available_php_directive_snippets_txt'] = 'Available PHP Directive Snippets:'; +$wb['available_apache_directive_snippets_txt'] = 'Available Apache Directive Snippets:'; +$wb['available_nginx_directive_snippets_txt'] = 'Available nginx Directive Snippets:'; +$wb['proxy_directives_txt'] = 'Proxy Directives'; +$wb['available_proxy_directive_snippets_txt'] = 'Available Proxy Directive Snippets:'; +$wb['no_server_error'] = 'No server selected.'; +$wb['no_backup_txt'] = 'No backup'; +$wb['daily_backup_txt'] = 'Daily'; +$wb['weekly_backup_txt'] = 'Weekly'; +$wb['monthly_backup_txt'] = 'Monthly'; +$wb['rewrite_rules_txt'] = 'Rewrite Rules'; +$wb['invalid_rewrite_rules_txt'] = 'Invalid Rewrite Rules'; +$wb['allowed_rewrite_rule_directives_txt'] = 'Allowed Directives:'; +$wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; +$wb['variables_txt'] = 'Variables'; +$wb['added_by_txt'] = 'Added by'; +$wb['added_date_txt'] = 'Added date'; +$wb['backup_excludes_txt'] = 'Excluded Directories'; +$wb['backup_excludes_note_txt'] = '(Separate multiple directories with commas. Example: web/cache/*,web/backup)'; +$wb['backup_excludes_error_regex'] = 'The excluded directories contain invalid characters.'; +$wb['invalid_custom_php_ini_settings_txt'] = 'Invalid php.ini settings'; +$wb['invalid_system_user_or_group_txt'] = 'Invalid system user or group'; +$wb['apache_directive_blocked_error'] = 'Apache directive blocked by security settings:'; +$wb['http_port_txt'] = 'HTTP Port'; +$wb['https_port_txt'] = 'HTTPS Port'; +$wb['http_port_error_regex'] = 'HTTP Port invalid.'; +$wb['https_port_error_regex'] = 'HTTPS Port invalid.'; +$wb['error_dominio_mas_puntos'] = 'El dominio no es correcto, hay 3 puntos o más.'; +$wb['error_dominio_www'] = 'El dominio no es correcto. No escriba "www" antes del dominio.'; +$wb['error_no_existe_dominio_padre'] = 'El dominio padre para este subdominio, no existe.'; +$wb['error_no_ip'] = 'No tiene ip, necesita añadirla en la configuración.'; +$wb['error_subdominio_existe'] = 'Este subdominio existe.'; +?> diff --git a/lib/module.conf.php b/lib/module.conf.php index 55cc0e1..c44b0b1 100644 --- a/lib/module.conf.php +++ b/lib/module.conf.php @@ -32,6 +32,11 @@ $items[] = array( 'title' => 'Nuevo servicio web', 'link' => 'webdns/new_service_webdns.php', 'html_id' => 'new_service_webdns'); +$items[] = array( 'title' => 'FTP con BD', + 'target' => 'content', + 'link' => 'webdns/ftp_bd_service.php', + 'html_id' =>'ftp_service' + ); $items[] = array( 'title' => 'Versión', 'target' => 'content', 'link' => 'webdns/version_webdns.php', diff --git a/templates/ftp_bd_service.htm b/templates/ftp_bd_service.htm new file mode 100644 index 0000000..83fc5b4 --- /dev/null +++ b/templates/ftp_bd_service.htm @@ -0,0 +1,258 @@ +
+ +
+ +
+
+ +
+ +
+ +
+
+ + + +
+ +
+ {tmpl_var name='db'} +
+
+ +
+ +
+ +
+
+ +
+ +
+ {tmpl_var name='ftp'} +
+
+ + + + +
+ +
+ +
+
+ + +
+
+ + + \ No newline at end of file