diff --git a/interface/lib/classes/functions.inc.php b/interface/lib/classes/functions.inc.php index 83ec411d9ace94c3d859e938a05a653cb13d1105..e6f81c6fa6bf4fc4054d91a244f4d7dd21128d69 100644 --- a/interface/lib/classes/functions.inc.php +++ b/interface/lib/classes/functions.inc.php @@ -182,11 +182,25 @@ class functions { } } + + /** + * Function to suggest IP addresses in selectbox with hints, limited to the client logged in. + * + * @access public + * @param string $type (default: 'IPv4') + * @return void + */ public function suggest_ips($type = 'IPv4'){ global $app; + $use_suggestions = $app->getconf->get_global_config('misc')['use_ipsuggestions'] == 'y' ? true : false;; + if(!$use_suggestions) {return array('cheader' => array(), 'cdata' => array());} + + $suggestions_max = $app->getconf->get_global_config('misc')['ipsuggestions_max']; + $groupid = intval($_SESSION["s"]["user"]["default_group"]); + if($type == 'IPv4'){ -// $regex = "/^[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}$/"; + // $regex = "/^[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}$/"; $regex = "/^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/"; } else { // IPv6 @@ -198,58 +212,75 @@ class functions { $servers = $app->db->queryAllRecords("SELECT * FROM server"); if(is_array($servers) && !empty($servers)){ foreach($servers as $server){ - $server_by_id[$server['server_id']] = $server['server_name']; + $server_by_id[$server['server_id']] = 'server: ' . $server['server_name'] . ''; } } + $localips = array(); $ips = array(); $results = $app->db->queryAllRecords("SELECT ip_address AS ip, server_id FROM server_ip WHERE ip_type = ?", $type); if(!empty($results) && is_array($results)){ foreach($results as $result){ if(preg_match($regex, $result['ip'])){ - $ips[] = $result['ip']; + $localips[] = $result['ip']; $server_by_ip[$result['ip']] = $server_by_id[$result['server_id']]; } } } + $results = $app->db->queryAllRecords("SELECT ip_address AS ip FROM openvz_ip"); if(!empty($results) && is_array($results)){ foreach($results as $result){ if(preg_match($regex, $result['ip'])) $ips[] = $result['ip']; } } - $results = $app->db->queryAllRecords("SELECT data AS ip FROM dns_rr WHERE type = 'A' OR type = 'AAAA'"); + $results = $groupid != 1 ? $app->db->queryAllRecords("SELECT rr.data AS server_ip, rr.name as server_name, soa.origin as domain FROM dns_rr as rr, dns_soa as soa WHERE (rr.type = 'A' OR rr.type = 'AAAA') AND soa.id = rr.zone AND rr.sys_groupid = ?", $groupid) : $results = $app->db->queryAllRecords("SELECT rr.data AS server_ip, rr.name as server_name, soa.origin as domain FROM dns_rr as rr, dns_soa as soa WHERE (rr.type = 'A' OR rr.type = 'AAAA') AND soa.id = rr.zone"); + if(!empty($results) && is_array($results)){ foreach($results as $result){ - if(preg_match($regex, $result['ip'])) $ips[] = $result['ip']; + $result['server_name'] = substr($result['server_name'], -1) == '.' ? $result['server_name'] : $result['server_name'] . '.' . $result['domain']; + if (!array_key_exists($result['server_ip'],$server_by_ip)) { + $server_by_ip[$result['server_ip']] = 'dns: ' . $result['server_name']; + if(preg_match($regex, $result['server_ip'])) $ips[] = $result['server_ip']; + } } } - $results = $app->db->queryAllRecords("SELECT ns AS ip FROM dns_slave"); + + $results = $groupid != 1 ? $app->db->queryAllRecords("SELECT ns AS ip FROM dns_slave WHERE sys_groupid = ?", $groupid) : $results = $app->db->queryAllRecords("SELECT ns AS ip FROM dns_slave"); + if(!empty($results) && is_array($results)){ foreach($results as $result){ - if(preg_match($regex, $result['ip'])) $ips[] = $result['ip']; + if (!array_key_exists($result['ip'],$server_by_ip)) { + if(preg_match($regex, $result['ip'])) $ips[] = $result['ip']; + } } } - - $results = $app->db->queryAllRecords("SELECT remote_ips FROM web_database WHERE remote_ips != ''"); + + $results = $groupid != 1 ? $app->db->queryAllRecords("SELECT database_name as name,remote_ips as ip FROM web_database WHERE remote_ips != '' AND sys_groupid = ?", $groupid) : $results = $app->db->queryAllRecords("SELECT database_name as name,remote_ips as ip FROM web_database WHERE remote_ips != ''"); + if(!empty($results) && is_array($results)){ foreach($results as $result){ - $tmp_ips = explode(',', $result['remote_ips']); + $tmp_ips = explode(',', $result['ip']); foreach($tmp_ips as $tmp_ip){ $tmp_ip = trim($tmp_ip); - if(preg_match($regex, $tmp_ip)) $ips[] = $tmp_ip; + if (!array_key_exists($tmp_ip,$server_by_ip)) { + $server_by_ip[$tmp_ip] = 'database: ' . $result['name']; + if(preg_match($regex, $tmp_ip)) $ips[] = $tmp_ip; + } } } } $ips = array_unique($ips); + sort($localips, SORT_NUMERIC); sort($ips, SORT_NUMERIC); - + $ips = array_merge($localips,$ips); + $ips = array_slice($ips, 0, $suggestions_max); $result_array = array('cheader' => array(), 'cdata' => array()); if(!empty($ips)){ $result_array['cheader'] = array('title' => 'IPs', 'total' => count($ips), - 'limit' => count($ips) + 'limit' => count($ips), ); foreach($ips as $ip){ @@ -282,7 +313,7 @@ class functions { */ public function formatBytes($size, $precision = 2) { $suffixes=array('', ' kB', ' MB', ' GB', ' TB'); - if($size != 0 && !is_nan($size)) { + if($size != 0 && !is_nan($size)) { $base=log($size)/log(1024); $tmpoutput = round(pow(1024, $base-floor($base)), $precision).$suffixes[floor($base)]; } else { @@ -371,42 +402,42 @@ class functions { public function is_allowed_user($username, $restrict_names = false) { global $app; - + $name_blacklist = array('root','ispconfig','vmail','getmail'); if(in_array($username,$name_blacklist)) return false; - + if(preg_match('/^[a-zA-Z0-9\.\-_]{1,32}$/', $username) == false) return false; - + if($restrict_names == true && preg_match('/^web\d+$/', $username) == false) return false; - + return true; } - + public function is_allowed_group($groupname, $restrict_names = false) { global $app; - + $name_blacklist = array('root','ispconfig','vmail','getmail'); if(in_array($groupname,$name_blacklist)) return false; - + if(preg_match('/^[a-zA-Z0-9\.\-_]{1,32}$/', $groupname) == false) return false; - + if($restrict_names == true && preg_match('/^client\d+$/', $groupname) == false) return false; - + return true; } - + public function getimagesizefromstring($string){ if (!function_exists('getimagesizefromstring')) { $uri = 'data://application/octet-stream;base64,' . base64_encode($string); return getimagesize($uri); } else { return getimagesizefromstring($string); - } + } } - + public function password($minLength = 10, $special = false){ global $app; - + $iteration = 0; $password = ""; $maxLength = $minLength + 5; @@ -431,7 +462,7 @@ class functions { public function getRandomInt($min, $max){ return floor((mt_rand() / mt_getrandmax()) * ($max - $min + 1)) + $min; } - + public function generate_customer_no(){ global $app; // generate customer no. @@ -439,13 +470,13 @@ class functions { while($app->db->queryOneRecord("SELECT client_id FROM client WHERE customer_no = ?", $customer_no)) { $customer_no = mt_rand(100000, 999999); } - + return $customer_no; } - + public function generate_ssh_key($client_id, $username = ''){ global $app; - + // generate the SSH key pair for the client $id_rsa_file = '/tmp/'.uniqid('',true); $id_rsa_pub_file = $id_rsa_file.'.pub'; @@ -459,7 +490,7 @@ class functions { $app->log("Failed to create SSH keypair for ".$username, LOGLEVEL_WARN); } } - + public function htmlentities($value) { global $conf; @@ -475,7 +506,7 @@ class functions { } else { $out = htmlentities($value, ENT_QUOTES, $conf["html_content_encoding"]); } - + return $out; } } diff --git a/interface/web/admin/form/system_config.tform.php b/interface/web/admin/form/system_config.tform.php index c3c4c969dfa38f3cf9eac4b34872991a27b2d460..f1658a00b29f0991aa1820f3f87e775de9ba29e7 100644 --- a/interface/web/admin/form/system_config.tform.php +++ b/interface/web/admin/form/system_config.tform.php @@ -602,6 +602,20 @@ $form["tabs"]['misc'] = array ( 'default' => 'y', 'value' => array(0 => 'n', 1 => 'y') ), + 'use_ipsuggestions' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n', 1 => 'y') + ), + 'ipsuggestions_max' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), 'maintenance_mode' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', diff --git a/interface/web/admin/lib/lang/en_system_config.lng b/interface/web/admin/lib/lang/en_system_config.lng index 945d60372f6cd76d85c95a60de3ce15ff5b084e5..ca8a3ebe8fb20c8b4c385cf8bb1c780436195ebe 100644 --- a/interface/web/admin/lib/lang/en_system_config.lng +++ b/interface/web/admin/lib/lang/en_system_config.lng @@ -95,4 +95,7 @@ $wb['ca_iodef_txt'] = 'iodef'; $wb['active_txt'] = 'Aktive'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; +$wb['use_ipsuggestions_txt'] = 'Enable IP suggestions dropdown'; +$wb['use_ipsuggestions_descr_txt'] = 'Shows a dropdown list of IP addresses below a field where an IP address is needed for both IPv4 and IPv6.'; +$wb['ipsuggestions_max_txt'] = 'Max IP suggestions'; ?> diff --git a/interface/web/admin/lib/lang/nl_system_config.lng b/interface/web/admin/lib/lang/nl_system_config.lng index 7b688a2bb8cc92bb7fd0de23cd940f225c59ccae..e5714955476768692c270f581a502e3d58498ab6 100644 --- a/interface/web/admin/lib/lang/nl_system_config.lng +++ b/interface/web/admin/lib/lang/nl_system_config.lng @@ -68,7 +68,7 @@ $wb['customer_no_template_error_regex_txt'] = 'The customer No. template contain $wb['customer_no_start_txt'] = 'Customer No. start value'; $wb['customer_no_counter_txt'] = 'Customer No. counter'; $wb['session_timeout_txt'] = 'Session timeout (minutes)'; -$wb['session_allow_endless_txt'] = 'Enable \\"stay logged in\\"'; +$wb['session_allow_endless_txt'] = 'Enable "stay logged in"'; $wb['No'] = 'No'; $wb['min_password_length_txt'] = 'Minimum password length'; $wb['min_password_strength_txt'] = 'Minimum password strength'; @@ -91,4 +91,7 @@ $wb['active_txt'] = 'Aktive'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; $wb['asp_new_package_disabled_txt'] = 'Disable new aps packages'; +$wb['use_ipsuggestions_txt'] = 'IP adres suggesties inschakelen'; +$wb['use_ipsuggestions_descr_txt'] = 'Toont een dropdown box met een lijst van IP adressen voor IPv4 en IPv6 adressen.'; +$wb['ipsuggestions_max_txt'] = 'Max aantal IP suggesties'; ?> diff --git a/interface/web/admin/templates/system_config_misc_edit.htm b/interface/web/admin/templates/system_config_misc_edit.htm index 45bdfcd2758b8a757f12b589e7ded692b1f284a5..5d35546a3ea350296e9c50202dedeaf04f228afc 100644 --- a/interface/web/admin/templates/system_config_misc_edit.htm +++ b/interface/web/admin/templates/system_config_misc_edit.htm @@ -81,6 +81,15 @@
+ +
+ {tmpl_var name='use_ipsuggestions'}
{tmpl_var name='use_ipsuggestions_descr_txt'} +
+
+
+ +
+
diff --git a/interface/web/themes/default/assets/images/logo.png b/interface/web/themes/default/assets/images/logo.png index dd522cd3c39d38ee499429b2b06394bc38b6c23c..6f71dedb3ba9f09a7379c0cc8704cdb21eb53b11 100644 Binary files a/interface/web/themes/default/assets/images/logo.png and b/interface/web/themes/default/assets/images/logo.png differ diff --git a/interface/web/themes/default/assets/images/logo@2x.png b/interface/web/themes/default/assets/images/logo@2x.png index 10c0877d3c3c3bf2d7e8df12995ebb3c123255d0..b7c5e096772438f5f0196c886bab45427964db25 100644 Binary files a/interface/web/themes/default/assets/images/logo@2x.png and b/interface/web/themes/default/assets/images/logo@2x.png differ diff --git a/interface/web/themes/default/assets/stylesheets/fonts.css b/interface/web/themes/default/assets/stylesheets/fonts.css index 4218564963d12b3766af1e0c8008a68c513aeea6..e7ca3f90ed16290e3d2064b8c696a3b1d2202205 100644 --- a/interface/web/themes/default/assets/stylesheets/fonts.css +++ b/interface/web/themes/default/assets/stylesheets/fonts.css @@ -91,4 +91,7 @@ } .icon-delete:before { content: "\e613"; -} \ No newline at end of file +} +.icon-wizard:before { + content: "\e60c"; +} diff --git a/interface/web/themes/default/assets/stylesheets/fonts.min.css b/interface/web/themes/default/assets/stylesheets/fonts.min.css index 98cf94f0e70bae2cccdcc0878f689f8204c99f38..e3b8a997363f05892fae49430030a873a357fbb7 100644 --- a/interface/web/themes/default/assets/stylesheets/fonts.min.css +++ b/interface/web/themes/default/assets/stylesheets/fonts.min.css @@ -1 +1 @@ -@font-face{font-family:'ispconfig';src:url('../fonts/ispconfig.eot?-drlkxz');src:url('../fonts/ispconfig.eot?#iefix-drlkxz') format('embedded-opentype'),url('../fonts/ispconfig.woff?-drlkxz') format('woff'),url('../fonts/ispconfig.ttf?-drlkxz') format('truetype'),url('../fonts/ispconfig.svg?-drlkxz#ispconfig') format('svg');font-weight:normal;font-style:normal}.icon{font-family:'ispconfig';speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon:before{vertical-align:middle}.icon-calendar:before{content:"\e60e"}.icon-billing:before{content:"\e60d"}.icon-lens:before{content:"\e60b"}.icon-bulb:before{content:"\e60c"}.icon-vm2:before{content:"\e600"}.icon-vm:before{content:"\e601"}.icon-tools:before{content:"\e602"}.icon-admin:before{content:"\e603"}.icon-sites:before{content:"\e604"}.icon-monitor:before{content:"\e605"}.icon-dashboard:before{content:"\e606"}.icon-help:before{content:"\e607"}.icon-mail:before,.icon-mailuser:before{content:"\e608"}.icon-dns:before{content:"\e609"}.icon-client:before{content:"\e60a"}.icon-edit:before{content:"\e615"}.icon-filter:before{content:"\e614"}.icon-link:before{content:"\e60f"}.icon-action:before{content:"\e610"}.icon-dbadmin:before{content:"\e612"}.icon-loginas:before{content:"\e611"}.icon-delete:before{content:"\e613"} \ No newline at end of file +@font-face{font-family:'ispconfig';src:url('../fonts/ispconfig.eot?-drlkxz');src:url('../fonts/ispconfig.eot?#iefix-drlkxz') format('embedded-opentype'), url('../fonts/ispconfig.woff?-drlkxz') format('woff'), url('../fonts/ispconfig.ttf?-drlkxz') format('truetype'), url('../fonts/ispconfig.svg?-drlkxz#ispconfig') format('svg');font-weight:normal;font-style:normal}.icon{font-family:'ispconfig';speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon:before{vertical-align:middle}.icon-calendar:before{content:"\e60e"}.icon-billing:before{content:"\e60d"}.icon-lens:before{content:"\e60b"}.icon-bulb:before{content:"\e60c"}.icon-vm2:before{content:"\e600"}.icon-vm:before{content:"\e601"}.icon-tools:before{content:"\e602"}.icon-admin:before{content:"\e603"}.icon-sites:before{content:"\e604"}.icon-monitor:before{content:"\e605"}.icon-dashboard:before{content:"\e606"}.icon-help:before{content:"\e607"}.icon-mail:before,.icon-mailuser:before{content:"\e608"}.icon-dns:before{content:"\e609"}.icon-client:before{content:"\e60a"}.icon-edit:before{content:"\e615"}.icon-filter:before{content:"\e614"}.icon-link:before{content:"\e60f"}.icon-action:before{content:"\e610"}.icon-dbadmin:before{content:"\e612"}.icon-loginas:before{content:"\e611"}.icon-delete:before{content:"\e613"}.icon-wizard:before{content:"\e60c"} diff --git a/interface/web/themes/default/assets/stylesheets/ispconfig.css b/interface/web/themes/default/assets/stylesheets/ispconfig.css index e6ff41f2abb077bb03491144a58f4b8b31ae9f15..115802cceab44f374f60b073719dc40d4b00caf0 100644 --- a/interface/web/themes/default/assets/stylesheets/ispconfig.css +++ b/interface/web/themes/default/assets/stylesheets/ispconfig.css @@ -66,8 +66,8 @@ body { #logo { float: left; - width: 200px; - height: 65px; + width: 75px; + height: 40px; margin-top:10px; /*background: url("../images/logo.png") no-repeat;*/ } #logo a { @@ -693,10 +693,19 @@ span.flag-za {background-position:0 -5391px} span.flag-zm {background-position:0 -5413px} span.flag-zw {background-position:0 -5435px} +#logo { + background-image: url("../images/logo.png"); + background-size: 75px auto; + background-repeat: no-repeat; + } + @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { #logo { background-image: url("../images/logo@2x.png"); - background-size: 200px 65px; } } + background-size: 75px auto; + background-repeat: no-repeat; + } +} .input-group-field { display: table-cell; @@ -774,7 +783,9 @@ input[type="password"].form-control[readonly] { .systemmonitor-state.state-info .statusMsg { display: none; } - +#footer { + display: none; +} span.notification_text { display: block; margin-left: auto; @@ -784,11 +795,9 @@ span.notification_text { font-family: inherit; color: white; } - span.company_name { font-weight: bold; } - span.tmp_account_name { font-size: 0.9em; } @@ -800,3 +809,6 @@ span.pbvaluemargin { margin-left: 5px; } +.ip_suggestion_server { + font-weight: bold; +} \ No newline at end of file diff --git a/interface/web/themes/default/templates/main.tpl.htm b/interface/web/themes/default/templates/main.tpl.htm index d279016f0d529cfc7c9e33c7657154658ae82b0d..4e8e60c949eb08baa3ab7e934d293cf613303908 100644 --- a/interface/web/themes/default/templates/main.tpl.htm +++ b/interface/web/themes/default/templates/main.tpl.htm @@ -35,7 +35,7 @@ - +