tbrehm
2013-07-31 615a0a96618fa99e7e452523145d6c0f238d4473
Merged revisions 3960-4065 from stable branch.
33 files added
198 files modified
8052 ■■■■■ changed files
install/dist/lib/centos52.lib.php 12 ●●●●● patch | view | raw | blame | history
install/dist/lib/centos53.lib.php 12 ●●●●● patch | view | raw | blame | history
install/dist/lib/debian60.lib.php 14 ●●●● patch | view | raw | blame | history
install/dist/lib/fedora.lib.php 110 ●●●● patch | view | raw | blame | history
install/dist/lib/gentoo.lib.php 52 ●●●●● patch | view | raw | blame | history
install/dist/lib/opensuse.lib.php 104 ●●●● patch | view | raw | blame | history
install/lib/install.lib.php 8 ●●●● patch | view | raw | blame | history
install/lib/installer_base.lib.php 149 ●●●● patch | view | raw | blame | history
install/sql/incremental/upd_0051.sql 2 ●●●●● patch | view | raw | blame | history
install/sql/incremental/upd_0052.sql 1 ●●●● patch | view | raw | blame | history
install/sql/incremental/upd_0053.sql 2 ●●●●● patch | view | raw | blame | history
install/sql/incremental/upd_0054.sql 1 ●●●● patch | view | raw | blame | history
install/sql/ispconfig3.sql 9 ●●●● patch | view | raw | blame | history
install/tpl/apache_ispconfig.vhost.master 2 ●●● patch | view | raw | blame | history
install/tpl/debian6_dovecot2.conf.master 4 ●●●● patch | view | raw | blame | history
install/tpl/debian_dovecot2.conf.master 4 ●●●● patch | view | raw | blame | history
install/tpl/debian_postfix.conf.master 33 ●●●●● patch | view | raw | blame | history
install/tpl/fedora_dovecot2.conf.master 4 ●●●● patch | view | raw | blame | history
install/tpl/fedora_postfix.conf.master 30 ●●●●● patch | view | raw | blame | history
install/tpl/gentoo_postfix.conf.master 30 ●●●●● patch | view | raw | blame | history
install/tpl/opensuse_dovecot2.conf.master 4 ●●●● patch | view | raw | blame | history
install/tpl/opensuse_postfix.conf.master 30 ●●●●● patch | view | raw | blame | history
install/tpl/server.ini.master 21 ●●●● patch | view | raw | blame | history
interface/lib/classes/functions.inc.php 17 ●●●● patch | view | raw | blame | history
interface/lib/classes/ispcmail.inc.php 56 ●●●● patch | view | raw | blame | history
interface/lib/classes/listform.inc.php 21 ●●●●● patch | view | raw | blame | history
interface/lib/classes/listform_actions.inc.php 190 ●●●●● patch | view | raw | blame | history
interface/lib/classes/remoting.inc.php 4 ●●●● patch | view | raw | blame | history
interface/lib/classes/remoting_lib.inc.php 3 ●●●● patch | view | raw | blame | history
interface/lib/classes/sites_database_plugin.inc.php 50 ●●●● patch | view | raw | blame | history
interface/lib/classes/tform.inc.php 1 ●●●● patch | view | raw | blame | history
interface/lib/classes/tpl.inc.php 14 ●●●●● patch | view | raw | blame | history
interface/lib/classes/validate_ftpuser.inc.php 7 ●●●● patch | view | raw | blame | history
interface/lib/plugins/sites_web_database_user_plugin.inc.php 4 ●●●● patch | view | raw | blame | history
interface/web/admin/form/server_config.tform.php 121 ●●●●● patch | view | raw | blame | history
interface/web/admin/form/server_ip.tform.php 2 ●●● patch | view | raw | blame | history
interface/web/admin/form/server_php.tform.php 2 ●●● patch | view | raw | blame | history
interface/web/admin/form/software_package.tform.php 116 ●●●●● patch | view | raw | blame | history
interface/web/admin/form/software_repo.tform.php 2 ●●● patch | view | raw | blame | history
interface/web/admin/form/system_config.tform.php 3 ●●●● patch | view | raw | blame | history
interface/web/admin/lib/lang/de.lng 2 ●●● patch | view | raw | blame | history
interface/web/admin/lib/lang/de_server_config.lng 23 ●●●● patch | view | raw | blame | history
interface/web/admin/lib/lang/de_software_package.lng 6 ●●●●● patch | view | raw | blame | history
interface/web/admin/lib/lang/de_software_package_install.lng 2 ●●● patch | view | raw | blame | history
interface/web/admin/lib/lang/de_software_package_list.lng 4 ●●● patch | view | raw | blame | history
interface/web/admin/lib/lang/de_software_repo.lng 3 ●●●● patch | view | raw | blame | history
interface/web/admin/lib/lang/de_software_repo_list.lng 4 ●●●● patch | view | raw | blame | history
interface/web/admin/lib/lang/de_software_update_list.lng 2 ●●● patch | view | raw | blame | history
interface/web/admin/lib/lang/de_system_config.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/admin/lib/lang/en_server_config.lng 27 ●●●●● patch | view | raw | blame | history
interface/web/admin/lib/lang/en_software_package.lng 6 ●●●●● patch | view | raw | blame | history
interface/web/admin/lib/lang/en_software_package_list.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/admin/lib/lang/en_software_repo.lng 1 ●●●● patch | view | raw | blame | history
interface/web/admin/lib/lang/en_system_config.lng 3 ●●●● patch | view | raw | blame | history
interface/web/admin/server_ip_list.php 2 ●●● patch | view | raw | blame | history
interface/web/admin/server_php_list.php 2 ●●● patch | view | raw | blame | history
interface/web/admin/software_package_edit.php 59 ●●●●● patch | view | raw | blame | history
interface/web/admin/software_package_list.php 3 ●●●● patch | view | raw | blame | history
interface/web/admin/software_update_list.php 3 ●●●● patch | view | raw | blame | history
interface/web/admin/templates/remote_user_list.htm 6 ●●●● patch | view | raw | blame | history
interface/web/admin/templates/server_config_mail_edit.htm 22 ●●●●● patch | view | raw | blame | history
interface/web/admin/templates/server_config_server_edit.htm 30 ●●●●● patch | view | raw | blame | history
interface/web/admin/templates/server_config_web_edit.htm 22 ●●●●● patch | view | raw | blame | history
interface/web/admin/templates/software_package_edit.htm 27 ●●●●● patch | view | raw | blame | history
interface/web/admin/templates/software_package_list.htm 7 ●●●●● patch | view | raw | blame | history
interface/web/admin/templates/system_config_mail_edit.htm 2 ●●● patch | view | raw | blame | history
interface/web/admin/templates/system_config_sites_edit.htm 2 ●●● patch | view | raw | blame | history
interface/web/admin/users_list.php 2 ●●● patch | view | raw | blame | history
interface/web/client/client_circle_list.php 2 ●●● patch | view | raw | blame | history
interface/web/client/client_del.php 1 ●●●● patch | view | raw | blame | history
interface/web/client/client_edit.php 2 ●●● patch | view | raw | blame | history
interface/web/client/client_list.php 4 ●●●● patch | view | raw | blame | history
interface/web/client/client_template_edit.php 194 ●●●● patch | view | raw | blame | history
interface/web/client/client_template_list.php 2 ●●● patch | view | raw | blame | history
interface/web/client/domain_list.php 2 ●●● patch | view | raw | blame | history
interface/web/client/form/client.tform.php 35 ●●●●● patch | view | raw | blame | history
interface/web/client/form/reseller.tform.php 11 ●●●●● patch | view | raw | blame | history
interface/web/client/lib/lang/de_client.lng 5 ●●●●● patch | view | raw | blame | history
interface/web/client/lib/lang/de_client_del.lng 1 ●●●● patch | view | raw | blame | history
interface/web/client/lib/lang/de_client_template_list.lng 1 ●●●● patch | view | raw | blame | history
interface/web/client/lib/lang/de_reseller.lng 5 ●●●●● patch | view | raw | blame | history
interface/web/client/lib/lang/en_client.lng 3 ●●●● patch | view | raw | blame | history
interface/web/client/lib/lang/en_client_del.lng 1 ●●●● patch | view | raw | blame | history
interface/web/client/lib/lang/en_client_template_list.lng 1 ●●●● patch | view | raw | blame | history
interface/web/client/lib/lang/en_reseller.lng 3 ●●●● patch | view | raw | blame | history
interface/web/client/reseller_edit.php 2 ●●● patch | view | raw | blame | history
interface/web/client/reseller_list.php 4 ●●●● patch | view | raw | blame | history
interface/web/client/templates/client_del.htm 8 ●●●● patch | view | raw | blame | history
interface/web/client/templates/client_edit_limits.htm 8 ●●●● patch | view | raw | blame | history
interface/web/client/templates/domain_list.htm 2 ●●● patch | view | raw | blame | history
interface/web/client/templates/reseller_edit_limits.htm 6 ●●●●● patch | view | raw | blame | history
interface/web/dashboard/dashboard.php 2 ●●● patch | view | raw | blame | history
interface/web/dashboard/dashlets/mailquota.php 93 ●●●●● patch | view | raw | blame | history
interface/web/dashboard/dashlets/quota.php 116 ●●●●● patch | view | raw | blame | history
interface/web/dashboard/dashlets/templates/mailquota.htm 29 ●●●●● patch | view | raw | blame | history
interface/web/dashboard/dashlets/templates/quota.htm 29 ●●●●● patch | view | raw | blame | history
interface/web/dashboard/lib/lang/de_dashlet_mailquota.lng 8 ●●●●● patch | view | raw | blame | history
interface/web/dashboard/lib/lang/de_dashlet_quota.lng 8 ●●●●● patch | view | raw | blame | history
interface/web/dashboard/lib/lang/en_dashlet_mailquota.lng 8 ●●●●● patch | view | raw | blame | history
interface/web/dashboard/lib/lang/en_dashlet_quota.lng 8 ●●●●● patch | view | raw | blame | history
interface/web/dashboard/templates/dashboard.htm 6 ●●●● patch | view | raw | blame | history
interface/web/dns/dns_a_list.php 2 ●●● patch | view | raw | blame | history
interface/web/dns/dns_import.php 12 ●●●● patch | view | raw | blame | history
interface/web/dns/dns_slave_edit.php 16 ●●●● patch | view | raw | blame | history
interface/web/dns/dns_slave_list.php 4 ●●●● patch | view | raw | blame | history
interface/web/dns/dns_soa_edit.php 15 ●●●●● patch | view | raw | blame | history
interface/web/dns/dns_soa_list.php 4 ●●●● patch | view | raw | blame | history
interface/web/dns/dns_srv_edit.php 16 ●●●● patch | view | raw | blame | history
interface/web/dns/dns_template_list.php 4 ●●●● patch | view | raw | blame | history
interface/web/dns/dns_wizard.php 12 ●●●● patch | view | raw | blame | history
interface/web/help/faq_list.php 2 ●●● patch | view | raw | blame | history
interface/web/help/form/support_message.tform.php 2 ●●● patch | view | raw | blame | history
interface/web/help/lib/lang/de_support_message.lng 7 ●●●●● patch | view | raw | blame | history
interface/web/help/lib/lang/de_support_message_list.lng 1 ●●●● patch | view | raw | blame | history
interface/web/help/lib/lang/en_support_message.lng 7 ●●●●● patch | view | raw | blame | history
interface/web/help/lib/lang/en_support_message_list.lng 1 ●●●● patch | view | raw | blame | history
interface/web/help/list/support_message.list.php 9 ●●●●● patch | view | raw | blame | history
interface/web/help/support_message_edit.php 58 ●●●●● patch | view | raw | blame | history
interface/web/help/support_message_list.php 2 ●●● patch | view | raw | blame | history
interface/web/help/templates/support_message_list.htm 7 ●●●● patch | view | raw | blame | history
interface/web/help/templates/support_message_view.htm 4 ●●●● patch | view | raw | blame | history
interface/web/js/jquery.tipsy.js 11 ●●●● patch | view | raw | blame | history
interface/web/js/scrigo.js.php 1 ●●●● patch | view | raw | blame | history
interface/web/login/lib/lang/de.lng 1 ●●●● patch | view | raw | blame | history
interface/web/login/lib/lang/en.lng 1 ●●●● patch | view | raw | blame | history
interface/web/login/templates/index.htm 3 ●●●● patch | view | raw | blame | history
interface/web/login/templates/password_reset.htm 4 ●●● patch | view | raw | blame | history
interface/web/mail/lib/lang/de_spamfilter_policy.lng 2 ●●● patch | view | raw | blame | history
interface/web/mail/lib/lang/de_spamfilter_users.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/mail/lib/lang/de_user_quota_stats_list.lng 1 ●●●● patch | view | raw | blame | history
interface/web/mail/lib/lang/en_spamfilter_users.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/mail/lib/lang/en_user_quota_stats_list.lng 1 ●●●● patch | view | raw | blame | history
interface/web/mail/list/user_quota_stats.list.php 2 ●●●●● patch | view | raw | blame | history
interface/web/mail/mail_alias_list.php 2 ●●● patch | view | raw | blame | history
interface/web/mail/mail_aliasdomain_list.php 2 ●●● patch | view | raw | blame | history
interface/web/mail/mail_blacklist_list.php 2 ●●● patch | view | raw | blame | history
interface/web/mail/mail_domain_catchall_list.php 2 ●●● patch | view | raw | blame | history
interface/web/mail/mail_domain_edit.php 12 ●●●● patch | view | raw | blame | history
interface/web/mail/mail_domain_list.php 2 ●●● patch | view | raw | blame | history
interface/web/mail/mail_forward_list.php 2 ●●● patch | view | raw | blame | history
interface/web/mail/mail_mailinglist_edit.php 12 ●●●● patch | view | raw | blame | history
interface/web/mail/mail_user_list.php 2 ●●● patch | view | raw | blame | history
interface/web/mail/mail_user_stats.php 80 ●●●●● patch | view | raw | blame | history
interface/web/mail/mail_whitelist_list.php 2 ●●● patch | view | raw | blame | history
interface/web/mail/spamfilter_blacklist_list.php 2 ●●● patch | view | raw | blame | history
interface/web/mail/spamfilter_whitelist_list.php 2 ●●● patch | view | raw | blame | history
interface/web/mail/templates/user_quota_stats_list.htm 105 ●●●● patch | view | raw | blame | history
interface/web/mail/user_quota_stats.php 20 ●●●● patch | view | raw | blame | history
interface/web/mail/webmailer.php 11 ●●●● patch | view | raw | blame | history
interface/web/mailuser/mail_user_autoresponder_edit.php 6 ●●●●● patch | view | raw | blame | history
interface/web/mailuser/mail_user_filter_list.php 2 ●●● patch | view | raw | blame | history
interface/web/monitor/datalog_list.php 4 ●●●● patch | view | raw | blame | history
interface/web/monitor/lib/lang/de.lng 6 ●●●●● patch | view | raw | blame | history
interface/web/monitor/lib/lang/en.lng 6 ●●●●● patch | view | raw | blame | history
interface/web/monitor/lib/module.conf.php 10 ●●●●● patch | view | raw | blame | history
interface/web/monitor/log_list.php 2 ●●● patch | view | raw | blame | history
interface/web/monitor/show_monit.php 82 ●●●●● patch | view | raw | blame | history
interface/web/monitor/show_munin.php 82 ●●●●● patch | view | raw | blame | history
interface/web/monitor/templates/show_monit.htm 10 ●●●●● patch | view | raw | blame | history
interface/web/monitor/templates/show_munin.htm 10 ●●●●● patch | view | raw | blame | history
interface/web/sites/ajax_get_json.php 10 ●●●● patch | view | raw | blame | history
interface/web/sites/aps_availablepackages_list.php 6 ●●●● patch | view | raw | blame | history
interface/web/sites/cron_edit.php 13 ●●●● patch | view | raw | blame | history
interface/web/sites/database_del.php 2 ●●● patch | view | raw | blame | history
interface/web/sites/database_edit.php 12 ●●●● patch | view | raw | blame | history
interface/web/sites/database_list.php 2 ●●● patch | view | raw | blame | history
interface/web/sites/database_phpmyadmin.php 6 ●●●● patch | view | raw | blame | history
interface/web/sites/database_user_del.php 7 ●●●● patch | view | raw | blame | history
interface/web/sites/database_user_edit.php 18 ●●●● patch | view | raw | blame | history
interface/web/sites/database_user_list.php 2 ●●● patch | view | raw | blame | history
interface/web/sites/form/database_user.tform.php 2 ●●● patch | view | raw | blame | history
interface/web/sites/form/shell_user.tform.php 2 ●●● patch | view | raw | blame | history
interface/web/sites/form/web_domain.tform.php 10 ●●●●● patch | view | raw | blame | history
interface/web/sites/ftp_user_edit.php 17 ●●●●● patch | view | raw | blame | history
interface/web/sites/ftp_user_list.php 2 ●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/de_shell_user.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/de_web_domain.lng 9 ●●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/en_shell_user.lng 2 ●●●●● patch | view | raw | blame | history
interface/web/sites/lib/lang/en_web_domain.lng 7 ●●●●● patch | view | raw | blame | history
interface/web/sites/list/aps_installedpackages.list.php 174 ●●●● patch | view | raw | blame | history
interface/web/sites/list/user_quota_stats.list.php 3 ●●●●● patch | view | raw | blame | history
interface/web/sites/shell_user_edit.php 8 ●●●● patch | view | raw | blame | history
interface/web/sites/shell_user_list.php 2 ●●● patch | view | raw | blame | history
interface/web/sites/templates/database_edit.htm 2 ●●● patch | view | raw | blame | history
interface/web/sites/templates/user_quota_stats_list.htm 4 ●●●● patch | view | raw | blame | history
interface/web/sites/templates/web_domain_advanced.htm 9 ●●●● patch | view | raw | blame | history
interface/web/sites/templates/web_domain_edit.htm 2 ●●● patch | view | raw | blame | history
interface/web/sites/templates/web_domain_redirect.htm 6 ●●●●● patch | view | raw | blame | history
interface/web/sites/user_quota_stats.php 5 ●●●●● patch | view | raw | blame | history
interface/web/sites/web_aliasdomain_list.php 4 ●●●● patch | view | raw | blame | history
interface/web/sites/web_domain_edit.php 75 ●●●●● patch | view | raw | blame | history
interface/web/sites/web_domain_list.php 4 ●●●● patch | view | raw | blame | history
interface/web/sites/web_sites_stats.php 90 ●●●●● patch | view | raw | blame | history
interface/web/sites/web_subdomain_list.php 4 ●●●● patch | view | raw | blame | history
interface/web/sites/web_vhost_subdomain_edit.php 2 ●●● patch | view | raw | blame | history
interface/web/sites/web_vhost_subdomain_list.php 4 ●●●● patch | view | raw | blame | history
interface/web/sites/webdav_user_list.php 2 ●●● patch | view | raw | blame | history
interface/web/themes/default/css/styles.css 3707 ●●●● patch | view | raw | blame | history
interface/web/themes/default/templates/main.tpl.htm 3 ●●●●● patch | view | raw | blame | history
interface/web/vm/openvz_ip_list.php 2 ●●● patch | view | raw | blame | history
interface/web/vm/openvz_vm_edit.php 12 ●●●● patch | view | raw | blame | history
server/conf/getmail.conf.master 2 ●●● patch | view | raw | blame | history
server/conf/mail/mail_quota_notification_de.txt 14 ●●●●● patch | view | raw | blame | history
server/conf/mail/mail_quota_notification_en.txt 14 ●●●●● patch | view | raw | blame | history
server/conf/mail/mail_quota_ok_notification_de.txt 14 ●●●●● patch | view | raw | blame | history
server/conf/mail/mail_quota_ok_notification_en.txt 14 ●●●●● patch | view | raw | blame | history
server/conf/mail/web_quota_notification_de.txt 14 ●●●●● patch | view | raw | blame | history
server/conf/mail/web_quota_notification_en.txt 14 ●●●●● patch | view | raw | blame | history
server/conf/mail/web_quota_ok_notification_de.txt 14 ●●●●● patch | view | raw | blame | history
server/conf/mail/web_quota_ok_notification_en.txt 14 ●●●●● patch | view | raw | blame | history
server/conf/mail/web_traffic_notification_de.txt 8 ●●●●● patch | view | raw | blame | history
server/conf/mail/web_traffic_notification_en.txt 7 ●●●● patch | view | raw | blame | history
server/conf/nginx_vhost.conf.master 4 ●●●● patch | view | raw | blame | history
server/cron_daily.php 444 ●●●● patch | view | raw | blame | history
server/lib/app.inc.php 45 ●●●● patch | view | raw | blame | history
server/lib/classes/monitor_tools.inc.php 9 ●●●●● patch | view | raw | blame | history
server/lib/classes/services.inc.php 3 ●●●● patch | view | raw | blame | history
server/lib/classes/system.inc.php 2 ●●● patch | view | raw | blame | history
server/lib/classes/tpl.inc.php 4 ●●●● patch | view | raw | blame | history
server/mods-available/dns_module.inc.php 11 ●●●●● patch | view | raw | blame | history
server/mods-available/monitor_core_module.inc.php 20 ●●●●● patch | view | raw | blame | history
server/mods-available/web_module.inc.php 11 ●●●●● patch | view | raw | blame | history
server/plugins-available/apache2_plugin.inc.php 63 ●●●● patch | view | raw | blame | history
server/plugins-available/bind_plugin.inc.php 5 ●●●●● patch | view | raw | blame | history
server/plugins-available/cron_plugin.inc.php 2 ●●● patch | view | raw | blame | history
server/plugins-available/ftpuser_base_plugin.inc.php 12 ●●●● patch | view | raw | blame | history
server/plugins-available/getmail_plugin.inc.php 8 ●●●● patch | view | raw | blame | history
server/plugins-available/mysql_clientdb_plugin.inc.php 120 ●●●●● patch | view | raw | blame | history
server/plugins-available/nginx_plugin.inc.php 60 ●●●● patch | view | raw | blame | history
server/scripts/run-getmail.sh 2 ●●● patch | view | raw | blame | history
server/server.php 10 ●●●●● patch | view | raw | blame | history
install/dist/lib/centos52.lib.php
@@ -41,7 +41,7 @@
        }
        // load files
        $content = rf('tpl/mm_cfg.py.master');
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/mm_cfg.py.master', 'tpl/mm_cfg.py.master');
        $old_file = rf($full_file_name);
        $old_options = array();
@@ -67,7 +67,11 @@
            copy($full_file_name, $config_dir.'virtual_to_transport.sh~');
        }
        
        copy('tpl/mailman-virtual_to_transport.sh',$full_file_name);
        if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/mailman-virtual_to_transport.sh')) {
            copy($conf['ispconfig_install_dir'].'/server/conf-custom/install/mailman-virtual_to_transport.sh', $full_file_name);
        } else {
            copy('tpl/mailman-virtual_to_transport.sh',$full_file_name);
        }
        chgrp($full_file_name,'mailman');
        chmod($full_file_name,0750);
        
@@ -110,7 +114,7 @@
        $configfile = 'fedora_amavisd_conf';
        if(is_file($conf["amavis"]["config_dir"].'/amavisd.conf')) copy($conf["amavis"]["config_dir"].'/amavisd.conf',$conf["amavis"]["config_dir"].'/amavisd.conf~');
        if(is_file($conf["amavis"]["config_dir"].'/amavisd.conf~')) exec('chmod 400 '.$conf["amavis"]["config_dir"].'/amavisd.conf~');
        $content = rf("tpl/".$configfile.".master");
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/".$configfile.".master");
        $content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['ispconfig_user'],$content);
        $content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}',$conf['mysql']['database'],$content);
@@ -142,7 +146,7 @@
        // Only add the content if we had not addded it before
        if(!stristr($content,"127.0.0.1:10025")) {
            unset($content);
            $content = rf("tpl/master_cf_amavis.master");
            $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', "tpl/master_cf_amavis.master");
            af($conf["postfix"]["config_dir"].'/master.cf',$content);
        }
        unset($content);
install/dist/lib/centos53.lib.php
@@ -41,7 +41,7 @@
        }
        // load files
        $content = rf('tpl/mm_cfg.py.master');
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/mm_cfg.py.master', 'tpl/mm_cfg.py.master');
        $old_file = rf($full_file_name);
        $old_options = array();
@@ -67,7 +67,11 @@
            copy($full_file_name, $config_dir.'virtual_to_transport.sh~');
        }
        
        copy('tpl/mailman-virtual_to_transport.sh',$full_file_name);
        if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/mailman-virtual_to_transport.sh')) {
            copy($conf['ispconfig_install_dir'].'/server/conf-custom/install/mailman-virtual_to_transport.sh', $full_file_name);
        } else {
            copy('tpl/mailman-virtual_to_transport.sh',$full_file_name);
        }
        chgrp($full_file_name,'mailman');
        chmod($full_file_name,0750);
        
@@ -111,7 +115,7 @@
        if(is_file($conf["amavis"]["config_dir"].'/amavisd.conf')) copy($conf["amavis"]["config_dir"].'/amavisd.conf',$conf["amavis"]["config_dir"].'/amavisd.conf~');
        if(is_file($conf["amavis"]["config_dir"].'/amavisd.conf~')) exec('chmod 400 '.$conf["amavis"]["config_dir"].'/amavisd.conf~');
        if(!is_dir($conf["amavis"]["config_dir"])) mkdir($conf["amavis"]["config_dir"]);
        $content = rf("tpl/".$configfile.".master");
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/".$configfile.".master");
        $content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['ispconfig_user'],$content);
        $content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}',$conf['mysql']['database'],$content);
@@ -143,7 +147,7 @@
        // Only add the content if we had not addded it before
        if(!stristr($content,"127.0.0.1:10025")) {
            unset($content);
            $content = rf("tpl/master_cf_amavis.master");
            $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', "tpl/master_cf_amavis.master");
            af($conf["postfix"]["config_dir"].'/master.cf',$content);
        }
        unset($content);
install/dist/lib/debian60.lib.php
@@ -86,9 +86,17 @@
        
        //* Copy dovecot configuration file
        if($dovecot_version == 2) {
            copy('tpl/debian6_dovecot2.conf.master',$config_dir.'/'.$configfile);
            if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/debian6_dovecot2.conf.master')) {
                copy($conf['ispconfig_install_dir'].'/server/conf-custom/install/debian6_dovecot2.conf.master', $config_dir.'/'.$configfile);
            } else {
                copy('tpl/debian6_dovecot2.conf.master',$config_dir.'/'.$configfile);
            }
        } else {
            copy('tpl/debian6_dovecot.conf.master',$config_dir.'/'.$configfile);
            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);
            } else {
                copy('tpl/debian6_dovecot.conf.master',$config_dir.'/'.$configfile);
            }
        }
        
        //* dovecot-sql.conf
@@ -97,7 +105,7 @@
            copy($config_dir.'/'.$configfile, $config_dir.'/'.$configfile.'~');
            chmod($config_dir.'/'.$configfile.'~', 0400);
        }
        $content = rf('tpl/debian6_dovecot-sql.conf.master');
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/debian6_dovecot-sql.conf.master', 'tpl/debian6_dovecot-sql.conf.master');
        $content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['ispconfig_user'],$content);
        $content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}',$conf['mysql']['database'],$content);
install/dist/lib/fedora.lib.php
@@ -41,7 +41,7 @@
        }
        // load files
        $content = rf('tpl/mm_cfg.py.master');
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/mm_cfg.py.master', 'tpl/mm_cfg.py.master');
        $old_file = rf($full_file_name);
        $old_options = array();
@@ -98,7 +98,11 @@
        }
        
        if(is_dir('/etc/mailman')) {
            copy('tpl/mailman-virtual_to_transport.sh',$full_file_name);
            if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/mailman-virtual_to_transport.sh')) {
                copy($conf['ispconfig_install_dir'].'/server/conf-custom/install/mailman-virtual_to_transport.sh', $full_file_name);
            } else {
                copy('tpl/mailman-virtual_to_transport.sh',$full_file_name);
            }
            chgrp($full_file_name,'mailman');
            chmod($full_file_name,0750);
        }
@@ -162,38 +166,16 @@
        if(!is_user($cf['vmail_username'])) caselog("$command &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");        
        //* These postconf commands will be executed on installation and update
        $postconf_commands = array (
            'virtual_alias_domains =',
            'virtual_alias_maps = proxy:mysql:'.$config_dir.'/mysql-virtual_forwardings.cf, mysql:'.$config_dir.'/mysql-virtual_email2email.cf',
            'virtual_mailbox_domains = proxy:mysql:'.$config_dir.'/mysql-virtual_domains.cf',
            'virtual_mailbox_maps = proxy:mysql:'.$config_dir.'/mysql-virtual_mailboxes.cf',
            'virtual_mailbox_base = '.$cf['vmail_mailbox_base'],
            'virtual_uid_maps = static:'.$cf['vmail_userid'],
            'virtual_gid_maps = static:'.$cf['vmail_groupid'],
            'smtpd_sasl_auth_enable = yes',
            'broken_sasl_auth_clients = yes',
            'smtpd_sasl_authenticated_header = yes',
            'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, check_recipient_access mysql:'.$config_dir.'/mysql-virtual_recipient.cf, reject_unauth_destination',
            'smtpd_use_tls = yes',
            'smtpd_tls_security_level = may',
            'smtpd_tls_cert_file = '.$config_dir.'/smtpd.cert',
            'smtpd_tls_key_file = '.$config_dir.'/smtpd.key',
            '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',
            'smtpd_sender_restrictions = check_sender_access mysql:'.$config_dir.'/mysql-virtual_sender.cf',
            'smtpd_client_restrictions = check_client_access mysql:'.$config_dir.'/mysql-virtual_client.cf',
            'maildrop_destination_concurrency_limit = 1',
            'maildrop_destination_recipient_limit   = 1',
            'virtual_transport = maildrop',
            'header_checks = regexp:'.$config_dir.'/header_checks',
            'mime_header_checks = regexp:'.$config_dir.'/mime_header_checks',
            'nested_header_checks = regexp:'.$config_dir.'/nested_header_checks',
            'body_checks = regexp:'.$config_dir.'/body_checks',
            'inet_interfaces = all'
        );
        $postconf_placeholders = array('{config_dir}' => $config_dir,
                                       '{vmail_mailbox_base}' => $cf['vmail_mailbox_base'],
                                       '{vmail_userid}' => $cf['vmail_userid'],
                                       '{vmail_groupid}' => $cf['vmail_groupid'],
                                       '{rbl_list}' => $rbl_list);
        $postconf_tpl = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/fedora_postfix.conf.master', 'tpl/fedora_postfix.conf.master');
        $postconf_tpl = strtr($postconf_tpl, $postconf_placeholders);
        $postconf_commands = array_filter(explode("\n", $postconf_tpl)); // read and remove empty lines
        //* These postconf commands will be executed on installation only
        if($this->is_update == false) {
            $postconf_commands = array_merge($postconf_commands,array(
@@ -278,7 +260,7 @@
        if(is_file($cf['vmail_mailbox_base'].'/.'.$configfile)){
            copy($cf['vmail_mailbox_base'].'/.'.$configfile, $cf['vmail_mailbox_base'].'/.'.$configfile.'~');
        }
        $content = rf("tpl/$configfile.master");
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/$configfile.master");
        $content = str_replace('{dist_postfix_vmail_mailbox_base}', $cf['vmail_mailbox_base'], $content);
        wf($cf['vmail_mailbox_base'].'/.'.$configfile, $content);
        
@@ -299,7 +281,7 @@
        global $conf;
        
        $configfile = 'tpl/fedora_saslauthd_smtpd_conf.master';
        $content = rf($configfile);
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/fedora_saslauthd_smtpd_conf.master', $configfile);
        wf('/usr/lib/sasl2/smtpd.conf',$content);
        if(is_dir('/usr/lib64')) wf('/usr/lib64/sasl/smtpd.conf',$content);
        if(is_dir('/usr/lib64')) wf('/usr/lib64/sasl2/smtpd.conf',$content);
@@ -315,7 +297,7 @@
        if(is_file("$pam/smtp"))    copy("$pam/smtp", "$pam/smtp~");
        if(is_file("$pam/smtp~"))   exec("chmod 400 $pam/smtp~");
        $content = rf("tpl/$configfile.master");
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/$configfile.master");
        $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
        $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
@@ -338,7 +320,7 @@
            copy("$config_dir/$configfile", "$config_dir/$configfile~");
        }
        exec("chmod 400 $config_dir/$configfile~");
        $content = rf("tpl/$configfile.master");
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/$configfile.master");
        $content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['ispconfig_user'],$content);
        $content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}',$conf['mysql']['database'],$content);
@@ -421,11 +403,19 @@
        
        //* Copy dovecot configuration file
        if($dovecot_version == 2) {
            copy('tpl/fedora_dovecot2.conf.master',$config_dir.'/'.$configfile);
            if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/fedora_dovecot2.conf.master')) {
                copy($conf['ispconfig_install_dir'].'/server/conf-custom/install/fedora_dovecot2.conf.master', $config_dir.'/'.$configfile);
            } else {
                copy('tpl/fedora_dovecot2.conf.master',$config_dir.'/'.$configfile);
            }
        } else {
            copy('tpl/fedora_dovecot.conf.master',$config_dir.'/'.$configfile);
            if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/fedora_dovecot.conf.master')) {
                copy($conf['ispconfig_install_dir'].'/server/conf-custom/install/fedora_dovecot.conf.master', $config_dir.'/'.$configfile);
            } else {
                copy('tpl/fedora_dovecot.conf.master',$config_dir.'/'.$configfile);
            }
        }
        //* dovecot-sql.conf
        $configfile = 'dovecot-sql.conf';
        if(is_file("$config_dir/$configfile")){
@@ -433,7 +423,7 @@
            exec("chmod 400 $config_dir/$configfile~");
        }
        
        $content = rf("tpl/fedora_dovecot-sql.conf.master");
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/fedora_dovecot-sql.conf.master', "tpl/fedora_dovecot-sql.conf.master");
        $content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['ispconfig_user'],$content);
        $content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}',$conf['mysql']['database'],$content);
@@ -452,7 +442,7 @@
        $configfile = 'fedora_amavisd_conf';
        if(is_file($conf["amavis"]["config_dir"].'/amavisd.conf')) copy($conf["amavis"]["config_dir"].'/amavisd.conf',$conf["amavis"]["config_dir"].'/amavisd.conf~');
        if(is_file($conf["amavis"]["config_dir"].'/amavisd.conf~')) exec('chmod 400 '.$conf["amavis"]["config_dir"].'/amavisd.conf~');
        $content = rf("tpl/".$configfile.".master");
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/".$configfile.".master");
        $content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['ispconfig_user'],$content);
        $content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}',$conf['mysql']['database'],$content);
@@ -483,7 +473,7 @@
        // Only add the content if we had not addded it before
        if(!stristr($content,"127.0.0.1:10025")) {
            unset($content);
            $content = rf("tpl/master_cf_amavis.master");
            $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', "tpl/master_cf_amavis.master");
            af($conf["postfix"]["config_dir"].'/master.cf',$content);
        }
        unset($content);
@@ -546,7 +536,7 @@
        if(is_file("$config_dir/$configfile~")){
            exec("chmod 400 $config_dir/$configfile~");
        }
        $content = rf('tpl/pureftpd_mysql.conf.master');
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/pureftpd_mysql.conf.master', 'tpl/pureftpd_mysql.conf.master');
        $content = str_replace('{mysql_server_ispconfig_user}', $conf["mysql"]["ispconfig_user"], $content);
        $content = str_replace('{mysql_server_ispconfig_password}', $conf["mysql"]["ispconfig_password"], $content);
        $content = str_replace('{mysql_server_database}', $conf["mysql"]["database"], $content);
@@ -557,7 +547,11 @@
        exec("chown root:root $config_dir/$configfile");
        
        // copy our customized copy of pureftpd.conf to the pure-ftpd config directory
        exec("cp tpl/fedora_pureftpd_conf.master $config_dir/pure-ftpd.conf");
        if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/fedora_pureftpd_conf.master')) {
            exec("cp " . $conf['ispconfig_install_dir'].'/server/conf-custom/install/fedora_pureftpd_conf.master ' . "$config_dir/pure-ftpd.conf");
        }else {
            exec("cp tpl/fedora_pureftpd_conf.master $config_dir/pure-ftpd.conf");
        }
        
    }
    
@@ -569,7 +563,7 @@
        $configfile = 'mydns.conf';
        if(is_file($conf["mydns"]["config_dir"].'/'.$configfile)) copy($conf["mydns"]["config_dir"].'/'.$configfile,$conf["mydns"]["config_dir"].'/'.$configfile.'~');
        if(is_file($conf["mydns"]["config_dir"].'/'.$configfile.'~')) exec('chmod 400 '.$conf["mydns"]["config_dir"].'/'.$configfile.'~');
        $content = rf("tpl/".$configfile.".master");
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/".$configfile.".master");
        $content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['ispconfig_user'],$content);
        $content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}',$conf['mysql']['database'],$content);
@@ -633,7 +627,7 @@
        $vhost_conf_enabled_dir = $conf['apache']['vhost_conf_enabled_dir'];
        
        // copy('tpl/apache_ispconfig.conf.master',$vhost_conf_dir.'/ispconfig.conf');
        $content = rf('tpl/apache_ispconfig.conf.master');
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/apache_ispconfig.conf.master', 'tpl/apache_ispconfig.conf.master');
        $records = $this->db->queryAllRecords('SELECT * FROM '.$conf['mysql']['master_database'].'.server_ip WHERE server_id = '.$conf['server_id']." AND virtualhost = 'y'");
        if(is_array($records) && count($records) > 0) {
@@ -727,7 +721,11 @@
        if(is_dir("/etc/Bastille")) caselog("mv -f /etc/Bastille /etc/Bastille.backup", __FILE__, __LINE__);
          @mkdir("/etc/Bastille", octdec($directory_mode));
          if(is_dir("/etc/Bastille.backup/firewall.d")) caselog("cp -pfr /etc/Bastille.backup/firewall.d /etc/Bastille/", __FILE__, __LINE__);
          caselog("cp -f tpl/bastille-firewall.cfg.master /etc/Bastille/bastille-firewall.cfg", __FILE__, __LINE__);
          if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/bastille-firewall.cfg.master')) {
            caselog("cp -f " . $conf['ispconfig_install_dir']."/server/conf-custom/install/bastille-firewall.cfg.master /etc/Bastille/bastille-firewall.cfg", __FILE__, __LINE__);
        } else {
            caselog("cp -f tpl/bastille-firewall.cfg.master /etc/Bastille/bastille-firewall.cfg", __FILE__, __LINE__);
        }
          caselog("chmod 644 /etc/Bastille/bastille-firewall.cfg", __FILE__, __LINE__);
          $content = rf("/etc/Bastille/bastille-firewall.cfg");
          $content = str_replace("{DNS_SERVERS}", "", $content);
@@ -815,7 +813,7 @@
        if(is_file($install_dir.'/interface/lib/'.$configfile)){
            copy("$install_dir/interface/lib/$configfile", "$install_dir/interface/lib/$configfile~");
        }
        $content = rf("tpl/$configfile.master");
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/$configfile.master");
        $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
        $content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
@@ -839,7 +837,7 @@
        if(is_file($install_dir.'/server/lib/'.$configfile)){
            copy("$install_dir/server/lib/$configfile", "$install_dir/interface/lib/$configfile~");
        }
        $content = rf("tpl/$configfile.master");
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/$configfile.master");
        $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
        $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
@@ -1014,7 +1012,7 @@
        
        
            // Dont just copy over the virtualhost template but add some custom settings
            $content = rf("tpl/apache_ispconfig.vhost.master");
            $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/apache_ispconfig.vhost.master', "tpl/apache_ispconfig.vhost.master");
            $content = str_replace('{vhost_port}', $conf['apache']['vhost_port'], $content);
        
            // comment out the listen directive if port is 80 or 443
@@ -1055,7 +1053,7 @@
                replaceLine('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter','PHPRC=','PHPRC=/etc/',0,0);
                */
                //if(!is_file('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter')) {
                    $content = rf('tpl/apache_ispconfig_fcgi_starter.master');
                    $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/apache_ispconfig_fcgi_starter.master', 'tpl/apache_ispconfig_fcgi_starter.master');
                    $content = str_replace('{fastcgi_bin}', $conf['fastcgi']['fastcgi_bin'], $content);
                    $content = str_replace('{fastcgi_phpini_path}', $conf['fastcgi']['fastcgi_phpini_path'], $content);
                    if(!is_dir('/var/www/php-fcgi-scripts/ispconfig')) exec('mkdir -p /var/www/php-fcgi-scripts/ispconfig');
@@ -1073,7 +1071,7 @@
            $vhost_conf_enabled_dir = $conf['nginx']['vhost_conf_enabled_dir'];
            // Dont just copy over the virtualhost template but add some custom settings
            $content = rf('tpl/nginx_ispconfig.vhost.master');
            $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/nginx_ispconfig.vhost.master', 'tpl/nginx_ispconfig.vhost.master');
            $content = str_replace('{vhost_port}', $conf['nginx']['vhost_port'], $content);
        
            if(is_file($install_dir.'/interface/ssl/ispserver.crt') && is_file($install_dir.'/interface/ssl/ispserver.key')) {
@@ -1100,7 +1098,7 @@
            
            // PHP-FPM
            // Dont just copy over the php-fpm pool template but add some custom settings
            $content = rf('tpl/php_fpm_pool.conf.master');
            $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/php_fpm_pool.conf.master', 'tpl/php_fpm_pool.conf.master');
            $content = str_replace('{fpm_pool}', 'ispconfig', $content);
            //$content = str_replace('{fpm_port}', $conf['nginx']['php_fpm_start_port'], $content);
            $content = str_replace('{fpm_socket}', $fpm_socket, $content);
@@ -1195,7 +1193,7 @@
            caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
        }
        
        $content = rf("tpl/mysql_clientdb.conf.master");
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/mysql_clientdb.conf.master', "tpl/mysql_clientdb.conf.master");
        $content = str_replace('{hostname}',$conf['mysql']['host'],$content);
        $content = str_replace('{username}',$conf['mysql']['admin_user'],$content);
        $content = str_replace('{password}',$conf['mysql']['admin_password'], $content);
install/dist/lib/gentoo.lib.php
@@ -81,35 +81,15 @@
        }
        //* These postconf commands will be executed on installation and update
        $postconf_commands = array (
            'virtual_alias_domains =',
            'virtual_alias_maps = proxy:mysql:'.$config_dir.'/mysql-virtual_forwardings.cf, mysql:'.$config_dir.'/mysql-virtual_email2email.cf',
            'virtual_mailbox_domains = proxy:mysql:'.$config_dir.'/mysql-virtual_domains.cf',
            'virtual_mailbox_maps = proxy:mysql:'.$config_dir.'/mysql-virtual_mailboxes.cf',
            'virtual_mailbox_base = '.$cf['vmail_mailbox_base'],
            'virtual_uid_maps = static:'.$cf['vmail_userid'],
            'virtual_gid_maps = static:'.$cf['vmail_groupid'],
            'smtpd_sasl_auth_enable = yes',
            'broken_sasl_auth_clients = yes',
            'smtpd_sasl_authenticated_header = yes',
            'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, check_recipient_access mysql:'.$config_dir.'/mysql-virtual_recipient.cf, reject_unauth_destination',
            'smtpd_use_tls = yes',
            'smtpd_tls_security_level = may',
            'smtpd_tls_cert_file = '.$config_dir.'/smtpd.cert',
            'smtpd_tls_key_file = '.$config_dir.'/smtpd.key',
            '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',
            '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',
            'smtpd_sender_restrictions = check_sender_access mysql:'.$config_dir.'/mysql-virtual_sender.cf',
            'smtpd_client_restrictions = check_client_access mysql:'.$config_dir.'/mysql-virtual_client.cf',
            'maildrop_destination_concurrency_limit = 1',
            'maildrop_destination_recipient_limit   = 1',
            'virtual_transport = maildrop',
            'header_checks = regexp:'.$config_dir.'/header_checks',
            'mime_header_checks = regexp:'.$config_dir.'/mime_header_checks',
            'nested_header_checks = regexp:'.$config_dir.'/nested_header_checks',
            'body_checks = regexp:'.$config_dir.'/body_checks'
        );
        $postconf_placeholders = array('{config_dir}' => $config_dir,
                                       '{vmail_mailbox_base}' => $cf['vmail_mailbox_base'],
                                       '{vmail_userid}' => $cf['vmail_userid'],
                                       '{vmail_groupid}' => $cf['vmail_groupid'],
                                       '{rbl_list}' => $rbl_list);
        $postconf_tpl = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/gentoo_postfix.conf.master', 'tpl/gentoo_postfix.conf.master');
        $postconf_tpl = strtr($postconf_tpl, $postconf_placeholders);
        $postconf_commands = array_filter(explode("\n", $postconf_tpl)); // read and remove empty lines
        
        //* These postconf commands will be executed on installation only
        if($this->is_update == false) {
@@ -165,7 +145,7 @@
        $this->write_config_file($configfile, $content);
        
        //* Writing the Maildrop mailfilter file
        $content = rf('tpl/mailfilter.master');
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/mailfilter.master', 'tpl/mailfilter.master');
        $content = str_replace('{dist_postfix_vmail_mailbox_base}', $cf['vmail_mailbox_base'], $content);
        
        $this->write_config_file($cf['vmail_mailbox_base'].'/.mailfilter', $content);
@@ -612,7 +592,7 @@
        
            //if ( !is_file($conf['web']['website_basedir'].'/php-fcgi-scripts/apps/.php-fcgi-starter') ) 
            //{
                $content = rf('tpl/apache_apps_fcgi_starter.master');
                $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/apache_apps_fcgi_starter.master', 'tpl/apache_apps_fcgi_starter.master');
                $content = str_replace('{fastcgi_bin}', $conf['fastcgi']['fastcgi_bin'], $content);
                $content = str_replace('{fastcgi_phpini_path}', $conf['fastcgi']['fastcgi_phpini_path'], $content);
                mkdir($conf['web']['website_basedir'].'/php-fcgi-scripts/apps', 0755, true);
@@ -652,7 +632,7 @@
            $apps_vhost_servername = ($conf['web']['apps_vhost_servername'] == '')?'_':$conf['web']['apps_vhost_servername'];
            // Dont just copy over the virtualhost template but add some custom settings
            $content = rf('tpl/nginx_apps.vhost.master');
            $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/nginx_apps.vhost.master', 'tpl/nginx_apps.vhost.master');
            
            if($conf['web']['apps_vhost_ip'] == '_default_'){
                $apps_vhost_ip = '';
@@ -678,7 +658,7 @@
            
            // PHP-FPM
            // Dont just copy over the php-fpm pool template but add some custom settings
            $content = rf('tpl/apps_php_fpm_pool.conf.master');
            $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/apps_php_fpm_pool.conf.master', 'tpl/apps_php_fpm_pool.conf.master');
            $content = str_replace('{fpm_pool}', 'apps', $content);
            //$content = str_replace('{fpm_port}', ($conf['nginx']['php_fpm_start_port']+1), $content);
            $content = str_replace('{fpm_socket}', $fpm_socket, $content);
@@ -943,7 +923,7 @@
            $this->write_config_file($vhost_path, $content);
        
            if(!is_file('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter')) {
                $content = rf('tpl/apache_ispconfig_fcgi_starter.master');
                $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/apache_ispconfig_fcgi_starter.master', 'tpl/apache_ispconfig_fcgi_starter.master');
                $content = str_replace('{fastcgi_bin}', $conf['fastcgi']['fastcgi_bin'], $content);
                $content = str_replace('{fastcgi_phpini_path}', $conf['fastcgi']['fastcgi_phpini_path'], $content);
                @mkdir('/var/www/php-fcgi-scripts/ispconfig', 0755, true);
@@ -961,7 +941,7 @@
            $vhost_conf_enabled_dir = $conf['nginx']['vhost_conf_enabled_dir'];
            // Dont just copy over the virtualhost template but add some custom settings
            $content = rf('tpl/nginx_ispconfig.vhost.master');
            $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/nginx_ispconfig.vhost.master', 'tpl/nginx_ispconfig.vhost.master');
            $content = str_replace('{vhost_port}', $conf['nginx']['vhost_port'], $content);
        
            if(is_file($install_dir.'/interface/ssl/ispserver.crt') && is_file($install_dir.'/interface/ssl/ispserver.key')) {
@@ -988,7 +968,7 @@
            
            // PHP-FPM
            // Dont just copy over the php-fpm pool template but add some custom settings
            $content = rf('tpl/php_fpm_pool.conf.master');
            $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/php_fpm_pool.conf.master', 'tpl/php_fpm_pool.conf.master');
            $content = str_replace('{fpm_pool}', 'ispconfig', $content);
            //$content = str_replace('{fpm_port}', $conf['nginx']['php_fpm_start_port'], $content);
            $content = str_replace('{fpm_socket}', $fpm_socket, $content);
install/dist/lib/opensuse.lib.php
@@ -41,7 +41,7 @@
        }
        // load files
        $content = rf('tpl/mm_cfg.py.master');
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/mm_cfg.py.master', 'tpl/mm_cfg.py.master');
        $old_file = rf($full_file_name);
        $old_options = array();
@@ -98,7 +98,11 @@
        }
        
        if(is_dir('/etc/mailman')) {
            copy('tpl/mailman-virtual_to_transport.sh',$full_file_name);
            if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/mailman-virtual_to_transport.sh')) {
                copy($conf['ispconfig_install_dir'].'/server/conf-custom/install/mailman-virtual_to_transport.sh', $full_file_name);
            } else {
                copy('tpl/mailman-virtual_to_transport.sh',$full_file_name);
            }
            chgrp($full_file_name,'mailman');
            chmod($full_file_name,0750);
        }
@@ -175,37 +179,15 @@
        if($cf['vmail_mailbox_base'] != '' && strlen($cf['vmail_mailbox_base']) >= 10 && $this->is_update === false) exec('chown -R '.$cf['vmail_username'].':'.$cf['vmail_groupname'].' '.$cf['vmail_mailbox_base']);
        
        //* These postconf commands will be executed on installation and update
        $postconf_commands = array (
            'virtual_alias_domains =',
            'virtual_alias_maps = proxy:mysql:'.$config_dir.'/mysql-virtual_forwardings.cf, mysql:'.$config_dir.'/mysql-virtual_email2email.cf',
            'virtual_mailbox_domains = proxy:mysql:'.$config_dir.'/mysql-virtual_domains.cf',
            'virtual_mailbox_maps = proxy:mysql:'.$config_dir.'/mysql-virtual_mailboxes.cf',
            'virtual_mailbox_base = '.$cf['vmail_mailbox_base'],
            'virtual_uid_maps = static:'.$cf['vmail_userid'],
            'virtual_gid_maps = static:'.$cf['vmail_groupid'],
            'smtpd_sasl_auth_enable = yes',
            'broken_sasl_auth_clients = yes',
            'smtpd_sasl_authenticated_header = yes',
            'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, check_recipient_access mysql:'.$config_dir.'/mysql-virtual_recipient.cf, reject_unauth_destination',
            'smtpd_use_tls = yes',
            'smtpd_tls_security_level = may',
            'smtpd_tls_cert_file = '.$config_dir.'/smtpd.cert',
            'smtpd_tls_key_file = '.$config_dir.'/smtpd.key',
            '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',
            'smtpd_sender_restrictions = check_sender_access mysql:'.$config_dir.'/mysql-virtual_sender.cf',
            'smtpd_client_restrictions = check_client_access mysql:'.$config_dir.'/mysql-virtual_client.cf',
            'maildrop_destination_concurrency_limit = 1',
            'maildrop_destination_recipient_limit   = 1',
            'virtual_transport = maildrop',
            'header_checks = regexp:'.$config_dir.'/header_checks',
            'mime_header_checks = regexp:'.$config_dir.'/mime_header_checks',
            'nested_header_checks = regexp:'.$config_dir.'/nested_header_checks',
            'body_checks = regexp:'.$config_dir.'/body_checks',
            'inet_interfaces = all'
        );
        $postconf_placeholders = array('{config_dir}' => $config_dir,
                                       '{vmail_mailbox_base}' => $cf['vmail_mailbox_base'],
                                       '{vmail_userid}' => $cf['vmail_userid'],
                                       '{vmail_groupid}' => $cf['vmail_groupid'],
                                       '{rbl_list}' => $rbl_list);
        $postconf_tpl = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/opensuse_postfix.conf.master', 'tpl/opensuse_postfix.conf.master');
        $postconf_tpl = strtr($postconf_tpl, $postconf_placeholders);
        $postconf_commands = array_filter(explode("\n", $postconf_tpl)); // read and remove empty lines
        
        //* These postconf commands will be executed on installation only
        if($this->is_update == false) {
@@ -282,7 +264,7 @@
        if(is_file($cf['vmail_mailbox_base'].'/.'.$configfile)){
            copy($cf['vmail_mailbox_base'].'/.'.$configfile, $cf['vmail_mailbox_base'].'/.'.$configfile.'~');
        }
        $content = rf("tpl/$configfile.master");
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/$configfile.master");
        $content = str_replace('{dist_postfix_vmail_mailbox_base}', $cf['vmail_mailbox_base'], $content);
        wf($cf['vmail_mailbox_base'].'/.'.$configfile, $content);
        
@@ -353,7 +335,7 @@
        if(is_file("$pam/smtp"))    copy("$pam/smtp", "$pam/smtp~");
        if(is_file("$pam/smtp~"))   exec("chmod 400 $pam/smtp~");
        $content = rf("tpl/$configfile.master");
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/$configfile.master");
        $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
        $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
@@ -376,7 +358,7 @@
            copy("$config_dir/$configfile", "$config_dir/$configfile~");
        }
        exec("chmod 400 $config_dir/$configfile~");
        $content = rf("tpl/$configfile.master");
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/$configfile.master");
        $content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['ispconfig_user'],$content);
        $content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}',$conf['mysql']['database'],$content);
@@ -456,9 +438,17 @@
        
        //* Copy dovecot configuration file
        if($dovecot_version == 2) {
            copy('tpl/opensuse_dovecot2.conf.master',$config_dir.'/'.$configfile);
            if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/opensuse_dovecot2.conf.master')) {
                copy($conf['ispconfig_install_dir'].'/server/conf-custom/install/opensuse_dovecot2.conf.master', $config_dir.'/'.$configfile);
            } else {
                copy('tpl/opensuse_dovecot2.conf.master',$config_dir.'/'.$configfile);
            }
        } else {
            copy('tpl/opensuse_dovecot.conf.master',$config_dir.'/'.$configfile);
            if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/opensuse_dovecot.conf.master')) {
                copy($conf['ispconfig_install_dir'].'/server/conf-custom/install/opensuse_dovecot.conf.master', $config_dir.'/'.$configfile);
            } else {
                copy('tpl/opensuse_dovecot.conf.master',$config_dir.'/'.$configfile);
            }
        }
        
        //* dovecot-sql.conf
@@ -468,7 +458,7 @@
            exec("chmod 400 $config_dir/$configfile~");
        }
        
        $content = rf("tpl/opensuse_dovecot-sql.conf.master");
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/opensuse_dovecot-sql.conf.master', "tpl/opensuse_dovecot-sql.conf.master");
        $content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['ispconfig_user'],$content);
        $content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}',$conf['mysql']['database'],$content);
@@ -487,7 +477,7 @@
        $configfile = 'opensuse_amavisd_conf';
        if(is_file($conf["amavis"]["config_dir"].'/amavisd.conf')) @copy($conf["amavis"]["config_dir"].'/amavisd.conf',$conf["amavis"]["config_dir"].'/amavisd.conf~');
        if(is_file($conf["amavis"]["config_dir"].'/amavisd.conf~')) exec('chmod 400 '.$conf["amavis"]["config_dir"].'/amavisd.conf~');
        $content = rf("tpl/".$configfile.".master");
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/".$configfile.".master");
        $content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['ispconfig_user'],$content);
        $content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}',$conf['mysql']['database'],$content);
@@ -517,7 +507,7 @@
        // Only add the content if we had not addded it before
        if(!stristr($content,"127.0.0.1:10025")) {
            unset($content);
            $content = rf("tpl/master_cf_amavis.master");
            $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', "tpl/master_cf_amavis.master");
            af($conf["postfix"]["config_dir"].'/master.cf',$content);
        }
        unset($content);
@@ -577,7 +567,7 @@
        if(is_file("$config_dir/$configfile~")){
            exec("chmod 400 $config_dir/$configfile~");
        }
        $content = rf('tpl/pureftpd_mysql.conf.master');
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/pureftpd_mysql.conf.master', 'tpl/pureftpd_mysql.conf.master');
        $content = str_replace('{mysql_server_ispconfig_user}', $conf["mysql"]["ispconfig_user"], $content);
        $content = str_replace('{mysql_server_ispconfig_password}', $conf["mysql"]["ispconfig_password"], $content);
        $content = str_replace('{mysql_server_database}', $conf["mysql"]["database"], $content);
@@ -588,7 +578,11 @@
        exec("chown root:root $config_dir/$configfile");
        
        // copy our customized copy of pureftpd.conf to the pure-ftpd config directory
        exec("cp tpl/opensuse_pureftpd_conf.master $config_dir/pure-ftpd.conf");
        if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/opensuse_pureftpd_conf.master')) {
            exec("cp " . $conf['ispconfig_install_dir']."/server/conf-custom/install/opensuse_pureftpd_conf.master $config_dir/pure-ftpd.conf");
        } else {
            exec("cp tpl/opensuse_pureftpd_conf.master $config_dir/pure-ftpd.conf");
        }
        
    }
    
@@ -600,7 +594,7 @@
        $configfile = 'mydns.conf';
        if(is_file($conf["mydns"]["config_dir"].'/'.$configfile)) copy($conf["mydns"]["config_dir"].'/'.$configfile,$conf["mydns"]["config_dir"].'/'.$configfile.'~');
        if(is_file($conf["mydns"]["config_dir"].'/'.$configfile.'~')) exec('chmod 400 '.$conf["mydns"]["config_dir"].'/'.$configfile.'~');
        $content = rf("tpl/".$configfile.".master");
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/".$configfile.".master");
        $content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['ispconfig_user'],$content);
        $content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}',$conf['mysql']['database'],$content);
@@ -646,7 +640,7 @@
        $vhost_conf_enabled_dir = $conf['apache']['vhost_conf_enabled_dir'];
        
        //copy('tpl/apache_ispconfig.conf.master',$vhost_conf_dir.'/ispconfig.conf');
        $content = rf('tpl/apache_ispconfig.conf.master');
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/apache_ispconfig.conf.master', 'tpl/apache_ispconfig.conf.master');
        $records = $this->db->queryAllRecords('SELECT * FROM '.$conf['mysql']['master_database'].'.server_ip WHERE server_id = '.$conf['server_id']." AND virtualhost = 'y'");
        if(is_array($records) && count($records) > 0) {
@@ -782,7 +776,11 @@
        if(is_dir("/etc/Bastille")) caselog("mv -f /etc/Bastille /etc/Bastille.backup", __FILE__, __LINE__);
          @mkdir("/etc/Bastille", octdec($directory_mode));
          if(is_dir("/etc/Bastille.backup/firewall.d")) caselog("cp -pfr /etc/Bastille.backup/firewall.d /etc/Bastille/", __FILE__, __LINE__);
          caselog("cp -f tpl/bastille-firewall.cfg.master /etc/Bastille/bastille-firewall.cfg", __FILE__, __LINE__);
          if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/bastille-firewall.cfg.master')) {
            caselog("cp -f " . $conf['ispconfig_install_dir']."/server/conf-custom/install/bastille-firewall.cfg.master /etc/Bastille/bastille-firewall.cfg", __FILE__, __LINE__);
        } else {
            caselog("cp -f tpl/bastille-firewall.cfg.master /etc/Bastille/bastille-firewall.cfg", __FILE__, __LINE__);
        }
          caselog("chmod 644 /etc/Bastille/bastille-firewall.cfg", __FILE__, __LINE__);
          $content = rf("/etc/Bastille/bastille-firewall.cfg");
          $content = str_replace("{DNS_SERVERS}", "", $content);
@@ -870,7 +868,7 @@
        if(is_file($install_dir.'/interface/lib/'.$configfile)){
            copy("$install_dir/interface/lib/$configfile", "$install_dir/interface/lib/$configfile~");
        }
        $content = rf("tpl/$configfile.master");
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/$configfile.master");
        $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
        $content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
@@ -894,7 +892,7 @@
        if(is_file($install_dir.'/server/lib/'.$configfile)){
            copy("$install_dir/server/lib/$configfile", "$install_dir/interface/lib/$configfile~");
        }
        $content = rf("tpl/$configfile.master");
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/$configfile.master");
        $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
        $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
@@ -1065,7 +1063,7 @@
        
            // Dont just copy over the virtualhost template but add some custom settings
         
            $content = rf("tpl/apache_ispconfig.vhost.master");
            $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/apache_ispconfig.vhost.master', "tpl/apache_ispconfig.vhost.master");
            $content = str_replace('{vhost_port}', $conf['apache']['vhost_port'], $content);
        
            // comment out the listen directive if port is 80 or 443
@@ -1091,7 +1089,7 @@
            wf("$vhost_conf_dir/ispconfig.vhost", $content);
        
            //if(!is_file('/srv/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter')) {
                $content = rf('tpl/apache_ispconfig_fcgi_starter.master');
                $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/apache_ispconfig_fcgi_starter.master', 'tpl/apache_ispconfig_fcgi_starter.master');
                $content = str_replace('{fastcgi_bin}', $conf['fastcgi']['fastcgi_bin'], $content);
                $content = str_replace('{fastcgi_phpini_path}', $conf['fastcgi']['fastcgi_phpini_path'], $content);
                exec('mkdir -p /srv/www/php-fcgi-scripts/ispconfig');
@@ -1122,7 +1120,7 @@
            $vhost_conf_enabled_dir = $conf['nginx']['vhost_conf_enabled_dir'];
            // Dont just copy over the virtualhost template but add some custom settings
            $content = rf('tpl/nginx_ispconfig.vhost.master');
            $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/nginx_ispconfig.vhost.master', 'tpl/nginx_ispconfig.vhost.master');
            $content = str_replace('{vhost_port}', $conf['nginx']['vhost_port'], $content);
        
            if(is_file($install_dir.'/interface/ssl/ispserver.crt') && is_file($install_dir.'/interface/ssl/ispserver.key')) {
@@ -1149,7 +1147,7 @@
            
            // PHP-FPM
            // Dont just copy over the php-fpm pool template but add some custom settings
            $content = rf('tpl/php_fpm_pool.conf.master');
            $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/php_fpm_pool.conf.master', 'tpl/php_fpm_pool.conf.master');
            $content = str_replace('{fpm_pool}', 'ispconfig', $content);
            //$content = str_replace('{fpm_port}', $conf['nginx']['php_fpm_start_port'], $content);
            $content = str_replace('{fpm_socket}', $fpm_socket, $content);
@@ -1244,7 +1242,7 @@
            caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
        }
        
        $content = rf("tpl/mysql_clientdb.conf.master");
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/mysql_clientdb.conf.master', "tpl/mysql_clientdb.conf.master");
        $content = str_replace('{hostname}',$conf['mysql']['host'],$content);
        $content = str_replace('{username}',$conf['mysql']['admin_user'],$content);
        $content = str_replace('{password}',$conf['mysql']['admin_password'], $content);
install/lib/install.lib.php
@@ -160,7 +160,7 @@
            $distid = 'debian60';
            $distbaseid = 'debian';
            swriteln("Operating System: Debian 6.0 (Squeeze/Sid) or compatible\n");
        } elseif(strstr(trim(file_get_contents('/etc/debian_version')),'6.0') || trim(file_get_contents('/etc/debian_version')) == 'wheezy/sid') {
        } elseif(strstr(trim(file_get_contents('/etc/debian_version')),'7.0') || strstr(trim(file_get_contents('/etc/debian_version')),'7.1') || trim(file_get_contents('/etc/debian_version')) == 'wheezy/sid') {
            $distname = 'Debian';
            $distver = 'Wheezy/Sid';
            $distid = 'debian60';
@@ -345,6 +345,12 @@
    return false;
}
function rfsel($file, $file2) {
    clearstatcache();
    if(is_file($file)) return rf($file);
    else return rf($file2);
}
function rf($file){
    clearstatcache();
    if(is_file($file)) {
install/lib/installer_base.lib.php
@@ -508,7 +508,7 @@
        if(is_file($full_file_name)) {
            copy($full_file_name, $config_dir.$configfile.'~');
        }
        $content = rf('tpl/'.$configfile.'.master');
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master');
        $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
        $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
@@ -528,9 +528,17 @@
        if (is_dir($config_dir)) {
            if(is_file($config_dir.'/'.$jk_init)) copy($config_dir.'/'.$jk_init, $config_dir.'/'.$jk_init.'~');
            if(is_file($config_dir.'/'.$jk_chrootsh.'.master')) copy($config_dir.'/'.$jk_chrootsh.'.master', $config_dir.'/'.$jk_chrootsh.'~');
            copy('tpl/'.$jk_init.'.master', $config_dir.'/'.$jk_init);
            copy('tpl/'.$jk_chrootsh.'.master', $config_dir.'/'.$jk_chrootsh);
            if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$jk_init.'.master')) {
                copy($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$jk_init.'.master', $config_dir.'/'.$jk_init);
            } else {
                copy('tpl/'.$jk_init.'.master', $config_dir.'/'.$jk_init);
            }
            if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$jk_chrootsh.'.master')) {
                copy($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$jk_chrootsh.'.master', $config_dir.'/'.$jk_chrootsh);
            } else {
                copy('tpl/'.$jk_chrootsh.'.master', $config_dir.'/'.$jk_chrootsh);
            }
        }
        //* help jailkit fo find its ini files
@@ -550,7 +558,7 @@
        }
        // load files
        $content = rf('tpl/mm_cfg.py.master');
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/mm_cfg.py.master', 'tpl/mm_cfg.py.master');
        $old_file = rf($full_file_name);
        $old_options = array();
@@ -604,7 +612,11 @@
        }
        
        if(is_dir('/etc/mailman')) {
            copy('tpl/mailman-virtual_to_transport.sh',$full_file_name);
            if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/mailman-virtual_to_transport.sh')) {
                copy($conf['ispconfig_install_dir'].'/server/conf-custom/install/mailman-virtual_to_transport.sh', $full_file_name);
            } else {
                copy('tpl/mailman-virtual_to_transport.sh',$full_file_name);
            }
            chgrp($full_file_name,'list');
            chmod($full_file_name,0750);
        }
@@ -681,42 +693,16 @@
        }
        unset($rbl_hosts);
        unset($server_ini_array);
        $postconf_commands = array (
                'alias_maps = hash:/etc/aliases, hash:/var/lib/mailman/data/aliases',
                'alias_database = hash:/etc/aliases, hash:/var/lib/mailman/data/aliases',
                'virtual_alias_domains =',
                'virtual_alias_maps = proxy:mysql:'.$config_dir.'/mysql-virtual_forwardings.cf, proxy:mysql:'.$config_dir.'/mysql-virtual_email2email.cf, hash:/var/lib/mailman/data/virtual-mailman',
                'virtual_mailbox_domains = proxy:mysql:'.$config_dir.'/mysql-virtual_domains.cf',
                'virtual_mailbox_maps = proxy:mysql:'.$config_dir.'/mysql-virtual_mailboxes.cf',
                'virtual_mailbox_base = '.$cf['vmail_mailbox_base'],
                'virtual_uid_maps = static:'.$cf['vmail_userid'],
                'virtual_gid_maps = static:'.$cf['vmail_groupid'],
                'inet_protocols=all',
                'smtpd_sasl_auth_enable = yes',
                'broken_sasl_auth_clients = yes',
                'smtpd_sasl_authenticated_header = yes',
                'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, check_recipient_access mysql:'.$config_dir.'/mysql-virtual_recipient.cf, reject_unauth_destination'. $rbl_list,
                'smtpd_use_tls = yes',
                'smtpd_tls_security_level = may',
                'smtpd_tls_cert_file = '.$config_dir.'/smtpd.cert',
                'smtpd_tls_key_file = '.$config_dir.'/smtpd.key',
                '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',
                'smtpd_sender_restrictions = check_sender_access mysql:'.$config_dir.'/mysql-virtual_sender.cf',
                'smtpd_client_restrictions = check_client_access mysql:'.$config_dir.'/mysql-virtual_client.cf',
                'smtpd_client_message_rate_limit = 100',
                'maildrop_destination_concurrency_limit = 1',
                'maildrop_destination_recipient_limit   = 1',
                'virtual_transport = maildrop',
                'header_checks = regexp:'.$config_dir.'/header_checks',
                'mime_header_checks = regexp:'.$config_dir.'/mime_header_checks',
                'nested_header_checks = regexp:'.$config_dir.'/nested_header_checks',
                'body_checks = regexp:'.$config_dir.'/body_checks',
                'owner_request_special = no'
        );
        $postconf_placeholders = array('{config_dir}' => $config_dir,
                                       '{vmail_mailbox_base}' => $cf['vmail_mailbox_base'],
                                       '{vmail_userid}' => $cf['vmail_userid'],
                                       '{vmail_groupid}' => $cf['vmail_groupid'],
                                       '{rbl_list}' => $rbl_list);
        $postconf_tpl = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/debian_postfix.conf.master', 'tpl/debian_postfix.conf.master');
        $postconf_tpl = strtr($postconf_tpl, $postconf_placeholders);
        $postconf_commands = array_filter(explode("\n", $postconf_tpl)); // read and remove empty lines
        //* These postconf commands will be executed on installation only
        if($this->is_update == false) {
@@ -784,7 +770,7 @@
        if(is_file($cf['vmail_mailbox_base'].'/.'.$configfile)) {
            copy($cf['vmail_mailbox_base'].'/.'.$configfile, $cf['vmail_mailbox_base'].'/.'.$configfile.'~');
        }
        $content = rf('tpl/'.$configfile.'.master');
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master');
        $content = str_replace('{dist_postfix_vmail_mailbox_base}', $cf['vmail_mailbox_base'], $content);
        wf($cf['vmail_mailbox_base'].'/.'.$configfile, $content);
@@ -823,7 +809,7 @@
        if(is_file($conf['postfix']['config_dir'].'/sasl/smtpd.conf')) copy($conf['postfix']['config_dir'].'/sasl/smtpd.conf',$conf['postfix']['config_dir'].'/sasl/smtpd.conf~');
        if(is_file($conf['postfix']['config_dir'].'/sasl/smtpd.conf~')) chmod($conf['postfix']['config_dir'].'/sasl/smtpd.conf~', 0400);
        $content = rf('tpl/'.$configfile.'.master');
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master');
        $content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['ispconfig_user'],$content);
        $content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}',$conf['mysql']['database'],$content);
@@ -868,7 +854,7 @@
        if(is_file($pam.'/smtp'))    copy($pam.'/smtp', $pam.'/smtp~');
        if(is_file($pam.'/smtp~'))   chmod($pam.'/smtp~', 0400);
        $content = rf('tpl/'.$configfile.'.master');
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master');
        $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
        $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
@@ -891,7 +877,7 @@
            copy($config_dir.'/'.$configfile, $config_dir.'/'.$configfile.'~');
        }
        chmod($config_dir.'/'.$configfile.'~', 0400);
        $content = rf('tpl/'.$configfile.'.master');
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master');
        $content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['ispconfig_user'],$content);
        $content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}',$conf['mysql']['database'],$content);
@@ -970,9 +956,17 @@
        //* Copy dovecot configuration file
        if($dovecot_version == 2) {
            copy('tpl/debian_dovecot2.conf.master',$config_dir.'/'.$configfile);
            if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/debian_dovecot2.conf.master')) {
                copy($conf['ispconfig_install_dir'].'/server/conf-custom/install/debian_dovecot2.conf.master', $config_dir.'/'.$configfile);
            } else {
                copy('tpl/debian_dovecot2.conf.master',$config_dir.'/'.$configfile);
            }
        } else {
            copy('tpl/debian_dovecot.conf.master',$config_dir.'/'.$configfile);
            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);
            } else {
                copy('tpl/debian_dovecot.conf.master',$config_dir.'/'.$configfile);
            }
        }
        //* dovecot-sql.conf
@@ -981,7 +975,7 @@
            copy($config_dir.'/'.$configfile, $config_dir.'/'.$configfile.'~');
        }
        if(is_file($config_dir.'/'.$configfile.'~')) chmod($config_dir.'/'.$configfile.'~', 0400);
        $content = rf('tpl/debian_dovecot-sql.conf.master');
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/debian_dovecot-sql.conf.master', 'tpl/debian_dovecot-sql.conf.master');
        $content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['ispconfig_user'],$content);
        $content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}',$conf['mysql']['database'],$content);
@@ -1001,7 +995,7 @@
        $configfile = 'amavisd_user_config';
        if(is_file($conf['amavis']['config_dir'].'/conf.d/50-user')) copy($conf['amavis']['config_dir'].'/conf.d/50-user',$conf['amavis']['config_dir'].'/50-user~');
        if(is_file($conf['amavis']['config_dir'].'/conf.d/50-user~')) chmod($conf['amavis']['config_dir'].'/conf.d/50-user~', 0400);
        $content = rf('tpl/'.$configfile.'.master');
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master');
        $content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['ispconfig_user'],$content);
        $content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}',$conf['mysql']['database'],$content);
@@ -1037,7 +1031,7 @@
        // Only add the content if we had not addded it before
        if(!stristr($content,'127.0.0.1:10025')) {
            unset($content);
            $content = rf('tpl/master_cf_amavis.master');
            $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master');
            af($conf['postfix']['config_dir'].'/master.cf',$content);
        }
        unset($content);
@@ -1092,7 +1086,7 @@
        if(is_file($config_dir.'/'.$configfile.'~')) {
            chmod($config_dir.'/'.$configfile.'~', 0400);
        }
        $content = rf('tpl/pureftpd_mysql.conf.master');
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/pureftpd_mysql.conf.master', 'tpl/pureftpd_mysql.conf.master');
        $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
        $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
@@ -1128,7 +1122,7 @@
        $configfile = 'mydns.conf';
        if(is_file($conf['mydns']['config_dir'].'/'.$configfile)) copy($conf['mydns']['config_dir'].'/'.$configfile,$conf['mydns']['config_dir'].'/'.$configfile.'~');
        if(is_file($conf['mydns']['config_dir'].'/'.$configfile.'~')) chmod($conf['mydns']['config_dir'].'/'.$configfile.'~', 0400);
        $content = rf('tpl/'.$configfile.'.master');
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master');
        $content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['ispconfig_user'],$content);
        $content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}',$conf['mysql']['database'],$content);
@@ -1171,7 +1165,7 @@
        $configfile = 'pdns.local';
        if(is_file($conf['powerdns']['config_dir'].'/'.$configfile)) copy($conf['powerdns']['config_dir'].'/'.$configfile,$conf['powerdns']['config_dir'].'/'.$configfile.'~');
        if(is_file($conf['powerdns']['config_dir'].'/'.$configfile.'~')) chmod($conf['powerdns']['config_dir'].'/'.$configfile.'~', 0400);
        $content = rf('tpl/'.$configfile.'.master');
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master');
        $content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['ispconfig_user'],$content);
        $content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{powerdns_database}',$conf['powerdns']['database'],$content);
@@ -1235,7 +1229,7 @@
        // copy('tpl/apache_ispconfig.conf.master',$vhost_conf_dir.'/ispconfig.conf');
        $content = rf('tpl/apache_ispconfig.conf.master');
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/apache_ispconfig.conf.master', 'tpl/apache_ispconfig.conf.master');
        $records = $this->db->queryAllRecords('SELECT * FROM '.$conf['mysql']['master_database'].'.server_ip WHERE server_id = '.$conf['server_id']." AND virtualhost = 'y'");
        if(is_array($records) && count($records) > 0) {
@@ -1362,7 +1356,7 @@
        $configfile = 'squid.conf';
        if(is_file($conf["squid"]["config_dir"].'/'.$configfile)) copy($conf["squid"]["config_dir"].'/'.$configfile,$conf["squid"]["config_dir"].'/'.$configfile.'~');
        if(is_file($conf["squid"]["config_dir"].'/'.$configfile.'~')) exec('chmod 400 '.$conf["squid"]["config_dir"].'/'.$configfile.'~');
        $content = rf("tpl/".$configfile.".master");
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/".$configfile.".master");
        $content = str_replace('{server_name}',$server_name,$content);
        $content = str_replace('{ip_address}',$ip_address, $content);
        $content = str_replace('{config_dir}',$conf['squid']['config_dir'], $content);
@@ -1390,7 +1384,11 @@
        if(is_dir('/etc/Bastille')) caselog('mv -f /etc/Bastille /etc/Bastille.backup', __FILE__, __LINE__);
        @mkdir('/etc/Bastille', 0700);
        if(is_dir('/etc/Bastille.backup/firewall.d')) caselog('cp -pfr /etc/Bastille.backup/firewall.d /etc/Bastille/', __FILE__, __LINE__);
        caselog('cp -f tpl/bastille-firewall.cfg.master /etc/Bastille/bastille-firewall.cfg', __FILE__, __LINE__);
        if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/bastille-firewall.cfg.master')) {
            caselog('cp -f ' . $conf['ispconfig_install_dir'].'/server/conf-custom/install/bastille-firewall.cfg.master /etc/Bastille/bastille-firewall.cfg', __FILE__, __LINE__);
        } else {
            caselog('cp -f tpl/bastille-firewall.cfg.master /etc/Bastille/bastille-firewall.cfg', __FILE__, __LINE__);
        }
        caselog('chmod 644 /etc/Bastille/bastille-firewall.cfg', __FILE__, __LINE__);
        $content = rf('/etc/Bastille/bastille-firewall.cfg');
        $content = str_replace('{DNS_SERVERS}', '', $content);
@@ -1448,7 +1446,7 @@
        $configfile = 'vlogger-dbi.conf';
        if(is_file($conf['vlogger']['config_dir'].'/'.$configfile)) copy($conf['vlogger']['config_dir'].'/'.$configfile,$conf['vlogger']['config_dir'].'/'.$configfile.'~');
        if(is_file($conf['vlogger']['config_dir'].'/'.$configfile.'~')) chmod($conf['vlogger']['config_dir'].'/'.$configfile.'~', 0400);
        $content = rf('tpl/'.$configfile.'.master');
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master');
        if($conf['mysql']['master_slave_setup'] == 'y') {
            $content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['master_ispconfig_user'],$content);
            $content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['master_ispconfig_password'], $content);
@@ -1500,7 +1498,7 @@
            $apps_vhost_servername = ($conf['web']['apps_vhost_servername'] == '')?'':'ServerName '.$conf['web']['apps_vhost_servername'];
            // Dont just copy over the virtualhost template but add some custom settings
            $content = rf('tpl/apache_apps.vhost.master');
            $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/apache_apps.vhost.master', 'tpl/apache_apps.vhost.master');
            $content = str_replace('{apps_vhost_ip}', $conf['web']['apps_vhost_ip'], $content);
            $content = str_replace('{apps_vhost_port}', $conf['web']['apps_vhost_port'], $content);
@@ -1526,7 +1524,7 @@
            }
            if(!is_file($conf['web']['website_basedir'].'/php-fcgi-scripts/apps/.php-fcgi-starter')) {
                $content = rf('tpl/apache_apps_fcgi_starter.master');
                $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/apache_apps_fcgi_starter.master', 'tpl/apache_apps_fcgi_starter.master');
                $content = str_replace('{fastcgi_bin}', $conf['fastcgi']['fastcgi_bin'], $content);
                $content = str_replace('{fastcgi_phpini_path}', $conf['fastcgi']['fastcgi_phpini_path'], $content);
                mkdir($conf['web']['website_basedir'].'/php-fcgi-scripts/apps', 0755, true);
@@ -1566,7 +1564,7 @@
            $apps_vhost_servername = ($conf['web']['apps_vhost_servername'] == '')?'_':$conf['web']['apps_vhost_servername'];
            // Dont just copy over the virtualhost template but add some custom settings
            $content = rf('tpl/nginx_apps.vhost.master');
            $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/nginx_apps.vhost.master', 'tpl/nginx_apps.vhost.master');
            if($conf['web']['apps_vhost_ip'] == '_default_'){
                $apps_vhost_ip = '';
@@ -1602,7 +1600,7 @@
            // PHP-FPM
            // Dont just copy over the php-fpm pool template but add some custom settings
            $content = rf('tpl/apps_php_fpm_pool.conf.master');
            $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/apps_php_fpm_pool.conf.master', 'tpl/apps_php_fpm_pool.conf.master');
            $content = str_replace('{fpm_pool}', 'apps', $content);
            //$content = str_replace('{fpm_port}', ($conf['nginx']['php_fpm_start_port']+1), $content);
            $content = str_replace('{fpm_socket}', $fpm_socket, $content);
@@ -1677,7 +1675,7 @@
        if(is_file($install_dir.'/interface/lib/'.$configfile)) {
            copy($install_dir.'/interface/lib/'.$configfile, $install_dir.'/interface/lib/'.$configfile.'~');
        }
        $content = rf('tpl/'.$configfile.'.master');
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master');
        $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
        $content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
@@ -1701,7 +1699,7 @@
        if(is_file($install_dir.'/server/lib/'.$configfile)) {
            copy($install_dir.'/server/lib/'.$configfile, $install_dir.'/interface/lib/'.$configfile.'~');
        }
        $content = rf('tpl/'.$configfile.'.master');
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master');
        $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
        $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
@@ -1894,7 +1892,7 @@
            $vhost_conf_enabled_dir = $conf['apache']['vhost_conf_enabled_dir'];
            // Dont just copy over the virtualhost template but add some custom settings
            $content = rf('tpl/apache_ispconfig.vhost.master');
            $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/apache_ispconfig.vhost.master', 'tpl/apache_ispconfig.vhost.master');
            $content = str_replace('{vhost_port}', $conf['apache']['vhost_port'], $content);
            // comment out the listen directive if port is 80 or 443
@@ -1926,7 +1924,7 @@
                }
            }
            //if(!is_file('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter')) {
                $content = rf('tpl/apache_ispconfig_fcgi_starter.master');
                $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/apache_ispconfig_fcgi_starter.master', 'tpl/apache_ispconfig_fcgi_starter.master');
                $content = str_replace('{fastcgi_bin}', $conf['fastcgi']['fastcgi_bin'], $content);
                $content = str_replace('{fastcgi_phpini_path}', $conf['fastcgi']['fastcgi_phpini_path'], $content);
                @mkdir('/var/www/php-fcgi-scripts/ispconfig', 0755, true);
@@ -1943,7 +1941,7 @@
            $vhost_conf_enabled_dir = $conf['nginx']['vhost_conf_enabled_dir'];
            // Dont just copy over the virtualhost template but add some custom settings
            $content = rf('tpl/nginx_ispconfig.vhost.master');
            $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/nginx_ispconfig.vhost.master', 'tpl/nginx_ispconfig.vhost.master');
            $content = str_replace('{vhost_port}', $conf['nginx']['vhost_port'], $content);
            if(is_file($install_dir.'/interface/ssl/ispserver.crt') && is_file($install_dir.'/interface/ssl/ispserver.key')) {
@@ -1970,7 +1968,7 @@
            // PHP-FPM
            // Dont just copy over the php-fpm pool template but add some custom settings
            $content = rf('tpl/php_fpm_pool.conf.master');
            $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/php_fpm_pool.conf.master', 'tpl/php_fpm_pool.conf.master');
            $content = str_replace('{fpm_pool}', 'ispconfig', $content);
            //$content = str_replace('{fpm_port}', $conf['nginx']['php_fpm_start_port'], $content);
            $content = str_replace('{fpm_socket}', $fpm_socket, $content);
@@ -2070,7 +2068,7 @@
            caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
        }
        $content = rf('tpl/mysql_clientdb.conf.master');
        $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/mysql_clientdb.conf.master', 'tpl/mysql_clientdb.conf.master');
        $content = str_replace('{hostname}',$conf['mysql']['host'],$content);
        $content = str_replace('{username}',$conf['mysql']['admin_user'],$content);
        $content = str_replace('{password}',$conf['mysql']['admin_password'], $content);
@@ -2162,12 +2160,17 @@
        global $conf, $dist;
        $final_path = '';
        $dist_template = 'dist/tpl/'.strtolower($dist['name'])."/$tLocal.master";
        if (file_exists($dist_template)) {
        $dist_template = $conf['ispconfig_install_dir'] . '/server/conf-custom/install/' . $tLocal . '.master';
        if (file_exists($dist_template)) {
            $final_path = $dist_template;
        } else {
            $final_path = "tpl/$tLocal.master";
        }
            $dist_template = 'dist/tpl/'.strtolower($dist['name'])."/$tLocal.master";
            if (file_exists($dist_template)) {
                $final_path = $dist_template;
            } else {
                $final_path = "tpl/$tLocal.master";
            }
        }
        if (!$tRf) {
            return $final_path;
install/sql/incremental/upd_0051.sql
New file
@@ -0,0 +1,2 @@
UPDATE `country` SET `iso` = 'RS', `name` = 'SERBIA', `printable_name` = 'Serbia', `iso3` = 'SRB', `numcode` = 381 WHERE `iso` = 'CS';
INSERT INTO `country` (`iso`, `name`, `printable_name`, `iso3`, `numcode`) VALUES ('ME', 'MONTENEGRO', 'Montenegro', 'MNE', 382);
install/sql/incremental/upd_0052.sql
@@ -2,3 +2,4 @@
ALTER TABLE `mail_domain` ADD `dkim_public` MEDIUMTEXT NOT NULL AFTER `domain`;
ALTER TABLE `mail_domain` ADD `dkim_private` MEDIUMTEXT NOT NULL AFTER `domain`;
ALTER TABLE `mail_domain` ADD `dkim` ENUM( 'n', 'y' ) NOT NULL AFTER `domain`;
ALTER TABLE `client` ADD `default_slave_dnsserver` INT( 11 ) UNSIGNED NOT NULL DEFAULT '1' AFTER `limit_dns_zone`;
install/sql/incremental/upd_0053.sql
New file
@@ -0,0 +1,2 @@
ALTER TABLE `web_domain` ADD `last_quota_notification` DATE NULL DEFAULT NULL;
ALTER TABLE `mail_user` ADD `last_quota_notification` DATE NULL DEFAULT NULL;
install/sql/incremental/upd_0054.sql
New file
@@ -0,0 +1 @@
ALTER TABLE `web_domain` ADD `rewrite_rules` MEDIUMTEXT NULL DEFAULT NULL;
install/sql/ispconfig3.sql
@@ -204,6 +204,7 @@
  `limit_aps` int(11) NOT NULL DEFAULT '-1',
  `default_dnsserver` int(11) unsigned NOT NULL DEFAULT '1',
  `limit_dns_zone` int(11) NOT NULL DEFAULT '-1',
  `default_slave_dnsserver` int(11) unsigned NOT NULL DEFAULT '1',
  `limit_dns_slave_zone` int(11) NOT NULL DEFAULT '-1',
  `limit_dns_record` int(11) NOT NULL DEFAULT '-1',
  `default_dbserver` int(11) NOT NULL DEFAULT '1',
@@ -839,6 +840,7 @@
  `disablesieve` enum('n','y') NOT NULL default 'n',
  `disablelda` enum('n','y') NOT NULL default 'n',
  `disabledoveadm` enum('n','y') NOT NULL default 'n',
  `last_quota_notification` date NULL default NULL,
  PRIMARY KEY  (`mailuser_id`),
  KEY `server_id` (`server_id`,`email`),
  KEY `email_access` (`email`,`access`)
@@ -1761,6 +1763,8 @@
  `traffic_quota_lock` enum('n','y') NOT NULL default 'n',
  `fastcgi_php_version` varchar(255) DEFAULT NULL,
  `proxy_directives` mediumtext,
  `last_quota_notification` date NULL default NULL,
  `rewrite_rules` mediumtext,
  PRIMARY KEY  (`domain_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
@@ -2036,7 +2040,7 @@
('ST', 'SAO TOME AND PRINCIPE', 'Sao Tome and Principe', 'STP', 678),
('SA', 'SAUDI ARABIA', 'Saudi Arabia', 'SAU', 682),
('SN', 'SENEGAL', 'Senegal', 'SEN', 686),
('CS', 'SERBIA AND MONTENEGRO', 'Serbia and Montenegro', NULL, NULL),
('RS', 'SERBIA', 'Serbia', 'SRB', 381),
('SC', 'SEYCHELLES', 'Seychelles', 'SYC', 690),
('SL', 'SIERRA LEONE', 'Sierra Leone', 'SLE', 694),
('SG', 'SINGAPORE', 'Singapore', 'SGP', 702),
@@ -2086,7 +2090,8 @@
('EH', 'WESTERN SAHARA', 'Western Sahara', 'ESH', 732),
('YE', 'YEMEN', 'Yemen', 'YEM', 887),
('ZM', 'ZAMBIA', 'Zambia', 'ZMB', 894),
('ZW', 'ZIMBABWE', 'Zimbabwe', 'ZWE', 716);
('ZW', 'ZIMBABWE', 'Zimbabwe', 'ZWE', 716),
('ME', 'MONTENEGRO', 'Montenegro', 'MNE', 382);
-- --------------------------------------------------------
install/tpl/apache_ispconfig.vhost.master
@@ -18,7 +18,7 @@
    DocumentRoot /var/www/ispconfig/
    SuexecUserGroup ispconfig ispconfig
    <Directory /var/www/ispconfig/>
      Options Indexes FollowSymLinks MultiViews +ExecCGI
      Options -Indexes FollowSymLinks MultiViews +ExecCGI
      AllowOverride AuthConfig Indexes Limit Options FileInfo
      AddHandler fcgid-script .php
      FCGIWrapper /var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter .php
install/tpl/debian6_dovecot2.conf.master
@@ -31,6 +31,10 @@
  }
  user = root
}
service imap-login {
  client_limit = 1000
  process_limit = 500
}
protocol imap {
  mail_plugins = quota imap_quota
}
install/tpl/debian_dovecot2.conf.master
@@ -31,6 +31,10 @@
  }
  user = root
}
service imap-login {
  client_limit = 1000
  process_limit = 500
}
protocol imap {
  mail_plugins = quota imap_quota
}
install/tpl/debian_postfix.conf.master
New file
@@ -0,0 +1,33 @@
alias_maps = hash:/etc/aliases, hash:/var/lib/mailman/data/aliases
alias_database = hash:/etc/aliases, hash:/var/lib/mailman/data/aliases
virtual_alias_domains =
virtual_alias_maps = proxy:mysql:{config_dir}/mysql-virtual_forwardings.cf, proxy:mysql:{config_dir}/mysql-virtual_email2email.cf, hash:/var/lib/mailman/data/virtual-mailman
virtual_mailbox_domains = proxy:mysql:{config_dir}/mysql-virtual_domains.cf
virtual_mailbox_maps = proxy:mysql:{config_dir}/mysql-virtual_mailboxes.cf
virtual_mailbox_base = {vmail_mailbox_base}
virtual_uid_maps = static:{vmail_userid}
virtual_gid_maps = static:{vmail_groupid}
inet_protocols=all
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_authenticated_header = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf, reject_unauth_destination{rbl_list}
smtpd_use_tls = yes
smtpd_tls_security_level = may
smtpd_tls_cert_file = {config_dir}/smtpd.cert
smtpd_tls_key_file = {config_dir}/smtpd.key
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
smtpd_sender_restrictions = check_sender_access mysql:{config_dir}/mysql-virtual_sender.cf
smtpd_client_restrictions = check_client_access mysql:{config_dir}/mysql-virtual_client.cf
smtpd_client_message_rate_limit = 100
maildrop_destination_concurrency_limit = 1
maildrop_destination_recipient_limit   = 1
virtual_transport = maildrop
header_checks = regexp:{config_dir}/header_checks
mime_header_checks = regexp:{config_dir}/mime_header_checks
nested_header_checks = regexp:{config_dir}/nested_header_checks
body_checks = regexp:{config_dir}/body_checks
owner_request_special = no
install/tpl/fedora_dovecot2.conf.master
@@ -31,6 +31,10 @@
  }
  user = root
}
service imap-login {
  client_limit = 1000
  process_limit = 500
}
protocol imap {
  mail_plugins = quota imap_quota
}
install/tpl/fedora_postfix.conf.master
New file
@@ -0,0 +1,30 @@
virtual_alias_domains =
virtual_alias_maps = proxy:mysql:{config_dir}/mysql-virtual_forwardings.cf, proxy:mysql:{config_dir}/mysql-virtual_email2email.cf
virtual_mailbox_domains = proxy:mysql:{config_dir}/mysql-virtual_domains.cf
virtual_mailbox_maps = proxy:mysql:{config_dir}/mysql-virtual_mailboxes.cf
virtual_mailbox_base = {vmail_mailbox_base}
virtual_uid_maps = static:{vmail_userid}
virtual_gid_maps = static:{vmail_groupid}
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_authenticated_header = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf, reject_unauth_destination{rbl_list}
smtpd_use_tls = yes
smtpd_tls_security_level = may
smtpd_tls_cert_file = {config_dir}/smtpd.cert
smtpd_tls_key_file = {config_dir}/smtpd.key
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
smtpd_sender_restrictions = check_sender_access mysql:{config_dir}/mysql-virtual_sender.cf
smtpd_client_restrictions = check_client_access mysql:{config_dir}/mysql-virtual_client.cf
smtpd_client_message_rate_limit = 100
maildrop_destination_concurrency_limit = 1
maildrop_destination_recipient_limit   = 1
virtual_transport = maildrop
header_checks = regexp:{config_dir}/header_checks
mime_header_checks = regexp:{config_dir}/mime_header_checks
nested_header_checks = regexp:{config_dir}/nested_header_checks
body_checks = regexp:{config_dir}/body_checks
inet_interfaces = all
install/tpl/gentoo_postfix.conf.master
New file
@@ -0,0 +1,30 @@
virtual_alias_domains =
virtual_alias_maps = proxy:mysql:{config_dir}/mysql-virtual_forwardings.cf, proxy:mysql:{config_dir}/mysql-virtual_email2email.cf
virtual_mailbox_domains = proxy:mysql:{config_dir}/mysql-virtual_domains.cf
virtual_mailbox_maps = proxy:mysql:{config_dir}/mysql-virtual_mailboxes.cf
virtual_mailbox_base = {vmail_mailbox_base}
virtual_uid_maps = static:{vmail_userid}
virtual_gid_maps = static:{vmail_groupid}
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_authenticated_header = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf, reject_unauth_destination{rbl_list}
smtpd_use_tls = yes
smtpd_tls_security_level = may
smtpd_tls_cert_file = {config_dir}/smtpd.cert
smtpd_tls_key_file = {config_dir}/smtpd.key
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
smtpd_sender_restrictions = check_sender_access mysql:{config_dir}/mysql-virtual_sender.cf
smtpd_client_restrictions = check_client_access mysql:{config_dir}/mysql-virtual_client.cf
smtpd_client_message_rate_limit = 100
maildrop_destination_concurrency_limit = 1
maildrop_destination_recipient_limit   = 1
virtual_transport = maildrop
header_checks = regexp:{config_dir}/header_checks
mime_header_checks = regexp:{config_dir}/mime_header_checks
nested_header_checks = regexp:{config_dir}/nested_header_checks
body_checks = regexp:{config_dir}/body_checks
inet_interfaces = all
install/tpl/opensuse_dovecot2.conf.master
@@ -31,6 +31,10 @@
  }
  user = root
}
service imap-login {
  client_limit = 1000
  process_limit = 500
}
protocol imap {
  mail_plugins = quota imap_quota
}
install/tpl/opensuse_postfix.conf.master
New file
@@ -0,0 +1,30 @@
virtual_alias_domains =
virtual_alias_maps = proxy:mysql:{config_dir}/mysql-virtual_forwardings.cf, proxy:mysql:{config_dir}/mysql-virtual_email2email.cf
virtual_mailbox_domains = proxy:mysql:{config_dir}/mysql-virtual_domains.cf
virtual_mailbox_maps = proxy:mysql:{config_dir}/mysql-virtual_mailboxes.cf
virtual_mailbox_base = {vmail_mailbox_base}
virtual_uid_maps = static:{vmail_userid}
virtual_gid_maps = static:{vmail_groupid}
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_authenticated_header = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf, reject_unauth_destination{rbl_list}
smtpd_use_tls = yes
smtpd_tls_security_level = may
smtpd_tls_cert_file = {config_dir}/smtpd.cert
smtpd_tls_key_file = {config_dir}/smtpd.key
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
smtpd_sender_restrictions = check_sender_access mysql:{config_dir}/mysql-virtual_sender.cf
smtpd_client_restrictions = check_client_access mysql:{config_dir}/mysql-virtual_client.cf
smtpd_client_message_rate_limit = 100
maildrop_destination_concurrency_limit = 1
maildrop_destination_recipient_limit   = 1
virtual_transport = maildrop
header_checks = regexp:{config_dir}/header_checks
mime_header_checks = regexp:{config_dir}/mime_header_checks
nested_header_checks = regexp:{config_dir}/nested_header_checks
body_checks = regexp:{config_dir}/body_checks
inet_interfaces = all
install/tpl/server.ini.master
@@ -14,8 +14,15 @@
nameservers=8.8.8.8,8.8.4.4
firewall=bastille
loglevel=2
admin_notify_events=1
backup_dir=/var/backup
backup_mode=rootgz
monit_url=
monit_user=
monit_password=
munin_url=
munin_user=
munin_password=
[mail]
module=postfix_mysql
@@ -35,6 +42,10 @@
message_size_limit=0
mailbox_quota_stats=y
realtime_blackhole_list=
overquota_notify_admin=y
overquota_notify_client=y
overquota_notify_freq=7
overquota_notify_onok=n
sendmail_path=/usr/sbin/sendmail
[getmail]
@@ -58,7 +69,7 @@
apps_vhost_port=8081
apps_vhost_ip=_default_
apps_vhost_servername=
php_open_basedir=[website_path]/web:[website_path]/private:[website_path]/tmp:/var/www/[website_domain]/web:/srv/www/[website_domain]/web:/usr/share/php5:/usr/share/php:/tmp:/usr/share/phpmyadmin:/etc/phpmyadmin:/var/lib/phpmyadmin:/usr/share/php
php_open_basedir=[website_path]/web:[website_path]/private:[website_path]/tmp:/var/www/[website_domain]/web:/srv/www/[website_domain]/web:/usr/share/php5:/usr/share/php:/tmp:/usr/share/phpmyadmin:/etc/phpmyadmin:/var/lib/phpmyadmin
htaccess_allow_override=All
awstats_conf_dir=/etc/awstats
awstats_data_dir=/var/lib/awstats
@@ -82,8 +93,12 @@
connect_userid_to_webid=n
connect_userid_to_webid_start=10000
web_folder_protection=y
php_ini_check_minutes=1
<<<<<<< .minephp_ini_check_minutes=1
=======overquota_notify_admin=y
overquota_notify_client=y
overquota_notify_freq=7
overquota_notify_onok=n
>>>>>>> .theirs
[dns]
bind_user=root
bind_group=bind
interface/lib/classes/functions.inc.php
@@ -130,10 +130,21 @@
    }
    
    public function get_ispconfig_url() {
        global $app;
        $url = (stristr($_SERVER['SERVER_PROTOCOL'],'HTTPS') || stristr($_SERVER['HTTPS'],'on'))?'https':'http';
        $url .= '://'.$_SERVER['SERVER_NAME'];
        if($_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443) {
            $url .= ':'.$_SERVER['SERVER_PORT'];
        if($_SERVER['SERVER_NAME'] != '_') {
            $url .= '://'.$_SERVER['SERVER_NAME'];
            if($_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443) {
                $url .= ':'.$_SERVER['SERVER_PORT'];
            }
        } else {
            $app->uses("getconf");
            $server_config = $app->getconf->get_server_config(1,'server');
            $url .= '://'.$server_config['hostname'];
            if($_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443) {
                $url .= ':'.$_SERVER['SERVER_PORT'];
            }
        }
        return $url;
    }
interface/lib/classes/ispcmail.inc.php
@@ -414,16 +414,22 @@
            $this->body = "This is a multi-part message in MIME format.\n\n";
            
            if($text) {
                $this->body .= "--{$this->mime_boundary}\n" .
                /*$this->body .= "--{$this->mime_boundary}\n" .
                              "Content-Type:text/plain; charset=\"" . strtolower($this->mail_charset) . "\"\n" .
                              "Content-Transfer-Encoding: 7bit\n\n" . $this->text_part . "\n\n";
            }
                              "Content-Transfer-Encoding: 7bit\n\n" . $this->text_part . "\n\n";*/
                $this->body .= "--{$this->mime_boundary}\n" .
                              "Content-Type:text/plain; charset=\"UTF-8\"\n" .
                              "Content-Transfer-Encoding: 8bit\n\n" . $this->text_part . "\n\n";
            }
            
            if($html) {
                $this->body .= "--{$this->mime_boundary}\n" .
                /*$this->body .= "--{$this->mime_boundary}\n" .
                               "Content-Type:text/html; charset=\"" . strtolower($this->mail_charset) . "\"\n" . 
                               "Content-Transfer-Encoding: 7bit\n\n" . $this->html_part . "\n\n";
            }
                               "Content-Transfer-Encoding: 7bit\n\n" . $this->html_part . "\n\n";*/
                $this->body .= "--{$this->mime_boundary}\n" .
                              "Content-Type:text/html; charset=\"UTF-8\"\n" .
                              "Content-Transfer-Encoding: 8bit\n\n" . $this->html_part . "\n\n";
            }
            
            if($attach) {
                foreach($this->attachments as $att) {
@@ -490,17 +496,42 @@
        $this->_is_signed = true;
    }
    
    private function _char_to_hex($matches) {
        return '=' . strtoupper(dechex(ord($matches[1])));
    }
    /**
    * Function to encode a header if necessary
    * according to RFC2047
    * @access private
    */
    private function _encodeHeader($input, $charset = 'ISO-8859-1') {
        preg_match_all('/(\s?\w*[\x80-\xFF]+\w*\s?)/', $input, $matches);
        foreach ($matches[1] as $value) {
            $replacement = preg_replace('/([\x20\x80-\xFF])/e', '"=" . strtoupper(dechex(ord("\1")))', $value);
            $input = str_replace($value, '=?' . $charset . '?Q?' . $replacement . '?=', $input);
        }
        preg_match_all('/(\s?\w*[\x80-\xFF]+\w*\s?)/', $input, $matches);
        foreach ($matches[1] as $value) {
            $replacement = preg_replace_callback('/([\x20\x80-\xFF])/', array($this, '_char_to_hex'), $value);
            $input = str_replace($value, '=?' . $charset . '?Q?' . $replacement . '?=', $input);
        }
        return $input;
    }
    /**
    * Function to encode the subject if necessary
    * according to RFC2047
    * @access private
    */
    private function _encodeSubject($input, $charset = 'ISO-8859-1') {
        /*
        if($charset == 'UTF-8' && function_exists('imap_8bit')) {
            $input = "=?utf-8?Q?" . imap_8bit($input) . "?=";
        } else {
            preg_match_all('/(\s?\w*[\x80-\xFF]+\w*\s?)/', $input, $matches);
            foreach ($matches[1] as $value) {
                $replacement = preg_replace('/([\x20\x80-\xFF])/e', '"=" . strtoupper(dechex(ord("\1")))', $value);
                $input = str_replace($value, '=?' . $charset . '?Q?' . $replacement . '?=', $input);
            }
        }*/
        $input='=?UTF-8?B?'.base64_encode($input).'?=';
        
        return $input;
    }
@@ -578,7 +609,8 @@
            //$subject = $this->_encodeHeader($this->headers['Subject'], $this->mail_charset);
            $subject = $this->headers['Subject'];
            
            $enc_subject = $this->_encodeHeader($subject, $this->mail_charset);
            //$enc_subject = $this->_encodeHeader($subject, $this->mail_charset);
            $enc_subject = $this->_encodeSubject($subject, $this->mail_charset);
            unset($this->headers['Subject']);
        }
        
interface/lib/classes/listform.inc.php
@@ -180,9 +180,10 @@
        if(@is_array($this->listDef['item'])) { 
            foreach($this->listDef['item'] as $i) {
                $field = $i['field'];
                $table = $i['table'];
                // if($_REQUEST[$search_prefix.$field] != '') $sql_where .= " $field ".$i["op"]." '".$i["prefix"].$_REQUEST[$search_prefix.$field].$i["suffix"]."' and";
                if(isset($_SESSION['search'][$list_name][$search_prefix.$field]) && $_SESSION['search'][$list_name][$search_prefix.$field] != ''){
                    $sql_where .= " $field ".$i['op']." '".$app->db->quote($i['prefix'].$_SESSION['search'][$list_name][$search_prefix.$field].$i['suffix'])."' and";
                    $sql_where .= " ".($table != ''? $table.'.' : $this->listDef['table'].'.')."$field ".$i['op']." '".$app->db->quote($i['prefix'].$_SESSION['search'][$list_name][$search_prefix.$field].$i['suffix'])."' and";
                }
            }
        }
@@ -216,7 +217,7 @@
        if($this->searchChanged == 1) $_SESSION['search'][$list_name]['page'] = 0;
        $sql_von = $app->functions->intval($_SESSION['search'][$list_name]['page'] * $records_per_page);
        $record_count = $app->db->queryOneRecord("SELECT count(*) AS anzahl FROM $table WHERE $sql_where");
        $record_count = $app->db->queryOneRecord("SELECT count(*) AS anzahl FROM $table".($app->listform->listDef['additional_tables'] != ''? ','.$app->listform->listDef['additional_tables'] : '')." WHERE $sql_where");
        $pages = $app->functions->intval(($record_count['anzahl'] - 1) / $records_per_page);
@@ -357,6 +358,16 @@
                            }
                        }
                        break;
                    case 'DATETIMETSTAMP':
                        if ($record[$key] > 0) {
                            // is value int?
                            if (preg_match("/^[0-9]+[\.]?[0-9]*$/", $record[$key], $p)) {
                                $record[$key] = date($this->lng('conf_format_datetime'), $record[$key]);
                            } else {
                                $record[$key] = date($this->lng('conf_format_datetime'), strtotime($record[$key]));
                            }
                        }
                        break;
                    case 'DATE':
                        if ($record[$key] > 0) {
                            // is value int?
@@ -422,6 +433,12 @@
                            $record[$key] = date('Y-m-d',strtotime($record[$key]));
                        }
                        break;
                    case 'DATETIMETSTAMP':
                        if($record[$key] > 0) {
                            $record[$key] = date('Y-m-d H:i:s',strtotime($record[$key]));
                        }
                        break;
                    
                    case 'DATE':
                        if($record[$key] != '' && $record[$key] != '0000-00-00') {
interface/lib/classes/listform_actions.inc.php
@@ -36,7 +36,27 @@
    public $SQLExtWhere = '';
    public $SQLOrderBy = '';
    public $SQLExtSelect = '';
    private $sortKeys;
    private function _sort($aOne, $aTwo) {
        if(!is_array($aOne) || !is_array($aTwo)) return 0;
        if(!is_array($this->sortKeys)) $this->sortKeys = array($this->sortKeys);
        foreach($this->sortKeys as $sKey => $sDir) {
            if(is_numeric($sKey)) {
                $sKey = $sDir;
                $sDir = 'ASC';
            }
            $a = $aOne[$sKey];
            $b = $aTwo[$sKey];
            if(is_string($a)) $a = strtolower($a);
            if(is_string($b)) $b = strtolower($b);
            if($a < $b) return ($sDir == 'DESC' ? 1 : -1);
            elseif($a > $b) return ($sDir == 'DESC' ? -1 : 1);
        }
        return 0;
    }
    public function onLoad()
    {
        global $app, $conf, $list_def_file;
@@ -59,28 +79,49 @@
        
        //* Manipulate order by for sorting / Every list has a stored value
        //* Against notice error
        if(!isset($_SESSION['search'][$app->listform->listDef["name"].$app->listform->listDef['table']]['order'])){
          $_SESSION['search'][$app->listform->listDef["name"].$app->listform->listDef['table']]['order'] = '';
        if(!isset($_SESSION['search'][$_SESSION['s']['module']['name'].$app->listform->listDef["name"].$app->listform->listDef['table']]['order'])){
          $_SESSION['search'][$_SESSION['s']['module']['name'].$app->listform->listDef["name"].$app->listform->listDef['table']]['order'] = '';
        }
        $php_sort = false;
        if(!empty($_GET['orderby'])){
          $order = str_replace('tbl_col_','',$_GET['orderby']);
          //* Check the css class submited value
          if (preg_match("/^[a-z\_]{1,}$/",$order)) {
            if($_SESSION['search'][$app->listform->listDef["name"].$app->listform->listDef['table']]['order'] == $order){
              $_SESSION['search'][$app->listform->listDef["name"].$app->listform->listDef['table']]['order'] = $order.' DESC';
            if(isset($app->listform->listDef['phpsort']) && is_array($app->listform->listDef['phpsort']) && in_array($order, $app->listform->listDef['phpsort'])) {
                $php_sort = true;
            } else {
                // prepend correct table
                $prepend_table = $app->listform->listDef['table'];
                if(trim($app->listform->listDef['additional_tables']) != '' && is_array($app->listform->listDef['item']) && count($app->listform->listDef['item']) > 0) {
                    foreach($app->listform->listDef['item'] as $field) {
                        if($field['field'] == $order && $field['table'] != ''){
                            $prepend_table = $field['table'];
                            break;
                        }
                    }
                }
                $order = $prepend_table.'.'.$order;
            }
            if($_SESSION['search'][$_SESSION['s']['module']['name'].$app->listform->listDef["name"].$app->listform->listDef['table']]['order'] == $order){
                $_SESSION['search'][$_SESSION['s']['module']['name'].$app->listform->listDef["name"].$app->listform->listDef['table']]['order'] = $order.' DESC';
            } else {
              $_SESSION['search'][$app->listform->listDef["name"].$app->listform->listDef['table']]['order'] = $order;
                $_SESSION['search'][$_SESSION['s']['module']['name'].$app->listform->listDef["name"].$app->listform->listDef['table']]['order'] = $order;
            }
            $_SESSION['search'][$_SESSION['s']['module']['name'].$app->listform->listDef["name"].$app->listform->listDef['table']]['order_in_php'] = $php_sort;
          }
        }
        // If a manuel oder by like customers isset the sorting will be infront
        if(!empty($_SESSION['search'][$app->listform->listDef["name"].$app->listform->listDef['table']]['order'])){
          if(empty($this->SQLOrderBy)){
            $this->SQLOrderBy = "ORDER BY ".$_SESSION['search'][$app->listform->listDef["name"].$app->listform->listDef['table']]['order'];
        if(!empty($_SESSION['search'][$_SESSION['s']['module']['name'].$app->listform->listDef["name"].$app->listform->listDef['table']]['order']) && !$_SESSION['search'][$_SESSION['s']['module']['name'].$app->listform->listDef["name"].$app->listform->listDef['table']]['order_in_php']){
          if(empty($this->SQLOrderBy)){
            $this->SQLOrderBy = "ORDER BY ".$_SESSION['search'][$_SESSION['s']['module']['name'].$app->listform->listDef["name"].$app->listform->listDef['table']]['order'];
          } else {
            $this->SQLOrderBy = str_replace("ORDER BY ","ORDER BY ".$_SESSION['search'][$app->listform->listDef["name"].$app->listform->listDef['table']]['order'].', ',$this->SQLOrderBy);
            $this->SQLOrderBy = str_replace("ORDER BY ","ORDER BY ".$_SESSION['search'][$_SESSION['s']['module']['name'].$app->listform->listDef["name"].$app->listform->listDef['table']]['order'].', ',$this->SQLOrderBy);
          }
        }
        
@@ -95,7 +136,18 @@
                $records_new[] = $this->prepareDataRow($rec);
            }
        }
        if(!empty($_SESSION['search'][$_SESSION['s']['module']['name'].$app->listform->listDef["name"].$app->listform->listDef['table']]['order']) && $_SESSION['search'][$_SESSION['s']['module']['name'].$app->listform->listDef["name"].$app->listform->listDef['table']]['order_in_php']) {
            $order_by = $_SESSION['search'][$_SESSION['s']['module']['name'].$app->listform->listDef["name"].$app->listform->listDef['table']]['order'];
            $order_dir = 'ASC';
            if(substr($order_by, -5) === ' DESC') {
                $order_by = substr($order_by, 0, -5);
                $order_dir = 'DESC';
            }
            $this->sortKeys = array($order_by => $order_dir);
            uasort($records_new, array($this, '_sort'));
        }
        $app->tpl->setLoop('records',$records_new);
        $this->onShow();
@@ -133,7 +185,7 @@
        return $rec;
    }
    
    private function getQueryString() {
    public function getQueryString() {
        global $app;
        $sql_where = '';
@@ -151,6 +203,7 @@
        }
        
        $sql_where = $app->listform->getSearchSQL($sql_where);
        if($app->listform->listDef['join_sql']) $sql_where .= ' AND '.$app->listform->listDef['join_sql'];
        $app->tpl->setVar($app->listform->searchValues);
        
        $order_by_sql = $this->SQLOrderBy;
@@ -161,109 +214,26 @@
        $extselect = '';
        $join = '';
        if(!empty($_SESSION['search'][$app->listform->listDef["name"].$app->listform->listDef['table']]['order'])){
          $order = str_replace(' DESC','',$_SESSION['search'][$app->listform->listDef["name"].$app->listform->listDef['table']]['order']);
          if($order == 'server_id' && $app->listform->listDef['table'] != 'server'){
            $join .= ' LEFT JOIN server as s ON '.$app->listform->listDef['table'].'.server_id = s.server_id ';
            $order_by_sql = str_replace('server_id','s.server_name',$order_by_sql);
          } elseif($order == 'client_id' && $app->listform->listDef['table'] != 'client'){
            $join .= ' LEFT JOIN client as c ON '.$app->listform->listDef['table'].'.client_id = c.client_id ';
            $order_by_sql = str_replace('client_id','c.contact_name',$order_by_sql);
          } elseif($order == 'parent_domain_id'){
            $join .= ' LEFT JOIN web_domain as wd ON '.$app->listform->listDef['table'].'.parent_domain_id = wd.domain_id ';
            //$order_by_sql = str_replace(' domain', ' '.$app->listform->listDef['table'].'.domain',$order_by_sql);
            //$order_by_sql = str_replace('parent_domain_id','wd.domain',$order_by_sql);
            $order_by_sql = preg_replace('@( |,|^)(domain)( |,|$)@', '$1'.$app->listform->listDef['table'].'.$2$3', $order_by_sql);
            $order_by_sql = preg_replace('@( |,|^)(parent_domain_id)( |,|$)@', '$1wd.domain$3', $order_by_sql);
            //$sql_where = str_replace('type',$app->listform->listDef['table'].'.type',$sql_where);
            //$sql_where = str_replace(' domain',' '.$app->listform->listDef['table'].'.domain',$sql_where);
            $sql_where = preg_replace('@( |,|^)(type)( |,|$)@', '$1'.$app->listform->listDef['table'].'.$2$3', $sql_where);
            $sql_where = preg_replace('@( |,|^)(domain)( |,|$)@', '$1'.$app->listform->listDef['table'].'.$2$3', $sql_where);
          } elseif($order == 'sys_groupid'){
            $join .= ' LEFT JOIN sys_group as sg ON '.$app->listform->listDef['table'].'.sys_groupid = sg.groupid ';
            $order_by_sql = str_replace('sys_groupid','sg.name',$order_by_sql);
          } elseif($order == 'rid'){
            $join .= ' LEFT JOIN spamfilter_users as su ON '.$app->listform->listDef['table'].'.rid = su.id ';
            $order_by_sql = str_replace('rid','su.email',$order_by_sql);
          } elseif($order == 'policy_id'){
            $join .= ' LEFT JOIN spamfilter_policy as sp ON '.$app->listform->listDef['table'].'.policy_id = sp.id ';
            $order_by_sql = str_replace('policy_id','sp.policy_name',$order_by_sql);
          } elseif($order == 'web_folder_id'){
            $join .= ' LEFT JOIN web_folder as wf ON '.$app->listform->listDef['table'].'.web_folder_id = wf.web_folder_id ';
            $order_by_sql = str_replace('web_folder_id','wf.path',$order_by_sql);
          } elseif($order == 'ostemplate_id' && $app->listform->listDef['table'] != 'openvz_ostemplate'){
            $join .= ' LEFT JOIN openvz_ostemplate as oo ON '.$app->listform->listDef['table'].'.ostemplate_id = oo.ostemplate_id ';
            $order_by_sql = str_replace('ostemplate_id','oo.template_name',$order_by_sql);
          } elseif($order == 'template_id' && $app->listform->listDef['table'] != 'openvz_template'){
            $join .= ' LEFT JOIN openvz_template as ot ON '.$app->listform->listDef['table'].'.template_id = ot.template_id ';
            $order_by_sql = str_replace('template_id','ot.template_name',$order_by_sql);
          } elseif($order == 'sender_id' && $app->listform->listDef['table'] != 'sys_user'){
            $join .= ' LEFT JOIN sys_user as su ON '.$app->listform->listDef['table'].'.sender_id = su.userid ';
            $order_by_sql = str_replace('sender_id','su.username',$order_by_sql);
          } elseif($order == 'web_traffic_last_month'){
            $tmp_year = date('Y',mktime(0, 0, 0, date("m")-1, date("d"), date("Y")));
            $tmp_month = date('m',mktime(0, 0, 0, date("m")-1, date("d"), date("Y")));
            $extselect .= ', SUM(wt.traffic_bytes) as calctraffic';
            $join .= ' INNER JOIN web_traffic as wt ON '.$app->listform->listDef['table'].'.domain = wt.hostname ';
            $sql_where .= " AND YEAR(wt.traffic_date) = '$tmp_year' AND MONTH(wt.traffic_date) = '$tmp_month'";
            $order_by_sql = str_replace('web_traffic_last_month','calctraffic',$order_by_sql);
            $order_by_sql = "GROUP BY domain ".$order_by_sql;
          } elseif($order == 'web_traffic_this_month'){
            $tmp_year = date('Y');
            $tmp_month = date('m');
            $extselect .= ', SUM(wt.traffic_bytes) as calctraffic';
            $join .= ' INNER JOIN web_traffic as wt ON '.$app->listform->listDef['table'].'.domain = wt.hostname ';
            $sql_where .= " AND YEAR(wt.traffic_date) = '$tmp_year' AND MONTH(wt.traffic_date) = '$tmp_month'";
            $order_by_sql = str_replace('web_traffic_this_month','calctraffic',$order_by_sql);
            $order_by_sql = "GROUP BY domain ".$order_by_sql;
          } elseif($order == 'web_traffic_last_year'){
            $tmp_year = date('Y',mktime(0, 0, 0, date("m")-1, date("d"), date("Y")));
            $extselect .= ', SUM(wt.traffic_bytes) as calctraffic';
            $join .= ' INNER JOIN web_traffic as wt ON '.$app->listform->listDef['table'].'.domain = wt.hostname ';
            $sql_where .= " AND YEAR(wt.traffic_date) = '$tmp_year'";
            $order_by_sql = str_replace('web_traffic_last_year','calctraffic',$order_by_sql);
            $order_by_sql = "GROUP BY domain ".$order_by_sql;
          } elseif($order == 'web_traffic_this_year'){
            $tmp_year = date('Y');
            $extselect .= ', SUM(wt.traffic_bytes) as calctraffic';
            $join .= ' INNER JOIN web_traffic as wt ON '.$app->listform->listDef['table'].'.domain = wt.hostname ';
            $sql_where .= " AND YEAR(wt.traffic_date) = '$tmp_year'";
            $order_by_sql = str_replace('web_traffic_this_year','calctraffic',$order_by_sql);
            $order_by_sql = "GROUP BY domain ".$order_by_sql;
          } elseif($order == 'mail_traffic_last_month'){
            $tmp_date = date('Y-m',mktime(0, 0, 0, date("m")-1, date("d"), date("Y")));
            $join .= ' INNER JOIN mail_traffic as mt ON '.$app->listform->listDef['table'].'.mailuser_id = mt.mailuser_id ';
            $sql_where .= " AND mt.month like '$tmp_date%'";
            $order_by_sql = str_replace('mail_traffic_last_month','traffic',$order_by_sql);
          } elseif($order == 'mail_traffic_this_month'){
            $tmp_date = date('Y-m');
            $join .= ' INNER JOIN mail_traffic as mt ON '.$app->listform->listDef['table'].'.mailuser_id = mt.mailuser_id ';
            $sql_where .= " AND mt.month like '$tmp_date%'";
            $order_by_sql = str_replace('mail_traffic_this_month','traffic',$order_by_sql);
          } elseif($order == 'mail_traffic_last_year'){
            $tmp_date = date('Y',mktime(0, 0, 0, date("m")-1, date("d"), date("Y")));
            $extselect .= ', SUM(mt.traffic) as calctraffic';
            $join .= ' INNER JOIN mail_traffic as mt ON '.$app->listform->listDef['table'].'.mailuser_id = mt.mailuser_id ';
            $sql_where .= " AND mt.month like '$tmp_date%'";;
            $order_by_sql = str_replace('mail_traffic_last_year','calctraffic',$order_by_sql);
            $order_by_sql = "GROUP BY mailuser_id ".$order_by_sql;
          } elseif($order == 'mail_traffic_this_year'){
            $tmp_date = date('Y');
            $extselect .= ', SUM(mt.traffic) as calctraffic';
            $join .= ' INNER JOIN mail_traffic as mt ON '.$app->listform->listDef['table'].'.mailuser_id = mt.mailuser_id ';
            $sql_where .= " AND mt.month like '$tmp_date%'";
            $order_by_sql = str_replace('mail_traffic_this_year','calctraffic',$order_by_sql);
            $order_by_sql = "GROUP BY mailuser_id ".$order_by_sql;
          }
        }
        
        if($this->SQLExtSelect != '') {
            if(substr($this->SQLExtSelect,0,1) != ',') $this->SQLExtSelect = ','.$this->SQLExtSelect; 
            $extselect .= $this->SQLExtSelect;
        }
        $table_selects = array();
        $table_selects[] = trim($app->listform->listDef['table']).'.*';
        $app->listform->listDef['additional_tables'] = trim($app->listform->listDef['additional_tables']);
        if($app->listform->listDef['additional_tables'] != ''){
            $additional_tables = explode(',', $app->listform->listDef['additional_tables']);
            foreach($additional_tables as $additional_table){
                $table_selects[] = trim($additional_table).'.*';
            }
        }
        $select = implode(', ', $table_selects);
        return 'SELECT '.$app->listform->listDef['table'].'.*'.$extselect.' FROM '.$app->listform->listDef['table']."$join WHERE $sql_where $order_by_sql $limit_sql";
        $sql = 'SELECT '.$select.$extselect.' FROM '.$app->listform->listDef['table'].($app->listform->listDef['additional_tables'] != ''? ','.$app->listform->listDef['additional_tables'] : '')."$join WHERE $sql_where $order_by_sql $limit_sql";
        //echo $sql;
        return $sql;
    }
    
    
interface/lib/classes/remoting.inc.php
@@ -2137,12 +2137,12 @@
            return false;
        }
        
        if (preg_match('/^[a-z0-9][a-z0-9\-]+[a-z0-9](\.[a-z]{2,4})+$/i', $origin)) {
        if(!preg_match('/^[a-z0-9][a-z0-9\-]+[a-z0-9](\.[a-z]{2,4})+$/i', $origin)){
            $this->server->fault('no_domain_found', 'Invalid domain name.');
            return false;
        }
        $rec = $app->db->queryOneRecord("SELECT id FROM dns_soa WHERE origin like '".$origin.'%');
        $rec = $app->db->queryOneRecord("SELECT id FROM dns_soa WHERE origin like '".$origin."%'");
        if(isset($rec['id'])) {
            return $app->functions->intval($rec['id']);
        } else {
interface/lib/classes/remoting_lib.inc.php
@@ -817,7 +817,8 @@
            if(@is_numeric($primary_id)) {
                $sql = "SELECT * FROM ".$escape.$this->formDef['db_table'].$escape." WHERE ".$this->formDef['db_table_idx']." = ".$primary_id;
                return $app->db->queryOneRecord($sql);
            } elseif (@is_array($primary_id)) {
            } elseif (@is_array($primary_id) || @is_object($primary_id)) {
                if(@is_object($primary_id)) $primary_id = get_object_vars($primary_id); // do not use cast (array)xxx because it returns private and protected properties!
                $sql_offset = 0;
                $sql_limit = 0;
                $sql_where = '';
interface/lib/classes/sites_database_plugin.inc.php
@@ -33,7 +33,7 @@
    public function processDatabaseInsert($form_page) {
        global $app;
        
        if($form_page->dataRecord["parent_domain_id"] > 0) {
        /*if($form_page->dataRecord["parent_domain_id"] > 0) {
            $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$app->functions->intval($form_page->dataRecord["parent_domain_id"]));
        
            //* The Database user shall be owned by the same group then the website
@@ -42,14 +42,14 @@
            $sys_groupid = $form_page->dataRecord['sys_groupid'];
        }
        
        if($form_page->dataRecord['database_user_id']) {
            // check if there has already been a database on this server with that user
            $check = $app->db->queryOneRecord("SELECT COUNT(*) as `cnt` FROM `web_database` WHERE `server_id` = '" . $app->functions->intval($form_page->dataRecord['server_id']) . "' AND (`database_user_id` = '" . $app->functions->intval($form_page->dataRecord['database_user_id']) . "' OR `database_ro_user_id` = '" . $app->functions->intval($form_page->dataRecord['database_user_id']) . "') AND `sys_groupid` = '" . $app->functions->intval($sys_groupid) . "'");
            $check = $app->db->queryOneRecord("SELECT COUNT(*) as `cnt` FROM `web_database` WHERE `server_id` = '" . $app->functions->intval($form_page->dataRecord['server_id']) . "' AND (`database_user_id` = '" . $app->functions->intval($form_page->dataRecord['database_user_id']) . "' OR `database_ro_user_id` = '" . $app->functions->intval($form_page->dataRecord['database_user_id']) . "')");
            
            if($check && $check['cnt'] < 1) {
                // we need to make a datalog insert for the database users that are connected to this database
                $db_user = $app->db->queryOneRecord("SELECT * FROM `web_database_user` WHERE `database_user_id` = '" . $app->functions->intval($form_page->dataRecord['database_user_id']) . "' AND `sys_groupid` = '" . $app->functions->intval($sys_groupid) . "'");
                $db_user = $app->db->queryOneRecord("SELECT * FROM `web_database_user` WHERE `database_user_id` = '" . $app->functions->intval($form_page->dataRecord['database_user_id']) . "'");
                if($db_user) {
                    $db_user['server_id'] = $form_page->dataRecord['server_id'];
                    $app->db->datalogSave('web_database_user', 'INSERT', 'database_user_id', $db_user['database_user_id'], array(), $db_user);
@@ -59,23 +59,23 @@
        if($form_page->dataRecord['database_ro_user_id']) {
            // check if there has already been a database on this server with that user
            $check = $app->db->queryOneRecord("SELECT COUNT(*) as `cnt` FROM `web_database` WHERE `server_id` = '" . $app->functions->intval($form_page->dataRecord['server_id']) . "' AND (`database_user_id` = '" . $app->functions->intval($form_page->dataRecord['database_ro_user_id']) . "' OR `database_ro_user_id` = '" . $app->functions->intval($form_page->dataRecord['database_ro_user_id']) . "') AND `sys_groupid` = '" . $app->functions->intval($sys_groupid) . "'");
            $check = $app->db->queryOneRecord("SELECT COUNT(*) as `cnt` FROM `web_database` WHERE `server_id` = '" . $app->functions->intval($form_page->dataRecord['server_id']) . "' AND (`database_user_id` = '" . $app->functions->intval($form_page->dataRecord['database_ro_user_id']) . "' OR `database_ro_user_id` = '" . $app->functions->intval($form_page->dataRecord['database_ro_user_id']) . "')");
            
            if($check && $check['cnt'] < 1) {
                // we need to make a datalog insert for the database users that are connected to this database
                $db_user = $app->db->queryOneRecord("SELECT * FROM `web_database_user` WHERE `database_user_id` = '" . $app->functions->intval($form_page->dataRecord['database_ro_user_id']) . "' AND `sys_groupid` = '" . $app->functions->intval($sys_groupid) . "'");
                $db_user = $app->db->queryOneRecord("SELECT * FROM `web_database_user` WHERE `database_user_id` = '" . $app->functions->intval($form_page->dataRecord['database_ro_user_id']) . "'");
                if($db_user) {
                    $db_user['server_id'] = $form_page->dataRecord['server_id'];
                    $app->db->datalogSave('web_database_user', 'INSERT', 'database_user_id', $db_user['database_user_id'], array(), $db_user);
                }
            }
        }
        }*/
    }
    
    public function processDatabaseUpdate($form_page) {
        global $app;
        
        $old_record = $app->db->queryOneRecord('SELECT * FROM `web_database` WHERE `database_id` = ' . $app->functions->intval($form_page->id));
        /*$old_record = $app->db->queryOneRecord('SELECT * FROM `web_database` WHERE `database_id` = ' . $app->functions->intval($form_page->id));
        
        if($form_page->dataRecord["parent_domain_id"] > 0) {
            $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$app->functions->intval($form_page->dataRecord["parent_domain_id"]));
@@ -89,10 +89,10 @@
        // check if database user has changed
        if($old_record['database_user_id'] && $old_record['database_user_id'] != $form_page->dataRecord['database_user_id'] && $old_record['database_user_id'] != $form_page->dataRecord['database_ro_user_id']) {
            // check if any database on the server still uses this one
            $check = $app->db->queryOneRecord("SELECT COUNT(*) as `cnt` FROM `web_database` WHERE `server_id` = '" . $app->functions->intval($form_page->dataRecord['server_id']) . "' AND (`database_user_id` = '" . $app->functions->intval($old_record['database_user_id']) . "' OR `database_ro_user_id` = '" . $app->functions->intval($old_record['database_user_id']) . "') AND `sys_groupid` = '" . $app->functions->intval($sys_groupid) . "' AND `database_id` != '" . $app->functions->intval($form_page->id) . "'");
            $check = $app->db->queryOneRecord("SELECT COUNT(*) as `cnt` FROM `web_database` WHERE `server_id` = '" . $app->functions->intval($form_page->dataRecord['server_id']) . "' AND (`database_user_id` = '" . $app->functions->intval($old_record['database_user_id']) . "' OR `database_ro_user_id` = '" . $app->functions->intval($old_record['database_user_id']) . "') AND `database_id` != '" . $app->functions->intval($form_page->id) . "'");
            if($check['cnt'] < 1) {
                // send a datalog delete
                $db_user = $app->db->queryOneRecord("SELECT * FROM `web_database_user` WHERE `database_user_id` = '" . $app->functions->intval($old_record['database_user_id']) . "' AND `sys_groupid` = '" . $app->functions->intval($sys_groupid) . "'");
                $db_user = $app->db->queryOneRecord("SELECT * FROM `web_database_user` WHERE `database_user_id` = '" . $app->functions->intval($old_record['database_user_id']) . "'");
                if($db_user) {
                    $db_user['server_id'] = $form_page->dataRecord['server_id'];
                    $app->db->datalogSave('web_database_user', 'DELETE', 'database_user_id', $db_user['database_user_id'], $db_user, array());
@@ -102,24 +102,24 @@
        // check if readonly database user has changed
        if($old_record['database_ro_user_id'] && $old_record['database_ro_user_id'] != $form_page->dataRecord['database_ro_user_id'] && $old_record['database_ro_user_id'] != $form_page->dataRecord['database_user_id']) {
            // check if any database on the server still uses this one
            $check = $app->db->queryOneRecord("SELECT COUNT(*) as `cnt` FROM `web_database` WHERE `server_id` = '" . $app->functions->intval($form_page->dataRecord['server_id']) . "' AND (`database_user_id` = '" . $app->functions->intval($old_record['database_ro_user_id']) . "' OR `database_ro_user_id` = '" . $app->functions->intval($old_record['database_ro_user_id']) . "') AND `sys_groupid` = '" . $app->functions->intval($sys_groupid) . "' AND `database_id` != '" . $app->functions->intval($form_page->id) . "'");
            $check = $app->db->queryOneRecord("SELECT COUNT(*) as `cnt` FROM `web_database` WHERE `server_id` = '" . $app->functions->intval($form_page->dataRecord['server_id']) . "' AND (`database_user_id` = '" . $app->functions->intval($old_record['database_ro_user_id']) . "' OR `database_ro_user_id` = '" . $app->functions->intval($old_record['database_ro_user_id']) . "') AND `database_id` != '" . $app->functions->intval($form_page->id) . "'");
            if($check['cnt'] < 1) {
                // send a datalog delete
                $db_user = $app->db->queryOneRecord("SELECT * FROM `web_database_user` WHERE `database_user_id` = '" . $app->functions->intval($old_record['database_ro_user_id']) . "' AND `sys_groupid` = '" . $app->functions->intval($sys_groupid) . "'");
                $db_user = $app->db->queryOneRecord("SELECT * FROM `web_database_user` WHERE `database_user_id` = '" . $app->functions->intval($old_record['database_ro_user_id']) . "'");
                if($db_user) {
                    $db_user['server_id'] = $form_page->dataRecord['server_id'];
                    $app->db->datalogSave('web_database_user', 'DELETE', 'database_user_id', $db_user['database_user_id'], $db_user, array());
                }
            }
        }
        }*/
        
        if($form_page->dataRecord['database_user_id']) {
        /*if($form_page->dataRecord['database_user_id']) {
            // check if there has already been a database on this server with that user
            $check = $app->db->queryOneRecord("SELECT COUNT(*) as `cnt` FROM `web_database` WHERE `server_id` = '" . $app->functions->intval($form_page->dataRecord['server_id']) . "' AND (`database_user_id` = '" . $app->functions->intval($form_page->dataRecord['database_user_id']) . "' OR `database_ro_user_id` = '" . $app->functions->intval($form_page->dataRecord['database_user_id']) . "') AND `sys_groupid` = '" . $app->functions->intval($sys_groupid) . "'");
            $check = $app->db->queryOneRecord("SELECT COUNT(*) as `cnt` FROM `web_database` WHERE `server_id` = '" . $app->functions->intval($form_page->dataRecord['server_id']) . "' AND (`database_user_id` = '" . $app->functions->intval($form_page->dataRecord['database_user_id']) . "' OR `database_ro_user_id` = '" . $app->functions->intval($form_page->dataRecord['database_user_id']) . "')");
            
            if($check && $check['cnt'] < 1) {
                // we need to make a datalog insert for the database users that are connected to this database
                $db_user = $app->db->queryOneRecord("SELECT * FROM `web_database_user` WHERE `database_user_id` = '" . $app->functions->intval($form_page->dataRecord['database_user_id']) . "' AND `sys_groupid` = '" . $app->functions->intval($sys_groupid) . "'");
                $db_user = $app->db->queryOneRecord("SELECT * FROM `web_database_user` WHERE `database_user_id` = '" . $app->functions->intval($form_page->dataRecord['database_user_id']) . "'");
                if($db_user) {
                    $db_user['server_id'] = $form_page->dataRecord['server_id'];
                    $app->db->datalogSave('web_database_user', 'INSERT', 'database_user_id', $db_user['database_user_id'], array(), $db_user);
@@ -129,30 +129,30 @@
        if($form_page->dataRecord['database_ro_user_id']) {
            // check if there has already been a database on this server with that user
            $check = $app->db->queryOneRecord("SELECT COUNT(*) as `cnt` FROM `web_database` WHERE `server_id` = '" . $app->functions->intval($form_page->dataRecord['server_id']) . "' AND (`database_user_id` = '" . $app->functions->intval($form_page->dataRecord['database_ro_user_id']) . "' OR `database_ro_user_id` = '" . $app->functions->intval($form_page->dataRecord['database_ro_user_id']) . "') AND `sys_groupid` = '" . $app->functions->intval($sys_groupid) . "'");
            $check = $app->db->queryOneRecord("SELECT COUNT(*) as `cnt` FROM `web_database` WHERE `server_id` = '" . $app->functions->intval($form_page->dataRecord['server_id']) . "' AND (`database_user_id` = '" . $app->functions->intval($form_page->dataRecord['database_ro_user_id']) . "' OR `database_ro_user_id` = '" . $app->functions->intval($form_page->dataRecord['database_ro_user_id']) . "')");
            
            if($check && $check['cnt'] < 1) {
                // we need to make a datalog insert for the database users that are connected to this database
                $db_user = $app->db->queryOneRecord("SELECT * FROM `web_database_user` WHERE `database_user_id` = '" . $app->functions->intval($form_page->dataRecord['database_ro_user_id']) . "' AND `sys_groupid` = '" . $app->functions->intval($sys_groupid) . "'");
                $db_user = $app->db->queryOneRecord("SELECT * FROM `web_database_user` WHERE `database_user_id` = '" . $app->functions->intval($form_page->dataRecord['database_ro_user_id']) . "'");
                if($db_user) {
                    $db_user['server_id'] = $form_page->dataRecord['server_id'];
                    $app->db->datalogSave('web_database_user', 'INSERT', 'database_user_id', $db_user['database_user_id'], array(), $db_user);
                }
            }
        }
        }*/
        
    }
    
    public function processDatabaseDelete($primary_id) {
        global $app;
        
        $old_record = $app->db->queryOneRecord('SELECT * FROM `web_database` WHERE `database_id` = ' . $app->functions->intval($primary_id));
        /*$old_record = $app->db->queryOneRecord('SELECT * FROM `web_database` WHERE `database_id` = ' . $app->functions->intval($primary_id));
        if($old_record['database_user_id']) {
            // check if any database on the server still uses this one
            $check = $app->db->queryOneRecord("SELECT COUNT(*) as `cnt` FROM `web_database` WHERE `server_id` = '" . $app->functions->intval($old_record['server_id']) . "' AND (`database_user_id` = '" . $app->functions->intval($old_record['database_user_id']) . "' OR `database_ro_user_id` = '" . $app->functions->intval($old_record['database_user_id']) . "') AND `sys_groupid` = '" . $app->functions->intval($old_record['sys_groupid']) . "' AND `database_id` != '" . $app->functions->intval($primary_id) . "'");
            $check = $app->db->queryOneRecord("SELECT COUNT(*) as `cnt` FROM `web_database` WHERE `server_id` = '" . $app->functions->intval($old_record['server_id']) . "' AND (`database_user_id` = '" . $app->functions->intval($old_record['database_user_id']) . "' OR `database_ro_user_id` = '" . $app->functions->intval($old_record['database_user_id']) . "') AND `database_id` != '" . $app->functions->intval($primary_id) . "'");
            if($check['cnt'] < 1) {
                // send a datalog delete
                $db_user = $app->db->queryOneRecord("SELECT * FROM `web_database_user` WHERE `database_user_id` = '" . $app->functions->intval($old_record['database_user_id']) . "' AND `sys_groupid` = '" . $app->functions->intval($old_record['sys_groupid']) . "'");
                $db_user = $app->db->queryOneRecord("SELECT * FROM `web_database_user` WHERE `database_user_id` = '" . $app->functions->intval($old_record['database_user_id']) . "'");
                if($db_user) {
                    $db_user['server_id'] = $old_record['server_id'];
                    $app->db->datalogSave('web_database_user', 'DELETE', 'database_user_id', $db_user['database_user_id'], $db_user, array());
@@ -161,16 +161,16 @@
        }
        if($old_record['database_ro_user_id']) {
            // check if any database on the server still uses this one
            $check = $app->db->queryOneRecord("SELECT COUNT(*) as `cnt` FROM `web_database` WHERE `server_id` = '" . $app->functions->intval($old_record['server_id']) . "' AND (`database_user_id` = '" . $app->functions->intval($old_record['database_ro_user_id']) . "' OR `database_ro_user_id` = '" . $app->functions->intval($old_record['database_ro_user_id']) . "') AND `sys_groupid` = '" . $app->functions->intval($old_record['sys_groupid']) . "' AND `database_id` != '" . $app->functions->intval($primary_id) . "'");
            $check = $app->db->queryOneRecord("SELECT COUNT(*) as `cnt` FROM `web_database` WHERE `server_id` = '" . $app->functions->intval($old_record['server_id']) . "' AND (`database_user_id` = '" . $app->functions->intval($old_record['database_ro_user_id']) . "' OR `database_ro_user_id` = '" . $app->functions->intval($old_record['database_ro_user_id']) . "') AND `database_id` != '" . $app->functions->intval($primary_id) . "'");
            if($check['cnt'] < 1) {
                // send a datalog delete
                $db_user = $app->db->queryOneRecord("SELECT * FROM `web_database_user` WHERE `database_user_id` = '" . $app->functions->intval($old_record['database_ro_user_id']) . "' AND `sys_groupid` = '" . $app->functions->intval($old_record['sys_groupid']) . "'");
                $db_user = $app->db->queryOneRecord("SELECT * FROM `web_database_user` WHERE `database_user_id` = '" . $app->functions->intval($old_record['database_ro_user_id']) . "'");
                if($db_user) {
                    $db_user['server_id'] = $old_record['server_id'];
                    $app->db->datalogSave('web_database_user', 'DELETE', 'database_user_id', $db_user['database_user_id'], $db_user, array());
                }
            }
        }
        }*/
        
    }
}
interface/lib/classes/tform.inc.php
@@ -949,6 +949,7 @@
                                        $field_value_array[] = $field_value;
                                    }
                                    foreach($field_value_array as $field_value) {
                                        $field_value = trim($field_value);
                                        if(function_exists('filter_var')) {
                                            if(!filter_var($field_value,FILTER_VALIDATE_IP)) {
                                                $errmsg = $validator['errmsg'];
interface/lib/classes/tpl.inc.php
@@ -192,12 +192,12 @@
            if (is_array($k)) {
                foreach($k as $key => $value){
                    $key = ($this->OPTIONS['CASELESS']) ? strtolower(trim($key)) : trim($key);
                    if (preg_match('/^[A-Za-z_]+[A-Za-z0-9_]*$/', $key) && $value !== null ) {
                    if (preg_match('/^[A-Za-z]+[A-Za-z0-9_]*$/', $key) && $value !== null ) {
                        $this->_vars[$key] = $value;
                    }
                }
            } else {
                if (preg_match('/^[A-Za-z_]+[A-Za-z0-9_]*$/', $k) && $v !== null) {
                if (preg_match('/^[A-Za-z]+[A-Za-z0-9_]*$/', $k) && $v !== null) {
                    if ($this->OPTIONS['CASELESS']) $k = strtolower($k);
                    $this->_vars[trim($k)] = $v;
                } else {
@@ -243,7 +243,7 @@
            for ($i = 0; $i < $num_args; $i++) {
                $var = func_get_arg($i);
                if ($this->OPTIONS['CASELESS']) $var = strtolower($var);
                if (!preg_match('/^[A-Za-z_]+[A-Za-z0-9_]*$/', $var)) continue;
                if (!preg_match('/^[A-Za-z]+[A-Za-z0-9_]*$/', $var)) continue;
                unset($this->_vars[$var]);
            }
            return true;
@@ -300,12 +300,14 @@
         */
        public function setLoop($k, $v)
        {
            if (is_array($v) && preg_match('/^[A-Za-z_]+[A-Za-z0-9_]*$/', $k)) {
            if (is_array($v) && preg_match('/^[A-Za-z]+[A-Za-z0-9_]*$/', $k)) {
                $k = ($this->OPTIONS['CASELESS']) ? strtolower(trim($k)) : trim($k);
                $this->_arrvars[$k] = array();
                if ($this->OPTIONS['SET_LOOP_VAR'] && !empty($v)) $this->setvar($k, 1);
                if (($this->_arrvars[$k] = $this->_arrayBuild($v)) == false) {
                    vlibTemplateError::raiseError('VT_WARNING_INVALID_ARR', WARNING, $k);
                } else {
                    $this->vars['_'.$k.'_num'] = count($v);
                }
            }
            return true;
@@ -849,8 +851,8 @@
                $regex.=    '[\"\']?';
                $regex.= ')?\s*';
                $regex.= '(?:>|\/>|}|-->){1}';
                $regex.= '([\r\n|\n|\r])?/ie';
                $data = preg_replace($regex,"\$this->_parseTag(array('\\0','\\1','\\2','\\3','\\4','\\5','\\6','\\7','\\8','\\9'));",$data);
                $regex.= '([\r\n|\n|\r])?/i';
                $data = preg_replace_callback($regex, array($this, _parseTag), $data);
                if ($this->_cache) { // add cache if need be
                    $this->_createCache($data);
interface/lib/classes/validate_ftpuser.inc.php
@@ -47,7 +47,7 @@
        
        
        $ftp_data = $app->db->queryOneRecord("SELECT parent_domain_id FROM ftp_user WHERE ftp_user_id = '".$app->db->quote($app->tform->primary_id)."'");
        if(!$ftp_data["parent_domain_id"]) {
        if(!is_array($ftp_data) || $ftp_data["parent_domain_id"] < 1) {
            $errmsg = $validator['errmsg'];
            if(isset($app->tform->wordbook[$errmsg])) {
                return $app->tform->wordbook[$errmsg]."<br>\r\n";
@@ -57,7 +57,7 @@
        }
        
        $domain_data = $app->db->queryOneRecord("SELECT domain_id, document_root FROM web_domain WHERE domain_id = '".$app->db->quote($ftp_data["parent_domain_id"])."'");
        if(!$domain_data["domain_id"]) {
        if(!is_array($domain_data) || $domain_data["domain_id"] < 1) {
            $errmsg = $validator['errmsg'];
            if(isset($app->tform->wordbook[$errmsg])) {
                return $app->tform->wordbook[$errmsg]."<br>\r\n";
@@ -75,6 +75,9 @@
        
        if(stristr($field_value,'..') or stristr($field_value,'./') or stristr($field_value,'/.')) $is_ok = false;
        
        //* Final check if docroot path of website is >= 5 chars
        if(strlen($doc_root) < 5) $is_ok = false;
        if($is_ok == false) {
            $errmsg = $validator['errmsg'];
            if(isset($app->tform->wordbook[$errmsg])) {
interface/lib/plugins/sites_web_database_user_plugin.inc.php
@@ -27,7 +27,7 @@
        global $app, $conf;   
        
        // make sure that the record belongs to the clinet group and not the admin group when a dmin inserts it
        // also make sure that the user can not delete domain created by a admin
        // also make sure that the user can not delete entry created by an admin
        if($_SESSION["s"]["user"]["typ"] == 'admin' && isset($page_form->dataRecord["client_group_id"])) {
            $client_group_id = $app->functions->intval($page_form->dataRecord["client_group_id"]);
            $app->db->query("UPDATE web_database_user SET sys_groupid = $client_group_id, sys_perm_group = 'ru' WHERE database_user_id = ".$page_form->id);
@@ -36,6 +36,6 @@
            $client_group_id = $app->functions->intval($page_form->dataRecord["client_group_id"]);
            $app->db->query("UPDATE web_database_user SET sys_groupid = $client_group_id, sys_perm_group = 'riud' WHERE database_user_id = ".$page_form->id);
        }
        $app->db->query("UPDATE web_database_user SET server_id = '" . $app->functions->intval($conf['server_id']) . "' WHERE database_user_id = ".$page_form->id);
        //$app->db->query("UPDATE web_database_user SET server_id = '" . $app->functions->intval($conf['server_id']) . "' WHERE database_user_id = ".$page_form->id);
    }
}                  
interface/web/admin/form/server_config.tform.php
@@ -150,6 +150,14 @@
            'width' => '40',
            'maxlength' => '255'
        ),
        'admin_notify_events' => array(
            'datatype' => 'INTEGER',
            'formtype' => 'SELECT',
            'default' => '1',
            'value' => array('3' => 'no_notifications_txt', '0' => 'Debug', '1' => 'Warnings', '2' => 'Errors'),
            'width' => '40',
            'maxlength' => '255'
        ),
        'backup_dir' => array(
            'datatype' => 'VARCHAR',
            'formtype' => 'TEXT',
@@ -166,6 +174,62 @@
            'formtype' => 'SELECT',
            'default' => 'userzip',
            'value' => array('userzip' => 'backup_mode_userzip', 'rootgz' => 'backup_mode_rootgz'),
            'width' => '40',
            'maxlength' => '255'
        ),
        'monit_url' => array(
            'datatype' => 'VARCHAR',
            'formtype' => 'TEXT',
            'default' => '',
            'validators'    => array ( 0 => array (    'type'    => 'REGEX',
                                                                'regex' => '/^[0-9a-zA-Z\:\/\-\.\[\]]{0,255}$/',
                                                                'errmsg'=> 'monit_url_error_regex'),
                                                ),
            'value' => '',
            'width' => '40',
            'maxlength' => '255'
        ),
        'monit_user' => array(
            'datatype' => 'VARCHAR',
            'formtype' => 'TEXT',
            'default' => '',
            'value' => '',
            'width' => '40',
            'maxlength' => '255'
        ),
        'monit_password' => array(
            'datatype' => 'VARCHAR',
            'formtype' => 'TEXT',
            'default' => '',
            'value' => '',
            'width' => '40',
            'maxlength' => '255'
        ),
        'munin_url' => array(
            'datatype' => 'VARCHAR',
            'formtype' => 'TEXT',
            'default' => '',
            'validators'    => array ( 0 => array (    'type'    => 'REGEX',
                                                                'regex' => '/^[0-9a-zA-Z\:\/\-\.\[\]]{0,255}$/',
                                                                'errmsg'=> 'munin_url_error_regex'),
                                                ),
            'value' => '',
            'width' => '40',
            'maxlength' => '255'
        ),
        'munin_user' => array(
            'datatype' => 'VARCHAR',
            'formtype' => 'TEXT',
            'default' => '',
            'value' => '',
            'width' => '40',
            'maxlength' => '255'
        ),
        'munin_password' => array(
            'datatype' => 'VARCHAR',
            'formtype' => 'TEXT',
            'default' => '',
            'value' => '',
            'width' => '40',
            'maxlength' => '255'
        ),
@@ -331,23 +395,38 @@
            'formtype' => 'TEXT',
            'default' => '',
            'validators'    => array (     0 => array (    'type'    => 'REGEX',
                                                        'regex' => '/^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])(,\s*(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9]))*$/',
                                                        'regex' => '/^((([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)+([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])(,\s*(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)+([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9]))*)?$/',
                                                        'errmsg'=> 'rbl_error_regex'),
                                    ),
            'value' => '',
            'width' => '40',
            'maxlength' => '255'
        ),
        'sendmail_path' => array(
        'overquota_notify_admin' => array(
            'datatype' => 'VARCHAR',
            'formtype' => 'CHECKBOX',
            'default' => 'y',
            'value' => array(0 => 'n', 1 => 'y')
        ),
        'overquota_notify_client' => array(
            'datatype' => 'VARCHAR',
            'formtype' => 'CHECKBOX',
            'default' => 'y',
            'value' => array(0 => 'n', 1 => 'y')
        ),
        'overquota_notify_freq' => array(
            'datatype' => 'INTEGER',
            'formtype' => 'TEXT',
            'default' => '/usr/sbin/sendmail',
            'validators' => array(0 => array('type' => 'NOTEMPTY',
                    'errmsg' => 'sendmail_path_error_empty'),
            ),
            'default' => '7',
            'value' => '',
            'width' => '40',
            'maxlength' => '255'
            'width' => '20',
            'maxlength' => '255'
        ),
        'overquota_notify_onok' => array(
            'datatype' => 'VARCHAR',
            'formtype' => 'CHECKBOX',
            'default' => 'n',
            'value' => array(0 => 'n', 1 => 'y')
        ),
    ##################################
    # ENDE Datatable fields
@@ -563,6 +642,32 @@
            'default' => 'y',
            'value' => array(0 => 'n', 1 => 'y')
        ),
        'overquota_notify_admin' => array(
            'datatype' => 'VARCHAR',
            'formtype' => 'CHECKBOX',
            'default' => 'y',
            'value' => array(0 => 'n', 1 => 'y')
        ),
        'overquota_notify_client' => array(
            'datatype' => 'VARCHAR',
            'formtype' => 'CHECKBOX',
            'default' => 'y',
            'value' => array(0 => 'n', 1 => 'y')
        ),
        'overquota_notify_freq' => array(
            'datatype' => 'INTEGER',
            'formtype' => 'TEXT',
            'default' => '7',
            'value' => '',
            'width' => '20',
            'maxlength' => '255'
        ),
        'overquota_notify_onok' => array(
            'datatype' => 'VARCHAR',
            'formtype' => 'CHECKBOX',
            'default' => 'n',
            'value' => array(0 => 'n', 1 => 'y')
        ),
        'user' => array(
            'datatype' => 'VARCHAR',
            'formtype' => 'TEXT',
interface/web/admin/form/server_ip.tform.php
@@ -105,7 +105,7 @@
            'formtype'    => 'SELECT',
            'default'    => '',
            'datasource'    => array (     'type'    => 'SQL',
                                        'querystring' => "SELECT client_id,CONCAT(contact_name,' :: ',username) as name FROM client WHERE {AUTHSQL} ORDER BY contact_name",
                                        'querystring' => "SELECT client_id,CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as name FROM client WHERE {AUTHSQL} ORDER BY contact_name",
                                        'keyfield'=> 'client_id',
                                        'valuefield'=> 'name'
                                     ),
interface/web/admin/form/server_php.tform.php
@@ -100,7 +100,7 @@
            'formtype'    => 'SELECT',
            'default'    => '',
            'datasource'    => array (     'type'    => 'SQL',
                                        'querystring' => "SELECT client_id,CONCAT(contact_name,' :: ',username) as name FROM client WHERE {AUTHSQL} ORDER BY contact_name",
                                        'querystring' => "SELECT client_id,CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as name FROM client WHERE {AUTHSQL} ORDER BY contact_name",
                                        'keyfield'=> 'client_id',
                                        'valuefield'=> 'name'
                                     ),
interface/web/admin/form/software_package.tform.php
New file
@@ -0,0 +1,116 @@
<?php
/*
Copyright (c) 2008, Till Brehm, projektfarm Gmbh
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
    * Redistributions of source code must retain the above copyright notice,
      this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
    * Neither the name of ISPConfig nor the names of its contributors
      may be used to endorse or promote products derived from this software without
      specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
    Form Definition
    Tabellendefinition
    Datentypen:
    - INTEGER (Wandelt Ausdrücke in Int um)
    - DOUBLE
    - CURRENCY (Formatiert Zahlen nach Währungsnotation)
    - VARCHAR (kein weiterer Format Check)
    - TEXT (kein weiterer Format Check)
    - DATE (Datumsformat, Timestamp Umwandlung)
    Formtype:
    - TEXT (normales Textfeld)
    - TEXTAREA (normales Textfeld)
    - PASSWORD (Feldinhalt wird nicht angezeigt)
    - SELECT (Gibt Werte als option Feld aus)
    - RADIO
    - CHECKBOX
    - FILE
    VALUE:
    - Wert oder Array
    Hinweis:
    Das ID-Feld ist nicht bei den Table Values einzufügen.
*/
$form["title"]             = "Software Package";
$form["description"]     = "Modify software package details";
$form["name"]             = "software_package";
$form["action"]            = "software_package_edit.php";
$form["db_table"]        = "software_package";
$form["db_table_idx"]    = "package_id";
$form["db_history"]        = "no";
$form["tab_default"]    = "software_package";
$form["list_default"]    = "software_package_list.php";
$form["auth"]            = 'yes';
$form["auth_preset"]["userid"]  = 0; // 0 = id of the user, > 0 id must match with id of current user
$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user
$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete
$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete
$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete
$form["tabs"]['software_package'] = array (
    'title'     => "Software Package",
    'width'     => 80,
    'template'     => "templates/software_package_edit.htm",
    'fields'     => array (
    ##################################
    # Beginn Datenbankfelder
    ##################################
        'package_title' => array (
            'datatype'    => 'VARCHAR',
            'formtype'    => 'TEXT',
            'validators'    => '',
            'default'    => '',
            'value'        => '',
            'separator'    => '',
            'width'        => '40',
            'maxlength'    => '40',
            'rows'        => '',
            'cols'        => ''
        ),
        'package_key' => array (
            'datatype'    => 'VARCHAR',
            'formtype'    => 'TEXT',
            'validators'    => '',
            'default'    => '',
            'value'        => '',
            'separator'    => '',
            'width'        => '40',
            'maxlength'    => '40',
            'rows'        => '',
            'cols'        => ''
        ),
    ##################################
    # ENDE Datenbankfelder
    ##################################
    )
);
?>
interface/web/admin/form/software_repo.tform.php
@@ -60,7 +60,7 @@
*/
$form["title"]             = "Software Repository";
$form["description"]     = "Software Repositoy which may contain addons or updates";
$form["description"]     = "Software Repository which may contain addons or updates";
$form["name"]             = "software_repo";
$form["action"]            = "software_repo_edit.php";
$form["db_table"]        = "software_repo";
interface/web/admin/form/system_config.tform.php
@@ -214,7 +214,8 @@
            'datatype'    => 'VARCHAR',
            'formtype'    => 'TEXT',
            'validators'    => array ( 0 => array (    'type'    => 'REGEX',
                                                                'regex' => '/^[0-9a-zA-Z\:\/\-\.]{0,255}(\?.+)?$/',
                                                                /*'regex' => '/^[0-9a-zA-Z\:\/\-\.]{0,255}(\?.+)?$/',*/
                                                                'regex' => '/^[0-9a-zA-Z\:\/\-\.\[\]]{0,255}$/',
                                                                'errmsg'=> 'webmail_url_error_regex'),
                                                ),
            'default'    => '',
interface/web/admin/lib/lang/de.lng
@@ -35,7 +35,7 @@
$wb['Domains'] = 'Domains';
$wb['Misc'] = 'Diverses';
$wb['Software'] = 'Apps & Add-Ons';
$wb['Repositories'] = 'Bibliotheken';
$wb['Repositories'] = 'Repositories';
$wb['Packages'] = 'Pakete';
$wb['Updates'] = 'Updates';
$wb['Language Editor'] = 'Sprachen Editor';
interface/web/admin/lib/lang/de_server_config.lng
@@ -171,10 +171,21 @@
$wb['overtraffic_notify_admin_txt'] = 'Ãœberschreiten des Transfer Limits an den Administrator senden';
$wb['overtraffic_notify_client_txt'] = 'Ãœberschreiten des Transfer Limits an den Kunden senden';
$wb['rbl_error_regex'] = 'Bitte geben Sie gültige RBL-Hostnamen an.';
$wb['php_ini_check_minutes_txt'] = 'Pr&uuml;fe System php.ini Dateien auf &Auml;nderungen alle';
$wb['php_ini_check_minutes_info_txt'] = 'Minute(n) (0 deaktiviert diese Funktion)';
$wb['php_ini_check_minutes_error_empty'] = 'Der Wert f&uuml;r die Einstellung der php.ini Pr&uuml;fung ist ung&uuml;ltig.';
$wb["rbl_error_regex"] = 'Bitte geben Sie gültige RBL-Hostnamen an.';
$wb["sendmail_path_txt"] = 'Pfad zu Sendmail';
$wb["sendmail_path_error_empty"] = 'Sendmail Pfad ist leer.';
$wb['overquota_notify_admin_txt'] = 'Quota-Warnungen an den Administrator senden';
$wb['overquota_notify_client_txt'] = 'Quota-Warnungen an den Kunden senden';
$wb['overquota_notify_onok_txt'] = 'Meldung an den Kunden senden, wenn Belegung wieder ok';
$wb['overquota_notify_freq_txt'] = 'Quota-Warnung alle X Tage versenden';
$wb['overquota_notify_freq_note_txt'] = '0 = Meldung nur einmalig versenden, keine Wiederholung';
$wb['admin_notify_events_txt'] = 'Sende E-Mail an Administrator ab folgendem Level';
$wb['no_notifications_txt'] = 'Keine Benachrichtigungen';
$wb['monit_url_txt'] = 'Monit-URL';
$wb['monit_user_txt'] = 'Monit-Benutzer';
$wb['monit_password_txt'] = 'Monit-Passwort';
$wb['monit_url_error_regex'] = 'Ungültige Monit-URL';
$wb['monit_url_note_txt'] = 'Platzhalter:';
$wb['munin_url_txt'] = 'Munin-URL';
$wb['munin_user_txt'] = 'Munin-Benutzer';
$wb['munin_password_txt'] = 'Munin-Passwort';
$wb['munin_url_error_regex'] = 'Ungültige Munin-URL';
$wb['munin_url_note_txt'] = 'Platzhalter:';
?>
interface/web/admin/lib/lang/de_software_package.lng
New file
@@ -0,0 +1,6 @@
<?php
$wb['package_title_txt'] = 'Paket-Titel';
$wb['package_key_txt'] = 'Paket-Key';
$wb['Software Package'] = 'Software-Paket';
$wb['Modify software package details'] = 'Software-Paket-Einstellungen bearbeiten';
?>
interface/web/admin/lib/lang/de_software_package_install.lng
@@ -1,6 +1,6 @@
<?php
$wb['head_txt'] = 'Softwarepaket installieren';
$wb['install_key_txt'] = 'Installations Key eingeben';
$wb['install_key_txt'] = 'Installationskey eingeben';
$wb['btn_save_txt'] = 'Installation starten';
$wb['btn_cancel_txt'] = 'Abbrechen';
?>
interface/web/admin/lib/lang/de_software_package_list.lng
@@ -7,5 +7,7 @@
$wb['toolsarea_head_txt'] = 'Pakete';
$wb['repoupdate_txt'] = 'Softwarepakete Liste updaten';
$wb['package_id_txt'] = 'Lokale App ID';
$wb['no_packages_txt'] = 'No packages available';
$wb['no_packages_txt'] = 'Keine Pakete verfügbar';
$wb['edit_txt'] = 'Bearbeiten';
$wb['delete_txt'] = 'Löschen';
?>
interface/web/admin/lib/lang/de_software_repo.lng
@@ -1,7 +1,8 @@
<?php
$wb['repo_name_txt'] = 'Bibliothek';
$wb['repo_name_txt'] = 'Repository';
$wb['repo_url_txt'] = 'URL';
$wb['repo_username_txt'] = 'Benutzername (optional)';
$wb['repo_password_txt'] = 'Passwort (optional)';
$wb['active_txt'] = 'Aktiv';
$wb['Software Repository which may contain addons or updates'] = 'Software-Repository, das Add-Ons oder Updates enthalten kann';
?>
interface/web/admin/lib/lang/de_software_repo_list.lng
@@ -1,6 +1,6 @@
<?php
$wb['list_head_txt'] = 'Bibliothek';
$wb['list_head_txt'] = 'Repository';
$wb['active_txt'] = 'Aktiv';
$wb['repo_name_txt'] = 'Bibliothek';
$wb['repo_name_txt'] = 'Repository';
$wb['repo_url_txt'] = 'URL';
?>
interface/web/admin/lib/lang/de_software_update_list.lng
@@ -5,5 +5,5 @@
$wb['update_title_txt'] = 'Update';
$wb['version_txt'] = 'Version';
$wb['action_txt'] = 'Aktion';
$wb['no_updates_txt'] = 'No updates available';
$wb['no_updates_txt'] = 'Keine Updates verfügbar';
?>
interface/web/admin/lib/lang/de_system_config.lng
@@ -50,4 +50,6 @@
$wb['mailbox_show_mail_filter_tab_txt'] = 'Zeige E-Mail Filter Reiter in E-Mail Kontodetails';
$wb['mailbox_show_custom_rules_tab_txt'] = 'Zeige Benutzerregel Reiter in E-Mail Kontodetails';$wb['webmail_url_error_regex'] = 'Falsche Webmail URL';
$wb['reseller_can_use_options_txt'] = 'Reseller können den Optionen Reiter bei Webseiten verwenden';
$wb['phpmyadmin_url_note_txt'] = 'Platzhalter:';
$wb['webmail_url_note_txt'] = 'Platzhalter:';
?>
interface/web/admin/lib/lang/en_server_config.lng
@@ -172,13 +172,22 @@
$wb["web_folder_protection_txt"] = 'Make web folders immutable (extended attributes)';
$wb["overtraffic_notify_admin_txt"] = 'Send overtraffic notification to admin';
$wb["overtraffic_notify_client_txt"] = 'Send overtraffic notification to client';
$wb["v6_prefix_txt"] = 'IPv6 Prefix';
$wb["vhost_rewrite_v6_txt"] = 'Rewrite IPv6 on Mirror';
$wb["v6_prefix_wrong"] = 'Invalid v6 Netmask format.';
$wb["php_ini_check_minutes_txt"] = 'Check system php.ini files for changes each';
$wb["php_ini_check_minutes_info_txt"] = 'minutes (0 disables checking)';
$wb['php_ini_check_minutes_error_empty'] = 'Invalid value for php.ini checking.';
$wb["rbl_error_regex"] = 'Please specify valid RBL hostnames.';
$wb["sendmail_path_txt"] = 'Sendmail Path';
$wb["sendmail_path_error_empty"] = 'Sendmail Path is empty.';
?>
$wb["overquota_notify_admin_txt"] = 'Send quota warnings to admin';
$wb["overquota_notify_client_txt"] = 'Send quota warnings to client';
$wb["overquota_notify_onok_txt"] = 'Send quota ok message to client';
$wb['overquota_notify_freq_txt'] = 'Send quota warning each X days';
$wb['overquota_notify_freq_note_txt'] = '0 = send message just once, no repeated messages';
$wb['admin_notify_events_txt'] = 'Send email to admin starting with the following level';
$wb['no_notifications_txt'] = 'No Notifications';
$wb['monit_url_txt'] = 'Monit URL';
$wb['monit_user_txt'] = 'Monit User';
$wb['monit_password_txt'] = 'Monit Password';
$wb['monit_url_error_regex'] = 'Invalid Monit URL';
$wb['monit_url_note_txt'] = 'Placeholder:';
$wb['munin_url_txt'] = 'Munin URL';
$wb['munin_user_txt'] = 'Munin User';
$wb['munin_password_txt'] = 'Munin Password';
$wb['munin_url_error_regex'] = 'Invalid Munin URL';
$wb['munin_url_note_txt'] = 'Placeholder:';
?>
interface/web/admin/lib/lang/en_software_package.lng
New file
@@ -0,0 +1,6 @@
<?php
$wb["package_title_txt"] = 'Package Title';
$wb["package_key_txt"] = 'Package Key';
$wb["Software Package"] = 'Software Package';
$wb['Modify software package details'] = 'Modify software package details';
?>
interface/web/admin/lib/lang/en_software_package_list.lng
@@ -8,4 +8,6 @@
$wb['repoupdate_txt'] = 'Update package list';
$wb['package_id_txt'] = 'local App-ID';
$wb['no_packages_txt'] = 'No packages available';
$wb['edit_txt'] = 'Edit';
$wb['delete_txt'] = 'Delete';
?>
interface/web/admin/lib/lang/en_software_repo.lng
@@ -4,4 +4,5 @@
$wb["repo_username_txt"] = 'User (optional)';
$wb["repo_password_txt"] = 'Password (optional)';
$wb["active_txt"] = 'Active';
$wb['Software Repository which may contain addons or updates'] = 'Software Repository which may contain addons or updates';
?>
interface/web/admin/lib/lang/en_system_config.lng
@@ -53,5 +53,6 @@
$wb['mailbox_show_mail_filter_tab_txt'] = 'Show mail filter tab in mail account details';
$wb['mailbox_show_custom_rules_tab_txt'] = 'Show custom mailfilter tab in mail account details';
$wb['webmail_url_error_regex'] = 'Invalid webmail URL';
$wb['reseller_can_use_options_txt'] = 'Reseller can use options tab in web sites config';
$wb['phpmyadmin_url_note_txt'] = 'Placeholder:';
$wb['webmail_url_note_txt'] = 'Placeholder:';
?>
interface/web/admin/server_ip_list.php
@@ -46,7 +46,7 @@
$app->uses('listform_actions');
$app->listform_actions->SQLOrderBy = "ORDER BY server_id, ip_address";
$app->listform_actions->SQLOrderBy = "ORDER BY server_ip.server_id, server_ip.ip_address";
$app->listform_actions->onLoad();
interface/web/admin/server_php_list.php
@@ -46,7 +46,7 @@
$app->uses('listform_actions');
$app->listform_actions->SQLOrderBy = "ORDER BY server_id, name";
$app->listform_actions->SQLOrderBy = "ORDER BY server_php.server_id, server_php.name";
$app->listform_actions->onLoad();
interface/web/admin/software_package_edit.php
New file
@@ -0,0 +1,59 @@
<?php
/*
Copyright (c) 2008, Till Brehm, projektfarm Gmbh
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
    * Redistributions of source code must retain the above copyright notice,
      this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
    * Neither the name of ISPConfig nor the names of its contributors
      may be used to endorse or promote products derived from this software without
      specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/******************************************
* Begin Form configuration
******************************************/
$tform_def_file = "form/software_package.tform.php";
/******************************************
* End Form configuration
******************************************/
require_once('../../lib/config.inc.php');
require_once('../../lib/app.inc.php');
//* Check permissions for module
$app->auth->check_module_permissions('admin');
if($conf['demo_mode'] == true) $app->error('This function is disabled in demo mode.');
// Loading classes
$app->uses('tpl,tform,tform_actions');
$app->load('tform_actions');
class page_action extends tform_actions {
}
$page = new page_action;
$page->onLoad();
?>
interface/web/admin/software_package_list.php
@@ -181,7 +181,8 @@
$app->tpl->setLoop('records',$packages);
include_once('lib/lang/en_software_package_list.lng');
$language = (isset($_SESSION['s']['language']))?$_SESSION['s']['language']:$conf['language'];
include_once('lib/lang/'.$language.'_software_package_list.lng');
$app->tpl->setVar($wb);
interface/web/admin/software_update_list.php
@@ -211,7 +211,8 @@
$app->tpl->setLoop('records',$records_out);
include_once('lib/lang/en_software_update_list.lng');
$language = (isset($_SESSION['s']['language']))?$_SESSION['s']['language']:$conf['language'];
include_once('lib/lang/'.$language.'_software_update_list.lng');
$app->tpl->setVar($wb);
interface/web/admin/templates/remote_user_list.htm
@@ -17,12 +17,12 @@
            <table class="list">
                <thead>
                    <tr class="caption">
                        <th class="tbl_col_remote_user_pid" scope="col"><tmpl_var name="parent_remote_userid_txt"></th>
                        <th class="tbl_col_remote_userid" scope="col"><tmpl_var name="parent_remote_userid_txt"></th>
                        <th class="tbl_col_remote_username" scope="col"><tmpl_var name="username_txt"></th>
                        <th class="tbl_col_limit" scope="col">{tmpl_var name='search_limit'}</th>
                    </tr>
                    <tr class="filter">
                        <td class="tbl_col_remote_user_pid">&nbsp;</td>
                        <td class="tbl_col_remote_userid">&nbsp;</td>
                        <td class="tbl_col_remote_username"><input type="text" name="search_username" value="{tmpl_var name='search_username'}" /></td>
                        <td class="tbl_col_buttons">
                            <button type="button" class="button icons16 icoFilter" name="Filter" id="Filter" value="{tmpl_var name="filter_txt"}" onclick="submitForm('pageForm','admin/remote_user_list.php');"><span>{tmpl_var name="filter_txt"}</span></button>
@@ -32,7 +32,7 @@
                <tbody>
                    <tmpl_loop name="records">
                        <tr class="tbl_row_<tmpl_if name='__EVEN__'}even<tmpl_else>uneven</tmpl_if>">
                            <td class="tbl_col_remote_user_pid"><a href="#" onclick="loadContent('admin/remote_user_edit.php?id={tmpl_var name='remote_userid'}');">{tmpl_var name="remote_userid"}</a></td>
                            <td class="tbl_col_remote_userid"><a href="#" onclick="loadContent('admin/remote_user_edit.php?id={tmpl_var name='remote_userid'}');">{tmpl_var name="remote_userid"}</a></td>
                            <td class="tbl_col_remote_username"><a href="#" onclick="loadContent('admin/remote_user_edit.php?id={tmpl_var name='remote_userid'}');">{tmpl_var name="remote_username"}</a></td>
                            <td class="tbl_col_buttons">
                                <a class="button icons16 icoDelete" href="javascript: del_record('admin/remote_user_del.php?id={tmpl_var name='remote_userid'}&phpsessid={tmpl_var name='phpsessid'}','{tmpl_var name='delete_confirmation'}');"><span>{tmpl_var name='delete_txt'}</span></a>
interface/web/admin/templates/server_config_mail_edit.htm
@@ -85,9 +85,27 @@
                <label for="realtime_blackhole_list">{tmpl_var name='realtime_blackhole_list_txt'}</label>
                <input name="realtime_blackhole_list" id="realtime_blackhole_list" value="{tmpl_var name='realtime_blackhole_list'}" size="40" maxlength="255" type="text" class="textInput" />&nbsp;{tmpl_var name='realtime_blackhole_list_note_txt'}
            </div>
            <div class="ctrlHolder">
                <p class="label">{tmpl_var name='overquota_notify_admin_txt'}</p>
                <div class="multiField">
                    {tmpl_var name='overquota_notify_admin'}
                </div>
            </div>
            <div class="ctrlHolder">
                <label for="sendmail_path">{tmpl_var name='sendmail_path_txt'}</label>
                <input name="sendmail_path" id="sendmail_path" value="{tmpl_var name='sendmail_path'}" size="40" maxlength="255" type="text" class="textInput" />
                <p class="label">{tmpl_var name='overquota_notify_client_txt'}</p>
                <div class="multiField">
                    {tmpl_var name='overquota_notify_client'}
                </div>
            </div>
            <div class="ctrlHolder">
                <label for="overquota_notify_freq">{tmpl_var name='overquota_notify_freq_txt'}</label>
                <input name="overquota_notify_freq" id="overquota_notify_freq" value="{tmpl_var name='overquota_notify_freq'}" size="40" maxlength="255" type="text" class="textInput" />&nbsp;{tmpl_var name='overquota_notify_freq_note_txt'}
            </div>
            <div class="ctrlHolder">
                <p class="label">{tmpl_var name='overquota_notify_onok_txt'}</p>
                <div class="multiField">
                    {tmpl_var name='overquota_notify_onok'}
                </div>
            </div>
        </fieldset>
            
interface/web/admin/templates/server_config_server_edit.htm
@@ -48,6 +48,12 @@
                    {tmpl_var name='loglevel'}
                </select>
            </div>
            <div class="ctrlHolder">
                <label for="admin_notify_events">{tmpl_var name='admin_notify_events_txt'}</label>
                <select name="admin_notify_events" id="admin_notify_events" class="selectInput">
                    {tmpl_var name='admin_notify_events'}
                </select>
            </div>
            <div class="ctrlHolder">
                <label for="backup_dir">{tmpl_var name='backup_dir_txt'}</label>
                <input name="backup_dir" id="backup_dir" value="{tmpl_var name='backup_dir'}" size="40" maxlength="255" type="text" class="textInput" />
@@ -58,6 +64,30 @@
                    {tmpl_var name='backup_mode'}
                </select>
            </div>
            <div class="ctrlHolder">
                <label for="monit_url">{tmpl_var name='monit_url_txt'}</label>
                <input name="monit_url" id="monit_url" value="{tmpl_var name='monit_url'}" size="40" maxlength="255" type="text" class="textInput" />&nbsp;{tmpl_var name='monit_url_note_txt'} <a href="javascript:void(0);" class="addPlaceholder">[SERVERNAME]</a>
            </div>
            <div class="ctrlHolder">
                <label for="monit_user">{tmpl_var name='monit_user_txt'}</label>
                <input name="monit_user" id="monit_user" value="{tmpl_var name='monit_user'}" size="40" maxlength="255" type="text" class="textInput" />
            </div>
            <div class="ctrlHolder">
                <label for="monit_password">{tmpl_var name='monit_password_txt'}</label>
                <input name="monit_password" id="monit_password" value="{tmpl_var name='monit_password'}" size="40" maxlength="255" type="text" class="textInput" />
            </div>
            <div class="ctrlHolder">
                <label for="munin_url">{tmpl_var name='munin_url_txt'}</label>
                <input name="munin_url" id="munin_url" value="{tmpl_var name='munin_url'}" size="40" maxlength="255" type="text" class="textInput" />&nbsp;{tmpl_var name='munin_url_note_txt'} <a href="javascript:void(0);" class="addPlaceholder">[SERVERNAME]</a>
            </div>
            <div class="ctrlHolder">
                <label for="munin_user">{tmpl_var name='munin_user_txt'}</label>
                <input name="munin_user" id="munin_user" value="{tmpl_var name='munin_user'}" size="40" maxlength="255" type="text" class="textInput" />
            </div>
            <div class="ctrlHolder">
                <label for="munin_password">{tmpl_var name='munin_password_txt'}</label>
                <input name="munin_password" id="munin_password" value="{tmpl_var name='munin_password'}" size="40" maxlength="255" type="text" class="textInput" />
            </div>
        </fieldset>
            
        <input type="hidden" name="id" value="{tmpl_var name='id'}">
interface/web/admin/templates/server_config_web_edit.htm
@@ -115,6 +115,28 @@
                    {tmpl_var name='overtraffic_notify_client'}
                </div>
            </div>
            <div class="ctrlHolder">
                <p class="label">{tmpl_var name='overquota_notify_admin_txt'}</p>
                <div class="multiField">
                    {tmpl_var name='overquota_notify_admin'}
                </div>
            </div>
            <div class="ctrlHolder">
                <p class="label">{tmpl_var name='overquota_notify_client_txt'}</p>
                <div class="multiField">
                    {tmpl_var name='overquota_notify_client'}
                </div>
            </div>
            <div class="ctrlHolder">
                <label for="overquota_notify_freq">{tmpl_var name='overquota_notify_freq_txt'}</label>
                <input name="overquota_notify_freq" id="overquota_notify_freq" value="{tmpl_var name='overquota_notify_freq'}" size="40" maxlength="255" type="text" class="textInput" />&nbsp;{tmpl_var name='overquota_notify_freq_note_txt'}
            </div>
            <div class="ctrlHolder">
                <p class="label">{tmpl_var name='overquota_notify_onok_txt'}</p>
                <div class="multiField">
                    {tmpl_var name='overquota_notify_onok'}
                </div>
            </div>
            <div class="subsectiontoggle"><span></span>{tmpl_var name='ssl_settings_txt'}<em></em></div>
            <div style="display:none;">
                <div class="ctrlHolder">
interface/web/admin/templates/software_package_edit.htm
New file
@@ -0,0 +1,27 @@
<h2><tmpl_var name="list_head_txt"></h2>
<p><tmpl_var name="list_desc_txt"></p>
<div class="panel panel_software_package">
    <div class="pnl_formsarea">
        <fieldset class="inlineLabels">
            <div class="ctrlHolder">
                <label for="package_title">{tmpl_var name='package_title_txt'}</label>
                {tmpl_var name='package_title'}<input name="package_title" id="package_title" value="{tmpl_var name='package_title'}" size="40" maxlength="40" type="hidden" class="textInput" />
            </div>
            <div class="ctrlHolder">
                <label for="package_key">{tmpl_var name='package_key_txt'}</label>
                <input name="package_key" id="package_key" value="{tmpl_var name='package_key'}" size="40" maxlength="40" type="text" class="textInput" />
            </div>
        <input type="hidden" name="id" value="{tmpl_var name='id'}">
        <div class="buttonHolder buttons">
            <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onclick="submitForm('pageForm','admin/software_package_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
            <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onclick="loadContent('admin/software_package_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
        </div>
        </fieldset>
    </div>
</div>
interface/web/admin/templates/software_package_list.htm
@@ -21,7 +21,7 @@
                        <th class="tbl_col_installed" scope="col"><tmpl_var name="installed_txt"></th>
                        <th class="tbl_col_package_title" scope="col"><tmpl_var name="package_title_txt"></th>
                        <th class="tbl_col_package_description" scope="col"><tmpl_var name="package_description_txt"></th>
                        <th class="tbl_col_package_description" scope="col"><tmpl_var name="package_id_txt"></th>
                        <th class="tbl_col_package_id" scope="col"><tmpl_var name="package_id_txt"></th>
                        <th class="tbl_col_limit" scope="col">{tmpl_var name='search_limit'}</th>
                    </tr>
                </thead>
@@ -32,8 +32,9 @@
                            <td class="tbl_col_installed">{tmpl_var name="installed"}</td>
                            <td class="tbl_col_package_title">{tmpl_var name="package_title"}</td>
                            <td class="tbl_col_package_description">{tmpl_var name="package_description"}</td>
                            <td class="tbl_col_package_description">ispapp{tmpl_var name="package_id"}</td>
                            <td class="tbl_col_buttons">
                            <td class="tbl_col_package_id">ispapp{tmpl_var name="package_id"}</td>
                            <td class="tbl_col_buttons">
                                <a class="button icons16 icoEdit" href="javascript: loadContent('admin/software_package_edit.php?id={tmpl_var name='package_id'}');"><span>{tmpl_var name='edit_txt'}</span></a>
                                <a class="button icons16 icoDelete" href="javascript: del_record('admin/software_package_del.php?software_update_inst_id={tmpl_var name='software_update_inst_id'}','{tmpl_var name='delete_confirmation'}');"><span>{tmpl_var name='delete_txt'}</span></a>
                            </td>
                        </tr>
interface/web/admin/templates/system_config_mail_edit.htm
@@ -37,7 +37,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="webmail_url">{tmpl_var name='webmail_url_txt'}</label>
                <input name="webmail_url" id="webmail_url" value="{tmpl_var name='webmail_url'}" size="30" maxlength="255" type="text" class="textInput" />
                <input name="webmail_url" id="webmail_url" value="{tmpl_var name='webmail_url'}" size="30" maxlength="255" type="text" class="textInput" />&nbsp;{tmpl_var name='webmail_url_note_txt'} <a href="javascript:void(0);" class="addPlaceholder">[SERVERNAME]</a>
            </div>
            <div class="ctrlHolder">
                <p class="label">{tmpl_var name='mailmailinglist_link_txt'}</p>
interface/web/admin/templates/system_config_sites_edit.htm
@@ -33,7 +33,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="phpmyadmin_url">{tmpl_var name='phpmyadmin_url_txt'}</label>
                <input name="phpmyadmin_url" id="phpmyadmin_url" value="{tmpl_var name='phpmyadmin_url'}" size="30" maxlength="255" type="text" class="textInput" />
                <input name="phpmyadmin_url" id="phpmyadmin_url" value="{tmpl_var name='phpmyadmin_url'}" size="30" maxlength="255" type="text" class="textInput" />&nbsp;{tmpl_var name='phpmyadmin_url_note_txt'} <a href="javascript:void(0);" class="addPlaceholder">[SERVERNAME]</a>, <a href="javascript:void(0);" class="addPlaceholder">[DATABASENAME]</a>
            </div>
            <div class="ctrlHolder">
                <label for="webftp_url">{tmpl_var name='webftp_url_txt'}</label>
interface/web/admin/users_list.php
@@ -45,7 +45,7 @@
$app->auth->check_module_permissions('admin');
$app->uses('listform_actions');
$app->listform_actions->SQLOrderBy = 'ORDER BY username';
$app->listform_actions->SQLOrderBy = 'ORDER BY sys_user.username';
$app->listform_actions->onLoad();
interface/web/client/client_circle_list.php
@@ -17,7 +17,7 @@
$app->uses('listform_actions');
$app->listform_actions->SQLOrderBy = 'ORDER BY circle_name, circle_id';
$app->listform_actions->SQLOrderBy = 'ORDER BY client_circle.circle_name, client_circle.circle_id';
$app->listform_actions->onLoad();
interface/web/client/client_del.php
@@ -97,6 +97,7 @@
        }
        
        $app->tpl->setVar('id',$this->id);
        $app->tpl->setVar('number_records',$number);
        $app->tpl->setLoop('records', $table_list);
        
        //* load language file 
interface/web/client/client_edit.php
@@ -177,7 +177,7 @@
        $tmp = $app->db->queryOneRecord('SELECT server_id FROM server WHERE db_server = 1 AND mirror_server_id = 0 LIMIT 0,1');
        $default_dbserver = $app->functions->intval($tmp['server_id']);
        
        $sql = "UPDATE client SET default_mailserver = $default_mailserver, default_webserver = $default_webserver, default_dnsserver = $default_dnsserver, default_dbserver = $default_dbserver WHERE client_id = ".$this->id;
        $sql = "UPDATE client SET default_mailserver = $default_mailserver, default_webserver = $default_webserver, default_dnsserver = $default_dnsserver, default_slave_dnsserver = $default_dnsserver, default_dbserver = $default_dbserver WHERE client_id = ".$this->id;
        $app->db->query($sql);
        
interface/web/client/client_list.php
@@ -17,8 +17,8 @@
$app->uses('listform_actions');
$app->listform_actions->SQLOrderBy = 'ORDER BY company_name, contact_name, client_id';
$app->listform_actions->SQLExtWhere = "limit_client = 0";
$app->listform_actions->SQLOrderBy = 'ORDER BY client.company_name, client.contact_name, client.client_id';
$app->listform_actions->SQLExtWhere = "client.limit_client = 0";
$app->listform_actions->SQLExtSelect = ', client.country as countryiso';
$app->listform_actions->onLoad();
interface/web/client/client_template_edit.php
@@ -1,97 +1,97 @@
<?php
/*
Copyright (c) 2007-2010, Till Brehm, projektfarm Gmbh and Oliver Vogel www.muv.com
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
    * Redistributions of source code must retain the above copyright notice,
      this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
    * Neither the name of ISPConfig nor the names of its contributors
      may be used to endorse or promote products derived from this software without
      specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/******************************************
* Begin Form configuration
******************************************/
$tform_def_file = "form/client_template.tform.php";
/******************************************
* End Form configuration
******************************************/
require_once('../../lib/config.inc.php');
require_once('../../lib/app.inc.php');
//* Check permissions for module
$app->auth->check_module_permissions('client');
if(!$_SESSION["s"]["user"]["typ"] == 'admin') die('Client-Templates are only for Admins.');
// Loading classes
$app->uses('tpl,tform,tform_actions');
$app->load('tform_actions');
class page_action extends tform_actions {
    function onBeforeUpdate() {
        global $app;
        if(isset($this->dataRecord['template_type'])) {
            //* Check if the template_type has been changed
            $rec = $app->db->queryOneRecord("SELECT template_type from client_template WHERE template_id = ".$this->id);
            if($rec['template_type'] != $this->dataRecord['template_type']) {
                //* Add a error message and switch back to old server
                $app->tform->errorMessage .= $app->lng('The template type can not be changed.');
                $this->dataRecord['template_type'] = $rec['template_type'];
            }
            unset($rec);
        }
    }
    /*
     This function is called automatically right after
     the data was successful updated in the database.
    */
    function onAfterUpdate() {
        global $app;
        $app->uses('client_templates');
        /*
         * the template has changed. apply the new data to all clients
         */
        if ($this->dataRecord["template_type"] == 'm'){
            $sql = "SELECT client_id FROM client WHERE template_master = " . $this->id;
        } else {
            $sql = "SELECT client_id FROM client WHERE template_additional LIKE '%/" . $this->id . "/%'";
        }
        $clients = $app->db->queryAllRecords($sql);
        if (is_array($clients)){
            foreach ($clients as $client){
                $app->client_templates->apply_client_templates($client['client_id']);
            }
        }
    }
}
$page = new page_action;
$page->onLoad();
?>
<?php
/*
Copyright (c) 2007-2010, Till Brehm, projektfarm Gmbh and Oliver Vogel www.muv.com
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
    * Redistributions of source code must retain the above copyright notice,
      this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
    * Neither the name of ISPConfig nor the names of its contributors
      may be used to endorse or promote products derived from this software without
      specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/******************************************
* Begin Form configuration
******************************************/
$tform_def_file = "form/client_template.tform.php";
/******************************************
* End Form configuration
******************************************/
require_once('../../lib/config.inc.php');
require_once('../../lib/app.inc.php');
//* Check permissions for module
$app->auth->check_module_permissions('client');
if(!$_SESSION["s"]["user"]["typ"] == 'admin') die('Client-Templates are only for Admins.');
// Loading classes
$app->uses('tpl,tform,tform_actions');
$app->load('tform_actions');
class page_action extends tform_actions {
    function onBeforeUpdate() {
        global $app;
        if(isset($this->dataRecord['template_type'])) {
            //* Check if the template_type has been changed
            $rec = $app->db->queryOneRecord("SELECT template_type from client_template WHERE template_id = ".$this->id);
            if($rec['template_type'] != $this->dataRecord['template_type']) {
                //* Add a error message and switch back to old server
                $app->tform->errorMessage .= $app->lng('The template type can not be changed.');
                $this->dataRecord['template_type'] = $rec['template_type'];
            }
            unset($rec);
        }
    }
    /*
     This function is called automatically right after
     the data was successful updated in the database.
    */
    function onAfterUpdate() {
        global $app;
        $app->uses('client_templates');
        /*
         * the template has changed. apply the new data to all clients
         */
        if ($this->dataRecord["template_type"] == 'm'){
            $sql = "SELECT client_id FROM client WHERE template_master = " . $this->id;
        } else {
            $sql = "SELECT client_id FROM client WHERE template_additional LIKE '%/" . $this->id . "/%' OR template_additional LIKE '" . $this->id . "/%' OR template_additional LIKE '%/" . $this->id . "'";
        }
        $clients = $app->db->queryAllRecords($sql);
        if (is_array($clients)){
            foreach ($clients as $client){
                $app->client_templates->apply_client_templates($client['client_id']);
            }
        }
    }
}
$page = new page_action;
$page->onLoad();
?>
interface/web/client/client_template_list.php
@@ -44,6 +44,6 @@
if(!$_SESSION["s"]["user"]["typ"] == 'admin') die('Client-Templates are only for Admins.');
$app->uses('listform_actions');
$app->listform_actions->SQLOrderBy = 'ORDER BY template_name';
$app->listform_actions->SQLOrderBy = 'ORDER BY client_template.template_name';
$app->listform_actions->onLoad();
?>
interface/web/client/domain_list.php
@@ -46,7 +46,7 @@
$app->uses('listform_actions');
$app->listform_actions->SQLOrderBy = 'ORDER BY domain';
$app->listform_actions->SQLOrderBy = 'ORDER BY domain.domain';
$app->listform_actions->onLoad();
?>
interface/web/client/form/client.tform.php
@@ -899,20 +899,31 @@
            'rows'        => '',
            'cols'        => ''
        ),
                'limit_dns_slave_zone' => array (
                        'datatype'      => 'INTEGER',
                        'formtype'      => 'TEXT',
                        'validators'    => array (      0 => array (    'type'  => 'ISINT',
        'default_slave_dnsserver' => array (
            'datatype'    => 'INTEGER',
            'formtype'    => 'SELECT',
            'default'    => '1',
            'datasource'    => array (     'type'    => 'CUSTOM',
                                        'class'=> 'custom_datasource',
                                        'function'=> 'client_servers'
                                     ),
            'value'        => '',
            'name'        => 'default_slave_dnsserver'
        ),
        'limit_dns_slave_zone' => array (
            'datatype'      => 'INTEGER',
            'formtype'      => 'TEXT',
            'validators'    => array (      0 => array (    'type'  => 'ISINT',
                                                                                                                'errmsg'=> 'limit_dns_slave_zone_error_notint'),
                                                                        ),
                        'default'       => '-1',
                        'value'         => '',
                        'separator'     => '',
                        'width'         => '10',
                        'maxlength'     => '10',
                        'rows'          => '',
                        'cols'          => ''
                ),
            'default'       => '-1',
            'value'         => '',
            'separator'     => '',
            'width'         => '10',
            'maxlength'     => '10',
            'rows'          => '',
            'cols'          => ''
        ),
        'limit_dns_record' => array (
            'datatype'    => 'INTEGER',
            'formtype'    => 'TEXT',
interface/web/client/form/reseller.tform.php
@@ -894,6 +894,17 @@
            'rows'        => '',
            'cols'        => ''
        ),
        'default_slave_dnsserver' => array (
            'datatype'    => 'INTEGER',
            'formtype'    => 'SELECT',
            'default'    => '1',
            'datasource'    => array (     'type'    => 'SQL',
                                        'querystring' => 'SELECT server_id,server_name FROM server WHERE dns_server = 1 AND {AUTHSQL} ORDER BY server_name',
                                        'keyfield'=> 'server_id',
                                        'valuefield'=> 'server_name'
                                     ),
            'value'        => ''
        ),
                'limit_dns_slave_zone' => array (
                        'datatype'      => 'INTEGER',
                        'formtype'      => 'TEXT',
interface/web/client/lib/lang/de_client.lng
@@ -103,10 +103,10 @@
$wb['limit_web_quota_txt'] = 'Webbeschränkung';
$wb['limit_traffic_quota_txt'] = 'Trafficbeschränkung';
$wb['limit_trafficquota_error_notint'] = 'Trafficbeschränkung muss eine Zahl sein.';
$wb['limit_dns_slave_zone_txt'] = 'Max. Anzahl an Zweiter DNS Zonen';
$wb['limit_dns_slave_zone_txt'] = 'Max. Anzahl an Secondary DNS Zonen';
$wb['limit_webdav_user_txt'] = 'Max. Anzahl an WebDAV Benutzern';
$wb['limit_webdav_user_error_notint'] = 'Das WebDAV Benutzer Limit muss eine Zahl sein.';
$wb['limit_dns_slave_zone_error_notint'] = 'Das Zweiter DNS Zonen Limit muss eine Zahl sein.';
$wb['limit_dns_slave_zone_error_notint'] = 'Das Secondary DNS Zonen Limit muss eine Zahl sein.';
$wb['customer_no_txt'] = 'Kundennummer';
$wb['vat_id_txt'] = 'USt-ID';
$wb['required_fields_txt'] = '* Benötigte Felder';
@@ -143,4 +143,5 @@
$wb['aps_limits_txt'] = 'APS Installationsassistent Limits';
$wb['limit_aps_txt'] = 'Max. Anzahl an APS-Instanzen';
$wb['limit_aps_error_notint'] = 'Das APS Instanzen Limit muss eine Zahl sein.';
$wb['default_slave_dnsserver_txt'] = 'Standard Secondary DNS Server';
?>
interface/web/client/lib/lang/de_client_del.lng
@@ -3,4 +3,5 @@
$wb['delete_explanation'] = 'Diese Aktion wird folgende Anzahl an Datensätzen des Kunden löschen';
$wb['btn_save_txt'] = 'Kunden löschen';
$wb['btn_cancel_txt'] = 'Abbrechen, ohne den Kunden zu löschen';
$wb['confirm_client_delete_txt'] = 'Sind Sie sicher, daß Sie den Kunden löschen möchten?';
?>
interface/web/client/lib/lang/de_client_template_list.lng
@@ -2,4 +2,5 @@
$wb['list_head_txt'] = 'Kundenvorlagen';
$wb['template_type_txt'] = 'Typ';
$wb['template_name_txt'] = 'Vorlagenname';
$wb['template_id_txt'] = 'Template ID';
?>
interface/web/client/lib/lang/de_reseller.lng
@@ -101,8 +101,8 @@
$wb['limit_web_quota_txt'] = 'Speicherplatzbeschränkung';
$wb['limit_traffic_quota_txt'] = 'Transfervolumenbeschränkung';
$wb['limit_trafficquota_error_notint'] = 'Transfervolumenbeschränkung muss eine Zahl sein.';
$wb['limit_dns_slave_zone_txt'] = 'Max. Anzahl an Zweiter DNS Zonen';
$wb['limit_dns_slave_zone_error_notint'] = 'Das Zweiter DNS Zonen Limit muss eine Zahl sein.';
$wb['limit_dns_slave_zone_txt'] = 'Max. Anzahl an Secondary DNS Zonen';
$wb['limit_dns_slave_zone_error_notint'] = 'Das Secondary DNS Zonen Limit muss eine Zahl sein.';
$wb['limit_dns_record_error_notint'] = 'Das DNS Eintrag Limit muss eine Zahl sein.';
$wb['customer_no_txt'] = 'Kundennummer';
$wb['vat_id_txt'] = 'USt-ID';
@@ -142,4 +142,5 @@
$wb['aps_limits_txt'] = 'APS Installationsassistent Limits';
$wb['limit_aps_txt'] = 'Max. Anzahl an APS-Instanzen';
$wb['limit_aps_error_notint'] = 'Das APS Instanzen Limit muss eine Zahl sein.';
$wb['default_slave_dnsserver_txt'] = 'Standard Secondary DNS Server';
?>
interface/web/client/lib/lang/en_client.lng
@@ -91,7 +91,7 @@
$wb["limit_database_error_notint"] = 'The database limit must be a number.';
$wb["limit_cron_error_notint"] = 'The cron limit must be a number.';
$wb["limit_cron_error_frequency"] = 'The cron frequency limit must be a number.';
$wb["username_error_regex"] = 'The Username contains invalid chracaters.';
$wb["username_error_regex"] = 'The Username contains invalid characters.';
$wb["template_master_txt"] = 'Master template';
$wb["template_additional_txt"] = 'Addon template';
$wb["active_template_additional_txt"] = 'Active Addons';
@@ -146,4 +146,5 @@
$wb['aps_limits_txt'] = 'APS Installer Limits';
$wb['limit_aps_txt'] = 'Max. number of APS instances';
$wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.';
$wb["default_slave_dnsserver_txt"] = 'Default Secondary DNS Server';
?>
interface/web/client/lib/lang/en_client_del.lng
@@ -3,4 +3,5 @@
$wb["delete_explanation"] = 'This action will delete the following number of records associated with this client';
$wb["btn_save_txt"] = 'Delete the client';
$wb["btn_cancel_txt"] = 'Cancel without deleting the client';
$wb["confirm_client_delete_txt"] = 'Are you sure you want to delete this client?';
?>
interface/web/client/lib/lang/en_client_template_list.lng
@@ -2,4 +2,5 @@
$wb["list_head_txt"] = 'Client-Templates';
$wb["template_type_txt"] = 'Type';
$wb["template_name_txt"] = 'Template name';
$wb['template_id_txt'] = 'Template ID';
?>
interface/web/client/lib/lang/en_reseller.lng
@@ -90,7 +90,7 @@
$wb["limit_database_error_notint"] = 'The database limit must be a number.';
$wb["limit_cron_error_notint"] = 'The cron limit must be a number.';
$wb["limit_cron_error_frequency"] = 'The cron frequency limit must be a number.';
$wb["username_error_regex"] = 'The Username contains invalid chracaters.';
$wb["username_error_regex"] = 'The Username contains invalid characters.';
$wb["template_master_txt"] = 'Master template';
$wb["template_additional_txt"] = 'Addon template';
$wb["add_additional_template_txt"] = 'Add additional template';
@@ -144,4 +144,5 @@
$wb['aps_limits_txt'] = 'APS Installer Limits';
$wb['limit_aps_txt'] = 'Max. number of APS instances';
$wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.';
$wb["default_slave_dnsserver_txt"] = 'Default Secondary DNS Server';
?>
interface/web/client/reseller_edit.php
@@ -175,7 +175,7 @@
        $tmp = $app->db->queryOneRecord('SELECT server_id FROM server WHERE db_server = 1 LIMIT 0,1');
        $default_dbserver = $app->functions->intval($tmp['server_id']);
        
        $sql = "UPDATE client SET default_mailserver = $default_mailserver, default_webserver = $default_webserver, default_dnsserver = $default_dnsserver, default_dbserver = $default_dbserver WHERE client_id = ".$this->id;
        $sql = "UPDATE client SET default_mailserver = $default_mailserver, default_webserver = $default_webserver, default_dnsserver = $default_dnsserver, default_slave_dnsserver = $default_dnsserver, default_dbserver = $default_dbserver WHERE client_id = ".$this->id;
        $app->db->query($sql);
        parent::onAfterInsert();
interface/web/client/reseller_list.php
@@ -47,8 +47,8 @@
$app->uses('listform_actions');
$app->listform_actions->SQLOrderBy = 'ORDER BY company_name, contact_name, client_id';
$app->listform_actions->SQLExtWhere = "(limit_client > 0 or limit_client = -1)";
$app->listform_actions->SQLOrderBy = 'ORDER BY client.company_name, client.contact_name, client.client_id';
$app->listform_actions->SQLExtWhere = "(client.limit_client > 0 or client.limit_client = -1)";
$app->listform_actions->SQLExtSelect = ', client.country as countryiso';
$app->listform_actions->onLoad();
interface/web/client/templates/client_del.htm
@@ -4,14 +4,18 @@
<div class="panel panel_client_del">
    <div class="pnl_formsarea">
        <div id="OKMsg">
            <tmpl_if name='number_records'>
            <tmpl_var name="delete_explanation">:<br /><br />
                <tmpl_loop name="records">
                    <tmpl_var name="table">, 
                </tmpl_loop>
            </tmpl_else>
                <tmpl_var name="confirm_client_delete_txt">
            </tmpl_if>
        </div>
        <input type="checkbox" name="confirm" value="yes" /> <b><tmpl_var name="confirm_action_txt"></b>
        <input type="hidden" name="id" value="{tmpl_var name='id'}">
interface/web/client/templates/client_edit_limits.htm
@@ -256,6 +256,12 @@
                    <label for="limit_dns_zone">{tmpl_var name='limit_dns_zone_txt'}</label>
                    <input name="limit_dns_zone" id="limit_dns_zone" value="{tmpl_var name='limit_dns_zone'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
                </div>
                <div class="ctrlHolder">
                    <label for="default_slave_dnsserver">{tmpl_var name='default_slave_dnsserver_txt'}</label>
                    <select name="default_slave_dnsserver" id="default_slave_dnsserver" class="selectInput">
                        {tmpl_var name='default_slave_dnsserver'}
                    </select>
                </div>
                <div class="ctrlHolder">
                    <label for="limit_dns_slave_zone">{tmpl_var name='limit_dns_slave_zone_txt'}</label>
                    <input name="limit_dns_slave_zone" id="limit_dns_slave_zone" value="{tmpl_var name='limit_dns_slave_zone'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
@@ -307,7 +313,7 @@
        .find('div.pnl_formsarea')
        .find('fieldset')
        .find('input,select,button')
        .not('#template_master,#template_additional')
        .not('#template_master,#template_additional,#default_mailserver,#default_webserver,#default_dbserver,#default_dnsserver,#default_slave_dnsserver')
        .click(function(e) {
            if(custom_template_selected()) return true;
            e.preventDefault();
interface/web/client/templates/domain_list.htm
@@ -25,7 +25,7 @@
            <thead>
                <tr>
                    <th class="tbl_col_domain" scope="col"><tmpl_var name="domain_txt"></th>
                    <th class="tbl_col_sys_groupid" scope="col"><tmpl_var name="user_txt">A</th>
                    <th class="tbl_col_sys_groupid" scope="col"><tmpl_var name="user_txt"></th>
                    <th class="tbl_col_limit" scope="col">{tmpl_var name='search_limit'}</th>
                </tr>
                <tr>
interface/web/client/templates/reseller_edit_limits.htm
@@ -244,6 +244,12 @@
                    <label for="limit_dns_zone">{tmpl_var name='limit_dns_zone_txt'}</label>
                    <input name="limit_dns_zone" id="limit_dns_zone" value="{tmpl_var name='limit_dns_zone'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
                </div>
                <div class="ctrlHolder">
                    <label for="default_slave_dnsserver">{tmpl_var name='default_slave_dnsserver_txt'}</label>
                    <select name="default_slave_dnsserver" id="default_slave_dnsserver" class="selectInput">
                        {tmpl_var name='default_slave_dnsserver'}
                    </select>
                </div>
                <div class="ctrlHolder">
                    <label for="limit_dns_slave_zone">{tmpl_var name='limit_dns_slave_zone_txt'}</label>
                    <input name="limit_dns_slave_zone" id="limit_dns_slave_zone" value="{tmpl_var name='limit_dns_slave_zone'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
interface/web/dashboard/dashboard.php
@@ -157,7 +157,7 @@
/* Which dashlets in which column */
/******************************************************************************/
$leftcol_dashlets = array('modules','invoices');
$leftcol_dashlets = array('modules','invoices','quota','mailquota');
$rightcol_dashlets = array('limits');
/******************************************************************************/
interface/web/dashboard/dashlets/mailquota.php
New file
@@ -0,0 +1,93 @@
<?php
class dashlet_mailquota {
    function show() {
        global $app, $conf;
        //* Loading Template
        $app->uses('tpl');
        $tpl = new tpl;
        $tpl->newTemplate("dashlets/templates/mailquota.htm");
        $wb = array();
        $lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_dashlet_mailquota.lng';
        if(is_file($lng_file)) include($lng_file);
        $tpl->setVar($wb);
        $tmp_rec =  $app->db->queryAllRecords("SELECT data from monitor_data WHERE type = 'email_quota' ORDER BY created DESC");
        $monitor_data = array();
        if(is_array($tmp_rec)) {
            foreach ($tmp_rec as $tmp_mon) {
                //$monitor_data = array_merge_recursive($monitor_data,unserialize($app->db->unquote($tmp_mon['data'])));
                $tmp_array = unserialize($app->db->unquote($tmp_mon['data']));
                if(is_array($tmp_array)) {
                    foreach($tmp_array as $username => $data) {
                        if(!$monitor_data[$username]['used']) $monitor_data[$username]['used'] = $data['used'];
                    }
                }
            }
        }
        //print_r($monitor_data);
        if($_SESSION["s"]["user"]["typ"] != 'admin'){
            $sql_where = " AND sys_groupid = ".$_SESSION['s']['user']['default_group'];
        }
        $has_mailquota = false;
        // select email accounts belonging to client
        $emails = $app->db->queryAllRecords("SELECT * FROM mail_user WHERE 1".$sql_where);
        //print_r($emails);
        if(is_array($emails) && !empty($emails)){
            for($i=0;$i<sizeof($emails);$i++){
                $email = $emails[$i]['email'];
                $emails[$i]['used'] = isset($monitor_data[$email]['used']) ? $monitor_data[$email]['used'] : array(1 => 0);
                if (!is_numeric($emails[$i]['used'])) $emails[$i]['used']=$emails[$i]['used'][1];
                // colours
                $emails[$i]['display_colour'] = '#000000';
                if($emails[$i]['quota'] > 0){
                    $used_ratio = $emails[$i]['used']/$emails[$i]['quota'];
                } else {
                    $used_ratio = 0;
                }
                if($used_ratio >= 0.8) $emails[$i]['display_colour'] = '#fd934f';
                if($used_ratio >= 1) $emails[$i]['display_colour'] = '#cc0000';
                if($emails[$i]['quota'] == 0){
                    $emails[$i]['quota'] = $app->lng('unlimited');
                } else {
                    $emails[$i]['quota'] = round($emails[$i]['quota'] / 1048576,4).' MB';
                }
                if($emails[$i]['used'] < 1544000) {
                    $emails[$i]['used'] = round($emails[$i]['used'] / 1024,4).' KB';
                } else {
                    $emails[$i]['used'] = round($emails[$i]['used'] / 1048576,4).' MB';
                }
            }
            $has_mailquota = true;
            $tpl->setloop('mailquota', $emails);
        }
        //print_r($sites);
        $tpl->setVar('has_mailquota',$has_mailquota);
        return $tpl->grab();
    }
}
?>
interface/web/dashboard/dashlets/quota.php
New file
@@ -0,0 +1,116 @@
<?php
class dashlet_quota {
    function show() {
        global $app, $conf;
        //* Loading Template
        $app->uses('tpl');
        $tpl = new tpl;
        $tpl->newTemplate("dashlets/templates/quota.htm");
        $wb = array();
        $lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_dashlet_quota.lng';
        if(is_file($lng_file)) include($lng_file);
        $tpl->setVar($wb);
        $tmp_rec =  $app->db->queryAllRecords("SELECT data from monitor_data WHERE type = 'harddisk_quota' ORDER BY created DESC");
        $monitor_data = array();
        if(is_array($tmp_rec)) {
            foreach ($tmp_rec as $tmp_mon) {
                $monitor_data = array_merge_recursive($monitor_data,unserialize($app->db->unquote($tmp_mon['data'])));
            }
        }
        //print_r($monitor_data);
        if($_SESSION["s"]["user"]["typ"] != 'admin'){
            $sql_where = " AND sys_groupid = ".$_SESSION['s']['user']['default_group'];
        }
        $has_quota = false;
        // select websites belonging to client
        $sites = $app->db->queryAllRecords("SELECT * FROM web_domain WHERE active = 'y'".$sql_where);
        //print_r($sites);
        if(is_array($sites) && !empty($sites)){
            for($i=0;$i<sizeof($sites);$i++){
                $username = $sites[$i]['system_user'];
                $sites[$i]['used'] = $monitor_data['user'][$username]['used'];
                $sites[$i]['soft'] = $monitor_data['user'][$username]['soft'];
                $sites[$i]['hard'] = $monitor_data['user'][$username]['hard'];
                $sites[$i]['files'] = $monitor_data['user'][$username]['files'];
                if (!is_numeric($sites[$i]['used'])){
                    if ($sites[$i]['used'][0] > $sites[$i]['used'][1]){
                        $sites[$i]['used'] = $sites[$i]['used'][0];
                    } else {
                        $sites[$i]['used'] = $sites[$i]['used'][1];
                    }
                }
                if (!is_numeric($sites[$i]['soft'])) $sites[$i]['soft']=$sites[$i]['soft'][1];
                if (!is_numeric($sites[$i]['hard'])) $sites[$i]['hard']=$sites[$i]['hard'][1];
                if (!is_numeric($sites[$i]['files'])) $sites[$i]['files']=$sites[$i]['files'][1];
                // colours
                $sites[$i]['display_colour'] = '#000000';
                if($sites[$i]['soft'] > 0){
                    $used_ratio = $sites[$i]['used']/$sites[$i]['soft'];
                } else {
                    $used_ratio = 0;
                }
                if($used_ratio >= 0.8) $sites[$i]['display_colour'] = '#fd934f';
                if($used_ratio >= 1) $sites[$i]['display_colour'] = '#cc0000';
                if($sites[$i]['used'] > 1024) {
                    $sites[$i]['used'] = round($sites[$i]['used'] / 1024,2).' MB';
                } else {
                    if ($sites[$i]['used'] != '') $sites[$i]['used'] .= ' KB';
                }
                if($sites[$i]['soft'] > 1024) {
                    $sites[$i]['soft'] = round($sites[$i]['soft'] / 1024,2).' MB';
                } else {
                    $sites[$i]['soft'] .= ' KB';
                }
                if($sites[$i]['hard'] > 1024) {
                    $sites[$i]['hard'] = round($sites[$i]['hard'] / 1024,2).' MB';
                } else {
                    $sites[$i]['hard'] .= ' KB';
                }
                if($sites[$i]['soft'] == " KB") $sites[$i]['soft'] = $app->lng('unlimited');
                if($sites[$i]['hard'] == " KB") $sites[$i]['hard'] = $app->lng('unlimited');
                /*
                if(!strstr($sites[$i]['used'],'M') && !strstr($sites[$i]['used'],'K')) $sites[$i]['used'].= ' B';
                if(!strstr($sites[$i]['soft'],'M') && !strstr($sites[$i]['soft'],'K')) $sites[$i]['soft'].= ' B';
                if(!strstr($sites[$i]['hard'],'M') && !strstr($sites[$i]['hard'],'K')) $sites[$i]['hard'].= ' B';
                */
                if($sites[$i]['soft'] == '0 B' || $sites[$i]['soft'] == '0 KB' || $sites[$i]['soft'] == '0') $sites[$i]['soft'] = $app->lng('unlimited');
                if($sites[$i]['hard'] == '0 B' || $sites[$i]['hard'] == '0 KB' || $sites[$i]['hard'] == '0') $sites[$i]['hard'] = $app->lng('unlimited');
            }
            $has_quota = true;
            $tpl->setloop('quota', $sites);
        }
        //print_r($sites);
        $tpl->setVar('has_quota',$has_quota);
        return $tpl->grab();
    }
}
?>
interface/web/dashboard/dashlets/templates/mailquota.htm
New file
@@ -0,0 +1,29 @@
<div style="float: left;">
    <h2>{tmpl_var name='mailquota_txt'}</h2>
    <div style="width:320px;">
    <table class="list">
        <thead>
        <tr>
          <td>{tmpl_var name='email_txt'}</td>
          <td>{tmpl_var name='name_txt'}</td>
          <td>{tmpl_var name='used_txt'}</td>
          <td>{tmpl_var name='quota_txt'}</td>
        </tr>
        </thead>
    <tmpl_if name="has_mailquota">
    <tmpl_loop name='mailquota'>
        <tr class="tbl_row_<tmpl_if name='__EVEN__'}even<tmpl_else>uneven</tmpl_if>">
          <td style="color:{tmpl_var name='display_colour'}">{tmpl_var name='email'}</td>
          <td style="color:{tmpl_var name='display_colour'}">{tmpl_var name='name'}</td>
          <td style="color:{tmpl_var name='display_colour'}">{tmpl_var name='used'}</td>
          <td style="color:{tmpl_var name='display_colour'}">{tmpl_var name='quota'}</td>
        </tr>
    </tmpl_loop>
    <tmpl_else>
    <tr>
      <td colspan="4" style="text-align:center;">{tmpl_var name='no_email_accounts_txt'}</td>
    </tr>
    </tmpl_if>
    </table>
    </div>
</div>
interface/web/dashboard/dashlets/templates/quota.htm
New file
@@ -0,0 +1,29 @@
<div style="float: left;">
    <h2>{tmpl_var name='quota_txt'}</h2>
    <div style="width:320px;">
    <table class="list">
        <thead>
        <tr>
          <td>{tmpl_var name='domain_txt'}</td>
          <td>{tmpl_var name='used_txt'}</td>
          <td>{tmpl_var name='soft_txt'}</td>
          <td>{tmpl_var name='hard_txt'}</td>
        </tr>
        </thead>
    <tmpl_if name="has_quota">
    <tmpl_loop name='quota'>
        <tr class="tbl_row_<tmpl_if name='__EVEN__'}even<tmpl_else>uneven</tmpl_if>">
          <td style="color:{tmpl_var name='display_colour'}">{tmpl_var name='domain'}</td>
          <td style="color:{tmpl_var name='display_colour'}">{tmpl_var name='used'}</td>
          <td style="color:{tmpl_var name='display_colour'}">{tmpl_var name='soft'}</td>
          <td style="color:{tmpl_var name='display_colour'}">{tmpl_var name='hard'}</td>
        </tr>
    </tmpl_loop>
    <tmpl_else>
    <tr>
      <td colspan="4" style="text-align:center;">{tmpl_var name='no_sites_txt'}</td>
    </tr>
    </tmpl_if>
    </table>
    </div>
</div>
interface/web/dashboard/lib/lang/de_dashlet_mailquota.lng
New file
@@ -0,0 +1,8 @@
<?php
$wb["mailquota_txt"] = 'Mailbox-Speicherplatz';
$wb["email_txt"] = 'E-Mail-Adresse';
$wb["name_txt"] = 'Name';
$wb["used_txt"] = 'Verwendet';
$wb["quota_txt"] = 'Verfügbar';
$wb["no_email_accounts_txt"] = 'Kein E-Mail-Konto gefunden.';
?>
interface/web/dashboard/lib/lang/de_dashlet_quota.lng
New file
@@ -0,0 +1,8 @@
<?php
$wb["quota_txt"] = 'Webseiten-Speicherplatz';
$wb["domain_txt"] = 'Domain / Webseite';
$wb["used_txt"] = 'Verwendet';
$wb["hard_txt"] = 'Hard Limit';
$wb["soft_txt"] = 'Soft Limit';
$wb["no_sites_txt"] = 'Keine Webseite gefunden.';
?>
interface/web/dashboard/lib/lang/en_dashlet_mailquota.lng
New file
@@ -0,0 +1,8 @@
<?php
$wb["mailquota_txt"] = 'Mailbox Quota';
$wb["email_txt"] = 'Email Address';
$wb["name_txt"] = 'Name';
$wb["used_txt"] = 'Used Space';
$wb["quota_txt"] = 'Quota';
$wb["no_email_accounts_txt"] = 'No email accounts found.';
?>
interface/web/dashboard/lib/lang/en_dashlet_quota.lng
New file
@@ -0,0 +1,8 @@
<?php
$wb["quota_txt"] = 'Website Harddisk Quota';
$wb["domain_txt"] = 'Domain / Website';
$wb["used_txt"] = 'Used space';
$wb["hard_txt"] = 'Hard limit';
$wb["soft_txt"] = 'Soft limit';
$wb["no_sites_txt"] = 'No web sites found.';
?>
interface/web/dashboard/templates/dashboard.htm
@@ -36,13 +36,17 @@
    <div style="float:left; width:350px;">
        <tmpl_loop name='leftcol'>
            {tmpl_var name='content'}
            <p>&nbsp;</p>
            <tmpl_if name='content'>
            <p style="clear:left">&nbsp;</p>
            </tmpl_if>
        </tmpl_loop>
    </div>
    <div style="float:left; width:350px;">
        <tmpl_loop name='rightcol'>
            {tmpl_var name='content'}
            <tmpl_if name='content'>
            <p>&nbsp;</p>
            </tmpl_if>
        </tmpl_loop>
    </div>
</div>
interface/web/dns/dns_a_list.php
@@ -16,7 +16,7 @@
$app->auth->check_module_permissions('dns');
$app->uses('listform_actions');
$app->listform_actions->SQLExtWhere = "type = 'A'";
$app->listform_actions->SQLExtWhere = "dns_rr.type = 'A'";
$app->listform_actions->onLoad();
interface/web/dns/dns_import.php
@@ -84,14 +84,14 @@
    $app->tpl->setVar("server_id",$server_id_option);
    
    // load the list of clients
    $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(client.company_name,' :: ',client.contact_name) as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id > 0 ORDER BY sys_group.name";
    $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id > 0 ORDER BY sys_group.name";
    $clients = $app->db->queryAllRecords($sql);
    $client_select = '';
    if($_SESSION["s"]["user"]["typ"] == 'admin') $client_select .= "<option value='0'></option>";
    if(is_array($clients)) {
        foreach( $clients as $client) {
            $selected = ($client["groupid"] == $sys_groupid)?'SELECTED':'';
            $client_select .= "<option value='$client[groupid]' $selected>$client[name] :: $client[contactname]</option>\r\n";
            $client_select .= "<option value='$client[groupid]' $selected>$client[contactname]</option>\r\n";
        }
    }
@@ -102,18 +102,18 @@
    
    // Get the limits of the client
    $client_group_id = $_SESSION["s"]["user"]["default_group"];
    $client = $app->db->queryOneRecord("SELECT client.client_id, client.contact_name, CONCAT(client.company_name,' :: ',client.contact_name) as contactname, sys_group.name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
    $client = $app->db->queryOneRecord("SELECT client.client_id, client.contact_name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname, sys_group.name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
    
    // load the list of clients
    $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(client.company_name,' :: ',client.contact_name) as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id'];
    $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id'];
    $clients = $app->db->queryAllRecords($sql);
    $tmp = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ".$client['client_id']);
    $client_select = '<option value="'.$tmp['groupid'].'">'.$client['name'].' :: '.$client['contactname'].'</option>';
    $client_select = '<option value="'.$tmp['groupid'].'">'.$client['contactname'].'</option>';
    if(is_array($clients)) {
        foreach( $clients as $client) {
            $selected = ($client["groupid"] == $sys_groupid)?'SELECTED':'';
            $client_select .= "<option value='$client[groupid]' $selected>$client[name] :: $client[contactname]</option>\r\n";
            $client_select .= "<option value='$client[groupid]' $selected>$client[contactname]</option>\r\n";
        }
    }
interface/web/dns/dns_slave_edit.php
@@ -72,7 +72,7 @@
        // If user is admin, we will allow him to select to whom this record belongs
        if($_SESSION["s"]["user"]["typ"] == 'admin') {
            // Getting Domains of the user
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(client.company_name,' :: ',client.contact_name) as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id > 0 ORDER BY sys_group.name";
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id > 0 ORDER BY sys_group.name";
            $clients = $app->db->queryAllRecords($sql);
            $client_select = '';
            if($_SESSION["s"]["user"]["typ"] == 'admin') $client_select .= "<option value='0'></option>";
@@ -80,7 +80,7 @@
            if(is_array($clients)) {
                foreach( $clients as $client) {
                    $selected = @(is_array($this->dataRecord) && ($client["groupid"] == $this->dataRecord['client_group_id'] || $client["groupid"] == $this->dataRecord['sys_groupid']))?'SELECTED':'';
                    $client_select .= "<option value='$client[groupid]' $selected>$client[name] :: $client[contactname]</option>\r\n";
                    $client_select .= "<option value='$client[groupid]' $selected>$client[contactname]</option>\r\n";
                }
            }
        $app->tpl->setVar("client_group_id",$client_select);
@@ -88,18 +88,18 @@
        
            // Get the limits of the client
            $client_group_id = $_SESSION["s"]["user"]["default_group"];
            $client = $app->db->queryOneRecord("SELECT client.client_id, sys_group.name, client.contact_name, CONCAT(client.company_name,' :: ',client.contact_name) as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
            $client = $app->db->queryOneRecord("SELECT client.client_id, sys_group.name, client.contact_name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
            
            // Fill the client select field
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(client.company_name,' :: ',client.contact_name) as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id']." ORDER BY sys_group.name";
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id']." ORDER BY sys_group.name";
            $clients = $app->db->queryAllRecords($sql);
            $tmp = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ".$client['client_id']);
            $client_select = '<option value="'.$tmp['groupid'].'">'.$client['name'].' :: '.$client['contactname'].'</option>';
            $client_select = '<option value="'.$tmp['groupid'].'">'.$client['contactname'].'</option>';
            //$tmp_data_record = $app->tform->getDataRecord($this->id);
            if(is_array($clients)) {
                foreach( $clients as $client) {
                    $selected = @(is_array($this->dataRecord) && ($client["groupid"] == $this->dataRecord['client_group_id'] || $client["groupid"] == $this->dataRecord['sys_groupid']))?'SELECTED':'';
                    $client_select .= "<option value='$client[groupid]' $selected>$client[name] :: $client[contactname]</option>\r\n";
                    $client_select .= "<option value='$client[groupid]' $selected>$client[contactname]</option>\r\n";
                }
            }
            $app->tpl->setVar("client_group_id",$client_select);
@@ -123,7 +123,7 @@
        if($_SESSION["s"]["user"]["typ"] != 'admin') {
            // Get the limits of the client
            $client_group_id = $_SESSION["s"]["user"]["default_group"];
            $client = $app->db->queryOneRecord("SELECT limit_dns_slave_zone, default_dnsserver FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
            $client = $app->db->queryOneRecord("SELECT limit_dns_slave_zone, default_slave_dnsserver FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
        
            // When the record is updated
            if($this->id > 0) {
@@ -134,7 +134,7 @@
            // When the record is inserted
            } else {
                // set the server ID to the default dnsserver of the client
                $this->dataRecord["server_id"] = $client["default_dnsserver"];
                $this->dataRecord["server_id"] = $client["default_slave_dnsserver"];
                
                // Check if the user may add anoter secondary domain.
                if(!$app->tform->checkClientLimit('limit_dns_slave_zone')) {
interface/web/dns/dns_slave_list.php
@@ -16,9 +16,9 @@
$app->auth->check_module_permissions('dns');
$app->uses('listform_actions');
// $app->listform_actions->SQLExtWhere = "access = 'REJECT'";
// $app->listform_actions->SQLExtWhere = "dns_slave.access = 'REJECT'";
$app->listform_actions->SQLOrderBy = 'ORDER BY origin';
$app->listform_actions->SQLOrderBy = 'ORDER BY dns_slave.origin';
$app->listform_actions->onLoad();
interface/web/dns/dns_soa_edit.php
@@ -82,7 +82,7 @@
        // If user is admin, we will allow him to select to whom this record belongs
        if($_SESSION["s"]["user"]["typ"] == 'admin') {
            // Getting Domains of the user
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(client.company_name,' :: ',client.contact_name) as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id > 0 ORDER BY sys_group.name";
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id > 0 ORDER BY sys_group.name";
            $clients = $app->db->queryAllRecords($sql);
            $client_select = '';
            if($_SESSION["s"]["user"]["typ"] == 'admin') $client_select .= "<option value='0'></option>";
@@ -90,7 +90,7 @@
            if(is_array($clients)) {
                foreach( $clients as $client) {
                    $selected = @(is_array($this->dataRecord) && ($client["groupid"] == $this->dataRecord['client_group_id'] || $client["groupid"] == $this->dataRecord['sys_groupid']))?'SELECTED':'';
                    $client_select .= "<option value='$client[groupid]' $selected>$client[name] :: $client[contactname]</option>\r\n";
                    $client_select .= "<option value='$client[groupid]' $selected>$client[contactname]</option>\r\n";
                }
            }
        $app->tpl->setVar("client_group_id",$client_select);
@@ -98,18 +98,18 @@
        
            // Get the limits of the client
            $client_group_id = $_SESSION["s"]["user"]["default_group"];
            $client = $app->db->queryOneRecord("SELECT client.client_id, client.contact_name, CONCAT(client.company_name,' :: ',client.contact_name) as contactname, sys_group.name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
            $client = $app->db->queryOneRecord("SELECT client.client_id, client.contact_name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname, sys_group.name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
            
            // Fill the client select field
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(client.company_name,' :: ',client.contact_name) as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id']." ORDER BY sys_group.name";
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id']." ORDER BY sys_group.name";
            $clients = $app->db->queryAllRecords($sql);
            $tmp = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ".$client['client_id']);
            $client_select = '<option value="'.$tmp['groupid'].'">'.$client['name'].' :: '.$client['contactname'].'</option>';
            $client_select = '<option value="'.$tmp['groupid'].'">'.$client['contactname'].'</option>';
            //$tmp_data_record = $app->tform->getDataRecord($this->id);
            if(is_array($clients)) {
                foreach( $clients as $client) {
                    $selected = @(is_array($this->dataRecord) && ($client["groupid"] == $this->dataRecord['client_group_id'] || $client["groupid"] == $this->dataRecord['sys_groupid']))?'SELECTED':'';
                    $client_select .= "<option value='$client[groupid]' $selected>$client[name] :: $client[contactname]</option>\r\n";
                    $client_select .= "<option value='$client[groupid]' $selected>$client[contactname]</option>\r\n";
                }
            }
            $app->tpl->setVar("client_group_id",$client_select);
@@ -172,6 +172,9 @@
        if(stristr($this->dataRecord["mbox"],'@')) {
            $this->dataRecord["mbox"] = str_replace('@','.',$this->dataRecord["mbox"]);
        }
        $this->dataRecord["xfer"] = preg_replace('/\s+/', '', $this->dataRecord["xfer"]);
        $this->dataRecord["also_notify"] = preg_replace('/\s+/', '', $this->dataRecord["also_notify"]);
        //* Check if a secondary zone with the same name already exists     
        $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_slave WHERE origin = \"".$this->dataRecord["origin"]."\" AND server_id = \"".$this->dataRecord["server_id"]."\"");
interface/web/dns/dns_soa_list.php
@@ -16,9 +16,9 @@
$app->auth->check_module_permissions('dns');
$app->uses('listform_actions');
// $app->listform_actions->SQLExtWhere = "access = 'REJECT'";
// $app->listform_actions->SQLExtWhere = "dns_soa.access = 'REJECT'";
$app->listform_actions->SQLOrderBy = 'ORDER BY origin';
$app->listform_actions->SQLOrderBy = 'ORDER BY dns_soa.origin';
$app->listform_actions->onLoad();
interface/web/dns/dns_srv_edit.php
@@ -77,18 +77,10 @@
        // Split the 3 parts of the SRV Record apart
        $split = explode(' ', $this->dataRecord['data']);
        // Weight
        $this->dataRecord['weight'] = $split[0];
        // Port
        $this->dataRecord['port'] = $split[1];
        // Target
        $this->dataRecord['target'] = $split[2];
        // Bind the new datarecord to the template
        $app->tpl->setVar($this->dataRecord);
        $app->tpl->setVar('weight', $split[0]);
        $app->tpl->setVar('port', $split[1]);
        $app->tpl->setVar('target', $split[2]);
        parent::onShowEnd();
    }
interface/web/dns/dns_template_list.php
@@ -16,9 +16,9 @@
$app->auth->check_module_permissions('dns');
$app->uses('listform_actions');
// $app->listform_actions->SQLExtWhere = "access = 'REJECT'";
// $app->listform_actions->SQLExtWhere = "dns_template.access = 'REJECT'";
$app->listform_actions->SQLOrderBy = 'ORDER BY name';
$app->listform_actions->SQLOrderBy = 'ORDER BY dns_template.name';
$app->listform_actions->onLoad();
interface/web/dns/dns_wizard.php
@@ -81,14 +81,14 @@
    $app->tpl->setVar("server_id",$server_id_option);
    
    // load the list of clients
    $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(client.company_name,' :: ',client.contact_name) as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id > 0 ORDER BY sys_group.name";
    $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id > 0 ORDER BY sys_group.name";
    $clients = $app->db->queryAllRecords($sql);
    $client_select = '';
    if($_SESSION["s"]["user"]["typ"] == 'admin') $client_select .= "<option value='0'></option>";
    if(is_array($clients)) {
        foreach( $clients as $client) {
            $selected = ($client["groupid"] == $sys_groupid)?'SELECTED':'';
            $client_select .= "<option value='$client[groupid]' $selected>$client[name] :: $client[contactname]</option>\r\n";
            $client_select .= "<option value='$client[groupid]' $selected>$client[contactname]</option>\r\n";
        }
    }
@@ -99,18 +99,18 @@
    
    // Get the limits of the client
    $client_group_id = $_SESSION["s"]["user"]["default_group"];
    $client = $app->db->queryOneRecord("SELECT client.client_id, client.contact_name, CONCAT(client.company_name,' :: ',client.contact_name) as contactname, sys_group.name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
    $client = $app->db->queryOneRecord("SELECT client.client_id, client.contact_name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname, sys_group.name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
    
    // load the list of clients
    $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(client.company_name,' :: ',client.contact_name) as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id'];
    $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id'];
    $clients = $app->db->queryAllRecords($sql);
    $tmp = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ".$client['client_id']);
    $client_select = '<option value="'.$tmp['groupid'].'">'.$client['name'].' :: '.$client['contactname'].'</option>';
    $client_select = '<option value="'.$tmp['groupid'].'">'.$client['contactname'].'</option>';
    if(is_array($clients)) {
        foreach( $clients as $client) {
            $selected = ($client["groupid"] == $sys_groupid)?'SELECTED':'';
            $client_select .= "<option value='$client[groupid]' $selected>$client[name] :: $client[contactname]</option>\r\n";
            $client_select .= "<option value='$client[groupid]' $selected>$client[contactname]</option>\r\n";
        }
    }
interface/web/help/faq_list.php
@@ -26,7 +26,7 @@
    $res = $app->db->queryOneRecord("SELECT MIN(hfs_id) AS min_id FROM help_faq_sections");
    $hf_section = $res['min_id'];
}
$app->listform_actions->SQLExtWhere = "hf_section = $hf_section";
$app->listform_actions->SQLExtWhere = "help_faq.hf_section = $hf_section";
if($hf_section) $res = $app->db->queryOneRecord("SELECT hfs_name FROM help_faq_sections WHERE hfs_id=$hf_section");
interface/web/help/form/support_message.tform.php
@@ -71,7 +71,7 @@
            'formtype'    => 'SELECT',
            'default'    => $sm_default_recipient_id,
            'datasource'    => array (     'type'            => 'SQL',
                                        'querystring'     => "SELECT sys_user.userid, CONCAT(sys_user.username,' :: ',client.company_name,' :: ',client.contact_name) as contactname FROM sys_user, client WHERE sys_user.userid != 1 AND sys_user.client_id = client.client_id AND $authsql ORDER BY sys_user.username",
                                        'querystring'     => "SELECT sys_user.userid, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_user, client WHERE sys_user.userid != 1 AND sys_user.client_id = client.client_id AND $authsql ORDER BY sys_user.username",
                                        'keyfield'        => 'userid',
                                        'valuefield'    => 'contactname'
                                     ),
interface/web/help/lib/lang/de_support_message.lng
@@ -5,4 +5,11 @@
$wb['message_txt'] = 'Nachricht';
$wb['tstamp_txt'] = 'Zeitpunkt';
$wb['reply_txt'] = 'Antworten';
$wb['date_txt'] = 'Datum';
$wb['support_request_subject_txt'] = 'Supportanfrage';
$wb['support_request_txt'] = 'Sie haben eine Supportanfrage erhalten. Bitte antworten Sie nicht auf diese Email, sondern bearbeiten Sie die Supportanfrage in ISPConfig.';
$wb['answer_to_support_request_txt'] = 'Sie haben eine Antwort auf Ihre Supportanfrage erhalten. Bitte antworten Sie nicht auf diese Email, sondern bearbeiten Sie die Nachricht in ISPConfig.';
$wb['answer_to_support_request_sent_txt'] = 'Ihre Antwort auf die Supportanfrage ist verschickt worden. Bitte antworten Sie nicht auf diese Email.';
$wb['support_request_sent_txt'] = 'Ihre Supportanfrage ist verschickt worden. Bitte antworten Sie nicht auf diese Email.';
$wb['recipient_or_sender_email_address_not_valid_txt'] = 'Die Nachricht konnte nicht verschickt werden, da die Empfänger- und/oder die Sender-Email-Adresse nicht gültig ist.';
?>
interface/web/help/lib/lang/de_support_message_list.lng
@@ -3,4 +3,5 @@
$wb['sender_id_txt'] = 'Absender';
$wb['subject_txt'] = 'Betreff';
$wb['add_new_record_txt'] = 'Neue Supportnachricht erstellen';
$wb['date_txt'] = 'Datum';
?>
interface/web/help/lib/lang/en_support_message.lng
@@ -5,4 +5,11 @@
$wb['message_txt'] = 'Message';
$wb['tstamp_txt'] = 'Timestamp';
$wb['reply_txt'] = 'Reply';
$wb['date_txt'] = 'Date';
$wb['support_request_subject_txt'] = 'Support Request';
$wb['support_request_txt'] = 'You have got a support request. Please don\'t reply to this email, but process the support request inside ISPConfig.';
$wb['answer_to_support_request_txt'] = 'You have got a reply to your support request. Please don\'t reply to this email, but process the message inside ISPConfig.';
$wb['answer_to_support_request_sent_txt'] = 'Your reply to the support request has been sent. Please don\'t reply to this email.';
$wb['support_request_sent_txt'] = 'Your support request has been sent. Please don\'t reply to this email.';
$wb['recipient_or_sender_email_address_not_valid_txt'] = 'The message could not be sent because the recipient and/or the sender email address is not valid.';
?>
interface/web/help/lib/lang/en_support_message_list.lng
@@ -3,4 +3,5 @@
$wb['sender_id_txt'] = 'Sender';
$wb['subject_txt'] = 'Subject';
$wb["add_new_record_txt"] = 'Create new support message';
$wb['date_txt'] = 'Date';
?>
interface/web/help/list/support_message.list.php
@@ -57,6 +57,15 @@
                            'suffix'    => '%',
                            'width'        => '',
                            'value'        => '');
$liste['item'][] = array(    'field'        => 'tstamp',
                            'datatype'    => 'DATETIMETSTAMP',
                            'formtype'    => 'TEXT',
                            'op'        => '=',
                            'prefix'    => '',
                            'suffix'    => '',
                            'width'        => '',
                            'value'        => '');
?>
interface/web/help/support_message_edit.php
@@ -31,6 +31,53 @@
        //* Set the sender_id field to the ID of the current user
        $this->dataRecord['sender_id'] = $_SESSION['s']['user']['userid'];
        
        //* Get recipient email address
        if($this->dataRecord['recipient_id'] > 1){
            $sql = "SELECT client.email FROM sys_user, client WHERE sys_user.userid = ".$this->dataRecord['recipient_id']." AND sys_user.client_id = client.client_id";
            $client = $app->db->queryOneRecord($sql);
            $recipient_email = $client['email'];
        } else {
            $app->uses('ini_parser,getconf');
            $system_config_mail_settings = $app->getconf->get_global_config('mail');
            $recipient_email = $system_config_mail_settings['admin_mail'];
        }
        //* Get sender email address
        if($this->dataRecord['sender_id'] > 1){
            $sql = "SELECT client.email FROM sys_user, client WHERE sys_user.userid = ".$this->dataRecord['sender_id']." AND sys_user.client_id = client.client_id";
            $client = $app->db->queryOneRecord($sql);
            $sender_email = $client['email'];
        } else {
            $app->uses('ini_parser,getconf');
            $system_config_mail_settings = $app->getconf->get_global_config('mail');
            $sender_email = $system_config_mail_settings['admin_mail'];
        }
        $email_regex = '/^(\w+[\w\.\-\+]*\w{0,}@\w+[\w.-]*\.[a-z\-]{2,10}){0,1}$/i';
        if(preg_match($email_regex, $sender_email, $match) && preg_match($email_regex, $recipient_email, $match)){
            $subject = $app->tform->lng('support_request_subject_txt').': '.$this->dataRecord['subject'];
            if($this->dataRecord['recipient_id'] == 1){
                $message = $app->tform->lng('support_request_txt');
            } else {
                $message = $app->tform->lng('answer_to_support_request_txt');
            }
            $message .= "\n\n".$app->tform->lng('message_txt').": \"".$this->dataRecord['message']."\"";
            $message .= "\n\nISPConfig: ".($_SERVER['HTTPS'] == 'on' ? 'https://' : 'http://').$_SERVER['HTTP_HOST'];
            $app->functions->mail($recipient_email, $subject, $message, $sender_email);
            //* Send confirmation email to sender
            if($this->dataRecord['sender_id'] == 1){
                $confirmation_message = $app->tform->lng('answer_to_support_request_sent_txt');
            } else {
                $confirmation_message = $app->tform->lng('support_request_sent_txt');
            }
            $confirmation_message .= "\n\n".$app->tform->lng('message_txt').": \"".$this->dataRecord['message']."\"";
            $confirmation_message .= "\n\nISPConfig: ".($_SERVER['HTTPS'] == 'on' ? 'https://' : 'http://').$_SERVER['HTTP_HOST'];
            $app->functions->mail($sender_email, $subject, $confirmation_message, $recipient_email);
        } else {
            $app->tform->errorMessage .= $app->tform->lng("recipient_or_sender_email_address_not_valid_txt")."<br />";
        }
        //* call the onSubmit function of the parent class
        parent::onSubmit();
    }
@@ -44,6 +91,17 @@
        //*  read only template  if a existing message is loaded
        if($this->id > 0) {
            $app->tform->formDef['tabs']['message']['template'] = 'templates/support_message_view.htm';
            $record = $app->db->queryOneRecord("SELECT * FROM support_message WHERE support_message_id = ".$this->id);
            if ($record['tstamp'] > 0) {
                            // is value int?
                            if (preg_match("/^[0-9]+[\.]?[0-9]*$/", $record['tstamp'], $p)) {
                                $record['tstamp'] = date($app->lng('conf_format_datetime'), $record['tstamp']);
                            } else {
                                $record['tstamp'] = date($app->lng('conf_format_datetime'), strtotime($record['tstamp']));
                            }
                        }
            $app->tpl->setVar("date", $record['tstamp']);
            //die(print_r($this->dataRecord));
        }
        
        //* call the onShow function of the parent class
interface/web/help/support_message_list.php
@@ -12,7 +12,7 @@
$app->uses('listform_actions');
//* Optional limit
$app->listform_actions->SQLExtWhere = "recipient_id = ".$_SESSION['s']['user']['userid'];
$app->listform_actions->SQLExtWhere = "support_message.recipient_id = ".$_SESSION['s']['user']['userid'];
//* Start the form rendering and action ahndling
$app->listform_actions->onLoad();
interface/web/help/templates/support_message_list.htm
@@ -20,11 +20,13 @@
                    <tr class="caption">
                        <th class="tbl_col_sender_id" scope="col"><tmpl_var name="sender_id_txt"></th>
                        <th class="tbl_col_subject" scope="col"><tmpl_var name="subject_txt"></th>
                        <th class="tbl_col_tstamp" scope="col"><tmpl_var name="date_txt"></th>
                        <th class="tbl_col_limit" scope="col">{tmpl_var name='search_limit'}</th>
                    </tr>
                    <tr class="filter">
                        <td class="tbl_col_sender_id"><select name="search_sender_id">{tmpl_var name='search_sender_id'}</select></td>
                        <td class="tbl_col_subject"><input type="text" name="search_subject" value="{tmpl_var name='search_subject'}" /></td>
                        <td class="tbl_col_tstamp">&nbsp;</td>
                        <td class="tbl_col_buttons">
                            <button type="button" class="button icons16 icoFilter" name="Filter" id="Filter" value="{tmpl_var name="filter_txt"}" onclick="submitForm('pageForm','help/support_message_list.php');"><span>{tmpl_var name="filter_txt"}</span></button>
                        </td>
@@ -35,6 +37,7 @@
                        <tr class="tbl_row_<tmpl_if name='__EVEN__'}even<tmpl_else>uneven</tmpl_if>">
                            <td class="tbl_col_sender_id"><a href="#" onclick="loadContent('help/support_message_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="sender_id"}</a></td>
                            <td class="tbl_col_subject"><a href="#" onclick="loadContent('help/support_message_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="subject"}</a></td>
                            <td class="tbl_col_tstamp"><a href="#" onclick="loadContent('help/support_message_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="tstamp"}</a></td>
                            <td class="tbl_col_buttons">
                                <a class="button icons16 icoDelete" href="javascript: del_record('help/support_message_del.php?id={tmpl_var name='id'}&phpsessid={tmpl_var name='phpsessid'}','{tmpl_var name='delete_confirmation'}');"><span>{tmpl_var name='delete_txt'}</span></a>
                            </td>
@@ -42,13 +45,13 @@
                    </tmpl_loop>
                    <tmpl_unless name="records">
                        <tr class="tbl_row_noresults tbl_row_<tmpl_if name='__EVEN__'}even<tmpl_else>uneven</tmpl_if>">
                            <td colspan="3">{tmpl_var name='globalsearch_noresults_text_txt'}</td>
                            <td colspan="4">{tmpl_var name='globalsearch_noresults_text_txt'}</td>
                        </tr>
                    </tmpl_unless>
                </tbody>
                <tfoot>
                    <tr>
                        <td class="tbl_footer tbl_paging" colspan="3"><tmpl_var name="paging"></td>
                        <td class="tbl_footer tbl_paging" colspan="4"><tmpl_var name="paging"></td>
                    </tr>
                </tfoot>
            </table>
interface/web/help/templates/support_message_view.htm
@@ -13,6 +13,10 @@
                <label for="message">{tmpl_var name='message_txt'}</label>
                <p>{tmpl_var name='message'}</p>
            </div>
            <div class="ctrlHolder">
                <label for="message">{tmpl_var name='date_txt'}</label>
                <p>{tmpl_var name='date'}</p>
            </div>
        </fieldset>
        <div class="buttonHolder buttons">
            <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='reply_txt'}" onclick="loadContent('help/support_message_edit.php?reply={tmpl_var name='id'}');"><span>{tmpl_var name='reply_txt'}</span></button>
interface/web/js/jquery.tipsy.js
@@ -371,20 +371,21 @@
                    internal = false;
                    return;
                }
                var matcher = new RegExp( "" + $.ui.autocomplete.escapeRegex( $(this).val() ) + "", "i" ),
                    matchtext = $(this).val();
                var matchtext = $(this).val().toLowerCase();
                    valid = false,
                    selected = false;
                    selected = false,
                    selected_val = "";
                select.children( "option" ).each(function() {
                    if( (($(this).val() == "" && matchtext == "") || $( this ).text().match( matcher )) && $(this).css('display') != 'none' ) {
                    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($(this).val()).autocomplete('option','select').call(input, (e ? e : {target: select}), { item: { option: selected.get(0), internal: true } });
                input.val(selected_val).autocomplete('option','select').call(input, (e ? e : {target: select}), { item: { option: selected.get(0), internal: true } });
            });
            $( "<a>" )
interface/web/js/scrigo.js.php
@@ -1,6 +1,7 @@
<?php
    session_start();
    include('../../lib/config.inc.php');
    header('Content-Type: text/javascript; charset=utf-8'); // the config file sets the content type header so we have to override it here!
    require_once('../../lib/app.inc.php');
    $lang = (isset($_SESSION['s']['language']) && $_SESSION['s']['language'] != '')?$_SESSION['s']['language']:'en';
    include_once(ISPC_ROOT_PATH.'/web/strengthmeter/lib/lang/'.$lang.'_strengthmeter.lng');
interface/web/login/lib/lang/de.lng
@@ -21,4 +21,5 @@
$wb['email_txt'] = 'E-Mail';
$wb['error_maintenance_mode'] = 'Diese ISPConfig Installation wird gerade gewartet. Wir sind in Kürze wieder für Sie da. Vielen Dank für Ihre Geduld.';
$wb['theme_not_compatible'] = 'Das gewählte Design ist mit dieser ISPConfig Version nicht kompatibel. Bitte prüfen Sie, ob ein Update des Themes verfügbar ist.<br />Es wurde nun automatisch das Standard Design aktiviert.';
$wb['back_txt'] = 'Zur&uuml;ck';
?>
interface/web/login/lib/lang/en.lng
@@ -22,6 +22,7 @@
$wb['pw_reset_txt']    = "Password reset";
$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.';
interface/web/login/templates/index.htm
@@ -26,7 +26,8 @@
        <input type="hidden" name="s_pg" value="index" />
        <div class="buttonHolder buttons">
            <button class="positive iconstxt icoKey" type="button" value="{tmpl_var name="add_new_record_txt"}" onclick="submitLoginForm('pageForm');"><span>{tmpl_var name='login_button_txt'}</span></button>
            <button class="positive iconstxt icoKey" type="button" value="{tmpl_var name='add_new_record_txt'}" onclick="submitLoginForm('pageForm');"><span>{tmpl_var name='login_button_txt'}</span></button>
            <button class="negative iconstxt icoKey" type="button" value="{tmpl_var name='pw_lost_txt'}" onclick="loadContent('login/password_reset.php');"><span>{tmpl_var name='pw_lost_txt'}</span></button>
        </div>
    </div>
interface/web/login/templates/password_reset.htm
@@ -26,7 +26,9 @@
        <input type="hidden" name="s_pg" value="index" />
        <div class="buttonHolder buttons">
            <button class="positive" type="button" value="{tmpl_var name="add_new_record_txt"}" onclick="submitForm('pageForm','login/password_reset.php');"><span>{tmpl_var name='pw_button_txt'}</span></button>
            <button class="positive" type="button" value="{tmpl_var name='pw_button_txt'}" onclick="submitForm('pageForm','login/password_reset.php');"><span>{tmpl_var name='pw_button_txt'}</span></button>
            <button class="negative" type="button" value="{tmpl_var name='back_txt'}" onclick="loadInitContent();"><span>{tmpl_var name='back_txt'}</span></button>
        </div>
    </div>
  
interface/web/mail/lib/lang/de_spamfilter_policy.lng
@@ -16,7 +16,7 @@
$wb['spam_tag_level_txt'] = 'SPAM Markierungslevel';
$wb['spam_tag2_level_txt'] = 'SPAM Markierungslevel 2';
$wb['spam_kill_level_txt'] = 'SPAM Markierungslevel Kill';
$wb['spam_dsn_cutoff_level_txt'] = 'SPAM Markierungslevel DNS Cutoff';
$wb['spam_dsn_cutoff_level_txt'] = 'SPAM Markierungslevel DSN Cutoff';
$wb['spam_quarantine_cutoff_level_txt'] = 'SPAM Markierungslevel Quarantine Cutoff';
$wb['spam_modifies_subj_txt'] = 'SPAM Ã¤ndert Betreff';
$wb['spam_subject_tag_txt'] = 'SPAM Betreff Markierung';
interface/web/mail/lib/lang/de_spamfilter_users.lng
@@ -5,4 +5,6 @@
$wb['email_txt'] = 'E-Mail (Zeichenkette)';
$wb['fullname_txt'] = 'Name';
$wb['local_txt'] = 'Lokal';
$wb['email_error_notempty'] = 'Die E-Mail-Adresse darf nicht leer sein.';
$wb['fullname_error_notempty'] = 'Der Name darf nicht leer sein.';
?>
interface/web/mail/lib/lang/de_user_quota_stats_list.lng
@@ -4,4 +4,5 @@
$wb['name_txt'] = 'Name';
$wb['email_txt'] = 'E-Mail Adresse';
$wb['used_txt'] = 'Verbrauchter Speicherplatz';
$wb['percentage_txt'] = 'Verbraucht in %';
?>
interface/web/mail/lib/lang/en_spamfilter_users.lng
@@ -5,4 +5,6 @@
$wb["email_txt"] = 'Email (Pattern)';
$wb["fullname_txt"] = 'Name';
$wb["local_txt"] = 'Local';
$wb['email_error_notempty'] = 'The email address must not be empty.';
$wb['fullname_error_notempty'] = 'The name must not be empty.';
?>
interface/web/mail/lib/lang/en_user_quota_stats_list.lng
@@ -4,4 +4,5 @@
$wb["name_txt"] = 'Name';
$wb["email_txt"] = 'Email Address';
$wb["used_txt"] = 'Used space';
$wb["percentage_txt"] = 'Used %';
?>
interface/web/mail/list/user_quota_stats.list.php
@@ -40,6 +40,8 @@
// Enable auth
$liste["auth"]                = "yes";
// mark columns for php sorting (no real mySQL columns)
$liste["phpsort"] = array('used_sort', 'percentage_sort');
/*****************************************************
* Suchfelder
interface/web/mail/mail_alias_list.php
@@ -18,7 +18,7 @@
$app->uses('listform_actions');
// Limit the results to alias domains
$app->listform_actions->SQLExtWhere = "type = 'alias'";
$app->listform_actions->SQLExtWhere = "mail_forwarding.type = 'alias'";
$app->listform_actions->onLoad();
interface/web/mail/mail_aliasdomain_list.php
@@ -18,7 +18,7 @@
$app->uses('listform_actions');
// Limit the results to alias domains
$app->listform_actions->SQLExtWhere = "type = 'aliasdomain'";
$app->listform_actions->SQLExtWhere = "mail_forwarding.type = 'aliasdomain'";
$app->listform_actions->onLoad();
interface/web/mail/mail_blacklist_list.php
@@ -16,7 +16,7 @@
$app->auth->check_module_permissions('mail');
$app->uses('listform_actions');
$app->listform_actions->SQLExtWhere = "access = 'REJECT'";
$app->listform_actions->SQLExtWhere = "mail_access.access = 'REJECT'";
$app->listform_actions->onLoad();
interface/web/mail/mail_domain_catchall_list.php
@@ -18,7 +18,7 @@
$app->uses('listform_actions');
// Limit the results to alias domains
$app->listform_actions->SQLExtWhere = "type = 'catchall'";
$app->listform_actions->SQLExtWhere = "mail_forwarding.type = 'catchall'";
$app->listform_actions->onLoad();
interface/web/mail/mail_domain_edit.php
@@ -71,7 +71,7 @@
        if($_SESSION["s"]["user"]["typ"] == 'admin') {
            // Getting Clients of the user
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(client.company_name,' :: ',client.contact_name) as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id > 0 ORDER BY sys_group.name";
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id > 0 ORDER BY sys_group.name";
            
            $clients = $app->db->queryAllRecords($sql);
            $client_select = '';
@@ -80,7 +80,7 @@
            if(is_array($clients)) {
                foreach( $clients as $client) {
                    $selected = @(is_array($this->dataRecord) && ($client["groupid"] == $this->dataRecord['client_group_id'] || $client["groupid"] == $this->dataRecord['sys_groupid']))?'SELECTED':'';
                    $client_select .= "<option value='$client[groupid]' $selected>$client[name] :: $client[contactname]</option>\r\n";
                    $client_select .= "<option value='$client[groupid]' $selected>$client[contactname]</option>\r\n";
                }
            }
            $app->tpl->setVar("client_group_id",$client_select);
@@ -89,7 +89,7 @@
            // Get the limits of the client
            $client_group_id = $_SESSION["s"]["user"]["default_group"];
            $client = $app->db->queryOneRecord("SELECT client.client_id, client.contact_name, client.default_mailserver, CONCAT(client.company_name,' :: ',client.contact_name) as contactname, sys_group.name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id order by client.contact_name");
            $client = $app->db->queryOneRecord("SELECT client.client_id, client.contact_name, client.default_mailserver, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname, sys_group.name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id order by client.contact_name");
            // Set the mailserver to the default server of the client
            $tmp = $app->db->queryOneRecord("SELECT server_name FROM server WHERE server_id = $client[default_mailserver]");
@@ -97,15 +97,15 @@
            unset($tmp);
            // Fill the client select field
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(client.company_name,' :: ',client.contact_name) as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id']." ORDER BY sys_group.name";
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id']." ORDER BY sys_group.name";
            $clients = $app->db->queryAllRecords($sql);
            $tmp = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ".$client['client_id']);
            $client_select = '<option value="'.$tmp['groupid'].'">'.$client['name'].' :: '.$client['contactname'].'</option>';
            $client_select = '<option value="'.$tmp['groupid'].'">'.$client['contactname'].'</option>';
            //$tmp_data_record = $app->tform->getDataRecord($this->id);
            if(is_array($clients)) {
                foreach( $clients as $client) {
                    $selected = @(is_array($this->dataRecord) && ($client["groupid"] == $this->dataRecord['client_group_id'] || $client["groupid"] == $this->dataRecord['sys_groupid']))?'SELECTED':'';
                    $client_select .= "<option value='$client[groupid]' $selected>$client[name] :: $client[contactname]</option>\r\n";
                    $client_select .= "<option value='$client[groupid]' $selected>$client[contactname]</option>\r\n";
                }
            }
            $app->tpl->setVar("client_group_id",$client_select);
interface/web/mail/mail_domain_list.php
@@ -21,7 +21,7 @@
// Limit the results to alias domains
// $app->listform_actions->SQLExtWhere = "type = 'local'";
$app->listform_actions->SQLOrderBy = 'ORDER BY domain';
$app->listform_actions->SQLOrderBy = 'ORDER BY mail_domain.domain';
$app->listform_actions->onLoad();
interface/web/mail/mail_forward_list.php
@@ -18,7 +18,7 @@
$app->uses('listform_actions');
// Limit the results to alias domains
$app->listform_actions->SQLExtWhere = "type = 'forward'";
$app->listform_actions->SQLExtWhere = "mail_forwarding.type = 'forward'";
$app->listform_actions->onLoad();
interface/web/mail/mail_mailinglist_edit.php
@@ -72,7 +72,7 @@
        
        if($_SESSION["s"]["user"]["typ"] == 'admin') {
            // Getting Clients of the user
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(client.company_name,' :: ',client.contact_name) as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id > 0 ORDER BY sys_group.name";
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id > 0 ORDER BY sys_group.name";
            $clients = $app->db->queryAllRecords($sql);
            $client_select = '';
            if($_SESSION["s"]["user"]["typ"] == 'admin') $client_select .= "<option value='0'></option>";
@@ -80,7 +80,7 @@
            if(is_array($clients)) {
                foreach( $clients as $client) {
                    $selected = ($client["groupid"] == $tmp_data_record["sys_groupid"])?'SELECTED':'';
                    $client_select .= "<option value='$client[groupid]' $selected>$client[name] :: $client[contactname]</option>\r\n";
                    $client_select .= "<option value='$client[groupid]' $selected>$client[contactname]</option>\r\n";
                }
            }
            $app->tpl->setVar("client_group_id",$client_select);
@@ -89,18 +89,18 @@
            // Get the limits of the client
            $client_group_id = $_SESSION["s"]["user"]["default_group"];
            $client = $app->db->queryOneRecord("SELECT client.client_id, client.contact_name, client.default_mailserver, CONCAT(client.company_name,' :: ',client.contact_name) as contactname, sys_group.name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id order by contact_name");
            $client = $app->db->queryOneRecord("SELECT client.client_id, client.contact_name, client.default_mailserver, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname, sys_group.name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id order by contact_name");
            // Fill the client select field
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(client.company_name,' :: ',client.contact_name) as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id']." ORDER BY sys_group.name";
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id']." ORDER BY sys_group.name";
            $clients = $app->db->queryAllRecords($sql);
            $tmp = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ".$client['client_id']);
            $client_select = '<option value="'.$tmp['groupid'].'">'.$client['name'].' :: '.$client['contactname'].'</option>';
            $client_select = '<option value="'.$tmp['groupid'].'">'.$client['contactname'].'</option>';
            $tmp_data_record = $app->tform->getDataRecord($this->id);
            if(is_array($clients)) {
                foreach( $clients as $client) {
                    $selected = @($client["groupid"] == $tmp_data_record["sys_groupid"])?'SELECTED':'';
                    $client_select .= "<option value='$client[groupid]' $selected>$client[name] :: $client[contactname]</option>\r\n";
                    $client_select .= "<option value='$client[groupid]' $selected>$client[contactname]</option>\r\n";
                }
            }
            $app->tpl->setVar("client_group_id",$client_select);
interface/web/mail/mail_user_list.php
@@ -44,7 +44,7 @@
}
$list = new list_action;
$list->SQLOrderBy = 'ORDER BY email';
$list->SQLOrderBy = 'ORDER BY mail_user.email';
$list->onLoad();
interface/web/mail/mail_user_stats.php
@@ -54,6 +54,86 @@
        $rec['id'] = $rec[$this->idx_key];
        return $rec;
    }
    function getQueryString() {
        global $app;
        $sql_where = '';
        //* Generate the search sql
        if($app->listform->listDef['auth'] != 'no') {
            if($_SESSION['s']['user']['typ'] == "admin") {
                $sql_where = '';
            } else {
                $sql_where = $app->tform->getAuthSQL('r', $app->listform->listDef['table']).' and';
                //$sql_where = $app->tform->getAuthSQL('r').' and';
            }
        }
        if($this->SQLExtWhere != '') {
            $sql_where .= ' '.$this->SQLExtWhere.' and';
        }
        $sql_where = $app->listform->getSearchSQL($sql_where);
        if($app->listform->listDef['join_sql']) $sql_where .= ' AND '.$app->listform->listDef['join_sql'];
        $app->tpl->setVar($app->listform->searchValues);
        $order_by_sql = $this->SQLOrderBy;
        //* Generate SQL for paging
        $limit_sql = $app->listform->getPagingSQL($sql_where);
        $app->tpl->setVar('paging',$app->listform->pagingHTML);
        $extselect = '';
        $join = '';
        if(!empty($_SESSION['search'][$_SESSION['s']['module']['name'].$app->listform->listDef["name"].$app->listform->listDef['table']]['order'])){
          $order = str_replace(' DESC','',$_SESSION['search'][$_SESSION['s']['module']['name'].$app->listform->listDef["name"].$app->listform->listDef['table']]['order']);
          list($tmp_table, $order) = explode('.', $order);
          if($order == 'mail_traffic_last_month'){
            $tmp_date = date('Y-m',mktime(0, 0, 0, date("m")-1, date("d"), date("Y")));
            $join .= ' INNER JOIN mail_traffic as mt ON '.$app->listform->listDef['table'].'.mailuser_id = mt.mailuser_id ';
            $sql_where .= " AND mt.month like '$tmp_date%'";
            $order_by_sql = str_replace($app->listform->listDef['table'].'.mail_traffic_last_month','traffic',$order_by_sql);
          } elseif($order == 'mail_traffic_this_month'){
            $tmp_date = date('Y-m');
            $join .= ' INNER JOIN mail_traffic as mt ON '.$app->listform->listDef['table'].'.mailuser_id = mt.mailuser_id ';
            $sql_where .= " AND mt.month like '$tmp_date%'";
            $order_by_sql = str_replace($app->listform->listDef['table'].'.mail_traffic_this_month','traffic',$order_by_sql);
          } elseif($order == 'mail_traffic_last_year'){
            $tmp_date = date('Y',mktime(0, 0, 0, date("m")-1, date("d"), date("Y")));
            $extselect .= ', SUM(mt.traffic) as calctraffic';
            $join .= ' INNER JOIN mail_traffic as mt ON '.$app->listform->listDef['table'].'.mailuser_id = mt.mailuser_id ';
            $sql_where .= " AND mt.month like '$tmp_date%'";;
            $order_by_sql = str_replace($app->listform->listDef['table'].'.mail_traffic_last_year','calctraffic',$order_by_sql);
            $order_by_sql = "GROUP BY mailuser_id ".$order_by_sql;
          } elseif($order == 'mail_traffic_this_year'){
            $tmp_date = date('Y');
            $extselect .= ', SUM(mt.traffic) as calctraffic';
            $join .= ' INNER JOIN mail_traffic as mt ON '.$app->listform->listDef['table'].'.mailuser_id = mt.mailuser_id ';
            $sql_where .= " AND mt.month like '$tmp_date%'";
            $order_by_sql = str_replace($app->listform->listDef['table'].'.mail_traffic_this_year','calctraffic',$order_by_sql);
            $order_by_sql = "GROUP BY mailuser_id ".$order_by_sql;
          }
        }
        if($this->SQLExtSelect != '') {
            if(substr($this->SQLExtSelect,0,1) != ',') $this->SQLExtSelect = ','.$this->SQLExtSelect;
            $extselect .= $this->SQLExtSelect;
        }
        $table_selects = array();
        $table_selects[] = trim($app->listform->listDef['table']).'.*';
        $app->listform->listDef['additional_tables'] = trim($app->listform->listDef['additional_tables']);
        if($app->listform->listDef['additional_tables'] != ''){
            $additional_tables = explode(',', $app->listform->listDef['additional_tables']);
            foreach($additional_tables as $additional_table){
                $table_selects[] = trim($additional_table).'.*';
            }
        }
        $select = implode(', ', $table_selects);
        $sql = 'SELECT '.$select.$extselect.' FROM '.$app->listform->listDef['table'].($app->listform->listDef['additional_tables'] != ''? ','.$app->listform->listDef['additional_tables'] : '')."$join WHERE $sql_where $order_by_sql $limit_sql";
        return $sql;
    }
}
$list = new list_action;
interface/web/mail/mail_whitelist_list.php
@@ -16,7 +16,7 @@
$app->auth->check_module_permissions('mail');
$app->uses('listform_actions');
$app->listform_actions->SQLExtWhere = "access = 'OK'";
$app->listform_actions->SQLExtWhere = "mail_access.access = 'OK'";
$app->listform_actions->onLoad();
interface/web/mail/spamfilter_blacklist_list.php
@@ -16,7 +16,7 @@
$app->auth->check_module_permissions('mail');
$app->uses('listform_actions');
$app->listform_actions->SQLExtWhere = "wb = 'B'";
$app->listform_actions->SQLExtWhere = "spamfilter_wblist.wb = 'B'";
$app->listform_actions->onLoad();
interface/web/mail/spamfilter_whitelist_list.php
@@ -16,7 +16,7 @@
$app->auth->check_module_permissions('mail');
$app->uses('listform_actions');
$app->listform_actions->SQLExtWhere = "wb = 'W'";
$app->listform_actions->SQLExtWhere = "spamfilter_wblist.wb = 'W'";
$app->listform_actions->onLoad();
interface/web/mail/templates/user_quota_stats_list.htm
@@ -1,51 +1,54 @@
<h2><tmpl_var name="list_head_txt"></h2>
<div class="panel panel_list_user_quota_stats">
    <div class="pnl_listarea">
        <fieldset><legend><tmpl_var name="list_head_txt"></legend>
            <table class="list">
                <thead>
                    <tr class="caption">
                        <th class="tbl_col_email" scope="col"><tmpl_var name="email_txt"></th>
                        <th class="tbl_col_name" scope="col"><tmpl_var name="name_txt"></th>
                        <th class="tbl_col_used tbl_col_nosort" scope="col"><tmpl_var name="used_txt"></th>
                        <th class="tbl_col_quota" scope="col"><tmpl_var name="quota_txt"></th>
                        <th class="tbl_col_limit" scope="col">{tmpl_var name='search_limit'}</th>
                    </tr>
                    <tr class="filter">
                        <td class="tbl_col_email"><input type="text" name="search_email" value="{tmpl_var name='search_email'}" /></td>
                        <td class="tbl_col_name"><input type="text" name="search_system_user" value="{tmpl_var name='search_name'}" /></td>
                        <td class="tbl_col_used">&nbsp;</td>
                        <td class="tbl_col_quota">&nbsp;</td>
                        <td class="tbl_col_buttons">
                            <button type="button" class="button icons16 icoFilter" name="Filter" id="Filter" value="{tmpl_var name="filter_txt"}" onclick="submitForm('pageForm','mail/user_quota_stats.php');"><span>{tmpl_var name="filter_txt"}</span></button>
                        </td>
                    </tr>
                </thead>
                <tbody>
                    <tmpl_loop name="records">
                        <tr class="tbl_row_<tmpl_if name='__EVEN__'}even<tmpl_else>uneven</tmpl_if>">
                            <td class="tbl_col_email"><a href="#" onclick="loadContent('mail/mail_user_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="email"}</a></td>
                            <td class="tbl_col_name"><a href="#" onclick="loadContent('mail/mail_user_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="name"}</a></td>
                            <td class="tbl_col_used"><a href="#" onclick="loadContent('mail/mail_user_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="used"}</a></td>
                            <td class="tbl_col_quota"><a href="#" onclick="loadContent('mail/mail_user_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="quota"}</a></td>
                            <td class="tbl_col_buttons"></td>
                        </tr>
                    </tmpl_loop>
                    <tmpl_unless name="records">
                        <tr class="tbl_row_noresults tbl_row_<tmpl_if name='__EVEN__'}even<tmpl_else>uneven</tmpl_if>">
                            <td colspan="5">{tmpl_var name='globalsearch_noresults_text_txt'}</td>
                        </tr>
                    </tmpl_unless>
                </tbody>
                <tfoot>
                    <tr>
                        <td class="tbl_footer tbl_paging" colspan="5"><tmpl_var name="paging"></td>
                    </tr>
                </tfoot>
            </table>
        </fieldset>
    </div>
</div>
<h2><tmpl_var name="list_head_txt"></h2>
<div class="panel panel_list_user_quota_stats">
    <div class="pnl_listarea">
        <fieldset><legend><tmpl_var name="list_head_txt"></legend>
            <table class="list">
                <thead>
                    <tr class="caption">
                        <th class="tbl_col_email" scope="col"><tmpl_var name="email_txt"></th>
                        <th class="tbl_col_name" scope="col"><tmpl_var name="name_txt"></th>
                        <th class="tbl_col_used_sort" scope="col"><tmpl_var name="used_txt"></th>
                        <th class="tbl_col_quota" scope="col"><tmpl_var name="quota_txt"></th>
                        <th class="tbl_col_percentage_sort" scope="col"><tmpl_var name="percentage_txt"></th>
                        <th class="tbl_col_limit" scope="col">{tmpl_var name='search_limit'}</th>
                    </tr>
                    <tr class="filter">
                        <td class="tbl_col_email"><input type="text" name="search_email" value="{tmpl_var name='search_email'}" /></td>
                        <td class="tbl_col_name"><input type="text" name="search_system_user" value="{tmpl_var name='search_name'}" /></td>
                        <td class="tbl_col_used">&nbsp;</td>
                        <td class="tbl_col_quota">&nbsp;</td>
                        <td class="tbl_col_percentage">&nbsp;</td>
                        <td class="tbl_col_buttons">
                            <button type="button" class="button icons16 icoFilter" name="Filter" id="Filter" value="{tmpl_var name="filter_txt"}" onclick="submitForm('pageForm','mail/user_quota_stats.php');"><span>{tmpl_var name="filter_txt"}</span></button>
                        </td>
                    </tr>
                </thead>
                <tbody>
                    <tmpl_loop name="records">
                        <tr class="tbl_row_<tmpl_if name='__EVEN__'}even<tmpl_else>uneven</tmpl_if>">
                            <td class="tbl_col_email"><a href="#" onclick="loadContent('mail/mail_user_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="email"}</a></td>
                            <td class="tbl_col_name"><a href="#" onclick="loadContent('mail/mail_user_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="name"}</a></td>
                            <td class="tbl_col_used"><a href="#" onclick="loadContent('mail/mail_user_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="used"}</a></td>
                            <td class="tbl_col_quota"><a href="#" onclick="loadContent('mail/mail_user_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="quota"}</a></td>
                            <td class="tbl_col_percentage"><a href="#" onclick="loadContent('mail/mail_user_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="percentage"}</a></td>
                            <td class="tbl_col_buttons"></td>
                        </tr>
                    </tmpl_loop>
                    <tmpl_unless name="records">
                        <tr class="tbl_row_noresults tbl_row_<tmpl_if name='__EVEN__'}even<tmpl_else>uneven</tmpl_if>">
                            <td colspan="6">{tmpl_var name='globalsearch_noresults_text_txt'}</td>
                        </tr>
                    </tmpl_unless>
                </tbody>
                <tfoot>
                    <tr>
                        <td class="tbl_footer tbl_paging" colspan="6"><tmpl_var name="paging"></td>
                    </tr>
                </tfoot>
            </table>
        </fieldset>
    </div>
</div>
interface/web/mail/user_quota_stats.php
@@ -50,16 +50,24 @@
        $rec['used'] = isset($monitor_data[$email]['used']) ? $monitor_data[$email]['used'] : array(1 => 0);
        
        if (!is_numeric($rec['used'])) $rec['used']=$rec['used'][1];
        $rec['quota'] = round($rec['quota'] / 1048576,2).' MB';
        if($rec['quota'] == "0 MB") $rec['quota'] = $app->lng('unlimited');
        if($rec['quota'] == 0){
            $rec['quota'] = $app->lng('unlimited');
            $rec['percentage'] = '';
            $rec['percentage_sort'] = 0;
        } else {
            $rec['percentage'] = round(100 * $rec['used'] / $rec['quota']) . '%';
            $rec['percentage_sort'] = round(100 * $rec['used'] / $rec['quota']);
            $rec['quota'] = round($rec['quota'] / 1048576,4).' MB';
        }
        $rec['used_sort'] = $rec['used'];
        if($rec['used'] < 1544000) {
            $rec['used'] = round($rec['used'] / 1024,2).' KB';
            $rec['used'] = round($rec['used'] / 1024,4).' KB';
        } else {
            $rec['used'] = round($rec['used'] / 1048576,2).' MB';
        }
            $rec['used'] = round($rec['used'] / 1048576,4).' MB';
        }
        //* The variable "id" contains always the index variable
        $rec['id'] = $rec[$this->idx_key];
interface/web/mail/webmailer.php
@@ -55,14 +55,21 @@
$global_config = $app->getconf->get_global_config('mail');
if($global_config['webmail_url'] != '') {
    header('Location:' . $global_config['webmail_url']);
    $webmail_url = $global_config['webmail_url'];
    $webmail_url = str_replace('[SERVERNAME]', $serverData['server_name'], $webmail_url);
    header('Location:' . $webmail_url);
} else {
/*
 * We only redirect to the login-form, so there is no need, to check any rights
 */
    isset($_SERVER['HTTPS'])? $http = 'https' : $http = 'http';
    header('Location:' . $http . '://' . $serverData['server_name'] . '/webmail');
    if($web_config['server_type'] == 'nginx') {
        header('Location: http://' . $serverData['server_name'] . ':8081/webmail');
    } else {
        header('Location: ' . $http . '://' . $serverData['server_name'] . '/webmail');
    }
    isset($_SERVER['HTTPS'])? $http = 'https' : $http = 'http';
}
exit;
?>
interface/web/mailuser/mail_user_autoresponder_edit.php
@@ -81,6 +81,12 @@
            $app->tpl->setVar("ar_active", '');
        }
        
        if($this->dataRecord['autoresponder_subject'] == '') {
            $app->tpl->setVar('autoresponder_subject', $app->tform->lng('autoresponder_subject'));
        } else {
            $app->tpl->setVar('autoresponder_subject', $this->dataRecord['autoresponder_subject']);
        }
        parent::onShowEnd();
    }
    
interface/web/mailuser/mail_user_filter_list.php
@@ -24,7 +24,7 @@
$list = new list_action;
$list->SQLExtWhere = "mailuser_id = ".$_SESSION['s']['user']['mailuser_id'];
$list->SQLExtWhere = "mail_user_filter.mailuser_id = ".$_SESSION['s']['user']['mailuser_id'];
$list->onLoad();
interface/web/monitor/datalog_list.php
@@ -50,13 +50,13 @@
$sql = '(';
foreach($servers as $sv) {
    $sql .= " (datalog_id > ".$sv['updated']." AND sys_datalog.server_id = ".$sv['server_id'].") OR ";
    $sql .= " (sys_datalog.datalog_id > ".$sv['updated']." AND sys_datalog.server_id = ".$sv['server_id'].") OR ";
}
$sql = substr($sql,0,-4);
$sql .= ')';
$app->listform_actions->SQLExtWhere = $sql;
$app->listform_actions->SQLOrderBy = "ORDER BY tstamp DESC, datalog_id DESC";
$app->listform_actions->SQLOrderBy = "ORDER BY sys_datalog.tstamp DESC, sys_datalog.datalog_id DESC";
$app->listform_actions->onLoad();
interface/web/monitor/lib/lang/de.lng
@@ -146,4 +146,10 @@
$wb['Show fail2ban-Log'] = 'Fail2ban Protokoll anzeigen';
$wb['Show IPTables'] = 'IPTables anzeigen';
$wb['Show OpenVz VE BeanCounter'] = 'OpenVz VE BeanCounter anzeigen';
$wb['Show Monit'] = 'Monit anzeigen';
$wb['no_monit_url_defined_txt'] = 'Keine Monit-URL definiert.';
$wb['no_permissions_to_view_monit_txt'] = 'Sie haben nicht die Berechtigung, auf Monit zuzugreifen.';
$wb['Show Munin'] = 'Munin anzeigen';
$wb['no_munin_url_defined_txt'] = 'Keine Munin-URL definiert.';
$wb['no_permissions_to_view_munin_txt'] = 'Sie haben nicht die Berechtigung, auf Munin zuzugreifen.';
?>
interface/web/monitor/lib/lang/en.lng
@@ -146,4 +146,10 @@
$wb['monitor_title_beancounter_txt'] = 'OpenVz VE BeanCounter';
$wb['monitor_updates_nosupport_txt'] = 'Your distribution is not supported for this monitoring';
$wb['monitor_beancounter_nosupport_txt'] = 'This server is not a OpenVz VE and has no beancounter information';
$wb['Show Monit'] = 'Show Monit';
$wb['no_monit_url_defined_txt'] = 'No Monit URL defined.';
$wb['no_permissions_to_view_monit_txt'] = 'You are not allowed to access Monit.';
$wb['Show Munin'] = 'Show Munin';
$wb['no_munin_url_defined_txt'] = 'No Munin URL defined.';
$wb['no_permissions_to_view_munin_txt'] = 'You are not allowed to access Munin.';
?>
interface/web/monitor/lib/module.conf.php
@@ -115,11 +115,21 @@
                  'target'     => 'content',
                  'link'    => 'monitor/show_data.php?type=services',
                  'html_id' => 'services');
$items[] = array( 'title'     => "Show Monit",
                  'target'     => 'content',
                  'link'    => 'monitor/show_monit.php',
                  'html_id' => 'monit');
$items[] = array( 'title'     => "Show OpenVz VE BeanCounter",
                  'target'     => 'content',
                  'link'    => 'monitor/show_data.php?type=openvz_beancounter',
                  'html_id' => 'openvz_beancounter');
$items[] = array( 'title'     => "Show Munin",
                  'target'     => 'content',
                  'link'    => 'monitor/show_munin.php',
                  'html_id' => 'monit');
$module["nav"][] = array(    'title'    => 'Server State',
                            'open'     => 1,
interface/web/monitor/log_list.php
@@ -47,7 +47,7 @@
$app->uses('listform_actions');
//$app->listform_actions->SQLExtWhere = "wb = 'W'";
$app->listform_actions->SQLOrderBy = "ORDER BY tstamp DESC, syslog_id DESC";
$app->listform_actions->SQLOrderBy = "ORDER BY sys_log.tstamp DESC, sys_log.syslog_id DESC";
$app->listform_actions->onLoad();
interface/web/monitor/show_monit.php
New file
@@ -0,0 +1,82 @@
<?php
/*
Copyright (c) 2007-2008, Till Brehm, projektfarm Gmbh and Oliver Vogel www.muv.com
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
    * Redistributions of source code must retain the above copyright notice,
      this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
    * Neither the name of ISPConfig nor the names of its contributors
      may be used to endorse or promote products derived from this software without
      specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
require_once('../../lib/config.inc.php');
require_once('../../lib/app.inc.php');
//* Check permissions for module
$app->auth->check_module_permissions('monitor');
$app->uses('tools_monitor');
// Loading the template
$app->uses('tpl');
$app->tpl->newTemplate("form.tpl.htm");
$app->tpl->setInclude('content_tpl', 'templates/show_monit.htm');
$monTransSrv = $app->lng("monitor_settings_server_txt");
$title = 'Monit ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')';
$app->tpl->setVar("list_head_txt", $title);
if($_SESSION["s"]["user"]["typ"] == 'admin'){
    $app->uses('getconf');
    $server_config = $app->getconf->get_server_config($_SESSION['monitor']['server_id'],'server');
    $monit_url = trim($server_config['monit_url']);
    if($monit_url != ''){
        $monit_url = str_replace('[SERVERNAME]', $_SESSION['monitor']['server_name'], $monit_url);
        $monit_user = trim($server_config['monit_user']);
        $monit_password = trim($server_config['monit_password']);
        $auth_string = '';
        if($monit_user != ''){
            $auth_string = $monit_user;
        }
        if($monit_user != '' && $monit_password != ''){
            $auth_string .= ':'.$monit_password;
        }
        if($auth_string != '') $auth_string .= '@';
        $monit_url_parts = parse_url($monit_url);
        $monit_url = $monit_url_parts['scheme'].'://'.$auth_string.$monit_url_parts['host'].(isset($monit_url_parts['port']) ? ':' . $monit_url_parts['port'] : '').(isset($monit_url_parts['path']) ? $monit_url_parts['path'] : '').(isset($monit_url_parts['query']) ? '?' . $monit_url_parts['query'] : '').(isset($monit_url_parts['fragment']) ? '#' . $monit_url_parts['fragment'] : '');
        $app->tpl->setVar("monit_url", $monit_url);
    } else {
        $app->tpl->setVar("no_monit_url_defined_txt", $app->lng("no_monit_url_defined_txt"));
    }
} else {
    $app->tpl->setVar("no_permissions_to_view_monit_txt", $app->lng("no_permissions_to_view_monit_txt"));
}
$app->tpl_defaults();
$app->tpl->pparse();
?>
interface/web/monitor/show_munin.php
New file
@@ -0,0 +1,82 @@
<?php
/*
Copyright (c) 2007-2008, Till Brehm, projektfarm Gmbh and Oliver Vogel www.muv.com
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
    * Redistributions of source code must retain the above copyright notice,
      this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
    * Neither the name of ISPConfig nor the names of its contributors
      may be used to endorse or promote products derived from this software without
      specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
require_once('../../lib/config.inc.php');
require_once('../../lib/app.inc.php');
//* Check permissions for module
$app->auth->check_module_permissions('monitor');
$app->uses('tools_monitor');
// Loading the template
$app->uses('tpl');
$app->tpl->newTemplate("form.tpl.htm");
$app->tpl->setInclude('content_tpl', 'templates/show_munin.htm');
$monTransSrv = $app->lng("monitor_settings_server_txt");
$title = 'Munin ('. $monTransSrv .' : ' . $_SESSION['monitor']['server_name'] . ')';
$app->tpl->setVar("list_head_txt", $title);
if($_SESSION["s"]["user"]["typ"] == 'admin'){
    $app->uses('getconf');
    $server_config = $app->getconf->get_server_config($_SESSION['monitor']['server_id'],'server');
    $munin_url = trim($server_config['munin_url']);
    if($munin_url != ''){
        $munin_url = str_replace('[SERVERNAME]', $_SESSION['monitor']['server_name'], $munin_url);
        $munin_user = trim($server_config['munin_user']);
        $munin_password = trim($server_config['munin_password']);
        $auth_string = '';
        if($munin_user != ''){
            $auth_string = $munin_user;
        }
        if($munin_user != '' && $munin_password != ''){
            $auth_string .= ':'.$munin_password;
        }
        if($auth_string != '') $auth_string .= '@';
        $munin_url_parts = parse_url($munin_url);
        $munin_url = $munin_url_parts['scheme'].'://'.$auth_string.$munin_url_parts['host'].(isset($munin_url_parts['port']) ? ':' . $munin_url_parts['port'] : '').(isset($munin_url_parts['path']) ? $munin_url_parts['path'] : '').(isset($munin_url_parts['query']) ? '?' . $munin_url_parts['query'] : '').(isset($munin_url_parts['fragment']) ? '#' . $munin_url_parts['fragment'] : '');
        $app->tpl->setVar("munin_url", $munin_url);
    } else {
        $app->tpl->setVar("no_munin_url_defined_txt", $app->lng("no_munin_url_defined_txt"));
    }
} else {
    $app->tpl->setVar("no_permissions_to_view_munin_txt", $app->lng("no_permissions_to_view_munin_txt"));
}
$app->tpl_defaults();
$app->tpl->pparse();
?>
interface/web/monitor/templates/show_monit.htm
New file
@@ -0,0 +1,10 @@
<h2><tmpl_var name="list_head_txt"></h2>
<p><tmpl_var name="list_desc_txt"></p>
<div class="panel panel_system">
<tmpl_if name='monit_url'>
    <iframe src="{tmpl_var name='monit_url'}" width="100%" height="1000" frameborder="0" style="overflow:visible;"></iframe>
<tmpl_else>
    <div id="errorMsg"><h3>ERROR</h3><ol><li>{tmpl_var name="no_monit_url_defined_txt"} {tmpl_var name="no_permissions_to_view_monit_txt"}<br></li></ol></div>
</tmpl_if>
</div>
interface/web/monitor/templates/show_munin.htm
New file
@@ -0,0 +1,10 @@
<h2><tmpl_var name="list_head_txt"></h2>
<p><tmpl_var name="list_desc_txt"></p>
<div class="panel panel_system">
<tmpl_if name='munin_url'>
    <iframe src="{tmpl_var name='munin_url'}" width="100%" height="1000" frameborder="0" style="overflow:visible;"></iframe>
<tmpl_else>
    <div id="errorMsg"><h3>ERROR</h3><ol><li>{tmpl_var name="no_munin_url_defined_txt"} {tmpl_var name="no_permissions_to_view_munin_txt"}<br></li></ol></div>
</tmpl_if>
</div>
interface/web/sites/ajax_get_json.php
@@ -69,11 +69,17 @@
        $web_config = $app->getconf->get_server_config($server_id, 'web');
        if(!empty($web_config['server_type'])) $server_type = $web_config['server_type'];
        if($server_type == 'nginx' && $php_type == 'fast-cgi') $php_type = 'php-fpm';
        // get client id
        $sql_where = '';
        if($_SESSION["s"]["user"]["typ"] != 'admin'){
            $sql_where = " AND client_id = ".$_SESSION["s"]["user"]["client_id"];
        }
        if($php_type == 'php-fpm'){
            $php_records = $app->db->queryAllRecords("SELECT * FROM server_php WHERE php_fpm_init_script != '' AND php_fpm_ini_dir != '' AND php_fpm_pool_dir != '' AND server_id = $server_id");
            $php_records = $app->db->queryAllRecords("SELECT * FROM server_php WHERE php_fpm_init_script != '' AND php_fpm_ini_dir != '' AND php_fpm_pool_dir != '' AND server_id = $server_id".$sql_where);
        }
        if($php_type == 'fast-cgi'){
            $php_records = $app->db->queryAllRecords("SELECT * FROM server_php WHERE php_fastcgi_binary != '' AND php_fastcgi_ini_dir != '' AND server_id = $server_id");
            $php_records = $app->db->queryAllRecords("SELECT * FROM server_php WHERE php_fastcgi_binary != '' AND php_fastcgi_ini_dir != '' AND server_id = $server_id".$sql_where);
        }
        $php_select = "";
        if(is_array($php_records) && !empty($php_records)) {
interface/web/sites/aps_availablepackages_list.php
@@ -42,10 +42,10 @@
// Load needed classes
$app->uses('tpl,listform_actions');
$app->listform_actions->SQLOrderBy = 'ORDER BY name, version';
$app->listform_actions->SQLOrderBy = 'ORDER BY aps_packages.name, aps_packages.version';
// Show only unlocked packages to clients and (un-)lockable packages to admins
if($_SESSION['s']['user']['typ'] != 'admin') $app->listform_actions->SQLExtWhere = 'package_status = '.PACKAGE_ENABLED;
else $app->listform_actions->SQLExtWhere = '(package_status = '.PACKAGE_ENABLED.' OR package_status = '.PACKAGE_LOCKED.')';
if($_SESSION['s']['user']['typ'] != 'admin') $app->listform_actions->SQLExtWhere = 'aps_packages.package_status = '.PACKAGE_ENABLED;
else $app->listform_actions->SQLExtWhere = '(aps_packages.package_status = '.PACKAGE_ENABLED.' OR aps_packages.package_status = '.PACKAGE_LOCKED.')';
// Get package amount
$pkg_count = $app->db->queryOneRecord("SELECT COUNT(*) FROM aps_packages");
interface/web/sites/cron_edit.php
@@ -115,8 +115,17 @@
            $this->dataRecord["type"] = 'url';
        } else {
            $domain_owner = $app->db->queryOneRecord("SELECT limit_cron_type FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ".$app->functions->intval($parent_domain["sys_groupid"]));
            if($domain_owner["limit_cron_type"] == 'full') $this->dataRecord["type"] = 'full';
            else $this->dataRecord["type"] = 'chrooted';
            //* True when the site is assigned to a client
            if(isset($domain_owner["limit_cron_type"])) {
                if($domain_owner["limit_cron_type"] == 'full') {
                    $this->dataRecord["type"] = 'full';
                } else {
                    $this->dataRecord["type"] = 'chrooted';
                }
            } else {
                //* True when the site is assigned to the admin
                $this->dataRecord["type"] = 'full';
            }
        }
        
        parent::onSubmit();
interface/web/sites/database_del.php
@@ -52,7 +52,7 @@
        if($app->tform->checkPerm($this->id,'d') == false) $app->error($app->lng('error_no_delete_permission'));
        
        $app->uses('sites_database_plugin');
        $app->sites_database_plugin->processDatabaseDelete($this->id);
        //$app->sites_database_plugin->processDatabaseDelete($this->id);
    }
}
interface/web/sites/database_edit.php
@@ -264,6 +264,10 @@
                        if(preg_match('/(^|,)' . preg_quote($server_config['ip_address'], '/') . '(,|$)/', $this->dataRecord['remote_ips']) == false) {
                            $this->dataRecord['remote_ips'] .= ',' . $server_config['ip_address'];
                        }
                        $tmp = preg_split('/\s*,\s*/', $this->dataRecord['remote_ips']);
                        $tmp = array_unique($tmp);
                        $this->dataRecord['remote_ips'] = implode(',', $tmp);
                        unset($tmp);
                    }
                }
            }
@@ -328,6 +332,10 @@
                        if(preg_match('/(^|,)' . preg_quote($server_config['ip_address'], '/') . '(,|$)/', $this->dataRecord['remote_ips']) == false) {
                            $this->dataRecord['remote_ips'] .= ',' . $server_config['ip_address'];
                        }
                        $tmp = preg_split('/\s*,\s*/', $this->dataRecord['remote_ips']);
                        $tmp = array_unique($tmp);
                        $this->dataRecord['remote_ips'] = implode(',', $tmp);
                        unset($tmp);
                    }
                }
            }
@@ -341,7 +349,7 @@
        
        $app->uses('sites_database_plugin');
        
        $app->sites_database_plugin->processDatabaseInsert($this);
        //$app->sites_database_plugin->processDatabaseInsert($this);
        
        $app->db->query($sql);
        if($app->db->errorMessage != '') die($app->db->errorMessage);
@@ -355,7 +363,7 @@
        if(!empty($sql) && !$app->tform->isReadonlyTab($app->tform->getCurrentTab(),$this->id)) {
            
            $app->uses('sites_database_plugin');
            $app->sites_database_plugin->processDatabaseUpdate($this);
            //$app->sites_database_plugin->processDatabaseUpdate($this);
            $app->db->query($sql);
            if($app->db->errorMessage != '') die($app->db->errorMessage);
interface/web/sites/database_list.php
@@ -67,7 +67,7 @@
}
$list = new list_action;
$list->SQLOrderBy = 'ORDER BY database_name';
$list->SQLOrderBy = 'ORDER BY web_database.database_name';
$list->onLoad();
interface/web/sites/database_phpmyadmin.php
@@ -65,13 +65,13 @@
if($global_config['phpmyadmin_url'] != '') {
    $phpmyadmin_url = $global_config['phpmyadmin_url'];
    $phpmyadmin_url = str_replace(array('[SERVERNAME]', '[DATABASENAME]'),array($serverData['server_name'], $dbData['database_name']),$phpmyadmin_url);
    header('Location:'.$phpmyadmin_url);
    header('Location: '.$phpmyadmin_url);
} else {
    isset($_SERVER['HTTPS'])? $http = 'https' : $http = 'http';
    if($web_config['server_type'] == 'nginx') {
        header('location:' . $http . '://' . $serverData['server_name'] . ':8081/phpmyadmin');
        header('Location: http://' . $serverData['server_name'] . ':8081/phpmyadmin');
    } else {
        header('location:' . $http . '://' . $serverData['server_name'] . '/phpmyadmin');
        header('Location: ' . $http . '://' . $serverData['server_name'] . '/phpmyadmin');
    }
}
exit;
interface/web/sites/database_user_del.php
@@ -53,7 +53,12 @@
        if($app->tform->checkPerm($this->id,'d') == false) $app->error($app->lng('error_no_delete_permission'));
        
        $old_record = $app->tform->getDataRecord($this->id);
        $app->db->datalogDelete('web_database_user', 'database_user_id', $this->id);
        /* we cannot use datalogDelete here, as we need to set server_id to 0 */
        $app->db->query("DELETE FROM `web_database_user` WHERE $index_field = '$index_value'");
        $new_rec = array();
        $old_record['server_id'] = 0;
        $app->db->datalogSave('web_database_user', 'DELETE', 'database_user_id', $this->id, $old_record, $new_rec);
    }
    
    function onAfterDelete() { // this has to be done on AFTER delete, because we need the db user still in the database when the server plugin processes the datalog
interface/web/sites/database_user_edit.php
@@ -69,21 +69,21 @@
            $client = $app->db->queryOneRecord("SELECT client.company_name, client.contact_name, client.client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
            
            // Fill the client select field
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(client.company_name,' :: ',client.contact_name) as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id']." ORDER BY sys_group.name";
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id']." ORDER BY sys_group.name";
            $records = $app->db->queryAllRecords($sql);
            $tmp = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ".$client['client_id']);
            $client_select = '<option value="'.$tmp['groupid'].'">'.$client['company_name'].' :: '.$client['contact_name'].'</option>';
            $client_select = '<option value="'.$tmp['groupid'].'">'.$client['contact_name'].'</option>';
            //$tmp_data_record = $app->tform->getDataRecord($this->id);
            if(is_array($records)) {
                foreach( $records as $rec) {
                    $selected = @(is_array($this->dataRecord) && ($rec["groupid"] == $this->dataRecord['client_group_id'] || $rec["groupid"] == $this->dataRecord['sys_groupid']))?'SELECTED':'';
                    $client_select .= "<option value='$rec[groupid]' $selected>$rec[name] :: $rec[contactname]</option>\r\n";
                    $client_select .= "<option value='$rec[groupid]' $selected>$rec[contactname]</option>\r\n";
                }
            }
            $app->tpl->setVar("client_group_id",$client_select);
        } elseif($_SESSION["s"]["user"]["typ"] == 'admin') {
            // Fill the client select field
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(client.company_name,' :: ',client.contact_name) as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id > 0 ORDER BY sys_group.name";
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id > 0 ORDER BY sys_group.name";
            $clients = $app->db->queryAllRecords($sql);
            $client_select = "<option value='0'></option>";
            //$tmp_data_record = $app->tform->getDataRecord($this->id);
@@ -91,7 +91,7 @@
                foreach( $clients as $client) {
                    //$selected = @($client["groupid"] == $tmp_data_record["sys_groupid"])?'SELECTED':'';
                    $selected = @(is_array($this->dataRecord) && ($client["groupid"] == $this->dataRecord['client_group_id'] || $client["groupid"] == $this->dataRecord['sys_groupid']))?'SELECTED':'';
                    $client_select .= "<option value='$client[groupid]' $selected>$client[name] :: $client[contactname]</option>\r\n";
                    $client_select .= "<option value='$client[groupid]' $selected>$client[contactname]</option>\r\n";
                }
            }
            $app->tpl->setVar("client_group_id",$client_select);
@@ -147,7 +147,7 @@
            $this->dataRecord['database_user'] = substr($dbuser_prefix . $this->dataRecord['database_user'], 0, 16);
        }
        
        $this->dataRecord['server_id'] = $conf['server_id'];
        $this->dataRecord['server_id'] = 0; // we need this on all servers
        
        parent::onBeforeUpdate();
    }
@@ -179,7 +179,7 @@
            $this->dataRecord['database_user'] = substr($dbuser_prefix . $this->dataRecord['database_user'], 0, 16);
        }
        
        $this->dataRecord['server_id'] = $conf['server_id'];
        $this->dataRecord['server_id'] = 0; // we need this on all servers
        
        parent::onBeforeInsert();
    }
@@ -209,7 +209,7 @@
            $app->db->query("UPDATE web_database_user SET sys_groupid = $client_group_id, sys_perm_group = 'riud' WHERE database_user_id = ".$this->id);
        }
        
        $password = $app->db->queryOneRecord("SELECT database_password FROM web_database_user WHERE database_user_id = ".$this->id);
        /*$password = $app->db->queryOneRecord("SELECT database_password FROM web_database_user WHERE database_user_id = ".$this->id);
        
        $records = $app->db->queryAllRecords("SELECT DISTINCT server_id FROM web_database WHERE database_user_id = '".$app->functions->intval($this->id)."' UNION SELECT DISTINCT server_id FROM web_database WHERE database_ro_user_id = '".$app->functions->intval($this->id)."'");
        foreach($records as $rec) {
@@ -219,7 +219,7 @@
            $new_rec['database_password'] = $password['database_password'];
            $app->db->datalogSave('web_database_user', 'UPDATE', 'database_user_id', $this->id, $this->oldDataRecord, $new_rec);
        }
        unset($new_rec);
        unset($new_rec);*/
    }
}
interface/web/sites/database_user_list.php
@@ -58,7 +58,7 @@
}
$list = new list_action;
$list->SQLOrderBy = 'ORDER BY database_user';
$list->SQLOrderBy = 'ORDER BY web_database_user.database_user';
$list->onLoad();
interface/web/sites/form/database_user.tform.php
@@ -44,7 +44,7 @@
$form["action"]            = "database_user_edit.php";
$form["db_table"]        = "web_database_user";
$form["db_table_idx"]    = "database_user_id";
$form["db_history"]        = "no";
$form["db_history"]        = "yes";
$form["tab_default"]    = "database_user";
$form["list_default"]    = "database_user_list.php";
$form["auth"]            = 'yes'; // yes / no
interface/web/sites/form/shell_user.tform.php
@@ -91,7 +91,7 @@
            'validators'    => array (     0 => array (    'type'    => 'UNIQUE',
                                                        'errmsg'=> 'username_error_unique'),
                                        1 => array (    'type'    => 'REGEX',
                                                        'regex' => '/^[\w\.\-]{0,64}$/',
                                                        'regex' => '/^[\w\.\-]{0,32}$/',
                                                        'errmsg'=> 'username_error_regex'),
                                    ),
            'default'    => '',
interface/web/sites/form/web_domain.tform.php
@@ -318,6 +318,14 @@
            'default'    => '',
            'value'        => array('' => 'no_redirect_txt', 'non_www_to_www' => 'domain.tld => www.domain.tld', 'www_to_non_www' => 'www.domain.tld => domain.tld', '*_domain_tld_to_domain_tld' => '*.doman.tld => domain.tld', '*_domain_tld_to_www_domain_tld' => '*.domain.tld => www.domain.tld', '*_to_domain_tld' => '* => domain.tld', '*_to_www_domain_tld' => '* => www.domain.tld')
        ),
        'rewrite_rules' => array (
            'datatype'    => 'TEXT',
            'formtype'    => 'TEXT',
            'default'    => '',
            'value'        => '',
            'width'        => '30',
            'maxlength'    => '255'
        ),
    ##################################
    # ENDE Datatable fields
    ##################################
@@ -507,7 +515,7 @@
            'datatype'    => 'VARCHAR',
            'formtype'    => 'SELECT',
            'default'    => '',
            'value'        => array('none' => 'No backup', 'daily' => 'Daily', 'weekly' => 'Weekly', 'monthly' => 'Monthly')
            'value'        => array('none' => 'no_backup_txt', 'daily' => 'daily_backup_txt', 'weekly' => 'weekly_backup_txt', 'monthly' => 'monthly_backup_txt')
        ),
        'backup_copies' => array (
            'datatype'    => 'INTEGER',
interface/web/sites/ftp_user_edit.php
@@ -177,6 +177,23 @@
            $app->db->query($sql);
        }
        
        //* 2. check to ensure that the FTP user path is not changed to a path outside of the docroot by a normal user
        if(isset($this->dataRecord['dir']) && $this->dataRecord['dir'] != $this->oldDataRecord['dir'] && !$app->auth->is_admin()) {
            $vd = new validate_ftpuser;
            $error_message = $vd->ftp_dir('dir', $this->dataRecord['dir'], '');
            //* This check should normally never be triggered
            //* Set the path to a safe path (web doc root).
            if($error_message != '') {
                $ftp_data = $app->db->queryOneRecord("SELECT parent_domain_id FROM ftp_user WHERE ftp_user_id = '".$app->db->quote($app->tform->primary_id)."'");
                $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$app->functions->intval($ftp_data["parent_domain_id"]));
                $dir = $web["document_root"];
                $sql = "UPDATE ftp_user SET dir = '$dir' WHERE ftp_user_id = ".$this->id;
                $app->db->query($sql);
                $app->log("Error in FTP path settings of FTP user ".$this->dataRecord['username'], 1);
            }
        }
    }
}
interface/web/sites/ftp_user_list.php
@@ -68,7 +68,7 @@
}
$list = new list_action;
$list->SQLOrderBy = 'ORDER BY username';
$list->SQLOrderBy = 'ORDER BY ftp_user.username';
$list->onLoad();
interface/web/sites/lib/lang/de_shell_user.lng
@@ -26,4 +26,6 @@
$wb['repeat_password_txt'] = 'Passwort wiederholen';
$wb['password_mismatch_txt'] = 'Die Passwörter stimmen nicht Ã¼berein.';
$wb['password_match_txt'] = 'Die Passwörter stimmen Ã¼berein.';
$wb['username_must_not_exceed_32_chars_txt'] = 'Der Benutzername darf 32 Zeichen nicht Ã¼berschreiten.';
$wb['username_not_allowed_txt'] = 'Der Benutzername ist nicht erlaubt.';
?>
interface/web/sites/lib/lang/de_web_domain.lng
@@ -111,5 +111,12 @@
$wb['available_nginx_directive_snippets_txt'] = 'Verfügbare nginx Direktiven Schnipsel:';
$wb['proxy_directives_txt'] = 'Proxy Direktiven';
$wb['available_proxy_directive_snippets_txt'] = 'Verfügbare Proxy Direktiven Schnipsel:';
$wb['no_server_error'] = 'No server selected.';
$wb['no_server_error'] = 'Kein server ausgewählt.';
$wb['no_backup_txt'] = 'Kein Backup';
$wb['daily_backup_txt'] = 'Täglich';
$wb['weekly_backup_txt'] = 'Wöchentlich';
$wb['monthly_backup_txt'] = 'Monatlich';
$wb['rewrite_rules_txt'] = 'Rewrite Rules';
$wb['invalid_rewrite_rules_txt'] = 'Unzulässige Rewrite Rules';
$wb['allowed_rewrite_rule_directives_txt'] = 'Erlaubte Direktiven:';
?>
interface/web/sites/lib/lang/en_shell_user.lng
@@ -26,4 +26,6 @@
$wb['repeat_password_txt'] = 'Repeat Password';
$wb['password_mismatch_txt'] = 'The passwords do not match.';
$wb['password_match_txt'] = 'The passwords do match.';
$wb['username_must_not_exceed_32_chars_txt'] = 'The username must not exceed 32 characters.';
$wb['username_not_allowed_txt'] = 'The username is not allowed.';
?>
interface/web/sites/lib/lang/en_web_domain.lng
@@ -112,4 +112,11 @@
$wb['proxy_directives_txt'] = 'Proxy Directives';
$wb['available_proxy_directive_snippets_txt'] = 'Available Proxy Directive Snippets:';
$wb['no_server_error'] = 'No server selected.';
$wb['no_backup_txt'] = 'No backup';
$wb['daily_backup_txt'] = 'Daily';
$wb['weekly_backup_txt'] = 'Weekly';
$wb['monthly_backup_txt'] = 'Monthly';
$wb['rewrite_rules_txt'] = 'Rewrite Rules';
$wb['invalid_rewrite_rules_txt'] = 'Invalid Rewrite Rules';
$wb['allowed_rewrite_rule_directives_txt'] = 'Allowed Directives:';
?>
interface/web/sites/list/aps_installedpackages.list.php
@@ -1,83 +1,93 @@
<?php
/*
Copyright (c) 2012, ISPConfig UG
Contributors: web wack creations,  http://www.web-wack.at
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
    * Redistributions of source code must retain the above copyright notice,
      this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
    * Neither the name of ISPConfig nor the names of its contributors
      may be used to endorse or promote products derived from this software without
      specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
$liste['name'] = 'aps_instances'; // Name of the list
$liste['table'] = 'aps_instances,aps_packages'; // Database table
$liste['table_idx'] = 'id'; // Table index
$liste["search_prefix"] = 'search_'; // Search field prefix
$liste['records_per_page'] = 15; // Records per page
$liste['file'] = 'aps_installedpackages_list.php'; // Script file for this list
$liste['edit_file']    = ''; // Script file to edit
$liste['delete_file'] = ''; // Script file to delete
$liste['paging_tpl'] = 'templates/paging.tpl.htm'; // Paging template
$liste['auth'] = 'no'; // Handling it myself (check for admin)
// Search fields
$liste["item"][] = array('field'    => 'name',
                         'datatype' => 'VARCHAR',
                         'formtype' => 'TEXT',
                         'op'       => 'LIKE',
                         'prefix'   => '%',
                         'suffix'   => '%',
                         'width'    => '',
                         'value'    => '');
$liste["item"][] = array('field'    => 'version',
                         'datatype' => 'VARCHAR',
                         'formtype' => 'TEXT',
                         'op'       => 'like',
                         'prefix'   => '%',
                         'suffix'   => '%',
                         'width'    => '',
                         'value'    => '');
 /*
$liste["item"][] = array('field'    => 'customer_id',
                         'datatype' => 'INTEGER',
                         'formtype' => 'SELECT',
                         'op'       => '=',
                         'prefix'   => '',
                         'suffix'   => '',
                         'width'    => '',
                         'value'    => '');
*/
$liste["item"][] = array('field'    => 'instance_status',
                         'datatype' => 'VARCHAR',
                         'formtype' => 'SELECT',
                         'op'       => '=',
                         'prefix'   => '',
                         'suffix'   => '',
                         'width'    => '',
                         'value'    => array(INSTANCE_INSTALL => $app->lng('Installation_task'),
                                             INSTANCE_ERROR => $app->lng('Installation_error'),
                                             INSTANCE_SUCCESS => $app->lng('Installation_success'),
                                             INSTANCE_REMOVE => $app->lng('Installation_remove')));
<?php
/*
Copyright (c) 2012, ISPConfig UG
Contributors: web wack creations,  http://www.web-wack.at
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
    * Redistributions of source code must retain the above copyright notice,
      this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
    * Neither the name of ISPConfig nor the names of its contributors
      may be used to endorse or promote products derived from this software without
      specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
$liste['name'] = 'aps_instances'; // Name of the list
$liste['table'] = 'aps_instances'; // Database table
$liste['table_idx'] = 'id'; // Table index
// if multiple tables are involved, list the additional tables here (comma separated)
$liste["additional_tables"] = "aps_packages";
// if multiple tables are involved, specify sql to join these tables
$liste["join_sql"] = " aps_instances.package_id = aps_packages.id";
$liste["search_prefix"] = 'search_'; // Search field prefix
$liste['records_per_page'] = 15; // Records per page
$liste['file'] = 'aps_installedpackages_list.php'; // Script file for this list
$liste['edit_file']    = ''; // Script file to edit
$liste['delete_file'] = ''; // Script file to delete
$liste['paging_tpl'] = 'templates/paging.tpl.htm'; // Paging template
$liste['auth'] = 'no'; // Handling it myself (check for admin)
// Search fields
$liste["item"][] = array('field'    => 'name',
                         'datatype' => 'VARCHAR',
                         'formtype' => 'TEXT',
                         'op'       => 'LIKE',
                         'prefix'   => '%',
                         'suffix'   => '%',
                         'width'    => '',
                         'value'    => '',
                         'table'    => 'aps_packages');
$liste["item"][] = array('field'    => 'version',
                         'datatype' => 'VARCHAR',
                         'formtype' => 'TEXT',
                         'op'       => 'like',
                         'prefix'   => '%',
                         'suffix'   => '%',
                         'width'    => '',
                         'value'    => '',
                         'table'    => 'aps_packages');
 /*
$liste["item"][] = array('field'    => 'customer_id',
                         'datatype' => 'INTEGER',
                         'formtype' => 'SELECT',
                         'op'       => '=',
                         'prefix'   => '',
                         'suffix'   => '',
                         'width'    => '',
                         'value'    => '');
*/
$liste["item"][] = array('field'    => 'instance_status',
                         'datatype' => 'VARCHAR',
                         'formtype' => 'SELECT',
                         'op'       => '=',
                         'prefix'   => '',
                         'suffix'   => '',
                         'width'    => '',
                         'value'    => array(INSTANCE_INSTALL => $app->lng('Installation_task'),
                                             INSTANCE_ERROR => $app->lng('Installation_error'),
                                             INSTANCE_SUCCESS => $app->lng('Installation_success'),
                                             INSTANCE_REMOVE => $app->lng('Installation_remove')),
                         'table'    => 'aps_instances');
?>
interface/web/sites/list/user_quota_stats.list.php
@@ -42,6 +42,9 @@
// Enable auth
$liste["auth"]                = "yes";
// mark columns for php sorting (no real mySQL columns)
$liste["phpsort"] = array('used_sort', 'files');
/*****************************************************
* Suchfelder
interface/web/sites/shell_user_edit.php
@@ -121,7 +121,7 @@
        $blacklist = file(ISPC_LIB_PATH.'/shelluser_blacklist');
        foreach($blacklist as $line) {
            if(strtolower(trim($line)) == strtolower(trim($this->dataRecord['username']))){
                $app->tform->errorMessage .= 'The username is not allowed.';
                $app->tform->errorMessage .= $app->tform->lng('username_not_allowed_txt');
            }
        }
        unset($blacklist);
@@ -138,6 +138,8 @@
            $this->dataRecord['username_prefix'] = $shelluser_prefix;
            /* restrict the names */
            $this->dataRecord['username'] = $shelluser_prefix . $this->dataRecord['username'];
            if(strlen($this->dataRecord['username']) > 32) $app->tform->errorMessage .= $app->tform->lng("username_must_not_exceed_32_chars_txt");
        }
        parent::onBeforeInsert();
    }
@@ -166,7 +168,7 @@
        $blacklist = file(ISPC_LIB_PATH.'/shelluser_blacklist');
        foreach($blacklist as $line) {
            if(strtolower(trim($line)) == strtolower(trim($this->dataRecord['username']))){
                $app->tform->errorMessage .= 'The username is not allowed.';
                $app->tform->errorMessage .= $app->tform->lng('username_not_allowed_txt');
            }
        }
        unset($blacklist);
@@ -188,6 +190,8 @@
            
            /* restrict the names */
            $this->dataRecord['username'] = $shelluser_prefix . $this->dataRecord['username'];
            if(strlen($this->dataRecord['username']) > 32) $app->tform->errorMessage .= $app->tform->lng("username_must_not_exceed_32_chars_txt");
        }
    }
    
interface/web/sites/shell_user_list.php
@@ -49,7 +49,7 @@
// Limit the results to alias domains
//$app->listform_actions->SQLExtWhere = "type = 'subdomain'";
$app->listform_actions->SQLOrderBy = 'ORDER BY username';
$app->listform_actions->SQLOrderBy = 'ORDER BY shell_user.username';
$app->listform_actions->onLoad();
interface/web/sites/templates/database_edit.htm
@@ -77,7 +77,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="remote_ips">{tmpl_var name='remote_ips_txt'}</label>
                <input name="remote_ips" id="remote_ips" value="{tmpl_var name='remote_ips'}" size="60" type="text" class="textInput formLengthHalf" />
                <input name="remote_ips" id="remote_ips" value="{tmpl_var name='remote_ips'}" size="30" type="text" class="textInput" />
            </div>
            <div class="ctrlHolder">
                <p class="label">{tmpl_var name='active_txt'}</p>
interface/web/sites/templates/user_quota_stats_list.htm
@@ -9,10 +9,10 @@
                <tr class="caption">
                    <th class="tbl_col_domain" scope="col"><tmpl_var name="domain_txt"></th>
                    <th class="tbl_col_system_user" scope="col"><tmpl_var name="system_user_txt"></th>
                    <th class="tbl_col_used tbl_col_nosort" scope="col"><tmpl_var name="used_txt"></th>
                    <th class="tbl_col_used_sort" scope="col"><tmpl_var name="used_txt"></th>
                    <th class="tbl_col_soft tbl_col_nosort" scope="col"><tmpl_var name="soft_txt"></th>
                    <th class="tbl_col_hard tbl_col_nosort" scope="col"><tmpl_var name="hard_txt"></th>
                    <th class="tbl_col_files tbl_col_nosort" scope="col"><tmpl_var name="files_txt"></th>
                    <th class="tbl_col_files" scope="col"><tmpl_var name="files_txt"></th>
                    <th class="tbl_col_limit" scope="col">{tmpl_var name='search_limit'}</th>
                </tr>
                <tr class="filter">
interface/web/sites/templates/web_domain_advanced.htm
@@ -61,11 +61,11 @@
                    <input name="pm_max_requests" id="pm_max_requests" value="{tmpl_var name='pm_max_requests'}" size="3" maxlength="6" type="text" class="textInput formLengthLimit" />
                </div>
            </div>
            <div class="ctrlHolder">
            <div class="ctrlHolder php">
                <label for="php_open_basedir">{tmpl_var name='php_open_basedir_txt'}</label>
                <input name="php_open_basedir" id="php_open_basedir" value="{tmpl_var name='php_open_basedir'}" size="30" type="text" class="textInput"  style="width:400px;" />
            </div>
            <div class="ctrlHolder">
            <div class="ctrlHolder php">
                <label for="custom_php_ini">{tmpl_var name='custom_php_ini_txt'}</label>
                <textarea name="custom_php_ini" id="custom_php_ini" rows='10' cols='50' style="width:400px;">{tmpl_var name='custom_php_ini'}</textarea>&nbsp;<b>{tmpl_var name="available_php_directive_snippets_txt"}</b><br><br>&nbsp;{tmpl_var name="php_directive_snippets_txt"}
            </div>
@@ -144,6 +144,11 @@
            } else {
                jQuery('.phpfpm').hide();
            }
            if(data.phptype == "no"){
                jQuery('.php').hide();
            } else {
                jQuery('.php').show();
            }
        });
        jQuery.getJSON('sites/ajax_get_json.php'+ '?' + Math.round(new Date().getTime()), {web_id : webId, type : "getredirecttype"}, function(data) {
            if(data.redirecttype == "proxy"){
interface/web/sites/templates/web_domain_edit.htm
@@ -45,7 +45,7 @@
            </div>
            <div class="ctrlHolder">
                <label for="ipv6_address">{tmpl_var name='ipv6_address_txt'}</label>
                <select name="ipv6_address" id="ipv6_address" class="selectInput formLengthIPv4">
                <select name="ipv6_address" id="ipv6_address" class="selectInput formLengthIPv6">
                    {tmpl_var name='ipv6_address'}
                </select>
            </div>
interface/web/sites/templates/web_domain_redirect.htm
@@ -21,6 +21,10 @@
                    {tmpl_var name='seo_redirect'}
                </select>
            </div>
            <div class="ctrlHolder nginx">
                <label for="rewrite_rules">{tmpl_var name='rewrite_rules_txt'}</label>
                <textarea name="rewrite_rules" id="rewrite_rules" rows='10' cols='50' style="width:400px;">{tmpl_var name='rewrite_rules'}</textarea>&nbsp;<b>{tmpl_var name="allowed_rewrite_rule_directives_txt"}</b><br><br>&nbsp;break<br>&nbsp;if<br>&nbsp;return<br>&nbsp;rewrite<br>&nbsp;set
            </div>
        </fieldset>
        <input type="hidden" name="id" value="{tmpl_var name='id'}">
@@ -58,6 +62,7 @@
                jQuery('#redirect_type option[value="R,L"]').hide();
                jQuery('#redirect_type option[value="R=301,L"]').hide();
                if(selected != "no" && selected != "" && selected != "last" && selected != "break" && selected != "redirect" && selected != "permanent" && selected != "proxy") jQuery('#redirect_type option[value="no"]').attr('selected', 'selected');
                jQuery('.nginx').show();
            } else {
                jQuery('#redirect_type option[value="last"]').attr('disabled','disabled');
                jQuery('#redirect_type option[value="break"]').attr('disabled','disabled');
@@ -71,6 +76,7 @@
                jQuery('#redirect_type option[value="permanent"]').hide();
                jQuery('#redirect_type option[value="proxy"]').hide();
                if(selected != "no" && selected != "" && selected != "R" && selected != "L" && selected != "R,L" && selected != "R=301,L") jQuery('#redirect_type option[value="no"]').attr('selected', 'selected');
                jQuery('.nginx').hide();
            }
        });
    }
interface/web/sites/user_quota_stats.php
@@ -42,6 +42,7 @@
        $username = $rec['system_user'];
        
        $rec['used'] = $monitor_data['user'][$username]['used'];
        $rec['used_sort'] = $rec['used'];
        $rec['soft'] = $monitor_data['user'][$username]['soft'];
        $rec['hard'] = $monitor_data['user'][$username]['hard'];
        $rec['files'] = $monitor_data['user'][$username]['files'];
@@ -95,8 +96,8 @@
}
$list = new list_action;
$list->SQLExtWhere = "type = 'vhost'";
$list->SQLOrderBy = 'ORDER BY domain';
$list->SQLExtWhere = "web_domain.type = 'vhost'";
$list->SQLOrderBy = 'ORDER BY web_domain.domain';
$list->onLoad();
interface/web/sites/web_aliasdomain_list.php
@@ -47,8 +47,8 @@
$app->uses('listform_actions');
// Limit the results to alias domains
$app->listform_actions->SQLExtWhere = "type = 'alias'";
$app->listform_actions->SQLOrderBy = 'ORDER BY domain';
$app->listform_actions->SQLExtWhere = "web_domain.type = 'alias'";
$app->listform_actions->SQLOrderBy = 'ORDER BY web_domain.domain';
$app->listform_actions->onLoad();
interface/web/sites/web_domain_edit.php
@@ -171,7 +171,7 @@
            // Get the limits of the client
            $client_group_id = $_SESSION["s"]["user"]["default_group"];
            $client = $app->db->queryOneRecord("SELECT client.client_id, client.limit_web_domain, client.default_webserver, client.contact_name, CONCAT(client.company_name,' :: ',client.contact_name) as contactname, sys_group.name, client." . implode(", client.", $read_limits) . " FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
            $client = $app->db->queryOneRecord("SELECT client.client_id, client.limit_web_domain, client.default_webserver, client.contact_name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname, sys_group.name, client." . implode(", client.", $read_limits) . " FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
            
            //* Get global web config
            $web_config = $app->getconf->get_server_config($client['default_webserver'], 'web');
@@ -182,15 +182,15 @@
            unset($tmp);
            // Fill the client select field
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(client.company_name,' :: ',client.contact_name) as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id']." ORDER BY sys_group.name";
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id']." ORDER BY sys_group.name";
            $records = $app->db->queryAllRecords($sql);
            $tmp = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ".$client['client_id']);
            $client_select = '<option value="'.$tmp['groupid'].'">'.$client['name'].' :: '.$client['contactname'].'</option>';
            $client_select = '<option value="'.$tmp['groupid'].'">'.$client['contactname'].'</option>';
            //$tmp_data_record = $app->tform->getDataRecord($this->id);
            if(is_array($records)) {
                foreach( $records as $rec) {
                    $selected = @(is_array($this->dataRecord) && ($rec["groupid"] == $this->dataRecord['client_group_id'] || $rec["groupid"] == $this->dataRecord['sys_groupid']))?'SELECTED':'';
                    $client_select .= "<option value='$rec[groupid]' $selected>$rec[name] :: $rec[contactname]</option>\r\n";
                    $client_select .= "<option value='$rec[groupid]' $selected>$rec[contactname]</option>\r\n";
                }
            }
            $app->tpl->setVar("client_group_id",$client_select);
@@ -377,7 +377,7 @@
            unset($php_records);
            // Fill the client select field
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(client.company_name,' :: ',client.contact_name) as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id > 0 ORDER BY sys_group.name";
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id > 0 ORDER BY sys_group.name";
            $clients = $app->db->queryAllRecords($sql);
            $client_select = "<option value='0'></option>";
            //$tmp_data_record = $app->tform->getDataRecord($this->id);
@@ -385,7 +385,7 @@
                foreach( $clients as $client) {
                    //$selected = @($client["groupid"] == $tmp_data_record["sys_groupid"])?'SELECTED':'';
                    $selected = @(is_array($this->dataRecord) && ($client["groupid"] == $this->dataRecord['client_group_id'] || $client["groupid"] == $this->dataRecord['sys_groupid']))?'SELECTED':'';
                    $client_select .= "<option value='$client[groupid]' $selected>$client[name] :: $client[contactname]</option>\r\n";
                    $client_select .= "<option value='$client[groupid]' $selected>$client[contactname]</option>\r\n";
                }
            }
            $app->tpl->setVar("client_group_id",$client_select);
@@ -661,7 +661,15 @@
        
        //* get the server config for this server
        $app->uses("getconf");
        $web_config = $app->getconf->get_server_config($app->functions->intval(isset($this->dataRecord["server_id"]) ? $this->dataRecord["server_id"] : 0),'web');
        if($this->id > 0){
            $web_rec = $app->tform->getDataRecord($this->id);
            $server_id = $web_rec["server_id"];
        } else {
            // Get the first server ID
            $tmp = $app->db->queryOneRecord("SELECT server_id FROM server WHERE web_server = 1 ORDER BY server_name LIMIT 0,1");
            $server_id = intval($tmp['server_id']);
        }
        $web_config = $app->getconf->get_server_config($app->functions->intval(isset($this->dataRecord["server_id"]) ? $this->dataRecord["server_id"] : $server_id),'web');
        //* Check for duplicate ssl certs per IP if SNI is disabled
        if(isset($this->dataRecord['ssl']) && $this->dataRecord['ssl'] == 'y' && $web_config['enable_sni'] != 'y') {
            $sql = "SELECT count(domain_id) as number FROM web_domain WHERE `ssl` = 'y' AND ip_address = '".$app->db->quote($this->dataRecord['ip_address'])."' and domain_id != ".$this->id;
@@ -677,6 +685,59 @@
                $app->tform->errorMessage .= $app->tform->lng("error_php_fpm_pm_settings_txt").'<br>';
            }
        }
        // Check rewrite rules
        $server_type = $web_config['server_type'];
        if($server_type == 'nginx' && isset($this->dataRecord['rewrite_rules']) && trim($this->dataRecord['rewrite_rules']) != '') {
            $rewrite_rules = trim($this->dataRecord['rewrite_rules']);
            $rewrites_are_valid = true;
            // use this counter to make sure all curly brackets are properly closed
            $if_level = 0;
            // Make sure we only have Unix linebreaks
            $rewrite_rules = str_replace("\r\n", "\n", $rewrite_rules);
            $rewrite_rules = str_replace("\r", "\n", $rewrite_rules);
            $rewrite_rule_lines = explode("\n", $rewrite_rules);
            if(is_array($rewrite_rule_lines) && !empty($rewrite_rule_lines)){
                foreach($rewrite_rule_lines as $rewrite_rule_line){
                    // rewrite
                    if(preg_match('@^\s*rewrite\s+(^/)?\S+(\$)?\s+\S+(\s+(last|break|redirect|permanent|))?\s*;\s*$@', $rewrite_rule_line)) continue;
                    // if
                    if(preg_match('@^\s*if\s+\(\s*\$\S+(\s+(\!?(=|~|~\*))\s+(\S+|\".+\"))?\s*\)\s*\{\s*$@', $rewrite_rule_line)){
                        $if_level += 1;
                        continue;
                    }
                    // if - check for files, directories, etc.
                    if(preg_match('@^\s*if\s+\(\s*\!?-(f|d|e|x)\s+\S+\s*\)\s*\{\s*$@', $rewrite_rule_line)){
                        $if_level += 1;
                        continue;
                    }
                    // break
                    if(preg_match('@^\s*break\s*;\s*$@', $rewrite_rule_line)){
                        $if_level += 1;
                        continue;
                    }
                    // return code [ text ]
                    if(preg_match('@^\s*return\s+\d\d\d.*;\s*$@', $rewrite_rule_line)) continue;
                    // return code URL
                    // return URL
                    if(preg_match('@^\s*return(\s+\d\d\d)?\s+(http|https|ftp)\://([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&%\$\-]+)*\@)*((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|localhost|([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\?\'\\\+&%\$#\=~_\-]+))*\s*;\s*$@', $rewrite_rule_line)) continue;
                    // set
                    if(preg_match('@^\s*set\s+\$\S+\s+\S+\s*;\s*$@', $rewrite_rule_line)) continue;
                    // closing curly bracket
                    if(trim($rewrite_rule_line) == '}'){
                        $if_level -= 1;
                        continue;
                    }
                    $rewrites_are_valid = false;
                    break;
                }
            }
            if(!$rewrites_are_valid || $if_level != 0){
                $app->tform->errorMessage .= $app->tform->lng("invalid_rewrite_rules_txt").'<br>';
            }
        }
        parent::onSubmit();
    }
interface/web/sites/web_domain_list.php
@@ -52,8 +52,8 @@
}
$list = new list_action;
$list->SQLExtWhere = "type = 'vhost' AND parent_domain_id = '0'";
$list->SQLOrderBy = 'ORDER BY domain';
$list->SQLExtWhere = "web_domain.type = 'vhost' AND web_domain.parent_domain_id = '0'";
$list->SQLOrderBy = 'ORDER BY web_domain.domain';
$list->onLoad();
?>
interface/web/sites/web_sites_stats.php
@@ -79,11 +79,97 @@
        $app->tpl_defaults();
        $app->tpl->pparse();
    }
    function getQueryString() {
        global $app;
        $sql_where = '';
        //* Generate the search sql
        if($app->listform->listDef['auth'] != 'no') {
            if($_SESSION['s']['user']['typ'] == "admin") {
                $sql_where = '';
            } else {
                $sql_where = $app->tform->getAuthSQL('r', $app->listform->listDef['table']).' and';
                //$sql_where = $app->tform->getAuthSQL('r').' and';
            }
        }
        if($this->SQLExtWhere != '') {
            $sql_where .= ' '.$this->SQLExtWhere.' and';
        }
        $sql_where = $app->listform->getSearchSQL($sql_where);
        if($app->listform->listDef['join_sql']) $sql_where .= ' AND '.$app->listform->listDef['join_sql'];
        $app->tpl->setVar($app->listform->searchValues);
        $order_by_sql = $this->SQLOrderBy;
        //* Generate SQL for paging
        $limit_sql = $app->listform->getPagingSQL($sql_where);
        $app->tpl->setVar('paging',$app->listform->pagingHTML);
        $extselect = '';
        $join = '';
        if(!empty($_SESSION['search'][$_SESSION['s']['module']['name'].$app->listform->listDef["name"].$app->listform->listDef['table']]['order'])){
          $order = str_replace(' DESC','',$_SESSION['search'][$_SESSION['s']['module']['name'].$app->listform->listDef["name"].$app->listform->listDef['table']]['order']);
          list($tmp_table, $order) = explode('.', $order);
          if($order == 'web_traffic_last_month'){
            $tmp_year = date('Y',mktime(0, 0, 0, date("m")-1, date("d"), date("Y")));
            $tmp_month = date('m',mktime(0, 0, 0, date("m")-1, date("d"), date("Y")));
            $extselect .= ', SUM(wt.traffic_bytes) as calctraffic';
            $join .= ' INNER JOIN web_traffic as wt ON '.$app->listform->listDef['table'].'.domain = wt.hostname ';
            $sql_where .= " AND YEAR(wt.traffic_date) = '$tmp_year' AND MONTH(wt.traffic_date) = '$tmp_month'";
            $order_by_sql = str_replace($app->listform->listDef['table'].'.web_traffic_last_month','calctraffic',$order_by_sql);
            $order_by_sql = "GROUP BY domain ".$order_by_sql;
          } elseif($order == 'web_traffic_this_month'){
            $tmp_year = date('Y');
            $tmp_month = date('m');
            $extselect .= ', SUM(wt.traffic_bytes) as calctraffic';
            $join .= ' INNER JOIN web_traffic as wt ON '.$app->listform->listDef['table'].'.domain = wt.hostname ';
            $sql_where .= " AND YEAR(wt.traffic_date) = '$tmp_year' AND MONTH(wt.traffic_date) = '$tmp_month'";
            $order_by_sql = str_replace($app->listform->listDef['table'].'.web_traffic_this_month','calctraffic',$order_by_sql);
            $order_by_sql = "GROUP BY domain ".$order_by_sql;
          } elseif($order == 'web_traffic_last_year'){
            $tmp_year = date('Y',mktime(0, 0, 0, date("m")-1, date("d"), date("Y")));
            $extselect .= ', SUM(wt.traffic_bytes) as calctraffic';
            $join .= ' INNER JOIN web_traffic as wt ON '.$app->listform->listDef['table'].'.domain = wt.hostname ';
            $sql_where .= " AND YEAR(wt.traffic_date) = '$tmp_year'";
            $order_by_sql = str_replace($app->listform->listDef['table'].'.web_traffic_last_year','calctraffic',$order_by_sql);
            $order_by_sql = "GROUP BY domain ".$order_by_sql;
          } elseif($order == 'web_traffic_this_year'){
            $tmp_year = date('Y');
            $extselect .= ', SUM(wt.traffic_bytes) as calctraffic';
            $join .= ' INNER JOIN web_traffic as wt ON '.$app->listform->listDef['table'].'.domain = wt.hostname ';
            $sql_where .= " AND YEAR(wt.traffic_date) = '$tmp_year'";
            $order_by_sql = str_replace($app->listform->listDef['table'].'.web_traffic_this_year','calctraffic',$order_by_sql);
            $order_by_sql = "GROUP BY domain ".$order_by_sql;
          }
        }
        if($this->SQLExtSelect != '') {
            if(substr($this->SQLExtSelect,0,1) != ',') $this->SQLExtSelect = ','.$this->SQLExtSelect;
            $extselect .= $this->SQLExtSelect;
        }
        $table_selects = array();
        $table_selects[] = trim($app->listform->listDef['table']).'.*';
        $app->listform->listDef['additional_tables'] = trim($app->listform->listDef['additional_tables']);
        if($app->listform->listDef['additional_tables'] != ''){
            $additional_tables = explode(',', $app->listform->listDef['additional_tables']);
            foreach($additional_tables as $additional_table){
                $table_selects[] = trim($additional_table).'.*';
            }
        }
        $select = implode(', ', $table_selects);
        $sql = 'SELECT '.$select.$extselect.' FROM '.$app->listform->listDef['table'].($app->listform->listDef['additional_tables'] != ''? ','.$app->listform->listDef['additional_tables'] : '')."$join WHERE $sql_where $order_by_sql $limit_sql";
        return $sql;
    }
}
$list = new list_action;
$list->SQLExtWhere = "(type = 'vhost' or type = 'vhostsubdomain')";
$list->SQLOrderBy = 'ORDER BY domain';
$list->SQLExtWhere = "(web_domain.type = 'vhost' or web_domain.type = 'vhostsubdomain')";
$list->SQLOrderBy = 'ORDER BY web_domain.domain';
$list->onLoad();
interface/web/sites/web_subdomain_list.php
@@ -47,8 +47,8 @@
$app->uses('listform_actions');
// Limit the results to alias domains
$app->listform_actions->SQLExtWhere = "type = 'subdomain'";
$app->listform_actions->SQLOrderBy = 'ORDER BY domain';
$app->listform_actions->SQLExtWhere = "web_domain.type = 'subdomain'";
$app->listform_actions->SQLOrderBy = 'ORDER BY web_domain.domain';
$app->listform_actions->onLoad();
interface/web/sites/web_vhost_subdomain_edit.php
@@ -131,7 +131,7 @@
            // Get the limits of the client
            $client_group_id = $_SESSION["s"]["user"]["default_group"];
            $client = $app->db->queryOneRecord("SELECT client.client_id, client.limit_web_subdomain, client.default_webserver, client.contact_name, CONCAT(client.company_name,' :: ',client.contact_name) as contactname, sys_group.name, client." . implode(", client.", $read_limits) . " FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
            $client = $app->db->queryOneRecord("SELECT client.client_id, client.limit_web_subdomain, client.default_webserver, client.contact_name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname, sys_group.name, client." . implode(", client.", $read_limits) . " FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
            
            //* Get global web config
            $web_config = $app->getconf->get_server_config($parent_domain['server_id'], 'web');
interface/web/sites/web_vhost_subdomain_list.php
@@ -47,8 +47,8 @@
$app->uses('listform_actions');
// Limit the results to alias domains
$app->listform_actions->SQLExtWhere = "type = 'vhostsubdomain'";
$app->listform_actions->SQLOrderBy = 'ORDER BY domain';
$app->listform_actions->SQLExtWhere = "web_domain.type = 'vhostsubdomain'";
$app->listform_actions->SQLOrderBy = 'ORDER BY web_domain.domain';
$app->listform_actions->onLoad();
interface/web/sites/webdav_user_list.php
@@ -44,7 +44,7 @@
$app->auth->check_module_permissions('sites');
$app->uses('listform_actions');
$app->listform_actions->SQLOrderBy = 'ORDER BY username';
$app->listform_actions->SQLOrderBy = 'ORDER BY webdav_user.username';
$app->listform_actions->onLoad();
interface/web/themes/default/css/styles.css
@@ -1,1843 +1,1866 @@
@charset "UTF-8";
/*
    Document   : styles.css
    Created on : 06.07.2012, 12:21:59
    Author     : Christian Foellmann (foe-services.de)
    Description:
        Basis was css-code from the "ISPConfig 3: default theme" which was based on
        "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework 3.0.6
        by Copyright 2005-2008, Dirk Jesse (http://www.yaml.de)
*/
/* overall
-------------------------------------------------------------- */
* {
    margin: 0;
    padding: 0;
}
html * { font-size: 100.01% }
body {
    font-family: "Trebuchet MS", sans-serif;
    font-size: 75.00%;
    color: #444;
    background: url("../images/screen_bg.png") repeat-x top left fixed #EEEEEE;
    padding: 10px 0;
}
ul, ol, dl { line-height: 1.5em; margin: 0 0 1em 1em }
li { margin-left: 1.5em; line-height: 1.5em }
dt { font-weight: bold }
dd { margin: 0 0 1em 2em }
a {
    color: #4D87C7;
    text-decoration:none;
}
a:focus,
a:hover,
a:active {
    color:#182E7A;
    text-decoration:underline;
}
hr {
    color: #fff;
    background:transparent;
    margin: 0 0 0.5em 0;
    padding: 0 0 0.5em 0;
    border:0;
    border-bottom: 1px #eee solid;
}
textarea, pre, tt, code {
    font-family: Consolas,"Lucida Console","Courier New",monospace;
    font-size: 0.9em;
}
h1,h2,h3,h4,h5,h6 {
    font-family: "Trebuchet MS", sans-serif;
    font-weight:bold;
    color:#666;
    margin: 0 0 0.25em 0;
}
h1 { font-size: 200% }                        /* 24px */
h2 { font-size: 200% }                        /* 24px */
h3 { font-size: 150% }                        /* 18px */
h4 { font-size: 133.33% }                     /* 16px */
h5 { font-size: 116.67% }                     /* 14px */
h6 { font-size: 116.67%; font-style:italic }  /* 14px */
p { line-height: 1.5em; margin: 0 0 1em 0; }
cite, blockquote { font-style:italic }
blockquote { margin: 0 0 1em 1.5em }
strong,b { font-weight: bold }
em,i { font-style:italic }
pre, code { font-family: monospace; font-size: 1.1em; }
acronym, abbr {
    letter-spacing: .07em;
    border-bottom: .1em dashed #c00;
    cursor: help;
}
header, #nav, #main, footer {
    clear: both;
}
#page {
    min-width: 980px;
    max-width: 80%;
    background: #fff;
    text-align:left;
    margin: 0 auto;
    padding: 10px;
}
.skip, .hideme, .print {
    height: 1px;
    left: -1000em;
    position: absolute;
    top: -1000em;
    width: 1px;
}
/* header
-------------------------------------------------------------- */
header {
    position: relative;
    color: #faf0e6;
    padding: 15px 2em 5px 20px;
    background: url("../images/header_bg.png") repeat-x top left #9a9a9a;
}
header h1 {
    font-size:2.5em;
    letter-spacing:-2px;
    line-height:65%;
    color: silver;
}
header span {
    color: #333333;
}
/* header/topsubnav
-------------------------------------------------------------- */
#topsubnav {
    position:absolute;
    top: 10px;
    right: 10px;
    text-align: right;
}
#topsubnav a {
    color: #f0f8ff;
    font-weight: normal;
    background:transparent;
    text-decoration:none;
}
#topsubnav a:focus,
#topsubnav a:hover,
#topsubnav a:active {
    text-decoration:underline;
    background-color: transparent;
}
/* nav
-------------------------------------------------------------- */
#topNav ul {
    list-style: none;
    padding: 0 0 0 20px;
    margin: 0;
    background: #9a9a9a
}
#topNav ul li {
    display: inline;
    margin: 0 2px 0 0;
}
#topNav a {
    background: url("../icons/x32_sprite.png") no-repeat #D3D3D3;
    color:black;
    display:inline-block;
    height:20px;
    padding-top:37px;
    text-align:center;
    text-decoration:none;
    min-width:78px;
}
#topNav a:hover {
    background-color: #eeeeee;
    color: #000000;
}
#topNav #topNav_current a {
    font-weight: bold;
    color: black;
    background-color: #ffffff;
}
.topnav-tools { background-position: 22px -10px !important; }
.topnav-admin { background-position: 22px -74px !important; }
.topnav-sites { background-position: 22px -523px !important; }
.topnav-monitor { background-position: 22px -585px !important; }
.topnav- { background-position: 22px -650px !important; }
.topnav-help { background-position: 22px -715px !important; }
.topnav-mail { background-position: 22px -780px !important; }
.topnav-mailuser { background-position: 22px -780px !important; }
.topnav-vm { background-position: 22px -842px !important; }
.topnav-domain { background-position: 22px -905px !important; }
.topnav-dns { background-position: 22px -970px !important; }
.topnav-dashboard { background-position: 22px -1035px !important; }
.topnav-client { background-position: 22px -1098px !important; }
.topnav-billing { background-position: 22px -1162px !important; }
#topNav a span {
            padding: 0 3px;
        }
/* main
-------------------------------------------------------------- */
#main {
    background: #fff;
    padding: 1em 0;
}
/* main/sideNav + submenu
-------------------------------------------------------------- */
#sideNav {
    width: 200px;
    float:left;
    padding: 0 10px 0 0;
}
#submenu {
    width: 100%;
    overflow: hidden;
    margin: 0px;
    list-style-type: none;
    border-bottom: 2px #ddd solid;
}
#submenu ul {
    list-style-type: none;
    margin:0;
    padding: 0;
}
#submenu li {
    float:left;
    width: 100%;
    margin:0;
    padding: 0;
    font-size:0.9em;
}
#submenu a,
#submenu strong {
    display:block;
    width: 90%;
    padding: 2px 0px 2px 10%;
    text-decoration: none;
    background-color:#fff;
    color: #444;
    border-bottom: 1px #eee solid;
}
/* Menu Title */
#submenu li.title {
    width: 100%;
    padding: 0px;
    font-weight: bold;
    color: #444;
    background-color: #fff;
    border-top: 2px #888 solid;
    font-size: 1.1em;
}
#submenu li.title a {
    background-color: #f0f8ff;
    color: #444;
}
#submenu li.title a:hover {
    color: white;
}
#submenu li span {
    display:block;
    width: 90%;
    padding: 3px 0px 3px 10%;
    font-weight: bold;
    border-bottom: 1px #ddd solid;
}
/* Level 1 */
#submenu li.active,
#submenu li strong {
    width: 90%;
    padding: 3px 0px 3px 10%;
    font-weight: bold;
    color: #fff;
    background-color:#aab;
    border-bottom: 1px #eee solid;
}
#submenu li a {
    width: 90%;
    padding-left: 10%;
    background-color:#fff;
    color: #444;
}
#submenu li a:focus,
#submenu li a:hover,
#submenu li a:active {
    background-color:#f63;
    color: #fff;
}
/* Form-Elements in the Menu*/
#submenu * select#server_id {
    margin: 3px 10%;
    padding: 1px;
    width: 80%;
}
/* main/content
-------------------------------------------------------------- */
#content {
    margin-left: 200px;
    margin-right: 0;
    padding: 0px 10px 10px 20px;
    border-left: 1px #ddd solid;
}
/* footer
-------------------------------------------------------------- */
footer {
    color:#666;
    background: #f9f9f9;
    padding: 10px 20px;
    border-top: 5px #efefef solid;
    font-size: 0.8em;
    text-align: center;
}
footer a {
    color: #999;
    background:transparent;
    font-weight: bold;
}
footer a:hover, footer a:active {
    color: #4D87C7;
    background-color: transparent;
    text-decoration:underline;
}
/* Set a background-color, no system backgorund used anymore */
select, input, textarea {
    background: #FFFFFF;
    border: 1px solid #DFDFDF;
    padding: 1px;
    outline:none;
}
table { width: auto; border-collapse:collapse; margin-bottom: 0.5em; }
table.full { width: 100%; }
table.fixed { table-layout:fixed }
table.list td {
    max-width: 350px;
    min-width: 32px;
    white-space: nowrap;
    overflow:hidden;
    text-overflow: ellipsis;
    -o-text-overflow: ellipsis;
    -icab-text-overflow: ellipsis;
    -khtml-text-overflow: ellipsis;
    -moz-text-overflow: ellipsis;
    -webkit-text-overflow: ellipsis;
}
th,
td {
    padding: 0.5em;
    text-align:left;
}
thead th {
    background: #444 url("../images/lists_thead_bg.png") repeat-x;
    color: #fff;
}
tbody th {
    background: #ccc;
    color: #333;
}
tbody th.sub {
    background: #ddd;
    color: #333;
}
table.list th[class$="_pid"],
table.list td[class$="_pid"],
table.list th[class$="_active"],
table.list td[class$="_active"],
table.list th.tbl_col_autoresponder,
table.list td.tbl_col_autoresponder {
    width: 70px;
    text-align: center;
}
table.list .tbl_col_buttons,
table.list .tbl_col_limit {
    width: 150px;
}
.tbl_col_client_pid input {
    width: 50px;
}
.pnl_listarea th[class^="tbl_col"] { cursor:pointer; }
.pnl_listarea th[class^="tbl_col"]:hover { background-position:0 -15px!important; }
.pnl_listarea th.tbl_col_nosort { cursor:default; }
.pnl_listarea th.tbl_col_nosort:hover { background-position:0 0!important; }
.pageForm_description { font-size: 12px; }
/* Tab-Box */
.tabbox_tabs { border-bottom: 1px solid #d3d3d3; }
.tabbox_tabs ul {
    list-style: none;
    padding: 0;
    margin: 0;
}
.tabbox_tabs li {
    display: inline;
    margin: 0 2px 0 0;
}
.tabbox_tabs a {
    padding: 0 1em;
    text-decoration: none;
    color: black;
    background: #d3d3d3;
    border: 1px solid #d3d3d3;
}
.tabbox_tabs a:hover {
    background: #fc0;
    color: #540;
}
.tabbox_tabs .active a {
    font-weight: bold;
    color: #ff6600;
    background: #ffffff;
}
.pnl_toolsarea fieldset, .pnl_listarea fieldset, .pnl_formsarea fieldset {
    border-top: 1px solid #949494;
    margin: 20px 0;
}
.pnl_toolsarea fieldset legend , .pnl_listarea fieldset legend {
    font-weight: bold;
    color: #6299c5;
}
.pnl_formarea fieldset {
    font-weight: bold;
}
/* hide line and legend when inside tabbed content */
#tabbox_content * .pnl_toolsarea fieldset, #tabbox_content * .pnl_listarea fieldset, #tabbox_content * .pnl_formsarea fieldset { border: none !important; }
#tabbox_content * .pnl_toolsarea fieldset legend, #tabbox_content * .pnl_listarea fieldset legend, #tabbox_content * .pnl_formsarea fieldset legend { display: none !important; }
.codeview {
    margin:20px 0;
    padding:2px;
    border: 1px solid #ffcc00;
    background: #fffaea;
    font-family: Consolas, "Lucida Console", "Courier New", monospace;
    font-size: 0.9em;
}
.codeview .logerror { background: rgb(255,0,0); }
.codeview .logwarn { background: rgb(255,204,0); }
.codeview .loginfo { background: rgb(153,204,255); }
/* Lists */
table.list {
    width: 100%;
    border: 1px solid #d3d3d3 !important;
}
table.list thead th { font-size: 10px; }
table.list tbody { border: 1px solid #d3d3d3 !important; }
table.list tfoot td { text-align: center;  background: #f8f8f8 url("../images/lists_tfoot_bg.png") repeat-x bottom left;  padding: 24px 8px 8px 8px; }
table.list .tbl_paging img { vertical-align: top; }
table.list .tbl_row_even { background: #fcfcfc; }
table.list .tbl_row_uneven { background: #f0f8ff; }
table.list tr:hover { background: #fffacd; }
table.list td { word-wrap:break-word;white-space:pre-wrap; }
table.list td.tbl_col_buttons { word-wrap:normal;white-space:normal;overflow:visible; }
/* Password Strength */
#passBar {
    width: 101px; height: 10px;
    background: url("../images/meter_bg.gif") repeat-x bottom left;
    margin: 2px 0;
    float: left;
}
#passText {
    padding: 0;
    float: left;
}
/* Systemmonitor */
.systemmonitor-server,
.systemmonitor-ve,
.systemmonitor-state {
    margin: 10px 5px;
    font-family: Consolas, "Lucida Console", "Courier New", monospace;
    font-size: 0.9em;
    float: left;
    width: 100%;
}
.systemmonitor-server:hover,
.systemmonitor-vm:hover { background-color: #FFFACD; }
.state-no_state,
.state-no_state-ve {
    border-top: 4px solid #95A19F;
    background-color: #f8f8ff;
}
.state-unknown,
.state-unknown-ve {
    border-top: 4px solid #30302e;
    background-color: #cecfc5;
}
.state-ok,
.state-ok-ve {
    border-top: 4px solid #23fb00;
    background-color: #adffa2;
}
.state-info,
.state-info-ve {
    border-top: 4px solid #183e99;
    background-color: #d4e2ff;
}
.state-warning,
.state-warning-ve {
    border-top: 4px solid #ffa800;
    background-color: #ffda93;
}
.state-critical,
.state-critical-ve {
    border-top: 4px solid #ff0000;
    background-color: #ffb9b9;
}
.state-error,
.state-error-ve {
    border-top: 4px solid #ff0000;
    background-color: #ff7f7f;
}
div.icoDevice {
    float: left;
    width: 64px;
    height: 64px;
    margin: 5px;
    background: url("../icons/device_sprite.png") no-repeat transparent;
}
.systemmonitor-server div.icoDevice { background-position: 0 0; }
.systemmonitor-ve div.icoDevice { background-position: -64px 0; }
.systemmonitor-network div.icoDevice { background-position: -128px 0; }
div.statusDevice,
div.statusMsg { float: left; }
div.statusMsg p {
    float: left;
    padding: 5px;
}
.systemmonitor-state .status {
    margin: 5px;
}
.status {
    float: right;
    width: 32px;
    height: 32px;
    background: url("../icons/x32_sprite.png") no-repeat transparent;
}
div.status {
    float: left !important;
}
.state-warning .status,
.state-warning-ve .status { background-position: 0 -143px; }
.state-no_state .status,
.state-no_state-ve .status,
.state-unknown .status,
.state-unknown-ve .status { background-position: 0 -207px; }
.state-ok .status,
.state-ok-ve .status { background-position: 0 -270px; }
.state-info .status,
.state-info-ve .status { background-position: 0 -336px; }
.state-error .status,
.state-error-ve .status { background-position: 0 -400px; }
.state-critical .status,
.state-critical-ve .status { background-position: 0 -463px; }
/* Usage unknown
.systemmonitor-content table {
    border: none;
    margin-top: 10px;
}
.systemmonitor-content * .online {
    border: 1px solid #ffffff;
    background-color: #E3FFB8;
    color: #000000;
    padding:0px 5px;
}
.systemmonitor-content * .offline {
    border: 1px solid #ffffff;
    background-color: #d12f19;
    color:#ffffff;
    padding:0px 5px;
}*/
/* Dashboard */
.dashboard-modules {
    float:left;
    width:60px;
    height: 60px;
    border:1px dotted #888888;
    background-color: #cccccc;
    margin:10px;
    background-position: center 5px;
    background-repeat: no-repeat;
    text-align: center;
}
.dashboard-modules a,
.dashboard-modules a:hover {
    background: url("../icons/x32_sprite.png") no-repeat transparent;
    color:Black;
    display:block;
    font-weight:bold;
    height:30px;
    padding-top:42px;
    width:60px;
    text-decoration: none;
}
.dashboard-modules.tools a { background-position: 12px -9px; }
.dashboard-modules.admin a { background-position: 12px -73px; }
.dashboard-modules.sites a { background-position: 12px -520px; }
.dashboard-modules.monitor a { background-position: 13px -585px; }
.dashboard-modules.help a { background-position: 13px -716px; }
.dashboard-modules.mail a { background-position: 12px -776px; }
.dashboard-modules.vm a { background-position: 14px -842px; }
.dashboard-modules.domain a { background-position: 12px -905px; }
.dashboard-modules.dns a { background-position: 12px -970px; }
.dashboard-modules.client a { background-position: 13px -1096px; }
.dashboard-modules.billing a { background-position: 14px -1162px; }
.panel_dashboard h2 { font-size:20px; }
/* Image-Replacement */
.swap { background-repeat:no-repeat; }
.swap span { display:none; height:16px; }
#ir-HeaderLogo {
    background-image: url("../images/header_logo.png");
    height:32px;
    margin:0 0 0.2em;
}
div#ir-Yes,
div#ir-No {
    text-align: center;
    background: url("../icons/x16_sprite.png") no-repeat transparent;
}
#ir-Yes {
    background-position: center -342px !important;
    height: 16px;
}
#ir-No {
    background-position: center -362px !important;
    height: 16px;
}
.swap {
    background-repeat: no-repeat;
}
.swap span {
    display: none;
    height: 16px;
}
/* BUTTONS */
a.button,
.button,
.buttons button {
    display: inline-block;
    margin: 0 2px;
    padding: 2px 5px;
    color: #525252;
    text-shadow: 0px 1px 1px #fff;
    border: 1px solid #c6c6c6;
    border-radius: 4px;
    background-color: #f7f7f7;
    box-shadow: 0 1px 1px 0 rgba(140, 140, 140, 0.3);
    -o-box-shadow: 0 1px 1px 0 rgba(140, 140, 140, 0.3);
    -webkit-box-shadow: 0 1px 1px 0 rgba(140, 140, 140, 0.3);
    -moz-box-shadow: 0 1px 1px 0 rgba(140, 140, 140, 0.3);
    text-decoration: none;
}
a.button:focus,
input.button:focus,
.buttons button:focus {
    border-color: #4fadd5;
    box-shadow: 0 0 2px 1px rgba(71,135,177, 0.6);
    -moz-box-shadow: 0 0 2px 1px rgba(71,135,177, 0.6);
    -webkit-box-shadow: 0 0 2px 1px rgba(71,135,177, 0.6);
    -o-box-shadow: 0 0 2px 1px rgba(71,135,177, 0.6);
    outline: none;
}
.buttons button[type]{
    padding:5px 10px 5px 7px; /* Firefox */
    line-height:17px; /* Safari */
    white-space: nowrap;
}
*:first-child+html button[type]{
    padding:4px 10px 3px 7px; /* IE7 */
}
.buttons button img,
.buttons a img {
    margin:0 3px -3px 0 !important;
    padding:0;
    border:none;
    width:16px;
    height:16px;
}
.topbuttons {
    margin-bottom: 10px;
}
/* BUTTONS STANDARD */
button:hover,
.buttons a:hover {
    background-color:#dff4ff;
    border:1px solid #c2e1ef;
    color:#336699;
}
.buttons a:active {
    background-color:#6299c5;
    border:1px solid #6299c5;
    color:#fff;
}
/* BUTTONS POSITIVE */
button.positive,
.buttons a.positive { color:#529214; }
.buttons a.positive:hover,
button.positive:hover {
    background-color:#E6EFC2;
    border:1px solid #C6D880;
    color:#529214;
}
.buttons a.positive:active {
    background-color:#529214;
    border:1px solid #529214;
    color:#fff;
}
/* BUTTONS NEGATIVE */
.buttons a.negative,
button.negative {
    color:#d12f19;
}
.buttons a.negative:hover,
button.negative:hover {
    background-color:#fbe3e4;
    border:1px solid #fbc2c4;
    color:#d12f19;
}
.buttons a.negative:active {
    background-color:#d12f19;
    border:1px solid #d12f19;
    color:#fff;
}
/* Button with icon and text */
.iconstxt { background: url("../icons/button_sprite.png") no-repeat transparent; }
.iconstxt span { padding-left: 20px; font-weight: bold; }
.iconstxt.icoPositive { background-position: 6px -130px; }
.iconstxt.icoNegative { background-position: 6px -98px; }
.iconstxt.icoAdd { background-position: 6px -66px; }
.iconstxt.icoKey { background-position: 6px -1px; }
.iconstxt.icoDelete { background-position: 6px -34px; }
.iconstxt.icoDownload { background-position: 6px -1px; }
.iconstxt.icoRestore { background-position: 6px -1px; }
/* Button with icon and without text */
.icons16 { position: relative; }
.icons16>span {
    opacity: 0;
    visibility: hidden;
    -webkit-transition: opacity 1s linear;
    -moz-transition: opacity 1s linear;
    -o-transition: opacity 1s linear;
    -ms-transition: opacity 1s linear;
    transition: opacity 1s linear;
    position: absolute;
    right: 23px;
    top: -1px;
    padding: 1px 2px;
    border: 1px solid rgb(155,155,11);
    background: rgb(255,255,111);
    white-space: nowrap;
}
.icons16:hover>span {
    opacity: 1.0;
    visibility: visible;
}
a.icons16 {
    height: 18px;
    width: 18px;
    padding: 0;
    background: url("../icons/x16_sprite.png") no-repeat transparent;
}
button.icons16 {
    height: 20px;
    width: 20px;
    padding: 0;
    background: url("../icons/x16_sprite.png") no-repeat transparent;
}
.icons16.icoEdit { background-position: -1px -1px; }
.icons16.icoLoginAs { background-position: -1px -21px; }
.icons16.icoPDF { background-position: -1px -61px; }
.icons16.icoDelete { background-position: -1px -81px; }
.icons16.icoWebmailer { background-position: -1px -101px; }
.icons16.icoFilter { background-position: -1px -161px; }
.icons16.icoDbAdmin { background-position: -1px -221px; }
.icons16.icoAction { background-position: -1px -241px; }
.icons16.icoLink { background-position: -1px -422px; float: right; }
div.group-icon {
    float: left;
    padding: 2px 0;
}
.group-admin,
.group-user {
    height: 20px;
    width: 20px;
    padding: 0;
    float: left;
    background: url("../icons/x16_sprite.png") no-repeat transparent;
}
.group-admin { background-position: 0 -380px; }
.group-user { background-position: 0 -400px; }
span.marked { color: #cc0000; }
span.small { font-size: 0.9em; }
#ajaxloader {
    position: absolute;
    width: 325px;
    height: 150px;
    background: #ffffff url('../images/ajax-loader.gif') no-repeat center center;
    border: solid 2px #e1e1e1;
    border-radius: 10px;
    /*background: rgba(255, 255, 255, 0.85);*/
    padding: 20px;
    text-align:center;
    z-index: 100;
}
.blockLabel.email_at {
    width: 20px !important;
    margin: 1.6em 0.3em 0 0 !important;
}
.textDisplay { display: block; }
/* Form Length Classes */
.textInput.formLengthBool { width: 25px !important; }
.selectInput.formLengthBool { width: 60px !important; }
.textInput.formLengthLimit { width: 50px !important; }
.selectInput.formLengthLimit { width: 85px !important; }
.formLengthDate { width: 75px !important; }
.formLengthIPv4 { width: 125px !important; }
.formLengthIPv6 { width: 100% !important; }
.formLengthEmailUser { width: 30% !important; }
.formLengthEmailDomain { width: 30% !important; }
.formLengthHalf { width: 15% !important; }
.formLengthDouble { width: 50% !important; }
/* Individual Form Lengths */
.textInput#username,
.textInput#password,
.textInput#passwort,
.textInput#source_password { width: 100px; }
.selectInput#language {    width: 75px; }
.selectInput#client_group_id, .selectInput#default_group { width: 125px; }
input#refresh, input#retry, input#expire, input#minimum, input#ttl { width: 50px !important; }
/* --- */
a[href $="#logout"] {
    padding-right: 20px;
    background: url("../icons/x16_sprite.png") no-repeat right -143px transparent !important;
}
/* Select Menu with Images */
select.withicons option {
    background-repeat:no-repeat;
    background-position: 1px;
    padding-left:24px;
}
div[class^=country-] {
    background-image: url("../icons/flags_sprite.png");
    background-repeat: no-repeat;
    height: 20px;
    width: 26px;
}
li[class^=country-] {
    background-image: url("../icons/flags_sprite.png");
    background-repeat: no-repeat;
    text-indent: 24px;
}
li[class^=country-] a.ui-state-hover { background: transparent; }
div[class^=country-] span {
    display: none;
}
select.flags option {
    background-image: url("../icons/flags_sprite.png");
    background-repeat: no-repeat;
    padding: 1px 0 1px 30px;
}
select.flags option[value=EL] {background-position:0 -1475px}
select.flags option[value=AD], select.flags option[value=ad], .country-AD {background-position:0 -1px}
select.flags option[value=AE], select.flags option[value=ae], .country-AE {background-position:0 -23px}
select.flags option[value=AF], select.flags option[value=af], .country-AF {background-position:0 -45px}
select.flags option[value=AG], select.flags option[value=ag], .country-AG {background-position:0 -67px}
select.flags option[value=AI], select.flags option[value=ai], .country-AI {background-position:0 -89px}
select.flags option[value=AL], select.flags option[value=al], .country-AL {background-position:0 -111px}
select.flags option[value=AM], select.flags option[value=am], .country-AM {background-position:0 -133px}
select.flags option[value=AN], select.flags option[value=an], .country-AN {background-position:0 -155px}
select.flags option[value=AO], select.flags option[value=ao], .country-AO {background-position:0 -177px}
select.flags option[value=AQ], select.flags option[value=aq], .country-AQ {background-position:0 -199px}
select.flags option[value=AR], select.flags option[value=ar], .country-AR {background-position:0 -221px}
select.flags option[value=AS], select.flags option[value=as], .country-AS {background-position:0 -243px}
select.flags option[value=AT], select.flags option[value=at], .country-AT {background-position:0 -265px}
select.flags option[value=AU], select.flags option[value=au], .country-AU {background-position:0 -287px}
select.flags option[value=AW], select.flags option[value=aw], .country-AW {background-position:0 -309px}
select.flags option[value=AX], select.flags option[value=ax], .country-AX {background-position:0 -331px}
select.flags option[value=AZ], select.flags option[value=az], .country-AZ {background-position:0 -353px}
select.flags option[value=BA], select.flags option[value=ba], .country-BA {background-position:0 -375px}
select.flags option[value=BB], select.flags option[value=bb], .country-BB {background-position:0 -397px}
select.flags option[value=BD], select.flags option[value=bd], .country-BD {background-position:0 -419px}
select.flags option[value=BE], select.flags option[value=be], .country-BE {background-position:0 -441px}
select.flags option[value=BF], select.flags option[value=bf], .country-BF {background-position:0 -463px}
select.flags option[value=BG], select.flags option[value=bg], .country-BG {background-position:0 -485px}
select.flags option[value=BH], select.flags option[value=bh], .country-BH {background-position:0 -507px}
select.flags option[value=BI], select.flags option[value=bi], .country-BI {background-position:0 -529px}
select.flags option[value=BJ], select.flags option[value=bj], .country-BJ {background-position:0 -551px}
select.flags option[value=BM], select.flags option[value=bm], .country-BM {background-position:0 -573px}
select.flags option[value=BN], select.flags option[value=bn], .country-BN {background-position:0 -595px}
select.flags option[value=BO], select.flags option[value=bo], .country-BO {background-position:0 -617px}
select.flags option[value=BR], select.flags option[value=br], .country-BR {background-position:0 -639px}
select.flags option[value=BS], select.flags option[value=bs], .country-BS {background-position:0 -661px}
select.flags option[value=BT], select.flags option[value=bt], .country-BT {background-position:0 -683px}
select.flags option[value=BV], select.flags option[value=bv], .country-BV {background-position:0 -705px}
select.flags option[value=BW], select.flags option[value=bw], .country-BW {background-position:0 -727px}
select.flags option[value=BY], select.flags option[value=by], .country-BY {background-position:0 -749px}
select.flags option[value=BZ], select.flags option[value=bz], .country-BZ {background-position:0 -771px}
select.flags option[value=CA], select.flags option[value=ca], .country-CA {background-position:0 -793px}
select.flags option[value=CC], select.flags option[value=cc], .country-CC {background-position:0 -837px}
select.flags option[value=CD], select.flags option[value=cd], .country-CD {background-position:0 -859px}
select.flags option[value=CF], select.flags option[value=cf], .country-CF {background-position:0 -881px}
select.flags option[value=CG], select.flags option[value=cg], .country-CG {background-position:0 -903px}
select.flags option[value=CH], select.flags option[value=ch], .country-CH {background-position:0 -925px}
select.flags option[value=CI], select.flags option[value=ci], .country-CI {background-position:0 -947px}
select.flags option[value=CK], select.flags option[value=ck], .country-CK {background-position:0 -969px}
select.flags option[value=CL], select.flags option[value=cl], .country-CL {background-position:0 -991px}
select.flags option[value=CM], select.flags option[value=cm], .country-CM {background-position:0 -1013px}
select.flags option[value=CN], select.flags option[value=cn], .country-CN {background-position:0 -1035px}
select.flags option[value=CO], select.flags option[value=co], .country-CO {background-position:0 -1057px}
select.flags option[value=CR], select.flags option[value=cr], .country-CR {background-position:0 -1079px}
select.flags option[value=CS], select.flags option[value=cs], .country-CS {background-position:0 -1101px}
select.flags option[value=CU], select.flags option[value=cu], .country-CU {background-position:0 -1123px}
select.flags option[value=CV], select.flags option[value=cv], .country-CV {background-position:0 -1145px}
select.flags option[value=CX], select.flags option[value=cx], .country-CX {background-position:0 -1167px}
select.flags option[value=CY], select.flags option[value=cy], .country-CY {background-position:0 -1189px}
select.flags option[value=CZ], select.flags option[value=cz], .country-CZ {background-position:0 -1211px}
select.flags option[value=DE], select.flags option[value=de], .country-DE {background-position:0 -1233px}
select.flags option[value=DJ], select.flags option[value=dj], .country-DJ {background-position:0 -1255px}
select.flags option[value=DK], select.flags option[value=dk], .country-DK {background-position:0 -1277px}
select.flags option[value=DM], select.flags option[value=dm], .country-DM {background-position:0 -1299px}
select.flags option[value=DO], select.flags option[value=do], .country-DO {background-position:0 -1321px}
select.flags option[value=DZ], select.flags option[value=dz], .country-DZ {background-position:0 -1343px}
select.flags option[value=EC], select.flags option[value=ec], .country-EC {background-position:0 -1365px}
select.flags option[value=EE], select.flags option[value=ee], .country-EE {background-position:0 -1387px}
select.flags option[value=EG], select.flags option[value=eg], .country-EG {background-position:0 -1409px}
select.flags option[value=EH], select.flags option[value=eh], .country-EH {background-position:0 -1431px}
select.flags option[value=ER], select.flags option[value=er], .country-ER {background-position:0 -1475px}
select.flags option[value=ES], select.flags option[value=es], .country-ES {background-position:0 -1497px}
select.flags option[value=ET], select.flags option[value=ET], select.flags option[value=et], .country-ET {background-position:0 -1519px}
select.flags option[value=FI], select.flags option[value=fi], .country-FI {background-position:0 -1585px}
select.flags option[value=FJ], select.flags option[value=fj], .country-FJ {background-position:0 -1607px}
select.flags option[value=FK], select.flags option[value=fk], .country-FK {background-position:0 -1629px}
select.flags option[value=FM], select.flags option[value=fm], .country-FM {background-position:0 -1651px}
select.flags option[value=FO], select.flags option[value=fo], .country-FO {background-position:0 -1673px}
select.flags option[value=FR], select.flags option[value=fr], .country-FR {background-position:0 -1695px}
select.flags option[value=GA], select.flags option[value=ga], .country-GA {background-position:0 -1717px}
select.flags option[value=GB], select.flags option[value=en], select.flags option[value=gb], .country-GB, .country-EN {background-position:0 -1739px}
select.flags option[value=GD], select.flags option[value=gd], .country-GD {background-position:0 -1761px}
select.flags option[value=GE], select.flags option[value=ge], .country-GE {background-position:0 -1783px}
select.flags option[value=GF], select.flags option[value=gf], .country-GF {background-position:0 -1805px}
select.flags option[value=GH], select.flags option[value=gh], .country-GH {background-position:0 -1827px}
select.flags option[value=GI], select.flags option[value=gi], .country-GI {background-position:0 -1849px}
select.flags option[value=GL], select.flags option[value=gl], .country-GL {background-position:0 -1871px}
select.flags option[value=GM], select.flags option[value=gm], .country-GM {background-position:0 -1893px}
select.flags option[value=GN], select.flags option[value=gn], .country-GN {background-position:0 -1915px}
select.flags option[value=GP], select.flags option[value=gp], .country-GP {background-position:0 -1937px}
select.flags option[value=GQ], select.flags option[value=gq], .country-GQ {background-position:0 -1959px}
select.flags option[value=GR], select.flags option[value=el], select.flags option[value=gr], .country-GR, .country-EL {background-position:0 -1981px}
select.flags option[value=GS], select.flags option[value=gs], .country-GS {background-position:0 -2003px}
select.flags option[value=GT], select.flags option[value=gt], .country-GT {background-position:0 -2025px}
select.flags option[value=GU], select.flags option[value=gu], .country-GU {background-position:0 -2047px}
select.flags option[value=GW], select.flags option[value=gw], .country-GW {background-position:0 -2069px}
select.flags option[value=GY], select.flags option[value=gy], .country-GY {background-position:0 -2091px}
select.flags option[value=HK], select.flags option[value=hk], .country-HK {background-position:0 -2113px}
select.flags option[value=HM], select.flags option[value=hm], .country-HM {background-position:0 -2135px}
select.flags option[value=HN], select.flags option[value=hn], .country-HN {background-position:0 -2157px}
select.flags option[value=HR], select.flags option[value=hr], .country-HR {background-position:0 -2179px}
select.flags option[value=HT], select.flags option[value=ht], .country-HT {background-position:0 -2201px}
select.flags option[value=HU], select.flags option[value=hu], .country-HU {background-position:0 -2223px}
select.flags option[value=ID], select.flags option[value=id], .country-ID {background-position:0 -2245px}
select.flags option[value=IE], select.flags option[value=ie], .country-IE {background-position:0 -2267px}
select.flags option[value=IL], select.flags option[value=il], .country-IL {background-position:0 -2289px}
select.flags option[value=IN], select.flags option[value=in], .country-IN {background-position:0 -2311px}
select.flags option[value=IO], select.flags option[value=io], .country-IO {background-position:0 -2333px}
select.flags option[value=IQ], select.flags option[value=iq], .country-IQ {background-position:0 -2355px}
select.flags option[value=IR], select.flags option[value=ir], .country-IR {background-position:0 -2377px}
select.flags option[value=IS], select.flags option[value=is], .country-IS {background-position:0 -2399px}
select.flags option[value=IT], select.flags option[value=it], .country-IT {background-position:0 -2421px}
select.flags option[value=JM], select.flags option[value=jm], .country-JM {background-position:0 -2443px}
select.flags option[value=JO], select.flags option[value=jo], .country-JO {background-position:0 -2465px}
select.flags option[value=JP], select.flags option[value=ja], select.flags option[value=jp], .country-JP, .country-JA {background-position:0 -2487px}
select.flags option[value=KE], select.flags option[value=ke], .country-KE {background-position:0 -2509px}
select.flags option[value=KG], select.flags option[value=kg], .country-KG {background-position:0 -2531px}
select.flags option[value=KH], select.flags option[value=kh], .country-KH {background-position:0 -2553px}
select.flags option[value=KI], select.flags option[value=ki], .country-KI {background-position:0 -2575px}
select.flags option[value=KM], select.flags option[value=km], .country-KM {background-position:0 -2597px}
select.flags option[value=KN], select.flags option[value=kn], .country-KN {background-position:0 -2619px}
select.flags option[value=KP], select.flags option[value=kp], .country-KP {background-position:0 -2641px}
select.flags option[value=KR], select.flags option[value=kr], .country-KR {background-position:0 -2663px}
select.flags option[value=KW], select.flags option[value=kw], .country-KW {background-position:0 -2685px}
select.flags option[value=KY], select.flags option[value=ky], .country-KY {background-position:0 -2707px}
select.flags option[value=KZ], select.flags option[value=kz], .country-KZ {background-position:0 -2729px}
select.flags option[value=LA], select.flags option[value=la], .country-LA {background-position:0 -2751px}
select.flags option[value=LB], select.flags option[value=lb], .country-LB {background-position:0 -2773px}
select.flags option[value=LC], select.flags option[value=lc], .country-LC {background-position:0 -2795px}
select.flags option[value=LI], select.flags option[value=li], .country-LI {background-position:0 -2817px}
select.flags option[value=LK], select.flags option[value=lk], .country-LK {background-position:0 -2839px}
select.flags option[value=LR], select.flags option[value=lr], .country-LR {background-position:0 -2861px}
select.flags option[value=LS], select.flags option[value=ls], .country-LS {background-position:0 -2883px}
select.flags option[value=LT], select.flags option[value=lt], .country-LT {background-position:0 -2905px}
select.flags option[value=LU], select.flags option[value=lu], .country-LU {background-position:0 -2927px}
select.flags option[value=LV], select.flags option[value=lv], .country-LV {background-position:0 -2949px}
select.flags option[value=LY], select.flags option[value=ly], .country-LY {background-position:0 -2971px}
select.flags option[value=MA], select.flags option[value=ma], .country-MA {background-position:0 -2993px}
select.flags option[value=MC], select.flags option[value=mc], .country-MC {background-position:0 -3015px}
select.flags option[value=MD], select.flags option[value=md], .country-MD {background-position:0 -3037px}
select.flags option[value=ME], select.flags option[value=me], .country-ME {background-position:0 -3059px}
select.flags option[value=MG], select.flags option[value=mg], .country-MG {background-position:0 -3081px}
select.flags option[value=MH], select.flags option[value=mh], .country-MH {background-position:0 -3103px}
select.flags option[value=MK], select.flags option[value=mk], .country-MK {background-position:0 -3125px}
select.flags option[value=ML], select.flags option[value=ml], .country-ML {background-position:0 -3147px}
select.flags option[value=MM], select.flags option[value=mm], .country-MM {background-position:0 -3169px}
select.flags option[value=MN], select.flags option[value=mn], .country-MN {background-position:0 -3191px}
select.flags option[value=MO], select.flags option[value=mo], .country-MO {background-position:0 -3213px}
select.flags option[value=MP], select.flags option[value=mp], .country-MP {background-position:0 -3235px}
select.flags option[value=MQ], select.flags option[value=mq], .country-MQ {background-position:0 -3257px}
select.flags option[value=MR], select.flags option[value=mr], .country-MR {background-position:0 -3279px}
select.flags option[value=MS], select.flags option[value=ms], .country-MS {background-position:0 -3301px}
select.flags option[value=MT], select.flags option[value=mt], .country-MT {background-position:0 -3323px}
select.flags option[value=MU], select.flags option[value=mu], .country-MU {background-position:0 -3345px}
select.flags option[value=MV], select.flags option[value=mv], .country-MV {background-position:0 -3367px}
select.flags option[value=MW], select.flags option[value=mw], .country-MW {background-position:0 -3389px}
select.flags option[value=MX], select.flags option[value=mx], .country-MX {background-position:0 -3411px}
select.flags option[value=MY], select.flags option[value=my], .country-MY {background-position:0 -3433px}
select.flags option[value=MZ], select.flags option[value=mz], .country-MZ {background-position:0 -3455px}
select.flags option[value=NA], select.flags option[value=na], .country-NA {background-position:0 -3477px}
select.flags option[value=NC], select.flags option[value=nc], .country-NC {background-position:0 -3499px}
select.flags option[value=NE], select.flags option[value=ne], .country-NE {background-position:0 -3521px}
select.flags option[value=NF], select.flags option[value=nf], .country-NF {background-position:0 -3543px}
select.flags option[value=NG], select.flags option[value=ng], .country-NG {background-position:0 -3565px}
select.flags option[value=NI], select.flags option[value=ni], .country-NI {background-position:0 -3587px}
select.flags option[value=NL], select.flags option[value=nl], .country-NL {background-position:0 -3609px}
select.flags option[value=NO], select.flags option[value=no], .country-NO {background-position:0 -3631px}
select.flags option[value=NP], select.flags option[value=np], .country-NP {background-position:0 -3653px}
select.flags option[value=NR], select.flags option[value=nr], .country-NR {background-position:0 -3675px}
select.flags option[value=NU], select.flags option[value=nu], .country-NU {background-position:0 -3697px}
select.flags option[value=NZ], select.flags option[value=nz], .country-NZ {background-position:0 -3719px}
select.flags option[value=OM], select.flags option[value=om], .country-OM {background-position:0 -3741px}
select.flags option[value=PA], select.flags option[value=pa], .country-PA {background-position:0 -3763px}
select.flags option[value=PE], select.flags option[value=pe], .country-PE {background-position:0 -3785px}
select.flags option[value=PF], select.flags option[value=pf], .country-PF {background-position:0 -3807px}
select.flags option[value=PG], select.flags option[value=pg], .country-PG {background-position:0 -3829px}
select.flags option[value=PH], select.flags option[value=ph], .country-PH {background-position:0 -3851px}
select.flags option[value=PK], select.flags option[value=pk], .country-PK {background-position:0 -3873px}
select.flags option[value=PL], select.flags option[value=pl], .country-PL {background-position:0 -3895px}
select.flags option[value=PM], select.flags option[value=pm], .country-PM {background-position:0 -3917px}
select.flags option[value=PN], select.flags option[value=pn], .country-PN {background-position:0 -3939px}
select.flags option[value=PR], select.flags option[value=pr], .country-PR {background-position:0 -3961px}
select.flags option[value=PS], select.flags option[value=ps], .country-PS {background-position:0 -3983px}
select.flags option[value=PT], select.flags option[value=pt], .country-PT {background-position:0 -4005px}
select.flags option[value=PW], select.flags option[value=pw], .country-PW {background-position:0 -4027px}
select.flags option[value=PY], select.flags option[value=py], .country-PY {background-position:0 -4049px}
select.flags option[value=QA], select.flags option[value=qa], .country-QA {background-position:0 -4071px}
select.flags option[value=RE], select.flags option[value=re], .country-RE {background-position:0 -4093px}
select.flags option[value=RO], select.flags option[value=ro], .country-RO {background-position:0 -4115px}
select.flags option[value=RS], select.flags option[value=rs], .country-RS {background-position:0 -4137px}
select.flags option[value=RU], select.flags option[value=ru], .country-RU {background-position:0 -4159px}
select.flags option[value=RW], select.flags option[value=rw], .country-RW {background-position:0 -4181px}
select.flags option[value=SA], select.flags option[value=sa], .country-SA {background-position:0 -4203px}
select.flags option[value=SB], select.flags option[value=sb], .country-SB {background-position:0 -4225px}
select.flags option[value=SC], select.flags option[value=sc], .country-SC {background-position:0 -4247px}
select.flags option[value=SD], select.flags option[value=sd], .country-SD {background-position:0 -4291px}
select.flags option[value=SE], select.flags option[value=se], .country-SE {background-position:0 -4313px}
select.flags option[value=SG], select.flags option[value=sg], .country-SG {background-position:0 -4335px}
select.flags option[value=SH], select.flags option[value=sh], .country-SH {background-position:0 -4357px}
select.flags option[value=SI], select.flags option[value=si], .country-SI {background-position:0 -4379px}
select.flags option[value=SJ], select.flags option[value=sj], .country-SJ {background-position:0 -4401px}
select.flags option[value=SK], select.flags option[value=sk], .country-SK {background-position:0 -4423px}
select.flags option[value=SL], select.flags option[value=sl], .country-SL {background-position:0 -4445px}
select.flags option[value=SM], select.flags option[value=sm], .country-SM {background-position:0 -4467px}
select.flags option[value=SN], select.flags option[value=sn], .country-SN {background-position:0 -4489px}
select.flags option[value=SO], select.flags option[value=so], .country-SO {background-position:0 -4511px}
select.flags option[value=SR], select.flags option[value=sr], .country-SR {background-position:0 -4533px}
select.flags option[value=ST], select.flags option[value=st], .country-ST {background-position:0 -4555px}
select.flags option[value=SV], select.flags option[value=sv], .country-SV {background-position:0 -4577px}
select.flags option[value=SY], select.flags option[value=sy], .country-SY {background-position:0 -4599px}
select.flags option[value=SZ], select.flags option[value=sz], .country-SZ {background-position:0 -4621px}
select.flags option[value=TC], select.flags option[value=tc], .country-TC {background-position:0 -4643px}
select.flags option[value=TD], select.flags option[value=td], .country-TD {background-position:0 -4665px}
select.flags option[value=TF], select.flags option[value=tf], .country-TF {background-position:0 -4687px}
select.flags option[value=TG], select.flags option[value=tg], .country-TG {background-position:0 -4709px}
select.flags option[value=TH], select.flags option[value=th], .country-TH {background-position:0 -4731px}
select.flags option[value=TJ], select.flags option[value=tj], .country-TJ {background-position:0 -4753px}
select.flags option[value=TK], select.flags option[value=tk], .country-TK {background-position:0 -4775px}
select.flags option[value=TL], select.flags option[value=tl], .country-TL {background-position:0 -4797px}
select.flags option[value=TM], select.flags option[value=tm], .country-TM {background-position:0 -4819px}
select.flags option[value=TN], select.flags option[value=tn], .country-TN {background-position:0 -4841px}
select.flags option[value=TO], select.flags option[value=to], .country-TO {background-position:0 -4863px}
select.flags option[value=TR], select.flags option[value=tr], .country-TR {background-position:0 -4885px}
select.flags option[value=TT], select.flags option[value=tt], .country-TT {background-position:0 -4907px}
select.flags option[value=TV], select.flags option[value=tv], .country-TV {background-position:0 -4929px}
select.flags option[value=TW], select.flags option[value=tw], .country-TW {background-position:0 -4951px}
select.flags option[value=TZ], select.flags option[value=tz], .country-TZ {background-position:0 -4973px}
select.flags option[value=UA], select.flags option[value=ua], .country-UA {background-position:0 -4995px}
select.flags option[value=UG], select.flags option[value=ug], .country-UG {background-position:0 -5017px}
select.flags option[value=UM], select.flags option[value=um], .country-UM {background-position:0 -5039px}
select.flags option[value=US], select.flags option[value=us], .country-US {background-position:0 -5061px}
select.flags option[value=UY], select.flags option[value=uy], .country-UY {background-position:0 -5083px}
select.flags option[value=UZ], select.flags option[value=uz], .country-UZ {background-position:0 -5105px}
select.flags option[value=VA], select.flags option[value=va], .country-VA {background-position:0 -5127px}
select.flags option[value=VC], select.flags option[value=vc], .country-VC {background-position:0 -5149px}
select.flags option[value=VE], select.flags option[value=ve], .country-VE {background-position:0 -5171px}
select.flags option[value=VG], select.flags option[value=vg], .country-VG {background-position:0 -5193px}
select.flags option[value=VI], select.flags option[value=vi], .country-VI {background-position:0 -5215px}
select.flags option[value=VN], select.flags option[value=vn], .country-VN {background-position:0 -5237px}
select.flags option[value=VU], select.flags option[value=vu], .country-VU {background-position:0 -5259px}
select.flags option[value=WF], select.flags option[value=wf], .country-WF {background-position:0 -5303px}
select.flags option[value=WS], select.flags option[value=ws], .country-WS {background-position:0 -5325px}
select.flags option[value=YE], select.flags option[value=ye], .country-YE {background-position:0 -5347px}
select.flags option[value=YT], select.flags option[value=yt], .country-YT {background-position:0 -5369px}
select.flags option[value=ZA], select.flags option[value=za], .country-ZA {background-position:0 -5391px}
select.flags option[value=ZM], select.flags option[value=zm], .country-ZM {background-position:0 -5413px}
select.flags option[value=ZW], select.flags option[value=zw], .country-ZW {background-position:0 -5435px}
.panel_login {
    max-width: 80%;
    min-width: 680px;
}
div.subsectiontoggle {
    border:1px solid #ccc;
    font-weight:bold;
    font-size:14px;
    padding-top:10px;
    padding-bottom:0;
    margin-top:5px;
    text-indent:15px;
    cursor:pointer;
    margin-bottom:10px;
    background-color:#f4f4f4;
    -moz-border-radius:5px;
    -webkit-border-radius:5px;
    -khtml-border-radius:5px;
    -o-border-radius:5px;
    -ms-border-radius:5px;
    border-radius:5px;
}
div.subsectiontoggle span {
    display:inline-block;
    margin-bottom:-3px;
    margin-right:10px;
    width:16px;
    height:16px;
    background: url("../icons/button_sprite.png") 0 -72px no-repeat transparent;
}
div.subsectiontoggle span.showing{
    background-position: 0 -40px;
}
div.subsectiontoggle em {
    display:block;
    position:relative;
    left:425px;
    top:-13px;
    margin-bottom:-3px;
    width:13px;
    height:13px;
    background:url("../images/chevron.png") top left no-repeat;
    -webkit-transform:none;
    -moz-transform:none;
    -khtml-transform:none;
    -o-transform:none;
    -ms-transform:none;
    transform:none;
    -webkit-transition-duration: .2s;
    -moz-transition-duration: .2s;
    -khtml-transition-duration: .2s;
    -o-transition-duration: .2s;
    -ms-transition-duration: .2s;
    transition-duration: .2s;
    -webkit-transition-property: -webkit-transform;
    -moz-transition-property: -moz-transform;
    -khtml-transition-property: -khtml-transform;
    -o-transition-property: -o-transform;
    -ms-transition-property: -ms-transform;
    transition-property: transform;
}
div.subsectiontoggle em.showing {
    display:block;
    position:relative;
    left:425px;
    top:-13px;
    background:url("../images/chevron.png") top left no-repeat;
    width:13px;
    height:13px;
    -webkit-transform:rotate(90deg);
    -moz-transform:rotate(90deg);
    -khtml-transform:rotate(90deg);
    -o-transform:rotate(90deg);
    -ms-transform:rotate(90deg);
    transform:rotate(90deg);
}
div.subsectiontoggle:hover em {
    -webkit-transform:rotate(90deg);
    -moz-transform:rotate(90deg);
    -khtml-transform:rotate(90deg);
    -o-transform:rotate(90deg);
    -ms-transform:rotate(90deg);
    transform:rotate(90deg);
}
div.gs-container {
    margin-top:10px;
}
div.gs-container * {
    margin: 0;
    padding: 0;
    background-position: 0 0;
    text-decoration: none;
    font-size: 1em;
}
div.gs-container input {
    background: url("../icons/x16_sprite.png") no-repeat 2px -119px #FFFFFF;
    height:20px;
    border:1px solid #444;
    padding:0 22px 2px;
    color:#444;
    -moz-border-radius:5px;
    -webkit-border-radius:5px;
    -khtml-border-radius:5px;
    -o-border-radius:5px;
    -ms-border-radius:5px;
    border-radius:5px;
}
input.gs-loading {
    background-image: url("../images/loading.gif");
    background-repeat: no-repeat;
    background-position: center right;
}
ul.gs-resultbox {
    margin: 0 !important;
    padding: 0 !important;
    width: 300px;
    z-index: 999999;
    border: 1px solid #777;
    font-size: 11px;
    background: #fff;
    -moz-box-shadow: 2px 2px 5px 0 #c5c5c5;
    -webkit-box-shadow: 2px 2px 5px 0 #c5c5c5;
    -khtml-box-shadow: 2px 2px 5px 0 #c5c5c5;
    -o-box-shadow: 2px 2px 5px 0 #c5c5c5;
    -ms-box-shadow: 2px 2px 5px 0 #c5c5c5;
    box-shadow: 2px 2px 5px 0 #c5c5c5;
    list-style: none;
    -moz-border-radius:5px;
    -webkit-border-radius:5px;
    -khtml-border-radius:5px;
    -o-border-radius:5px;
    -ms-border-radius:5px;
    border-radius:5px;
    max-height:500px;
    overflow:auto;
}
ul.gs-resultbox li {
    float: left;
    width: 100%;
    clear: both;
    cursor: pointer;
}
ul.gs-resultbox li.gs-cheader {
    height: 13px;
    overflow: hidden;
    padding: 5px 0;
    color: #fff;
    background: #6ea6d1;
    cursor:default;
    padding-bottom:10px;
}
ul.gs-resultbox li.gs-cheader p.gs-cheader-title {
    margin: 0 !important;
    padding: 0 0 0 10px !important;
    float: left;
    font-size: 12px;
    font-weight: bold;
}
ul.gs-resultbox li.gs-cheader p.gs-cheader-limit {
    margin: 0 !important;
    padding: 0 10px 0 0 !important;
    float: right;
    font-size: 11px;
    font-weight: normal;
}
ul.gs-resultbox li.gs-cdata {
    margin: 0 !important;
    padding: 0 !important;
    border-bottom: 1px solid #c5c5c5;
}
ul.gs-resultbox li.gs-cdata:last-child {
    border-bottom: none;
}
ul.gs-resultbox li.gs-cdata:hover {
    background: #eaf4fd;
}
ul.gs-resultbox li.gs-cdata a {
    display: block;
    padding: 5px 10px;
    text-decoration: none !important;
    background: #fff;
}
ul.gs-resultbox li.gs-cdata a:hover {
    background: #cde0ff;
}
ul.gs-resultbox li.gs-cdata img {
    margin-right: 12px;
}
ul.gs-resultbox li.gs-cdata p {
    margin: 0 !important;
    padding: 0 !important;
    color: #444;
    font-size: 10px;
    min-height:30px;
}
ul.gs-resultbox li.gs-cdata p span.gs-cdata-title {
    display: inline !important;
    margin: 0 !important;
    padding: 0 !important;
    font-size: 11px;
    font-weight: bold;
    color: #000;
}
ul.gs-resultbox li:first-child {
    -moz-border-radius:5px 5px 0 0;
    -webkit-border-radius:5px 5px 0 0;
    -khtml-border-radius:5px 5px 0 0;
    -o-border-radius:5px 5px 0 0;
    -ms-border-radius:5px 5px 0 0;
    border-radius:5px 5px 0 0;
}
ul.gs-resultbox li:last-child {
    -moz-border-radius:0 0 5px 5px;
    -webkit-border-radius:0 0 5px 5px;
    -khtml-border-radius:0 0 5px 5px;
    -o-border-radius:0 0 5px 5px;
    -ms-border-radius:0 0 5px 5px;
    border-radius:0 0 5px 5px;
}
div.df-container {
}
div.df-container * {
    margin: 0;
    padding: 0;
    background-position: 0 0;
    text-decoration: none;
    font-size: 1em;
}
div.df-container input {
}
input.df-loading {
    background-image: url("../images/loading.gif");
    background-repeat: no-repeat;
    background-position: center right;
}
ul.df-resultbox {
    margin: 0 !important;
    padding: 0 !important;
    min-width: 250px;
    max-width: 500px;
    z-index: 999999;
    border: 1px solid #777;
    font-size: 11px;
    background: #fff;
    -moz-box-shadow: 2px 2px 5px 0 #c5c5c5;
    -webkit-box-shadow: 2px 2px 5px 0 #c5c5c5;
    -khtml-box-shadow: 2px 2px 5px 0 #c5c5c5;
    -o-box-shadow: 2px 2px 5px 0 #c5c5c5;
    -ms-box-shadow: 2px 2px 5px 0 #c5c5c5;
    box-shadow: 2px 2px 5px 0 #c5c5c5;
    list-style: none;
    -moz-border-radius:5px;
    -webkit-border-radius:5px;
    -khtml-border-radius:5px;
    -o-border-radius:5px;
    -ms-border-radius:5px;
    border-radius:5px;
}
ul.df-resultbox li {
    float: left;
    width: 100%;
    clear: both;
    cursor: pointer;
}
ul.df-resultbox li.df-cheader {
    height: 13px;
    overflow: hidden;
    padding: 5px 0;
    color: #fff;
    background: #6ea6d1;
    cursor:default;
    padding-bottom:10px;
}
ul.df-resultbox li.df-cheader p.df-cheader-title {
    margin: 0 !important;
    padding: 0 0 0 10px !important;
    float: left;
    font-size: 12px;
    font-weight: bold;
}
ul.df-resultbox li.df-cheader p.df-cheader-limit {
    margin: 0 !important;
    padding: 0 10px 0 0 !important;
    float: right;
    font-size: 11px;
    font-weight: normal;
}
ul.df-resultbox li.df-cdata {
    margin: 0 !important;
    padding: 0 !important;
    border-bottom: 1px solid #c5c5c5;
}
ul.df-resultbox li.df-cdata:last-child {
    border-bottom: none;
}
ul.df-resultbox li.df-cdata:hover {
    background: #eaf4fd;
}
ul.df-resultbox li.df-cdata a {
    display: block;
    padding: 5px 10px;
    text-decoration: none !important;
    background: #fff;
}
ul.df-resultbox li.df-cdata a:hover {
    background: #cde0ff;
}
ul.df-resultbox li.df-cdata img {
    margin-right: 12px;
}
ul.df-resultbox li.df-cdata p {
    margin: 0 !important;
    padding: 0 !important;
    color: #444;
    font-size: 10px;
    min-height:30px;
}
ul.df-resultbox li.df-cdata p span.df-cdata-title {
    display: inline !important;
    margin: 0 !important;
    padding: 0 !important;
    font-size: 11px;
    font-weight: bold;
    color: #000;
}
ul.df-resultbox li:first-child {
    -moz-border-radius:5px 5px 0 0;
    -webkit-border-radius:5px 5px 0 0;
    -khtml-border-radius:5px 5px 0 0;
    -o-border-radius:5px 5px 0 0;
    -ms-border-radius:5px 5px 0 0;
    border-radius:5px 5px 0 0;
}
ul.df-resultbox li:last-child {
    -moz-border-radius:0 0 5px 5px;
    -webkit-border-radius:0 0 5px 5px;
    -khtml-border-radius:0 0 5px 5px;
    -o-border-radius:0 0 5px 5px;
    -ms-border-radius:0 0 5px 5px;
    border-radius:0 0 5px 5px;
}
span.icons16-empty {
    float:left;
    display:block;
    height:20px;
    width:20px;
    margin:0 7px 0 0;
}
.ttip {
    width:16px;
    height:16px;
    cursor:pointer;
    background: url("../icons/x16_sprite.png") no-repeat -2px -42px transparent;
    float:right;
    display:inline;
    position:relative;
    right:-2px;
    top:-2px;
}
p.prefix {
    float: left;
    margin: 0;
    text-align: right;
}
p.label {
    float: left;
    margin: 5px 15px 0 0;
}
p.value {
    float:left;
    margin: 0 0 0 2px;
}
/* content_ispc
-------------------------------------------------------------- */
.tipsy {
    font-size: 10px;
    position: absolute;
    padding: 5px;
    z-index: 100000;
}
.tipsy-inner {
    background-color: #000;
    color: #FFF;
    max-width: 350px;
    padding: 5px 8px 4px 8px;
    text-align: left;
}
/* Rounded corners */
.tipsy-inner {
    border-radius: 5px;
    -moz-border-radius: 5px;
    -webkit-border-radius: 5px;
}
/* Uncomment for shadow */
/*.tipsy-inner { box-shadow: 0 0 5px #000000; -webkit-box-shadow: 0 0 5px #000000; -moz-box-shadow: 0 0 5px #000000; }*/
.tipsy-arrow {
    position: absolute;
    width: 0;
    height: 0;
    line-height: 0;
    border: 5px dashed #000;
}
/* Rules to colour arrows */
.tipsy-arrow-n { border-bottom-color: #000; }
.tipsy-arrow-s { border-top-color: #000; }
.tipsy-arrow-e { border-left-color: #000; }
.tipsy-arrow-w { border-right-color: #000; }
.tipsy-n .tipsy-arrow { top: 0px; left: 50%; margin-left: -5px; border-bottom-style: solid; border-top: none; border-left-color: transparent; border-right-color: transparent; }
.tipsy-nw .tipsy-arrow { top: 0; left: 10px; border-bottom-style: solid; border-top: none; border-left-color: transparent; border-right-color: transparent;}
.tipsy-ne .tipsy-arrow { top: 0; right: 10px; border-bottom-style: solid; border-top: none;  border-left-color: transparent; border-right-color: transparent;}
.tipsy-s .tipsy-arrow { bottom: 0; left: 50%; margin-left: -5px; border-top-style: solid; border-bottom: none;  border-left-color: transparent; border-right-color: transparent; }
.tipsy-sw .tipsy-arrow { bottom: 0; left: 10px; border-top-style: solid; border-bottom: none;  border-left-color: transparent; border-right-color: transparent; }
.tipsy-se .tipsy-arrow { bottom: 0; right: 10px; border-top-style: solid; border-bottom: none; border-left-color: transparent; border-right-color: transparent; }
.tipsy-e .tipsy-arrow { right: 0; top: 50%; margin-top: -5px; border-left-style: solid; border-right: none; border-top-color: transparent; border-bottom-color: transparent; }
.tipsy-w .tipsy-arrow { left: 0; top: 50%; margin-top: -5px; border-right-style: solid; border-left: none; border-top-color: transparent; border-bottom-color: transparent; }
/* uni-form-generic
-------------------------------------------------------------- */
/* Uni-Form by Dragan Babic [Superawesome Industries]  - http: //sprawsm.com/uni-form/ */
/* Some rights reserved - http: //creativecommons.org/licenses/by-sa/2.5/ */
/* Do not edit this file directly, make your changes to uni-form.css in the same folder */
.uniForm{ margin: 0; padding: 0; position: relative; z-index: 1; } /* reset stuff */
/* Some generals and more resets */
.uniForm fieldset{ border: none; margin: 0; padding: 0; }
.uniForm fieldset legend{ margin: 0; padding: 0; }
/* This is the main unit that contains our form elements */
.uniForm .ctrlHolder,
.uniForm .buttonHolder{ margin: 0; padding: 0; clear: both; }
/* Clear all floats */
.uniForm:after,
.uniForm .buttonHolder:after,
.uniForm .ctrlHolder:after,
.uniForm .ctrlHolder .multiField:after,
.uniForm .inlineLabel:after{ content: "."; display: block; height: 0; line-height: 0; font-size: 0; clear: both; min-height: 0; visibility: hidden; }
/* A class to be used on a label that contains a checkbox or a radio button */
.uniForm .inlineLabel,
.uniForm .inlineLabels .inlineLabel,
.uniForm .blockLabels .inlineLabel{ width: auto; float: none; margin: 0; display: block; }
/* IE shows borders & padding on checkboxes and radio buttons if they are declared on an input element, remove them */
/* Legacy/Inheritance fix */
.uniForm .inlineLabel input,
.uniForm .inlineLabels .inlineLabel input,
.uniForm .blockLabels .inlineLabel input{ border: none; padding: 0; margin: 0; }
/* Styles for form controls where labels are above the input elements */
/* Set the class of the parent (preferably to a fieldset) to .blockLabels */
.uniForm label,
.uniForm .label,
.uniForm .blockLabels label,
.uniForm .blockLabels .label{ display: block; float: none; padding: 0; line-height: 100%; width: auto; }
/* Float the input elements */
.uniForm .textInput,
.uniForm .blockLabels .textInput,
.uniForm .blockLabels .fileUpload,
.uniForm .selectInput,
.uniForm .blockLabels .selectInput,
.uniForm .blockLabels select,
.uniForm textarea,
.uniForm .blockLabels textarea{ float: left; }
/* Postition the hints */
.uniForm .formHint,
.uniForm .blockLabels .formHint{ float: right; margin: 0; clear: none; }
/* Position the elements inside combo boxes (multiple selects/checkboxes/radio buttons per unit) */
.uniForm .multiField,
.uniForm .blockLabels .multiField{ width: auto; float: left; }
.uniForm .multiField .inlineLabel,
.uniForm .blockLabels .multiField .inlineLabel{ display: block; margin: 0 0 .5em 0; }
.uniForm .multiField .blockLabel,
.uniForm .blockLabels .multiField .blockLabel{ float: left; width: auto; margin: 0; }
.uniForm .multiField .blockLabel .textInput,
.uniForm .multiField .blockLabel .selectInput,
.uniForm .multiField .blockLabel select,
.uniForm .blockLabels .multiField .blockLabel .textInput,
.uniForm .blockLabels .multiField .blockLabel .selectInput,
.uniForm .blockLabels .multiField .blockLabel select{ width: 100%; margin: 0; }
/* Styles for form controls where labels are in line with the input elements */
/* Set the class of the parent (preferably to a fieldset) to .inlineLabels */
.uniForm .inlineLabels label,
.uniForm .inlineLabels .label{ float: left; margin: 0; padding: 0; line-height: 100%; position: relative; }
/* Float the input elements */
.uniForm .inlineLabels .textInput,
.uniForm .inlineLabels .fileUpload,
.uniForm .inlineLabels .selectInput,
.uniForm .inlineLabels select,
.uniForm .inlineLabels textarea{ float: left; }
/* Postition the hints */
.uniForm .inlineLabels .formHint{ clear: both; float: none; }
.uniForm .inlineLabels .multiField{ float: left; }
.uniForm .inlineLabels .multiField .inlineLabel{}
.uniForm .inlineLabels .multiField .blockLabel{}
.uniForm .inlineLabels .multiField .blockLabel .textInput,
.uniForm .inlineLabels .multiField .blockLabel .selectInput,
.uniForm .inlineLabels .multiField .blockLabel select{ display: block; width: 100%; float: none; }
.uniForm .inlineLabels .multiField select{ float: left; }
/* Required fields asterisk styling for .blockLabels */
.uniForm label em,
.uniForm .label em,
.uniForm .blockLabels label em,
.uniForm .blockLabels .label em{ position: absolute; left: -7px; }
/* Required fields asterisk styling for .inlineLabels */
.uniForm .inlineLabels label em,
.uniForm .inlineLabels .label em{ display: block; position: absolute; left: auto; right: 0; font-style: normal; font-weight: bold; }
.uniForm .inlineLabel em{ position: absolute; left: 7px; }
/* Messages */
.uniForm #errorMsg,
.uniForm .error{}
.uniForm #errorMsg dt,
.uniForm #errorMsg h3{}
.uniForm #errorMsg dd{}
.uniForm #errorMsg ol{}
.uniForm #errorMsg ol li{}
.uniForm .errorField{}
.uniForm #OKMsg{}
/* Columns */
.uniForm .col{ float: left; }
.uniForm .col.first{}
.uniForm .col.last{}
/* uni-form
-------------------------------------------------------------- */
/* Keep in mind that wherever you see "Required property" it means that the property must exist */
/* ------------------------------------------------------------------------------ */
/* Generals */
.uniForm fieldset{}
.uniForm fieldset legend{ color: #333; font-weight: bold; font-size: 100%; margin: 0; padding: 1.5em 1.5em 1.5em 0; }
/* This is the main unit that contains our form elements */
.uniForm .ctrlHolder{ padding: 3px; border-bottom: 1px dotted #dfdfdf; }
.uniForm .buttonHolder{
    text-align: left;
    background: #CEDEEF url("../images/buttonHolder_bg.gif") no-repeat right;
    margin: 3em 0 1em;
    padding: 8px;
}
.uniForm .resetButton{ float: left; }
.uniForm .primaryAction{ font-weight: bold; }
/* This class gets added to div.ctrlHolder to highlight the row */
.uniForm .focused{ background: #fffcdf; }
/* .inlineLabel is used for inputs within labels - checkboxes and radio buttons */
.uniForm .inlineLabel input,
.uniForm .inlineLabels .inlineLabel input,
.uniForm .blockLabels .inlineLabel input{ float: left; margin: 0 .4em 0 0; }
.uniForm .inlineLabel span{ float: left; width: 90%; }
/* ------------------------------------------------------------------------------ */
/* .blockLabels (default style, will be applied even if you don"t class the parent element) */
.uniForm .blockLabels .ctrlHolder{}
.uniForm label,
.uniForm .blockLabels label,
.uniForm .blockLabels .label{ margin: 0 0 .5em 0; }
.uniForm .textInput,
.uniForm .blockLabels .textInput,
.uniForm .blockLabels .fileUpload{ width: 43%; /* <- Required property */ }
.uniForm .selectInput,
.uniForm select,
.uniForm .blockLabels .selectInput,
.uniForm .blockLabels select{ width: 43.5%; /* <- Required property */ }
.uniForm textarea,
.uniForm .blockLabels textarea{ width: 43%; /* <- Required property */ height: 12em; }
.uniForm .formHint,
.uniForm .blockLabels .formHint{ width: 55%; /* <- Required property */ font-size: .9em; color: #777; position: relative; top: -.5em; }
.uniForm .multiField,
.uniForm .blockLabels .multiField{ width: 43%; }
.uniForm .multiField .inlineLabel,
.uniForm .blockLabels .multiField .inlineLabel{ display: block; margin: 0 0 .5em 0; }
.uniForm .multiField .blockLabel,
.uniForm .blockLabels .multiField .blockLabel{ width: 30%; margin: 0 10px 0 0; }
.uniForm .multiField .blockLabel .textInput,
.uniForm .multiField .blockLabel .selectInput,
.uniForm .multiField .blockLabel select,
.uniForm .blockLabels .multiField .blockLabel .textInput,
.uniForm .blockLabels .multiField .blockLabel .selectInput,
.uniForm .blockLabels .multiField .blockLabel select{ width: 100%; margin: .3em 0 0 0; }
/* ------------------------------------------------------------------------------ */
/* .inlineLabels */
.uniForm .inlineLabels .ctrlHolder{}
.uniForm .inlineLabels label,
.uniForm .inlineLabels .label{ width: 20%; /* <- Required property */ margin: .3em 2% 0 0; /* <- Required property */ }
.uniForm .inlineLabels .textInput,
.uniForm .inlineLabels .fileUpload{ width: 35%; /* <- Required property */ }
.uniForm .inlineLabels .selectInput,
.uniForm .inlineLabels select{ width: 35%; /* <- Required property */ }
.uniForm .inlineLabels textarea{  width: 35%; /* <- Required property */ height: 12em; }
.uniForm .inlineLabels .formHint{ margin-top: 0; margin-left: 22%; font-size: .9em; color: #777; position: static; }
.uniForm .inlineLabels .multiField{ width: 60%; /* <- Required property */ margin: 0 0 .3em 0; }
.uniForm .inlineLabels .multiField .inlineLabel{ display: block; margin: 0 0 .5em 0; }
.uniForm .inlineLabels .multiField .blockLabel{ float: left; width: 26%; margin: 0 3% 0 0; }
.uniForm .inlineLabels .multiField .blockLabel .textInput,
.uniForm .inlineLabels .multiField .blockLabel .selectInput,
.uniForm .inlineLabels .multiField .blockLabel select{ width: 100%; margin: .3em 0 0 0; }
/* Focus pseudoclasses */
.uniForm .ctrlHolder .textInput:focus{ outline: none; /* Get rid of the "glow" effect in WebKit, optional */ }
.uniForm .ctrlHolder textarea:focus{ outline: none; /* Get rid of the "glow" effect in WebKit, optional */ }
.uniForm div.focused .formHint{ color: #333; }
/* Columns (they are floated left by default) */
.uniForm .col{ width: 37.9%; /* <- Required property */ margin: 0 2% 20px 0; }
/* Use .first and .last classes to control the layout/spacing of your columns */
.uniForm .col.first{ width: 39%; /* <- Required property */ float: left; clear: none; }
.uniForm .col.last{ width: 39%; /* <- Required property */ float: right; clear: none; margin-right: 0; }
/* Messages */
.uniForm #errorMsg, .confirmpassworderror{ background: #ffdfdf; border: 1px solid #df7d7d; border-width: 1px 0; margin: 1.5em 0 1.5em 0; padding: 7px; }
.uniForm .error{ background: #ffdfdf; border: 1px solid #df7d7d; border-width: 1px 0; }
.uniForm #errorMsg dt, .uniForm #errorMsg h3{ margin: 0 0 .5em 0; font-size: 100%; line-height: 100%; font-weight: bold; }
.uniForm #errorMsg dd{ margin: 0; padding: 0; }
.uniForm #errorMsg ol{ margin: 0; padding: 0; list-style:none;}
.uniForm #errorMsg ol li{ margin: 0; padding: 2px; list-style-position: inside; border-bottom: 1px dotted #df7d7d; position: relative; }
.uniForm .errorField{ color: #af4c4c; margin: 0 0 6px 0; padding: 4px; background: #ffbfbf; }
.uniForm #OKMsg, .confirmpasswordok{ background: #C8FFBF; border: 1px solid #A2EF95; border-width: 1px 0; margin: 1.5em 0 1.5em 0; padding: 7px; }
.uniForm #OKMsg p{ margin: 0; }
/* ------------------------------------------------------------------------------ */
/* This is the main unit that contains our form elements */
.uniForm .textInput, .uniForm .selectInput, .uniForm textarea {
    background:#FFFFFF none repeat scroll 0 0;
    color: #000000;
    border: 1px solid #DFDFDF;
    padding: 1px;
}
/* jquery-ui-custom
-------------------------------------------------------------- */
.ui-datepicker-calendar thead tr th {
    background-image:none;
    background-color:#FFFFFF;
    color:#000000;
}
.ui-widget { font-family: "Trebuchet MS", Arial, sans-serif; font-size: 100%; }
.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: "Trebuchet MS", Arial, sans-serif; font-size: 100%; }
ul.ui-autocomplete { max-height: 250px; overflow-y: auto; min-width: 85px;}
.ui-combobox { position: relative; display: inline-block; margin-right: 17px; }
.ui-combobox-toggle { position: absolute !important; top: 0; bottom: 0; margin-left: -1px; padding: 1px !important; background: none repeat scroll 0 0 #FFFFFF !important; border: 1px solid #DFDFDF !important;}
.ui-combobox-input { background: none repeat scroll 0 0 #FFFFFF !important; border: 1px solid #DFDFDF !important; padding: 1px; font-weight: normal !important; }
.panel_install_package .ui-combobox { float: left; }
.clear-float { clear: both; }
a.link-page, span.page-spacer {
    display: inline-block;
    text-align: center;
    padding: 2px;
    line-height: 16px;
    text-decoration: none !important;
    color: inherit !important;
    min-width: 16px;
}
a.link-page {
    border: 1px solid #FFFFFF;
    margin: 0 5px;
}
a.link-page:hover {
    background-color: #DFDFDF;
}
span.page-spacer {
    margin: 0 -5px;
}
a.link-page.current-page {
    background-color: #DFDFDF;
    font-weight: bold;
@charset "UTF-8";
/*
    Document   : styles.css
    Created on : 06.07.2012, 12:21:59
    Author     : Christian Foellmann (foe-services.de)
    Description:
        Basis was css-code from the "ISPConfig 3: default theme" which was based on
        "Yet Another Multicolumn Layout" - (X)HTML/CSS Framework 3.0.6
        by Copyright 2005-2008, Dirk Jesse (http://www.yaml.de)
*/
/* overall
-------------------------------------------------------------- */
* {
    margin: 0;
    padding: 0;
}
html * { font-size: 100.01% }
body {
    font-family: "Trebuchet MS", sans-serif;
    font-size: 75.00%;
    color: #444;
    background: url("../images/screen_bg.png") repeat-x top left fixed #EEEEEE;
    padding: 10px 0;
}
ul, ol, dl { line-height: 1.5em; margin: 0 0 1em 1em }
li { margin-left: 1.5em; line-height: 1.5em }
dt { font-weight: bold }
dd { margin: 0 0 1em 2em }
a {
    color: #4D87C7;
    text-decoration:none;
}
a:focus,
a:hover,
a:active {
    color:#182E7A;
    text-decoration:underline;
}
hr {
    color: #fff;
    background:transparent;
    margin: 0 0 0.5em 0;
    padding: 0 0 0.5em 0;
    border:0;
    border-bottom: 1px #eee solid;
}
textarea, pre, tt, code {
    font-family: Consolas,"Lucida Console","Courier New",monospace;
    font-size: 0.9em;
}
h1,h2,h3,h4,h5,h6 {
    font-family: "Trebuchet MS", sans-serif;
    font-weight:bold;
    color:#666;
    margin: 0 0 0.25em 0;
}
h1 { font-size: 200% }                        /* 24px */
h2 { font-size: 200% }                        /* 24px */
h3 { font-size: 150% }                        /* 18px */
h4 { font-size: 133.33% }                     /* 16px */
h5 { font-size: 116.67% }                     /* 14px */
h6 { font-size: 116.67%; font-style:italic }  /* 14px */
p { line-height: 1.5em; margin: 0 0 1em 0; }
cite, blockquote { font-style:italic }
blockquote { margin: 0 0 1em 1.5em }
strong,b { font-weight: bold }
em,i { font-style:italic }
pre, code { font-family: monospace; font-size: 1.1em; }
acronym, abbr {
    letter-spacing: .07em;
    border-bottom: .1em dashed #c00;
    cursor: help;
}
header, #nav, #main, footer {
    clear: both;
}
#page {
    min-width: 980px;
    max-width: 80%;
    background: #fff;
    text-align:left;
    margin: 0 auto;
    padding: 10px;
}
.skip, .hideme, .print {
    height: 1px;
    left: -1000em;
    position: absolute;
    top: -1000em;
    width: 1px;
}
/* header
-------------------------------------------------------------- */
header {
    position: relative;
    color: #faf0e6;
    padding: 15px 2em 5px 20px;
    background: url("../images/header_bg.png") repeat-x top left #9a9a9a;
}
header h1 {
    font-size:2.5em;
    letter-spacing:-2px;
    line-height:65%;
    color: silver;
}
header span {
    color: #333333;
}
/* header/topsubnav
-------------------------------------------------------------- */
#topsubnav {
    position:absolute;
    top: 10px;
    right: 10px;
    text-align: right;
}
#topsubnav a {
    color: #f0f8ff;
    font-weight: normal;
    background:transparent;
    text-decoration:none;
}
#topsubnav a:focus,
#topsubnav a:hover,
#topsubnav a:active {
    text-decoration:underline;
    background-color: transparent;
}
/* nav
-------------------------------------------------------------- */
#topNav ul {
    list-style: none;
    padding: 0 0 0 20px;
    margin: 0;
    background: #9a9a9a
}
#topNav ul li {
    display: inline;
    margin: 0 2px 0 0;
}
#topNav a {
    background: url("../icons/x32_sprite.png") no-repeat #D3D3D3;
    border-top-left-radius:5px;
    border-top-right-radius:5px;
    color:black;
    display:inline-block;
    height:20px;
    padding-top:37px;
    text-align:center;
    text-decoration:none;
    min-width:78px;
}
#topNav a:hover {
    background-color: #eeeeee;
    color: #000000;
}
#topNav #topNav_current a {
    font-weight: bold;
    color: black;
    background-color: #ffffff;
}
.topnav-tools { background-position: 22px -10px !important; }
.topnav-admin { background-position: 22px -74px !important; }
.topnav-sites { background-position: 22px -523px !important; }
.topnav-monitor { background-position: 22px -585px !important; }
.topnav- { background-position: 22px -650px !important; }
.topnav-help { background-position: 22px -715px !important; }
.topnav-mail { background-position: 22px -780px !important; }
.topnav-mailuser { background-position: 22px -780px !important; }
.topnav-vm { background-position: 22px -842px !important; }
.topnav-domain { background-position: 22px -905px !important; }
.topnav-dns { background-position: 22px -970px !important; }
.topnav-dashboard { background-position: 22px -1035px !important; }
.topnav-client { background-position: 22px -1098px !important; }
.topnav-billing { background-position: 22px -1162px !important; }
#topNav a span {
            padding: 0 3px;
        }
/* main
-------------------------------------------------------------- */
#main {
    background: #fff;
    padding: 1em 0;
}
/* main/sideNav + submenu
-------------------------------------------------------------- */
#sideNav {
    width: 200px;
    float:left;
    padding: 0 10px 0 0;
}
#submenu {
    width: 100%;
    overflow: hidden;
    margin: 0px;
    list-style-type: none;
    border-bottom: 2px #ddd solid;
}
#submenu ul {
    list-style-type: none;
    margin:0;
    padding: 0;
}
#submenu li {
    float:left;
    width: 100%;
    margin:0;
    padding: 0;
    font-size:0.9em;
}
#submenu a,
#submenu strong {
    display:block;
    width: 90%;
    padding: 2px 0px 2px 10%;
    text-decoration: none;
    background-color:#fff;
    color: #444;
    border-bottom: 1px #eee solid;
}
/* Menu Title */
#submenu li.title {
    width: 100%;
    padding: 0px;
    font-weight: bold;
    color: #444;
    background-color: #fff;
    border-top: 2px #888 solid;
    font-size: 1.1em;
}
#submenu li.title a {
    background-color: #f0f8ff;
    color: #444;
}
#submenu li.title a:hover {
    color: white;
}
#submenu li span {
    display:block;
    width: 90%;
    padding: 3px 0px 3px 10%;
    font-weight: bold;
    border-bottom: 1px #ddd solid;
}
/* Level 1 */
#submenu li.active,
#submenu li strong {
    width: 90%;
    padding: 3px 0px 3px 10%;
    font-weight: bold;
    color: #fff;
    background-color:#aab;
    border-bottom: 1px #eee solid;
}
#submenu li a {
    width: 90%;
    padding-left: 10%;
    background-color:#fff;
    color: #444;
}
#submenu li a:focus,
#submenu li a:hover,
#submenu li a:active {
    background-color:#f63;
    color: #fff;
}
/* Form-Elements in the Menu*/
#submenu * select#server_id {
    margin: 3px 10%;
    padding: 1px;
    width: 80%;
}
/* main/content
-------------------------------------------------------------- */
#content {
    margin-left: 200px;
    margin-right: 0;
    padding: 0px 10px 10px 20px;
    border-left: 1px #ddd solid;
}
/* footer
-------------------------------------------------------------- */
footer {
    color:#666;
    background: #f9f9f9;
    padding: 10px 20px;
    border-top: 5px #efefef solid;
    font-size: 0.8em;
    text-align: center;
}
footer a {
    color: #999;
    background:transparent;
    font-weight: bold;
}
footer a:hover, footer a:active {
    color: #4D87C7;
    background-color: transparent;
    text-decoration:underline;
}
/* Set a background-color, no system backgorund used anymore */
select, input, textarea {
    background: #FFFFFF;
    border: 1px solid #DFDFDF;
    padding: 1px;
    outline:none;
}
table { width: auto; border-collapse:collapse; margin-bottom: 0.5em; }
table.full { width: 100%; }
table.fixed { table-layout:fixed }
table.list td {
    max-width: 350px;
    min-width: 32px;
    white-space: nowrap;
    overflow:hidden;
    text-overflow: ellipsis;
    -o-text-overflow: ellipsis;
    -icab-text-overflow: ellipsis;
    -khtml-text-overflow: ellipsis;
    -moz-text-overflow: ellipsis;
    -webkit-text-overflow: ellipsis;
}
th,
td {
    padding: 0.5em;
    text-align:left;
}
thead th {
    background: #444 url("../images/lists_thead_bg.png") repeat-x;
    color: #fff;
}
tbody th {
    background: #ccc;
    color: #333;
}
tbody th.sub {
    background: #ddd;
    color: #333;
}
table.list th[class$="_pid"],
table.list td[class$="_pid"],
table.list th[class$="_active"],
table.list td[class$="_active"],
table.list th.tbl_col_autoresponder,
table.list td.tbl_col_autoresponder {
    width: 70px;
    text-align: center;
}
table.list .tbl_col_buttons,
table.list .tbl_col_limit {
    width: 150px;
}
.tbl_col_client_pid input {
    width: 50px;
}
.pnl_listarea th[class^="tbl_col"] { cursor:pointer; }
.pnl_listarea th[class^="tbl_col"]:hover { background-position:0 -15px!important; }
.pnl_listarea th.tbl_col_nosort { cursor:default; }
.pnl_listarea th.tbl_col_nosort:hover { background-position:0 0!important; }
.pageForm_description { font-size: 12px; }
/* Tab-Box */
.tabbox_tabs { border-bottom: 1px solid #d3d3d3; }
.tabbox_tabs ul {
    list-style: none;
    padding: 0;
    margin: 0;
}
.tabbox_tabs li {
    display: inline;
    margin: 0 2px 0 0;
}
.tabbox_tabs a {
    padding: 0 1em;
    text-decoration: none;
    color: black;
    background: #d3d3d3;
    border: 1px solid #d3d3d3;
}
.tabbox_tabs a:hover {
    background: #fc0;
    color: #540;
}
.tabbox_tabs .active a {
    font-weight: bold;
    color: #ff6600;
    background: #ffffff;
}
.pnl_toolsarea fieldset, .pnl_listarea fieldset, .pnl_formsarea fieldset {
    border-top: 1px solid #949494;
    margin: 20px 0;
}
.pnl_toolsarea fieldset legend , .pnl_listarea fieldset legend {
    font-weight: bold;
    color: #6299c5;
}
.pnl_formarea fieldset {
    font-weight: bold;
}
/* hide line and legend when inside tabbed content */
#tabbox_content * .pnl_toolsarea fieldset, #tabbox_content * .pnl_listarea fieldset, #tabbox_content * .pnl_formsarea fieldset { border: none !important; }
#tabbox_content * .pnl_toolsarea fieldset legend, #tabbox_content * .pnl_listarea fieldset legend, #tabbox_content * .pnl_formsarea fieldset legend { display: none !important; }
.codeview {
    margin:20px 0;
    padding:2px;
    border: 1px solid #ffcc00;
    background: #fffaea;
    font-family: Consolas, "Lucida Console", "Courier New", monospace;
    font-size: 0.9em;
}
/* Lists */
table.list {
    width: 100%;
    border: 1px solid #d3d3d3 !important;
}
table.list thead th { font-size: 10px; }
table.list tbody { border: 1px solid #d3d3d3 !important; }
table.list tfoot td { text-align: center;  background: #f8f8f8 url("../images/lists_tfoot_bg.png") repeat-x bottom left;  padding: 24px 8px 8px 8px; }
table.list .tbl_paging img { vertical-align: top; }
table.list .tbl_row_even { background: #fcfcfc; }
table.list .tbl_row_uneven { background: #f0f8ff; }
table.list tr:hover { background: #fffacd; }
table.list td { word-wrap:break-word;white-space:pre-wrap; }
table.list td.tbl_col_buttons { word-wrap:normal;white-space:normal;overflow:visible; }
/* Password Strength */
#passBar {
    width: 101px; height: 10px;
    background: url("../images/meter_bg.gif") repeat-x bottom left;
    margin: 2px 0;
    float: left;
}
#passText {
    padding: 0;
    float: left;
}
/* Systemmonitor */
.systemmonitor-server,
.systemmonitor-ve,
.systemmonitor-state {
    margin: 10px 5px;
    font-family: Consolas, "Lucida Console", "Courier New", monospace;
    font-size: 0.9em;
    float: left;
    width: 100%;
}
.systemmonitor-server:hover,
.systemmonitor-vm:hover { background-color: #FFFACD; }
.state-no_state,
.state-no_state-ve {
    border-top: 4px solid #95A19F;
    background-color: #f8f8ff;
}
.state-unknown,
.state-unknown-ve {
    border-top: 4px solid #30302e;
    background-color: #cecfc5;
}
.state-ok,
.state-ok-ve {
    border-top: 4px solid #23fb00;
    background-color: #adffa2;
}
.state-info,
.state-info-ve {
    border-top: 4px solid #183e99;
    background-color: #d4e2ff;
}
.state-warning,
.state-warning-ve {
    border-top: 4px solid #ffa800;
    background-color: #ffda93;
}
.state-critical,
.state-critical-ve {
    border-top: 4px solid #ff0000;
    background-color: #ffb9b9;
}
.state-error,
.state-error-ve {
    border-top: 4px solid #ff0000;
    background-color: #ff7f7f;
}
div.icoDevice {
    float: left;
    width: 64px;
    height: 64px;
    margin: 5px;
    background: url("../icons/device_sprite.png") no-repeat transparent;
}
.systemmonitor-server div.icoDevice { background-position: 0 0; }
.systemmonitor-ve div.icoDevice { background-position: -64px 0; }
.systemmonitor-network div.icoDevice { background-position: -128px 0; }
div.statusDevice,
div.statusMsg { float: left; }
div.statusMsg p {
    float: left;
    padding: 5px;
}
.systemmonitor-state .status {
    margin: 5px;
}
.status {
    float: right;
    width: 32px;
    height: 32px;
    background: url("../icons/x32_sprite.png") no-repeat transparent;
}
div.status {
    float: left !important;
}
.state-warning .status,
.state-warning-ve .status { background-position: 0 -143px; }
.state-no_state .status,
.state-no_state-ve .status,
.state-unknown .status,
.state-unknown-ve .status { background-position: 0 -207px; }
.state-ok .status,
.state-ok-ve .status { background-position: 0 -270px; }
.state-info .status,
.state-info-ve .status { background-position: 0 -336px; }
.state-error .status,
.state-error-ve .status { background-position: 0 -400px; }
.state-critical .status,
.state-critical-ve .status { background-position: 0 -463px; }
/* Usage unknown
.systemmonitor-content table {
    border: none;
    margin-top: 10px;
}
.systemmonitor-content * .online {
    border: 1px solid #ffffff;
    background-color: #E3FFB8;
    color: #000000;
    padding:0px 5px;
}
.systemmonitor-content * .offline {
    border: 1px solid #ffffff;
    background-color: #d12f19;
    color:#ffffff;
    padding:0px 5px;
}*/
/* Dashboard */
.dashboard-modules {
    float:left;
    width:60px;
    height: 60px;
    border:1px dotted #888888;
    border-radius:5px;
    background-color: #cccccc;
    margin:10px;
    background-position: center 5px;
    background-repeat: no-repeat;
    text-align: center;
}
.dashboard-modules a,
.dashboard-modules a:hover {
    background: url("../icons/x32_sprite.png") no-repeat transparent;
    color:Black;
    display:block;
    font-weight:bold;
    height:30px;
    padding-top:42px;
    width:60px;
    text-decoration: none;
}
.dashboard-modules.tools a { background-position: 12px -9px; }
.dashboard-modules.admin a { background-position: 12px -73px; }
.dashboard-modules.sites a { background-position: 12px -520px; }
.dashboard-modules.monitor a { background-position: 13px -585px; }
.dashboard-modules.help a { background-position: 13px -716px; }
.dashboard-modules.mail a { background-position: 12px -776px; }
.dashboard-modules.vm a { background-position: 14px -842px; }
.dashboard-modules.domain a { background-position: 12px -905px; }
.dashboard-modules.dns a { background-position: 12px -970px; }
.dashboard-modules.client a { background-position: 13px -1096px; }
.dashboard-modules.billing a { background-position: 14px -1162px; }
.panel_dashboard h2 { font-size:20px; }
/* Image-Replacement */
.swap { background-repeat:no-repeat; }
.swap span { display:none; height:16px; }
#ir-HeaderLogo {
    background-image: url("../images/header_logo.png");
    height:32px;
    margin:0 0 0.2em;
}
div#ir-Yes,
div#ir-No {
    text-align: center;
    background: url("../icons/x16_sprite.png") no-repeat transparent;
}
#ir-Yes {
    background-position: center -342px !important;
    height: 16px;
}
#ir-No {
    background-position: center -362px !important;
    height: 16px;
}
.swap {
    background-repeat: no-repeat;
}
.swap span {
    display: none;
    height: 16px;
}
/* BUTTONS */
a.button,
.button,
.buttons button {
    display: inline-block;
    margin: 0 2px;
    padding: 2px 5px;
    color: #525252;
    text-shadow: 0px 1px 1px #fff;
    border: 1px solid #c6c6c6;
    border-radius: 4px;
    background-color: #f7f7f7;
    box-shadow: 0 1px 1px 0 rgba(140, 140, 140, 0.3);
    -o-box-shadow: 0 1px 1px 0 rgba(140, 140, 140, 0.3);
    -webkit-box-shadow: 0 1px 1px 0 rgba(140, 140, 140, 0.3);
    -moz-box-shadow: 0 1px 1px 0 rgba(140, 140, 140, 0.3);
    text-decoration: none;
}
a.button:focus,
input.button:focus,
.buttons button:focus {
    border-color: #4fadd5;
    box-shadow: 0 0 2px 1px rgba(71,135,177, 0.6);
    -moz-box-shadow: 0 0 2px 1px rgba(71,135,177, 0.6);
    -webkit-box-shadow: 0 0 2px 1px rgba(71,135,177, 0.6);
    -o-box-shadow: 0 0 2px 1px rgba(71,135,177, 0.6);
    outline: none;
}
.buttons button[type]{
    padding:5px 10px 5px 7px; /* Firefox */
    line-height:17px; /* Safari */
    white-space: nowrap;
}
*:first-child+html button[type]{
    padding:4px 10px 3px 7px; /* IE7 */
}
.buttons button img,
.buttons a img {
    margin:0 3px -3px 0 !important;
    padding:0;
    border:none;
    width:16px;
    height:16px;
}
.topbuttons {
    margin-bottom: 10px;
}
/* BUTTONS STANDARD */
button:hover,
.buttons a:hover {
    background-color:#dff4ff;
    border:1px solid #c2e1ef;
    color:#336699;
}
.buttons a:active {
    background-color:#6299c5;
    border:1px solid #6299c5;
    color:#fff;
}
/* BUTTONS POSITIVE */
button.positive,
.buttons a.positive { color:#529214; }
.buttons a.positive:hover,
button.positive:hover {
    background-color:#E6EFC2;
    border:1px solid #C6D880;
    color:#529214;
}
.buttons a.positive:active {
    background-color:#529214;
    border:1px solid #529214;
    color:#fff;
}
/* BUTTONS NEGATIVE */
.buttons a.negative,
button.negative {
    color:#d12f19;
}
.buttons a.negative:hover,
button.negative:hover {
    background-color:#fbe3e4;
    border:1px solid #fbc2c4;
    color:#d12f19;
}
.buttons a.negative:active {
    background-color:#d12f19;
    border:1px solid #d12f19;
    color:#fff;
}
/* Button with icon and text */
.iconstxt { background: url("../icons/button_sprite.png") no-repeat transparent; }
.iconstxt span { padding-left: 20px; font-weight: bold; }
.iconstxt.icoPositive { background-position: 6px -130px; }
.iconstxt.icoNegative { background-position: 6px -98px; }
.iconstxt.icoAdd { background-position: 6px -66px; }
.iconstxt.icoKey { background-position: 6px -1px; }
.iconstxt.icoDelete { background-position: 6px -34px; }
.iconstxt.icoDownload { background-position: 6px -1px; }
.iconstxt.icoRestore { background-position: 6px -1px; }
/* Button with icon and without text */
.icons16 { position: relative; }
.icons16>span {
    opacity: 0;
    visibility: hidden;
    -webkit-transition: opacity 1s linear;
    -moz-transition: opacity 1s linear;
    -o-transition: opacity 1s linear;
    -ms-transition: opacity 1s linear;
    transition: opacity 1s linear;
    position: absolute;
    right: 23px;
    top: -1px;
    padding: 1px 2px;
    border: 1px solid rgb(155,155,11);
    background: rgb(255,255,111);
    white-space: nowrap;
}
.icons16:hover>span {
    opacity: 1.0;
    visibility: visible;
}
a.icons16 {
    height: 18px;
    width: 18px;
    padding: 0;
    background: url("../icons/x16_sprite.png") no-repeat transparent;
}
button.icons16 {
    height: 20px;
    width: 20px;
    padding: 0;
    background: url("../icons/x16_sprite.png") no-repeat transparent;
}
.icons16.icoEdit { background-position: -1px -1px; }
.icons16.icoLoginAs { background-position: -1px -21px; }
.icons16.icoPDF { background-position: -1px -61px; }
.icons16.icoDelete { background-position: -1px -81px; }
.icons16.icoWebmailer { background-position: -1px -101px; }
.icons16.icoFilter { background-position: -1px -161px; }
.icons16.icoDbAdmin { background-position: -1px -221px; }
.icons16.icoAction { background-position: -1px -241px; }
.icons16.icoLink { background-position: -1px -422px; float: right; }
div.group-icon {
    float: left;
    padding: 2px 0;
}
.group-admin,
.group-user {
    height: 20px;
    width: 20px;
    padding: 0;
    float: left;
    background: url("../icons/x16_sprite.png") no-repeat transparent;
}
.group-admin { background-position: 0 -380px; }
.group-user { background-position: 0 -400px; }
span.marked { color: #cc0000; }
span.small { font-size: 0.9em; }
#ajaxloader {
    position: absolute;
    width: 325px;
    height: 150px;
    background: #ffffff url('../images/ajax-loader.gif') no-repeat center center;
    border: solid 2px #e1e1e1;
    border-radius: 10px;
    /*background: rgba(255, 255, 255, 0.85);*/
    padding: 20px;
    text-align:center;
    z-index: 100;
}
.blockLabel.email_at {
    width: 20px !important;
    margin: 1.6em 0.3em 0 0 !important;
}
.textDisplay { display: block; }
/* Form Length Classes */
.textInput.formLengthBool { width: 25px !important; }
.selectInput.formLengthBool { width: 60px !important; }
.textInput.formLengthLimit { width: 50px !important; }
.selectInput.formLengthLimit { width: 85px !important; }
.formLengthDate { width: 75px !important; }
.formLengthIPv4 { width: 125px !important; }
.formLengthIPv6 { }
.formLengthEmailUser { width: 30% !important; }
.formLengthEmailDomain { width: 30% !important; }
.formLengthHalf { width: 15% !important; }
.formLengthDouble { width: 50% !important; }
/* Individual Form Lengths */
.textInput#username,
.textInput#password,
.textInput#passwort,
.textInput#source_password { width: 100px; }
.selectInput#language {    width: 75px; }
.selectInput#client_group_id, .selectInput#default_group { width: 125px; }
input#refresh, input#retry, input#expire, input#minimum, input#ttl { width: 50px !important; }
/* --- */
a[href $="#logout"] {
    padding-right: 20px;
    background: url("../icons/x16_sprite.png") no-repeat right -143px transparent !important;
}
/* Select Menu with Images */
select.withicons option {
    background-repeat:no-repeat;
    background-position: 1px;
    padding-left:24px;
}
div[class^=country-] {
    background-image: url("../icons/flags_sprite.png");
    background-repeat: no-repeat;
    height: 20px;
    width: 26px;
}
li[class^=country-] {
    background-image: url("../icons/flags_sprite.png");
    background-repeat: no-repeat;
    text-indent: 24px;
}
li[class^=country-] a.ui-state-hover { background: transparent; }
div[class^=country-] span {
    display: none;
}
select.flags option {
    background-image: url("../icons/flags_sprite.png");
    background-repeat: no-repeat;
    padding: 1px 0 1px 30px;
}
select.flags option[value=EL] {background-position:0 -1475px}
select.flags option[value=AD], select.flags option[value=ad], .country-AD {background-position:0 -1px}
select.flags option[value=AE], select.flags option[value=ae], .country-AE {background-position:0 -23px}
select.flags option[value=AF], select.flags option[value=af], .country-AF {background-position:0 -45px}
select.flags option[value=AG], select.flags option[value=ag], .country-AG {background-position:0 -67px}
select.flags option[value=AI], select.flags option[value=ai], .country-AI {background-position:0 -89px}
select.flags option[value=AL], select.flags option[value=al], .country-AL {background-position:0 -111px}
select.flags option[value=AM], select.flags option[value=am], .country-AM {background-position:0 -133px}
select.flags option[value=AN], select.flags option[value=an], .country-AN {background-position:0 -155px}
select.flags option[value=AO], select.flags option[value=ao], .country-AO {background-position:0 -177px}
select.flags option[value=AQ], select.flags option[value=aq], .country-AQ {background-position:0 -199px}
select.flags option[value=AR], select.flags option[value=ar], .country-AR {background-position:0 -221px}
select.flags option[value=AS], select.flags option[value=as], .country-AS {background-position:0 -243px}
select.flags option[value=AT], select.flags option[value=at], .country-AT {background-position:0 -265px}
select.flags option[value=AU], select.flags option[value=au], .country-AU {background-position:0 -287px}
select.flags option[value=AW], select.flags option[value=aw], .country-AW {background-position:0 -309px}
select.flags option[value=AX], select.flags option[value=ax], .country-AX {background-position:0 -331px}
select.flags option[value=AZ], select.flags option[value=az], .country-AZ {background-position:0 -353px}
select.flags option[value=BA], select.flags option[value=ba], .country-BA {background-position:0 -375px}
select.flags option[value=BB], select.flags option[value=bb], .country-BB {background-position:0 -397px}
select.flags option[value=BD], select.flags option[value=bd], .country-BD {background-position:0 -419px}
select.flags option[value=BE], select.flags option[value=be], .country-BE {background-position:0 -441px}
select.flags option[value=BF], select.flags option[value=bf], .country-BF {background-position:0 -463px}
select.flags option[value=BG], select.flags option[value=bg], .country-BG {background-position:0 -485px}
select.flags option[value=BH], select.flags option[value=bh], .country-BH {background-position:0 -507px}
select.flags option[value=BI], select.flags option[value=bi], .country-BI {background-position:0 -529px}
select.flags option[value=BJ], select.flags option[value=bj], .country-BJ {background-position:0 -551px}
select.flags option[value=BM], select.flags option[value=bm], .country-BM {background-position:0 -573px}
select.flags option[value=BN], select.flags option[value=bn], .country-BN {background-position:0 -595px}
select.flags option[value=BO], select.flags option[value=bo], .country-BO {background-position:0 -617px}
select.flags option[value=BR], select.flags option[value=br], .country-BR {background-position:0 -639px}
select.flags option[value=BS], select.flags option[value=bs], .country-BS {background-position:0 -661px}
select.flags option[value=BT], select.flags option[value=bt], .country-BT {background-position:0 -683px}
select.flags option[value=BV], select.flags option[value=bv], .country-BV {background-position:0 -705px}
select.flags option[value=BW], select.flags option[value=bw], .country-BW {background-position:0 -727px}
select.flags option[value=BY], select.flags option[value=by], .country-BY {background-position:0 -749px}
select.flags option[value=BZ], select.flags option[value=bz], .country-BZ {background-position:0 -771px}
select.flags option[value=CA], select.flags option[value=ca], .country-CA {background-position:0 -793px}
select.flags option[value=CC], select.flags option[value=cc], .country-CC {background-position:0 -837px}
select.flags option[value=CD], select.flags option[value=cd], .country-CD {background-position:0 -859px}
select.flags option[value=CF], select.flags option[value=cf], .country-CF {background-position:0 -881px}
select.flags option[value=CG], select.flags option[value=cg], .country-CG {background-position:0 -903px}
select.flags option[value=CH], select.flags option[value=ch], .country-CH {background-position:0 -925px}
select.flags option[value=CI], select.flags option[value=ci], .country-CI {background-position:0 -947px}
select.flags option[value=CK], select.flags option[value=ck], .country-CK {background-position:0 -969px}
select.flags option[value=CL], select.flags option[value=cl], .country-CL {background-position:0 -991px}
select.flags option[value=CM], select.flags option[value=cm], .country-CM {background-position:0 -1013px}
select.flags option[value=CN], select.flags option[value=cn], .country-CN {background-position:0 -1035px}
select.flags option[value=CO], select.flags option[value=co], .country-CO {background-position:0 -1057px}
select.flags option[value=CR], select.flags option[value=cr], .country-CR {background-position:0 -1079px}
select.flags option[value=CS], select.flags option[value=cs], .country-CS {background-position:0 -1101px}
select.flags option[value=CU], select.flags option[value=cu], .country-CU {background-position:0 -1123px}
select.flags option[value=CV], select.flags option[value=cv], .country-CV {background-position:0 -1145px}
select.flags option[value=CX], select.flags option[value=cx], .country-CX {background-position:0 -1167px}
select.flags option[value=CY], select.flags option[value=cy], .country-CY {background-position:0 -1189px}
select.flags option[value=CZ], select.flags option[value=cz], .country-CZ {background-position:0 -1211px}
select.flags option[value=DE], select.flags option[value=de], .country-DE {background-position:0 -1233px}
select.flags option[value=DJ], select.flags option[value=dj], .country-DJ {background-position:0 -1255px}
select.flags option[value=DK], select.flags option[value=dk], .country-DK {background-position:0 -1277px}
select.flags option[value=DM], select.flags option[value=dm], .country-DM {background-position:0 -1299px}
select.flags option[value=DO], select.flags option[value=do], .country-DO {background-position:0 -1321px}
select.flags option[value=DZ], select.flags option[value=dz], .country-DZ {background-position:0 -1343px}
select.flags option[value=EC], select.flags option[value=ec], .country-EC {background-position:0 -1365px}
select.flags option[value=EE], select.flags option[value=ee], .country-EE {background-position:0 -1387px}
select.flags option[value=EG], select.flags option[value=eg], .country-EG {background-position:0 -1409px}
select.flags option[value=EH], select.flags option[value=eh], .country-EH {background-position:0 -1431px}
select.flags option[value=ER], select.flags option[value=er], .country-ER {background-position:0 -1475px}
select.flags option[value=ES], select.flags option[value=es], .country-ES {background-position:0 -1497px}
select.flags option[value=ET], select.flags option[value=ET], select.flags option[value=et], .country-ET {background-position:0 -1519px}
select.flags option[value=FI], select.flags option[value=fi], .country-FI {background-position:0 -1585px}
select.flags option[value=FJ], select.flags option[value=fj], .country-FJ {background-position:0 -1607px}
select.flags option[value=FK], select.flags option[value=fk], .country-FK {background-position:0 -1629px}
select.flags option[value=FM], select.flags option[value=fm], .country-FM {background-position:0 -1651px}
select.flags option[value=FO], select.flags option[value=fo], .country-FO {background-position:0 -1673px}
select.flags option[value=FR], select.flags option[value=fr], .country-FR {background-position:0 -1695px}
select.flags option[value=GA], select.flags option[value=ga], .country-GA {background-position:0 -1717px}
select.flags option[value=GB], select.flags option[value=en], select.flags option[value=gb], .country-GB, .country-EN {background-position:0 -1739px}
select.flags option[value=GD], select.flags option[value=gd], .country-GD {background-position:0 -1761px}
select.flags option[value=GE], select.flags option[value=ge], .country-GE {background-position:0 -1783px}
select.flags option[value=GF], select.flags option[value=gf], .country-GF {background-position:0 -1805px}
select.flags option[value=GH], select.flags option[value=gh], .country-GH {background-position:0 -1827px}
select.flags option[value=GI], select.flags option[value=gi], .country-GI {background-position:0 -1849px}
select.flags option[value=GL], select.flags option[value=gl], .country-GL {background-position:0 -1871px}
select.flags option[value=GM], select.flags option[value=gm], .country-GM {background-position:0 -1893px}
select.flags option[value=GN], select.flags option[value=gn], .country-GN {background-position:0 -1915px}
select.flags option[value=GP], select.flags option[value=gp], .country-GP {background-position:0 -1937px}
select.flags option[value=GQ], select.flags option[value=gq], .country-GQ {background-position:0 -1959px}
select.flags option[value=GR], select.flags option[value=el], select.flags option[value=gr], .country-GR, .country-EL {background-position:0 -1981px}
select.flags option[value=GS], select.flags option[value=gs], .country-GS {background-position:0 -2003px}
select.flags option[value=GT], select.flags option[value=gt], .country-GT {background-position:0 -2025px}
select.flags option[value=GU], select.flags option[value=gu], .country-GU {background-position:0 -2047px}
select.flags option[value=GW], select.flags option[value=gw], .country-GW {background-position:0 -2069px}
select.flags option[value=GY], select.flags option[value=gy], .country-GY {background-position:0 -2091px}
select.flags option[value=HK], select.flags option[value=hk], .country-HK {background-position:0 -2113px}
select.flags option[value=HM], select.flags option[value=hm], .country-HM {background-position:0 -2135px}
select.flags option[value=HN], select.flags option[value=hn], .country-HN {background-position:0 -2157px}
select.flags option[value=HR], select.flags option[value=hr], .country-HR {background-position:0 -2179px}
select.flags option[value=HT], select.flags option[value=ht], .country-HT {background-position:0 -2201px}
select.flags option[value=HU], select.flags option[value=hu], .country-HU {background-position:0 -2223px}
select.flags option[value=ID], select.flags option[value=id], .country-ID {background-position:0 -2245px}
select.flags option[value=IE], select.flags option[value=ie], .country-IE {background-position:0 -2267px}
select.flags option[value=IL], select.flags option[value=il], .country-IL {background-position:0 -2289px}
select.flags option[value=IN], select.flags option[value=in], .country-IN {background-position:0 -2311px}
select.flags option[value=IO], select.flags option[value=io], .country-IO {background-position:0 -2333px}
select.flags option[value=IQ], select.flags option[value=iq], .country-IQ {background-position:0 -2355px}
select.flags option[value=IR], select.flags option[value=ir], .country-IR {background-position:0 -2377px}
select.flags option[value=IS], select.flags option[value=is], .country-IS {background-position:0 -2399px}
select.flags option[value=IT], select.flags option[value=it], .country-IT {background-position:0 -2421px}
select.flags option[value=JM], select.flags option[value=jm], .country-JM {background-position:0 -2443px}
select.flags option[value=JO], select.flags option[value=jo], .country-JO {background-position:0 -2465px}
select.flags option[value=JP], select.flags option[value=ja], select.flags option[value=jp], .country-JP, .country-JA {background-position:0 -2487px}
select.flags option[value=KE], select.flags option[value=ke], .country-KE {background-position:0 -2509px}
select.flags option[value=KG], select.flags option[value=kg], .country-KG {background-position:0 -2531px}
select.flags option[value=KH], select.flags option[value=kh], .country-KH {background-position:0 -2553px}
select.flags option[value=KI], select.flags option[value=ki], .country-KI {background-position:0 -2575px}
select.flags option[value=KM], select.flags option[value=km], .country-KM {background-position:0 -2597px}
select.flags option[value=KN], select.flags option[value=kn], .country-KN {background-position:0 -2619px}
select.flags option[value=KP], select.flags option[value=kp], .country-KP {background-position:0 -2641px}
select.flags option[value=KR], select.flags option[value=kr], .country-KR {background-position:0 -2663px}
select.flags option[value=KW], select.flags option[value=kw], .country-KW {background-position:0 -2685px}
select.flags option[value=KY], select.flags option[value=ky], .country-KY {background-position:0 -2707px}
select.flags option[value=KZ], select.flags option[value=kz], .country-KZ {background-position:0 -2729px}
select.flags option[value=LA], select.flags option[value=la], .country-LA {background-position:0 -2751px}
select.flags option[value=LB], select.flags option[value=lb], .country-LB {background-position:0 -2773px}
select.flags option[value=LC], select.flags option[value=lc], .country-LC {background-position:0 -2795px}
select.flags option[value=LI], select.flags option[value=li], .country-LI {background-position:0 -2817px}
select.flags option[value=LK], select.flags option[value=lk], .country-LK {background-position:0 -2839px}
select.flags option[value=LR], select.flags option[value=lr], .country-LR {background-position:0 -2861px}
select.flags option[value=LS], select.flags option[value=ls], .country-LS {background-position:0 -2883px}
select.flags option[value=LT], select.flags option[value=lt], .country-LT {background-position:0 -2905px}
select.flags option[value=LU], select.flags option[value=lu], .country-LU {background-position:0 -2927px}
select.flags option[value=LV], select.flags option[value=lv], .country-LV {background-position:0 -2949px}
select.flags option[value=LY], select.flags option[value=ly], .country-LY {background-position:0 -2971px}
select.flags option[value=MA], select.flags option[value=ma], .country-MA {background-position:0 -2993px}
select.flags option[value=MC], select.flags option[value=mc], .country-MC {background-position:0 -3015px}
select.flags option[value=MD], select.flags option[value=md], .country-MD {background-position:0 -3037px}
select.flags option[value=ME], select.flags option[value=me], .country-ME {background-position:0 -3059px}
select.flags option[value=MG], select.flags option[value=mg], .country-MG {background-position:0 -3081px}
select.flags option[value=MH], select.flags option[value=mh], .country-MH {background-position:0 -3103px}
select.flags option[value=MK], select.flags option[value=mk], .country-MK {background-position:0 -3125px}
select.flags option[value=ML], select.flags option[value=ml], .country-ML {background-position:0 -3147px}
select.flags option[value=MM], select.flags option[value=mm], .country-MM {background-position:0 -3169px}
select.flags option[value=MN], select.flags option[value=mn], .country-MN {background-position:0 -3191px}
select.flags option[value=MO], select.flags option[value=mo], .country-MO {background-position:0 -3213px}
select.flags option[value=MP], select.flags option[value=mp], .country-MP {background-position:0 -3235px}
select.flags option[value=MQ], select.flags option[value=mq], .country-MQ {background-position:0 -3257px}
select.flags option[value=MR], select.flags option[value=mr], .country-MR {background-position:0 -3279px}
select.flags option[value=MS], select.flags option[value=ms], .country-MS {background-position:0 -3301px}
select.flags option[value=MT], select.flags option[value=mt], .country-MT {background-position:0 -3323px}
select.flags option[value=MU], select.flags option[value=mu], .country-MU {background-position:0 -3345px}
select.flags option[value=MV], select.flags option[value=mv], .country-MV {background-position:0 -3367px}
select.flags option[value=MW], select.flags option[value=mw], .country-MW {background-position:0 -3389px}
select.flags option[value=MX], select.flags option[value=mx], .country-MX {background-position:0 -3411px}
select.flags option[value=MY], select.flags option[value=my], .country-MY {background-position:0 -3433px}
select.flags option[value=MZ], select.flags option[value=mz], .country-MZ {background-position:0 -3455px}
select.flags option[value=NA], select.flags option[value=na], .country-NA {background-position:0 -3477px}
select.flags option[value=NC], select.flags option[value=nc], .country-NC {background-position:0 -3499px}
select.flags option[value=NE], select.flags option[value=ne], .country-NE {background-position:0 -3521px}
select.flags option[value=NF], select.flags option[value=nf], .country-NF {background-position:0 -3543px}
select.flags option[value=NG], select.flags option[value=ng], .country-NG {background-position:0 -3565px}
select.flags option[value=NI], select.flags option[value=ni], .country-NI {background-position:0 -3587px}
select.flags option[value=NL], select.flags option[value=nl], .country-NL {background-position:0 -3609px}
select.flags option[value=NO], select.flags option[value=no], .country-NO {background-position:0 -3631px}
select.flags option[value=NP], select.flags option[value=np], .country-NP {background-position:0 -3653px}
select.flags option[value=NR], select.flags option[value=nr], .country-NR {background-position:0 -3675px}
select.flags option[value=NU], select.flags option[value=nu], .country-NU {background-position:0 -3697px}
select.flags option[value=NZ], select.flags option[value=nz], .country-NZ {background-position:0 -3719px}
select.flags option[value=OM], select.flags option[value=om], .country-OM {background-position:0 -3741px}
select.flags option[value=PA], select.flags option[value=pa], .country-PA {background-position:0 -3763px}
select.flags option[value=PE], select.flags option[value=pe], .country-PE {background-position:0 -3785px}
select.flags option[value=PF], select.flags option[value=pf], .country-PF {background-position:0 -3807px}
select.flags option[value=PG], select.flags option[value=pg], .country-PG {background-position:0 -3829px}
select.flags option[value=PH], select.flags option[value=ph], .country-PH {background-position:0 -3851px}
select.flags option[value=PK], select.flags option[value=pk], .country-PK {background-position:0 -3873px}
select.flags option[value=PL], select.flags option[value=pl], .country-PL {background-position:0 -3895px}
select.flags option[value=PM], select.flags option[value=pm], .country-PM {background-position:0 -3917px}
select.flags option[value=PN], select.flags option[value=pn], .country-PN {background-position:0 -3939px}
select.flags option[value=PR], select.flags option[value=pr], .country-PR {background-position:0 -3961px}
select.flags option[value=PS], select.flags option[value=ps], .country-PS {background-position:0 -3983px}
select.flags option[value=PT], select.flags option[value=pt], .country-PT {background-position:0 -4005px}
select.flags option[value=PW], select.flags option[value=pw], .country-PW {background-position:0 -4027px}
select.flags option[value=PY], select.flags option[value=py], .country-PY {background-position:0 -4049px}
select.flags option[value=QA], select.flags option[value=qa], .country-QA {background-position:0 -4071px}
select.flags option[value=RE], select.flags option[value=re], .country-RE {background-position:0 -4093px}
select.flags option[value=RO], select.flags option[value=ro], .country-RO {background-position:0 -4115px}
select.flags option[value=RS], select.flags option[value=rs], .country-RS {background-position:0 -4137px}
select.flags option[value=RU], select.flags option[value=ru], .country-RU {background-position:0 -4159px}
select.flags option[value=RW], select.flags option[value=rw], .country-RW {background-position:0 -4181px}
select.flags option[value=SA], select.flags option[value=sa], .country-SA {background-position:0 -4203px}
select.flags option[value=SB], select.flags option[value=sb], .country-SB {background-position:0 -4225px}
select.flags option[value=SC], select.flags option[value=sc], .country-SC {background-position:0 -4247px}
select.flags option[value=SD], select.flags option[value=sd], .country-SD {background-position:0 -4291px}
select.flags option[value=SE], select.flags option[value=se], .country-SE {background-position:0 -4313px}
select.flags option[value=SG], select.flags option[value=sg], .country-SG {background-position:0 -4335px}
select.flags option[value=SH], select.flags option[value=sh], .country-SH {background-position:0 -4357px}
select.flags option[value=SI], select.flags option[value=si], .country-SI {background-position:0 -4379px}
select.flags option[value=SJ], select.flags option[value=sj], .country-SJ {background-position:0 -4401px}
select.flags option[value=SK], select.flags option[value=sk], .country-SK {background-position:0 -4423px}
select.flags option[value=SL], select.flags option[value=sl], .country-SL {background-position:0 -4445px}
select.flags option[value=SM], select.flags option[value=sm], .country-SM {background-position:0 -4467px}
select.flags option[value=SN], select.flags option[value=sn], .country-SN {background-position:0 -4489px}
select.flags option[value=SO], select.flags option[value=so], .country-SO {background-position:0 -4511px}
select.flags option[value=SR], select.flags option[value=sr], .country-SR {background-position:0 -4533px}
select.flags option[value=ST], select.flags option[value=st], .country-ST {background-position:0 -4555px}
select.flags option[value=SV], select.flags option[value=sv], .country-SV {background-position:0 -4577px}
select.flags option[value=SY], select.flags option[value=sy], .country-SY {background-position:0 -4599px}
select.flags option[value=SZ], select.flags option[value=sz], .country-SZ {background-position:0 -4621px}
select.flags option[value=TC], select.flags option[value=tc], .country-TC {background-position:0 -4643px}
select.flags option[value=TD], select.flags option[value=td], .country-TD {background-position:0 -4665px}
select.flags option[value=TF], select.flags option[value=tf], .country-TF {background-position:0 -4687px}
select.flags option[value=TG], select.flags option[value=tg], .country-TG {background-position:0 -4709px}
select.flags option[value=TH], select.flags option[value=th], .country-TH {background-position:0 -4731px}
select.flags option[value=TJ], select.flags option[value=tj], .country-TJ {background-position:0 -4753px}
select.flags option[value=TK], select.flags option[value=tk], .country-TK {background-position:0 -4775px}
select.flags option[value=TL], select.flags option[value=tl], .country-TL {background-position:0 -4797px}
select.flags option[value=TM], select.flags option[value=tm], .country-TM {background-position:0 -4819px}
select.flags option[value=TN], select.flags option[value=tn], .country-TN {background-position:0 -4841px}
select.flags option[value=TO], select.flags option[value=to], .country-TO {background-position:0 -4863px}
select.flags option[value=TR], select.flags option[value=tr], .country-TR {background-position:0 -4885px}
select.flags option[value=TT], select.flags option[value=tt], .country-TT {background-position:0 -4907px}
select.flags option[value=TV], select.flags option[value=tv], .country-TV {background-position:0 -4929px}
select.flags option[value=TW], select.flags option[value=tw], .country-TW {background-position:0 -4951px}
select.flags option[value=TZ], select.flags option[value=tz], .country-TZ {background-position:0 -4973px}
select.flags option[value=UA], select.flags option[value=ua], .country-UA {background-position:0 -4995px}
select.flags option[value=UG], select.flags option[value=ug], .country-UG {background-position:0 -5017px}
select.flags option[value=UM], select.flags option[value=um], .country-UM {background-position:0 -5039px}
select.flags option[value=US], select.flags option[value=us], .country-US {background-position:0 -5061px}
select.flags option[value=UY], select.flags option[value=uy], .country-UY {background-position:0 -5083px}
select.flags option[value=UZ], select.flags option[value=uz], .country-UZ {background-position:0 -5105px}
select.flags option[value=VA], select.flags option[value=va], .country-VA {background-position:0 -5127px}
select.flags option[value=VC], select.flags option[value=vc], .country-VC {background-position:0 -5149px}
select.flags option[value=VE], select.flags option[value=ve], .country-VE {background-position:0 -5171px}
select.flags option[value=VG], select.flags option[value=vg], .country-VG {background-position:0 -5193px}
select.flags option[value=VI], select.flags option[value=vi], .country-VI {background-position:0 -5215px}
select.flags option[value=VN], select.flags option[value=vn], .country-VN {background-position:0 -5237px}
select.flags option[value=VU], select.flags option[value=vu], .country-VU {background-position:0 -5259px}
select.flags option[value=WF], select.flags option[value=wf], .country-WF {background-position:0 -5303px}
select.flags option[value=WS], select.flags option[value=ws], .country-WS {background-position:0 -5325px}
select.flags option[value=YE], select.flags option[value=ye], .country-YE {background-position:0 -5347px}
select.flags option[value=YT], select.flags option[value=yt], .country-YT {background-position:0 -5369px}
select.flags option[value=ZA], select.flags option[value=za], .country-ZA {background-position:0 -5391px}
select.flags option[value=ZM], select.flags option[value=zm], .country-ZM {background-position:0 -5413px}
select.flags option[value=ZW], select.flags option[value=zw], .country-ZW {background-position:0 -5435px}
.panel_login {
    max-width: 80%;
    min-width: 680px;
}
div.subsectiontoggle {
    border:1px solid #ccc;
    font-weight:bold;
    font-size:14px;
    padding-top:10px;
    padding-bottom:0;
    margin-top:5px;
    text-indent:15px;
    cursor:pointer;
    margin-bottom:10px;
    background-color:#f4f4f4;
    -moz-border-radius:5px;
    -webkit-border-radius:5px;
    -khtml-border-radius:5px;
    -o-border-radius:5px;
    -ms-border-radius:5px;
    border-radius:5px;
}
div.subsectiontoggle span {
    display:inline-block;
    margin-bottom:-3px;
    margin-right:10px;
    width:16px;
    height:16px;
    background: url("../icons/button_sprite.png") 0 -72px no-repeat transparent;
}
div.subsectiontoggle span.showing{
    background-position: 0 -40px;
}
div.subsectiontoggle em {
    display:block;
    position:relative;
    left:425px;
    top:-13px;
    margin-bottom:-3px;
    width:13px;
    height:13px;
    background:url("../images/chevron.png") top left no-repeat;
    -webkit-transform:none;
    -moz-transform:none;
    -khtml-transform:none;
    -o-transform:none;
    -ms-transform:none;
    transform:none;
    -webkit-transition-duration: .2s;
    -moz-transition-duration: .2s;
    -khtml-transition-duration: .2s;
    -o-transition-duration: .2s;
    -ms-transition-duration: .2s;
    transition-duration: .2s;
    -webkit-transition-property: -webkit-transform;
    -moz-transition-property: -moz-transform;
    -khtml-transition-property: -khtml-transform;
    -o-transition-property: -o-transform;
    -ms-transition-property: -ms-transform;
    transition-property: transform;
}
div.subsectiontoggle em.showing {
    display:block;
    position:relative;
    left:425px;
    top:-13px;
    background:url("../images/chevron.png") top left no-repeat;
    width:13px;
    height:13px;
    -webkit-transform:rotate(90deg);
    -moz-transform:rotate(90deg);
    -khtml-transform:rotate(90deg);
    -o-transform:rotate(90deg);
    -ms-transform:rotate(90deg);
    transform:rotate(90deg);
}
div.subsectiontoggle:hover em {
    -webkit-transform:rotate(90deg);
    -moz-transform:rotate(90deg);
    -khtml-transform:rotate(90deg);
    -o-transform:rotate(90deg);
    -ms-transform:rotate(90deg);
    transform:rotate(90deg);
}
div.gs-container {
    margin-top:10px;
}
div.gs-container * {
    margin: 0;
    padding: 0;
    background-position: 0 0;
    text-decoration: none;
    font-size: 1em;
}
div.gs-container input {
    background: url("../icons/x16_sprite.png") no-repeat 2px -119px #FFFFFF;
    height:20px;
    border:1px solid #444;
    padding:0 22px 2px;
    color:#444;
    -moz-border-radius:5px;
    -webkit-border-radius:5px;
    -khtml-border-radius:5px;
    -o-border-radius:5px;
    -ms-border-radius:5px;
    border-radius:5px;
}
input.gs-loading {
    background-image: url("../images/loading.gif");
    background-repeat: no-repeat;
    background-position: center right;
}
ul.gs-resultbox {
    margin: 0 !important;
    padding: 0 !important;
    width: 300px;
    z-index: 999999;
    border: 1px solid #777;
    font-size: 11px;
    background: #fff;
    -moz-box-shadow: 2px 2px 5px 0 #c5c5c5;
    -webkit-box-shadow: 2px 2px 5px 0 #c5c5c5;
    -khtml-box-shadow: 2px 2px 5px 0 #c5c5c5;
    -o-box-shadow: 2px 2px 5px 0 #c5c5c5;
    -ms-box-shadow: 2px 2px 5px 0 #c5c5c5;
    box-shadow: 2px 2px 5px 0 #c5c5c5;
    list-style: none;
    -moz-border-radius:5px;
    -webkit-border-radius:5px;
    -khtml-border-radius:5px;
    -o-border-radius:5px;
    -ms-border-radius:5px;
    border-radius:5px;
    max-height:500px;
    overflow:auto;
}
ul.gs-resultbox li {
    float: left;
    width: 100%;
    clear: both;
    cursor: pointer;
}
ul.gs-resultbox li.gs-cheader {
    height: 13px;
    overflow: hidden;
    padding: 5px 0;
    color: #fff;
    background: #6ea6d1;
    cursor:default;
    padding-bottom:10px;
}
ul.gs-resultbox li.gs-cheader p.gs-cheader-title {
    margin: 0 !important;
    padding: 0 0 0 10px !important;
    float: left;
    font-size: 12px;
    font-weight: bold;
}
ul.gs-resultbox li.gs-cheader p.gs-cheader-limit {
    margin: 0 !important;
    padding: 0 10px 0 0 !important;
    float: right;
    font-size: 11px;
    font-weight: normal;
}
ul.gs-resultbox li.gs-cdata {
    margin: 0 !important;
    padding: 0 !important;
    border-bottom: 1px solid #c5c5c5;
}
ul.gs-resultbox li.gs-cdata:last-child {
    border-bottom: none;
}
ul.gs-resultbox li.gs-cdata:hover {
    background: #eaf4fd;
}
ul.gs-resultbox li.gs-cdata a {
    display: block;
    padding: 5px 10px;
    text-decoration: none !important;
    background: #fff;
}
ul.gs-resultbox li.gs-cdata a:hover {
    background: #cde0ff;
}
ul.gs-resultbox li.gs-cdata img {
    margin-right: 12px;
}
ul.gs-resultbox li.gs-cdata p {
    margin: 0 !important;
    padding: 0 !important;
    color: #444;
    font-size: 10px;
    min-height:30px;
}
ul.gs-resultbox li.gs-cdata p span.gs-cdata-title {
    display: inline !important;
    margin: 0 !important;
    padding: 0 !important;
    font-size: 11px;
    font-weight: bold;
    color: #000;
}
ul.gs-resultbox li:first-child {
    -moz-border-radius:5px 5px 0 0;
    -webkit-border-radius:5px 5px 0 0;
    -khtml-border-radius:5px 5px 0 0;
    -o-border-radius:5px 5px 0 0;
    -ms-border-radius:5px 5px 0 0;
    border-radius:5px 5px 0 0;
}
ul.gs-resultbox li:last-child {
    -moz-border-radius:0 0 5px 5px;
    -webkit-border-radius:0 0 5px 5px;
    -khtml-border-radius:0 0 5px 5px;
    -o-border-radius:0 0 5px 5px;
    -ms-border-radius:0 0 5px 5px;
    border-radius:0 0 5px 5px;
}
div.df-container {
}
div.df-container * {
    margin: 0;
    padding: 0;
    background-position: 0 0;
    text-decoration: none;
    font-size: 1em;
}
div.df-container input {
}
input.df-loading {
    background-image: url("../images/loading.gif");
    background-repeat: no-repeat;
    background-position: center right;
}
ul.df-resultbox {
    margin: 0 !important;
    padding: 0 !important;
    min-width: 250px;
    max-width: 500px;
    z-index: 999999;
    border: 1px solid #777;
    font-size: 11px;
    background: #fff;
    -moz-box-shadow: 2px 2px 5px 0 #c5c5c5;
    -webkit-box-shadow: 2px 2px 5px 0 #c5c5c5;
    -khtml-box-shadow: 2px 2px 5px 0 #c5c5c5;
    -o-box-shadow: 2px 2px 5px 0 #c5c5c5;
    -ms-box-shadow: 2px 2px 5px 0 #c5c5c5;
    box-shadow: 2px 2px 5px 0 #c5c5c5;
    list-style: none;
    -moz-border-radius:5px;
    -webkit-border-radius:5px;
    -khtml-border-radius:5px;
    -o-border-radius:5px;
    -ms-border-radius:5px;
    border-radius:5px;
}
ul.df-resultbox li {
    float: left;
    width: 100%;
    clear: both;
    cursor: pointer;
}
ul.df-resultbox li.df-cheader {
    height: 13px;
    overflow: hidden;
    padding: 5px 0;
    color: #fff;
    background: #6ea6d1;
    cursor:default;
    padding-bottom:10px;
}
ul.df-resultbox li.df-cheader p.df-cheader-title {
    margin: 0 !important;
    padding: 0 0 0 10px !important;
    float: left;
    font-size: 12px;
    font-weight: bold;
}
ul.df-resultbox li.df-cheader p.df-cheader-limit {
    margin: 0 !important;
    padding: 0 10px 0 0 !important;
    float: right;
    font-size: 11px;
    font-weight: normal;
}
ul.df-resultbox li.df-cdata {
    margin: 0 !important;
    padding: 0 !important;
    border-bottom: 1px solid #c5c5c5;
}
ul.df-resultbox li.df-cdata:last-child {
    border-bottom: none;
}
ul.df-resultbox li.df-cdata:hover {
    background: #eaf4fd;
}
ul.df-resultbox li.df-cdata a {
    display: block;
    padding: 5px 10px;
    text-decoration: none !important;
    background: #fff;
}
ul.df-resultbox li.df-cdata a:hover {
    background: #cde0ff;
}
ul.df-resultbox li.df-cdata img {
    margin-right: 12px;
}
ul.df-resultbox li.df-cdata p {
    margin: 0 !important;
    padding: 0 !important;
    color: #444;
    font-size: 10px;
    min-height:30px;
}
ul.df-resultbox li.df-cdata p span.df-cdata-title {
    display: inline !important;
    margin: 0 !important;
    padding: 0 !important;
    font-size: 11px;
    font-weight: bold;
    color: #000;
}
ul.df-resultbox li:first-child {
    -moz-border-radius:5px 5px 0 0;
    -webkit-border-radius:5px 5px 0 0;
    -khtml-border-radius:5px 5px 0 0;
    -o-border-radius:5px 5px 0 0;
    -ms-border-radius:5px 5px 0 0;
    border-radius:5px 5px 0 0;
}
ul.df-resultbox li:last-child {
    -moz-border-radius:0 0 5px 5px;
    -webkit-border-radius:0 0 5px 5px;
    -khtml-border-radius:0 0 5px 5px;
    -o-border-radius:0 0 5px 5px;
    -ms-border-radius:0 0 5px 5px;
    border-radius:0 0 5px 5px;
}
span.icons16-empty {
    float:left;
    display:block;
    height:20px;
    width:20px;
    margin:0 7px 0 0;
}
.ttip {
    width:16px;
    height:16px;
    cursor:pointer;
    background: url("../icons/x16_sprite.png") no-repeat -2px -42px transparent;
    float:right;
    display:inline;
    position:relative;
    right:-2px;
    top:-2px;
}
p.prefix {
    float: left;
    margin: 0;
    text-align: right;
}
p.label {
    float: left;
    margin: 5px 15px 0 0;
}
p.value {
    float:left;
    margin: 0 0 0 2px;
}
/* content_ispc
-------------------------------------------------------------- */
.tipsy {
    font-size: 10px;
    position: absolute;
    padding: 5px;
    z-index: 100000;
}
.tipsy-inner {
    background-color: #000;
    color: #FFF;
    max-width: 350px;
    padding: 5px 8px 4px 8px;
    text-align: left;
}
/* Rounded corners */
.tipsy-inner {
    border-radius: 5px;
    -moz-border-radius: 5px;
    -webkit-border-radius: 5px;
}
/* Uncomment for shadow */
/*.tipsy-inner { box-shadow: 0 0 5px #000000; -webkit-box-shadow: 0 0 5px #000000; -moz-box-shadow: 0 0 5px #000000; }*/
.tipsy-arrow {
    position: absolute;
    width: 0;
    height: 0;
    line-height: 0;
    border: 5px dashed #000;
}
/* Rules to colour arrows */
.tipsy-arrow-n { border-bottom-color: #000; }
.tipsy-arrow-s { border-top-color: #000; }
.tipsy-arrow-e { border-left-color: #000; }
.tipsy-arrow-w { border-right-color: #000; }
.tipsy-n .tipsy-arrow { top: 0px; left: 50%; margin-left: -5px; border-bottom-style: solid; border-top: none; border-left-color: transparent; border-right-color: transparent; }
.tipsy-nw .tipsy-arrow { top: 0; left: 10px; border-bottom-style: solid; border-top: none; border-left-color: transparent; border-right-color: transparent;}
.tipsy-ne .tipsy-arrow { top: 0; right: 10px; border-bottom-style: solid; border-top: none;  border-left-color: transparent; border-right-color: transparent;}
.tipsy-s .tipsy-arrow { bottom: 0; left: 50%; margin-left: -5px; border-top-style: solid; border-bottom: none;  border-left-color: transparent; border-right-color: transparent; }
.tipsy-sw .tipsy-arrow { bottom: 0; left: 10px; border-top-style: solid; border-bottom: none;  border-left-color: transparent; border-right-color: transparent; }
.tipsy-se .tipsy-arrow { bottom: 0; right: 10px; border-top-style: solid; border-bottom: none; border-left-color: transparent; border-right-color: transparent; }
.tipsy-e .tipsy-arrow { right: 0; top: 50%; margin-top: -5px; border-left-style: solid; border-right: none; border-top-color: transparent; border-bottom-color: transparent; }
.tipsy-w .tipsy-arrow { left: 0; top: 50%; margin-top: -5px; border-right-style: solid; border-left: none; border-top-color: transparent; border-bottom-color: transparent; }
/* uni-form-generic
-------------------------------------------------------------- */
/* Uni-Form by Dragan Babic [Superawesome Industries]  - http: //sprawsm.com/uni-form/ */
/* Some rights reserved - http: //creativecommons.org/licenses/by-sa/2.5/ */
/* Do not edit this file directly, make your changes to uni-form.css in the same folder */
.uniForm{ margin: 0; padding: 0; position: relative; z-index: 1; } /* reset stuff */
/* Some generals and more resets */
.uniForm fieldset{ border: none; margin: 0; padding: 0; }
.uniForm fieldset legend{ margin: 0; padding: 0; }
/* This is the main unit that contains our form elements */
.uniForm .ctrlHolder,
.uniForm .buttonHolder{ margin: 0; padding: 0; clear: both; }
/* Clear all floats */
.uniForm:after,
.uniForm .buttonHolder:after,
.uniForm .ctrlHolder:after,
.uniForm .ctrlHolder .multiField:after,
.uniForm .inlineLabel:after{ content: "."; display: block; height: 0; line-height: 0; font-size: 0; clear: both; min-height: 0; visibility: hidden; }
/* A class to be used on a label that contains a checkbox or a radio button */
.uniForm .inlineLabel,
.uniForm .inlineLabels .inlineLabel,
.uniForm .blockLabels .inlineLabel{ width: auto; float: none; margin: 0; display: block; }
/* IE shows borders & padding on checkboxes and radio buttons if they are declared on an input element, remove them */
/* Legacy/Inheritance fix */
.uniForm .inlineLabel input,
.uniForm .inlineLabels .inlineLabel input,
.uniForm .blockLabels .inlineLabel input{ border: none; padding: 0; margin: 0; }
/* Styles for form controls where labels are above the input elements */
/* Set the class of the parent (preferably to a fieldset) to .blockLabels */
.uniForm label,
.uniForm .label,
.uniForm .blockLabels label,
.uniForm .blockLabels .label{ display: block; float: none; padding: 0; line-height: 100%; width: auto; }
/* Float the input elements */
.uniForm .textInput,
.uniForm .blockLabels .textInput,
.uniForm .blockLabels .fileUpload,
.uniForm .selectInput,
.uniForm .blockLabels .selectInput,
.uniForm .blockLabels select,
.uniForm textarea,
.uniForm .blockLabels textarea{ float: left; }
/* Postition the hints */
.uniForm .formHint,
.uniForm .blockLabels .formHint{ float: right; margin: 0; clear: none; }
/* Position the elements inside combo boxes (multiple selects/checkboxes/radio buttons per unit) */
.uniForm .multiField,
.uniForm .blockLabels .multiField{ width: auto; float: left; }
.uniForm .multiField .inlineLabel,
.uniForm .blockLabels .multiField .inlineLabel{ display: block; margin: 0 0 .5em 0; }
.uniForm .multiField .blockLabel,
.uniForm .blockLabels .multiField .blockLabel{ float: left; width: auto; margin: 0; }
.uniForm .multiField .blockLabel .textInput,
.uniForm .multiField .blockLabel .selectInput,
.uniForm .multiField .blockLabel select,
.uniForm .blockLabels .multiField .blockLabel .textInput,
.uniForm .blockLabels .multiField .blockLabel .selectInput,
.uniForm .blockLabels .multiField .blockLabel select{ width: 100%; margin: 0; }
/* Styles for form controls where labels are in line with the input elements */
/* Set the class of the parent (preferably to a fieldset) to .inlineLabels */
.uniForm .inlineLabels label,
.uniForm .inlineLabels .label{ float: left; margin: 0; padding: 0; line-height: 100%; position: relative; }
/* Float the input elements */
.uniForm .inlineLabels .textInput,
.uniForm .inlineLabels .fileUpload,
.uniForm .inlineLabels .selectInput,
.uniForm .inlineLabels select,
.uniForm .inlineLabels textarea{ float: left; }
/* Postition the hints */
.uniForm .inlineLabels .formHint{ clear: both; float: none; }
.uniForm .inlineLabels .multiField{ float: left; }
.uniForm .inlineLabels .multiField .inlineLabel{}
.uniForm .inlineLabels .multiField .blockLabel{}
.uniForm .inlineLabels .multiField .blockLabel .textInput,
.uniForm .inlineLabels .multiField .blockLabel .selectInput,
.uniForm .inlineLabels .multiField .blockLabel select{ display: block; width: 100%; float: none; }
.uniForm .inlineLabels .multiField select{ float: left; }
/* Required fields asterisk styling for .blockLabels */
.uniForm label em,
.uniForm .label em,
.uniForm .blockLabels label em,
.uniForm .blockLabels .label em{ position: absolute; left: -7px; }
/* Required fields asterisk styling for .inlineLabels */
.uniForm .inlineLabels label em,
.uniForm .inlineLabels .label em{ display: block; position: absolute; left: auto; right: 0; font-style: normal; font-weight: bold; }
.uniForm .inlineLabel em{ position: absolute; left: 7px; }
/* Messages */
.uniForm #errorMsg,
.uniForm .error{}
.uniForm #errorMsg dt,
.uniForm #errorMsg h3{}
.uniForm #errorMsg dd{}
.uniForm #errorMsg ol{}
.uniForm #errorMsg ol li{}
.uniForm .errorField{}
.uniForm #OKMsg{}
/* Columns */
.uniForm .col{ float: left; }
.uniForm .col.first{}
.uniForm .col.last{}
/* uni-form
-------------------------------------------------------------- */
/* Keep in mind that wherever you see "Required property" it means that the property must exist */
/* ------------------------------------------------------------------------------ */
/* Generals */
.uniForm fieldset{}
.uniForm fieldset legend{ color: #333; font-weight: bold; font-size: 100%; margin: 0; padding: 1.5em 1.5em 1.5em 0; }
/* This is the main unit that contains our form elements */
.uniForm .ctrlHolder{ padding: 3px; border-bottom: 1px dotted #dfdfdf; }
.uniForm .buttonHolder{
    text-align: left;
    background: #CEDEEF url("../images/buttonHolder_bg.gif") no-repeat right;
    margin: 3em 0 1em;
    padding: 8px;
}
.uniForm .resetButton{ float: left; }
.uniForm .primaryAction{ font-weight: bold; }
/* This class gets added to div.ctrlHolder to highlight the row */
.uniForm .focused{ background: #fffcdf; }
/* .inlineLabel is used for inputs within labels - checkboxes and radio buttons */
.uniForm .inlineLabel input,
.uniForm .inlineLabels .inlineLabel input,
.uniForm .blockLabels .inlineLabel input{ float: left; margin: 0 .4em 0 0; }
.uniForm .inlineLabel span{ float: left; width: 90%; }
/* ------------------------------------------------------------------------------ */
/* .blockLabels (default style, will be applied even if you don"t class the parent element) */
.uniForm .blockLabels .ctrlHolder{}
.uniForm label,
.uniForm .blockLabels label,
.uniForm .blockLabels .label{ margin: 0 0 .5em 0; }
.uniForm .textInput,
.uniForm .blockLabels .textInput,
.uniForm .blockLabels .fileUpload{ width: 43%; /* <- Required property */ }
.uniForm .selectInput,
.uniForm select,
.uniForm .blockLabels .selectInput,
.uniForm .blockLabels select{ width: 43.5%; /* <- Required property */ }
.uniForm textarea,
.uniForm .blockLabels textarea{ width: 43%; /* <- Required property */ height: 12em; }
.uniForm .formHint,
.uniForm .blockLabels .formHint{ width: 55%; /* <- Required property */ font-size: .9em; color: #777; position: relative; top: -.5em; }
.uniForm .multiField,
.uniForm .blockLabels .multiField{ width: 43%; }
.uniForm .multiField .inlineLabel,
.uniForm .blockLabels .multiField .inlineLabel{ display: block; margin: 0 0 .5em 0; }
.uniForm .multiField .blockLabel,
.uniForm .blockLabels .multiField .blockLabel{ width: 30%; margin: 0 10px 0 0; }
.uniForm .multiField .blockLabel .textInput,
.uniForm .multiField .blockLabel .selectInput,
.uniForm .multiField .blockLabel select,
.uniForm .blockLabels .multiField .blockLabel .textInput,
.uniForm .blockLabels .multiField .blockLabel .selectInput,
.uniForm .blockLabels .multiField .blockLabel select{ width: 100%; margin: .3em 0 0 0; }
/* ------------------------------------------------------------------------------ */
/* .inlineLabels */
.uniForm .inlineLabels .ctrlHolder{}
.uniForm .inlineLabels label,
.uniForm .inlineLabels .label{ width: 20%; /* <- Required property */ margin: .3em 2% 0 0; /* <- Required property */ }
.uniForm .inlineLabels .textInput,
.uniForm .inlineLabels .fileUpload{ width: 35%; /* <- Required property */ }
.uniForm .inlineLabels .selectInput,
.uniForm .inlineLabels select{ width: 35%; /* <- Required property */ }
.uniForm .inlineLabels textarea{  width: 35%; /* <- Required property */ height: 12em; }
.uniForm .inlineLabels .formHint{ margin-top: 0; margin-left: 22%; font-size: .9em; color: #777; position: static; }
.uniForm .inlineLabels .multiField{ width: 60%; /* <- Required property */ margin: 0 0 .3em 0; }
.uniForm .inlineLabels .multiField .inlineLabel{ display: block; margin: 0 0 .5em 0; }
.uniForm .inlineLabels .multiField .blockLabel{ float: left; width: 26%; margin: 0 3% 0 0; }
.uniForm .inlineLabels .multiField .blockLabel .textInput,
.uniForm .inlineLabels .multiField .blockLabel .selectInput,
.uniForm .inlineLabels .multiField .blockLabel select{ width: 100%; margin: .3em 0 0 0; }
/* Focus pseudoclasses */
.uniForm .ctrlHolder .textInput:focus{ outline: none; /* Get rid of the "glow" effect in WebKit, optional */ }
.uniForm .ctrlHolder textarea:focus{ outline: none; /* Get rid of the "glow" effect in WebKit, optional */ }
.uniForm div.focused .formHint{ color: #333; }
/* Columns (they are floated left by default) */
.uniForm .col{ width: 37.9%; /* <- Required property */ margin: 0 2% 20px 0; }
/* Use .first and .last classes to control the layout/spacing of your columns */
.uniForm .col.first{ width: 39%; /* <- Required property */ float: left; clear: none; }
.uniForm .col.last{ width: 39%; /* <- Required property */ float: right; clear: none; margin-right: 0; }
/* Messages */
.uniForm #errorMsg, .confirmpassworderror{ background: #ffdfdf; border: 1px solid #df7d7d; border-width: 1px 0; margin: 1.5em 0 1.5em 0; padding: 7px; }
.uniForm .error{ background: #ffdfdf; border: 1px solid #df7d7d; border-width: 1px 0; }
.uniForm #errorMsg dt, .uniForm #errorMsg h3{ margin: 0 0 .5em 0; font-size: 100%; line-height: 100%; font-weight: bold; }
.uniForm #errorMsg dd{ margin: 0; padding: 0; }
.uniForm #errorMsg ol{ margin: 0; padding: 0; list-style:none;}
.uniForm #errorMsg ol li{ margin: 0; padding: 2px; list-style-position: inside; border-bottom: 1px dotted #df7d7d; position: relative; }
.uniForm .errorField{ color: #af4c4c; margin: 0 0 6px 0; padding: 4px; background: #ffbfbf; }
.uniForm #OKMsg, .confirmpasswordok{ background: #C8FFBF; border: 1px solid #A2EF95; border-width: 1px 0; margin: 1.5em 0 1.5em 0; padding: 7px; }
.uniForm #OKMsg p{ margin: 0; }
/* ------------------------------------------------------------------------------ */
/* This is the main unit that contains our form elements */
.uniForm .textInput, .uniForm .selectInput, .uniForm textarea {
    background:#FFFFFF none repeat scroll 0 0;
    color: #000000;
    border: 1px solid #DFDFDF;
    padding: 1px;
}
/* jquery-ui-custom
-------------------------------------------------------------- */
.ui-datepicker-calendar thead tr th {
    background-image:none;
    background-color:#FFFFFF;
    color:#000000;
}
.ui-widget { font-family: "Trebuchet MS", Arial, sans-serif; font-size: 100%; }
.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: "Trebuchet MS", Arial, sans-serif; font-size: 100%; }
ul.ui-autocomplete { max-height: 250px; overflow-y: auto; min-width: 85px;}
.ui-combobox { position: relative; display: inline-block; margin-right: 17px; }
.ui-combobox-toggle { position: absolute !important; top: 0; bottom: 0; margin-left: -1px; padding: 1px !important; background: none repeat scroll 0 0 #FFFFFF !important; border: 1px solid #DFDFDF !important;}
.ui-combobox-input { background: none repeat scroll 0 0 #FFFFFF !important; border: 1px solid #DFDFDF !important; padding: 1px; font-weight: normal !important; }
.panel_install_package .ui-combobox { float: left; }
.clear-float { clear: both; }
a.link-page, span.page-spacer {
    display: inline-block;
    text-align: center;
    padding: 2px;
    line-height: 16px;
    text-decoration: none !important;
    color: inherit !important;
    min-width: 16px;
}
a.link-page {
    border: 1px solid #FFFFFF;
    margin: 0 5px;
}
a.link-page:hover {
    background-color: #DFDFDF;
}
span.page-spacer {
    margin: 0 -5px;
}
a.link-page.current-page {
    background-color: #DFDFDF;
    font-weight: bold;
}
.command {
    padding: 1em;
    border: 1px dashed #2f6fab;
    color: black;
    background-color: #f9f9f9;
    line-height: 1.1em;
    font-family: Courier New, Courier, mono;
    font-size: 12px;
    font-style: italic;
}
.system {
    color: black;
    font-family: Courier New, Courier, mono;
    font-size: 12px;
    font-style: italic;
}
.highlight {
    color: #FF0000;
    font-family: Georgia, "Times New Roman", Times, serif;
    font-size: 12px;
    text-decoration: underline;
}
interface/web/themes/default/templates/main.tpl.htm
@@ -50,6 +50,9 @@
                
                // Store password in browser; works in Firefox, but not Chrome
                $('#username').live("blur", function(){
                    if($('#username').val() == '') {
                        return true;
                    }
                    if($('#dummy_username').val() == '' || $('#dummy_username').val() != $(this).val()){
                        $('#dummy_login').show();
                        $('#dummy_username').attr('value', $(this).val()).trigger('focus').trigger('blur');
interface/web/vm/openvz_ip_list.php
@@ -48,7 +48,7 @@
$app->uses('listform_actions');
// $app->listform_actions->SQLExtWhere = "limit_client = 0";
$app->listform_actions->SQLOrderBy = 'ORDER BY server_id,ip_address';
$app->listform_actions->SQLOrderBy = 'ORDER BY openvz_ip.server_id, openvz_ip.ip_address';
$app->listform_actions->onLoad();
interface/web/vm/openvz_vm_edit.php
@@ -96,19 +96,19 @@
            
            //* Get the limits of the client
            $client_group_id = $_SESSION["s"]["user"]["default_group"];
            $client = $app->db->queryOneRecord("SELECT client.client_id, client.contact_name, client.limit_openvz_vm_template_id, CONCAT(client.company_name,' :: ',client.contact_name) as contactname, sys_group.name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
            $client = $app->db->queryOneRecord("SELECT client.client_id, client.contact_name, client.limit_openvz_vm_template_id, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname, sys_group.name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
            
            
            //* Fill the client select field
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(client.company_name,' :: ',client.contact_name) as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id']." ORDER BY sys_group.name";
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ".$client['client_id']." ORDER BY sys_group.name";
            $records = $app->db->queryAllRecords($sql);
            $tmp = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ".$client['client_id']);
            $client_select = '<option value="'.$tmp['groupid'].'">'.$client['name'].' :: '.$client['contactname'].'</option>';
            $client_select = '<option value="'.$tmp['groupid'].'">'.$client['contactname'].'</option>';
            //$tmp_data_record = $app->tform->getDataRecord($this->id);
            if(is_array($records)) {
                foreach( $records as $rec) {
                    $selected = @(is_array($this->dataRecord) && ($client["groupid"] == $this->dataRecord['client_group_id'] || $client["groupid"] == $this->dataRecord['sys_groupid']))?'SELECTED':'';
                    $client_select .= "<option value='$rec[groupid]' $selected>$rec[name] :: $rec[contactname]</option>\r\n";
                    $client_select .= "<option value='$rec[groupid]' $selected>$rec[contactname]</option>\r\n";
                }
            }
            $app->tpl->setVar("client_group_id",$client_select);
@@ -132,14 +132,14 @@
        } else {
            //* Fill the client select field
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(client.company_name,' :: ',client.contact_name) as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id > 0 ORDER BY sys_group.name";
            $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id > 0 ORDER BY sys_group.name";
            $clients = $app->db->queryAllRecords($sql);
            $client_select = "<option value='0'></option>";
            //$tmp_data_record = $app->tform->getDataRecord($this->id);
            if(is_array($clients)) {
                foreach( $clients as $client) {
                    $selected = @(is_array($this->dataRecord) && ($client["groupid"] == $this->dataRecord['client_group_id'] || $client["groupid"] == $this->dataRecord['sys_groupid']))?'SELECTED':'';
                    $client_select .= "<option value='$client[groupid]' $selected>$client[name] :: $client[contactname]</option>\r\n";
                    $client_select .= "<option value='$client[groupid]' $selected>$client[contactname]</option>\r\n";
                }
            }
            $app->tpl->setVar("client_group_id",$client_select);
server/conf/getmail.conf.master
@@ -1,6 +1,6 @@
[options]
# message_log = /var/log/getmail.log
message_log_syslog = 1
message_log_syslog = true
delete = {DELETE}
read_all = {READ_ALL}
server/conf/mail/mail_quota_notification_de.txt
New file
@@ -0,0 +1,14 @@
MIME-Version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
From: {admin_mail}
Reply-To: {admin_mail}
Subject: E-Mail Kontobelegungshinweis
Ihr E-Mail Konto {email} hat den verfügbaren Speicherplatz (nahezu) ausgeschöpft.
E-Mail Konto:             {email}
Name:                {name}
Belegter Speicher:        {used}
Verfügbarer Speicher:        {quota}
Belegt:                {ratio}
server/conf/mail/mail_quota_notification_en.txt
New file
@@ -0,0 +1,14 @@
MIME-Version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
From: {admin_mail}
Reply-To: {admin_mail}
Subject: Mailbox quota notification
The mailbox {email} is near or over quota.
Mailbox:            {email}
Name:                {name}
Used space:            {used}
Quota:                {quota}
Usage ratio:            {ratio}
server/conf/mail/mail_quota_ok_notification_de.txt
New file
@@ -0,0 +1,14 @@
MIME-Version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
From: {admin_mail}
Reply-To: {admin_mail}
Subject: E-Mail Kontobelegungshinweis
Der belegte Speicherplatz Ihres E-Mail Kontos {email} ist wieder ok.
E-Mail Konto:             {email}
Name:                {name}
Belegter Speicher:        {used}
Verfügbarer Speicher:        {quota}
Belegt:                {ratio}
server/conf/mail/mail_quota_ok_notification_en.txt
New file
@@ -0,0 +1,14 @@
MIME-Version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
From: {admin_mail}
Reply-To: {admin_mail}
Subject: Mailbox quota ok
The mailbox {email} is no longer near or over quota.
Mailbox:            {email}
Name:                {name}
Used space:            {used}
Quota:                {quota}
Usage ratio:            {ratio}
server/conf/mail/web_quota_notification_de.txt
New file
@@ -0,0 +1,14 @@
MIME-Version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
From: {admin_mail}
Reply-To: {admin_mail}
Subject: Webseiten-Speicherhinweis
Ihre Webseite {domain} hat den verfügbaren Speicherplatz (nahezu) ausgeschöpft.
Webseite:                        {domain}
Belegter Speicherplatz:                    {used}
Verfügbarer Speicherplatz:                {soft}
Verfügbarer Speicherplatz (hard quota):            {hard}
Belegter Speicher in %:                    {ratio}
server/conf/mail/web_quota_notification_en.txt
New file
@@ -0,0 +1,14 @@
MIME-Version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
From: {admin_mail}
Reply-To: {admin_mail}
Subject: Website quota notification
The website {domain} is near or over quota.
Domain:         {domain}
Used space:        {used}
Soft limit:        {soft}
Hard limit:        {hard}
Usage ratio:        {ratio}
server/conf/mail/web_quota_ok_notification_de.txt
New file
@@ -0,0 +1,14 @@
MIME-Version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
From: {admin_mail}
Reply-To: {admin_mail}
Subject: Webseiten-Speicherhinweis
Der belegte Speicherplatz Ihrer Webseite {domain} ist wieder ok.
Webseite:                        {domain}
Belegter Speicherplatz:                    {used}
Verfügbarer Speicherplatz:                {soft}
Verfügbarer Speicherplatz (hard quota):            {hard}
Belegter Speicher in %:                    {ratio}
server/conf/mail/web_quota_ok_notification_en.txt
New file
@@ -0,0 +1,14 @@
MIME-Version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
From: {admin_mail}
Reply-To: {admin_mail}
Subject: Website quota ok
The website {domain} is no longer near or over quota.
Domain:         {domain}
Used space:        {used}
Soft limit:        {soft}
Hard limit:        {hard}
Usage ratio:        {ratio}
server/conf/mail/web_traffic_notification_de.txt
New file
@@ -0,0 +1,8 @@
MIME-Version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
From: {admin_mail}
Reply-To: {admin_mail}
Subject: Traffic-Warnung
Ihre Webseite {domain} hat den verfügbaren Traffic ausgeschöpft und wurde vorrübergehend deaktiviert.
server/conf/mail/web_traffic_notification_en.txt
@@ -1,3 +1,8 @@
Subject:Website traffic notification
MIME-Version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
From: {admin_mail}
Reply-To: {admin_mail}
Subject: Website traffic notification
The website {domain} is over traffic and has been disabled.
server/conf/nginx_vhost.conf.master
@@ -170,6 +170,10 @@
        }
</tmpl_if>
<tmpl_loop name="rewrite_rules">
        <tmpl_var name='rewrite_rule'>
</tmpl_loop>
<tmpl_loop name="nginx_directives">
        <tmpl_var name='nginx_directive'>
</tmpl_loop>
server/cron_daily.php
@@ -247,7 +247,7 @@
// Create webalizer statistics
#######################################################################################################
function setConfigVar( $filename, $varName, $varValue ) {
function setConfigVar( $filename, $varName, $varValue, $append = 0 ) {
    if($lines = @file($filename)) {
        $out = '';
        $found = 0;
@@ -641,6 +641,64 @@
    }
}
#########
// function for sending notification emails
#########
function send_notification_email($template, $placeholders, $recipients) {
    global $conf;
    if(!is_array($recipients) || count($recipients) < 1) return false;
    if(!is_array($placeholders)) $placeholders = array();
    if(file_exists($conf['rootpath'].'/conf-custom/mail/' . $template . '_'.$conf['language'].'.txt')) {
        $lines = file($conf['rootpath'].'/conf-custom/mail/' . $template . '_'.$conf['language'].'.txt');
    } elseif(file_exists($conf['rootpath'].'/conf-custom/mail/' . $template . '_en.txt')) {
        $lines = file($conf['rootpath'].'/conf-custom/mail/' . $template . '_en.txt');
    } elseif(file_exists($conf['rootpath'].'/conf/mail/' . $template . '_'.$conf['language'].'.txt')) {
        $lines = file($conf['rootpath'].'/conf/mail/' . $template . '_'.$conf['language'].'.txt');
    } else {
        $lines = file($conf['rootpath'].'/conf/mail/' . $template . '_en.txt');
    }
    //* get mail headers, subject and body
    $mailHeaders = '';
    $mailBody = '';
    $mailSubject = '';
    $inHeader = true;
    for($l = 0; $l < count($lines); $l++) {
        if($lines[$l] == '') {
            $inHeader = false;
            continue;
        }
        if($inHeader == true) {
            $parts = explode(':', $lines[$l], 2);
            if(strtolower($parts[0]) == 'subject') $mailSubject = trim($parts[1]);
            unset($parts);
            $mailHeaders .= trim($lines[$l]) . "\n";
        } else {
            $mailBody .= trim($lines[$l]) . "\n";
        }
    }
    $mailBody = trim($mailBody);
    //* Replace placeholders
    $mailHeaders = strtr($mailHeaders, $placeholders);
    $mailSubject = strtr($mailSubject, $placeholders);
    $mailBody = strtr($mailBody, $placeholders);
    for($r = 0; $r < count($recipients); $r++) {
        mail($recipients[$r], $mailSubject, $mailBody, $mailHeaders);
    }
    unset($mailSubject);
    unset($mailHeaders);
    unset($mailBody);
    unset($lines);
    return true;
}
#######################################################################################################
// enforce traffic quota (run only on the "master-server")
#######################################################################################################
@@ -683,41 +741,15 @@
                $app->log('Traffic quota for '.$rec['domain'].' exceeded. Disabling website.',LOGLEVEL_DEBUG);
                
                //* Send traffic notifications
                if($web_config['overtraffic_notify_admin'] == 'y' || $web_config['overtraffic_notify_client'] == 'y') {
                    if(file_exists($conf['rootpath'].'/conf-custom/mail/web_traffic_notification_'.$conf['language'].'.txt')) {
                        $lines = file($conf['rootpath'].'/conf-custom/mail/web_traffic_notification_'.$conf['language'].'.txt');
                    } elseif(file_exists($conf['rootpath'].'/conf-custom/mail/web_traffic_notification_en.txt')) {
                        $lines = file($conf['rootpath'].'/conf-custom/mail/web_traffic_notification_en.txt');
                    } elseif(file_exists($conf['rootpath'].'/conf/mail/web_traffic_notification_'.$conf['language'].'.txt')) {
                        $lines = file($conf['rootpath'].'/conf/mail/web_traffic_notification_'.$conf['language'].'.txt');
                    } else {
                        $lines = file($conf['rootpath'].'/conf/mail/web_traffic_notification_en.txt');
                    }
                    //* Get subject
                    $parts = explode(':',trim($lines[0]));
                    unset($parts[0]);
                    $traffic_mail_subject  = implode(':',$parts);
                    unset($lines[0]);
                    //* Get message
                    $traffic_mail_message = trim(implode($lines));
                    unset($tmp);
                    //* Replace placeholders
                    $traffic_mail_message = str_replace('{domain}',$rec['domain'],$traffic_mail_message);
                    $mailHeaders      = "MIME-Version: 1.0" . "\n";
                    $mailHeaders     .= "Content-type: text/plain; charset=utf-8" . "\n";
                    $mailHeaders     .= "Content-Transfer-Encoding: 8bit" . "\n";
                    $mailHeaders     .= "From: ". $global_config['admin_mail'] . "\n";
                    $mailHeaders     .= "Reply-To: ". $global_config['admin_mail'] . "\n";
                    $mailSubject      = "=?utf-8?B?".base64_encode($traffic_mail_subject)."?=";
                    //* send email to admin
                if($rec['traffic_quota_lock'] != 'y' && ($web_config['overtraffic_notify_admin'] == 'y' || $web_config['overtraffic_notify_client'] == 'y')) {
                    $placeholders = array('{domain}' => $rec['domain'],
                                          '{admin_mail}' => $global_config['admin_mail']);
                    $recipients = array();
                    //* send email to admin
                    if($global_config['admin_mail'] != '' && $web_config['overtraffic_notify_admin'] == 'y') {
                        mail($global_config['admin_mail'], $mailSubject, $traffic_mail_message, $mailHeaders);
                        $recipients[] = $global_config['admin_mail'];
                    }
                    
                    //* Send email to client
@@ -725,10 +757,11 @@
                        $client_group_id = $rec["sys_groupid"];
                        $client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
                        if($client['email'] != '') {
                            mail($client['email'], $mailSubject, $traffic_mail_message, $mailHeaders);
                            $recipients[] = $client['email'];
                        }
                    }
                    send_notification_email('web_traffic_notification', $placeholders, $recipients);
                }
                
                
@@ -743,6 +776,283 @@
    }
}
#######################################################################################################
// send website quota warnings by email
#######################################################################################################
if ($app->dbmaster == $app->db) {
    $global_config = $app->getconf->get_global_config('mail');
    //* Check website disk quota
    $sql = "SELECT domain_id,sys_groupid,domain,system_user,last_quota_notification,DATEDIFF(CURDATE(), last_quota_notification) as `notified_before` FROM web_domain WHERE (type = 'vhost' OR type = 'vhostsubdomain')";
    $records = $app->db->queryAllRecords($sql);
    if(is_array($records) && !empty($records)) {
        $tmp_rec =  $app->db->queryAllRecords("SELECT data from monitor_data WHERE type = 'harddisk_quota' ORDER BY created DESC");
        $monitor_data = array();
        if(is_array($tmp_rec)) {
            foreach ($tmp_rec as $tmp_mon) {
                $monitor_data = array_merge_recursive($monitor_data,unserialize($app->db->unquote($tmp_mon['data'])));
            }
        }
        foreach($records as $rec) {
            //$web_hd_quota = $rec['hd_quota'];
            $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'];
            if (!is_numeric($rec['used'])){
                if ($rec['used'][0] > $rec['used'][1]){
                    $rec['used'] = $rec['used'][0];
                } else {
                    $rec['used'] = $rec['used'][1];
                }
            }
            if (!is_numeric($rec['soft'])) $rec['soft']=$rec['soft'][1];
            if (!is_numeric($rec['hard'])) $rec['hard']=$rec['hard'][1];
            if (!is_numeric($rec['files'])) $rec['files']=$rec['files'][1];
            // used space ratio
            if($rec['soft'] > 0){
                $used_ratio = $rec['used']/$rec['soft'];
            } else {
                $used_ratio = 0;
            }
            $rec['ratio'] = number_format($used_ratio * 100, 2, '.', '').'%';
            if($rec['used'] > 1024) {
                $rec['used'] = round($rec['used'] / 1024,2).' MB';
            } else {
                if ($rec['used'] != '') $rec['used'] .= ' KB';
            }
            if($rec['soft'] > 1024) {
                $rec['soft'] = round($rec['soft'] / 1024,2).' MB';
            } elseif($rec['soft'] == 0){
                $rec['soft'] = '----';
            } else {
                $rec['soft'] .= ' KB';
            }
            if($rec['hard'] > 1024) {
                $rec['hard'] = round($rec['hard'] / 1024,2).' MB';
            } elseif($rec['hard'] == 0){
                $rec['hard'] = '----';
            } else {
                $rec['hard'] .= ' KB';
            }
            // send notifications only if 90% or more of the quota are used
            if($used_ratio < 0.9) {
                // reset notification date
                if($rec['last_quota_notification']) $app->dbmaster->datalogUpdate('web_domain', "last_quota_notification = NULL", 'domain_id', $rec['domain_id']);
                // send notification - everything ok again
                if($rec['last_quota_notification'] && $web_config['overquota_notify_onok'] == 'y' && ($web_config['overquota_notify_admin'] == 'y' || $web_config['overquota_notify_client'] == 'y')) {
                    $placeholders = array('{domain}' => $rec['domain'],
                                          '{admin_mail}' => $global_config['admin_mail'],
                                          '{used}' => $rec['used'],
                                          '{soft}' => $rec['soft'],
                                          '{hard}' => $rec['hard'],
                                          '{ratio}' => $rec['ratio']);
                    $recipients = array();
                    //* send email to admin
                    if($global_config['admin_mail'] != '' && $web_config['overquota_notify_admin'] == 'y') {
                        $recipients[] = $global_config['admin_mail'];
                    }
                    //* Send email to client
                    if($web_config['overquota_notify_client'] == 'y') {
                        $client_group_id = $rec["sys_groupid"];
                        $client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
                        if($client['email'] != '') {
                            $recipients[] = $client['email'];
                        }
                    }
                    send_notification_email('web_quota_ok_notification', $placeholders, $recipients);
                }
                continue;
            }
            // could a notification be sent?
            $send_notification = false;
            if(!$rec['last_quota_notification']) $send_notification = true; // not yet notified
            elseif($web_config['overquota_notify_freq'] > 0 && $rec['notified_before'] >= $web_config['overquota_notify_freq']) $send_notification = true;
            //* Send quota notifications
            if(($web_config['overquota_notify_admin'] == 'y' || $web_config['overquota_notify_client'] == 'y') && $send_notification == true) {
                $app->dbmaster->datalogUpdate('web_domain', "last_quota_notification = CURDATE()", 'domain_id', $rec['domain_id']);
                $placeholders = array('{domain}' => $rec['domain'],
                                      '{admin_mail}' => $global_config['admin_mail'],
                                      '{used}' => $rec['used'],
                                      '{soft}' => $rec['soft'],
                                      '{hard}' => $rec['hard'],
                                      '{ratio}' => $rec['ratio']);
                $recipients = array();
                //* send email to admin
                if($global_config['admin_mail'] != '' && $web_config['overquota_notify_admin'] == 'y') {
                    $recipients[] = $global_config['admin_mail'];
                }
                //* Send email to client
                if($web_config['overquota_notify_client'] == 'y') {
                    $client_group_id = $rec["sys_groupid"];
                    $client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
                    if($client['email'] != '') {
                        $recipients[] = $client['email'];
                    }
                }
                send_notification_email('web_quota_notification', $placeholders, $recipients);
            }
        }
    }
}
#######################################################################################################
// send mail quota warnings by email
#######################################################################################################
if ($app->dbmaster == $app->db) {
    $global_config = $app->getconf->get_global_config('mail');
    $mail_config = $app->getconf->get_server_config($conf['server_id'], 'mail');
    //* Check email quota
    $sql = "SELECT mailuser_id,sys_groupid,email,name,quota,last_quota_notification,DATEDIFF(CURDATE(), last_quota_notification) as `notified_before` FROM mail_user";
    $records = $app->db->queryAllRecords($sql);
    if(is_array($records) && !empty($records)) {
        $tmp_rec =  $app->db->queryAllRecords("SELECT data from monitor_data WHERE type = 'email_quota' ORDER BY created DESC");
        $monitor_data = array();
        if(is_array($tmp_rec)) {
            foreach ($tmp_rec as $tmp_mon) {
                //$monitor_data = array_merge_recursive($monitor_data,unserialize($app->db->unquote($tmp_mon['data'])));
                $tmp_array = unserialize($app->db->unquote($tmp_mon['data']));
                if(is_array($tmp_array)) {
                    foreach($tmp_array as $username => $data) {
                        if(@!$monitor_data[$username]['used']) $monitor_data[$username]['used'] = $data['used'];
                    }
                }
            }
        }
        foreach($records as $rec) {
            $email = $rec['email'];
            $rec['used'] = isset($monitor_data[$email]['used']) ? $monitor_data[$email]['used'] : array(1 => 0);
            if (!is_numeric($rec['used'])) $rec['used']=$rec['used'][1];
            // used space ratio
            if($rec['quota'] > 0){
                $used_ratio = $rec['used']/$rec['quota'];
            } else {
                $used_ratio = 0;
            }
            $rec['ratio'] = number_format($used_ratio * 100, 2, '.', '').'%';
            if($rec['quota'] > 0){
                $rec['quota'] = round($rec['quota'] / 1048576,4).' MB';
            } else {
                $rec['quota'] = '----';
            }
            if($rec['used'] < 1544000) {
                $rec['used'] = round($rec['used'] / 1024,4).' KB';
            } else {
                $rec['used'] = round($rec['used'] / 1048576,4).' MB';
            }
            // send notifications only if 90% or more of the quota are used
            if($used_ratio < 0.9) {
                // reset notification date
                if($rec['last_quota_notification']) $app->dbmaster->datalogUpdate('mail_user', "last_quota_notification = NULL", 'mailuser_id', $rec['mailuser_id']);
                // send notification - everything ok again
                if($rec['last_quota_notification'] && $mail_config['overquota_notify_onok'] == 'y' && ($mail_config['overquota_notify_admin'] == 'y' || $mail_config['overquota_notify_client'] == 'y')) {
                    $placeholders = array('{email}' => $rec['email'],
                              '{admin_mail}' => $global_config['admin_mail'],
                              '{used}' => $rec['used'],
                              '{name}' => $rec['name'],
                              '{quota}' => $rec['quota'],
                              '{ratio}' => $rec['ratio']);
                    $recipients = array();
                    //* send email to admin
                    if($global_config['admin_mail'] != '' && $mail_config['overquota_notify_admin'] == 'y') {
                        $recipients[] = $global_config['admin_mail'];
                    }
                    //* Send email to client
                    if($mail_config['overquota_notify_client'] == 'y') {
                        $client_group_id = $rec["sys_groupid"];
                        $client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
                        if($client['email'] != '') {
                            $recipients[] = $client['email'];
                        }
                    }
                    send_notification_email('mail_quota_ok_notification', $placeholders, $recipients);
                }
                continue;
            }
            //* Send quota notifications
            // could a notification be sent?
            $send_notification = false;
            if(!$rec['last_quota_notification']) $send_notification = true; // not yet notified
            elseif($mail_config['overquota_notify_freq'] > 0 && $rec['notified_before'] >= $mail_config['overquota_notify_freq']) $send_notification = true;
            if(($mail_config['overquota_notify_admin'] == 'y' || $mail_config['overquota_notify_client'] == 'y') && $send_notification == true) {
                $app->dbmaster->datalogUpdate('mail_user', "last_quota_notification = CURDATE()", 'mailuser_id', $rec['mailuser_id']);
                $placeholders = array('{email}' => $rec['email'],
                          '{admin_mail}' => $global_config['admin_mail'],
                          '{used}' => $rec['used'],
                          '{name}' => $rec['name'],
                          '{quota}' => $rec['quota'],
                          '{ratio}' => $rec['ratio']);
                $recipients = array();
                //* send email to admin
                if($global_config['admin_mail'] != '' && $mail_config['overquota_notify_admin'] == 'y') {
                    $recipients[] = $global_config['admin_mail'];
                }
                //* Send email to client
                if($mail_config['overquota_notify_client'] == 'y') {
                    $client_group_id = $rec["sys_groupid"];
                    $client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
                    if($client['email'] != '') {
                        $recipients[] = $client['email'];
                    }
                }
                send_notification_email('mail_quota_notification', $placeholders, $recipients);
            }
        }
    }
}
@@ -822,25 +1132,28 @@
                if($backup_mode == 'userzip') {
                    //* Create a .zip backup as web user and include also files owned by apache / nginx user
                    $web_backup_file = 'web'.$web_id.'_'.date('Y-m-d_H-i').'.zip';
                    exec('cd '.escapeshellarg($web_path).' && sudo -u '.escapeshellarg($web_user).' find . -group '.escapeshellarg($web_group).' -print 2> /dev/null | zip -b /tmp --exclude=backup\* --symlinks '.escapeshellarg($web_backup_dir.'/'.$web_backup_file).' -@');
                    exec('cd '.escapeshellarg($web_path).' && sudo -u '.escapeshellarg($web_user).' find . -user '.escapeshellarg($http_server_user).' -print 2> /dev/null | zip -b /tmp --exclude=backup\* --update --symlinks '.escapeshellarg($web_backup_dir.'/'.$web_backup_file).' -@');
                    exec('cd '.escapeshellarg($web_path).' && sudo -u '.escapeshellarg($web_user).' find . -group '.escapeshellarg($web_group).' -print 2> /dev/null | zip -b /tmp --exclude=backup\* --symlinks '.escapeshellarg($web_backup_dir.'/'.$web_backup_file).' -@', $tmp_output, $retval);
                    if($retval == 0) exec('cd '.escapeshellarg($web_path).' && sudo -u '.escapeshellarg($web_user).' find . -user '.escapeshellarg($http_server_user).' -print 2> /dev/null | zip -b /tmp --exclude=backup\* --update --symlinks '.escapeshellarg($web_backup_dir.'/'.$web_backup_file).' -@', $tmp_output, $retval);
                } else {
                    //* Create a tar.gz backup as root user
                    $web_backup_file = 'web'.$web_id.'_'.date('Y-m-d_H-i').'.tar.gz';
                    exec('tar pczf '.escapeshellarg($web_backup_dir.'/'.$web_backup_file).' --exclude=backup\* --directory '.escapeshellarg($web_path).' .');
                    exec('tar pczf '.escapeshellarg($web_backup_dir.'/'.$web_backup_file).' --exclude=backup\* --directory '.escapeshellarg($web_path).' .', $tmp_output, $retval);
                }
                chown($web_backup_dir.'/'.$web_backup_file, 'root');
                chgrp($web_backup_dir.'/'.$web_backup_file, 'root');
                chmod($web_backup_dir.'/'.$web_backup_file, 0750);
                if($retval == 0){
                    chown($web_backup_dir.'/'.$web_backup_file, 'root');
                    chgrp($web_backup_dir.'/'.$web_backup_file, 'root');
                    chmod($web_backup_dir.'/'.$web_backup_file, 0750);
                //* Insert web backup record in database
                //$insert_data = "(server_id,parent_domain_id,backup_type,backup_mode,tstamp,filename) VALUES (".$conf['server_id'].",".$web_id.",'web','".$backup_mode."',".time().",'".$app->db->quote($web_backup_file)."')";
                //$app->dbmaster->datalogInsert('web_backup', $insert_data, 'backup_id');
                $sql = "INSERT INTO web_backup (server_id,parent_domain_id,backup_type,backup_mode,tstamp,filename,filesize) VALUES (".$conf['server_id'].",".$web_id.",'web','".$backup_mode."',".time().",'".$app->db->quote($web_backup_file)."','".formatBytes(filesize($web_backup_dir.'/'.$web_backup_file))."')";
                $app->db->query($sql);
                if($app->db->dbHost != $app->dbmaster->dbHost) $app->dbmaster->query($sql);
                    //* Insert web backup record in database
                    //$insert_data = "(server_id,parent_domain_id,backup_type,backup_mode,tstamp,filename) VALUES (".$conf['server_id'].",".$web_id.",'web','".$backup_mode."',".time().",'".$app->db->quote($web_backup_file)."')";
                    //$app->dbmaster->datalogInsert('web_backup', $insert_data, 'backup_id');
                    $sql = "INSERT INTO web_backup (server_id,parent_domain_id,backup_type,backup_mode,tstamp,filename) VALUES (".$conf['server_id'].",".$web_id.",'web','".$backup_mode."',".time().",'".$app->db->quote($web_backup_file)."')";
                    $app->db->query($sql);
                    if($app->db->dbHost != $app->dbmaster->dbHost) $app->dbmaster->query($sql);
                } else {
                    if(is_file($web_backup_dir.'/'.$web_backup_file)) unlink($web_backup_dir.'/'.$web_backup_file);
                }
                //* Remove old backups
                $backup_copies = intval($rec['backup_copies']);
@@ -924,23 +1237,28 @@
                $db_name = $rec['database_name'];
                $db_backup_file = 'db_'.$db_name.'_'.date('Y-m-d_H-i').'.sql';
                $command = "mysqldump -h '".escapeshellcmd($clientdb_host)."' -u '".escapeshellcmd($clientdb_user)."' -p'".escapeshellcmd($clientdb_password)."' -c --add-drop-table --create-options --quick --result-file='".$db_backup_dir.'/'.$db_backup_file."' '".$db_name."'";
                exec($command);
                exec($command, $tmp_output, $retval);
                //* Compress the backup with gzip
                exec("gzip -c '".escapeshellcmd($db_backup_dir.'/'.$db_backup_file)."' > '".escapeshellcmd($db_backup_dir.'/'.$db_backup_file).".gz'");
                chmod($db_backup_dir.'/'.$db_backup_file.'.gz', 0750);
                chown($db_backup_dir.'/'.$db_backup_file.'.gz', fileowner($db_backup_dir));
                chgrp($db_backup_dir.'/'.$db_backup_file.'.gz', filegroup($db_backup_dir));
                if($retval == 0) exec("gzip -c '".escapeshellcmd($db_backup_dir.'/'.$db_backup_file)."' > '".escapeshellcmd($db_backup_dir.'/'.$db_backup_file).".gz'", $tmp_output, $retval);
                if($retval == 0){
                    chmod($db_backup_dir.'/'.$db_backup_file.'.gz', 0750);
                    chown($db_backup_dir.'/'.$db_backup_file.'.gz', fileowner($db_backup_dir));
                    chgrp($db_backup_dir.'/'.$db_backup_file.'.gz', filegroup($db_backup_dir));
                //* Insert web backup record in database
                //$insert_data = "(server_id,parent_domain_id,backup_type,backup_mode,tstamp,filename) VALUES (".$conf['server_id'].",$web_id,'mysql','sqlgz',".time().",'".$app->db->quote($db_backup_file).".gz')";
                //$app->dbmaster->datalogInsert('web_backup', $insert_data, 'backup_id');
                $sql = "INSERT INTO web_backup (server_id,parent_domain_id,backup_type,backup_mode,tstamp,filename) VALUES (".$conf['server_id'].",$web_id,'mysql','sqlgz',".time().",'".$app->db->quote($db_backup_file).".gz')";
                $app->db->query($sql);
                if($app->db->dbHost != $app->dbmaster->dbHost) $app->dbmaster->query($sql);
                    //* Insert web backup record in database
                    //$insert_data = "(server_id,parent_domain_id,backup_type,backup_mode,tstamp,filename) VALUES (".$conf['server_id'].",$web_id,'mysql','sqlgz',".time().",'".$app->db->quote($db_backup_file).".gz')";
                    //$app->dbmaster->datalogInsert('web_backup', $insert_data, 'backup_id');
                    $sql = "INSERT INTO web_backup (server_id,parent_domain_id,backup_type,backup_mode,tstamp,filename) VALUES (".$conf['server_id'].",$web_id,'mysql','sqlgz',".time().",'".$app->db->quote($db_backup_file).".gz')";
                    $app->db->query($sql);
                    if($app->db->dbHost != $app->dbmaster->dbHost) $app->dbmaster->query($sql);
                } else {
                    if(is_file($db_backup_dir.'/'.$db_backup_file.'.gz')) unlink($db_backup_dir.'/'.$db_backup_file.'.gz');
                }
                //* Remove the uncompressed file
                unlink($db_backup_dir.'/'.$db_backup_file);
                if(is_file($db_backup_dir.'/'.$db_backup_file)) unlink($db_backup_dir.'/'.$db_backup_file);
                //* Remove old backups
                $backup_copies = intval($rec['backup_copies']);
server/lib/app.inc.php
@@ -102,28 +102,31 @@
        function log($msg, $priority = 0) {
                
        global $conf;
        switch ($priority) {
            case 0:
                $priority_txt = 'DEBUG';
                break;
            case 1:
                $priority_txt = 'WARNING';
                break;
            case 2:
                $priority_txt = 'ERROR';
                break;
        }
        $log_msg = @date('d.m.Y-H:i').' - '.$priority_txt.' - '. $msg;
        if($priority >= $conf['log_priority']) {
                        //if (is_writable($conf["log_file"])) {
                            if (!$fp = fopen ($conf['log_file'], 'a')) {
                                die('Unable to open logfile.');
                            }
                        switch ($priority) {
                            case 0:
                                $priority_txt = 'DEBUG';
                                break;
                            case 1:
                                $priority_txt = 'WARNING';
                                break;
                            case 2:
                                $priority_txt = 'ERROR';
                                break;
                        }
                            
                            if (!fwrite($fp, @date('d.m.Y-H:i').' - '.$priority_txt.' - '. $msg."\r\n")) {
                            if (!fwrite($fp, $log_msg."\r\n")) {
                                die('Unable to write to logfile.');
                            }
                echo @date('d.m.Y-H:i').' - '.$priority_txt.' - '. $msg."\n";
                echo $log_msg."\n";
                fclose($fp);
                    // Log to database
@@ -149,8 +152,24 @@
                        //} else {
                        //    die("Unable to write to logfile.");
                        //}
                } // if
                if($priority >= $conf['admin_notify_priority'] && $conf['admin_mail'] != '') {
                    // send notification to admin
                    $mailBody = $log_msg;
                    $mailSubject = substr($log_msg,0,50).'...';
                    $mailHeaders      = "MIME-Version: 1.0" . "\n";
                    $mailHeaders     .= "Content-type: text/plain; charset=utf-8" . "\n";
                    $mailHeaders     .= "Content-Transfer-Encoding: 8bit" . "\n";
                    $mailHeaders     .= "From: ". $conf['admin_mail'] . "\n";
                    $mailHeaders     .= "Reply-To: ". $conf['admin_mail'] . "\n";
                    mail($conf['admin_mail'], $mailSubject, $mailBody, $mailHeaders);
                }
        } // func
        /*
         0 = DEBUG
server/lib/classes/monitor_tools.inc.php
@@ -132,7 +132,7 @@
                $distver = 'Squeeze/Sid';
                $distid = 'debian60';
                $distbaseid = 'debian';
            } elseif (strstr(trim(file_get_contents('/etc/debian_version')), '7.0') || trim(file_get_contents('/etc/debian_version')) == 'wheezy/sid') {
            } elseif (strstr(trim(file_get_contents('/etc/debian_version')), '7.0') || strstr(trim(file_get_contents('/etc/debian_version')), '7.1') || trim(file_get_contents('/etc/debian_version')) == 'wheezy/sid') {
                $distname = 'Debian';
                $distver = 'Wheezy/Sid';
                $distid = 'debian60';
@@ -473,7 +473,7 @@
    }
    public function monitorDiskUsage() {
        global $conf;
        global $app,$conf;
        /* the id of the server as int */
        $server_id = intval($conf['server_id']);
@@ -485,7 +485,10 @@
        $state = 'ok';
        /** Fetch the data of ALL devices into a array (needed for monitoring!) */
        $dfData = shell_exec('df -hT 2>/dev/null');
        //$dfData = shell_exec('df -hT 2>/dev/null');
        $app->uses('getconf');
        $web_config = $app->getconf->get_server_config($conf['server_id'], 'web');
        $dfData = shell_exec('df -hT|grep -v "'.$web_config['website_basedir'].'/" 2>/dev/null');
        // split into array
        $df = explode("\n", $dfData);
server/lib/classes/services.inc.php
@@ -55,9 +55,10 @@
            $function_name = $this->registered_services[$service_name]['function'];
            $app->log("Calling function '$function_name' from module '$module_name'.",LOGLEVEL_DEBUG);
            // call_user_method($function_name,$app->loaded_modules[$module_name],$action);
            call_user_func(array($app->loaded_modules[$module_name],$function_name),$action);
            return call_user_func(array($app->loaded_modules[$module_name],$function_name),$action);
        } else {
            $app->log("Unable to restart $service_name. Service not registered.",LOGLEVEL_WARNING);
            return array('output' => '', 'retval' => 0);
        }
        
    }
server/lib/classes/system.inc.php
@@ -780,7 +780,7 @@
        if(substr($path,0,1) != '/') return false;
        
        //* We allow only some characters in the path
        if(!preg_match('/[a-zA-Z0-9_\.\-]{1,}/',$path)) return false;
        if(!preg_match('/^\/[a-zA-Z0-9_\/\.\-]{1,}$/',$path)) return false;
        
        //* Check path for symlinks
        $path_parts = explode('/',$path);
server/lib/classes/tpl.inc.php
@@ -928,9 +928,9 @@
                $regex.=    '[\"\']?';
                $regex.= ')?\s*';
                $regex.= '(?:>|\/>|}|-->){1}';
                $regex.= '/ie';
                $regex.= '/i';
                //$regex.= '([\r\n|\n|\r])?/ie';
                $data = preg_replace($regex,"\$this->_parseTag(array('\\0','\\1','\\2','\\3','\\4','\\5','\\6','\\7','\\8','\\9'));",$data);
                $data = preg_replace_callback($regex, array($this, '_parseTag'), $data);
                if ($this->_cache) { // add cache if need be
                    $this->_createCache($data);
server/mods-available/dns_module.inc.php
@@ -128,12 +128,13 @@
            $daemon = 'named';
        }
        
        $retval = array('output' => '', 'retval' => 0);
        if($action == 'restart') {
            exec($conf['init_scripts'] . '/' . $daemon . ' restart');
            exec($conf['init_scripts'] . '/' . $daemon . ' restart', $retval['output'], $retval['retval']);
        } else {
            exec($conf['init_scripts'] . '/' . $daemon . ' reload');
            exec($conf['init_scripts'] . '/' . $daemon . ' reload', $retval['output'], $retval['retval']);
        }
        return $retval;
    }
    function restartPowerDNS($action = 'restart') {
@@ -177,9 +178,11 @@
            $daemon = 'pdns';
        }
        exec($conf['init_scripts'] . '/' . $daemon . ' restart');
        $retval = array('output' => '', 'retval' => 0);
        exec($conf['init_scripts'] . '/' . $daemon . ' restart', $retval['output'], $retval['retval']);
//     unset $tmps;
        return $retval;
    }
    
server/mods-available/monitor_core_module.inc.php
@@ -37,6 +37,8 @@
    var $actions_available = array();
    /** The Tools */
    private $_tools = null;
    //** time the script was called
    private $_run_time = null;
    /**
     * This function is called during ispconfig installation to determine
@@ -52,11 +54,14 @@
     */
    public function onLoad() {
        global $app;
        //* store the running time
        $this->_run_time = time();
        /*
         * Do the monitor every n minutes and write the result to the db
         */
        $min = @date('i');
        $min = @date('i', $this->_run_time);
        if (($min % $this->interval) == 0) {
            $this->_doMonitor();
        }
@@ -122,7 +127,7 @@
        /*
         *  This monitoring is expensive, so do it only every 15 minutes
         */
        $min = @date('i');
        $min = @date('i', $this->_run_time);
        if ($min % 15 != 0) return;
        
        $app->uses('getconf');
@@ -404,7 +409,7 @@
        /*
         *  This monitoring is expensive, so do it only once an hour
         */
        $min = @date('i');
        $min = @date('i', $this->_run_time);
        if ($min != 0)
            return;
@@ -419,7 +424,8 @@
        $res = $this->_tools->monitorSystemUpdate();
        
        //* Ensure that output is encoded so that it does not break the serialize
        $res['data']['output'] = htmlentities($res['data']['output']);
        //$res['data']['output'] = htmlentities($res['data']['output']);
        $res['data']['output'] = htmlentities($res['data']['output'],ENT_QUOTES,'UTF-8');
        /*
         * Insert the data into the database
@@ -492,8 +498,8 @@
        /*
         *  This monitoring is expensive, so do it only once a day
         */
        $min = @date('i');
        $hour = @date('H');
        $min = @date('i', $this->_run_time);
        $hour = @date('H', $this->_run_time);
        if (!($min == 0 && $hour == 23))
            return;
        /*
server/mods-available/web_module.inc.php
@@ -210,12 +210,13 @@
                }
        }
        $retval = array('output' => '', 'retval' => 0);
        if($action == 'restart') {
            exec($conf['init_scripts'] . '/' . $daemon . ' restart');
            exec($conf['init_scripts'] . '/' . $daemon . ' restart', $retval['output'], $retval['retval']);
        } else {
            exec($conf['init_scripts'] . '/' . $daemon . ' reload');
            exec($conf['init_scripts'] . '/' . $daemon . ' reload', $retval['output'], $retval['retval']);
        }
        return $retval;
    }
    
    function restartPHP_FPM($action = 'restart') {
@@ -229,7 +230,9 @@
        
        if(!$init_script) $init_script = $conf['init_scripts'].'/'.$web_config['php_fpm_init_script'];
        
        exec($init_script.' '.$action);
        $retval = array('output' => '', 'retval' => 0);
        exec($init_script.' '.$action, $retval['output'], $retval['retval']);
        return $retval;
    }
} // end class
server/plugins-available/apache2_plugin.inc.php
@@ -189,7 +189,7 @@
        $app->uses('getconf');
        $web_config = $app->getconf->get_server_config($conf['server_id'], 'web');
        if ($web_config['CA_path']!='' && !file_exists($web_config['CA_path'].'/openssl.cnf'))
            $app->log("CA path error, file does not exist:".$web_config['CA_path'].'/openssl.conf',LOGLEVEL_ERROR);
            $app->log("CA path error, file does not exist:".$web_config['CA_path'].'/openssl.cnf',LOGLEVEL_ERROR);
        
        //* Only vhosts can have a ssl cert
        if($data["new"]["type"] != "vhost" && $data["new"]["type"] != "vhostsubdomain") return;
@@ -336,6 +336,7 @@
            //* Write the key file, if field is empty then import the key into the db
            if(trim($data["new"]["ssl_key"]) != '') {
                $app->system->file_put_contents($key_file2,$data["new"]["ssl_key"]);
                $app->system->chmod($key_file2,0400);
            } else {
                $ssl_key2 = $app->db->quote($app->system->file_get_contents($key_file2));
                /* Update the DB of the (local) Server */
@@ -762,6 +763,9 @@
                $this->_exec('chown root:root '.escapeshellcmd($data['new']['document_root']).'/' . $web_folder);
            }
        }
        //* add the Apache user to the client group if this is a vhost and security level is set to high, no matter if this is an insert or update and regardless of set_folder_permissions_on_update
        if($data['new']['type'] == 'vhost' && $web_config['security_level'] == 20) $app->system->add_user_to_group($groupname, escapeshellcmd($web_config['user']));
        //* If the security level is set to high
        if(($this->action == 'insert' && $data['new']['type'] == 'vhost') or ($web_config['set_folder_permissions_on_update'] == 'y' && $data['new']['type'] == 'vhost')) {
@@ -805,9 +809,6 @@
                    $app->system->server_conf['group_datei'] = $tmp_groupfile;
                    unset($tmp_groupfile);
                }
                //* add the Apache user to the client group
                $app->system->add_user_to_group($groupname, escapeshellcmd($web_config['user']));
                
                //* Chown all default directories
                $app->system->chown($data['new']['document_root'],'root');
@@ -1121,7 +1122,7 @@
                    
                // Rewriting
                if($alias['redirect_type'] != '' && $alias['redirect_path'] != '') {
                    if(substr($alias['redirect_path'],-1) != '/' && !preg_match('/^(https?|\[scheme\]):\/\//', $data['new']['redirect_path'])) $alias['redirect_path'] .= '/';
                    if(substr($alias['redirect_path'],-1) != '/' && !preg_match('/^(https?|\[scheme\]):\/\//', $alias['redirect_path'])) $alias['redirect_path'] .= '/';
                    if(substr($alias['redirect_path'],0,8) == '[scheme]'){
                        $rewrite_target = 'http'.substr($alias['redirect_path'],8);
                        $rewrite_target_ssl = 'https'.substr($alias['redirect_path'],8);
@@ -1352,9 +1353,9 @@
            if (!is_dir($cgi_starter_path)) {
                $app->system->mkdirpath($cgi_starter_path);
                $app->system->chmod($cgi_starter_script,0755);
                $app->system->chown($cgi_starter_script,$data['new']['system_user']);
                $app->system->chgrp($cgi_starter_script,$data['new']['system_group']);
                $app->system->chown($cgi_starter_path,$data['new']['system_user']);
                $app->system->chgrp($cgi_starter_path,$data['new']['system_group']);
                $app->system->chmod($cgi_starter_path,0755);
                $app->log('Creating cgi starter script directory: '.$cgi_starter_path,LOGLEVEL_DEBUG);
            }
@@ -1564,7 +1565,8 @@
            $apache_online_status_before_restart = $this->_checkTcp('localhost',80);
            $app->log('Apache status is: '.$apache_online_status_before_restart,LOGLEVEL_DEBUG);
            $app->services->restartService('httpd','restart');
            $retval = $app->services->restartService('httpd','restart'); // $retval['retval'] is 0 on success and > 0 on failure
            $app->log('Apache restart return value is: '.$retval['retval'],LOGLEVEL_DEBUG);
            
            // wait a few seconds, before we test the apache status again
            $apache_online_status_after_restart = false;
@@ -1576,8 +1578,41 @@
            }
            //* Check if apache restarted successfully if it was online before
            $app->log('Apache online status after restart is: '.$apache_online_status_after_restart,LOGLEVEL_DEBUG);
            if($apache_online_status_before_restart && !$apache_online_status_after_restart) {
                $app->log('Apache did not restart after the configuration change for website '.$data['new']['domain'].' Reverting the configuration. Saved non-working config as '.$vhost_file.'.err',LOGLEVEL_WARN);
            if($apache_online_status_before_restart && !$apache_online_status_after_restart || $retval['retval'] > 0) {
                $app->log('Apache did not restart after the configuration change for website '.$data['new']['domain'].'. Reverting the configuration. Saved non-working config as '.$vhost_file.'.err',LOGLEVEL_WARN);
                if(is_array($retval['output']) && !empty($retval['output'])){
                    $app->log('Reason for Apache restart failure: '.implode("\n", $retval['output']),LOGLEVEL_WARN);
                } else {
                    // if no output is given, check again
                    $webserver_binary = '';
                    exec('which apache2', $webserver_check_output, $webserver_check_retval);
                    if($webserver_check_retval == 0){
                        $webserver_binary = 'apache2';
                    } else {
                        unset($webserver_check_output, $webserver_check_retval);
                        exec('which httpd2', $webserver_check_output, $webserver_check_retval);
                        if($webserver_check_retval == 0){
                            $webserver_binary = 'httpd2';
                        } else {
                            unset($webserver_check_output, $webserver_check_retval);
                            exec('which httpd', $webserver_check_output, $webserver_check_retval);
                            if($webserver_check_retval == 0){
                                $webserver_binary = 'httpd';
                            } else {
                                unset($webserver_check_output, $webserver_check_retval);
                                exec('which apache', $webserver_check_output, $webserver_check_retval);
                                if($webserver_check_retval == 0){
                                    $webserver_binary = 'apache';
                                }
                            }
                        }
                    }
                    if($webserver_binary != ''){
                        exec($webserver_binary.' -t 2>&1', $tmp_output, $tmp_retval);
                        if($tmp_retval > 0 && is_array($tmp_output) && !empty($tmp_output)) $app->log('Reason for Apache restart failure: '.implode("\n", $tmp_output),LOGLEVEL_WARN);
                        unset($tmp_output, $tmp_retval);
                    }
                }
                $app->system->copy($vhost_file,$vhost_file.'.err');
                if(is_file($vhost_file.'~')) {
                    //* Copy back the last backup file
@@ -2855,8 +2890,10 @@
                $app->log('Removed client directory: '.$client_dir,LOGLEVEL_DEBUG);
            }
            
            $this->_exec('groupdel client'.$client_id);
            $app->log('Removed group client'.$client_id,LOGLEVEL_DEBUG);
            if($app->system->is_group('client'.$client_id)){
                $this->_exec('groupdel client'.$client_id);
                $app->log('Removed group client'.$client_id,LOGLEVEL_DEBUG);
            }
        }
        
    }
server/plugins-available/bind_plugin.inc.php
@@ -103,6 +103,11 @@
            $tpl->setVar($zone);
        
            $records = $app->db->queryAllRecords("SELECT * FROM dns_rr WHERE zone = ".$zone['id']." AND active = 'Y'");
            if(is_array($records) && !empty($records)){
                for($i=0;$i<sizeof($records);$i++){
                    if($records[$i]['ttl'] == 0) $records[$i]['ttl'] = '';
                }
            }
            $tpl->setLoop('zones',$records);
            
            //TODO : change this when distribution information has been integrated into server record
server/plugins-available/cron_plugin.inc.php
@@ -212,7 +212,7 @@
                    }
                    
                    $command .= "\t";
                    if(substr($job['command'], 0, 1) != "/") $command .= $this->parent_domain['document_root'].'/';
                    if($job['type'] == 'chrooted' && substr($job['command'], 0, 1) != "/") $command .= $this->parent_domain['document_root'].'/';
                    $command .= $job['command'];
                }
                
server/plugins-available/ftpuser_base_plugin.inc.php
@@ -69,6 +69,8 @@
    function insert($event_name,$data) {
        global $app, $conf;
        
        $app->uses('system');
    if(!is_dir($data['new']['dir'])) {
      $app->log("FTP User directory '".$data['new']['dir']."' does not exist. Creating it now.",LOGLEVEL_DEBUG);
      
@@ -80,9 +82,11 @@
        return false;
      }
      
      $app->system->web_folder_protection($web['document_root'],false);
      exec('mkdir -p '.escapeshellcmd($data['new']['dir']));
      exec('chown '.escapeshellcmd($web["system_user"]).':'.escapeshellcmd($web['system_group']).' '.$data['new']['dir']);
      $app->system->web_folder_protection($web['document_root'],true);
      $app->log("Added ftpuser_dir: ".$data['new']['dir'],LOGLEVEL_DEBUG);
    }
    
@@ -91,6 +95,8 @@
    function update($event_name,$data) {
        global $app, $conf;
        
        $app->uses('system');
    if(!is_dir($data['new']['dir'])) {
      $app->log("FTP User directory '".$data['new']['dir']."' does not exist. Creating it now.",LOGLEVEL_DEBUG);
      
@@ -101,9 +107,11 @@
        $app->log('User dir is outside of docroot.',LOGLEVEL_WARN);
        return false;
      }
      $app->system->web_folder_protection($web['document_root'],false);
      exec('mkdir -p '.escapeshellcmd($data['new']['dir']));
      exec('chown '.escapeshellcmd($web["system_user"]).':'.escapeshellcmd($web['system_group']).' '.$data['new']['dir']);
      $app->system->web_folder_protection($web['document_root'],true);
      
      $app->log("Added ftpuser_dir: ".$data['new']['dir'],LOGLEVEL_DEBUG);
    }
server/plugins-available/getmail_plugin.inc.php
@@ -104,15 +104,15 @@
            
                // Shall emails be deleted after retrieval
                if($data["new"]["source_delete"] == 'y') {
                    $tpl = str_replace('{DELETE}','1',$tpl);
                    $tpl = str_replace('{DELETE}','true',$tpl);
                } else {
                    $tpl = str_replace('{DELETE}','0',$tpl);
                    $tpl = str_replace('{DELETE}','false',$tpl);
                }
                if($data["new"]["read_all"] == 'y') {
                    $tpl = str_replace('{READ_ALL}', '1', $tpl);
                    $tpl = str_replace('{READ_ALL}', 'true', $tpl);
                } else {
                    $tpl = str_replace('{READ_ALL}', '0', $tpl);
                    $tpl = str_replace('{READ_ALL}', 'false', $tpl);
                }
                
                // Set the data retriever
server/plugins-available/mysql_clientdb_plugin.inc.php
@@ -247,8 +247,10 @@
            
            // get the users for this database
            $db_user = $app->db->queryOneRecord("SELECT `database_user`, `database_password` FROM `web_database_user` WHERE `database_user_id` = '" . intval($data['new']['database_user_id']) . "'");
            $old_db_user = $app->db->queryOneRecord("SELECT `database_user`, `database_password` FROM `web_database_user` WHERE `database_user_id` = '" . intval($data['old']['database_user_id']) . "'");
            
            $db_ro_user = $app->db->queryOneRecord("SELECT `database_user`, `database_password` FROM `web_database_user` WHERE `database_user_id` = '" . intval($data['new']['database_ro_user_id']) . "'");
            $old_db_ro_user = $app->db->queryOneRecord("SELECT `database_user`, `database_password` FROM `web_database_user` WHERE `database_user_id` = '" . intval($data['old']['database_ro_user_id']) . "'");
            
            $host_list = '';
            if($data['new']['remote_access'] == 'y') {
@@ -278,28 +280,28 @@
                    else $this->process_host_list('GRANT', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $host_list, $link, '', true);
                }
            } else if($data['new']['active'] == 'n' && $data['old']['active'] == 'y') { // revoke database user, if inactive
                if($db_user) {
                    if($db_user['database_user'] == 'root'){
                if($old_db_user) {
                    if($old_db_user['database_user'] == 'root'){
                        $app->log('User root not allowed for Client databases',LOGLEVEL_WARNING);
                    } else {
                        // Find out users to drop and users to revoke
                        $drop_or_revoke_user = $this->drop_or_revoke_user($data['new']['database_id'], $data['new']['database_user_id'], $old_host_list);
                        if($drop_or_revoke_user['drop_hosts'] != '') $this->process_host_list('DROP', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $drop_or_revoke_user['drop_hosts'], $link);
                        if($drop_or_revoke_user['revoke_hosts'] != '') $this->process_host_list('REVOKE', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $drop_or_revoke_user['revoke_hosts'], $link);
                        $drop_or_revoke_user = $this->drop_or_revoke_user($data['old']['database_id'], $data['old']['database_user_id'], $old_host_list);
                        if($drop_or_revoke_user['drop_hosts'] != '') $this->process_host_list('DROP', $data['old']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $drop_or_revoke_user['drop_hosts'], $link);
                        if($drop_or_revoke_user['revoke_hosts'] != '') $this->process_host_list('REVOKE', $data['old']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $drop_or_revoke_user['revoke_hosts'], $link);
                        
                        
                        //$this->process_host_list('DROP', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $old_host_list, $link);
                        //$this->process_host_list('REVOKE', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $old_host_list, $link);
                    }
                }
                if($db_ro_user && $data['new']['database_user_id'] != $data['new']['database_ro_user_id']) {
                    if($db_ro_user['database_user'] == 'root'){
                if($old_db_ro_user && $data['old']['database_user_id'] != $data['old']['database_ro_user_id']) {
                    if($old_db_ro_user['database_user'] == 'root'){
                        $app->log('User root not allowed for Client databases',LOGLEVEL_WARNING);
                    } else {
                        // Find out users to drop and users to revoke
                        $drop_or_revoke_user = $this->drop_or_revoke_user($data['new']['database_id'], $data['new']['database_ro_user_id'], $old_host_list);
                        if($drop_or_revoke_user['drop_hosts'] != '') $this->process_host_list('DROP', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $drop_or_revoke_user['drop_hosts'], $link);
                        if($drop_or_revoke_user['revoke_hosts'] != '') $this->process_host_list('REVOKE', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $drop_or_revoke_user['revoke_hosts'], $link);
                        $drop_or_revoke_user = $this->drop_or_revoke_user($data['old']['database_id'], $data['old']['database_ro_user_id'], $old_host_list);
                        if($drop_or_revoke_user['drop_hosts'] != '') $this->process_host_list('DROP', $data['old']['database_name'], $old_db_ro_user['database_user'], $old_db_ro_user['database_password'], $drop_or_revoke_user['drop_hosts'], $link);
                        if($drop_or_revoke_user['revoke_hosts'] != '') $this->process_host_list('REVOKE', $data['old']['database_name'], $old_db_ro_user['database_user'], $old_db_ro_user['database_password'], $drop_or_revoke_user['revoke_hosts'], $link);
                        
                        //$this->process_host_list('DROP', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $old_host_list, $link);
                        //$this->process_host_list('REVOKE', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $old_host_list, $link);
@@ -314,15 +316,14 @@
            //* selected Users have changed
            if($data['new']['database_user_id'] != $data['old']['database_user_id']) {
                if($data['old']['database_user_id'] && $data['old']['database_user_id'] != $data['new']['database_ro_user_id']) {
                    $old_db_user = $app->db->queryOneRecord("SELECT `database_user`, `database_password` FROM `web_database_user` WHERE `database_user_id` = '" . intval($data['old']['database_user_id']) . "'");
                    if($old_db_user) {
                        if($old_db_user['database_user'] == 'root'){
                            $app->log('User root not allowed for Client databases',LOGLEVEL_WARNING);
                        } else {
                            // Find out users to drop and users to revoke
                            $drop_or_revoke_user = $this->drop_or_revoke_user($data['new']['database_id'], $data['old']['database_user_id'], $old_host_list);
                            if($drop_or_revoke_user['drop_hosts'] != '') $this->process_host_list('DROP', $data['new']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $drop_or_revoke_user['drop_hosts'], $link);
                            if($drop_or_revoke_user['revoke_hosts'] != '') $this->process_host_list('REVOKE', $data['new']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $drop_or_revoke_user['revoke_hosts'], $link);
                            $drop_or_revoke_user = $this->drop_or_revoke_user($data['old']['database_id'], $data['old']['database_user_id'], $old_host_list);
                            if($drop_or_revoke_user['drop_hosts'] != '') $this->process_host_list('DROP', $data['old']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $drop_or_revoke_user['drop_hosts'], $link);
                            if($drop_or_revoke_user['revoke_hosts'] != '') $this->process_host_list('REVOKE', $data['old']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $drop_or_revoke_user['revoke_hosts'], $link);
                        
                            //$this->process_host_list('DROP', $data['new']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $old_host_list, $link);
                            //$this->process_host_list('REVOKE', $data['new']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $old_host_list, $link);
@@ -336,15 +337,14 @@
            }
            if($data['new']['database_ro_user_id'] != $data['old']['database_ro_user_id']) {
                if($data['old']['database_ro_user_id'] && $data['old']['database_ro_user_id'] != $data['new']['database_user_id']) {
                    $old_db_user = $app->db->queryOneRecord("SELECT `database_user`, `database_password` FROM `web_database_user` WHERE `database_user_id` = '" . intval($data['old']['database_ro_user_id']) . "'");
                    if($old_db_user) {
                        if($old_db_user['database_user'] == 'root'){
                    if($old_db_ro_user) {
                        if($old_db_ro_user['database_user'] == 'root'){
                            $app->log('User root not allowed for Client databases',LOGLEVEL_WARNING);
                        } else {
                            // Find out users to drop and users to revoke
                            $drop_or_revoke_user = $this->drop_or_revoke_user($data['new']['database_id'], $data['old']['database_user_id'], $old_host_list);
                            if($drop_or_revoke_user['drop_hosts'] != '') $this->process_host_list('DROP', $data['new']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $drop_or_revoke_user['drop_hosts'], $link);
                            if($drop_or_revoke_user['revoke_hosts'] != '') $this->process_host_list('REVOKE', $data['new']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $drop_or_revoke_user['revoke_hosts'], $link);
                            $drop_or_revoke_user = $this->drop_or_revoke_user($data['old']['database_id'], $data['old']['database_user_id'], $old_host_list);
                            if($drop_or_revoke_user['drop_hosts'] != '') $this->process_host_list('DROP', $data['old']['database_name'], $old_db_ro_user['database_user'], $old_db_ro_user['database_password'], $drop_or_revoke_user['drop_hosts'], $link);
                            if($drop_or_revoke_user['revoke_hosts'] != '') $this->process_host_list('REVOKE', $data['old']['database_name'], $old_db_ro_user['database_user'], $old_db_ro_user['database_password'], $drop_or_revoke_user['revoke_hosts'], $link);
                            
                            //$this->process_host_list('DROP', $data['new']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $old_host_list, $link);
                            //$this->process_host_list('REVOKE', $data['new']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $old_host_list, $link);
@@ -377,27 +377,27 @@
                        else $this->process_host_list('GRANT', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $data['new']['remote_ips'], $link, '', true);
                    }
                } else {
                    if($db_user) {
                        if($db_user['database_user'] == 'root'){
                    if($old_db_user) {
                        if($old_db_user['database_user'] == 'root'){
                            $app->log('User root not allowed for Client databases',LOGLEVEL_WARNING);
                        } else {
                            // Find out users to drop and users to revoke
                            $drop_or_revoke_user = $this->drop_or_revoke_user($data['new']['database_id'], $data['new']['database_user_id'], $data['old']['remote_ips']);
                            if($drop_or_revoke_user['drop_hosts'] != '') $this->process_host_list('DROP', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $drop_or_revoke_user['drop_hosts'], $link);
                            if($drop_or_revoke_user['revoke_hosts'] != '') $this->process_host_list('REVOKE', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $drop_or_revoke_user['revoke_hosts'], $link);
                            $drop_or_revoke_user = $this->drop_or_revoke_user($data['old']['database_id'], $data['old']['database_user_id'], $data['old']['remote_ips']);
                            if($drop_or_revoke_user['drop_hosts'] != '') $this->process_host_list('DROP', $data['old']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $drop_or_revoke_user['drop_hosts'], $link);
                            if($drop_or_revoke_user['revoke_hosts'] != '') $this->process_host_list('REVOKE', $data['old']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $drop_or_revoke_user['revoke_hosts'], $link);
                            
                            //$this->process_host_list('DROP', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $data['old']['remote_ips'], $link);
                            //$this->process_host_list('REVOKE', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $data['old']['remote_ips'], $link);
                        }
                    }
                    if($db_ro_user && $data['new']['database_user_id'] != $data['new']['database_ro_user_id']) {
                        if($db_ro_user['database_user'] == 'root'){
                    if($old_db_ro_user && $data['old']['database_user_id'] != $data['old']['database_ro_user_id']) {
                        if($old_db_ro_user['database_user'] == 'root'){
                            $app->log('User root not allowed for Client databases',LOGLEVEL_WARNING);
                        } else {
                            // Find out users to drop and users to revoke
                            $drop_or_revoke_user = $this->drop_or_revoke_user($data['new']['database_id'], $data['new']['database_ro_user_id'], $data['old']['remote_ips']);
                            if($drop_or_revoke_user['drop_hosts'] != '') $this->process_host_list('DROP', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $drop_or_revoke_user['drop_hosts'], $link);
                            if($drop_or_revoke_user['revoke_hosts'] != '') $this->process_host_list('REVOKE', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $drop_or_revoke_user['revoke_hosts'], $link);
                            $drop_or_revoke_user = $this->drop_or_revoke_user($data['old']['database_id'], $data['old']['database_ro_user_id'], $data['old']['remote_ips']);
                            if($drop_or_revoke_user['drop_hosts'] != '') $this->process_host_list('DROP', $data['old']['database_name'], $old_db_ro_user['database_user'], $old_db_ro_user['database_password'], $drop_or_revoke_user['drop_hosts'], $link);
                            if($drop_or_revoke_user['revoke_hosts'] != '') $this->process_host_list('REVOKE', $data['old']['database_name'], $old_db_ro_user['database_user'], $old_db_ro_user['database_password'], $drop_or_revoke_user['revoke_hosts'], $link);
                            
                            //$this->process_host_list('DROP', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $data['old']['remote_ips'], $link);
                            //$this->process_host_list('REVOKE', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $data['old']['remote_ips'], $link);
@@ -407,31 +407,39 @@
                $app->log('Changing MySQL remote access privileges for database: '.$data['new']['database_name'],LOGLEVEL_DEBUG);
            } elseif($data['new']['remote_access'] == 'y' && $data['new']['remote_ips'] != $data['old']['remote_ips']) {
                //* Change remote access list
                if($old_db_user) {
                    if($old_db_user['database_user'] == 'root'){
                        $app->log('User root not allowed for Client databases',LOGLEVEL_WARNING);
                    } else {
                        // Find out users to drop and users to revoke
                        $drop_or_revoke_user = $this->drop_or_revoke_user($data['old']['database_id'], $data['old']['database_user_id'], $data['old']['remote_ips']);
                        if($drop_or_revoke_user['drop_hosts'] != '') $this->process_host_list('DROP', $data['old']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $drop_or_revoke_user['drop_hosts'], $link);
                        if($drop_or_revoke_user['revoke_hosts'] != '') $this->process_host_list('REVOKE', $data['old']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $drop_or_revoke_user['revoke_hosts'], $link);
                    }
                }
                if($db_user) {
                    if($db_user['database_user'] == 'root'){
                        $app->log('User root not allowed for Client databases',LOGLEVEL_WARNING);
                    } else {
                        // Find out users to drop and users to revoke
                        $drop_or_revoke_user = $this->drop_or_revoke_user($data['new']['database_id'], $data['new']['database_user_id'], $data['old']['remote_ips']);
                        if($drop_or_revoke_user['drop_hosts'] != '') $this->process_host_list('DROP', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $drop_or_revoke_user['drop_hosts'], $link);
                        if($drop_or_revoke_user['revoke_hosts'] != '') $this->process_host_list('REVOKE', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $drop_or_revoke_user['revoke_hosts'], $link);
                        //$this->process_host_list('DROP', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $data['old']['remote_ips'], $link);
                        //$this->process_host_list('REVOKE', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $data['old']['remote_ips'], $link);
                        $this->process_host_list('GRANT', $data['new']['database_name'], $db_user['database_user'], $db_user['database_password'], $data['new']['remote_ips'], $link);
                    }
                }
                if($old_db_ro_user && $data['old']['database_user_id'] != $data['old']['database_ro_user_id']) {
                    if($old_db_ro_user['database_user'] == 'root'){
                        $app->log('User root not allowed for Client databases',LOGLEVEL_WARNING);
                    } else {
                        // Find out users to drop and users to revoke
                        $drop_or_revoke_user = $this->drop_or_revoke_user($data['old']['database_id'], $data['old']['database_user_id'], $data['old']['remote_ips']);
                        if($drop_or_revoke_user['drop_hosts'] != '') $this->process_host_list('DROP', $data['old']['database_name'], $old_db_ro_user['database_user'], $old_db_ro_user['database_password'], $drop_or_revoke_user['drop_hosts'], $link);
                        if($drop_or_revoke_user['revoke_hosts'] != '') $this->process_host_list('REVOKE', $data['old']['database_name'], $old_db_ro_user['database_user'], $old_db_ro_user['database_password'], $drop_or_revoke_user['revoke_hosts'], $link);
                    }
                }
                if($db_ro_user && $data['new']['database_user_id'] != $data['new']['database_ro_user_id']) {
                    if($db_ro_user['database_user'] == 'root'){
                        $app->log('User root not allowed for Client databases',LOGLEVEL_WARNING);
                    } else {
                        // Find out users to drop and users to revoke
                        $drop_or_revoke_user = $this->drop_or_revoke_user($data['new']['database_id'], $data['new']['database_user_id'], $data['old']['remote_ips']);
                        if($drop_or_revoke_user['drop_hosts'] != '') $this->process_host_list('DROP', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $drop_or_revoke_user['drop_hosts'], $link);
                        if($drop_or_revoke_user['revoke_hosts'] != '') $this->process_host_list('REVOKE', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $drop_or_revoke_user['revoke_hosts'], $link);
                        //$this->process_host_list('DROP', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $data['old']['remote_ips'], $link);
                        //$this->process_host_list('REVOKE', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $data['old']['remote_ips'], $link);
                        $this->process_host_list('GRANT', $data['new']['database_name'], $db_ro_user['database_user'], $db_ro_user['database_password'], $data['new']['remote_ips'], $link, '', true);
                    }
                }
@@ -460,6 +468,28 @@
                return;
            }
            
            $old_host_list = '';
            if($data['old']['remote_access'] == 'y') {
                $old_host_list = $data['old']['remote_ips'];
                if($old_host_list == '') $old_host_list = '%';
            }
            if($old_host_list != '') $old_host_list .= ',';
            $old_host_list .= 'localhost';
            if($data['old']['database_user_id']) {
                $old_db_user = $app->db->queryOneRecord("SELECT `database_user`, `database_password` FROM `web_database_user` WHERE `database_user_id` = '" . intval($data['old']['database_user_id']) . "'");
                $drop_or_revoke_user = $this->drop_or_revoke_user($data['old']['database_id'], $data['old']['database_user_id'], $old_host_list);
                if($drop_or_revoke_user['drop_hosts'] != '') $this->process_host_list('DROP', $data['old']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $drop_or_revoke_user['drop_hosts'], $link);
                if($drop_or_revoke_user['revoke_hosts'] != '') $this->process_host_list('REVOKE', $data['old']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $drop_or_revoke_user['revoke_hosts'], $link);
            }
            if($data['old']['database_ro_user_id']) {
                $old_db_user = $app->db->queryOneRecord("SELECT `database_user`, `database_password` FROM `web_database_user` WHERE `database_user_id` = '" . intval($data['old']['database_ro_user_id']) . "'");
                $drop_or_revoke_user = $this->drop_or_revoke_user($data['old']['database_id'], $data['old']['database_ro_user_id'], $old_host_list);
                if($drop_or_revoke_user['drop_hosts'] != '') $this->process_host_list('DROP', $data['old']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $drop_or_revoke_user['drop_hosts'], $link);
                if($drop_or_revoke_user['revoke_hosts'] != '') $this->process_host_list('REVOKE', $data['old']['database_name'], $old_db_user['database_user'], $old_db_user['database_password'], $drop_or_revoke_user['revoke_hosts'], $link);
            }
            if($link->query('DROP DATABASE '.$link->escape_string($data['old']['database_name']))) {
                $app->log('Dropping MySQL database: '.$data['old']['database_name'],LOGLEVEL_DEBUG);
            } else {
@@ -503,6 +533,8 @@
        $host_list = array('localhost');
        // get all databases this user was active for
        $db_list = $app->db->queryAllRecords("SELECT `remote_access`, `remote_ips` FROM `web_database` WHERE `database_user_id` = '" . intval($data['old']['database_user_id']) . "'");
        if(count($db_list) < 1) return; // nothing to do on this server for this db user
        foreach($db_list as $database) {
            if($database['remote_access'] != 'y') continue;
            
server/plugins-available/nginx_plugin.inc.php
@@ -99,7 +99,7 @@
        $app->uses('getconf');
        $web_config = $app->getconf->get_server_config($conf['server_id'], 'web');
        if ($web_config['CA_path']!='' && !file_exists($web_config['CA_path'].'/openssl.cnf'))
            $app->log("CA path error, file does not exist:".$web_config['CA_path'].'/openssl.conf',LOGLEVEL_ERROR);
            $app->log("CA path error, file does not exist:".$web_config['CA_path'].'/openssl.cnf',LOGLEVEL_ERROR);
        
        //* Only vhosts can have a ssl cert
        if($data["new"]["type"] != "vhost" && $data["new"]["type"] != "vhostsubdomain") return;
@@ -243,6 +243,7 @@
            if(trim($data["new"]["ssl_cert"]) != '') $app->system->file_put_contents($crt_file,$data["new"]["ssl_cert"]);
            //if(trim($data["new"]["ssl_bundle"]) != '') $app->system->file_put_contents($bundle_file,$data["new"]["ssl_bundle"]);
            if(trim($data["new"]["ssl_key"]) != '') $app->system->file_put_contents($key_file2,$data["new"]["ssl_key"]);
            $app->system->chmod($key_file2,0400);
            
            // for nginx, bundle files have to be appended to the certificate file
            if(trim($data["new"]["ssl_bundle"]) != ''){                
@@ -678,6 +679,9 @@
            }
        }
        //* add the nginx user to the client group if this is a vhost and security level is set to high, no matter if this is an insert or update and regardless of set_folder_permissions_on_update
        if($data['new']['type'] == 'vhost' && $web_config['security_level'] == 20) $app->system->add_user_to_group($groupname, escapeshellcmd($web_config['nginx_user']));
        //* If the security level is set to high
        if(($this->action == 'insert' && $data['new']['type'] == 'vhost') or ($web_config['set_folder_permissions_on_update'] == 'y' && $data['new']['type'] == 'vhost')) {
        
@@ -716,13 +720,10 @@
                    //* add the nginx user to the client group in the chroot environment
                    $tmp_groupfile = $app->system->server_conf['group_datei'];
                    $app->system->server_conf['group_datei'] = $web_config['website_basedir'].'/etc/group';
                    $app->system->add_user_to_group($groupname, escapeshellcmd($web_config['user']));
                    $app->system->add_user_to_group($groupname, escapeshellcmd($web_config['nginx_user']));
                    $app->system->server_conf['group_datei'] = $tmp_groupfile;
                    unset($tmp_groupfile);
                }
                //* add the nginx user to the client group
                $app->system->add_user_to_group($groupname, escapeshellcmd($web_config['nginx_user']));
                
                //* Chown all default directories
                $app->system->chown($data['new']['document_root'],'root');
@@ -937,6 +938,20 @@
        
        // backwards compatibility; since ISPConfig 3.0.5, the PHP mode for nginx is called 'php-fpm' instead of 'fast-cgi'. The following line makes sure that old web sites that have 'fast-cgi' in the database still get PHP-FPM support.
        if($vhost_data['php'] == 'fast-cgi') $vhost_data['php'] = 'php-fpm';
        // Custom rewrite rules
        $final_rewrite_rules = array();
        $custom_rewrite_rules = $data['new']['rewrite_rules'];
        // Make sure we only have Unix linebreaks
        $custom_rewrite_rules = str_replace("\r\n", "\n", $custom_rewrite_rules);
        $custom_rewrite_rules = str_replace("\r", "\n", $custom_rewrite_rules);
        $custom_rewrite_rule_lines = explode("\n", $custom_rewrite_rules);
        if(is_array($custom_rewrite_rule_lines) && !empty($custom_rewrite_rule_lines)){
            foreach($custom_rewrite_rule_lines as $custom_rewrite_rule_line){
                $final_rewrite_rules[] = array('rewrite_rule' => $custom_rewrite_rule_line);
            }
        }
        $tpl->setLoop('rewrite_rules', $final_rewrite_rules);
        
        // Custom nginx directives
        $final_nginx_directives = array();
@@ -1525,7 +1540,8 @@
            $nginx_online_status_before_restart = $this->_checkTcp('localhost',80);
            $app->log('nginx status is: '.$nginx_online_status_before_restart,LOGLEVEL_DEBUG);
            $app->services->restartService('httpd','restart');
            $retval = $app->services->restartService('httpd','restart'); // $retval['retval'] is 0 on success and > 0 on failure
            $app->log('nginx restart return value is: '.$retval['retval'],LOGLEVEL_DEBUG);
            
            // wait a few seconds, before we test the apache status again
            sleep(2);
@@ -1533,9 +1549,18 @@
            //* Check if nginx restarted successfully if it was online before
            $nginx_online_status_after_restart = $this->_checkTcp('localhost',80);
            $app->log('nginx online status after restart is: '.$nginx_online_status_after_restart,LOGLEVEL_DEBUG);
            if($nginx_online_status_before_restart && !$nginx_online_status_after_restart) {
                $app->log('nginx did not restart after the configuration change for website '.$data['new']['domain'].' Reverting the configuration. Saved non-working config as '.$vhost_file.'.err',LOGLEVEL_WARN);
            if($nginx_online_status_before_restart && !$nginx_online_status_after_restart || $retval['retval'] > 0) {
                $app->log('nginx did not restart after the configuration change for website '.$data['new']['domain'].'. Reverting the configuration. Saved non-working config as '.$vhost_file.'.err',LOGLEVEL_WARN);
                if(is_array($retval['output']) && !empty($retval['output'])){
                    $app->log('Reason for nginx restart failure: '.implode("\n", $retval['output']),LOGLEVEL_WARN);
                } else {
                    // if no output is given, check again
                    exec('nginx -t 2>&1', $tmp_output, $tmp_retval);
                    if($tmp_retval > 0 && is_array($tmp_output) && !empty($tmp_output)) $app->log('Reason for nginx restart failure: '.implode("\n", $tmp_output),LOGLEVEL_WARN);
                    unset($tmp_output, $tmp_retval);
                }
                $app->system->copy($vhost_file,$vhost_file.'.err');
                if(is_file($vhost_file.'~')) {
                    //* Copy back the last backup file
                    $app->system->copy($vhost_file.'~',$vhost_file);
@@ -1581,12 +1606,7 @@
            }
        } else {
            //* We do not check the nginx config after changes (is faster)
            if($nginx_chrooted) {
                $app->services->restartServiceDelayed('httpd','reload');
            } else {
                // request a httpd reload when all records have been processed
                $app->services->restartServiceDelayed('httpd','reload');
            }
            $app->services->restartServiceDelayed('httpd','reload');
        }
        
        //* The vhost is written and apache has been restarted, so we 
@@ -2400,6 +2420,12 @@
        if(is_array($lines) && !empty($lines)){
            $linecount = sizeof($lines);
            for($h=0;$h<$linecount;$h++){
                // remove comments
                if(substr(trim($lines[$h]),0,1) == '#'){
                    unset($lines[$h]);
                    continue;
                }
                $lines[$h] = rtrim($lines[$h]);
                /*
                if(substr(ltrim($lines[$h]), 0, 8) == 'location' && strpos($lines[$h], '{') !== false && strpos($lines[$h], ';') !== false){
@@ -2526,8 +2552,10 @@
                $app->log('Removed client directory: '.$client_dir,LOGLEVEL_DEBUG);
            }
            
            $this->_exec('groupdel client'.$client_id);
            $app->log('Removed group client'.$client_id,LOGLEVEL_DEBUG);
            if($app->system->is_group('client'.$client_id)){
                $this->_exec('groupdel client'.$client_id);
                $app->log('Removed group client'.$client_id,LOGLEVEL_DEBUG);
            }
        }
        
    }
server/scripts/run-getmail.sh
@@ -14,7 +14,7 @@
else
  touch /tmp/.getmail_lock
  if [ "$rcfiles" != "" ]; then
    /usr/bin/getmail -v -g /etc/getmail $rcfiles
    /usr/bin/getmail -v -g /etc/getmail $rcfiles || true
  fi
  rm -f /tmp/.getmail_lock
fi
server/server.php
@@ -62,10 +62,20 @@
    // Set the loglevel
    $conf['log_priority'] = intval($conf['serverconfig']['server']['loglevel']);
    // Set level from which admin should be notified by email
    if(!isset($conf['serverconfig']['server']['admin_notify_events']) || $conf['serverconfig']['server']['admin_notify_events'] == '') $conf['serverconfig']['server']['admin_notify_events'] = 3;
    $conf['admin_notify_priority'] = intval($conf['serverconfig']['server']['admin_notify_events']);
    // we do not need this variable anymore
    unset($server_db_record);
    
    // retrieve admin email address for notifications
    $sys_ini = $app->dbmaster->queryOneRecord("SELECT * FROM sys_ini WHERE sysini_id = 1");
    $conf['sys_ini'] = $app->ini_parser->parse_ini_string(stripslashes($sys_ini['config']));
    $conf['admin_mail'] = $conf['sys_ini']['mail']['admin_mail'];
    unset($sys_ini);
    /*
     * Save the rescue-config, maybe we need it (because the database is down)
     */