diff --git a/admin_customers.php b/admin_customers.php
index 74dc10b8..ddd139db 100644
--- a/admin_customers.php
+++ b/admin_customers.php
@@ -1073,6 +1073,20 @@ if ($page == 'customers'
}
}
+ // hosting plans
+ $hosting_plans = "";
+ $plans = Database::query("
+ SELECT *
+ FROM `" . TABLE_PANEL_PLANS . "`
+ ORDER BY name ASC
+ ");
+ if (Database::num_rows() > 0){
+ $hosting_plans .= makeoption("---", 0, 0, true, true);
+ }
+ while ($row = $plans->fetch(PDO::FETCH_ASSOC)) {
+ $hosting_plans .= makeoption($row['name'], $row['id'], 0, true, true);
+ }
+
$customer_add_data = include_once dirname(__FILE__).'/lib/formfields/admin/customer/formfield.customer_add.php';
$customer_add_form = htmlform::genHTMLForm($customer_add_data);
@@ -1755,6 +1769,20 @@ if ($page == 'customers'
}
}
+ // hosting plans
+ $hosting_plans = "";
+ $plans = Database::query("
+ SELECT *
+ FROM `" . TABLE_PANEL_PLANS . "`
+ ORDER BY name ASC
+ ");
+ if (Database::num_rows() > 0){
+ $hosting_plans .= makeoption("---", 0, 0, true, true);
+ }
+ while ($row = $plans->fetch(PDO::FETCH_ASSOC)) {
+ $hosting_plans .= makeoption($row['name'], $row['id'], 0, true, true);
+ }
+
$customer_edit_data = include_once dirname(__FILE__).'/lib/formfields/admin/customer/formfield.customer_edit.php';
$customer_edit_form = htmlform::genHTMLForm($customer_edit_data);
diff --git a/admin_plans.php b/admin_plans.php
new file mode 100644
index 00000000..6ff53949
--- /dev/null
+++ b/admin_plans.php
@@ -0,0 +1,492 @@
+ (2010-)
+ * @license GPLv2 http://files.froxlor.org/misc/COPYING.txt
+ * @package Panel
+ *
+ */
+define('AREA', 'admin');
+require './lib/init.php';
+
+if (isset($_POST['id'])) {
+ $id = intval($_POST['id']);
+} elseif (isset($_GET['id'])) {
+ $id = intval($_GET['id']);
+}
+
+if ($page == '' || $page == 'overview') {
+
+ if ($action == '') {
+
+ $log->logAction(ADM_ACTION, LOG_NOTICE, "viewed admin_plans");
+ $fields = array(
+ 'p.name' => $lng['admin']['plans']['name'],
+ 'p.description' => $lng['admin']['plans']['description'],
+ 'adminname' => $lng['admin']['admin'],
+ 'p.ts' => $lng['admin']['plans']['last_update']
+ );
+ $paging = new paging($userinfo, TABLE_PANEL_PLANS, $fields);
+ $plans = '';
+ $result_stmt = Database::prepare("
+ SELECT p.*, a.loginname as adminname
+ FROM `" . TABLE_PANEL_PLANS . "` p, `" . TABLE_PANEL_ADMINS . "` a
+ WHERE " . ($userinfo['customers_see_all'] ? '' : " `p`.`adminid` = :adminid AND ") . "
+ `p`.`adminid` = `a`.`adminid` " . $paging->getSqlWhere(false) . " " . $paging->getSqlOrderBy() . " " . $paging->getSqlLimit());
+ Database::pexecute($result_stmt, array(
+ 'adminid' => $userinfo['adminid']
+ ));
+ $paging->setEntries(Database::num_rows());
+ $sortcode = $paging->getHtmlSortCode($lng);
+ $arrowcode = $paging->getHtmlArrowCode($filename . '?page=' . $page . '&s=' . $s);
+ $searchcode = $paging->getHtmlSearchCode($lng);
+ $pagingcode = $paging->getHtmlPagingCode($filename . '?page=' . $page . '&s=' . $s);
+ $i = 0;
+ $count = 0;
+
+ while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
+
+ if ($paging->checkDisplay($i)) {
+ $row = htmlentities_array($row);
+ $row['ts_format'] = date("d.m.Y H:i", $row['ts']);
+ eval("\$plans.=\"" . getTemplate("plans/plans_plan") . "\";");
+ $count ++;
+ }
+ $i ++;
+ }
+
+ eval("echo \"" . getTemplate("plans/plans") . "\";");
+ } elseif ($action == 'delete' && $id != 0) {
+
+ $result_stmt = Database::prepare("
+ SELECT * FROM `" . TABLE_PANEL_PLANS . "` WHERE `id` = :id");
+ $result = Database::pexecute_first($result_stmt, array(
+ 'id' => $id
+ ));
+
+ if ($result['id'] != 0 && $result['id'] == $id && (int) $userinfo['adminid'] == $result['adminid']) {
+ if (isset($_POST['send']) && $_POST['send'] == 'send') {
+
+ $del_stmt = Database::prepare("
+ DELETE FROM `" . TABLE_PANEL_PLANS . "` WHERE `id` = :id");
+ Database::pexecute($del_stmt, array(
+ 'id' => $id
+ ));
+
+ $log->logAction(ADM_ACTION, LOG_INFO, "Plan '" . $result['name'] . "' has been deleted by '" . $userinfo['loginname'] . "'");
+ redirectTo($filename, array(
+ 'page' => $page,
+ 's' => $s
+ ));
+ } else {
+ ask_yesno('plan_reallydelete', $filename, array(
+ 'id' => $id,
+ 'page' => $page,
+ 'action' => $action
+ ), $result['name']);
+ }
+ } else {
+ standard_error('nopermissionsorinvalidid');
+ }
+ } elseif ($action == 'add') {
+
+ if (isset($_POST['send']) && $_POST['send'] == 'send') {
+ $name = validate($_POST['name'], 'name');
+ $description = validate(str_replace("\r\n", "\n", $_POST['description']), 'description', '/^[^\0]*$/');
+
+ $value_arr = array();
+
+ $value_arr['diskspace'] = intval_ressource($_POST['diskspace']);
+ if (isset($_POST['diskspace_ul'])) {
+ $value_arr['diskspace'] = - 1;
+ }
+
+ $value_arr['traffic'] = doubleval_ressource($_POST['traffic']);
+ if (isset($_POST['traffic_ul'])) {
+ $value_arr['traffic'] = - 1;
+ }
+
+ $value_arr['subdomains'] = intval_ressource($_POST['subdomains']);
+ if (isset($_POST['subdomains_ul'])) {
+ $value_arr['subdomains'] = - 1;
+ }
+
+ $value_arr['emails'] = intval_ressource($_POST['emails']);
+ if (isset($_POST['emails_ul'])) {
+ $value_arr['emails'] = - 1;
+ }
+
+ $value_arr['email_accounts'] = intval_ressource($_POST['email_accounts']);
+ if (isset($_POST['email_accounts_ul'])) {
+ $value_arr['email_accounts'] = - 1;
+ }
+
+ $value_arr['email_forwarders'] = intval_ressource($_POST['email_forwarders']);
+ if (isset($_POST['email_forwarders_ul'])) {
+ $value_arr['email_forwarders'] = - 1;
+ }
+
+ if (Settings::Get('system.mail_quota_enabled') == '1') {
+ $value_arr['email_quota'] = validate($_POST['email_quota'], 'email_quota', '/^\d+$/', 'vmailquotawrong', array(
+ '0',
+ ''
+ ));
+ if (isset($_POST['email_quota_ul'])) {
+ $value_arr['email_quota'] = - 1;
+ }
+ } else {
+ $value_arr['email_quota'] = - 1;
+ }
+
+ $value_arr['email_imap'] = 0;
+ if (isset($_POST['email_imap'])) {
+ $value_arr['email_imap'] = intval_ressource($_POST['email_imap']);
+ }
+
+ $value_arr['email_pop3'] = 0;
+ if (isset($_POST['email_pop3'])) {
+ $value_arr['email_pop3'] = intval_ressource($_POST['email_pop3']);
+ }
+
+ $value_arr['ftps'] = intval_ressource($_POST['ftps']);
+ if (isset($_POST['ftps_ul'])) {
+ $value_arr['ftps'] = - 1;
+ }
+
+ $value_arr['tickets'] = (Settings::Get('ticket.enabled') == 1 ? intval_ressource($_POST['tickets']) : 0);
+ if (isset($_POST['tickets_ul']) && Settings::Get('ticket.enabled') == '1') {
+ $value_arr['tickets'] = - 1;
+ }
+
+ $value_arr['mysqls'] = intval_ressource($_POST['mysqls']);
+ if (isset($_POST['mysqls_ul'])) {
+ $value_arr['mysqls'] = - 1;
+ }
+
+ $value_arr['phpenabled'] = 0;
+ if (isset($_POST['phpenabled'])) {
+ $value_arr['phpenabled'] = intval($_POST['phpenabled']);
+ }
+
+ $value_arr['allowed_phpconfigs'] = array();
+ if (isset($_POST['allowed_phpconfigs']) && is_array($_POST['allowed_phpconfigs'])) {
+ foreach ($_POST['allowed_phpconfigs'] as $allowed_phpconfig) {
+ $allowed_phpconfig = intval($allowed_phpconfig);
+ $value_arr['allowed_phpconfigs'][] = $allowed_phpconfig;
+ }
+ }
+
+ $value_arr['perlenabled'] = 0;
+ if (isset($_POST['perlenabled'])) {
+ $value_arr['perlenabled'] = intval($_POST['perlenabled']);
+ }
+
+ $value_arr['dnsenabled'] = 0;
+ if (isset($_POST['dnsenabled'])) {
+ $value_arr['dnsenabled'] = intval($_POST['dnsenabled']);
+ }
+
+ $ins_stmt = Database::prepare("
+ INSERT INTO `" . TABLE_PANEL_PLANS . "`
+ SET `adminid` = :adminid, `name` = :name, `description` = :desc, `value` = :valuearr, `ts` = UNIX_TIMESTAMP();
+ ");
+ $ins_data = array(
+ 'adminid' => $userinfo['adminid'],
+ 'name' => $name,
+ 'desc' => $description,
+ 'valuearr' => json_encode($value_arr)
+ );
+ Database::pexecute($ins_stmt, $ins_data);
+
+ $log->logAction(ADM_ACTION, LOG_WARNING, "added plan '" . $name . "'");
+ redirectTo($filename, array(
+ 'page' => $page,
+ 's' => $s
+ ));
+ } else {
+
+ $diskspace_ul = makecheckbox('diskspace_ul', $lng['customer']['unlimited'], '-1', false, '0', true, true);
+ $traffic_ul = makecheckbox('traffic_ul', $lng['customer']['unlimited'], '-1', false, '0', true, true);
+ $subdomains_ul = makecheckbox('subdomains_ul', $lng['customer']['unlimited'], '-1', false, '0', true, true);
+ $emails_ul = makecheckbox('emails_ul', $lng['customer']['unlimited'], '-1', false, '0', true, true);
+ $email_accounts_ul = makecheckbox('email_accounts_ul', $lng['customer']['unlimited'], '-1', false, '0', true, true);
+ $email_forwarders_ul = makecheckbox('email_forwarders_ul', $lng['customer']['unlimited'], '-1', false, '0', true, true);
+ $email_quota_ul = makecheckbox('email_quota_ul', $lng['customer']['unlimited'], '-1', false, '0', true, true);
+ $ftps_ul = makecheckbox('ftps_ul', $lng['customer']['unlimited'], '-1', false, '0', true, true);
+ $tickets_ul = makecheckbox('tickets_ul', $lng['customer']['unlimited'], '-1', false, '0', true, true);
+ $mysqls_ul = makecheckbox('mysqls_ul', $lng['customer']['unlimited'], '-1', false, '0', true, true);
+
+ $phpconfigs = array();
+ $configs = Database::query("
+ SELECT c.*, fc.description as interpreter
+ FROM `" . TABLE_PANEL_PHPCONFIGS . "` c
+ LEFT JOIN `" . TABLE_PANEL_FPMDAEMONS . "` fc ON fc.id = c.fpmsettingid
+ ");
+ while ($row = $configs->fetch(PDO::FETCH_ASSOC)) {
+ if ((int) Settings::Get('phpfpm.enabled') == 1) {
+ $phpconfigs[] = array(
+ 'label' => $row['description'] . " [" . $row['interpreter'] . "]
",
+ 'value' => $row['id']
+ );
+ } else {
+ $phpconfigs[] = array(
+ 'label' => $row['description'] . "
",
+ 'value' => $row['id']
+ );
+ }
+ }
+
+ $plans_add_data = include_once dirname(__FILE__) . '/lib/formfields/admin/plans/formfield.plans_add.php';
+ $cust_add_data = include_once dirname(__FILE__) . '/lib/formfields/admin/customer/formfield.customer_add.php';
+ // unset unneeded stuff
+ unset($cust_add_data['customer_add']['sections']['section_a']);
+ unset($cust_add_data['customer_add']['sections']['section_b']);
+ unset($cust_add_data['customer_add']['sections']['section_cpre']);
+ // merge
+ $plans_add_data['plans_add']['sections'] = array_merge($plans_add_data['plans_add']['sections'], $cust_add_data['customer_add']['sections']);
+ $plans_add_form = htmlform::genHTMLForm($plans_add_data);
+
+ $title = $plans_add_data['plans_add']['title'];
+ $image = $plans_add_data['plans_add']['image'];
+
+ eval("echo \"" . getTemplate("plans/plans_add") . "\";");
+ }
+ } elseif ($action == 'edit' && $id != 0) {
+ $result_stmt = Database::prepare("
+ SELECT * FROM `" . TABLE_PANEL_PLANS . "` WHERE `id` = :id");
+ $result = Database::pexecute_first($result_stmt, array(
+ 'id' => $id
+ ));
+
+ if ($result['name'] != '') {
+
+ $result['value'] = json_decode($result['value'], true);
+ $result = htmlentities_array($result);
+
+ foreach ($result['value'] as $index => $value) {
+ $result[$index] = $value;
+ }
+ $result['allowed_phpconfigs'] = json_encode($result['allowed_phpconfigs']);
+
+ if (isset($_POST['send']) && $_POST['send'] == 'send') {
+
+ $name = validate($_POST['name'], 'name');
+ $description = validate(str_replace("\r\n", "\n", $_POST['description']), 'description', '/^[^\0]*$/');
+
+ $value_arr = array();
+
+ $value_arr['diskspace'] = intval_ressource($_POST['diskspace']);
+ if (isset($_POST['diskspace_ul'])) {
+ $value_arr['diskspace'] = - 1;
+ }
+
+ $value_arr['traffic'] = doubleval_ressource($_POST['traffic']);
+ if (isset($_POST['traffic_ul'])) {
+ $value_arr['traffic'] = - 1;
+ }
+
+ $value_arr['subdomains'] = intval_ressource($_POST['subdomains']);
+ if (isset($_POST['subdomains_ul'])) {
+ $value_arr['subdomains'] = - 1;
+ }
+
+ $value_arr['emails'] = intval_ressource($_POST['emails']);
+ if (isset($_POST['emails_ul'])) {
+ $value_arr['emails'] = - 1;
+ }
+
+ $value_arr['email_accounts'] = intval_ressource($_POST['email_accounts']);
+ if (isset($_POST['email_accounts_ul'])) {
+ $value_arr['email_accounts'] = - 1;
+ }
+
+ $value_arr['email_forwarders'] = intval_ressource($_POST['email_forwarders']);
+ if (isset($_POST['email_forwarders_ul'])) {
+ $value_arr['email_forwarders'] = - 1;
+ }
+
+ if (Settings::Get('system.mail_quota_enabled') == '1') {
+ $value_arr['email_quota'] = validate($_POST['email_quota'], 'email_quota', '/^\d+$/', 'vmailquotawrong', array(
+ '0',
+ ''
+ ));
+ if (isset($_POST['email_quota_ul'])) {
+ $value_arr['email_quota'] = - 1;
+ }
+ } else {
+ $value_arr['email_quota'] = - 1;
+ }
+
+ $value_arr['email_imap'] = 0;
+ if (isset($_POST['email_imap'])) {
+ $value_arr['email_imap'] = intval_ressource($_POST['email_imap']);
+ }
+
+ $value_arr['email_pop3'] = 0;
+ if (isset($_POST['email_pop3'])) {
+ $value_arr['email_pop3'] = intval_ressource($_POST['email_pop3']);
+ }
+
+ $value_arr['ftps'] = intval_ressource($_POST['ftps']);
+ if (isset($_POST['ftps_ul'])) {
+ $value_arr['ftps'] = - 1;
+ }
+
+ $value_arr['tickets'] = (Settings::Get('ticket.enabled') == 1 ? intval_ressource($_POST['tickets']) : 0);
+ if (isset($_POST['tickets_ul']) && Settings::Get('ticket.enabled') == '1') {
+ $value_arr['tickets'] = - 1;
+ }
+
+ $value_arr['mysqls'] = intval_ressource($_POST['mysqls']);
+ if (isset($_POST['mysqls_ul'])) {
+ $value_arr['mysqls'] = - 1;
+ }
+
+ $value_arr['phpenabled'] = 0;
+ if (isset($_POST['phpenabled'])) {
+ $value_arr['phpenabled'] = intval($_POST['phpenabled']);
+ }
+
+ $value_arr['allowed_phpconfigs'] = array();
+ if (isset($_POST['allowed_phpconfigs']) && is_array($_POST['allowed_phpconfigs'])) {
+ foreach ($_POST['allowed_phpconfigs'] as $allowed_phpconfig) {
+ $allowed_phpconfig = intval($allowed_phpconfig);
+ $value_arr['allowed_phpconfigs'][] = $allowed_phpconfig;
+ }
+ }
+
+ $value_arr['perlenabled'] = 0;
+ if (isset($_POST['perlenabled'])) {
+ $value_arr['perlenabled'] = intval($_POST['perlenabled']);
+ }
+
+ $value_arr['dnsenabled'] = 0;
+ if (isset($_POST['dnsenabled'])) {
+ $value_arr['dnsenabled'] = intval($_POST['dnsenabled']);
+ }
+
+ $ins_stmt = Database::prepare("
+ UPDATE `" . TABLE_PANEL_PLANS . "`
+ SET `name` = :name, `description` = :desc, `value` = :valuearr, `ts` = UNIX_TIMESTAMP()
+ WHERE `id` = :id
+ ");
+ $ins_data = array(
+ 'name' => $name,
+ 'desc' => $description,
+ 'valuearr' => json_encode($value_arr),
+ 'id' => $id
+ );
+ Database::pexecute($ins_stmt, $ins_data);
+
+ $log->logAction(ADM_ACTION, LOG_WARNING, "updated plan '" . $name . "'");
+ redirectTo($filename, array(
+ 'page' => $page,
+ 's' => $s
+ ));
+ } else {
+
+ $diskspace_ul = makecheckbox('diskspace_ul', $lng['customer']['unlimited'], '-1', false, $result['diskspace'], true, true);
+ if ($result['diskspace'] == '-1') {
+ $result['diskspace'] = '';
+ }
+
+ $traffic_ul = makecheckbox('traffic_ul', $lng['customer']['unlimited'], '-1', false, $result['traffic'], true, true);
+ if ($result['traffic'] == '-1') {
+ $result['traffic'] = '';
+ }
+
+ $subdomains_ul = makecheckbox('subdomains_ul', $lng['customer']['unlimited'], '-1', false, $result['subdomains'], true, true);
+ if ($result['subdomains'] == '-1') {
+ $result['subdomains'] = '';
+ }
+
+ $emails_ul = makecheckbox('emails_ul', $lng['customer']['unlimited'], '-1', false, $result['emails'], true, true);
+ if ($result['emails'] == '-1') {
+ $result['emails'] = '';
+ }
+
+ $email_accounts_ul = makecheckbox('email_accounts_ul', $lng['customer']['unlimited'], '-1', false, $result['email_accounts'], true, true);
+ if ($result['email_accounts'] == '-1') {
+ $result['email_accounts'] = '';
+ }
+
+ $email_forwarders_ul = makecheckbox('email_forwarders_ul', $lng['customer']['unlimited'], '-1', false, $result['email_forwarders'], true, true);
+ if ($result['email_forwarders'] == '-1') {
+ $result['email_forwarders'] = '';
+ }
+
+ $email_quota_ul = makecheckbox('email_quota_ul', $lng['customer']['unlimited'], '-1', false, $result['email_quota'], true, true);
+ if ($result['email_quota'] == '-1') {
+ $result['email_quota'] = '';
+ }
+
+ $ftps_ul = makecheckbox('ftps_ul', $lng['customer']['unlimited'], '-1', false, $result['ftps'], true, true);
+ if ($result['ftps'] == '-1') {
+ $result['ftps'] = '';
+ }
+
+ $tickets_ul = makecheckbox('tickets_ul', $lng['customer']['unlimited'], '-1', false, $result['tickets'], true, true);
+ if ($result['tickets'] == '-1') {
+ $result['tickets'] = '';
+ }
+
+ $mysqls_ul = makecheckbox('mysqls_ul', $lng['customer']['unlimited'], '-1', false, $result['mysqls'], true, true);
+ if ($result['mysqls'] == '-1') {
+ $result['mysqls'] = '';
+ }
+
+ $phpconfigs = array();
+ $configs = Database::query("
+ SELECT c.*, fc.description as interpreter
+ FROM `" . TABLE_PANEL_PHPCONFIGS . "` c
+ LEFT JOIN `" . TABLE_PANEL_FPMDAEMONS . "` fc ON fc.id = c.fpmsettingid
+ ");
+ while ($row = $configs->fetch(PDO::FETCH_ASSOC)) {
+ if ((int) Settings::Get('phpfpm.enabled') == 1) {
+ $phpconfigs[] = array(
+ 'label' => $row['description'] . " [" . $row['interpreter'] . "]
",
+ 'value' => $row['id']
+ );
+ } else {
+ $phpconfigs[] = array(
+ 'label' => $row['description'] . "
",
+ 'value' => $row['id']
+ );
+ }
+ }
+
+ $plans_edit_data = include_once dirname(__FILE__) . '/lib/formfields/admin/plans/formfield.plans_edit.php';
+ $cust_edit_data = include_once dirname(__FILE__) . '/lib/formfields/admin/customer/formfield.customer_edit.php';
+ // unset unneeded stuff
+ unset($cust_edit_data['customer_edit']['sections']['section_a']);
+ unset($cust_edit_data['customer_edit']['sections']['section_b']);
+ unset($cust_edit_data['customer_edit']['sections']['section_cpre']);
+ // merge
+ $plans_edit_data['plans_edit']['sections'] = array_merge($plans_edit_data['plans_edit']['sections'], $cust_edit_data['customer_edit']['sections']);
+ $plans_edit_form = htmlform::genHTMLForm($plans_edit_data);
+
+ $title = $plans_edit_data['plans_edit']['title'];
+ $image = $plans_edit_data['plans_edit']['image'];
+
+ eval("echo \"" . getTemplate("plans/plans_edit") . "\";");
+ }
+ }
+ } elseif ($action == 'jqGetPlanValues') {
+ $planid = isset($_POST['planid']) ? (int)$_POST['planid'] : 0;
+ $result_stmt = Database::prepare("
+ SELECT * FROM `" . TABLE_PANEL_PLANS . "` WHERE `id` = :id");
+ $result = Database::pexecute_first($result_stmt, array(
+ 'id' => $planid
+ ));
+ echo $result['value'];
+ exit;
+ }
+}
diff --git a/install/froxlor.sql b/install/froxlor.sql
index 567743ac..21c0a32d 100644
--- a/install/froxlor.sql
+++ b/install/froxlor.sql
@@ -687,7 +687,7 @@ opcache.interned_strings_buffer'),
('panel', 'password_special_char', '!?<>§$%+#=@'),
('panel', 'customer_hide_options', ''),
('panel', 'version', '0.9.39.2'),
- ('panel', 'db_version', '201801260');
+ ('panel', 'db_version', '201802120');
DROP TABLE IF EXISTS `panel_tasks`;
@@ -1028,3 +1028,16 @@ CREATE TABLE `domain_dns_entries` (
PRIMARY KEY (`id`)
) ENGINE=MyISAM CHARSET=utf8 COLLATE=utf8_general_ci;
+
+DROP TABLE IF EXISTS `panel_plans`;
+CREATE TABLE `panel_plans` (
+ `id` int(11) NOT NULL auto_increment,
+ `adminid` int(11) NOT NULL default '0',
+ `name` varchar(255) NOT NULL default '',
+ `description` text NOT NULL,
+ `value` longtext NOT NULL,
+ `ts` int(15) NOT NULL default '0',
+ PRIMARY KEY (id),
+ KEY adminid (adminid)
+) ENGINE=MyISAM CHARSET=utf8 COLLATE=utf8_general_ci;
+
diff --git a/install/updates/froxlor/0.9/update_0.9.inc.php b/install/updates/froxlor/0.9/update_0.9.inc.php
index e89a18fd..81cf8b8e 100644
--- a/install/updates/froxlor/0.9/update_0.9.inc.php
+++ b/install/updates/froxlor/0.9/update_0.9.inc.php
@@ -3892,3 +3892,24 @@ if (isFroxlorVersion('0.9.39.1')) {
showUpdateStep("Updating from 0.9.39.1 to 0.9.39.2", false);
updateToVersion('0.9.39.2');
}
+
+if (isDatabaseVersion('201801260')) {
+
+ showUpdateStep("Adding new plans table");
+ Database::query("DROP TABLE IF EXISTS `panel_plans`;");
+ $sql = "CREATE TABLE `panel_plans` (
+ `id` int(11) NOT NULL auto_increment,
+ `adminid` int(11) NOT NULL default '0',
+ `name` varchar(255) NOT NULL default '',
+ `description` text NOT NULL,
+ `value` longtext NOT NULL,
+ `ts` int(15) NOT NULL default '0',
+ PRIMARY KEY (id),
+ KEY adminid (adminid)
+ ) ENGINE=MyISAM CHARSET=utf8 COLLATE=utf8_general_ci;";
+ Database::query($sql);
+ lastStepStatus(0);
+
+ updateToDbVersion('201802120');
+}
+
diff --git a/lib/formfields/admin/customer/formfield.customer_add.php b/lib/formfields/admin/customer/formfield.customer_add.php
index 9d3d26ef..c123f161 100644
--- a/lib/formfields/admin/customer/formfield.customer_add.php
+++ b/lib/formfields/admin/customer/formfield.customer_add.php
@@ -158,6 +158,18 @@ return array(
)
)
),
+ 'section_cpre' => array(
+ 'visible' => !empty($hosting_plans),
+ 'title' => $lng['admin']['plans']['use_plan'],
+ 'image' => 'icons/user_add.png',
+ 'fields' => array(
+ 'use_plan' => array(
+ 'label' => $lng['admin']['plans']['use_plan'],
+ 'type' => 'select',
+ 'select_var' => $hosting_plans
+ )
+ )
+ ),
'section_c' => array(
'title' => $lng['admin']['servicedata'],
'image' => 'icons/user_add.png',
diff --git a/lib/formfields/admin/customer/formfield.customer_edit.php b/lib/formfields/admin/customer/formfield.customer_edit.php
index c5f74d74..70654183 100644
--- a/lib/formfields/admin/customer/formfield.customer_edit.php
+++ b/lib/formfields/admin/customer/formfield.customer_edit.php
@@ -150,6 +150,18 @@ return array(
)
)
),
+ 'section_cpre' => array(
+ 'visible' => !empty($hosting_plans),
+ 'title' => $lng['admin']['plans']['use_plan'],
+ 'image' => 'icons/user_add.png',
+ 'fields' => array(
+ 'use_plan' => array(
+ 'label' => $lng['admin']['plans']['use_plan'],
+ 'type' => 'select',
+ 'select_var' => $hosting_plans
+ )
+ )
+ ),
'section_c' => array(
'title' => $lng['admin']['servicedata'],
'image' => 'icons/user_edit.png',
diff --git a/lib/formfields/admin/plans/formfield.plans_add.php b/lib/formfields/admin/plans/formfield.plans_add.php
new file mode 100644
index 00000000..dcb0d1c7
--- /dev/null
+++ b/lib/formfields/admin/plans/formfield.plans_add.php
@@ -0,0 +1,41 @@
+ (2010-)
+ * @license GPLv2 http://files.froxlor.org/misc/COPYING.txt
+ * @package Formfields
+ *
+ */
+
+return array(
+ 'plans_add' => array(
+ 'title' => $lng['admin']['plans']['add'],
+ 'image' => 'icons/templates_add_big.png',
+ 'sections' => array(
+ 'section_a' => array(
+ 'title' => $lng['admin']['plans']['plan_details'],
+ 'image' => 'icons/templates_add_big.png',
+ 'fields' => array(
+ 'name' => array(
+ 'label' => $lng['admin']['plans']['name'],
+ 'type' => 'text'
+ ),
+ 'description' => array(
+ 'label' => $lng['admin']['plans']['description'],
+ 'type' => 'textarea',
+ 'cols' => 60,
+ 'rows' => 12
+ )
+ )
+ )
+ )
+ )
+);
diff --git a/lib/formfields/admin/plans/formfield.plans_edit.php b/lib/formfields/admin/plans/formfield.plans_edit.php
new file mode 100644
index 00000000..551977d4
--- /dev/null
+++ b/lib/formfields/admin/plans/formfield.plans_edit.php
@@ -0,0 +1,43 @@
+ (2010-)
+ * @license GPLv2 http://files.froxlor.org/misc/COPYING.txt
+ * @package Formfields
+ *
+ */
+
+return array(
+ 'plans_edit' => array(
+ 'title' => $lng['admin']['plans']['edit'],
+ 'image' => 'icons/templates_edit_big.png',
+ 'sections' => array(
+ 'section_a' => array(
+ 'title' => $lng['admin']['plans']['plan_details'],
+ 'image' => 'icons/templates_edit_big.png',
+ 'fields' => array(
+ 'name' => array(
+ 'label' => $lng['admin']['plans']['name'],
+ 'type' => 'text',
+ 'value' => $result['name']
+ ),
+ 'description' => array(
+ 'label' => $lng['admin']['plans']['description'],
+ 'type' => 'textarea',
+ 'cols' => 60,
+ 'rows' => 12,
+ 'value' => $result['description']
+ )
+ )
+ )
+ )
+ )
+);
diff --git a/lib/navigation/00.froxlor.main.php b/lib/navigation/00.froxlor.main.php
index fd077c3c..a02a3a07 100644
--- a/lib/navigation/00.froxlor.main.php
+++ b/lib/navigation/00.froxlor.main.php
@@ -214,6 +214,11 @@ return array(
'label' => $lng['admin']['ipsandports']['ipsandports'],
'required_resources' => 'change_serversettings'
),
+ array(
+ 'url' => 'admin_plans.php?page=overview',
+ 'label' => $lng['admin']['plans']['plans'],
+ 'required_resources' => 'customers'
+ ),
array(
'url' => 'admin_settings.php?page=updatecounters',
'label' => $lng['admin']['updatecounters'],
diff --git a/lib/tables.inc.php b/lib/tables.inc.php
index c9f71112..207612f0 100644
--- a/lib/tables.inc.php
+++ b/lib/tables.inc.php
@@ -52,5 +52,6 @@ define('TABLE_PANEL_DOMAIN_SSL_SETTINGS', 'domain_ssl_settings');
define('TABLE_DOMAINTOIP', 'panel_domaintoip');
define('TABLE_DOMAIN_DNS', 'domain_dns_entries');
define('TABLE_PANEL_FPMDAEMONS', 'panel_fpmdaemons');
+define('TABLE_PANEL_PLANS', 'panel_plans');
require dirname(__FILE__).'/version.inc.php';
diff --git a/lib/version.inc.php b/lib/version.inc.php
index f2d10dde..329a4c90 100644
--- a/lib/version.inc.php
+++ b/lib/version.inc.php
@@ -19,7 +19,7 @@
$version = '0.9.39.2';
// Database version (YYYYMMDDC where C is a daily counter)
-$dbversion = '201801260';
+$dbversion = '201802120';
// Distribution branding-tag (used for Debian etc.)
$branding = '';
diff --git a/lng/english.lng.php b/lng/english.lng.php
index 3123a1db..df6ce8ce 100644
--- a/lng/english.lng.php
+++ b/lng/english.lng.php
@@ -2104,3 +2104,13 @@ $lng['serversettings']['phpfpm_settings']['envpath'] = 'Paths to add to the PATH
$lng['admin']['configfiles']['importexport'] = 'Import/Export';
$lng['success']['settingsimported'] = 'Settings imported successfully';
$lng['error']['jsonextensionnotfound'] = 'This feature requires the php json-extension.';
+
+// added in froxlor 0.9.39
+$lng['admin']['plans']['name'] = 'Plan name';
+$lng['admin']['plans']['description'] = 'Description';
+$lng['admin']['plans']['last_update'] = 'Last updated';
+$lng['admin']['plans']['plans'] = 'Hosting plans';
+$lng['admin']['plans']['plan_details'] = 'Plan details';
+$lng['admin']['plans']['add'] = 'Add new plan';
+$lng['admin']['plans']['edit'] = 'Edit plan';
+$lng['admin']['plans']['use_plan'] = 'Apply plan';
diff --git a/lng/german.lng.php b/lng/german.lng.php
index e5257bcd..90592c13 100644
--- a/lng/german.lng.php
+++ b/lng/german.lng.php
@@ -1754,3 +1754,13 @@ $lng['phpfpm']['ini_admin_values'] = 'Mögliche php_admin_value
$lng['serversettings']['phpfpm_settings']['envpath'] = 'Pfade für die PATH Umgebungsvariable. Leerlassen, um keine PATH Umgebungsvariable zu setzen.';
$lng['success']['settingsimported'] = 'Einstellungnen erfolgreich importiert';
$lng['error']['jsonextensionnotfound'] = 'Diese Funktion benötigt die PHP json-Erweiterung.';
+
+// added in froxlor 0.9.39
+$lng['admin']['plans']['name'] = 'Plan Name';
+$lng['admin']['plans']['description'] = 'Beschreibung';
+$lng['admin']['plans']['last_update'] = 'Zuletzt aktualisiert';
+$lng['admin']['plans']['plans'] = 'Hosting Pläne';
+$lng['admin']['plans']['plan_details'] = 'Plan Details';
+$lng['admin']['plans']['add'] = 'Neuen Plan anlegen';
+$lng['admin']['plans']['edit'] = 'Plan editieren';
+$lng['admin']['plans']['use_plan'] = 'Plan übernehmen';
diff --git a/templates/Sparkle/admin/customers/customers_add.tpl b/templates/Sparkle/admin/customers/customers_add.tpl
index ffabf7d9..472c6b54 100644
--- a/templates/Sparkle/admin/customers/customers_add.tpl
+++ b/templates/Sparkle/admin/customers/customers_add.tpl
@@ -6,6 +6,7 @@ $header
{$title}
+
diff --git a/templates/Sparkle/admin/customers/customers_edit.tpl b/templates/Sparkle/admin/customers/customers_edit.tpl
index f9d751ec..5d4d1c34 100644
--- a/templates/Sparkle/admin/customers/customers_edit.tpl
+++ b/templates/Sparkle/admin/customers/customers_edit.tpl
@@ -6,6 +6,7 @@ $header
{$title}
+
diff --git a/templates/Sparkle/admin/plans/plans.tpl b/templates/Sparkle/admin/plans/plans.tpl
new file mode 100644
index 00000000..963c1dbf
--- /dev/null
+++ b/templates/Sparkle/admin/plans/plans.tpl
@@ -0,0 +1,59 @@
+$header
+
+
+
+
+ {$lng['admin']['plans']['plans']}
+
+
+
+
+
+
+$footer
diff --git a/templates/Sparkle/admin/plans/plans_add.tpl b/templates/Sparkle/admin/plans/plans_add.tpl
new file mode 100644
index 00000000..ac434237
--- /dev/null
+++ b/templates/Sparkle/admin/plans/plans_add.tpl
@@ -0,0 +1,26 @@
+$header
+
+
+
+
+ {$title}
+
+
+
+
+
+
+$footer
diff --git a/templates/Sparkle/admin/plans/plans_edit.tpl b/templates/Sparkle/admin/plans/plans_edit.tpl
new file mode 100644
index 00000000..a812f803
--- /dev/null
+++ b/templates/Sparkle/admin/plans/plans_edit.tpl
@@ -0,0 +1,27 @@
+$header
+
+
+
+
+ {$title}
+
+
+
+
+
+
+$footer
diff --git a/templates/Sparkle/admin/plans/plans_plan.tpl b/templates/Sparkle/admin/plans/plans_plan.tpl
new file mode 100644
index 00000000..a49c703c
--- /dev/null
+++ b/templates/Sparkle/admin/plans/plans_plan.tpl
@@ -0,0 +1,14 @@
+
+ | {$row['name']} |
+ {$row['description']} |
+ {$row['adminname']} |
+ {$row['ts_format']} |
+
+
+
+
+
+
+
+ |
+
diff --git a/templates/Sparkle/assets/js/customers.js b/templates/Sparkle/assets/js/customers.js
new file mode 100644
index 00000000..04c7ee89
--- /dev/null
+++ b/templates/Sparkle/assets/js/customers.js
@@ -0,0 +1,74 @@
+$(document).ready(function() {
+
+ var getUrlParameter = function getUrlParameter(sParam) {
+ var sPageURL = decodeURIComponent(window.location.search.substring(1)),
+ sURLVariables = sPageURL.split('&'),
+ sParameterName,
+ i;
+
+ for (i = 0; i < sURLVariables.length; i++) {
+ sParameterName = sURLVariables[i].split('=');
+
+ if (sParameterName[0] === sParam) {
+ return sParameterName[1] === undefined ? true : sParameterName[1];
+ }
+ }
+ };
+
+ /**
+ * disable unusable php-configuration by customer settings
+ */
+ $('#use_plan').change(function() {
+ var pid = $(this).val();
+ if (pid > 0) {
+ var sid = getUrlParameter('s');
+ $.ajax({
+ url: "admin_plans.php?s="+sid+"&page=overview&action=jqGetPlanValues",
+ type: "POST",
+ data: {
+ planid: pid
+ },
+ dataType: "json",
+ success: function(json) {
+ for (i in json) {
+ if (i == 'email_imap' || i == 'email_pop3' || i == 'perlenabled' || i == 'phpenabled' || i == 'dnsenabled') {
+ /** handle checkboxes **/
+ if (json[i] == 1) {
+ $("input[name='"+i+"']").attr('checked', 'checked');
+ } else {
+ $("input[name='"+i+"']").removeAttr('checked');
+ }
+ } else if (i == 'allowed_phpconfigs') {
+ /** handle array of values **/
+ $("input[name='allowed_phpconfigs[]']").each(function(index) {
+ $(this).removeAttr('checked');
+ for (j in json[i]) {
+ if ($(this).val() == json[i][j]) {
+ $(this).attr('checked', 'checked');
+ }
+ }
+ });
+ } else if (json[i] == -1) {
+ /** handle unlimited checkboxes **/
+ $("input[name='" + i + "_ul']").attr('checked', 'checked');
+ $("input[name='"+i+"']").prop({
+ readonly: true
+ });
+ } else {
+ /** handle normal value **/
+ $("input[name='"+i+"']").val(json[i]);
+ $("input[name='"+i+"']").prop({
+ readonly: false
+ });
+ $("input[name='" + i + "_ul']").removeAttr('checked');
+ }
+ }
+ },
+ error: function(a, b) {
+ console.log(a, b);
+ }
+ });
+ }
+ });
+
+});