Marius Cramer
2014-02-17 ebbe6374fc9c308daf729d2ad1b2f8007ed771ce
Merge remote-tracking branch 'origin/stable-3.0.5'

Conflicts:
install/tpl/debian_postfix.conf.master
install/tpl/fedora_postfix.conf.master
install/tpl/gentoo_postfix.conf.master
install/tpl/opensuse_postfix.conf.master
install/uninstall.php
interface/lib/classes/remoting_lib.inc.php
interface/lib/classes/tform.inc.php
interface/web/mail/lib/lang/de_mail_user.lng
interface/web/mailuser/lib/lang/de_mail_user_cc.lng
interface/web/sites/aps_install_package.php
interface/web/sites/lib/lang/en_web_vhost_subdomain.lng
interface/web/sites/web_vhost_domain_edit.php
interface/web/sites/web_vhost_subdomain_edit.php
server/cron_daily.php
server/lib/classes/monitor_tools.inc.php
1 files added
93 files modified
1389 ■■■■■ changed files
install/dist/lib/debian60.lib.php 4 ●●●● patch | view | raw | blame | history
install/dist/lib/fedora.lib.php 3 ●●●●● patch | view | raw | blame | history
install/dist/lib/opensuse.lib.php 19 ●●●● patch | view | raw | blame | history
install/lib/install.lib.php 31 ●●●●● patch | view | raw | blame | history
install/lib/installer_base.lib.php 22 ●●●●● patch | view | raw | blame | history
install/sql/incremental/upd_0068.sql 4 ●●●● patch | view | raw | blame | history
install/sql/ispconfig3.sql 13 ●●●● patch | view | raw | blame | history
install/tpl/debian_dovecot2.conf.master 1 ●●●● patch | view | raw | blame | history
install/tpl/debian_postfix.conf.master 2 ●●● patch | view | raw | blame | history
install/tpl/fedora_postfix.conf.master 2 ●●● patch | view | raw | blame | history
install/tpl/gentoo_postfix.conf.master 2 ●●● patch | view | raw | blame | history
install/tpl/jk_init.ini.master 4 ●●●● patch | view | raw | blame | history
install/tpl/mysql-virtual_forwardings.cf.master 3 ●●●● patch | view | raw | blame | history
install/tpl/opensuse_postfix.conf.master 2 ●●● patch | view | raw | blame | history
install/tpl/opensuse_pureftpd_conf.master 3 ●●●● patch | view | raw | blame | history
install/uninstall.php 10 ●●●●● patch | view | raw | blame | history
interface/lib/classes/aps_crawler.inc.php 39 ●●●● patch | view | raw | blame | history
interface/lib/classes/db_mysql.inc.php 3 ●●●●● patch | view | raw | blame | history
interface/lib/classes/functions.inc.php 5 ●●●● patch | view | raw | blame | history
interface/lib/classes/remoting.inc.php 7 ●●●● patch | view | raw | blame | history
interface/lib/classes/tform_actions.inc.php 1 ●●●● patch | view | raw | blame | history
interface/lib/classes/tform_base.inc.php 2 ●●● patch | view | raw | blame | history
interface/lib/classes/tform_tpl_generator.inc.php 4 ●●●● patch | view | raw | blame | history
interface/lib/classes/tools_monitor.inc.php 4 ●●● patch | view | raw | blame | history
interface/lib/classes/validate_cron.inc.php 2 ●●● patch | view | raw | blame | history
interface/lib/plugins/sites_web_vhost_domain_plugin.inc.php 4 ●●●● patch | view | raw | blame | history
interface/web/admin/form/system_config.tform.php 2 ●●● patch | view | raw | blame | history
interface/web/admin/templates/remote_user_edit.htm 4 ●●●● patch | view | raw | blame | history
interface/web/admin/templates/users_user_edit.htm 4 ●●●● patch | view | raw | blame | history
interface/web/client/templates/client_edit_address.htm 4 ●●●● patch | view | raw | blame | history
interface/web/client/templates/reseller_edit_address.htm 4 ●●●● patch | view | raw | blame | history
interface/web/dns/form/dns_a.tform.php 2 ●●● patch | view | raw | blame | history
interface/web/dns/form/dns_aaaa.tform.php 2 ●●● patch | view | raw | blame | history
interface/web/dns/form/dns_alias.tform.php 4 ●●●● patch | view | raw | blame | history
interface/web/dns/form/dns_cname.tform.php 4 ●●●● patch | view | raw | blame | history
interface/web/dns/form/dns_hinfo.tform.php 2 ●●● patch | view | raw | blame | history
interface/web/dns/form/dns_mx.tform.php 4 ●●●● patch | view | raw | blame | history
interface/web/dns/form/dns_ns.tform.php 4 ●●●● patch | view | raw | blame | history
interface/web/dns/form/dns_ptr.tform.php 4 ●●●● patch | view | raw | blame | history
interface/web/dns/form/dns_rp.tform.php 2 ●●● patch | view | raw | blame | history
interface/web/dns/form/dns_slave.tform.php 7 ●●●● patch | view | raw | blame | history
interface/web/dns/form/dns_soa.tform.php 6 ●●●● patch | view | raw | blame | history
interface/web/dns/form/dns_srv.tform.php 2 ●●● patch | view | raw | blame | history
interface/web/dns/form/dns_txt.tform.php 2 ●●● patch | view | raw | blame | history
interface/web/help/templates/faq_manage_questions_list.htm 8 ●●●● patch | view | raw | blame | history
interface/web/js/jquery.tipsy.js 864 ●●●● patch | view | raw | blame | history
interface/web/js/scrigo.js.php 2 ●●● patch | view | raw | blame | history
interface/web/login/lib/lang/en.lng 6 ●●●● patch | view | raw | blame | history
interface/web/mail/form/mail_user.tform.php 2 ●●● patch | view | raw | blame | history
interface/web/mail/lib/lang/de_mail_user.lng 4 ●●●● patch | view | raw | blame | history
interface/web/mail/lib/lang/en_mail_user.lng 3 ●●●● patch | view | raw | blame | history
interface/web/mail/templates/mail_mailinglist_edit.htm 4 ●●●● patch | view | raw | blame | history
interface/web/mail/templates/mail_user_mailbox_edit.htm 6 ●●●● patch | view | raw | blame | history
interface/web/mailuser/form/mail_user_cc.tform.php 3 ●●●● patch | view | raw | blame | history
interface/web/mailuser/lib/lang/de_mail_user_cc.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/mailuser/lib/lang/en_mail_user_cc.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/mailuser/mail_user_spamfilter_edit.php 3 ●●●● patch | view | raw | blame | history
interface/web/mailuser/templates/mail_user_cc_edit.htm 2 ●●● patch | view | raw | blame | history
interface/web/mailuser/templates/mail_user_password_edit.htm 4 ●●●● patch | view | raw | blame | history
interface/web/sites/aps_install_package.php 2 ●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/en_web_vhost_domain.lng 2 ●●● patch | view | raw | blame | history
interface/web/sites/shell_user_edit.php 1 ●●●● patch | view | raw | blame | history
interface/web/sites/templates/database_user_edit.htm 4 ●●●● patch | view | raw | blame | history
interface/web/sites/templates/ftp_user_edit.htm 4 ●●●● patch | view | raw | blame | history
interface/web/sites/templates/shell_user_edit.htm 4 ●●●● patch | view | raw | blame | history
interface/web/sites/templates/web_folder_user_edit.htm 4 ●●●● patch | view | raw | blame | history
interface/web/sites/templates/web_vhost_domain_advanced.htm 2 ●●● patch | view | raw | blame | history
interface/web/sites/templates/webdav_user_edit.htm 4 ●●●● patch | view | raw | blame | history
interface/web/sites/web_vhost_domain_edit.php 43 ●●●●● patch | view | raw | blame | history
interface/web/tools/lib/lang/de_resync.lng 1 ●●●● patch | view | raw | blame | history
interface/web/tools/templates/user_settings.htm 4 ●●●● patch | view | raw | blame | history
remoting_client/API-docs/sites_database_add.html 1 ●●●● patch | view | raw | blame | history
remoting_client/API-docs/sites_web_aliasdomain_update.html 1 ●●●● patch | view | raw | blame | history
remoting_client/API-docs/sites_web_domain_add.html 1 ●●●● patch | view | raw | blame | history
remoting_client/examples/sites_database_add.php 1 ●●●● patch | view | raw | blame | history
remoting_client/examples/sites_web_domain_add.php 3 ●●●●● patch | view | raw | blame | history
server/conf/php-fcgi-starter.master 1 ●●●● patch | view | raw | blame | history
server/conf/php_fpm_pool.conf.master 1 ●●●● patch | view | raw | blame | history
server/conf/sieve_filter.master 4 ●●● patch | view | raw | blame | history
server/conf/sieve_filter_1.2.master 4 ●●● patch | view | raw | blame | history
server/conf/vhost.conf.master 18 ●●●● patch | view | raw | blame | history
server/lib/classes/aps_installer.inc.php 4 ●●●● patch | view | raw | blame | history
server/lib/classes/cron.d/100-monitor_email_quota.inc.php 4 ●●● patch | view | raw | blame | history
server/lib/classes/cron.d/100-monitor_raid.inc.php 4 ●●● patch | view | raw | blame | history
server/lib/classes/cron.d/300-quota_notify.inc.php 8 ●●●● patch | view | raw | blame | history
server/lib/classes/cron.d/500-backup.inc.php 3 ●●●●● patch | view | raw | blame | history
server/lib/classes/system.inc.php 39 ●●●●● patch | view | raw | blame | history
server/mods-available/rescue_core_module.inc.php 11 ●●●●● patch | view | raw | blame | history
server/plugins-available/apache2_plugin.inc.php 4 ●●●● patch | view | raw | blame | history
server/plugins-available/bind_plugin.inc.php 8 ●●●● patch | view | raw | blame | history
server/plugins-available/maildeliver_plugin.inc.php 7 ●●●●● patch | view | raw | blame | history
server/plugins-available/maildrop_plugin.inc.php 6 ●●●● patch | view | raw | blame | history
server/plugins-available/nginx_plugin.inc.php 1 ●●●● patch | view | raw | blame | history
server/scripts/create_jailkit_user.sh 6 ●●●● patch | view | raw | blame | history
install/dist/lib/debian60.lib.php
@@ -91,6 +91,7 @@
            } else {
                copy('tpl/debian6_dovecot2.conf.master', $config_dir.'/'.$configfile);
            }
            replaceLine($config_dir.'/'.$configfile, 'postmaster_address = postmaster@example.com', 'postmaster_address = postmaster@'.$conf['hostname'], 1, 0);
        } else {
            if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/debian6_dovecot.conf.master')) {
                copy($conf['ispconfig_install_dir'].'/server/conf-custom/install/debian6_dovecot.conf.master', $config_dir.'/'.$configfile);
@@ -115,6 +116,9 @@
        chmod($config_dir.'/'.$configfile, 0600);
        chown($config_dir.'/'.$configfile, 'root');
        chgrp($config_dir.'/'.$configfile, 'root');
        // Dovecot shall ignore mounts in website directory
        exec("doveadm mount add '/var/www/*' ignore");
    }
install/dist/lib/fedora.lib.php
@@ -461,6 +461,9 @@
        exec("chmod 600 $config_dir/$configfile");
        exec("chown root:root $config_dir/$configfile");
        // Dovecot shall ignore mounts in website directory
        exec("doveadm mount add '/var/www/*' ignore");
    }
install/dist/lib/opensuse.lib.php
@@ -496,6 +496,9 @@
        exec("chmod 600 $config_dir/$configfile");
        exec("chown root:root $config_dir/$configfile");
        // Dovecot shall ignore mounts in website directory
        exec("doveadm mount add '/srv/www/*' ignore");
    }
@@ -554,7 +557,9 @@
        unset($content);
        // Add the clamav user to the vscan group
        exec('groupmod --add-user clamav vscan');
        //exec('groupmod --add-user clamav vscan');
        $command = 'usermod -a -G clamav vscan';
        caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
    }
@@ -1076,18 +1081,22 @@
        // and must be fixed as this will allow the apache user to read the ispconfig files.
        // Later this must run as own apache server or via suexec!
        if($conf['apache']['installed'] == true){
            $command = 'groupmod --add-user '.$conf['apache']['user'].' ispconfig';
            //$command = 'groupmod --add-user '.$conf['apache']['user'].' ispconfig';
            $command = 'usermod -a -G ispconfig '.$conf['apache']['user'];
            caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
            if(is_group('ispapps')){
                $command = 'groupmod --add-user '.$conf['apache']['user'].' ispapps';
                //$command = 'groupmod --add-user '.$conf['apache']['user'].' ispapps';
                $command = 'usermod -a -G ispapps '.$conf['apache']['user'];
                caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
            }
        }
        if($conf['nginx']['installed'] == true){
            $command = 'groupmod --add-user '.$conf['nginx']['user'].' ispconfig';
            //$command = 'groupmod --add-user '.$conf['nginx']['user'].' ispconfig';
             $command = 'usermod -a -G ispconfig '.$conf['nginx']['user'];
            caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
            if(is_group('ispapps')){
                $command = 'groupmod --add-user '.$conf['nginx']['user'].' ispapps';
                //$command = 'groupmod --add-user '.$conf['nginx']['user'].' ispapps';
                $command = 'usermod -a -G ispapps '.$conf['nginx']['user'];
                caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
            }
        }
install/lib/install.lib.php
@@ -637,6 +637,11 @@
                    $out .= $line;
                }
            }
            if (!$found) {
                if (trim($line) == $new_line) {
                    $found = 1;
                }
            }
        }
        if($found == 0) {
            //* add \n if the last line does not end with \n or \r
@@ -719,6 +724,32 @@
}
/*
* Get the port number of the ISPConfig apps vhost
*/
function get_apps_vhost_port_number() {
    global $conf;
    if($conf['nginx']['installed'] == true){
        $ispconfig_vhost_file = $conf['nginx']['vhost_conf_dir'].'/apps.vhost';
        $regex = '/listen (\d+)/';
    } else {
        $ispconfig_vhost_file = $conf['apache']['vhost_conf_dir'].'/apps.vhost';
        $regex = '/\<VirtualHost.*\:(\d{1,})\>/';
    }
    if(is_file($ispconfig_vhost_file)) {
        $tmp = file_get_contents($ispconfig_vhost_file);
        preg_match($regex, $tmp, $matches);
        $port_number = @intval($matches[1]);
        if($port_number > 0) {
            return $port_number;
        } else {
            return '8081';
        }
    }
}
/*
* Get the port number of the ISPConfig controlpanel vhost
*/
install/lib/installer_base.lib.php
@@ -474,7 +474,15 @@
                    $this->warning('Unable to set rights of user in master database: '.$value['db']."\n Query: ".$query."\n Error: ".$this->dbmaster->errorMessage);
                }
                $query = "GRANT SELECT, UPDATE ON ".$value['db'].".`aps_instances` TO '".$value['user']."'@'".$host."' ";
                $query = "GRANT SELECT, UPDATE, DELETE ON ".$value['db'].".`aps_instances` TO '".$value['user']."'@'".$host."' ";
                if ($verbose){
                    echo $query ."\n";
                }
                if(!$this->dbmaster->query($query)) {
                    $this->warning('Unable to set rights of user in master database: '.$value['db']."\n Query: ".$query."\n Error: ".$this->dbmaster->errorMessage);
                }
                $query = "GRANT SELECT, DELETE ON ".$value['db'].".`aps_instances_settings` TO '".$value['user']."'@'".$host."' ";
                if ($verbose){
                    echo $query ."\n";
                }
@@ -972,6 +980,7 @@
            } else {
                copy('tpl/debian_dovecot2.conf.master', $config_dir.'/'.$configfile);
            }
            replaceLine($config_dir.'/'.$configfile, 'postmaster_address = postmaster@example.com', 'postmaster_address = postmaster@'.$conf['hostname'], 1, 0);
        } else {
            if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/debian_dovecot.conf.master')) {
                copy($conf['ispconfig_install_dir'].'/server/conf-custom/install/debian_dovecot.conf.master', $config_dir.'/'.$configfile);
@@ -996,6 +1005,9 @@
        chmod($config_dir.'/'.$configfile, 0600);
        chown($config_dir.'/'.$configfile, 'root');
        chgrp($config_dir.'/'.$configfile, 'root');
        // Dovecot shall ignore mounts in website directory
        exec("doveadm mount add '/var/www/*' ignore");
    }
@@ -1527,7 +1539,8 @@
            if(!is_user($apps_vhost_user)) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
            $command = 'adduser '.$conf['apache']['user'].' '.$apps_vhost_group;
            //$command = 'adduser '.$conf['apache']['user'].' '.$apps_vhost_group;
            $command = 'usermod -a -G '.$apps_vhost_group.' '.$conf['apache']['user'];
            caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
            if(!@is_dir($install_dir)){
@@ -1542,6 +1555,11 @@
            $vhost_conf_dir = $conf['apache']['vhost_conf_dir'];
            $vhost_conf_enabled_dir = $conf['apache']['vhost_conf_enabled_dir'];
            $apps_vhost_servername = ($conf['web']['apps_vhost_servername'] == '')?'':'ServerName '.$conf['web']['apps_vhost_servername'];
            //* Get the apps vhost port
            if($this->is_update == true) {
                $conf['web']['apps_vhost_port'] = get_apps_vhost_port_number();
            }
            // Dont just copy over the virtualhost template but add some custom settings
            $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/apache_apps.vhost.master', 'tpl/apache_apps.vhost.master');
install/sql/incremental/upd_0068.sql
New file
@@ -0,0 +1,4 @@
ALTER TABLE  `dbispconfig`.`web_domain` ADD UNIQUE  `serverdomain` (  `server_id` ,  `domain` );
DROP INDEX rr ON dns_rr;
ALTER TABLE  `dns_rr` CHANGE  `name`  `name` VARCHAR( 128 ) NOT NULL ;
CREATE INDEX `rr` ON dns_rr (`zone`,`type`,`name`);
install/sql/ispconfig3.sql
@@ -229,7 +229,7 @@
  `language` char(2) NOT NULL DEFAULT 'en',
  `usertheme` varchar(32) NOT NULL DEFAULT 'default',
  `template_master` int(11) unsigned NOT NULL DEFAULT '0',
  `template_additional` text NOT NULL DEFAULT '',
  `template_additional` text NOT NULL,
  `created_at` bigint(20) DEFAULT NULL,
  `locked` enum('n','y') NOT NULL DEFAULT 'n',
  `canceled` enum('n','y') NOT NULL DEFAULT 'n',
@@ -450,7 +450,7 @@
  `stamp` timestamp NOT NULL default CURRENT_TIMESTAMP,
  `serial` int(10) unsigned default NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `rr` (`zone`,`name`,`type`,`data`)
  KEY `rr` (`zone`,`type`,`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
@@ -736,8 +736,8 @@
  `server_id` int(11) unsigned NOT NULL default '0',
  `domain` varchar(255) NOT NULL default '',
  `dkim` ENUM( 'n', 'y' ) NOT NULL default 'n',
  `dkim_private` mediumtext NOT NULL default '',
  `dkim_public` mediumtext NOT NULL default '',
  `dkim_private` mediumtext NOT NULL,
  `dkim_public` mediumtext NOT NULL,
  `active` enum('n','y') NOT NULL,
  PRIMARY KEY  (`domain_id`),
  KEY `server_id` (`server_id`,`domain`),
@@ -1689,7 +1689,7 @@
  `typ` varchar(16) NOT NULL default 'user',
  `active` tinyint(1) NOT NULL default '1',
  `language` varchar(2) NOT NULL default 'en',
  `groups` TEXT NOT NULL default '',
  `groups` TEXT NOT NULL,
  `default_group` int(11) unsigned NOT NULL default '0',
  `client_id` int(11) unsigned NOT NULL default '0',
  `id_rsa` VARCHAR( 2000 ) NOT NULL default '',
@@ -1867,7 +1867,8 @@
  `rewrite_rules` mediumtext,
  `added_date` date NOT NULL DEFAULT '0000-00-00',
  `added_by` varchar(255) DEFAULT NULL,
  PRIMARY KEY  (`domain_id`)
  PRIMARY KEY  (`domain_id`),
  UNIQUE KEY `serverdomain` (  `server_id` ,  `domain` )
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
install/tpl/debian_dovecot2.conf.master
@@ -4,6 +4,7 @@
disable_plaintext_auth = no
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_privileged_group = vmail
postmaster_address = postmaster@example.com
ssl_cert = </etc/postfix/smtpd.cert
ssl_key = </etc/postfix/smtpd.key
passdb {
install/tpl/debian_postfix.conf.master
@@ -19,7 +19,7 @@
transport_maps = hash:/var/lib/mailman/data/transport-mailman, proxy:mysql:{config_dir}/mysql-virtual_transports.cf
relay_domains = mysql:{config_dir}/mysql-virtual_relaydomains.cf
relay_recipient_maps = mysql:{config_dir}/mysql-virtual_relayrecipientmaps.cf
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks
smtpd_sender_restrictions = check_sender_access mysql:{config_dir}/mysql-virtual_sender.cf regexp:{config_dir}/tag_as_originating.re, permit_mynetworks, check_sender_access regexp:{config_dir}/tag_as_foreign.re
smtpd_client_restrictions = check_client_access mysql:{config_dir}/mysql-virtual_client.cf
smtpd_client_message_rate_limit = 100
install/tpl/fedora_postfix.conf.master
@@ -16,7 +16,7 @@
transport_maps = hash:/var/lib/mailman/data/transport-mailman, proxy:mysql:{config_dir}/mysql-virtual_transports.cf
relay_domains = mysql:{config_dir}/mysql-virtual_relaydomains.cf
relay_recipient_maps = mysql:{config_dir}/mysql-virtual_relayrecipientmaps.cf
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks
smtpd_sender_restrictions = check_sender_access mysql:{config_dir}/mysql-virtual_sender.cf regexp:{config_dir}/tag_as_originating.re, permit_mynetworks, check_sender_access regexp:{config_dir}/tag_as_foreign.re
smtpd_client_restrictions = check_client_access mysql:{config_dir}/mysql-virtual_client.cf
smtpd_client_message_rate_limit = 100
install/tpl/gentoo_postfix.conf.master
@@ -16,7 +16,7 @@
transport_maps = hash:/var/lib/mailman/data/transport-mailman, proxy:mysql:{config_dir}/mysql-virtual_transports.cf
relay_domains = mysql:{config_dir}/mysql-virtual_relaydomains.cf
relay_recipient_maps = mysql:{config_dir}/mysql-virtual_relayrecipientmaps.cf
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks
smtpd_sender_restrictions = check_sender_access mysql:{config_dir}/mysql-virtual_sender.cf regexp:{config_dir}/tag_as_originating.re, permit_mynetworks, check_sender_access regexp:{config_dir}/tag_as_foreign.re
smtpd_client_restrictions = check_client_access mysql:{config_dir}/mysql-virtual_client.cf
smtpd_client_message_rate_limit = 100
install/tpl/jk_init.ini.master
@@ -2,12 +2,12 @@
# this section probably needs adjustment on 64bit systems
# or non-Linux systems
comment = common files for all jails that need user/group information
libraries = /lib/libnsl.so.1, /lib64/libnsl.so.1, /lib/libnss*.so.2, /lib64/libnss*.so.2
libraries = /lib/libnsl.so.1, /lib64/libnsl.so.1, /lib/libnss*.so.2, /lib64/libnss*.so.2, /lib/x86_64-linux-gnu/libnss*.so.2
regularfiles = /etc/nsswitch.conf, /etc/ld.so.conf
[netbasics]
comment = common files for all jails that need any internet connectivity
libraries = /lib/libnss_dns.so.2, /lib64/libnss_dns.so.2
libraries = /lib/libnss_dns.so.2, /lib64/libnss_dns.so.2, /lib/x86_64-linux-gnu/libnss_dns.so.2
regularfiles = /etc/resolv.conf, /etc/host.conf, /etc/hosts, /etc/protocols
[logbasics]
install/tpl/mysql-virtual_forwardings.cf.master
@@ -4,5 +4,6 @@
table = mail_forwarding
select_field = destination
where_field = source
additional_conditions = and active = 'y' and server_id = {server_id}
additional_conditions = and type != 'aliasdomain' and active = 'y' and server_id = {server_id}
# additional_conditions = and active = 'y' and server_id = {server_id}
hosts = {mysql_server_ip}
install/tpl/opensuse_postfix.conf.master
@@ -16,7 +16,7 @@
transport_maps = hash:/var/lib/mailman/data/transport-mailman, proxy:mysql:{config_dir}/mysql-virtual_transports.cf
relay_domains = mysql:{config_dir}/mysql-virtual_relaydomains.cf
relay_recipient_maps = mysql:{config_dir}/mysql-virtual_relayrecipientmaps.cf
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks
smtpd_sender_restrictions = check_sender_access mysql:{config_dir}/mysql-virtual_sender.cf regexp:{config_dir}/tag_as_originating.re, permit_mynetworks, check_sender_access regexp:{config_dir}/tag_as_foreign.re
smtpd_client_restrictions = check_client_access mysql:{config_dir}/mysql-virtual_client.cf
smtpd_client_message_rate_limit = 100
install/tpl/opensuse_pureftpd_conf.master
@@ -43,7 +43,8 @@
# Fork in background
Daemonize                   yes
#Daemonize                   yes
Daemonize                   no
install/uninstall.php
@@ -95,7 +95,15 @@
    // Delete the ispconfig files
    exec('rm -rf /usr/local/ispconfig');
    
//    echo "Please do not forget to delete the ispconfig user in the mysql.user table.\n\n";
    // Delete various other files
    @unlink("/usr/local/bin/ispconfig_update.sh");
    @unlink("/usr/local/bin/ispconfig_update_from_svn.sh");
    @unlink("/var/spool/mail/ispconfig");
    @unlink("/var/www/ispconfig");
    @unlink("/var/www/php-fcgi-scripts/ispconfig");
    @unlink("/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter");
    echo "Backups in /var/backup/ and log files in /var/log/ispconfig are not deleted.";
    echo "Finished uninstalling.\n";
} else {
interface/lib/classes/aps_crawler.inc.php
@@ -288,11 +288,26 @@
                        $sxe = new SimpleXMLElement($xml);
                        $namespaces = $sxe->getDocNamespaces(true);
                        foreach($namespaces as $ns => $url) $sxe->registerXPathNamespace($ns, $url);
                        //Find highest version
                        $app_version = "0.0.0";
                        $entry_pos = 1;
                        for ($p = 1; ; $p++) {
                            $app_version_tmp = parent::getXPathValue($sxe, 'entry[position()=' . $p . ']/a:version');
                            if (strlen($app_version_tmp) < 1) break;
                            if (version_compare($app_version_tmp, $app_version) >= 0) {
                                $app_version = $app_version_tmp;
                                $entry_pos = $p;
                            }
                        }
                        // Fetching values of interest
                        $app_name = parent::getXPathValue($sxe, 'entry[position()=1]/a:name');
                        $app_version = parent::getXPathValue($sxe, 'entry[position()=1]/a:version');
                        $app_release = parent::getXPathValue($sxe, 'entry[position()=1]/a:release');
                        //$app_name = parent::getXPathValue($sxe, 'entry[position()=1]/a:name');
                        //$app_version = parent::getXPathValue($sxe, 'entry[position()=1]/a:version');
                        //$app_release = parent::getXPathValue($sxe, 'entry[position()=1]/a:release');
                        $app_name = parent::getXPathValue($sxe, "entry[position()=" . $entry_pos . "]/a:name");
                        $app_version = parent::getXPathValue($sxe, "entry[position()=" . $entry_pos . "]/a:version");
                        $app_release = parent::getXPathValue($sxe, "entry[position()=" . $entry_pos . "]/a:release");
                        // Find out a (possibly) existing package version
                        $ex_ver = '';
@@ -315,9 +330,12 @@
                            // Check if we already have an old version of this app
                            if(!empty($ex_ver) && version_compare($new_ver, $ex_ver) == 1) $apps_updated++;
                            $app_dl = parent::getXPathValue($sxe, "entry[position()=1]/link[@a:type='aps']/@href");
                            $app_filesize = parent::getXPathValue($sxe, "entry[position()=1]/link[@a:type='aps']/@length");
                            $app_metafile = parent::getXPathValue($sxe, "entry[position()=1]/link[@a:type='meta']/@href");
                            //$app_dl = parent::getXPathValue($sxe, "entry[position()=1]/link[@a:type='aps']/@href");
                            //$app_filesize = parent::getXPathValue($sxe, "entry[position()=1]/link[@a:type='aps']/@length");
                            //$app_metafile = parent::getXPathValue($sxe, "entry[position()=1]/link[@a:type='meta']/@href");
                            $app_dl = parent::getXPathValue($sxe, "entry[position()=" . $entry_pos . "]/link[@a:type='aps']/@href");
                            $app_filesize = parent::getXPathValue($sxe, "entry[position()=" . $entry_pos . "]/link[@a:type='aps']/@length");
                            $app_metafile = parent::getXPathValue($sxe, "entry[position()=" . $entry_pos . "]/link[@a:type='meta']/@href");
                            //$this->app_download_url_list[$app_name.'-'.$new_ver.'.app.zip'] = $app_dl;
                            // Skip ASP.net packages because they can't be used at all
@@ -365,7 +383,8 @@
                                }
                                // Download package license
                                $license = parent::getXPathValue($sxe, "entry[position()=1]/link[@a:type='eula']/@href");
                                //$license = parent::getXPathValue($sxe, "entry[position()=1]/link[@a:type='eula']/@href");
                                $license = parent::getXPathValue($sxe, "entry[position()=" . $entry_pos . "]/link[@a:type='eula']/@href");
                                if($license != '')
                                {
                                    $local_license = $local_intf_folder.'LICENSE';
@@ -379,7 +398,8 @@
                                }
                                // Download package icon
                                $icon = parent::getXPathValue($sxe, "entry[position()=1]/link[@a:type='icon']/@href");
                                //$icon = parent::getXPathValue($sxe, "entry[position()=1]/link[@a:type='icon']/@href");
                                $icon = parent::getXPathValue($sxe, "entry[position()=" . $entry_pos . "]/link[@a:type='icon']/@href");
                                if($icon != '')
                                {
                                    $local_icon = $local_intf_folder.basename($icon);
@@ -393,7 +413,8 @@
                                }
                                // Download available screenshots
                                $screenshots = parent::getXPathValue($sxe, "entry[position()=1]/link[@a:type='screenshot']", true);
                                //$screenshots = parent::getXPathValue($sxe, "entry[position()=1]/link[@a:type='screenshot']", true);
                                $screenshots = parent::getXPathValue($sxe, "entry[position()=" . $entry_pos . "]/link[@a:type='screenshot']", true);
                                if(!empty($screenshots))
                                {
                                    foreach($screenshots as $screen)
interface/lib/classes/db_mysql.inc.php
@@ -861,6 +861,9 @@
        case 'blob':
            return 'blob';
            break;
        case 'date':
            return 'date';
            break;
        }
    }
interface/lib/classes/functions.inc.php
@@ -229,7 +229,8 @@
                if(preg_match($regex, $result['ip'])) $ips[] = $result['ip'];
            }
        }
        /*
        $results = $app->db->queryAllRecords("SELECT xfer FROM dns_slave WHERE xfer != ''");
        if(!empty($results) && is_array($results)){
            foreach($results as $result){
@@ -260,6 +261,8 @@
                }
            }
        }
        */
        $results = $app->db->queryAllRecords("SELECT remote_ips FROM web_database WHERE remote_ips != ''");
        if(!empty($results) && is_array($results)){
            foreach($results as $result){
interface/lib/classes/remoting.inc.php
@@ -180,8 +180,11 @@
        $session_id = $app->db->quote($session_id);
        $sql = "DELETE FROM remote_session WHERE remote_session = '$session_id'";
        $app->db->query($sql);
        return $app->db->affectedRows() == 1;
        if($app->db->query($sql) != false) {
            return true;
        } else {
            return false;
        }
    }
    //** protected functions -----------------------------------------------------------------------------------
interface/lib/classes/tform_actions.inc.php
@@ -314,6 +314,7 @@
            //$this->dataRecord = $app->db->queryOneRecord("SELECT * FROM ".$liste["table"]." WHERE ".$liste["table_idx"]." = ".$this->id);
            $this->dataRecord = $app->tform->getDataRecord($this->id);
            $app->plugin->raiseEvent($_SESSION['s']['module']['name'].':'.$app->tform->formDef['name'].':'.'on_check_delete', $this);
            $this->onBeforeDelete();
            $app->plugin->raiseEvent($_SESSION['s']['module']['name'].':'.$app->tform->formDef['name'].':'.'on_before_delete', $this);
interface/lib/classes/tform_base.inc.php
@@ -1367,7 +1367,7 @@
    }
    function getAuthSQL($perm, $table = '') {
        if($_SESSION["s"]["user"]["typ"] == 'admin') {
        if($_SESSION["s"]["user"]["typ"] == 'admin' || $_SESSION['s']['user']['mailuser_id'] > 0) {
            return '1';
        } else {
            if ($table != ''){
interface/lib/classes/tform_tpl_generator.inc.php
@@ -271,9 +271,9 @@
                        $defaultValue = 'NULL';
                        break;
                    case 'DATE':
                        $type = 'int64';
                        $type = 'date';
                        $typevalue = '';
                        $defaultValue = ($field["default"] != '')?$field["default"]:'0';
                        $defaultValue = ($field["default"] != '')?$field["default"]:'0000-00-00';
                        break;
                    }
interface/lib/classes/tools_monitor.inc.php
@@ -415,7 +415,9 @@
            }
            else {
                $data = unserialize($record['data']);
                $html .= nl2br($data['output']);
                // improve view @Author <info@typoworx.de>
                //-- $html .= nl2br($data['output']);
                $html .= '<xmp>' . $data['output'] . '</xmp>';
            }
            $html .= '</div></div>';
interface/lib/classes/validate_cron.inc.php
@@ -52,7 +52,7 @@
            if($parsed["scheme"] != "http" && $parsed["scheme"] != "https") return $this->get_error($validator['errmsg']);
            if(preg_match("'^([a-z0-9][a-z0-9-]{0,62}\.)+([a-z]{2,30})$'i", $parsed["host"]) == false) return $this->get_error($validator['errmsg']);
            if(preg_match("'^([a-z0-9][a-z0-9\-]{0,62}\.)+([A-Za-z0-9\-]{2,30})$'i", $parsed["host"]) == false) return $this->get_error($validator['errmsg']);
        }
    }
interface/lib/plugins/sites_web_vhost_domain_plugin.inc.php
@@ -80,10 +80,14 @@
                $client = $app->db->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".$app->functions->intval(@$page_form->dataRecord["client_group_id"]));
                $client_id = $app->functions->intval($client["client_id"]);
            } else {
                $client_group_id = $page_form->dataRecord["client_group_id"];
                $client = $app->db->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".$app->functions->intval($page_form->dataRecord["client_group_id"]));
                $client_id = $app->functions->intval($client["client_id"]);
            }
            $tmp = $app->db->queryOneRecord("SELECT userid FROM sys_user WHERE default_group = $client_group_id");
            $client_user_id = $app->functions->intval(($tmp['userid'] > 0)?$tmp['userid']:1);
            // Set the values for document_root, system_user and system_group
            $system_user     = $app->db->quote('web'.$page_form->id);
            $system_group     = $app->db->quote('client'.$client_id);
interface/web/admin/form/system_config.tform.php
@@ -128,7 +128,7 @@
            'datatype' => 'VARCHAR',
            'formtype' => 'TEXT',
            'validators' => array ( 0 => array ( 'type' => 'REGEX',
                    'regex' => '/^[0-9a-zA-Z\:\/\-\.\[\]]{0,255}$/',
                    'regex' => '/^[0-9a-zA-Z\:\/\-\.\_\[\]\?\=\&]{0,255}$/',
                    'errmsg'=> 'phpmyadmin_url_error_regex'),
            ),
            'default' => '',
interface/web/admin/templates/remote_user_edit.htm
@@ -13,7 +13,7 @@
                
            <div class="ctrlHolder">
                <label for="remote_password">{tmpl_var name='password_txt'}</label>
                <input name="remote_password" id="password" value="{tmpl_var name='remote_password'}" size="30" maxlength="255" type="password" class="textInput" onkeyup="pass_check(this.value);checkPassMatch('password','repeat_password');" />&nbsp;<a href="javascript:void(0);" onclick="generatePassword('password','repeat_password');">{tmpl_var name='generate_password_txt'}</a>
                <input name="remote_password" id="password" value="{tmpl_var name='remote_password'}" size="30" maxlength="255" type="password" class="textInput" autocomplete="off" onkeyup="pass_check(this.value);checkPassMatch('password','repeat_password');" />&nbsp;<a href="javascript:void(0);" onclick="generatePassword('password','repeat_password');">{tmpl_var name='generate_password_txt'}</a>
            </div>
            <div class="ctrlHolder">
                <p class="label">{tmpl_var name='password_strength_txt'}</p>
@@ -22,7 +22,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="repeat_password">{tmpl_var name='repeat_password_txt'}</label>
                <input name="repeat_password" id="repeat_password" value="" size="15" maxlength="100" type="password" class="textInput" style="width:100px;"  onkeyup="checkPassMatch('password','repeat_password');" />
                <input name="repeat_password" id="repeat_password" value="" size="15" maxlength="100" type="password" class="textInput" style="width:100px;" autocomplete="off" onkeyup="checkPassMatch('password','repeat_password');" />
            </div>
            <div id="confirmpasswordError" style="display:none;" class="confirmpassworderror">{tmpl_var name='password_mismatch_txt'}</div>
            <div id="confirmpasswordOK" style="display:none;" class="confirmpasswordok">{tmpl_var name='password_match_txt'}</div>
interface/web/admin/templates/users_user_edit.htm
@@ -11,7 +11,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="passwort">{tmpl_var name='passwort_txt'}</label>
                <input name="passwort" id="passwort" value="{tmpl_var name='passwort'}" size="15" maxlength="100" type="password" class="textInput"  onkeyup="pass_check(this.value);checkPassMatch('passwort','repeat_password');"/>&nbsp;<a href="javascript:void(0);" onclick="generatePassword('passwort','repeat_password');">{tmpl_var name='generate_password_txt'}</a>
                <input name="passwort" id="passwort" value="{tmpl_var name='passwort'}" size="15" maxlength="100" type="password" class="textInput" autocomplete="off" onkeyup="pass_check(this.value);checkPassMatch('passwort','repeat_password');"/>&nbsp;<a href="javascript:void(0);" onclick="generatePassword('passwort','repeat_password');">{tmpl_var name='generate_password_txt'}</a>
            </div>
            <div class="ctrlHolder">
                <p class="label">{tmpl_var name='password_strength_txt'}</p>
@@ -20,7 +20,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="repeat_password">{tmpl_var name='repeat_password_txt'}</label>
                <input name="repeat_password" id="repeat_password" value="" size="15" maxlength="100" type="password" class="textInput" style="width:100px;"  onkeyup="checkPassMatch('passwort','repeat_password');" />
                <input name="repeat_password" id="repeat_password" value="" size="15" maxlength="100" type="password" class="textInput" style="width:100px;" autocomplete="off" onkeyup="checkPassMatch('passwort','repeat_password');" />
            </div>
            <div id="confirmpasswordError" style="display:none;" class="confirmpassworderror">{tmpl_var name='password_mismatch_txt'}</div>
            <div id="confirmpasswordOK" style="display:none;" class="confirmpasswordok">{tmpl_var name='password_match_txt'}</div>
interface/web/client/templates/client_edit_address.htm
@@ -30,7 +30,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="password">{tmpl_var name='password_txt'}</label>
                <input name="password" id="password" value="{tmpl_var name='password'}" size="30" maxlength="255" type="password" class="textInput" onkeyup="pass_check(this.value);checkPassMatch('password','repeat_password');" />&nbsp;<a href="javascript:void(0);" onclick="generatePassword('password','repeat_password');">{tmpl_var name='generate_password_txt'}</a>
                <input name="password" id="password" value="{tmpl_var name='password'}" size="30" maxlength="255" type="password" class="textInput" autocomplete="off" onkeyup="pass_check(this.value);checkPassMatch('password','repeat_password');" />&nbsp;<a href="javascript:void(0);" onclick="generatePassword('password','repeat_password');">{tmpl_var name='generate_password_txt'}</a>
            </div>
            <div class="ctrlHolder">
                <p class="label">{tmpl_var name='password_strength_txt'}</p>
@@ -39,7 +39,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="repeat_password">{tmpl_var name='repeat_password_txt'}</label>
                <input name="repeat_password" id="repeat_password" value="" size="15" maxlength="100" type="password" class="textInput" style="width:100px;"  onkeyup="checkPassMatch('password','repeat_password');" />
                <input name="repeat_password" id="repeat_password" value="" size="15" maxlength="100" type="password" class="textInput" style="width:100px;" autocomplete="off" onkeyup="checkPassMatch('password','repeat_password');" />
            </div>
            <div id="confirmpasswordError" style="display:none;" class="confirmpassworderror">{tmpl_var name='password_mismatch_txt'}</div>
            <div id="confirmpasswordOK" style="display:none;" class="confirmpasswordok">{tmpl_var name='password_match_txt'}</div>
interface/web/client/templates/reseller_edit_address.htm
@@ -30,7 +30,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="password">{tmpl_var name='password_txt'}</label>
                <input name="password" id="password" value="{tmpl_var name='password'}" size="30" maxlength="255" type="password" class="textInput" onkeyup="pass_check(this.value);checkPassMatch('password','repeat_password');" />&nbsp;<a href="javascript:void(0);" onclick="generatePassword('password','repeat_password');">{tmpl_var name='generate_password_txt'}</a>
                <input name="password" id="password" value="{tmpl_var name='password'}" size="30" maxlength="255" type="password" class="textInput" autocomplete="off" onkeyup="pass_check(this.value);checkPassMatch('password','repeat_password');" />&nbsp;<a href="javascript:void(0);" onclick="generatePassword('password','repeat_password');">{tmpl_var name='generate_password_txt'}</a>
            </div>
            <div class="ctrlHolder">
                <p class="label">{tmpl_var name='password_strength_txt'}</p>
@@ -39,7 +39,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="repeat_password">{tmpl_var name='repeat_password_txt'}</label>
                <input name="repeat_password" id="repeat_password" value="" size="15" maxlength="100" type="password" class="textInput" style="width:100px;"  onkeyup="checkPassMatch('password','repeat_password');" />
                <input name="repeat_password" id="repeat_password" value="" size="15" maxlength="100" type="password" class="textInput" style="width:100px;" autocomplete="off" onkeyup="checkPassMatch('password','repeat_password');" />
            </div>
            <div id="confirmpasswordError" style="display:none;" class="confirmpassworderror">{tmpl_var name='password_mismatch_txt'}</div>
            <div id="confirmpasswordOK" style="display:none;" class="confirmpasswordok">{tmpl_var name='password_match_txt'}</div>
interface/web/dns/form/dns_a.tform.php
@@ -86,7 +86,7 @@
                    'type' => 'TOLOWER')
            ),
            'validators' => array (  0 => array ( 'type' => 'REGEX',
                    'regex' => '/^[\a-zA-Z0-9\.\-\*]{0,64}$/',
                    'regex' => '/^[a-zA-Z0-9\.\-\*]{0,64}$/',
                    'errmsg'=> 'name_error_regex'),
            ),
            'default' => '',
interface/web/dns/form/dns_aaaa.tform.php
@@ -79,7 +79,7 @@
            'datatype' => 'VARCHAR',
            'formtype' => 'TEXT',
            'validators' => array (  0 => array ( 'type' => 'REGEX',
                    'regex' => '/^[\w\.\-\*]{0,64}$/',
                    'regex' => '/^[a-zA-Z0-9\.\-\*]{0,64}$/',
                    'errmsg'=> 'name_error_regex'),
            ),
            'default' => '',
interface/web/dns/form/dns_alias.tform.php
@@ -88,7 +88,7 @@
            'validators' => array (  0 => array ( 'type' => 'NOTEMPTY',
                    'errmsg'=> 'name_error_empty'),
                1 => array ( 'type' => 'REGEX',
                    'regex' => '/^[\w\.\-]{1,255}$/',
                    'regex' => '/^[a-zA-Z0-9\.\-]{1,255}$/',
                    'errmsg'=> 'name_error_regex'),
            ),
            'default' => '',
@@ -117,7 +117,7 @@
            'validators' => array (  0 => array ( 'type' => 'NOTEMPTY',
                    'errmsg'=> 'data_error_empty'),
                1 => array ( 'type' => 'REGEX',
                    'regex' => '/^[\w\.\-]{1,255}$/',
                    'regex' => '/^[a-zA-Z0-9\.\-]{1,255}$/',
                    'errmsg'=> 'data_error_regex'),
            ),
            'default' => '',
interface/web/dns/form/dns_cname.tform.php
@@ -86,7 +86,7 @@
                    'type' => 'TOLOWER')
            ),
            'validators' => array (  0 => array ( 'type' => 'REGEX',
                    'regex' => '/^[\w\.\-\*]{0,255}$/',
                    'regex' => '/^[a-zA-Z0-9\.\-\*]{0,255}$/',
                    'errmsg'=> 'name_error_regex'),
            ),
            'default' => '',
@@ -115,7 +115,7 @@
            'validators' => array (  0 => array ( 'type' => 'NOTEMPTY',
                    'errmsg'=> 'data_error_empty'),
                1 => array ( 'type' => 'REGEX',
                    'regex' => '/^[\w\.\-]{1,255}$/',
                    'regex' => '/^[a-zA-Z0-9\.\-]{1,255}$/',
                    'errmsg'=> 'data_error_regex'),
            ),
            'default' => '',
interface/web/dns/form/dns_hinfo.tform.php
@@ -88,7 +88,7 @@
            'validators' => array (  0 => array ( 'type' => 'NOTEMPTY',
                    'errmsg'=> 'name_error_empty'),
                1 => array ( 'type' => 'REGEX',
                    'regex' => '/^[\w\.\-]{1,64}$/',
                    'regex' => '/^[a-zA-Z0-9\.\-]{1,64}$/',
                    'errmsg'=> 'name_error_regex'),
            ),
            'default' => '',
interface/web/dns/form/dns_mx.tform.php
@@ -87,7 +87,7 @@
                    'type' => 'TOLOWER')
            ),
            'validators' => array (  0 => array ( 'type' => 'REGEX',
                    'regex' => '/^[\w\.\-\*]{0,255}$/',
                    'regex' => '/^[a-zA-Z0-9\.\-]{0,255}$/',
                    'errmsg'=> 'name_error_regex'),
            ),
            'default' => '',
@@ -116,7 +116,7 @@
            'validators' => array (  0 => array ( 'type' => 'NOTEMPTY',
                    'errmsg'=> 'data_error_empty'),
                1 => array ( 'type' => 'REGEX',
                    'regex' => '/^[\w\.\-]{1,255}$/',
                    'regex' => '/^[a-zA-Z0-9\.\-]{1,255}$/',
                    'errmsg'=> 'data_error_regex'),
            ),
            'default' => '',
interface/web/dns/form/dns_ns.tform.php
@@ -86,7 +86,7 @@
                    'type' => 'TOLOWER')
            ),
            'validators' => array (  0 => array ( 'type' => 'REGEX',
                    'regex' => '/^[\w\.\-]{0,255}$/',
                    'regex' => '/^[a-zA-Z0-9\.\-]{0,255}$/',
                    'errmsg'=> 'name_error_regex'),
            ),
            'default' => '',
@@ -115,7 +115,7 @@
            'validators' => array (  0 => array ( 'type' => 'NOTEMPTY',
                    'errmsg'=> 'data_error_empty'),
                1 => array ( 'type' => 'REGEX',
                    'regex' => '/^[\w\.\-]{1,255}$/',
                    'regex' => '/^[a-zA-Z0-9\.\-]{1,255}$/',
                    'errmsg'=> 'data_error_regex'),
            ),
            'default' => '',
interface/web/dns/form/dns_ptr.tform.php
@@ -86,7 +86,7 @@
                    'type' => 'TOLOWER')
            ),
            'validators' => array (  0 => array ( 'type' => 'REGEX',
                    'regex' => '/^[\w\.\-]{1,256}$/',
                    'regex' => '/^[a-zA-Z0-9\.\-]{1,256}$/',
                    'errmsg'=> 'name_error_regex'),
            ),
            'default' => '',
@@ -115,7 +115,7 @@
            'validators' => array (  0 => array ( 'type' => 'NOTEMPTY',
                    'errmsg'=> 'data_error_empty'),
                1 => array ( 'type' => 'REGEX',
                    'regex' => '/^[\w\.\-]{1,256}$/',
                    'regex' => '/^[a-zA-Z0-9\.\-]{1,256}$/',
                    'errmsg'=> 'data_error_regex'),
            ),
            'default' => '',
interface/web/dns/form/dns_rp.tform.php
@@ -86,7 +86,7 @@
                    'type' => 'TOLOWER')
            ),
            'validators' => array (  0 => array ( 'type' => 'REGEX',
                    'regex' => '/^[\w\.\-]{0,255}$/',
                    'regex' => '/^[a-zA-Z0-9\.\-]{0,255}$/',
                    'errmsg'=> 'name_error_regex'),
            ),
            'default' => '',
interface/web/dns/form/dns_slave.tform.php
@@ -96,7 +96,7 @@
                                                        'errmsg'=> 'origin_error_unique'),
                                        */
                1 => array ( 'type' => 'REGEX',
                    'regex' => '/^[\w\.\-\/]{2,255}\.[a-zA-Z0-9\-]{2,10}[\.]{0,1}$/',
                    'regex' => '/^[a-zA-Z0-9\.\-\/]{2,255}\.[a-zA-Z0-9\-]{2,10}[\.]{0,1}$/',
                    'errmsg'=> 'origin_error_regex'),
            ),
            'default' => '',
@@ -121,6 +121,11 @@
        'xfer' => array (
            'datatype'      => 'VARCHAR',
            'formtype'      => 'TEXT',
            'validators' => array (  0 => array ( 'type' => 'ISIP',
                    'allowempty' => 'y',
                    'separator' => ',',
                    'errmsg'=> 'xfer_error_regex'),
            ),
            'default'       => '',
            'value'         => '',
            'width'         => '30',
interface/web/dns/form/dns_soa.tform.php
@@ -95,7 +95,7 @@
                1 => array ( 'type' => 'UNIQUE',
                    'errmsg'=> 'origin_error_unique'),
                2 => array ( 'type' => 'REGEX',
                    'regex' => '/^[\w\.\-\/]{2,255}\.[a-zA-Z0-9\-]{2,30}[\.]{0,1}$/',
                    'regex' => '/^[a-zA-Z0-9\.\-\/]{2,255}\.[a-zA-Z0-9\-]{2,30}[\.]{0,1}$/',
                    'errmsg'=> 'origin_error_regex'),
            ),
            'default' => '',
@@ -115,7 +115,7 @@
                    'type' => 'TOLOWER')
            ),
            'validators' => array (  0 => array ( 'type' => 'REGEX',
                    'regex' => '/^[\w\.\-]{1,255}$/',
                    'regex' => '/^[a-zA-Z0-9\.\-]{1,255}$/',
                    'errmsg'=> 'ns_error_regex'),
            ),
            'default' => '',
@@ -137,7 +137,7 @@
            'validators' => array (  0 => array ( 'type' => 'NOTEMPTY',
                    'errmsg'=> 'mbox_error_empty'),
                1 => array ( 'type' => 'REGEX',
                    'regex' => '/^[[a-zA-Z0-9\.\-\_]{0,255}\.$/',
                    'regex' => '/^[a-zA-Z0-9\.\-\_]{0,255}\.$/',
                    'errmsg'=> 'mbox_error_regex'),
            ),
            'default' => '',
interface/web/dns/form/dns_srv.tform.php
@@ -86,7 +86,7 @@
                    'type' => 'TOLOWER')
            ),
            'validators' => array (  0 => array ( 'type' => 'REGEX',
                    'regex' => '/^[\w\.\-]{0,255}$/',
                    'regex' => '/^[a-zA-Z0-9\.\-]{0,255}$/',
                    'errmsg'=> 'name_error_regex'),
            ),
            'default' => '',
interface/web/dns/form/dns_txt.tform.php
@@ -86,7 +86,7 @@
                    'type' => 'TOLOWER')
            ),
            'validators' => array (  0 => array ( 'type' => 'REGEX',
                    'regex' => '/^[\w\.\-]{0,255}$/',
                    'regex' => '/^[a-zA-Z0-9\.\-\_]{0,255}$/',
                    'errmsg'=> 'name_error_regex'),
            ),
            'default' => '',
interface/web/help/templates/faq_manage_questions_list.htm
@@ -25,12 +25,12 @@
                <tbody>
                <tmpl_loop name="records">
                    <tr class="tbl_row_<tmpl_if name='__EVEN__'}even<tmpl_else>uneven</tmpl_if>">
                        <td>{tmpl_var name='hf_question'}</td>
                        <td>{tmpl_var name='hf_section'}</td>
                        <td class="tbl_col_buttons">
                        <td width="60%">{tmpl_var name='hf_question'}</td>
                        <td width="30%">{tmpl_var name='hf_section'}</td>
                        <td class="tbl_col_buttons" width="5%">
                            <a class="button icons16 icoDelete" href="javascript: del_record('help/faq_delete.php?id={tmpl_var name='id'}&phpsessid={tmpl_var name='phpsessid'}','{tmpl_var name='delete_confirmation'}');"><span>{tmpl_var name="faq_delete_txt"}</span></a>
                        </td>
                        <td class="tbl_col_buttons">
                        <td class="tbl_col_buttons" width="5%">
                            <a class="button icons16 icoEdit" href="javascript: loadContent('help/faq_edit.php?id={tmpl_var name='id'}');"><span>{tmpl_var name="faq_edit_txt"}</span></a>
                        </td>
                    </tr>
interface/web/js/jquery.tipsy.js
@@ -1,426 +1,438 @@
// tipsy, facebook style tooltips for jquery
// version 1.0.0a
// (c) 2008-2010 jason frame [jason@onehackoranother.com]
// released under the MIT license
(function($) {
    function maybeCall(thing, ctx) {
        return (typeof thing == 'function') ? (thing.call(ctx)) : thing;
    };
    function Tipsy(element, options) {
        this.$element = $(element);
        this.options = options;
        this.enabled = true;
        this.fixTitle();
    };
    Tipsy.prototype = {
        show: function() {
            var title = this.getTitle();
            if (title && this.enabled) {
                var $tip = this.tip();
                $tip.find('.tipsy-inner')[this.options.html ? 'html' : 'text'](title);
                $tip[0].className = 'tipsy'; // reset classname in case of dynamic gravity
                $tip.remove().css({top: 0, left: 0, visibility: 'hidden', display: 'block'}).prependTo(document.body);
                var pos = $.extend({}, this.$element.offset(), {
                    width: this.$element[0].offsetWidth,
                    height: this.$element[0].offsetHeight
                });
                var actualWidth = $tip[0].offsetWidth,
                    actualHeight = $tip[0].offsetHeight,
                    gravity = maybeCall(this.options.gravity, this.$element[0]);
                var tp;
                switch (gravity.charAt(0)) {
                    case 'n':
                        tp = {top: pos.top + pos.height + this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
                        break;
                    case 's':
                        tp = {top: pos.top - actualHeight - this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
                        break;
                    case 'e':
                        tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth - this.options.offset};
                        break;
                    case 'w':
                        tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width + this.options.offset};
                        break;
                }
                if (gravity.length == 2) {
                    if (gravity.charAt(1) == 'w') {
                        tp.left = pos.left + pos.width / 2 - 15;
                    } else {
                        tp.left = pos.left + pos.width / 2 - actualWidth + 15;
                    }
                }
                $tip.css(tp).addClass('tipsy-' + gravity);
                $tip.find('.tipsy-arrow')[0].className = 'tipsy-arrow tipsy-arrow-' + gravity.charAt(0);
                if (this.options.className) {
                    $tip.addClass(maybeCall(this.options.className, this.$element[0]));
                }
                if (this.options.fade) {
                    $tip.stop().css({opacity: 0, display: 'block', visibility: 'visible'}).animate({opacity: this.options.opacity});
                } else {
                    $tip.css({visibility: 'visible', opacity: this.options.opacity});
                }
            }
        },
        hide: function() {
            if (this.options.fade) {
                this.tip().stop().fadeOut(function() { $(this).remove(); });
            } else {
                this.tip().remove();
            }
        },
        fixTitle: function() {
            var $e = this.$element;
            if ($e.attr('title') || typeof($e.attr('original-title')) != 'string') {
                $e.attr('original-title', $e.attr('title') || '').removeAttr('title');
            }
        },
        getTitle: function() {
            var title, $e = this.$element, o = this.options;
            this.fixTitle();
            var title, o = this.options;
            if (typeof o.title == 'string') {
                title = $e.attr(o.title == 'title' ? 'original-title' : o.title);
            } else if (typeof o.title == 'function') {
                title = o.title.call($e[0]);
            }
            title = ('' + title).replace(/(^\s*|\s*$)/, "");
            return title || o.fallback;
        },
        tip: function() {
            if (!this.$tip) {
                this.$tip = $('<div class="tipsy"></div>').html('<div class="tipsy-arrow"></div><div class="tipsy-inner"></div>');
            }
            return this.$tip;
        },
        validate: function() {
            if (!this.$element[0].parentNode) {
                this.hide();
                this.$element = null;
                this.options = null;
            }
        },
        enable: function() { this.enabled = true; },
        disable: function() { this.enabled = false; },
        toggleEnabled: function() { this.enabled = !this.enabled; }
    };
    $.fn.tipsy = function(options) {
        if (options === true) {
            return this.data('tipsy');
        } else if (typeof options == 'string') {
            var tipsy = this.data('tipsy');
            if (tipsy) tipsy[options]();
            return this;
        }
        options = $.extend({}, $.fn.tipsy.defaults, options);
        function get(ele) {
            var tipsy = $.data(ele, 'tipsy');
            if (!tipsy) {
                tipsy = new Tipsy(ele, $.fn.tipsy.elementOptions(ele, options));
                $.data(ele, 'tipsy', tipsy);
            }
            return tipsy;
        }
        function enter() {
            var tipsy = get(this);
            tipsy.hoverState = 'in';
            if (options.delayIn == 0) {
                tipsy.show();
            } else {
                tipsy.fixTitle();
                setTimeout(function() { if (tipsy.hoverState == 'in') tipsy.show(); }, options.delayIn);
            }
        };
        function leave() {
            var tipsy = get(this);
            tipsy.hoverState = 'out';
            if (options.delayOut == 0) {
                tipsy.hide();
            } else {
                setTimeout(function() { if (tipsy.hoverState == 'out') tipsy.hide(); }, options.delayOut);
            }
        };
        if (!options.live) this.each(function() { get(this); });
        if (options.trigger != 'manual') {
            var binder   = options.live ? 'live' : 'bind',
                eventIn  = options.trigger == 'hover' ? 'mouseenter' : 'focus',
                eventOut = options.trigger == 'hover' ? 'mouseleave' : 'blur';
            this[binder](eventIn, enter)[binder](eventOut, leave);
        }
        return this;
    };
    $.fn.tipsy.defaults = {
        className: null,
        delayIn: 0,
        delayOut: 0,
        fade: false,
        fallback: '',
        gravity: 'n',
        html: false,
        live: false,
        offset: 0,
        opacity: 0.8,
        title: 'title',
        trigger: 'hover'
    };
    // Overwrite this method to provide options on a per-element basis.
    // For example, you could store the gravity in a 'tipsy-gravity' attribute:
    // return $.extend({}, options, {gravity: $(ele).attr('tipsy-gravity') || 'n' });
    // (remember - do not modify 'options' in place!)
    $.fn.tipsy.elementOptions = function(ele, options) {
        return $.metadata ? $.extend({}, options, $(ele).metadata()) : options;
    };
    $.fn.tipsy.autoNS = function() {
        return $(this).offset().top > ($(document).scrollTop() + $(window).height() / 2) ? 's' : 'n';
    };
    $.fn.tipsy.autoWE = function() {
        return $(this).offset().left > ($(document).scrollLeft() + $(window).width() / 2) ? 'e' : 'w';
    };
    /**
     * yields a closure of the supplied parameters, producing a function that takes
     * no arguments and is suitable for use as an autogravity function like so:
     *
     * @param margin (int) - distance from the viewable region edge that an
     *        element should be before setting its tooltip's gravity to be away
     *        from that edge.
     * @param prefer (string, e.g. 'n', 'sw', 'w') - the direction to prefer
     *        if there are no viewable region edges effecting the tooltip's
     *        gravity. It will try to vary from this minimally, for example,
     *        if 'sw' is preferred and an element is near the right viewable
     *        region edge, but not the top edge, it will set the gravity for
     *        that element's tooltip to be 'se', preserving the southern
     *        component.
     */
     $.fn.tipsy.autoBounds = function(margin, prefer) {
        return function() {
            var dir = {ns: prefer[0], ew: (prefer.length > 1 ? prefer[1] : false)},
                boundTop = $(document).scrollTop() + margin,
                boundLeft = $(document).scrollLeft() + margin,
                $this = $(this);
            if ($this.offset().top < boundTop) dir.ns = 'n';
            if ($this.offset().left < boundLeft) dir.ew = 'w';
            if ($(window).width() + $(document).scrollLeft() - $this.offset().left < margin) dir.ew = 'e';
            if ($(window).height() + $(document).scrollTop() - $this.offset().top < margin) dir.ns = 's';
            return dir.ns + (dir.ew ? dir.ew : '');
        }
    };
})(jQuery);
(function( $ ) {
    $.widget( "ui.combobox", {
        _create: function() {
            var elwidth = this.element.width();
            var elheight = this.element.height();
            var input,
                self = this,
                select = this.element,
                internal = false,
                selected = select.children( ":selected" ),
                value = selected.val() ? selected.text() : "",
                wrapper = this.wrapper = $( "<span>" )
                    .addClass( "ui-combobox" )
                    .insertAfter( select );
            input = $( "<input>" ).css( { "width": (select.is(':visible') ? (elwidth > 15 ? elwidth - 15 : 1) : 350), "height": (elheight > 0 ? elheight : 16) });
            select.hide();
            input.appendTo( wrapper )
                .val( value )
                .addClass( "ui-state-default ui-combobox-input" )
                .autocomplete({
                    delay: 0,
                    minLength: 0,
                    source: function( request, response ) {
                        var matcher = new RegExp( $.ui.autocomplete.escapeRegex(request.term), "i" );
                        response( select.children( "option" ).map(function() {
                            var text = $( this ).text();
                            //if ( this.value && ( !request.term || matcher.test(text) ) )
                            if ( (!request.term || matcher.test(text)) && $(this).css('display') != 'none' )
                                return {
                                    label: (text == "" ? "&nbsp;" : text.replace(
                                        new RegExp(
                                            "(?![^&;]+;)(?!<[^<>]*)(" +
                                            $.ui.autocomplete.escapeRegex(request.term) +
                                            ")(?![^<>]*>)(?![^&;]+;)", "gi"
                                        ), "<strong>$1</strong>" )),
                                    'value': (text ? text : ''),
                                    'class': (select.hasClass('flags') ? 'country-' + ($(this).val() ? $(this).val().toUpperCase() : '') : $(this).attr('class')),
                                    option: this
                                };
                        }) );
                    },
                    select: function( event, ui ) {
                        ui.item.option.selected = true;
                        self._trigger( "selected", event, {
                            item: ui.item.option
                        });
                        if((select.onchange || false) && typeof select.onchange == 'function') {
                            select.onchange( { target: select } );
                        } else if($(select).attr('onchange')) {
                            eval($(select).attr('onchange'));
                        } else {
                            if(!ui.item.internal) {
                                internal = true;
                                $(select).change();
                            }
                        }
                        if (jQuery(".panel #Filter").length > 0) {
                            jQuery(".panel #Filter").trigger('click');
                        }
                    },
                    change: function( event, ui ) {
                        if ( !ui.item ) {
                            var matcher = new RegExp( "" + $.ui.autocomplete.escapeRegex( $(this).val() ) + "", "i" ),
                                matchtext = $(this).val();
                                valid = false;
                            select.children( "option" ).each(function() {
                                if( (($(this).text() == "" && matchtext == "") || $( this ).text().match( matcher )) && $(this).css('display') != 'none' ) {
                                    select.val($(this).val());
                                    this.selected = valid = true;
                                    return false;
                                }
                            });
                            if ( !valid ) {
                                // remove invalid value, as it didn't match anything
                                $( this ).val( "" );
                                select.val( "" );
                                input.data( "autocomplete" ).term = "";
                                return false;
                            }
                        }
                    }
                })
                .keypress(function(event) {
                    if(event.keyCode == 13) {
                        event.preventDefault();
                        var matcher = new RegExp( "" + $.ui.autocomplete.escapeRegex( $(this).val() ) + "", "i" ),
                            matchtext = $(this).val();
                            valid = false,
                            selected = false;
                        select.children( "option" ).each(function() {
                            if( (($(this).val() == "" && matchtext == "") || $( this ).text().match( matcher )) && $(this).css('display') != 'none' ) {
                                valid = true;
                                selected = $(this);
                                return false;
                            }
                        });
                        if(!valid) return false;
                        $(this).autocomplete('option','select').call($(this), event, { item: { option: selected.get(0), internal: true } });
                    }
                })
                .addClass( "ui-widget ui-widget-content ui-corner-left" )
                .click(function() {
                    // close if already visible
                    if ( input.autocomplete( "widget" ).is( ":visible" ) ) {
                        //input.autocomplete( "close" );
                        return;
                    }
                    // pass empty string as value to search for, displaying all results
                    input.autocomplete( "search", "" );
                    input.focus();
                });
            if(select.hasClass('flags')) input.addClass('flags');
            input.data( "autocomplete" )._renderItem = function( ul, item ) {
                var el = $( "<li></li>" )
                    .data( "item.autocomplete", item )
                    .append( "<a>" + item.label + "</a>" )
                    .appendTo( ul );
                if(item && item['class'] && el) el.addClass(item['class']);
                return el;
            };
            select.change(function(e) {
                if(internal == true) {
                    internal = false;
                    return;
                }
                var matchtext = $(this).val().toLowerCase();
                    valid = false,
                    selected = false,
                    selected_val = "";
                select.children( "option" ).each(function() {
                    if( (($(this).val() == "" && matchtext == "") || $( this ).val().toLowerCase() == matchtext) && $(this).css('display') != 'none' ) {
                        valid = true;
                        selected = $(this);
                        selected_val = $(this).text();
                        return false;
                    }
                });
                if(!valid) return false;
                input.val(selected_val).autocomplete('option','select').call(input, (e ? e : {target: select}), { item: { option: selected.get(0), internal: true } });
            });
            $( "<a>" )
                .attr( "tabIndex", -1 )
                .attr( "title", "Show All Items" )
                .appendTo( wrapper )
                .button({
                    icons: {
                        primary: "ui-icon-triangle-1-s"
                    },
                    text: false
                })
                .removeClass( "ui-corner-all" )
                .addClass( "ui-corner-right ui-combobox-toggle" )
                .css( { "width": 15, "height": (elheight > 0 ? elheight : 16) })
                .click(function() {
                    // close if already visible
                    if ( input.autocomplete( "widget" ).is( ":visible" ) ) {
                        input.autocomplete( "close" );
                        return;
                    }
                    // work around a bug (likely same cause as #5265)
                    $( this ).blur();
                    // pass empty string as value to search for, displaying all results
                    input.autocomplete( "search", "" );
                    input.focus();
                });
        },
        destroy: function() {
            this.wrapper.remove();
            this.element.show();
            $.Widget.prototype.destroy.call( this );
        }
    });
})( jQuery );
// tipsy, facebook style tooltips for jquery
// version 1.0.0a
// (c) 2008-2010 jason frame [jason@onehackoranother.com]
// released under the MIT license
(function($) {
    function maybeCall(thing, ctx) {
        return (typeof thing == 'function') ? (thing.call(ctx)) : thing;
    };
    function Tipsy(element, options) {
        this.$element = $(element);
        this.options = options;
        this.enabled = true;
        this.fixTitle();
    };
    Tipsy.prototype = {
        show: function() {
            var title = this.getTitle();
            if (title && this.enabled) {
                var $tip = this.tip();
                $tip.find('.tipsy-inner')[this.options.html ? 'html' : 'text'](title);
                $tip[0].className = 'tipsy'; // reset classname in case of dynamic gravity
                $tip.remove().css({top: 0, left: 0, visibility: 'hidden', display: 'block'}).prependTo(document.body);
                var pos = $.extend({}, this.$element.offset(), {
                    width: this.$element[0].offsetWidth,
                    height: this.$element[0].offsetHeight
                });
                var actualWidth = $tip[0].offsetWidth,
                    actualHeight = $tip[0].offsetHeight,
                    gravity = maybeCall(this.options.gravity, this.$element[0]);
                var tp;
                switch (gravity.charAt(0)) {
                    case 'n':
                        tp = {top: pos.top + pos.height + this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
                        break;
                    case 's':
                        tp = {top: pos.top - actualHeight - this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
                        break;
                    case 'e':
                        tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth - this.options.offset};
                        break;
                    case 'w':
                        tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width + this.options.offset};
                        break;
                }
                if (gravity.length == 2) {
                    if (gravity.charAt(1) == 'w') {
                        tp.left = pos.left + pos.width / 2 - 15;
                    } else {
                        tp.left = pos.left + pos.width / 2 - actualWidth + 15;
                    }
                }
                $tip.css(tp).addClass('tipsy-' + gravity);
                $tip.find('.tipsy-arrow')[0].className = 'tipsy-arrow tipsy-arrow-' + gravity.charAt(0);
                if (this.options.className) {
                    $tip.addClass(maybeCall(this.options.className, this.$element[0]));
                }
                if (this.options.fade) {
                    $tip.stop().css({opacity: 0, display: 'block', visibility: 'visible'}).animate({opacity: this.options.opacity});
                } else {
                    $tip.css({visibility: 'visible', opacity: this.options.opacity});
                }
            }
        },
        hide: function() {
            if (this.options.fade) {
                this.tip().stop().fadeOut(function() { $(this).remove(); });
            } else {
                this.tip().remove();
            }
        },
        fixTitle: function() {
            var $e = this.$element;
            if ($e.attr('title') || typeof($e.attr('original-title')) != 'string') {
                $e.attr('original-title', $e.attr('title') || '').removeAttr('title');
            }
        },
        getTitle: function() {
            var title, $e = this.$element, o = this.options;
            this.fixTitle();
            var title, o = this.options;
            if (typeof o.title == 'string') {
                title = $e.attr(o.title == 'title' ? 'original-title' : o.title);
            } else if (typeof o.title == 'function') {
                title = o.title.call($e[0]);
            }
            title = ('' + title).replace(/(^\s*|\s*$)/, "");
            return title || o.fallback;
        },
        tip: function() {
            if (!this.$tip) {
                this.$tip = $('<div class="tipsy"></div>').html('<div class="tipsy-arrow"></div><div class="tipsy-inner"></div>');
            }
            return this.$tip;
        },
        validate: function() {
            if (!this.$element[0].parentNode) {
                this.hide();
                this.$element = null;
                this.options = null;
            }
        },
        enable: function() { this.enabled = true; },
        disable: function() { this.enabled = false; },
        toggleEnabled: function() { this.enabled = !this.enabled; }
    };
    $.fn.tipsy = function(options) {
        if (options === true) {
            return this.data('tipsy');
        } else if (typeof options == 'string') {
            var tipsy = this.data('tipsy');
            if (tipsy) tipsy[options]();
            return this;
        }
        options = $.extend({}, $.fn.tipsy.defaults, options);
        function get(ele) {
            var tipsy = $.data(ele, 'tipsy');
            if (!tipsy) {
                tipsy = new Tipsy(ele, $.fn.tipsy.elementOptions(ele, options));
                $.data(ele, 'tipsy', tipsy);
            }
            return tipsy;
        }
        function enter() {
            var tipsy = get(this);
            tipsy.hoverState = 'in';
            if (options.delayIn == 0) {
                tipsy.show();
            } else {
                tipsy.fixTitle();
                setTimeout(function() { if (tipsy.hoverState == 'in') tipsy.show(); }, options.delayIn);
            }
        };
        function leave() {
            var tipsy = get(this);
            tipsy.hoverState = 'out';
            if (options.delayOut == 0) {
                tipsy.hide();
            } else {
                setTimeout(function() { if (tipsy.hoverState == 'out') tipsy.hide(); }, options.delayOut);
            }
        };
        if (!options.live) this.each(function() { get(this); });
        if (options.trigger != 'manual') {
            var binder   = options.live ? 'live' : 'bind',
                eventIn  = options.trigger == 'hover' ? 'mouseenter' : 'focus',
                eventOut = options.trigger == 'hover' ? 'mouseleave' : 'blur';
            this[binder](eventIn, enter)[binder](eventOut, leave);
        }
        return this;
    };
    $.fn.tipsy.defaults = {
        className: null,
        delayIn: 0,
        delayOut: 0,
        fade: false,
        fallback: '',
        gravity: 'n',
        html: false,
        live: false,
        offset: 0,
        opacity: 0.8,
        title: 'title',
        trigger: 'hover'
    };
    // Overwrite this method to provide options on a per-element basis.
    // For example, you could store the gravity in a 'tipsy-gravity' attribute:
    // return $.extend({}, options, {gravity: $(ele).attr('tipsy-gravity') || 'n' });
    // (remember - do not modify 'options' in place!)
    $.fn.tipsy.elementOptions = function(ele, options) {
        return $.metadata ? $.extend({}, options, $(ele).metadata()) : options;
    };
    $.fn.tipsy.autoNS = function() {
        return $(this).offset().top > ($(document).scrollTop() + $(window).height() / 2) ? 's' : 'n';
    };
    $.fn.tipsy.autoWE = function() {
        return $(this).offset().left > ($(document).scrollLeft() + $(window).width() / 2) ? 'e' : 'w';
    };
    /**
     * yields a closure of the supplied parameters, producing a function that takes
     * no arguments and is suitable for use as an autogravity function like so:
     *
     * @param margin (int) - distance from the viewable region edge that an
     *        element should be before setting its tooltip's gravity to be away
     *        from that edge.
     * @param prefer (string, e.g. 'n', 'sw', 'w') - the direction to prefer
     *        if there are no viewable region edges effecting the tooltip's
     *        gravity. It will try to vary from this minimally, for example,
     *        if 'sw' is preferred and an element is near the right viewable
     *        region edge, but not the top edge, it will set the gravity for
     *        that element's tooltip to be 'se', preserving the southern
     *        component.
     */
     $.fn.tipsy.autoBounds = function(margin, prefer) {
        return function() {
            var dir = {ns: prefer[0], ew: (prefer.length > 1 ? prefer[1] : false)},
                boundTop = $(document).scrollTop() + margin,
                boundLeft = $(document).scrollLeft() + margin,
                $this = $(this);
            if ($this.offset().top < boundTop) dir.ns = 'n';
            if ($this.offset().left < boundLeft) dir.ew = 'w';
            if ($(window).width() + $(document).scrollLeft() - $this.offset().left < margin) dir.ew = 'e';
            if ($(window).height() + $(document).scrollTop() - $this.offset().top < margin) dir.ns = 's';
            return dir.ns + (dir.ew ? dir.ew : '');
        }
    };
})(jQuery);
(function( $ ) {
    $.widget( "ui.combobox", {
        _create: function() {
            var elwidth = this.element.width();
            var elheight = this.element.height();
            var input,
                self = this,
                select = this.element,
                internal = false,
                selected = select.children( ":selected" ),
                value = selected.val() ? selected.text() : "",
                wrapper = this.wrapper = $( "<span>" )
                    .addClass( "ui-combobox" )
                    .insertAfter( select );
            input = $( "<input>" ).css( { "width": (select.is(':visible') ? (elwidth > 15 ? elwidth - 15 : 1) : 350), "height": (elheight > 0 ? elheight : 16) });
            select.hide();
            input.appendTo( wrapper )
                .val( value )
                .addClass( "ui-state-default ui-combobox-input" )
                .autocomplete({
                    delay: 0,
                    minLength: 0,
                    source: function( request, response ) {
                        var matcher = new RegExp( $.ui.autocomplete.escapeRegex(request.term), "i" );
                        response( select.children( "option" ).map(function() {
                            var text = $( this ).text();
                            //if ( this.value && ( !request.term || matcher.test(text) ) )
                            if ( (!request.term || matcher.test(text)) && $(this).css('display') != 'none' )
                                return {
                                    label: (text == "" ? "&nbsp;" : text.replace(
                                        new RegExp(
                                            "(?![^&;]+;)(?!<[^<>]*)(" +
                                            $.ui.autocomplete.escapeRegex(request.term) +
                                            ")(?![^<>]*>)(?![^&;]+;)", "gi"
                                        ), "<strong>$1</strong>" )),
                                    'value': (text ? text : ''),
                                    'class': (select.hasClass('flags') ? 'country-' + ($(this).val() ? $(this).val().toUpperCase() : '') : $(this).attr('class')),
                                    option: this
                                };
                        }) );
                    },
                    select: function( event, ui ) {
                        ui.item.option.selected = true;
                        self._trigger( "selected", event, {
                            item: ui.item.option
                        });
                        if((select.onchange || false) && typeof select.onchange == 'function') {
                            select.onchange( { target: select } );
                        } else if($(select).attr('onchange')) {
                            eval($(select).attr('onchange'));
                        } else {
                            if(!ui.item.internal) {
                                internal = true;
                                $(select).change();
                            }
                        }
                        if (jQuery(".panel #Filter").length > 0) {
                            jQuery(".panel #Filter").trigger('click');
                        }
                    },
                    change: function( event, ui ) {
                        if ( !ui.item ) {
                            var matcher = new RegExp( "" + $.ui.autocomplete.escapeRegex( $(this).val() ) + "", "i" ),
                                matchtext = $(this).val();
                                valid = false;
                            select.children( "option" ).each(function() {
                                if( (($(this).text() == "" && matchtext == "") || $( this ).text().match( matcher )) && $(this).css('display') != 'none' ) {
                                    select.val($(this).val());
                                    this.selected = valid = true;
                                    return false;
                                }
                            });
                            if ( !valid ) {
                                // remove invalid value, as it didn't match anything
                                $( this ).val( "" );
                                select.val( "" );
                                input.data( "autocomplete" ).term = "";
                                return false;
                            }
                        }
                    }
                })
                .keypress(function(event) {
                    if(select.attr('disabled')) {
                        event.preventDefault();
                        return false;
                    }
                    if(event.keyCode == 13) {
                        event.preventDefault();
                        var matcher = new RegExp( "" + $.ui.autocomplete.escapeRegex( $(this).val() ) + "", "i" ),
                            matchtext = $(this).val();
                            valid = false,
                            selected = false;
                        select.children( "option" ).each(function() {
                            if( (($(this).val() == "" && matchtext == "") || $( this ).text().match( matcher )) && $(this).css('display') != 'none' ) {
                                valid = true;
                                selected = $(this);
                                return false;
                            }
                        });
                        if(!valid) return false;
                        $(this).autocomplete('option','select').call($(this), event, { item: { option: selected.get(0), internal: true } });
                    }
                })
                .addClass( "ui-widget ui-widget-content ui-corner-left" )
                .click(function() {
                    if(select.attr('disabled')) {
                        event.preventDefault();
                        return false;
                    }
                    // close if already visible
                    if ( input.autocomplete( "widget" ).is( ":visible" ) ) {
                        //input.autocomplete( "close" );
                        return;
                    }
                    // pass empty string as value to search for, displaying all results
                    input.autocomplete( "search", "" );
                    input.focus();
                });
            if(select.hasClass('flags')) input.addClass('flags');
            input.data( "autocomplete" )._renderItem = function( ul, item ) {
                var el = $( "<li></li>" )
                    .data( "item.autocomplete", item )
                    .append( "<a>" + item.label + "</a>" )
                    .appendTo( ul );
                if(item && item['class'] && el) el.addClass(item['class']);
                return el;
            };
            select.change(function(e) {
                if(internal == true) {
                    internal = false;
                    return;
                }
                var matchtext = $(this).val().toLowerCase();
                    valid = false,
                    selected = false,
                    selected_val = "";
                select.children( "option" ).each(function() {
                    if( (($(this).val() == "" && matchtext == "") || $( this ).val().toLowerCase() == matchtext) && $(this).css('display') != 'none' ) {
                        valid = true;
                        selected = $(this);
                        selected_val = $(this).text();
                        return false;
                    }
                });
                if(!valid) return false;
                input.val(selected_val).autocomplete('option','select').call(input, (e ? e : {target: select}), { item: { option: selected.get(0), internal: true } });
            });
            $( "<a>" )
                .attr( "tabIndex", -1 )
                .attr( "title", "Show All Items" )
                .appendTo( wrapper )
                .button({
                    icons: {
                        primary: "ui-icon-triangle-1-s"
                    },
                    text: false
                })
                .removeClass( "ui-corner-all" )
                .addClass( "ui-corner-right ui-combobox-toggle" )
                .css( { "width": 15, "height": (elheight > 0 ? elheight : 16) })
                .click(function() {
                    if(select.attr('disabled')) {
                        event.preventDefault();
                        return false;
                    }
                    // close if already visible
                    if ( input.autocomplete( "widget" ).is( ":visible" ) ) {
                        input.autocomplete( "close" );
                        return;
                    }
                    // work around a bug (likely same cause as #5265)
                    $( this ).blur();
                    // pass empty string as value to search for, displaying all results
                    input.autocomplete( "search", "" );
                    input.focus();
                });
        },
        destroy: function() {
            this.wrapper.remove();
            this.element.show();
            $.Widget.prototype.destroy.call( this );
        }
    });
})( jQuery );
interface/web/js/scrigo.js.php
@@ -123,7 +123,7 @@
                                                reportError('Ajax Request was not successful.'+pagename);
                                            }
                                        });
      setTimeout( "loadContentRefresh('"+pagename+"&refresh="+document.getElementById('refreshinterval').value+"')", document.getElementById('refreshinterval').value*1000 );
      setTimeout( "loadContentRefresh('"+pagename+"&refresh="+document.getElementById('refreshinterval').value+"')", document.getElementById('refreshinterval').value*1000*60 );
  }
}
interface/web/login/lib/lang/en.lng
@@ -7,13 +7,11 @@
$wb['pw_reset']             = 'The password has been reset and send to your email address.';
$wb['pw_error']             = 'Username or email address does not match.';
$wb['pw_error_noinput']     = 'Please enter email address and username.';
$wb['pw_reset_mail_msg']    = 'The password to your ISPConfig 3 control panel account has been reset. The new password is: ';
$wb['pw_reset_mail_title']  = 'ISPConfig 3 Control panel password has been reset.';
$wb['user_regex_error'] = 'Username contains unallowed characters or is longer than 64 characters.';
$wb['pw_error_length']  = 'The password length is > 64 characters.';
$wb['email_error'] = 'Email contains unallowed characters or has a invalid format.';
$wb['login_txt']    = "Login";
$wb['username_txt']    = "Username";
$wb['password_txt']    = "Password";
@@ -23,9 +21,7 @@
$wb['pw_button_txt']    = "Resend password";
$wb['email_txt']    = "Email";
$wb['back_txt'] = 'Back';
$wb['error_maintenance_mode'] = 'This ISPConfig installation is currently under maintenance. We should be back shortly. Thank you for your patience.';
$wb['theme_not_compatible'] = 'The chosen theme is not compatible with the current ISPConfig version. Please check for a new version of the theme.<br />The default theme as been activated automatically.';
$wb['stay_logged_in_txt'] = 'Keep me logged in';
?>
interface/web/mail/form/mail_user.tform.php
@@ -160,7 +160,7 @@
                    'type' => 'TOLOWER')
            ),
            'validators' => array (  0 => array ( 'type' => 'REGEX',
                    'regex' => '/^(\w+[\w\.\-\+]*\w{0,}@\w+[\w.-]*\.[a-z\-]{2,10}){0,1}$/i',
                    'regex' => '/^(\w+[\w\.\-\+]*\w{0,}@\w+[\w.-]*\.[a-z\-]{2,10}){0,1}(,\s*\w+[\w\.\-\+]*\w{0,}@\w+[\w.-]*\.[a-z\-]{2,10}){0,}$/i',
                    'errmsg'=> 'cc_error_isemail'),
            ),
            'default' => '',
interface/web/mail/lib/lang/de_mail_user.lng
@@ -16,7 +16,7 @@
$wb['server_id_txt'] = 'Server ID';
$wb['password_txt'] = 'Passwort';
$wb['maildir_txt'] = 'E-Mail Verzeichnis';
$wb['postfix_txt'] = 'Aktiviere Empfang';
$wb['postfix_txt'] = 'Aktiviere SMTP (in/out)';
$wb['access_txt'] = 'Aktiviere Zugriff';
$wb['policy_txt'] = 'Spamfilter';
$wb['no_policy'] = '- nicht aktiviert -';
@@ -54,5 +54,5 @@
$wb['daily_backup_txt'] = 'taeglich';
$wb['weekly_backup_txt'] = 'woechentlich';
$wb['monthly_backup_txt'] = 'monatlich';
$wb['cc_note_txt'] = '(Mehrere E-Mail-Adressen mit Kommas trennen)';
?>
interface/web/mail/lib/lang/en_mail_user.lng
@@ -21,7 +21,7 @@
$wb["server_id_txt"] = 'Aerver_id';
$wb["password_txt"] = 'Password';
$wb["maildir_txt"] = 'Maildir';
$wb["postfix_txt"] = 'Enable Receiving';
$wb["postfix_txt"] = 'Enable SMTP (in/out)';
$wb["access_txt"] = 'Enable Access';
$wb["policy_txt"] = 'Spamfilter';
$wb["no_policy"] = '- not enabled -';
@@ -54,4 +54,5 @@
$wb['weekly_backup_txt'] = 'Weekly';
$wb['monthly_backup_txt'] = 'Monthly';
$wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.';
$wb['cc_note_txt'] = '(Separate multiple email addresses with commas)';
?>
interface/web/mail/templates/mail_mailinglist_edit.htm
@@ -60,7 +60,7 @@
            </tmpl_if>
            <div class="ctrlHolder">
                <label for="password">{tmpl_var name='password_txt'}</label>
                <input name="password" id="password" value="{tmpl_var name='password'}" size="30" maxlength="255" type="password" class="textInput" onkeyup="pass_check(this.value);checkPassMatch('password','repeat_password');" />&nbsp;<a href="javascript:void(0);" onclick="generatePassword('password','repeat_password');">{tmpl_var name='generate_password_txt'}</a>
                <input name="password" id="password" value="{tmpl_var name='password'}" size="30" maxlength="255" type="password" class="textInput" autocomplete="off" onkeyup="pass_check(this.value);checkPassMatch('password','repeat_password');" />&nbsp;<a href="javascript:void(0);" onclick="generatePassword('password','repeat_password');">{tmpl_var name='generate_password_txt'}</a>
            </div>
            <div class="ctrlHolder">
                <p class="label">{tmpl_var name='password_strength_txt'}</p>
@@ -69,7 +69,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="repeat_password">{tmpl_var name='repeat_password_txt'}</label>
                <input name="repeat_password" id="repeat_password" value="" size="15" maxlength="100" type="password" class="textInput" style="width:100px;"  onkeyup="checkPassMatch('password','repeat_password');" />
                <input name="repeat_password" id="repeat_password" value="" size="15" maxlength="100" type="password" class="textInput" style="width:100px;" autocomplete="off" onkeyup="checkPassMatch('password','repeat_password');" />
            </div>
            <div id="confirmpasswordError" style="display:none;" class="confirmpassworderror">{tmpl_var name='password_mismatch_txt'}</div>
            <div id="confirmpasswordOK" style="display:none;" class="confirmpasswordok">{tmpl_var name='password_match_txt'}</div>
interface/web/mail/templates/mail_user_mailbox_edit.htm
@@ -23,7 +23,7 @@
                </div></tmpl_if>
            <div class="ctrlHolder">
                <label for="password">{tmpl_var name='password_txt'}</label>
                <input name="password" id="password" value="{tmpl_var name='password'}" size="30" maxlength="255" type="password" class="textInput" onkeyup="pass_check(this.value);checkPassMatch('password','repeat_password');" />&nbsp;<a href="javascript:void(0);" onclick="generatePassword('password','repeat_password');">{tmpl_var name='generate_password_txt'}</a>
                <input name="password" id="password" value="{tmpl_var name='password'}" size="30" maxlength="255" type="password" class="textInput" autocomplete="off" onkeyup="pass_check(this.value);checkPassMatch('password','repeat_password');" />&nbsp;<a href="javascript:void(0);" onclick="generatePassword('password','repeat_password');">{tmpl_var name='generate_password_txt'}</a>
            </div>
            <div class="ctrlHolder">
                <p class="label">{tmpl_var name='password_strength_txt'}</p>
@@ -32,7 +32,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="repeat_password">{tmpl_var name='repeat_password_txt'}</label>
                <input name="repeat_password" id="repeat_password" value="" size="15" maxlength="100" type="password" class="textInput" style="width:100px;"  onkeyup="checkPassMatch('password','repeat_password');" />
                <input name="repeat_password" id="repeat_password" value="" size="15" maxlength="100" type="password" class="textInput" style="width:100px;" autocomplete="off" onkeyup="checkPassMatch('password','repeat_password');" />
            </div>
            <div id="confirmpasswordError" style="display:none;" class="confirmpassworderror">{tmpl_var name='password_mismatch_txt'}</div>
            <div id="confirmpasswordOK" style="display:none;" class="confirmpasswordok">{tmpl_var name='password_match_txt'}</div>
@@ -42,7 +42,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="name">{tmpl_var name='cc_txt'}</label>
                <input name="cc" id="cc" value="{tmpl_var name='cc'}" size="30" maxlength="255" type="text" class="textInput" /> &nbsp; {tmpl_var name='name_optional_txt'}
                <input name="cc" id="cc" value="{tmpl_var name='cc'}" size="30" maxlength="255" type="text" class="textInput" /> &nbsp; {tmpl_var name='name_optional_txt'} {tmpl_var name='cc_note_txt'}
            </div>
            <div class="ctrlHolder">
                <label for="policy">{tmpl_var name='policy_txt'}</label>
interface/web/mailuser/form/mail_user_cc.tform.php
@@ -69,7 +69,8 @@
                    'type' => 'TOLOWER')
            ),
            'validators' => array (  0 => array ( 'type' => 'REGEX',
                    'regex' => '/^(\w+[\w\.\-\+]*\w{0,}@\w+[\w.-]*\w+\.[a-z\-]{2,10}){0,1}$/i',
                    //'regex' => '/^(\w+[\w\.\-\+]*\w{0,}@\w+[\w.-]*\w+\.[a-z\-]{2,10}){0,1}$/i',
                    'regex' => '/^(\w+[\w\.\-\+]*\w{0,}@\w+[\w.-]*\.[a-z\-]{2,10}){0,1}(,\s*\w+[\w\.\-\+]*\w{0,}@\w+[\w.-]*\.[a-z\-]{2,10}){0,}$/i',
                    'errmsg'=> 'cc_error_isemail'),
            ),
            'default' => '',
interface/web/mailuser/lib/lang/de_mail_user_cc.lng
@@ -4,4 +4,6 @@
$wb['email_txt'] = 'E-Mail';
$wb['cc_error_isemail'] = 'E-Mail Adresse ungültig im -Kopie senden an- Feld';
$wb['email_is_cc_error'] = 'E-Mail Adresse und ';
$wb['name_optional_txt'] = '(optional)';
$wb['cc_note_txt'] = '(Mehrere E-Mail-Adressen mit Kommas trennen)';
?>
interface/web/mailuser/lib/lang/en_mail_user_cc.lng
@@ -4,4 +4,6 @@
$wb["email_txt"] = 'Email';
$wb["cc_error_isemail"] = 'Email address invalid in -Send copy to- field';
$wb["email_is_cc_error"] = 'Email address and send copy to address can not be the same.';
$wb["name_optional_txt"] = '(Optional)';
$wb['cc_note_txt'] = '(Separate multiple email addresses with commas)';
?>
interface/web/mailuser/mail_user_spamfilter_edit.php
@@ -51,7 +51,8 @@
class page_action extends tform_actions {
    function onShow() {
        global $app;
        $this->id = $app->functions->intval($_SESSION['s']['user']['mailuser_id']);
        parent::onShow();
interface/web/mailuser/templates/mail_user_cc_edit.htm
@@ -11,7 +11,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="name">{tmpl_var name='cc_txt'}</label>
                <input name="cc" id="cc" value="{tmpl_var name='cc'}" size="30" maxlength="255" type="text" class="textInput" /> &nbsp; {tmpl_var name='name_optional_txt'}
                <input name="cc" id="cc" value="{tmpl_var name='cc'}" size="30" maxlength="255" type="text" class="textInput" /> &nbsp; {tmpl_var name='name_optional_txt'} {tmpl_var name='cc_note_txt'}
            </div>
        </fieldset>
interface/web/mailuser/templates/mail_user_password_edit.htm
@@ -11,7 +11,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="password">{tmpl_var name='password_txt'}</label>
                <input name="password" id="password" value="{tmpl_var name='password'}" size="30" maxlength="255" type="password" class="textInput" onkeyup="pass_check(this.value);checkPassMatch('password','repeat_password');" />&nbsp;<a href="javascript:void(0);" onclick="generatePassword('password','repeat_password');">{tmpl_var name='generate_password_txt'}</a>
                <input name="password" id="password" value="{tmpl_var name='password'}" size="30" maxlength="255" type="password" class="textInput" autocomplete="off" onkeyup="pass_check(this.value);checkPassMatch('password','repeat_password');" />&nbsp;<a href="javascript:void(0);" onclick="generatePassword('password','repeat_password');">{tmpl_var name='generate_password_txt'}</a>
            </div>
            <div class="ctrlHolder">
                <p class="label">{tmpl_var name='password_strength_txt'}</p>
@@ -20,7 +20,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="repeat_password">{tmpl_var name='repeat_password_txt'}</label>
                <input name="repeat_password" id="repeat_password" value="" size="15" maxlength="100" type="password" class="textInput" style="width:100px;"  onkeyup="checkPassMatch('password','repeat_password');" />
                <input name="repeat_password" id="repeat_password" value="" size="15" maxlength="100" type="password" class="textInput" style="width:100px;" autocomplete="off" onkeyup="checkPassMatch('password','repeat_password');" />
            </div>
            <div id="confirmpasswordError" style="display:none;" class="confirmpassworderror">{tmpl_var name='password_mismatch_txt'}</div>
            <div id="confirmpasswordOK" style="display:none;" class="confirmpasswordok">{tmpl_var name='password_match_txt'}</div>
interface/web/sites/aps_install_package.php
@@ -86,7 +86,7 @@
$domains = array();
$domain_for_user = '';
if(!$adminflag) $domain_for_user = "AND (sys_userid = '".$app->db->quote($_SESSION['s']['user']['userid'])."'
    OR sys_groupid = '".$app->db->quote($_SESSION['s']['user']['userid'])."' )";
    OR sys_groupid = '".$app->db->quote($_SESSION['s']['user']['default_group'])."' )";
$domains_assoc = $app->db->queryAllRecords("SELECT domain FROM web_domain WHERE document_root != '' AND (type = 'vhost' OR type = 'vhostsubdomain' OR type = 'vhostalias') AND active = 'y' ".$domain_for_user." ORDER BY domain;");
if(!empty($domains_assoc)) foreach($domains_assoc as $domain) $domains[] = $domain['domain'];
interface/web/sites/lib/lang/en_web_vhost_domain.lng
@@ -132,5 +132,5 @@
$wb['web_folder_unique_txt'] = 'The web folder is already used, please choose a different one.';
$wb['host_txt'] = 'Hostname';
$wb['domain_error_wildcard'] = 'Wildcard subdomains are not allowed.';
$wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.';
?>
interface/web/sites/shell_user_edit.php
@@ -169,7 +169,6 @@
        $sql = "UPDATE shell_user SET server_id = $server_id, dir = '$dir', puser = '$uid', pgroup = '$gid', sys_groupid = '$sys_groupid' WHERE shell_user_id = ".$this->id;
        $app->db->query($sql);
        die($sql);
    }
interface/web/sites/templates/database_user_edit.htm
@@ -28,7 +28,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="database_password">{tmpl_var name='database_password_txt'}</label>
                <input name="database_password" id="database_password" value="{tmpl_var name='database_password'}" size="30" maxlength="255" type="password" class="textInput formLengthHalf" onkeyup="pass_check(this.value);checkPassMatch('database_password','repeat_password');" />&nbsp;<a href="javascript:void(0);" onclick="generatePassword('database_password','repeat_password');">{tmpl_var name='generate_password_txt'}</a>
                <input name="database_password" id="database_password" value="{tmpl_var name='database_password'}" size="30" maxlength="255" type="password" class="textInput formLengthHalf" autocomplete="off" onkeyup="pass_check(this.value);checkPassMatch('database_password','repeat_password');" />&nbsp;<a href="javascript:void(0);" onclick="generatePassword('database_password','repeat_password');">{tmpl_var name='generate_password_txt'}</a>
            </div>
            <div class="ctrlHolder">
                <p class="label">{tmpl_var name='password_strength_txt'}</p>
@@ -37,7 +37,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="repeat_password">{tmpl_var name='repeat_password_txt'}</label>
                <input name="repeat_password" id="repeat_password" value="" size="30" maxlength="100" type="password" class="textInput formLengthHalf"  onkeyup="checkPassMatch('database_password','repeat_password');" />
                <input name="repeat_password" id="repeat_password" value="" size="30" maxlength="100" type="password" class="textInput formLengthHalf" autocomplete="off" onkeyup="checkPassMatch('database_password','repeat_password');" />
            </div>
            <div id="confirmpasswordError" style="display:none;" class="confirmpassworderror">{tmpl_var name='password_mismatch_txt'}</div>
            <div id="confirmpasswordOK" style="display:none;" class="confirmpasswordok">{tmpl_var name='password_match_txt'}</div>
interface/web/sites/templates/ftp_user_edit.htm
@@ -18,7 +18,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="password">{tmpl_var name='password_txt'}</label>
                <input name="password" id="password" value="{tmpl_var name='password'}" size="30" maxlength="255" type="password" class="textInput" onkeyup="pass_check(this.value);checkPassMatch('password','repeat_password');" />&nbsp;<a href="javascript:void(0);" onclick="generatePassword('password','repeat_password');">{tmpl_var name='generate_password_txt'}</a>
                <input name="password" id="password" value="{tmpl_var name='password'}" size="30" maxlength="255" type="password" class="textInput" autocomplete="off" onkeyup="pass_check(this.value);checkPassMatch('password','repeat_password');" />&nbsp;<a href="javascript:void(0);" onclick="generatePassword('password','repeat_password');">{tmpl_var name='generate_password_txt'}</a>
            </div>
            <div class="ctrlHolder">
                <p class="label">{tmpl_var name='password_strength_txt'}</p>
@@ -27,7 +27,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="repeat_password">{tmpl_var name='repeat_password_txt'}</label>
                <input name="repeat_password" id="repeat_password" value="" size="15" maxlength="100" type="password" class="textInput" style="width:100px;"  onkeyup="checkPassMatch('password','repeat_password');" />
                <input name="repeat_password" id="repeat_password" value="" size="15" maxlength="100" type="password" class="textInput" style="width:100px;" autocomplete="off" onkeyup="checkPassMatch('password','repeat_password');" />
            </div>
            <div id="confirmpasswordError" style="display:none;" class="confirmpassworderror">{tmpl_var name='password_mismatch_txt'}</div>
            <div id="confirmpasswordOK" style="display:none;" class="confirmpasswordok">{tmpl_var name='password_match_txt'}</div>
interface/web/sites/templates/shell_user_edit.htm
@@ -26,7 +26,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="password">{tmpl_var name='password_txt'}</label>
                <input name="password" id="password" value="{tmpl_var name='password'}" size="30" maxlength="255" type="password" class="textInput" onkeyup="pass_check(this.value);checkPassMatch('password','repeat_password');"/>&nbsp;<a href="javascript:void(0);" onclick="generatePassword('password','repeat_password');">{tmpl_var name='generate_password_txt'}</a>
                <input name="password" id="password" value="{tmpl_var name='password'}" size="30" maxlength="255" type="password" class="textInput" autocomplete="off" onkeyup="pass_check(this.value);checkPassMatch('password','repeat_password');"/>&nbsp;<a href="javascript:void(0);" onclick="generatePassword('password','repeat_password');">{tmpl_var name='generate_password_txt'}</a>
            </div>
            <div class="ctrlHolder">
                <p class="label">{tmpl_var name='password_strength_txt'}</p>
@@ -35,7 +35,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="repeat_password">{tmpl_var name='repeat_password_txt'}</label>
                <input name="repeat_password" id="repeat_password" value="" size="15" maxlength="100" type="password" class="textInput" style="width:100px;"  onkeyup="checkPassMatch('password','repeat_password');" />
                <input name="repeat_password" id="repeat_password" value="" size="15" maxlength="100" type="password" class="textInput" style="width:100px;" autocomplete="off" onkeyup="checkPassMatch('password','repeat_password');" />
            </div>
            <div id="confirmpasswordError" style="display:none;" class="confirmpassworderror">{tmpl_var name='password_mismatch_txt'}</div>
            <div id="confirmpasswordOK" style="display:none;" class="confirmpasswordok">{tmpl_var name='password_match_txt'}</div>
interface/web/sites/templates/web_folder_user_edit.htm
@@ -17,7 +17,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="password">{tmpl_var name='password_txt'}</label>
                <input name="password" id="password" value="{tmpl_var name='password'}" size="30" maxlength="255" type="password" class="textInput" onkeyup="pass_check(this.value);checkPassMatch('password','repeat_password');" />&nbsp;<a href="javascript:void(0);" onclick="generatePassword('password','repeat_password');">{tmpl_var name='generate_password_txt'}</a>
                <input name="password" id="password" value="{tmpl_var name='password'}" size="30" maxlength="255" type="password" class="textInput" autocomplete="off" onkeyup="pass_check(this.value);checkPassMatch('password','repeat_password');" />&nbsp;<a href="javascript:void(0);" onclick="generatePassword('password','repeat_password');">{tmpl_var name='generate_password_txt'}</a>
            </div>
            <div class="ctrlHolder">
                <p class="label">{tmpl_var name='password_strength_txt'}</p>
@@ -26,7 +26,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="repeat_password">{tmpl_var name='repeat_password_txt'}</label>
                <input name="repeat_password" id="repeat_password" value="" size="15" maxlength="100" type="password" class="textInput" style="width:100px;"  onkeyup="checkPassMatch('password','repeat_password');" />
                <input name="repeat_password" id="repeat_password" value="" size="15" maxlength="100" type="password" class="textInput" style="width:100px;" autocomplete="off" onkeyup="checkPassMatch('password','repeat_password');" />
            </div>
            <div id="confirmpasswordError" style="display:none;" class="confirmpassworderror">{tmpl_var name='password_mismatch_txt'}</div>
            <div id="confirmpasswordOK" style="display:none;" class="confirmpasswordok">{tmpl_var name='password_match_txt'}</div>
interface/web/sites/templates/web_vhost_domain_advanced.htm
@@ -88,7 +88,7 @@
            </div>
            <div class="ctrlHolder apache">
                <label for="apache_directives">{tmpl_var name='apache_directives_txt'}</label>
                <textarea name="apache_directives" id="apache_directives" rows='10' cols='50' style="width:400px;">{tmpl_var name='apache_directives'}</textarea>&nbsp;<b>{tmpl_var name="available_apache_directive_snippets_txt"}</b><br><br>&nbsp;{tmpl_var name="apache_directive_snippets_txt"}
                <textarea name="apache_directives" id="apache_directives" rows='10' cols='50' style="width:400px;">{tmpl_var name='apache_directives'}</textarea>&nbsp;<b>{tmpl_var name="available_apache_directive_snippets_txt"}</b><br><br>&nbsp;{tmpl_var name="apache_directive_snippets_txt"}<br>----<br><b>&nbsp;{tmpl_var name='variables_txt'}:</b> <a href="javascript:void(0);" class="addPlaceholder">{DOCROOT}</a>
            </div>
            <div class="ctrlHolder nginx">
                <label for="nginx_directives">{tmpl_var name='nginx_directives_txt'}</label>
interface/web/sites/templates/webdav_user_edit.htm
@@ -26,7 +26,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="password">{tmpl_var name='password_txt'}</label>
                <input name="password" id="password" value="{tmpl_var name='password'}" size="30" maxlength="255" type="password" class="textInput" onkeyup="pass_check(this.value);checkPassMatch('password','repeat_password');"/>&nbsp;<a href="javascript:void(0);" onclick="generatePassword('password','repeat_password');">{tmpl_var name='generate_password_txt'}</a>
                <input name="password" id="password" value="{tmpl_var name='password'}" size="30" maxlength="255" type="password" class="textInput" autocomplete="off" onkeyup="pass_check(this.value);checkPassMatch('password','repeat_password');"/>&nbsp;<a href="javascript:void(0);" onclick="generatePassword('password','repeat_password');">{tmpl_var name='generate_password_txt'}</a>
            </div>
            <div class="ctrlHolder">
                <p class="label">{tmpl_var name='password_strength_txt'}</p>
@@ -35,7 +35,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="repeat_password">{tmpl_var name='repeat_password_txt'}</label>
                <input name="repeat_password" id="repeat_password" value="" size="15" maxlength="100" type="password" class="textInput" style="width:100px;"  onkeyup="checkPassMatch('password','repeat_password');" />
                <input name="repeat_password" id="repeat_password" value="" size="15" maxlength="100" type="password" class="textInput" style="width:100px;" autocomplete="off" onkeyup="checkPassMatch('password','repeat_password');" />
            </div>
            <div id="confirmpasswordError" style="display:none;" class="confirmpassworderror">{tmpl_var name='password_mismatch_txt'}</div>
            <div id="confirmpasswordOK" style="display:none;" class="confirmpasswordok">{tmpl_var name='password_match_txt'}</div>
interface/web/sites/web_vhost_domain_edit.php
@@ -719,6 +719,14 @@
        /* check if the domain module is used - and check if the selected domain can be used! */
        if($app->tform->getCurrentTab() == 'domain') {
            if($this->_vhostdomain_type == 'subdomain') {
                // Check that domain (the subdomain part) is not empty
                if(!preg_match('/^[a-zA-Z0-9].*/',$this->dataRecord['domain'])) {
                    $app->tform->errorMessage .= $app->tform->lng("subdomain_error_empty")."<br />";
                }
            }
            /* check if the domain module is used - and check if the selected domain can be used! */
            $app->uses('ini_parser,getconf');
            $settings = $app->getconf->get_global_config('domains');
            if ($settings['use_domain_module'] == 'y') {
@@ -769,15 +777,15 @@
            $client['web_servers_ids'] = explode(',', $client['web_servers']);
            if($client['limit_cgi'] != 'y') $this->dataRecord['cgi'] = '-';
            if($client['limit_ssi'] != 'y') $this->dataRecord['ssi'] = '-';
            if($client['limit_perl'] != 'y') $this->dataRecord['perl'] = '-';
            if($client['limit_ruby'] != 'y') $this->dataRecord['ruby'] = '-';
            if($client['limit_python'] != 'y') $this->dataRecord['python'] = '-';
            if($client['limit_cgi'] != 'y') $this->dataRecord['cgi'] = 'n';
            if($client['limit_ssi'] != 'y') $this->dataRecord['ssi'] = 'n';
            if($client['limit_perl'] != 'y') $this->dataRecord['perl'] = 'n';
            if($client['limit_ruby'] != 'y') $this->dataRecord['ruby'] = 'n';
            if($client['limit_python'] != 'y') $this->dataRecord['python'] = 'n';
            if($client['force_suexec'] == 'y') $this->dataRecord['suexec'] = 'y';
            if($client['limit_hterror'] != 'y') $this->dataRecord['errordocs'] = '-';
            if($client['limit_wildcard'] != 'y' && $this->dataRecord['subdomain'] == '*') $this->dataRecord['subdomain'] = '-';
            if($client['limit_ssl'] != 'y') $this->dataRecord['ssl'] = '-';
            if($client['limit_hterror'] != 'y') $this->dataRecord['errordocs'] = 'n';
            if($client['limit_wildcard'] != 'y' && $this->dataRecord['subdomain'] == '*') $this->dataRecord['subdomain'] = 'n';
            if($client['limit_ssl'] != 'y') $this->dataRecord['ssl'] = 'n';
            // only generate quota and traffic warnings if value has changed
            if($this->id > 0) {
@@ -867,15 +875,15 @@
                $this->dataRecord['web_folder'] = $tmp['web_folder']; // cannot be changed!
                // set the settings to current if not provided (or cleared due to limits)
                if($this->dataRecord['cgi'] == '-') $this->dataRecord['cgi'] = $tmp['cgi'];
                if($this->dataRecord['ssi'] == '-') $this->dataRecord['ssi'] = $tmp['ssi'];
                if($this->dataRecord['perl'] == '-') $this->dataRecord['perl'] = $tmp['perl'];
                if($this->dataRecord['ruby'] == '-') $this->dataRecord['ruby'] = $tmp['ruby'];
                if($this->dataRecord['python'] == '-') $this->dataRecord['python'] = $tmp['python'];
                if($this->dataRecord['suexec'] == '-') $this->dataRecord['suexec'] = $tmp['suexec'];
                if($this->dataRecord['errordocs'] == '-') $this->dataRecord['errordocs'] = $tmp['errordocs'];
                if($this->dataRecord['subdomain'] == '-') $this->dataRecord['subdomain'] = $tmp['subdomain'];
                if($this->dataRecord['ssl'] == '-') $this->dataRecord['ssl'] = $tmp['ssl'];
                if($this->dataRecord['cgi'] == 'n') $this->dataRecord['cgi'] = $tmp['cgi'];
                if($this->dataRecord['ssi'] == 'n') $this->dataRecord['ssi'] = $tmp['ssi'];
                if($this->dataRecord['perl'] == 'n') $this->dataRecord['perl'] = $tmp['perl'];
                if($this->dataRecord['ruby'] == 'n') $this->dataRecord['ruby'] = $tmp['ruby'];
                if($this->dataRecord['python'] == 'n') $this->dataRecord['python'] = $tmp['python'];
                if($this->dataRecord['suexec'] == 'n') $this->dataRecord['suexec'] = $tmp['suexec'];
                if($this->dataRecord['errordocs'] == 'n') $this->dataRecord['errordocs'] = $tmp['errordocs'];
                if($this->dataRecord['subdomain'] == 'n') $this->dataRecord['subdomain'] = $tmp['subdomain'];
                if($this->dataRecord['ssl'] == 'n') $this->dataRecord['ssl'] = $tmp['ssl'];
                unset($tmp);
                // When the record is inserted
@@ -1120,7 +1128,6 @@
        }
    }
}
$page = new page_action;
interface/web/tools/lib/lang/de_resync.lng
@@ -9,6 +9,7 @@
$wb['resync_mailbox_txt'] = 'E-Mail Konten';
$wb['resync_dkim_txt'] = 'DKIM-Keys';
$wb['resync_dns_txt'] = 'DNS Einträge';
$wb['resync_client_txt'] = 'Kunden';
$wb['btn_start_txt'] = 'Start';
$wb['btn_cancel_txt'] = 'Zurück';
?>
interface/web/tools/templates/user_settings.htm
@@ -7,7 +7,7 @@
        <fieldset class="inlineLabels">
            <div class="ctrlHolder">
                <label for="passwort">{tmpl_var name='passwort_txt'}</label>
                <input name="passwort" id="passwort" value="{tmpl_var name='passwort'}" size="15" maxlength="100" type="password" class="textInput" onkeyup="pass_check(this.value);checkPassMatch('passwort','repeat_password');"/>&nbsp;<a href="javascript:void(0);" onclick="generatePassword('passwort','repeat_password');">{tmpl_var name='generate_password_txt'}</a>
                <input name="passwort" id="passwort" value="{tmpl_var name='passwort'}" size="15" maxlength="100" type="password" class="textInput" autocomplete="off" onkeyup="pass_check(this.value);checkPassMatch('passwort','repeat_password');"/>&nbsp;<a href="javascript:void(0);" onclick="generatePassword('passwort','repeat_password');">{tmpl_var name='generate_password_txt'}</a>
            </div>
            <div class="ctrlHolder">
                <p class="label">{tmpl_var name='password_strength_txt'}</p>
@@ -16,7 +16,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="repeat_password">{tmpl_var name='repeat_password_txt'}</label>
                <input name="repeat_password" id="repeat_password" value="" size="15" maxlength="100" type="password" class="textInput" style="width:100px;"  onkeyup="checkPassMatch('passwort','repeat_password');" />
                <input name="repeat_password" id="repeat_password" value="" size="15" maxlength="100" type="password" class="textInput" style="width:100px;" autocomplete="off"  onkeyup="checkPassMatch('passwort','repeat_password');" />
            </div>
            <div id="confirmpasswordError" style="display:none;" class="confirmpassworderror">{tmpl_var name='password_mismatch_txt'}</div>
            <div id="confirmpasswordOK" style="display:none;" class="confirmpasswordok">{tmpl_var name='password_match_txt'}</div>
remoting_client/API-docs/sites_database_add.html
@@ -20,6 +20,7 @@
<p class="margin"> <span class="var">$session_id</span>, <span class="var">$client_id</span>, <span class="var">$params</span></p>
<p class="headgrp">Parameters (in <span class="var">$params</span>): </p>
<p class="margin"> server_id&nbsp;&nbsp;(<span class="paratype">int(11)</span>)</p>
<p class="margin"> website_id&nbsp;&nbsp;(<span class="paratype">int(11)</span>)</p>
<p class="margin"> type&nbsp;&nbsp;(<span class="paratype">varchar(16)</span>)</p>
<p class="margin"> database_name&nbsp;&nbsp;(<span class="paratype">varchar(64)</span>)</p>
<p class="margin"> database_user_id&nbsp;&nbsp;(<span class="paratype">int(11)</span>)</p>
remoting_client/API-docs/sites_web_aliasdomain_update.html
@@ -47,6 +47,7 @@
<p class="margin"> ssl_organisation_unit&nbsp;&nbsp;(<span class="paratype">varchar(255)</span>)</p>
<p class="margin"> ssl_country&nbsp;&nbsp;(<span class="paratype">varchar(255)</span>)</p>
<p class="margin"> ssl_domain&nbsp;&nbsp;(<span class="paratype">varchar(255)</span>)</p>
<p class="margin"> ssl_key&nbsp;&nbsp;(<span class="paratype">mediumtext</span>)</p>
<p class="margin"> ssl_request&nbsp;&nbsp;(<span class="paratype">mediumtext</span>)</p>
<p class="margin"> ssl_cert&nbsp;&nbsp;(<span class="paratype">mediumtext</span>)</p>
<p class="margin"> ssl_bundle&nbsp;&nbsp;(<span class="paratype">mediumtext</span>)</p>
remoting_client/API-docs/sites_web_domain_add.html
@@ -47,6 +47,7 @@
<p class="margin"> ssl_organisation_unit&nbsp;&nbsp;(<span class="paratype">varchar(255)</span>)</p>
<p class="margin"> ssl_country&nbsp;&nbsp;(<span class="paratype">varchar(255)</span>)</p>
<p class="margin"> ssl_domain&nbsp;&nbsp;(<span class="paratype">varchar(255)</span>)</p>
<p class="margin"> ssl_key&nbsp;&nbsp;(<span class="paratype">mediumtext</span>)</p>
<p class="margin"> ssl_request&nbsp;&nbsp;(<span class="paratype">mediumtext</span>)</p>
<p class="margin"> ssl_cert&nbsp;&nbsp;(<span class="paratype">mediumtext</span>)</p>
<p class="margin"> ssl_bundle&nbsp;&nbsp;(<span class="paratype">mediumtext</span>)</p>
remoting_client/examples/sites_database_add.php
@@ -19,6 +19,7 @@
    $params = array(
        'server_id' => 1,
        'type' => 'mysql',
        'website_id' => 1,
        'database_name' => 'db_name2',
        'database_user_id' => '1',
        'database_ro_user_id' => '0',
remoting_client/examples/sites_web_domain_add.php
@@ -44,6 +44,7 @@
        'ssl_country' => '',
        'ssl_domain' => '',
        'ssl_request' => '',
        'ssl_key' => '',
        'ssl_cert' => '',
        'ssl_bundle' => '',
        'ssl_action' => '',
@@ -52,6 +53,8 @@
        'allow_override' => 'All',
        'apache_directives' => '',
        'php_open_basedir' => '/',
        'pm_max_requests' => 0,
        'pm_process_idle_timeout' => 10,
        'custom_php_ini' => '',
        'backup_interval' => '',
        'backup_copies' => 1,
server/conf/php-fcgi-starter.master
@@ -13,4 +13,5 @@
<tmpl_if name="security_level" op="==" value="20"> -d open_basedir="<tmpl_var name='open_basedir'>" \
-d upload_tmp_dir=<tmpl_var name='document_root'>/tmp \
-d session.save_path=<tmpl_var name='document_root'>/tmp \
-d sendmail_path="/usr/sbin/sendmail -t -i -fwebmaster@<tmpl_var name='domain'>" \
</tmpl_if> $1
server/conf/php_fpm_pool.conf.master
@@ -32,6 +32,7 @@
<tmpl_var name='enable_php_open_basedir'>php_admin_value[open_basedir] = <tmpl_var name='php_open_basedir'>
php_admin_value[session.save_path] = <tmpl_var name='document_root'>/tmp
php_admin_value[upload_tmp_dir] = <tmpl_var name='document_root'>/tmp
php_admin_value[sendmail_path] = "/usr/sbin/sendmail -t -i -fwebmaster@<tmpl_var name='domain'>"
</tmpl_if>
<tmpl_loop name="custom_php_ini_settings">
server/conf/sieve_filter.master
@@ -2,7 +2,9 @@
<tmpl_if name="cc">
# Send a copy of email to
redirect "<tmpl_var name='cc'>";
<tmpl_loop name="ccloop">
redirect "<tmpl_var name='address'>";
</tmpl_loop>
</tmpl_if>
<tmpl_if name="move_junk" op="==" value="y">
server/conf/sieve_filter_1.2.master
@@ -2,7 +2,9 @@
<tmpl_if name="cc">
# Send a copy of email to
redirect "<tmpl_var name='cc'>";
<tmpl_loop name="ccloop">
redirect "<tmpl_var name='address'>";
</tmpl_loop>
</tmpl_if>
<tmpl_if name="move_junk" op="==" value="y">
server/conf/vhost.conf.master
@@ -142,6 +142,11 @@
                PerlOptions +ParseHeaders
                Options +ExecCGI
            </Directory>
            <Directory {tmpl_var name='web_document_root'}>
                PerlResponseHandler ModPerl::Registry
                PerlOptions +ParseHeaders
                Options +ExecCGI
            </Directory>
            <Files *.pl>
                SetHandler perl-script
            </Files>
@@ -179,7 +184,7 @@
        </IfModule>
</tmpl_if>
        # Clear PHP settings of this website
        <FilesMatch "\.ph(p3?|tml)$">
        <FilesMatch ".+\.ph(p[345]?|t|tml)$">
                SetHandler None
        </FilesMatch>
<tmpl_if name='php' op='==' value='mod'>
@@ -231,7 +236,7 @@
                # FcgidMaxProcesses 1000
                FcgidMaxRequestsPerProcess <tmpl_var name='fastcgi_max_requests'>
                FcgidMinProcessesPerClass 0
                FcgidMaxProcessesPerClass 100
                FcgidMaxProcessesPerClass 10
                FcgidConnectTimeout 3
                FcgidIOTimeout 600
                FcgidBusyTimeout 3600
@@ -250,6 +255,9 @@
        <Directory {tmpl_var name='web_document_root_www'}>
                AddHandler fcgid-script .php .php3 .php4 .php5
                FCGIWrapper <tmpl_var name='fastcgi_starter_path'><tmpl_var name='fastcgi_starter_script'> .php
                FCGIWrapper <tmpl_var name='fastcgi_starter_path'><tmpl_var name='fastcgi_starter_script'> .php3
                FCGIWrapper <tmpl_var name='fastcgi_starter_path'><tmpl_var name='fastcgi_starter_script'> .php4
                FCGIWrapper <tmpl_var name='fastcgi_starter_path'><tmpl_var name='fastcgi_starter_script'> .php5
                Options +ExecCGI
                AllowOverride <tmpl_var name='allow_override'>
                <tmpl_if name='apache_version' op='>' value='2.2' format='version'>
@@ -262,6 +270,9 @@
        <Directory {tmpl_var name='web_document_root'}>
                AddHandler fcgid-script .php .php3 .php4 .php5
                FCGIWrapper <tmpl_var name='fastcgi_starter_path'><tmpl_var name='fastcgi_starter_script'> .php
                FCGIWrapper <tmpl_var name='fastcgi_starter_path'><tmpl_var name='fastcgi_starter_script'> .php3
                FCGIWrapper <tmpl_var name='fastcgi_starter_path'><tmpl_var name='fastcgi_starter_script'> .php4
                FCGIWrapper <tmpl_var name='fastcgi_starter_path'><tmpl_var name='fastcgi_starter_script'> .php5
                Options +ExecCGI
                AllowOverride <tmpl_var name='allow_override'>
                <tmpl_if name='apache_version' op='>' value='2.2' format='version'>
@@ -282,7 +293,7 @@
                    Allow from all
                    </tmpl_if>
                </Directory>
                AddHandler php5-fcgi .php
                AddHandler php5-fcgi .php .php3 .php4 .php5
                Action php5-fcgi /php5-fcgi
                Alias /php5-fcgi {tmpl_var name='document_root'}/cgi-bin/php5-fcgi-{tmpl_var name='ip_address'}-{tmpl_var name='port'}-{tmpl_var name='domain'}
<tmpl_if name='use_tcp'>
@@ -308,6 +319,7 @@
        RewriteCond %{HTTP_HOST}   <tmpl_var name='rewrite_domain'>$ [NC]
<tmpl_if name="rewrite_is_url" op="==" value="n">
        RewriteCond %{REQUEST_URI} !^/webdav/
        RewriteCond %{REQUEST_URI} !^/php5-fcgi/
        RewriteCond %{REQUEST_URI} !^<tmpl_var name='rewrite_target'>
</tmpl_if>
        RewriteRule   ^/(.*)$ <tmpl_var name='rewrite_target'><tmpl_if name="rewrite_add_path" op="==" value="y">$1</tmpl_if>  <tmpl_var name='rewrite_type'>
server/lib/classes/aps_installer.inc.php
@@ -740,6 +740,10 @@
        {
            $app->db->query('DELETE FROM aps_instances WHERE id = "'.$app->db->quote($task['instance_id']).'";');
            $app->db->query('DELETE FROM aps_instances_settings WHERE instance_id = "'.$app->db->quote($task['instance_id']).'";');
            if ($app->dbmaster != $app->db) {
                $app->dbmaster->query('DELETE FROM aps_instances WHERE id = "'.$app->db->quote($task['instance_id']).'";');
                $app->dbmaster->query('DELETE FROM aps_instances_settings WHERE instance_id = "'.$app->db->quote($task['instance_id']).'";');
            }
        }
        unset($sxe);
server/lib/classes/cron.d/100-monitor_email_quota.inc.php
@@ -83,7 +83,9 @@
                $filename = $mb['maildir'].'/.quotausage';
                if(file_exists($filename) && !is_link($filename)) {
                    $quotafile = file($filename);
                    $data[$email]['used'] = trim($quotafile['1']);
                    preg_match('/storage.*?([0-9]+)/s', implode('',$quotafile), $storage_value);
                    $data[$email]['used'] = $storage_value[1];
                    $app->log("Mail storage $email: " . $storage_value[1], LOGLEVEL_DEBUG);
                    unset($quotafile);
                } else {
                    exec('du -s '.escapeshellcmd($mb['maildir']), $out);
server/lib/classes/cron.d/100-monitor_raid.inc.php
@@ -177,7 +177,9 @@
        system('which tw_cli', $retval);
        if($retval === 0) {
            $data['output'] = shell_exec('tw_cli info c0');
            // TYPOWORX FIX | Determine Controler-ID
            $availableControlers = shell_exec('tw_cli info | grep -Eo "c[0-9]+');
            $data['output'] = shell_exec('tw_cli info ' . $availableControlers);
            $state = 'ok';
            if(is_array($data['output'])) {
server/lib/classes/cron.d/300-quota_notify.inc.php
@@ -214,10 +214,10 @@
                    $domain = $rec['domain'];
                    $username = $rec['system_user'];
                    $rec['used'] = $monitor_data['user'][$username]['used'];
                    $rec['soft'] = $monitor_data['user'][$username]['soft'];
                    $rec['hard'] = $monitor_data['user'][$username]['hard'];
                    $rec['files'] = $monitor_data['user'][$username]['files'];
                    $rec['used'] = @$monitor_data['user'][$username]['used'];
                    $rec['soft'] = @$monitor_data['user'][$username]['soft'];
                    $rec['hard'] = @$monitor_data['user'][$username]['hard'];
                    $rec['files'] = @$monitor_data['user'][$username]['files'];
                    if (!is_numeric($rec['used'])){
                        if ($rec['used'][0] > $rec['used'][1]){
server/lib/classes/cron.d/500-backup.inc.php
@@ -199,6 +199,9 @@
                            $web_backup_dir = realpath($backup_dir.'/web'.$web_id);
                            if(is_dir($web_backup_dir)) {
                                exec('sudo -u '.escapeshellarg($web_user).' rm -f '.escapeshellarg($web_backup_dir.'/*'));
                                $sql = "DELETE FROM web_backup WHERE server_id = ".intval($conf['server_id'])." AND parent_domain_id = ".intval($web_id);
                                $app->db->query($sql);
                                if($app->db->dbHost != $app->dbmaster->dbHost) $app->dbmaster->query($sql);
                            }
                        }
                    }
server/lib/classes/system.inc.php
@@ -1526,7 +1526,11 @@
    function maildirmake($maildir_path, $user = '', $subfolder = '', $group = '') {
        global $app;
        global $app, $conf;
        // load the server configuration options
        $app->uses("getconf");
        $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail');
        if($subfolder != '') {
            $dir = escapeshellcmd($maildir_path.'/.'.$subfolder);
@@ -1571,25 +1575,30 @@
        //* Add the subfolder to the subscriptions and courierimapsubscribed files
        if($subfolder != '') {
            // Courier
            if(!is_file($maildir_path.'/courierimapsubscribed')) {
                $tmp_file = escapeshellcmd($maildir_path.'/courierimapsubscribed');
                touch($tmp_file);
                chmod($tmp_file, 0744);
                chown($tmp_file, 'vmail');
                chgrp($tmp_file, 'vmail');
            if($mail_config['pop3_imap_daemon'] == 'courier') {
                if(!is_file($maildir_path.'/courierimapsubscribed')) {
                    $tmp_file = escapeshellcmd($maildir_path.'/courierimapsubscribed');
                    touch($tmp_file);
                    chmod($tmp_file, 0744);
                    chown($tmp_file, 'vmail');
                    chgrp($tmp_file, 'vmail');
                }
                $this->replaceLine($maildir_path.'/courierimapsubscribed', 'INBOX.'.$subfolder, 'INBOX.'.$subfolder, 1, 1);
            }
            $this->replaceLine($maildir_path.'/courierimapsubscribed', 'INBOX.'.$subfolder, 'INBOX.'.$subfolder, 1, 1);
            // Dovecot
            if(!is_file($maildir_path.'/subscriptions')) {
                $tmp_file = escapeshellcmd($maildir_path.'/subscriptions');
                touch($tmp_file);
                chmod($tmp_file, 0744);
                chown($tmp_file, 'vmail');
                chgrp($tmp_file, 'vmail');
            if($mail_config['pop3_imap_daemon'] == 'dovecot') {
                if(!is_file($maildir_path.'/subscriptions')) {
                    $tmp_file = escapeshellcmd($maildir_path.'/subscriptions');
                    touch($tmp_file);
                    chmod($tmp_file, 0744);
                    chown($tmp_file, 'vmail');
                    chgrp($tmp_file, 'vmail');
                }
                $this->replaceLine($maildir_path.'/subscriptions', $subfolder, $subfolder, 1, 1);
            }
            $this->replaceLine($maildir_path.'/subscriptions', $subfolder, $subfolder, 1, 1);
        }
        $app->log('Created Maildir '.$maildir_path.' with subfolder: '.$subfolder, LOGLEVEL_DEBUG);
server/mods-available/rescue_core_module.inc.php
@@ -275,6 +275,17 @@
        /* Set the new try counter */
        $this->_rescueData['webserver']['try_counter'] = $tryCount;
        if ($tryCount > 2 && $conf['serverconfig']['web']['server_type'] != 'nginx') {
            if($app->system->is_user('apache')) {
                $app->log("Clearing semaphores table for user apache.",LOGLEVEL_WARN);
                exec("ipcs -s | grep apache | awk '{ print $2 }' | xargs ipcrm sem");
            }
            if($app->system->is_user('www-data')) {
                $app->log("Clearing semaphores table for user apache.",LOGLEVEL_WARN);
                exec("ipcs -s | grep www-data | awk '{ print $2 }' | xargs ipcrm sem");
            }
        }
        /* if 5 times will not work, we have to give up... */
        if ($tryCount > 5){
server/plugins-available/apache2_plugin.inc.php
@@ -983,6 +983,8 @@
        // Make sure we only have Unix linebreaks
        $vhost_data['apache_directives'] = str_replace("\r\n", "\n", $vhost_data['apache_directives']);
        $vhost_data['apache_directives'] = str_replace("\r", "\n", $vhost_data['apache_directives']);
        $trans = array('{DOCROOT}' => $vhost_data['web_document_root_www']);
        $vhost_data['apache_directives'] = strtr($vhost_data['apache_directives'], $trans);
        // Check if a SSL cert exists
        $ssl_dir = $data['new']['document_root'].'/ssl';
@@ -1256,6 +1258,7 @@
                $fcgi_tpl->setVar('php_fcgi_bin', escapeshellcmd($custom_fastcgi_php_executable));
            }
            $fcgi_tpl->setVar('security_level', intval($web_config['security_level']));
            $fcgi_tpl->setVar('domain', escapeshellcmd($data['new']['domain']));
            $php_open_basedir = ($data['new']['php_open_basedir'] == '')?$data['new']['document_root']:$data['new']['php_open_basedir'];
            $fcgi_tpl->setVar('open_basedir', escapeshellcmd($php_open_basedir));
@@ -2773,6 +2776,7 @@
        $tpl->setVar('pm_max_requests', $data['new']['pm_max_requests']);
        $tpl->setVar('document_root', $data['new']['document_root']);
        $tpl->setVar('security_level', $web_config['security_level']);
        $tpl->setVar('domain', $data['new']['domain']);
        $php_open_basedir = ($data['new']['php_open_basedir'] == '')?escapeshellcmd($data['new']['document_root']):escapeshellcmd($data['new']['php_open_basedir']);
        $tpl->setVar('php_open_basedir', $php_open_basedir);
        if($php_open_basedir != ''){
server/plugins-available/bind_plugin.inc.php
@@ -156,8 +156,12 @@
            if(is_file($filename.'.err')) unlink($filename.'.err');
        }
        //* Reload bind nameserver
        $app->services->restartServiceDelayed('bind', 'reload');
        //* Restart bind nameserver if update_acl is not empty, otherwise reload it
        if($data['new']['update_acl'] != '') {
            $app->services->restartServiceDelayed('bind', 'restart');
        } else {
            $app->services->restartServiceDelayed('bind', 'reload');
        }
    }
server/plugins-available/maildeliver_plugin.inc.php
@@ -121,7 +121,14 @@
            $tpl->newTemplate($filter_file_template);
            // cc Field
            $tmp_mails_arr = explode(',',$data["new"]["cc"]);
            $tmp_addresses_arr = array();
            foreach($tmp_mails_arr as $address) {
                if(trim($address) != '') $tmp_addresses_arr[] = array('address' => trim($address));
            }
            $tpl->setVar('cc', $data["new"]["cc"]);
            $tpl->setLoop('ccloop', $tmp_addresses_arr);
            // Custom filters
            $tpl->setVar('custom_mailfilter', $data["new"]["custom_mailfilter"]);
server/plugins-available/maildrop_plugin.inc.php
@@ -192,7 +192,11 @@
                $mailfilter_content = '';
                if($data["new"]["cc"] != '') {
                    $mailfilter_content .= "cc \"!".$data["new"]["cc"]."\"\n";
                    $tmp_mails_arr = explode(',',$data["new"]["cc"]);
                    foreach($tmp_mails_arr as $address) {
                        if(trim($address) != '') $mailfilter_content .= "cc \"!".trim($address)."\"\n";
                    }
                    //$mailfilter_content .= "cc \"!".$data["new"]["cc"]."\"\n";
                    $app->log("Added CC address ".$data["new"]["cc"].' to mailfilter file.', LOGLEVEL_DEBUG);
                }
server/plugins-available/nginx_plugin.inc.php
@@ -2355,6 +2355,7 @@
        $tpl->setVar('pm_max_requests', $data['new']['pm_max_requests']);
        $tpl->setVar('document_root', $data['new']['document_root']);
        $tpl->setVar('security_level', $web_config['security_level']);
        $tpl->setVar('domain', $data['new']['domain']);
        $php_open_basedir = ($data['new']['php_open_basedir'] == '')?escapeshellcmd($data['new']['document_root']):escapeshellcmd($data['new']['php_open_basedir']);
        $tpl->setVar('php_open_basedir', $php_open_basedir);
        if($php_open_basedir != ''){
server/scripts/create_jailkit_user.sh
@@ -21,12 +21,12 @@
CHROOT_P_USER=$5
CHROOT_P_USER_HOMEDIR=$6
### Add the chroot user ###
jk_jailuser -n -s $CHROOT_SHELL -j $CHROOT_HOMEDIR $CHROOT_USERNAME
### Reconfigure the chroot home directory for the user ###
usermod --home=$CHROOT_HOMEDIR/.$CHROOT_USERHOMEDIR $CHROOT_USERNAME 2>/dev/null
### Add the chroot user ###
jk_jailuser -n -s $CHROOT_SHELL -j $CHROOT_HOMEDIR $CHROOT_USERNAME
### We have to reconfigure the chroot home directory for the parent user ###
if [ "$CHROOT_P_USER" != "" ]; then
  usermod --home=$CHROOT_HOMEDIR/.$CHROOT_P_USER_HOMEDIR $CHROOT_P_USER 2>/dev/null