From 8c4aa39481bbfde2b403f4787c85c057e84f2e12 Mon Sep 17 00:00:00 2001
From: tbrehm <t.brehm@ispconfig.org>
Date: Wed, 22 Jul 2009 09:01:13 -0400
Subject: [PATCH] Merged revisions 1216 - 1279 from trunk
---
interface/web/sites/templates/database_edit.htm | 14
interface/web/mail/mail_user_filter_edit.php | 46
interface/web/sites/lib/lang/br_shell_user_list.lng | 8
interface/web/admin/templates/server_config_list.htm | 90
interface/web/sites/lib/lang/bg_web_sites_stats_list.lng | 8
interface/web/sites/lib/lang/se_ftp_user.lng | 1
interface/web/admin/lib/lang/es_server_config.lng | 6
interface/web/sites/cron_edit.php | 220 +
interface/web/admin/software_update_list.php | 4
interface/web/admin/lib/lang/de_server_config.lng | 6
interface/web/admin/lib/lang/nl_server_config.lng | 6
interface/web/designer/lib/lang/br_form_show.lng | 18
interface/web/mail/lib/lang/br_spamfilter_config_list.lng | 5
interface/web/mail/lib/lang/br_mail_spamfilter_list.lng | 9
interface/web/mail/spamfilter_blacklist_edit.php | 16
interface/web/sites/lib/lang/es_database.lng | 2
interface/web/mail/lib/lang/ru_spamfilter_blacklist.lng | 1
interface/web/admin/lib/lang/br_server_ip_list.lng | 7
interface/web/mail/lib/lang/br_spamfilter_whitelist_list.lng | 9
interface/web/sites/lib/lang/se_web_sites_stats_list.lng | 8
interface/web/client/lib/module.conf.php | 32
interface/web/dns/lib/lang/br_dns_aaaa.lng | 15
interface/web/dns/lib/lang/de_dns_aaaa.lng | 15
interface/web/mail/lib/lang/en_mail_alias.lng | 1
interface/web/sites/lib/lang/ru_cron_list.lng | 12
interface/web/dns/lib/lang/fr_dns_a.lng | 1
interface/web/sites/templates/cron_list.htm | 71
interface/web/admin/lib/lang/br_server_ip.lng | 7
interface/web/dns/lib/lang/es_dns_a.lng | 1
interface/web/admin/lib/lang/br_users.lng | 29
interface/web/client/lib/lang/fr_client.lng | 6
interface/web/admin/templates/language_import.htm | 63
server/server.php | 7
interface/web/client/templates/reseller_edit_address.htm | 101
interface/web/client/reseller_list.php | 55
interface/web/sites/lib/lang/fr_web_sites_stats_list.lng | 8
server/plugins-available/software_update_plugin.inc.php | 31
install/dist/conf/centos52.conf.php | 8
interface/web/dns/lib/lang/fi_dns_aaaa.lng | 15
interface/web/sites/lib/lang/fr_cron.lng | 21
interface/web/admin/lib/lang/ru_server_config.lng | 6
interface/web/mail/lib/lang/br_mail_user_list.lng | 6
interface/web/mail/lib/lang/br_mail_content_filter_list.lng | 8
interface/web/mail/lib/lang/fi_mail_alias.lng | 1
server/plugins-available/cron_jailkit_plugin.inc.php | 272 +
interface/web/admin/lib/lang/en_server_config.lng | 7
server/scripts/ispconfig_update.php | 2
interface/web/client/lib/lang/nl_client_template.lng | 5
interface/web/admin/lib/lang/br_software_repo_list.lng | 6
interface/web/designer/lib/lang/br_module_nav_edit.lng | 6
interface/web/mail/lib/lang/se_mail_alias.lng | 1
interface/web/mail/lib/lang/de_mail_alias.lng | 1
docs/INSTALL_DEBIAN_4.0.txt | 16
interface/web/mail/lib/lang/es_mail_user_filter_list.lng | 1
interface/web/dns/templates/dns_hinfo_edit.htm | 76
interface/web/sites/templates/cron_edit.htm | 68
interface/web/sites/lib/lang/br_web_subdomain.lng | 39
interface/web/mail/lib/lang/ru_mail_user.lng | 1
interface/web/sites/lib/lang/fi_cron_list.lng | 12
interface/web/mail/lib/lang/ru_mail_alias.lng | 1
server/plugins-available/apache2_plugin.inc.php | 90
interface/web/mail/lib/lang/br_spamfilter_users.lng | 8
interface/web/help/lib/lang/br.lng | 8
interface/web/dns/templates/dns_a_edit.htm | 78
interface/web/client/lib/lang/it_client.lng | 6
interface/web/mail/lib/lang/br_mail_domain_catchall.lng | 9
interface/web/mail/lib/lang/se_mail_forward.lng | 1
interface/web/sites/lib/lang/it_cron.lng | 21
server/plugins-available/webmail_symlink_plugin.inc.php | 121
interface/web/mail/spamfilter_policy_edit.php | 16
interface/web/mail/lib/lang/br_mail_content_filter.lng | 9
interface/web/mail/lib/lang/nl_mail_alias.lng | 1
interface/web/sites/lib/lang/nl_web_sites_stats_list.lng | 8
interface/web/sites/lib/lang/it_web_sites_stats_list.lng | 8
interface/web/dns/templates/dns_ptr_edit.htm | 76
interface/web/sites/lib/lang/bg_cron.lng | 21
interface/web/dns/lib/lang/br_dns_txt.lng | 15
interface/web/mail/lib/lang/br_mail_domain_catchall_list.lng | 9
interface/web/admin/lib/lang/br_firewall.lng | 10
interface/lib/classes/custom_datasource.inc.php | 50
interface/web/admin/lib/lang/br_software_repo.lng | 8
interface/web/admin/lib/lang/br_language_add.lng | 9
interface/web/sites/lib/lang/it_ftp_user.lng | 1
interface/web/dns/lib/lang/es_dns_wizard.lng | 12
interface/web/mail/lib/lang/se_mail_user_filter_list.lng | 1
interface/web/dns/lib/lang/bg_dns_a.lng | 1
interface/web/sites/database_edit.php | 16
interface/web/client/lib/lang/ru_client_template.lng | 5
interface/web/client/templates/reseller_edit_limits.htm | 171
interface/web/dns/lib/lang/es_dns_aaaa.lng | 15
interface/web/client/lib/lang/fr_client_template.lng | 5
interface/web/sites/lib/lang/es_cron.lng | 21
install/tpl/apache_ispconfig.conf.master | 2
interface/web/admin/lib/lang/br_server_config.lng | 42
interface/web/sites/lib/lang/bg_ftp_user.lng | 1
install/dist/conf/centos53.conf.php | 8
server/scripts/update_from_svn.sh | 4
interface/web/client/lib/lang/br_client_template_list.lng | 6
interface/web/dns/templates/dns_txt_edit.htm | 76
server/plugins-available/cron_plugin.inc.php | 239 +
interface/web/dns/lib/lang/br.lng | 19
interface/web/mail/lib/lang/it_spamfilter_blacklist.lng | 1
interface/web/mail/mail_get_edit.php | 16
server/mods-available/web_module.inc.php | 3
interface/web/mail/lib/lang/br_mail_whitelist_list.lng | 10
interface/web/mail/lib/lang/fi_mail_user_filter_list.lng | 1
interface/web/admin/software_package_list.php | 51
interface/web/dns/lib/lang/de_dns_wizard.lng | 12
interface/web/sites/web_aliasdomain_edit.php | 16
interface/web/mail/lib/lang/se_spamfilter_blacklist.lng | 1
interface/web/mail/lib/lang/nl_mail_user_filter_list.lng | 1
interface/web/mail/lib/lang/es_mail_forward.lng | 1
interface/web/admin/templates/language_export.htm | 52
server/conf/vhost.conf.master | 591 +-
interface/web/mail/lib/lang/br_mail_alias.lng | 10
interface/web/mail/lib/lang/en_mail_user_filter_list.lng | 1
interface/web/mail/mail_forward_edit.php | 25
interface/web/client/lib/lang/en_client_template.lng | 5
interface/web/mail/lib/lang/br_spamfilter_blacklist.lng | 8
install/dist/conf/gentoo.conf.php | 8
interface/web/mail/lib/lang/nl_mail_forward.lng | 1
interface/web/mail/lib/lang/bg_mail_user.lng | 1
interface/web/dns/dns_a_edit.php | 5
interface/web/help/lib/lang/br_support_message_list.lng | 7
interface/web/sites/lib/lang/br_cron.lng | 21
interface/web/sites/lib/lang/ru_cron.lng | 21
interface/web/admin/lib/lang/se_server_config.lng | 6
interface/web/dns/templates/dns_aaaa_edit.htm | 2
interface/web/mail/mail_blacklist_edit.php | 16
interface/web/dns/templates/dns_alias_edit.htm | 76
interface/web/mail/lib/lang/de_mail_user.lng | 1
interface/web/mail/lib/lang/en_mail_user.lng | 1
interface/web/client/lib/lang/de_client_template.lng | 5
interface/web/mail/lib/lang/es_mail_user.lng | 1
interface/web/client/form/reseller.tform.php | 733 +++
interface/web/sites/lib/lang/fi_database.lng | 2
interface/web/admin/form/server.tform.php | 4
interface/web/sites/lib/lang/it_database.lng | 2
install/dist/conf/debian40.conf.php | 8
interface/web/sites/form/cron.tform.php | 189
interface/lib/classes/validate_cron.inc.php | 191
interface/web/mail/lib/lang/br_mail_whitelist.lng | 9
interface/web/sites/lib/lang/ru_web_sites_stats_list.lng | 8
interface/web/mail/lib/lang/br_mail_forward_list.lng | 8
interface/web/mail/lib/lang/nl_spamfilter_blacklist.lng | 1
interface/web/sites/templates/ftp_user_advanced_client.htm | 22
interface/web/mail/lib/lang/fr_mail_user.lng | 1
interface/web/mail/lib/lang/br_mail_alias_list.lng | 8
interface/web/mail/lib/lang/fr_mail_user_filter_list.lng | 1
interface/web/dns/lib/lang/fi_dns_a.lng | 1
interface/web/client/templates/client_template_edit_limits.htm | 214
interface/web/admin/lib/lang/br_users_list.lng | 8
interface/web/client/templates/client_edit_limits.htm | 18
interface/web/dns/lib/lang/se_dns_wizard.lng | 12
interface/web/sites/lib/lang/nl_cron_list.lng | 12
interface/web/client/lib/lang/it_client_template.lng | 5
install/dist/lib/opensuse.lib.php | 18
interface/web/client/lib/lang/ru_client.lng | 6
interface/web/mail/lib/lang/fr_spamfilter_whitelist.lng | 1
interface/web/sites/lib/lang/br_web_domain.lng | 50
interface/web/sites/web_domain_edit.php | 38
interface/web/mail/lib/lang/it_mail_forward.lng | 1
interface/web/admin/templates/server_config_vlogger_edit.htm | 22
interface/web/mail/mail_alias_edit.php | 25
interface/web/mail/lib/lang/br_mail_get_list.lng | 9
interface/web/mail/lib/lang/br_mail_get.lng | 15
interface/web/sites/lib/lang/br_database.lng | 22
interface/web/dns/lib/lang/fi_dns_wizard.lng | 12
interface/web/mail/lib/lang/bg_spamfilter_whitelist.lng | 1
interface/lib/app.inc.php | 15
interface/web/login/lib/lang/br.lng | 15
server/plugins-available/firewall_plugin.inc.php | 18
interface/web/mail/mail_domain_catchall_edit.php | 16
interface/web/admin/lib/lang/br_server_config_list.lng | 5
interface/web/dns/lib/lang/ru_dns_aaaa.lng | 15
install/dist/lib/fedora.lib.php | 18
interface/web/dns/lib/lang/se_dns_a.lng | 1
interface/web/dns/lib/lang/fr_dns_aaaa.lng | 15
interface/web/mail/lib/lang/fr_mail_forward.lng | 1
interface/web/dns/templates/dns_ns_edit.htm | 76
interface/web/admin/lib/lang/br_language_import.lng | 7
install/lib/installer_base.lib.php | 165
interface/web/client/lib/lang/br_clients_list.lng | 10
interface/web/mail/lib/lang/it_spamfilter_whitelist.lng | 1
interface/web/mail/lib/lang/de_mail_user_filter_list.lng | 1
interface/web/admin/lib/lang/br.lng | 35
interface/web/mail/lib/lang/de_spamfilter_blacklist.lng | 1
interface/web/mail/lib/lang/fi_spamfilter_blacklist.lng | 1
interface/web/sites/form/ftp_user.tform.php | 208
interface/web/sites/lib/lang/br_ftp_user_list.lng | 8
interface/web/dns/lib/lang/de_dns_a.lng | 1
install/dist/conf/fedora9.conf.php | 8
interface/web/designer/lib/lang/br_module_nav_item_edit.lng | 8
interface/web/dns/lib/lang/br_dns_ptr.lng | 15
interface/web/dns/lib/lang/it_dns_a.lng | 1
interface/web/client/lib/lang/de_client.lng | 6
interface/web/sites/lib/lang/br_web_domain_list.lng | 8
interface/web/client/lib/lang/br_client_template.lng | 48
server/mods-available/cron_module.inc.php | 97
interface/web/mail/lib/lang/fi_mail_forward.lng | 1
interface/web/monitor/lib/lang/br_syslog_list.lng | 8
interface/web/sites/lib/lang/ru_database.lng | 2
interface/web/sites/lib/lang/de_web_sites_stats_list.lng | 8
interface/web/admin/lib/lang/br_language_list.lng | 8
interface/web/dns/dns_template_edit.php | 116
interface/web/mail/lib/lang/es_spamfilter_blacklist.lng | 1
interface/web/dns/templates/dns_cname_edit.htm | 76
interface/web/admin/lib/lang/br_system_config.lng | 14
interface/web/dns/lib/lang/br_dns_wizard.lng | 16
interface/web/mail/lib/lang/br_mail_user_stats_list.lng | 8
interface/web/dns/lib/lang/br_dns_ns.lng | 15
interface/web/sites/lib/lang/fi_web_sites_stats_list.lng | 8
interface/web/sites/lib/lang/nl_database.lng | 2
interface/web/dns/lib/lang/se_dns_aaaa.lng | 15
interface/web/mail/lib/lang/bg_mail_user_filter_list.lng | 1
interface/web/dns/lib/lang/br_dns_hinfo.lng | 15
interface/web/mail/lib/lang/ru_mail_user_filter_list.lng | 1
interface/web/sites/lib/lang/nl_cron.lng | 21
interface/web/sites/lib/lang/it_cron_list.lng | 12
interface/lib/classes/validate_database.inc.php | 72
interface/web/dns/lib/lang/nl_dns_a.lng | 1
interface/web/client/lib/lang/br_client.lng | 85
interface/web/admin/templates/server_config_jailkit_edit.htm | 4
interface/web/sites/lib/lang/en_ftp_user.lng | 2
interface/web/designer/lib/lang/br_form_list.lng | 7
interface/web/sites/lib/lang/se_database.lng | 2
interface/web/client/form/client.tform.php | 1426 +++---
interface/web/mail/mail_domain_edit.php | 42
interface/web/admin/lib/lang/br_software_package_list.lng | 8
interface/web/sites/list/web_sites_stats.list.php | 60
interface/web/sites/lib/lang/fr_database.lng | 2
interface/web/admin/lib/lang/it_server_config.lng | 6
interface/web/admin/lib/lang/br_firewall_list.lng | 8
interface/web/admin/templates/server_config_web_edit.htm | 16
interface/web/client/templates/resellers_list.htm | 62
interface/web/mail/spamfilter_users_edit.php | 16
server/scripts/run-getmail.sh | 6
interface/web/mail/mail_user_edit.php | 57
interface/web/client/lib/lang/nl_client.lng | 6
server/plugins-available/mysql_clientdb_plugin.inc.php | 79
interface/web/admin/lib/lang/br_groups.lng | 6
interface/web/sites/cron_del.php | 64
interface/web/admin/templates/server_list.htm | 126
interface/web/mail/lib/lang/bg_mail_forward.lng | 1
interface/web/sites/lib/lang/de_ftp_user.lng | 1
interface/web/sites/lib/lang/br_cron_list.lng | 12
docs/INSTALL_DEBIAN_5.0.txt | 42
interface/web/admin/lib/lang/fi_server_config.lng | 6
interface/web/help/lib/lang/br_support_message.lng | 8
install/dist/conf/opensuse110.conf.php | 8
interface/web/mail/lib/lang/br_spamfilter_config.lng | 21
interface/web/sites/lib/lang/br_web_sites_stats_list.lng | 8
interface/web/client/lib/lang/es_client.lng | 6
interface/web/dns/lib/lang/nl_dns_aaaa.lng | 15
interface/web/dns/lib/lang/it_dns_wizard.lng | 12
interface/web/mail/lib/lang/br_mail_domain.lng | 14
interface/web/mail/lib/lang/it_mail_user_filter_list.lng | 1
interface/web/admin/lib/lang/br_language_complete.lng | 8
interface/web/client/lib/lang/se_client_template.lng | 5
interface/web/client/lib/lang/bg_client.lng | 6
interface/web/client/lib/lang/se_client.lng | 6
interface/web/admin/lib/lang/en_firewall.lng | 3
interface/web/mail/lib/lang/br_spamfilter_blacklist_list.lng | 9
interface/web/sites/form/database.tform.php | 12
interface/web/dns/dns_soa_edit.php | 42
interface/web/dns/lib/lang/fr_dns_wizard.lng | 12
interface/web/sites/lib/lang/se_cron.lng | 21
interface/web/sites/lib/lang/fi_ftp_user.lng | 1
interface/web/dns/lib/lang/br_dns_mx.lng | 16
interface/web/sites/lib/lang/es_web_sites_stats_list.lng | 8
install/install.php | 12
interface/web/dns/lib/lang/br_dns_soa.lng | 24
interface/web/admin/lib/lang/br_server.lng | 12
interface/web/sites/lib/lang/br_ftp_user.lng | 27
interface/web/sites/lib/lang/bg_cron_list.lng | 12
interface/web/designer/lib/lang/br_module_list.lng | 5
interface/web/dns/lib/lang/nl_dns_wizard.lng | 12
interface/web/client/lib/lang/en_resellers_list.lng | 9
interface/web/client/lib/lang/en_client.lng | 5
interface/web/mail/lib/lang/fr_mail_alias.lng | 1
interface/web/admin/lib/lang/br_language_edit.lng | 9
install/sql/ispconfig3.sql | 50
interface/lib/classes/tform_actions.inc.php | 8
interface/web/mail/lib/lang/se_mail_user.lng | 1
interface/web/dns/dns_wizard.php | 35
interface/web/sites/lib/lang/br_database_list.lng | 8
interface/web/mail/lib/lang/es_mail_alias.lng | 1
interface/web/sites/lib/lang/en_shell_user.lng | 1
interface/web/mail/lib/lang/br_mail_blacklist.lng | 9
interface/web/sites/lib/lang/br_shell_user.lng | 23
interface/web/mail/lib/lang/br_mail_domain_list.lng | 7
interface/web/dns/lib/lang/br_dns_template.lng | 6
interface/web/mail/lib/lang/ru_spamfilter_whitelist.lng | 1
interface/web/sites/lib/lang/bg_database.lng | 2
interface/web/client/lib/lang/bg_client_template.lng | 5
interface/web/mail/lib/lang/br_mail_blacklist_list.lng | 10
interface/web/mail/mail_transport_edit.php | 16
interface/web/dns/lib/lang/ru_dns_wizard.lng | 12
interface/web/sites/lib/lang/de_cron_list.lng | 12
interface/lib/classes/validate_ftpuser.inc.php | 89
interface/web/mail/lib/lang/ru_mail_forward.lng | 1
interface/web/dns/templates/dns_srv_edit.htm | 76
interface/web/dns/templates/dns_mx_edit.htm | 84
interface/web/client/lib/lang/en_reseller.lng | 93
interface/web/mail/lib/lang/br.lng | 49
interface/web/admin/form/server_config.tform.php | 110
interface/web/dns/lib/lang/it_dns_aaaa.lng | 15
interface/web/sites/shell_user_edit.php | 21
interface/web/mail/lib/lang/br_spamfilter_whitelist.lng | 8
interface/web/sites/lib/lang/se_cron_list.lng | 12
interface/web/sites/form/shell_user.tform.php | 8
server/cron_daily.php | 4
interface/web/admin/lib/lang/fr_server_config.lng | 6
interface/web/mail/lib/lang/fr_spamfilter_blacklist.lng | 1
interface/web/mail/lib/lang/br_mail_transport.lng | 10
interface/web/admin/templates/server_config_cron_edit.htm | 30
interface/web/mail/lib/lang/br_mail_transport_list.lng | 9
interface/web/dns/lib/lang/ru_dns_a.lng | 1
interface/web/mail/spamfilter_whitelist_edit.php | 16
interface/web/dns/lib/lang/br_dns_a.lng | 15
interface/web/dns/lib/lang/bg_dns_aaaa.lng | 15
interface/lib/lang/br.lng | 25
interface/web/admin/lib/lang/br_groups_list.lng | 7
interface/web/client/form/client_template.tform.php | 36
interface/web/sites/web_domain_del.php | 6
interface/web/mail/lib/lang/br_spamfilter_users_list.lng | 10
interface/web/dns/lib/module.conf.php | 39
interface/web/dns/list/dns_soa.list.php | 7
server/plugins-available/pma_symlink_plugin.inc.php | 121
server/mods-available/monitor_core_module.inc.php | 2
interface/web/sites/lib/lang/es_ftp_user.lng | 1
interface/web/client/list/reseller.list.php | 87
interface/lib/classes/validate_reseller.inc.php | 47
interface/web/sites/lib/lang/de_database.lng | 2
interface/web/dns/lib/lang/br_dns_alias.lng | 15
interface/web/dns/lib/lang/br_dns_rp.lng | 15
interface/web/dns/lib/lang/br_dns_template_list.lng | 6
interface/web/sites/lib/lang/fr_cron_list.lng | 12
interface/web/client/reseller_del.php | 81
server/scripts/vlogger | 564 ++
interface/web/client/lib/lang/fi_client.lng | 6
interface/web/mail/lib/lang/br_mail_user_filter_list.lng | 6
server/scripts/update_from_tgz.sh | 17
interface/web/dns/templates/dns_wizard.htm | 8
interface/web/mail/lib/lang/fi_spamfilter_whitelist.lng | 1
interface/web/strengthmeter/lib/lang/br_strengthmeter.lng | 9
server/plugins-available/ftpuser_base_plugin.inc.php | 112
interface/web/sites/lib/lang/en_cron_list.lng | 12
interface/web/sites/lib/lang/es_cron_list.lng | 12
interface/web/mail/lib/lang/br_mail_forward.lng | 6
docs/INSTALL_UBUNTU_8.04.txt | 17
interface/web/mail/lib/lang/se_spamfilter_whitelist.lng | 1
interface/web/mail/lib/lang/en_mail_forward.lng | 1
interface/web/mail/lib/lang/br_mail_user_filter.lng | 9
interface/web/designer/lib/lang/br_module_show.lng | 17
interface/web/sites/lib/lang/fi_cron.lng | 21
interface/web/dns/lib/lang/en_dns_a.lng | 1
interface/web/mail/lib/lang/de_spamfilter_whitelist.lng | 1
interface/web/designer/lib/lang/br_form_edit.lng | 26
interface/web/sites/lib/lang/en_web_sites_stats_list.lng | 8
interface/web/client/client_list.php | 1
interface/web/mail/mail_whitelist_edit.php | 16
interface/web/monitor/lib/lang/br.lng | 138
server/plugins-available/mail_plugin.inc.php | 49
interface/web/admin/lib/lang/br_software_update_list.lng | 9
interface/web/sites/lib/lang/br_web_subdomain_list.lng | 8
interface/web/mail/lib/lang/fi_mail_user.lng | 1
server/conf/apache_ispconfig.conf.master | 2
interface/lib/classes/tform.inc.php | 84
interface/web/sites/lib/lang/br_web_aliasdomain_list.lng | 11
interface/web/client/lib/lang/en.lng | 3
interface/web/sites/list/cron.list.php | 152
interface/web/mail/lib/lang/it_mail_alias.lng | 1
interface/web/admin/templates/users_list.htm | 120
interface/web/mail/lib/lang/nl_mail_user.lng | 1
interface/web/dns/lib/lang/br_dns_soa_list.lng | 9
interface/web/admin/lib/lang/br_language_export.lng | 7
interface/web/admin/lib/lang/bg_server_config.lng | 6
install/tpl/config.inc.php.master | 2
interface/web/sites/templates/web_sites_stats_list.htm | 52
interface/web/mail/lib/lang/br_mail_user.lng | 31
interface/web/sites/lib/module.conf.php | 36
install/update.php | 11
interface/web/mail/lib/lang/nl_spamfilter_whitelist.lng | 1
interface/web/mail/lib/lang/br_spamfilter_policy.lng | 38
interface/web/mail/lib/lang/es_spamfilter_whitelist.lng | 1
interface/web/client/lib/lang/es_client_template.lng | 5
interface/web/admin/lib/lang/br_server_list.lng | 12
interface/web/dns/lib/lang/br_dns_a_list.lng | 14
interface/web/dns/lib/lang/br_dns_srv.lng | 15
interface/web/mail/lib/lang/it_mail_user.lng | 1
interface/web/sites/ftp_user_edit.php | 35
interface/web/client/lib/lang/br.lng | 10
interface/web/sites/web_subdomain_edit.php | 16
interface/web/sites/lib/lang/ru_ftp_user.lng | 1
interface/web/sites/web_sites_stats.php | 64
interface/web/sites/lib/lang/br.lng | 17
interface/web/tools/lib/lang/br_usersettings.lng | 9
interface/web/dns/lib/lang/br_dns_cname.lng | 15
interface/web/sites/lib/lang/de_cron.lng | 21
server/conf/php-fcgi-starter.master | 6
install/tpl/server.ini.master | 12
interface/web/mail/lib/lang/bg_mail_alias.lng | 1
interface/web/sites/lib/lang/fr_ftp_user.lng | 1
interface/web/mail/lib/lang/de_mail_forward.lng | 1
interface/web/designer/lib/lang/br_module_edit.lng | 23
interface/web/sites/lib/lang/nl_ftp_user.lng | 1
interface/web/designer/lib/lang/br.lng | 3
interface/web/client/lib/lang/fi_client_template.lng | 5
interface/web/mail/lib/lang/br_mail_spamfilter.lng | 17
interface/web/sites/lib/lang/en_database.lng | 2
interface/web/client/reseller_edit.php | 214
interface/web/sites/lib/lang/en_cron.lng | 21
interface/web/tools/lib/lang/br.lng | 7
interface/lib/classes/validate_client.inc.php | 2
interface/web/dns/templates/dns_rp_edit.htm | 76
install/tpl/vlogger-dbi.conf.master | 4
interface/web/mail/lib/lang/bg_spamfilter_blacklist.lng | 1
interface/web/mail/lib/lang/br_spamfilter_policy_list.lng | 9
interface/web/dns/lib/lang/bg_dns_wizard.lng | 12
/dev/null | 2
interface/web/sites/cron_list.php | 23
422 files changed, 10,558 insertions(+), 2,330 deletions(-)
diff --git a/docs/INSTALL_DEBIAN_4.0.txt b/docs/INSTALL_DEBIAN_4.0.txt
index 7ac2dc5..935f197 100644
--- a/docs/INSTALL_DEBIAN_4.0.txt
+++ b/docs/INSTALL_DEBIAN_4.0.txt
@@ -124,15 +124,15 @@
7) Install Jailkit (optional, only needed if you want to use chrroting for SSH users)
-apt-get install build-essential autoconf automake1.9 libtool flex bison
+apt-get install build-essential autoconf automake1.9 libtool flex bison debhelper
cd /tmp
-wget http://olivier.sessink.nl/jailkit/jailkit-2.5.tar.gz
-tar xvfz jailkit-2.5.tar.gz
-cd jailkit-2.5
-./configure
-make
-make install
-rm -rf jailkit-2.5*
+wget http://olivier.sessink.nl/jailkit/jailkit-2.7.tar.gz
+tar xvfz jailkit-2.7.tar.gz
+cd jailkit-2.7
+./debian/rules binary
+cd ..
+dpkg -i jailkit_2.7-1_i386.deb
+rm -rf jailkit-2.7*
8) Install fail2ban (optional but recomended, because the monitor tries to show the log)
More info at: http://www.howtoforge.com/fail2ban_debian_etch
diff --git a/docs/INSTALL_DEBIAN_5.0.txt b/docs/INSTALL_DEBIAN_5.0.txt
index 137493e..dad7e2b 100644
--- a/docs/INSTALL_DEBIAN_5.0.txt
+++ b/docs/INSTALL_DEBIAN_5.0.txt
@@ -82,33 +82,6 @@
a2enmod suexec rewrite ssl actions include
-# Secure phpMyAdmin by deleting setuppassword-file
-# and removing/commenting Setup Authorization from apache.conf
-
-rm /etc/phpmyadmin/htpasswd.setup
-
-vi /etc/phpmyadmin/apache.conf
-
-# delete/comment following lines (between the ----- lines):
-------------------------------------------------------
- # Authorize for setup
- <Files setup.php>
- # For Apache 1.3 and 2.0
- <IfModule mod_auth.c>
- AuthType Basic
- AuthName "phpMyAdmin Setup"
- AuthUserFile /etc/phpmyadmin/htpasswd.setup
- </IfModule>
- # For Apache 2.2
- <IfModule mod_authn_file.c>
- AuthType Basic
- AuthName "phpMyAdmin Setup"
- AuthUserFile /etc/phpmyadmin/htpasswd.setup
- </IfModule>
- Require valid-user
- </Files>
-------------------------------------------------------
-
# restart apache before continuing
/etc/init.d/apache2 restart
@@ -263,16 +236,15 @@
7) Install Jailkit (optional, only needed if you want to use chrroting for SSH users)
-apt-get install build-essential autoconf automake1.9 libtool flex bison
+apt-get install build-essential autoconf automake1.9 libtool flex bison debhelper
cd /tmp
-wget http://olivier.sessink.nl/jailkit/jailkit-2.5.tar.gz
-tar xvfz jailkit-2.5.tar.gz
-cd jailkit-2.5
-./configure
-make
-make install
+wget http://olivier.sessink.nl/jailkit/jailkit-2.7.tar.gz
+tar xvfz jailkit-2.7.tar.gz
+cd jailkit-2.7
+./debian/rules binary
cd ..
-rm -rf jailkit-2.5*
+dpkg -i jailkit_2.7-1_i386.deb
+rm -rf jailkit-2.7*
8) Install fail2ban (optional but recomended, because the monitor tries to show the log)
More info at: http://www.howtoforge.com/fail2ban_debian_etch
diff --git a/docs/INSTALL_UBUNTU_8.04.txt b/docs/INSTALL_UBUNTU_8.04.txt
index 4bedb14..c782ba2 100644
--- a/docs/INSTALL_UBUNTU_8.04.txt
+++ b/docs/INSTALL_UBUNTU_8.04.txt
@@ -115,7 +115,7 @@
set docroot to:
###
-docroot=/var/clients
+docroot=/var/www/clients
###
Change: application/x-httpd-php=php:/usr/bin/php-cgi to:
@@ -233,14 +233,15 @@
7.1) OPTIONAL: Installing Jailkit
*******************************************************************************
___
-apt-get install build-essential autoconf automake1.9 libtool flex bison
+apt-get install build-essential autoconf automake1.9 libtool flex bison debhelper
cd /tmp
-wget http://olivier.sessink.nl/jailkit/jailkit-2.5.tar.gz
-tar xvfz jailkit-2.5.tar.gz
-cd jailkit-2.5
-./configure
-make
-make install
+wget http://olivier.sessink.nl/jailkit/jailkit-2.7.tar.gz
+tar xvfz jailkit-2.7.tar.gz
+cd jailkit-2.7
+./debian/rules binary
+cd ..
+dpkg -i jailkit_2.7-1_i386.deb
+rm -rf jailkit-2.7*
___
diff --git a/install/dist/conf/centos52.conf.php b/install/dist/conf/centos52.conf.php
index 6f169fd..e1ee4be 100644
--- a/install/dist/conf/centos52.conf.php
+++ b/install/dist/conf/centos52.conf.php
@@ -147,6 +147,14 @@
$conf['jailkit']['jk_init'] = 'jk_init.ini';
$conf['jailkit']['jk_chrootsh'] = 'jk_chrootsh.ini';
$conf['jailkit']['jailkit_chroot_app_programs'] = '/usr/bin/groups /usr/bin/id /usr/bin/dircolors /bin/basename /usr/bin/dirname /usr/bin/nano';
+$conf['jailkit']['jailkit_chroot_cron_programs'] = '/usr/bin/php /usr/bin/perl /usr/share/perl /usr/share/php';
+//* vlogger
+$conf['vlogger']['config_dir'] = '/etc';
+
+//* cron
+$conf['cron']['init_script'] = 'crond';
+$conf['cron']['crontab_dir'] = '/etc/cron.d';
+$conf['cron']['wget'] = '/usr/bin/wget';
?>
\ No newline at end of file
diff --git a/install/dist/conf/centos53.conf.php b/install/dist/conf/centos53.conf.php
index d0f35f5..260eedb 100644
--- a/install/dist/conf/centos53.conf.php
+++ b/install/dist/conf/centos53.conf.php
@@ -147,6 +147,14 @@
$conf['jailkit']['jk_init'] = 'jk_init.ini';
$conf['jailkit']['jk_chrootsh'] = 'jk_chrootsh.ini';
$conf['jailkit']['jailkit_chroot_app_programs'] = '/usr/bin/groups /usr/bin/id /usr/bin/dircolors /bin/basename /usr/bin/dirname /usr/bin/nano';
+$conf['jailkit']['jailkit_chroot_cron_programs'] = '/usr/bin/php /usr/bin/perl /usr/share/perl /usr/share/php';
+//* vlogger
+$conf['vlogger']['config_dir'] = '/etc';
+
+//* cron
+$conf['cron']['init_script'] = 'crond';
+$conf['cron']['crontab_dir'] = '/etc/cron.d';
+$conf['cron']['wget'] = '/usr/bin/wget';
?>
\ No newline at end of file
diff --git a/install/dist/conf/debian40.conf.php b/install/dist/conf/debian40.conf.php
index 0d58421..6d10711 100644
--- a/install/dist/conf/debian40.conf.php
+++ b/install/dist/conf/debian40.conf.php
@@ -147,6 +147,14 @@
$conf['jailkit']['jk_init'] = 'jk_init.ini';
$conf['jailkit']['jk_chrootsh'] = 'jk_chrootsh.ini';
$conf['jailkit']['jailkit_chroot_app_programs'] = '/usr/bin/groups /usr/bin/id /usr/bin/dircolors /usr/bin/lesspipe /usr/bin/basename /usr/bin/dirname /usr/bin/nano /usr/bin/pico';
+$conf['jailkit']['jailkit_chroot_cron_programs'] = '/usr/bin/php /usr/bin/perl /usr/share/perl /usr/share/php';
+//* vlogger
+$conf['vlogger']['config_dir'] = '/etc';
+
+//* cron
+$conf['cron']['init_script'] = 'cron';
+$conf['cron']['crontab_dir'] = '/etc/cron.d';
+$conf['cron']['wget'] = '/usr/bin/wget';
?>
\ No newline at end of file
diff --git a/install/dist/conf/fedora9.conf.php b/install/dist/conf/fedora9.conf.php
index 8a69fc4..c49f133 100644
--- a/install/dist/conf/fedora9.conf.php
+++ b/install/dist/conf/fedora9.conf.php
@@ -147,6 +147,14 @@
$conf['jailkit']['jk_init'] = 'jk_init.ini';
$conf['jailkit']['jk_chrootsh'] = 'jk_chrootsh.ini';
$conf['jailkit']['jailkit_chroot_app_programs'] = '/usr/bin/groups /usr/bin/id /usr/bin/dircolors /bin/basename /usr/bin/dirname /usr/bin/nano';
+$conf['jailkit']['jailkit_chroot_cron_programs'] = '/usr/bin/php /usr/bin/perl /usr/share/perl /usr/share/php';
+//* vlogger
+$conf['vlogger']['config_dir'] = '/etc';
+
+//* cron
+$conf['cron']['init_script'] = 'crond';
+$conf['cron']['crontab_dir'] = '/etc/cron.d';
+$conf['cron']['wget'] = '/usr/bin/wget';
?>
\ No newline at end of file
diff --git a/install/dist/conf/gentoo.conf.php b/install/dist/conf/gentoo.conf.php
index ff7b626..9003aeb 100644
--- a/install/dist/conf/gentoo.conf.php
+++ b/install/dist/conf/gentoo.conf.php
@@ -96,6 +96,14 @@
$conf['jailkit']['jk_init'] = 'jk_init.ini';
$conf['jailkit']['jk_chrootsh'] = 'jk_chrootsh.ini';
$conf['jailkit']['jailkit_chroot_app_programs'] = '/usr/bin/groups /usr/bin/id /usr/bin/dircolors /usr/bin/lesspipe /usr/bin/basename /usr/bin/dirname /usr/bin/nano /usr/bin/pico';
+$conf['jailkit']['jailkit_chroot_cron_programs'] = '/usr/bin/php /usr/bin/perl /usr/share/perl /usr/share/php';
+//* vlogger
+$conf['vlogger']['config_dir'] = '/etc';
+
+//* cron
+$conf['cron']['init_script'] = 'cron';
+$conf['cron']['crontab_dir'] = '/etc/cron.d';
+$conf['cron']['wget'] = '/usr/bin/wget';
?>
\ No newline at end of file
diff --git a/install/dist/conf/opensuse110.conf.php b/install/dist/conf/opensuse110.conf.php
index e4991fe..58b9d38 100644
--- a/install/dist/conf/opensuse110.conf.php
+++ b/install/dist/conf/opensuse110.conf.php
@@ -147,6 +147,14 @@
$conf['jailkit']['jk_init'] = 'jk_init.ini';
$conf['jailkit']['jk_chrootsh'] = 'jk_chrootsh.ini';
$conf['jailkit']['jailkit_chroot_app_programs'] = '/usr/bin/groups /usr/bin/id /usr/bin/dircolors /usr/bin/basename /usr/bin/dirname /usr/bin/nano /usr/bin/pico';
+$conf['jailkit']['jailkit_chroot_cron_programs'] = '/usr/bin/php /usr/bin/perl /usr/share/perl /usr/share/php';
+//* vlogger
+$conf['vlogger']['config_dir'] = '/etc';
+
+//* cron
+$conf['cron']['init_script'] = 'cron';
+$conf['cron']['crontab_dir'] = '/etc/cron.d';
+$conf['cron']['wget'] = '/usr/bin/wget';
?>
\ No newline at end of file
diff --git a/install/dist/lib/fedora.lib.php b/install/dist/lib/fedora.lib.php
index bc6f25e..1e59f87 100644
--- a/install/dist/lib/fedora.lib.php
+++ b/install/dist/lib/fedora.lib.php
@@ -409,6 +409,7 @@
if(is_file('/etc/suphp.conf')) {
//replaceLine('/etc/suphp.conf','php=php:/usr/bin','x-httpd-suphp=php:/usr/bin/php-cgi',0);
replaceLine('/etc/suphp.conf','docroot=','docroot=/var/www',0);
+ replaceLine('/etc/suphp.conf','umask=0077','umask=0022',0);
}
//* Create the logging directory for the vhost logfiles
@@ -444,6 +445,23 @@
exec("ln -s ".$vhost_conf_dir."/ispconfig.conf ".$vhost_conf_enabled_dir."/000-ispconfig.conf");
}
+ //* make sure that webalizer finds its config file when it is directly in /etc
+ if(@is_file('/etc/webalizer.conf') && !@is_dir('/etc/webalizer')) {
+ exec('mkdir /etc/webalizer');
+ exec('ln -s /etc/webalizer.conf /etc/webalizer/webalizer.conf');
+ }
+
+ if(is_file('/etc/webalizer/webalizer.conf')) {
+ // Change webalizer mode to incremental
+ replaceLine('/etc/webalizer/webalizer.conf','Incremental no','Incremental yes',0,0);
+ replaceLine('/etc/webalizer/webalizer.conf','IncrementalName webalizer.current','IncrementalName webalizer.current',0,0);
+ replaceLine('/etc/webalizer/webalizer.conf','HistoryName webalizer.hist','HistoryName webalizer.hist',0,0);
+ }
+
+ //* add a sshusers group
+ $command = 'groupadd sshusers';
+ if(!is_group('sshusers')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
+
}
public function configure_firewall()
diff --git a/install/dist/lib/opensuse.lib.php b/install/dist/lib/opensuse.lib.php
index b175e07..be5c8e0 100644
--- a/install/dist/lib/opensuse.lib.php
+++ b/install/dist/lib/opensuse.lib.php
@@ -432,6 +432,7 @@
//if(is_file('/etc/suphp.conf')) {
replaceLine('/etc/suphp.conf','php=php','x-httpd-suphp=php:/srv/www/cgi-bin/php5',0,0);
replaceLine('/etc/suphp.conf','docroot=','docroot=/srv/www',0,0);
+ replaceLine('/etc/suphp.conf','umask=0077','umask=0022',0);
//}
// Sites enabled and avaulable dirs
@@ -464,6 +465,23 @@
exec("ln -s ".$vhost_conf_dir."/ispconfig.conf ".$vhost_conf_enabled_dir."/000-ispconfig.conf");
}
+ //* make sure that webalizer finds its config file when it is directly in /etc
+ if(@is_file('/etc/webalizer.conf') && !@is_dir('/etc/webalizer')) {
+ exec('mkdir /etc/webalizer');
+ exec('ln -s /etc/webalizer.conf /etc/webalizer/webalizer.conf');
+ }
+
+ if(is_file('/etc/webalizer/webalizer.conf')) {
+ // Change webalizer mode to incremental
+ replaceLine('/etc/webalizer/webalizer.conf','Incremental no','Incremental yes',0,0);
+ replaceLine('/etc/webalizer/webalizer.conf','IncrementalName webalizer.current','IncrementalName webalizer.current',0,0);
+ replaceLine('/etc/webalizer/webalizer.conf','HistoryName webalizer.hist','HistoryName webalizer.hist',0,0);
+ }
+
+ //* add a sshusers group
+ $command = 'groupadd sshusers';
+ if(!is_group('sshusers')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
+
}
public function configure_firewall()
diff --git a/install/install.php b/install/install.php
index 9474eb5..4378fd7 100644
--- a/install/install.php
+++ b/install/install.php
@@ -53,6 +53,10 @@
//** Include the base class of the installer class
require_once('lib/installer_base.lib.php');
+//** Ensure that current working directory is install directory
+$cur_dir = getcwd();
+if(realpath(dirname(__FILE__)) != $cur_dir) die("Please run installation/update from _inside_ the install directory!\n");
+
//** Install logfile
define('ISPC_LOG_FILE', '/var/log/ispconfig_install.log');
define('ISPC_INSTALL_ROOT', realpath(dirname(__FILE__).'/../'));
@@ -191,6 +195,10 @@
swriteln('Configuring Apache');
$inst->configure_apache();
+ //** Configure vlogger
+ swriteln('Configuring vlogger');
+ $inst->configure_vlogger();
+
//* Configure Firewall
swriteln('Configuring Firewall');
$inst->configure_firewall();
@@ -355,6 +363,10 @@
$conf['services']['web'] = true;
swriteln('Configuring Apache');
$inst->configure_apache();
+
+ //** Configure vlogger
+ swriteln('Configuring vlogger');
+ $inst->configure_vlogger();
}
//** Configure Firewall
diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php
index ed3c043..4886536 100644
--- a/install/lib/installer_base.lib.php
+++ b/install/lib/installer_base.lib.php
@@ -210,7 +210,11 @@
$tpl_ini_array['web']['website_basedir'] = $conf['web']['website_basedir'];
$tpl_ini_array['web']['website_path'] = $conf['web']['website_path'];
$tpl_ini_array['web']['website_symlinks'] = $conf['web']['website_symlinks'];
-
+ $tpl_ini_array['cron']['crontab_dir'] = $conf['cron']['crontab_dir'];
+ $tpl_ini_array['web']['security_level'] = 20;
+ $tpl_ini_array['web']['user'] = $conf['apache']['user'];
+ $tpl_ini_array['web']['group'] = $conf['apache']['group'];
+
$server_ini_content = array_to_ini($tpl_ini_array);
$server_ini_content = mysql_real_escape_string($server_ini_content);
@@ -233,33 +237,10 @@
$sql = "INSERT INTO `server` (`server_id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_name`, `mail_server`, `web_server`, `dns_server`, `file_server`, `db_server`, `vserver_server`, `config`, `updated`, `active`) VALUES ('".$conf['server_id']."',1, 1, 'riud', 'riud', 'r', '".$conf['hostname']."', '$mail_server_enabled', '$web_server_enabled', '$dns_server_enabled', '$file_server_enabled', '$db_server_enabled', '$vserver_server_enabled', '$server_ini_content', 0, 1);";
$this->db->query($sql);
- //* insert the ispconfig user in the remote server
- $from_host = $conf['hostname'];
- $from_ip = gethostbyname($conf['hostname']);
-
//* username for the ispconfig user
$conf['mysql']['master_ispconfig_user'] = 'ispcsrv'.$conf['server_id'];
-
- //* Delete ISPConfig user in the master database, in case that it exists
- $this->dbmaster->query("DELETE FROM mysql.user WHERE User = '".$conf['mysql']['master_ispconfig_user']."' AND Host = '".$from_host."';");
- $this->dbmaster->query("DELETE FROM mysql.db WHERE Db = '".$conf['mysql']['master_database']."' AND Host = '".$from_host."';");
- $this->dbmaster->query("DELETE FROM mysql.user WHERE User = '".$conf['mysql']['master_ispconfig_user']."' AND Host = '".$from_ip."';");
- $this->dbmaster->query("DELETE FROM mysql.db WHERE Db = '".$conf['mysql']['master_database']."' AND Host = '".$from_ip."';");
- $this->dbmaster->query('FLUSH PRIVILEGES;');
-
- //* Create the ISPConfig database user in the remote database
- $query = 'GRANT SELECT, INSERT, UPDATE, DELETE ON '.$conf['mysql']['master_database'].".* "
- ."TO '".$conf['mysql']['master_ispconfig_user']."'@'".$from_host."' "
- ."IDENTIFIED BY '".$conf['mysql']['master_ispconfig_password']."';";
- if(!$this->dbmaster->query($query)) {
- $this->error('Unable to create database user in master database: '.$conf['mysql']['master_ispconfig_user'].' Error: '.$this->dbmaster->errorMessage);
- }
- $query = 'GRANT SELECT, INSERT, UPDATE, DELETE ON '.$conf['mysql']['master_database'].".* "
- ."TO '".$conf['mysql']['master_ispconfig_user']."'@'".$from_ip."' "
- ."IDENTIFIED BY '".$conf['mysql']['master_ispconfig_password']."';";
- if(!$this->dbmaster->query($query)) {
- $this->error('Unable to create database user in master database: '.$conf['mysql']['master_ispconfig_user'].' Error: '.$this->dbmaster->errorMessage);
- }
+
+ $this->grant_master_database_rights();
} else {
//* Insert the server, if its not a mster / slave setup
@@ -272,6 +253,93 @@
}
+ public function grant_master_database_rights()
+ {
+ global $conf;
+
+ if($conf['mysql']['master_slave_setup'] != 'y') return;
+
+ //* insert the ispconfig user in the remote server
+ $from_host = $conf['hostname'];
+ $from_ip = gethostbyname($conf['hostname']);
+
+ //* Delete ISPConfig user in the master database, in case that it exists
+ $this->dbmaster->query("DELETE FROM mysql.user WHERE User = '".$conf['mysql']['master_ispconfig_user']."' AND Host = '".$from_host."';");
+ $this->dbmaster->query("DELETE FROM mysql.db WHERE Db = '".$conf['mysql']['master_database']."' AND Host = '".$from_host."';");
+ $this->dbmaster->query("DELETE FROM mysql.user WHERE User = '".$conf['mysql']['master_ispconfig_user']."' AND Host = '".$from_ip."';");
+ $this->dbmaster->query("DELETE FROM mysql.db WHERE Db = '".$conf['mysql']['master_database']."' AND Host = '".$from_ip."';");
+ $this->dbmaster->query('FLUSH PRIVILEGES;');
+
+ $hosts = array($from_host, $from_ip);
+
+ foreach($hosts as $src_host) {
+ //* Create the ISPConfig database user in the remote database
+ $query = "GRANT SELECT ON ".$conf['mysql']['master_database'].".`server` "
+ ."TO '".$conf['mysql']['master_ispconfig_user']."'@'".$src_host."' "
+ ."IDENTIFIED BY '".$conf['mysql']['master_ispconfig_password']."';";
+ if(!$this->dbmaster->query($query)) {
+ $this->error('Unable to create database user in master database: '.$conf['mysql']['master_ispconfig_user'].' Error: '.$this->dbmaster->errorMessage);
+ }
+
+ $query = "GRANT SELECT, INSERT ON ".$conf['mysql']['master_database'].".`sys_log` "
+ ."TO '".$conf['mysql']['master_ispconfig_user']."'@'".$src_host."' "
+ ."IDENTIFIED BY '".$conf['mysql']['master_ispconfig_password']."';";
+ if(!$this->dbmaster->query($query)) {
+ $this->error('Unable to create database user in master database: '.$conf['mysql']['master_ispconfig_user'].' Error: '.$this->dbmaster->errorMessage);
+ }
+
+ $query = "GRANT SELECT, UPDATE(`status`) ON ".$conf['mysql']['master_database'].".`sys_datalog` "
+ ."TO '".$conf['mysql']['master_ispconfig_user']."'@'".$src_host."' "
+ ."IDENTIFIED BY '".$conf['mysql']['master_ispconfig_password']."';";
+ if(!$this->dbmaster->query($query)) {
+ $this->error('Unable to create database user in master database: '.$conf['mysql']['master_ispconfig_user'].' Error: '.$this->dbmaster->errorMessage);
+ }
+
+ $query = "GRANT UPDATE(`status`) ON ".$conf['mysql']['master_database'].".`software_update_inst` "
+ ."TO '".$conf['mysql']['master_ispconfig_user']."'@'".$src_host."' "
+ ."IDENTIFIED BY '".$conf['mysql']['master_ispconfig_password']."';";
+ if(!$this->dbmaster->query($query)) {
+ $this->error('Unable to create database user in master database: '.$conf['mysql']['master_ispconfig_user'].' Error: '.$this->dbmaster->errorMessage);
+ }
+
+ $query = "GRANT UPDATE (`ssl_request`, `ssl_cert`, `ssl_action`) ON ".$conf['mysql']['master_database'].".`web_domain` "
+ ."TO '".$conf['mysql']['master_ispconfig_user']."'@'".$src_host."' "
+ ."IDENTIFIED BY '".$conf['mysql']['master_ispconfig_password']."';";
+ if(!$this->dbmaster->query($query)) {
+ $this->error('Unable to create database user in master database: '.$conf['mysql']['master_ispconfig_user'].' Error: '.$this->dbmaster->errorMessage);
+ }
+
+ $query = "GRANT SELECT ON ".$conf['mysql']['master_database'].".`sys_group` "
+ ."TO '".$conf['mysql']['master_ispconfig_user']."'@'".$src_host."' "
+ ."IDENTIFIED BY '".$conf['mysql']['master_ispconfig_password']."';";
+ if(!$this->dbmaster->query($query)) {
+ $this->error('Unable to create database user in master database: '.$conf['mysql']['master_ispconfig_user'].' Error: '.$this->dbmaster->errorMessage);
+ }
+
+ $query = "GRANT INSERT , DELETE ON ".$conf['mysql']['master_database'].".`monitor_data` "
+ ."TO '".$conf['mysql']['master_ispconfig_user']."'@'".$src_host."' "
+ ."IDENTIFIED BY '".$conf['mysql']['master_ispconfig_password']."';";
+ if(!$this->dbmaster->query($query)) {
+ $this->error('Unable to create database user in master database: '.$conf['mysql']['master_ispconfig_user'].' Error: '.$this->dbmaster->errorMessage);
+ }
+
+ $query = "GRANT SELECT, INSERT, UPDATE ON ".$conf['mysql']['master_database'].".`mail_traffic` "
+ ."TO '".$conf['mysql']['master_ispconfig_user']."'@'".$src_host."' "
+ ."IDENTIFIED BY '".$conf['mysql']['master_ispconfig_password']."';";
+ if(!$this->dbmaster->query($query)) {
+ $this->error('Unable to create database user in master database: '.$conf['mysql']['master_ispconfig_user'].' Error: '.$this->dbmaster->errorMessage);
+ }
+
+ $query = "GRANT SELECT, INSERT, UPDATE ON ".$conf['mysql']['master_database'].".`web_traffic` "
+ ."TO '".$conf['mysql']['master_ispconfig_user']."'@'".$src_host."' "
+ ."IDENTIFIED BY '".$conf['mysql']['master_ispconfig_password']."';";
+ if(!$this->dbmaster->query($query)) {
+ $this->error('Unable to create database user in master database: '.$conf['mysql']['master_ispconfig_user'].' Error: '.$this->dbmaster->errorMessage);
+ }
+
+ }
+
+ }
//** writes postfix configuration files
public function process_postfix_config($configfile)
@@ -710,6 +778,7 @@
if(is_file('/etc/suphp/suphp.conf')) {
replaceLine('/etc/suphp/suphp.conf','php=php:/usr/bin','x-httpd-suphp=php:/usr/bin/php-cgi',0);
//replaceLine('/etc/suphp/suphp.conf','docroot=','docroot=/var/clients',0);
+ replaceLine('/etc/suphp/suphp.conf','umask=0077','umask=0022',0);
}
if(is_file('/etc/apache2/sites-enabled/000-default')) {
@@ -743,6 +812,23 @@
if(!@is_link($vhost_conf_enabled_dir."/000-ispconfig.conf")) {
exec("ln -s ".$vhost_conf_dir."/ispconfig.conf ".$vhost_conf_enabled_dir."/000-ispconfig.conf");
}
+
+ //* make sure that webalizer finds its config file when it is directly in /etc
+ if(@is_file('/etc/webalizer.conf') && !@is_dir('/etc/webalizer')) {
+ exec('mkdir /etc/webalizer');
+ exec('ln -s /etc/webalizer.conf /etc/webalizer/webalizer.conf');
+ }
+
+ if(is_file('/etc/webalizer/webalizer.conf')) {
+ // Change webalizer mode to incremental
+ replaceLine('/etc/webalizer/webalizer.conf','Incremental no','Incremental yes',0,0);
+ replaceLine('/etc/webalizer/webalizer.conf','IncrementalName webalizer.current','IncrementalName webalizer.current',0,0);
+ replaceLine('/etc/webalizer/webalizer.conf','HistoryName webalizer.hist','HistoryName webalizer.hist',0,0);
+ }
+
+ //* add a sshusers group
+ $command = 'groupadd sshusers';
+ if(!is_group('sshusers')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
}
@@ -807,7 +893,32 @@
}
-
+ public function configure_vlogger()
+ {
+ global $conf;
+
+ //** Configure vlogger to use traffic logging to mysql (master) db
+ $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.'~')) exec('chmod 400 '.$conf["vlogger"]["config_dir"].'/'.$configfile.'~');
+ $content = rf("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);
+ $content = str_replace('{mysql_server_database}',$conf['mysql']['master_database'],$content);
+ $content = str_replace('{mysql_server_ip}',$conf["mysql"]["master_host"],$content);
+ } else {
+ $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);
+ $content = str_replace('{mysql_server_ip}',$conf["mysql"]["host"],$content);
+ }
+ wf($conf["vlogger"]["config_dir"].'/'.$configfile,$content);
+ exec('chmod 600 '.$conf["vlogger"]["config_dir"].'/'.$configfile);
+ exec('chown root:root '.$conf["vlogger"]["config_dir"].'/'.$configfile);
+
+ }
+
public function install_ispconfig()
{
global $conf;
diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql
index e6f9dc8..c74261b 100644
--- a/install/sql/ispconfig3.sql
+++ b/install/sql/ispconfig3.sql
@@ -92,6 +92,9 @@
`limit_dns_record` int(11) NOT NULL default '-1',
`default_dbserver` int(11) NOT NULL default '1',
`limit_database` int(11) NOT NULL default '-1',
+ `limit_cron` int(11) NOT NULL default '0',
+ `limit_cron_type` enum('url','chrooted','full') NOT NULL default 'url',
+ `limit_cron_frequency` int(11) NOT NULL default '5',
`limit_client` int(11) NOT NULL default '0',
`parent_client_id` int(11) unsigned NOT NULL default '0',
`username` varchar(64) default NULL,
@@ -140,9 +143,39 @@
`limit_dns_zone` int(11) NOT NULL default '-1',
`limit_dns_record` int(11) NOT NULL default '-1',
`limit_database` int(11) NOT NULL default '-1',
+ `limit_cron` int(11) NOT NULL default '0',
+ `limit_cron_type` enum('url','chrooted','full') NOT NULL default 'url',
+ `limit_cron_frequency` int(11) NOT NULL default '5',
`limit_client` int(11) NOT NULL default '0',
PRIMARY KEY (`template_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1;
+
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `dns_rr`
+--
+CREATE TABLE `cron` (
+ `id` int(11) unsigned NOT NULL auto_increment,
+ `sys_userid` int(11) unsigned NOT NULL default '0',
+ `sys_groupid` int(11) unsigned NOT NULL default '0',
+ `sys_perm_user` varchar(5) NULL default NULL,
+ `sys_perm_group` varchar(5) NULL default NULL,
+ `sys_perm_other` varchar(5) NULL default NULL,
+ `server_id` int(11) unsigned NOT NULL default '0',
+ `parent_domain_id` int(11) unsigned NOT NULL default '0',
+ `type` enum('url','chrooted','full') NOT NULL default 'url',
+ `command` varchar(255) NOT NULL,
+ `run_min` varchar(100) NULL,
+ `run_hour` varchar(100) NULL,
+ `run_mday` varchar(100) NULL,
+ `run_month` varchar(100) NULL,
+ `run_wday` varchar(100) NULL,
+ `active` enum('n','y') NOT NULL default 'y',
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=1;
+
-- --------------------------------------------------------
@@ -1010,9 +1043,24 @@
`database_password` varchar(64) default NULL,
`database_charset` varchar(64) default NULL,
`remote_access` enum('n','y') NOT NULL default 'y',
+ `remote_ips` text NOT NULL,
`active` enum('n','y') NOT NULL default 'y',
PRIMARY KEY (`database_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1;
+
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `web_traffic`
+--
+
+CREATE TABLE `web_traffic` (
+ `hostname` varchar(255) NOT NULL,
+ `traffic_date` date NOT NULL,
+ `traffic_bytes` bigint(32) unsigned NOT NULL default '0',
+ PRIMARY KEY (`hostname`,`traffic_date`)
+) ENGINE=MyISAM;
-- --------------------------------------------------------
@@ -1148,7 +1196,7 @@
-- Dumping data for table `sys_config`
--
-INSERT INTO sys_config VALUES ('1','db','db_version','3.0.1.3');
+INSERT INTO sys_config VALUES ('1','db','db_version','3.0.1.4');
-- --------------------------------------------------------
diff --git a/install/tpl/apache_ispconfig.conf.master b/install/tpl/apache_ispconfig.conf.master
index c6d044b..49d0d9b 100644
--- a/install/tpl/apache_ispconfig.conf.master
+++ b/install/tpl/apache_ispconfig.conf.master
@@ -5,7 +5,7 @@
################################################
LogFormat "%v %h %l %u %t \"%r\" %>s %B \"%{Referer}i\" \"%{User-Agent}i\"" combined_ispconfig
-CustomLog "| /usr/sbin/vlogger -s access.log -t \"%Y%m%d-access.log\" /var/log/ispconfig/httpd" combined_ispconfig
+CustomLog "| /usr/local/ispconfig/server/scripts/vlogger -s access.log -t \"%Y%m%d-access.log\" -d \"/etc/vlogger-dbi.conf\" /var/log/ispconfig/httpd" combined_ispconfig
<Directory /var/www/clients>
AllowOverride None
diff --git a/install/tpl/config.inc.php.master b/install/tpl/config.inc.php.master
index 9ba9799..f4d0b9c 100644
--- a/install/tpl/config.inc.php.master
+++ b/install/tpl/config.inc.php.master
@@ -57,7 +57,7 @@
//** Application
define('ISPC_APP_TITLE', 'ISPConfig');
-define('ISPC_APP_VERSION', '3.0.1.3');
+define('ISPC_APP_VERSION', '3.0.1.4');
//** Database
diff --git a/install/tpl/server.ini.master b/install/tpl/server.ini.master
index 463397e..68d7e8e 100644
--- a/install/tpl/server.ini.master
+++ b/install/tpl/server.ini.master
@@ -34,6 +34,9 @@
website_symlinks=/var/www/[website_domain]/:/var/www/clients/client[client_id]/[website_domain]/
vhost_conf_dir=/etc/apache2/sites-available
vhost_conf_enabled_dir=/etc/apache2/sites-enabled
+security_level=10
+user=www-data
+group=www-data
[fastcgi]
fastcgi_starter_path=/var/www/php-fcgi-scripts/[system_user]/
@@ -48,3 +51,12 @@
jailkit_chroot_home=/home/[username]
jailkit_chroot_app_sections=basicshell editors extendedshell netutils ssh sftp scp groups jk_lsh
jailkit_chroot_app_programs=/usr/bin/groups /usr/bin/id /usr/bin/dircolors /usr/bin/lesspipe /usr/bin/basename /usr/bin/dirname /usr/bin/nano /usr/bin/pico
+jailkit_chroot_cron_programs=/usr/bin/php /usr/bin/perl /usr/share/perl /usr/share/php
+
+[vlogger]
+config_dir=/etc
+
+[cron]
+init_script=cron
+crontab_dir=/etc/cron.d
+wget=/usr/bin/wget
diff --git a/install/tpl/vlogger-dbi.conf.master b/install/tpl/vlogger-dbi.conf.master
new file mode 100644
index 0000000..883bd6a
--- /dev/null
+++ b/install/tpl/vlogger-dbi.conf.master
@@ -0,0 +1,4 @@
+dsn DBI:mysql:database={mysql_server_database};host={mysql_server_ip}:3306
+user {mysql_server_ispconfig_user}
+pass {mysql_server_ispconfig_password}
+dump 30
\ No newline at end of file
diff --git a/install/update.php b/install/update.php
index b309509..83bca4d 100644
--- a/install/update.php
+++ b/install/update.php
@@ -53,6 +53,10 @@
//** Include the base class of the installer class
require_once('lib/installer_base.lib.php');
+//** Ensure that current working directory is install directory
+$cur_dir = getcwd();
+if(realpath(dirname(__FILE__)) != $cur_dir) die("Please run installation/update from _inside_ the install directory!\n");
+
//** Install logfile
define('ISPC_LOG_FILE', '/var/log/ispconfig_install.log');
define('ISPC_INSTALL_ROOT', realpath(dirname(__FILE__).'/../'));
@@ -155,6 +159,9 @@
//** Create the mysql database
$inst->configure_database();
+
+//** Update master database rights
+$inst->grant_master_database_rights();
//** empty all databases
$db_tables = $inst->db->getTables();
@@ -284,6 +291,10 @@
//** Configure Apache
swriteln('Configuring Apache');
$inst->configure_apache();
+
+ //** Configure vlogger
+ swriteln('Configuring vlogger');
+ $inst->configure_vlogger();
}
diff --git a/interface/lib/app.inc.php b/interface/lib/app.inc.php
index 6dcb171..e70922a 100644
--- a/interface/lib/app.inc.php
+++ b/interface/lib/app.inc.php
@@ -151,17 +151,14 @@
public function lng($text)
{
if($this->_language_inc != 1) {
- //* loading global and module Wordbook
- // TODO: this need to be made clearer somehow - pedro
- //@include_once(ISPC_ROOT_PATH.'/lib/lang/'.$_SESSION['s']['language'].'.lng');
+ //* loading global Wordbook
$this->load_language_file('/lib/lang/'.$_SESSION['s']['language'].'.lng');
+ //* Load module wordbook, if it exists
if(isset($_SESSION['s']['module']['name']) && isset($_SESSION['s']['language'])) {
$lng_file = '/web/'.$_SESSION['s']['module']['name'].'/lib/lang/'.$_SESSION['s']['language'].'.lng';
- if(!file_exists($lng_file)) $lng_file = '/web/'.$_SESSION['s']['module']['name'].'/lib/lang/en.lng';
- //@include_once($lng_file);
+ if(!file_exists(ISPC_ROOT_PATH.$lng_file)) $lng_file = '/web/'.$_SESSION['s']['module']['name'].'/lib/lang/en.lng';
$this->load_language_file($lng_file);
}
- //if(isset($wb)) $this->_wb = $wb;
$this->_language_inc = 1;
}
if(!empty($this->_wb[$text])) {
@@ -189,7 +186,11 @@
public function tpl_defaults()
{
$this->tpl->setVar('app_title', $this->_conf['app_title']);
- $this->tpl->setVar('app_version', $this->_conf['app_version']);
+ if(isset($_SESSION['s']['user'])) {
+ $this->tpl->setVar('app_version', $this->_conf['app_version']);
+ } else {
+ $this->tpl->setVar('app_version', '');
+ }
$this->tpl->setVar('app_link', $this->_conf['app_link']);
if(isset($this->_conf['app_logo']) && $this->_conf['app_logo'] != '' && @is_file($this->_conf['app_logo'])){
$this->tpl->setVar('app_logo', '<img src="'.$this->_conf['app_logo'].'">');
diff --git a/interface/lib/classes/custom_datasource.inc.php b/interface/lib/classes/custom_datasource.inc.php
index 298e997..52cd8b7 100644
--- a/interface/lib/classes/custom_datasource.inc.php
+++ b/interface/lib/classes/custom_datasource.inc.php
@@ -40,6 +40,56 @@
}
return $records_new;
}
+
+ function dns_servers($field, $record) {
+ global $app, $conf;
+
+ if($_SESSION["s"]["user"]["typ"] == 'user') {
+ // Get the limits of the client
+ $client_group_id = $_SESSION["s"]["user"]["default_group"];
+ $client = $app->db->queryOneRecord("SELECT default_dnsserver FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
+ $sql = "SELECT server_id,server_name FROM server WHERE server_id = ".$client['default_dnsserver'];
+ } else {
+ $sql = "SELECT server_id,server_name FROM server WHERE dns_server = 1 ORDER BY server_name";
+ }
+ $records = $app->db->queryAllRecords($sql);
+ $records_new = array();
+ if(is_array($records)) {
+ foreach($records as $rec) {
+ $key = $rec['server_id'];
+ $records_new[$key] = $rec['server_name'];
+ }
+ }
+ return $records_new;
+ }
+
+
+ function client_servers($field, $record) {
+ global $app, $conf;
+
+ $server_type = $field['name'];
+
+ if($_SESSION["s"]["user"]["typ"] == 'user') {
+ // Get the limits of the client
+ $client_group_id = $_SESSION["s"]["user"]["default_group"];
+ $sql = "SELECT $server_type as server_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id";
+ $client = $app->db->queryOneRecord($sql);
+ $sql = "SELECT server_id,server_name FROM server WHERE server_id = ".$client['server_id'];
+ } else {
+ $sql = "SELECT server_id,server_name FROM server WHERE dns_server = 1 ORDER BY server_name";
+ }
+ $records = $app->db->queryAllRecords($sql);
+ $records_new = array();
+ if(is_array($records)) {
+ foreach($records as $rec) {
+ $key = $rec['server_id'];
+ $records_new[$key] = $rec['server_name'];
+ }
+ }
+ return $records_new;
+ }
+
+
}
diff --git a/interface/lib/classes/tform.inc.php b/interface/lib/classes/tform.inc.php
index 33103a0..b7b378d 100644
--- a/interface/lib/classes/tform.inc.php
+++ b/interface/lib/classes/tform.inc.php
@@ -276,6 +276,33 @@
}
}
+ //* values are limited to a field in the reseller settings
+ if($limit_parts[0] == 'reseller') {
+ if($_SESSION["s"]["user"]["typ"] == 'admin') {
+ return $values;
+ } else {
+ //* Get the limits of the client that is currently logged in
+ $client_group_id = $_SESSION["s"]["user"]["default_group"];
+ $client = $app->db->queryOneRecord("SELECT parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
+ //echo "SELECT parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id";
+ //* If the client belongs to a reseller, we will check against the reseller Limit too
+ if($client['parent_client_id'] != 0) {
+
+ //* first we need to know the groups of this reseller
+ $tmp = $app->db->queryOneRecord("SELECT userid, groups FROM sys_user WHERE client_id = ".$client['parent_client_id']);
+ $reseller_groups = $tmp["groups"];
+ $reseller_userid = $tmp["userid"];
+
+ // Get the limits of the reseller of the logged in client
+ $client_group_id = $_SESSION["s"]["user"]["default_group"];
+ $reseller = $app->db->queryOneRecord("SELECT ".$limit_parts[1]." as lm FROM client WHERE client_id = ".$client['parent_client_id']);
+ $allowed = explode(',',$reseller['lm']);
+ } else {
+ return $values;
+ }
+ } // end if admin
+ } // end if reseller
+
//* values are limited to a field in the system settings
if($limit_parts[0] == 'system') {
$app->uses('getconf');
@@ -1148,6 +1175,63 @@
}
}
+
+ function checkClientLimit($limit_name,$sql_where = '') {
+ global $app;
+
+ $check_passed = true;
+ $limit_name = $app->db->quote($limit_name);
+ if($limit_name == '') $app->error('Limit name missing in function checkClientLimit.');
+
+ // Get the limits of the client that is currently logged in
+ $client_group_id = $_SESSION["s"]["user"]["default_group"];
+ $client = $app->db->queryOneRecord("SELECT $limit_name as number, parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
+
+ // Check if the user may add another item
+ if($client["number"] >= 0) {
+ $sql = "SELECT count(".$this->formDef['db_table_idx'].") as number FROM ".$this->formDef['db_table']." WHERE ".$this->getAuthSQL('u');
+ if($sql_where != '') $sql .= ' and '.$sql_where;
+ $tmp = $app->db->queryOneRecord($sql);
+ if($tmp["number"] >= $client["number"]) $check_passed = false;
+ }
+
+ return $check_passed;
+ }
+
+ function checkResellerLimit($limit_name,$sql_where = '') {
+ global $app;
+
+ $check_passed = true;
+ $limit_name = $app->db->quote($limit_name);
+ if($limit_name == '') $app->error('Limit name missing in function checkClientLimit.');
+
+ // Get the limits of the client that is currently logged in
+ $client_group_id = $_SESSION["s"]["user"]["default_group"];
+ $client = $app->db->queryOneRecord("SELECT parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
+
+ //* If the client belongs to a reseller, we will check against the reseller Limit too
+ if($client['parent_client_id'] != 0) {
+
+ //* first we need to know the groups of this reseller
+ $tmp = $app->db->queryOneRecord("SELECT userid, groups FROM sys_user WHERE client_id = ".$client['parent_client_id']);
+ $reseller_groups = $tmp["groups"];
+ $reseller_userid = $tmp["userid"];
+
+ // Get the limits of the reseller of the logged in client
+ $client_group_id = $_SESSION["s"]["user"]["default_group"];
+ $reseller = $app->db->queryOneRecord("SELECT $limit_name as number FROM client WHERE client_id = ".$client['parent_client_id']);
+
+ // Check if the user may add another item
+ if($reseller["number"] >= 0) {
+ $sql = "SELECT count(".$this->formDef['db_table_idx'].") as number FROM ".$this->formDef['db_table']." WHERE (sys_groupid IN (".$reseller_groups.") or sys_userid = ".$reseller_userid.")";
+ if($sql_where != '') $sql .= ' and '.$sql_where;
+ $tmp = $app->db->queryOneRecord($sql);
+ if($tmp["number"] >= $reseller["number"]) $check_passed = false;
+ }
+ }
+
+ return $check_passed;
+ }
}
diff --git a/interface/lib/classes/tform_actions.inc.php b/interface/lib/classes/tform_actions.inc.php
index b280d26..0593c03 100644
--- a/interface/lib/classes/tform_actions.inc.php
+++ b/interface/lib/classes/tform_actions.inc.php
@@ -359,7 +359,7 @@
if($app->tform->formDef['auth'] == 'no') {
$sql = "SELECT * FROM ".$app->tform->formDef['db_table']." WHERE ".$app->tform->formDef['db_table_idx']." = ".$this->id;
} else {
- $sql = "SELECT * FROM ".$app->tform->formDef['db_table']." WHERE ".$app->tform->formDef['db_table_idx']." = ".$this->id." AND ".$app->tform->getAuthSQL('u');
+ $sql = "SELECT * FROM ".$app->tform->formDef['db_table']." WHERE ".$app->tform->formDef['db_table_idx']." = ".$this->id." AND ".$app->tform->getAuthSQL('r');
}
if(!$record = $app->db->queryOneRecord($sql)) $app->error($app->lng('error_no_view_permission'));
@@ -400,7 +400,7 @@
if($app->tform->formDef['auth'] == 'no') {
$sql = "SELECT * FROM ".$app->tform->formDef['db_table']." WHERE ".$app->tform->formDef['db_table_idx']." = ".$this->id;
} else {
- $sql = "SELECT * FROM ".$app->tform->formDef['db_table']." WHERE ".$app->tform->formDef['db_table_idx']." = ".$this->id." AND ".$app->tform->getAuthSQL('u');
+ $sql = "SELECT * FROM ".$app->tform->formDef['db_table']." WHERE ".$app->tform->formDef['db_table_idx']." = ".$this->id." AND ".$app->tform->getAuthSQL('r');
}
if(!$record = $app->db->queryOneRecord($sql)) $app->error($app->lng('error_no_view_permission'));
@@ -436,7 +436,7 @@
if($app->tform->formDef['auth'] == 'no') {
$sql = "SELECT * FROM ".$app->tform->formDef['db_table']." WHERE ".$app->tform->formDef['db_table_idx']." = ".$this->id;
} else {
- $sql = "SELECT * FROM ".$app->tform->formDef['db_table']." WHERE ".$app->tform->formDef['db_table_idx']." = ".$this->id." AND ".$app->tform->getAuthSQL('u');
+ $sql = "SELECT * FROM ".$app->tform->formDef['db_table']." WHERE ".$app->tform->formDef['db_table_idx']." = ".$this->id." AND ".$app->tform->getAuthSQL('r');
}
if(!$record = $app->db->queryOneRecord($sql)) $app->error($app->lng('error_no_view_permission'));
@@ -527,7 +527,7 @@
// bestehenden Datensatz anzeigen
if($app->tform->errorMessage == '') {
if($app->tform->formDef['auth'] == 'yes' && $_SESSION["s"]["user"]["typ"] != 'admin') {
- $sql = "SELECT * FROM ".$app->tform->formDef['db_table']." WHERE ".$app->tform->formDef['db_table_idx']." = ".$this->id." AND ".$app->tform->getAuthSQL('u');
+ $sql = "SELECT * FROM ".$app->tform->formDef['db_table']." WHERE ".$app->tform->formDef['db_table_idx']." = ".$this->id." AND ".$app->tform->getAuthSQL('r');
} else {
$sql = "SELECT * FROM ".$app->tform->formDef['db_table']." WHERE ".$app->tform->formDef['db_table_idx']." = ".$this->id;
}
diff --git a/interface/lib/classes/validate_client.inc.php b/interface/lib/classes/validate_client.inc.php
index f721298..1124d72 100644
--- a/interface/lib/classes/validate_client.inc.php
+++ b/interface/lib/classes/validate_client.inc.php
@@ -40,7 +40,7 @@
$num_rec = $app->db->queryOneRecord("SELECT count(*) as number FROM sys_user WHERE username = '".$app->db->quote($field_value)."'");
if($num_rec["number"] > 0) {
$errmsg = $validator['errmsg'];
- if(isset($this->wordbook[$errmsg])) {
+ if(isset($app->tform->wordbook[$errmsg])) {
return $app->tform->wordbook[$errmsg]."<br>\r\n";
} else {
return $errmsg."<br>\r\n";
diff --git a/interface/lib/classes/validate_cron.inc.php b/interface/lib/classes/validate_cron.inc.php
new file mode 100644
index 0000000..42d9eb6
--- /dev/null
+++ b/interface/lib/classes/validate_cron.inc.php
@@ -0,0 +1,191 @@
+<?php
+
+/*
+Copyright (c) 2007, Till Brehm, projektfarm Gmbh
+Modified 2009, Marius Cramer, pixcept KG
+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.
+*/
+
+class validate_cron {
+
+ function get_error($errmsg) {
+ global $app;
+
+ if(isset($app->tform->wordbook[$errmsg])) {
+ return $app->tform->wordbook[$errmsg]."<br>\r\n";
+ } else {
+ return $errmsg."<br>\r\n";
+ }
+ }
+
+ /*
+ Validator function to check if a given cron command is in correct form (url only).
+ */
+ function command_format($field_name, $field_value, $validator) {
+ if(preg_match("'^(\w+):\/\/'", $field_value, $matches)) {
+
+ $parsed = parse_url($field_value);
+ if($parsed === false) return $this->get_error($validator['errmsg']);
+
+ if($parsed["scheme"] != "http" && $parsed["scheme"] != "https") return $this->get_error($validator['errmsg']);
+
+ if(preg_match("'^([a-z0-9][a-z0-9-]{0,62}\.)+([a-z]{2,4})$'i", $parsed["host"]) == false) return $this->get_error($validator['errmsg']);
+ }
+ }
+
+ /*
+ Validator function to check if a given cron time is in correct form.
+ */
+ function run_time_format($field_name, $field_value, $validator) {
+ global $app;
+
+ //* check general form
+ $is_ok = true;
+ $field_value = str_replace(" ", "", $field_value); // spaces are not needed
+ $used_times = array();
+
+ if(preg_match("'^[0-9\-\,\/\*]+$'", $field_value) == false) return $this->get_error($validator['errmsg']); // allowed characters are 0-9, comma, *, -, /
+ elseif(preg_match("'[\-\,\/][\-\,\/]'", $field_value) == true) return $this->get_error($validator['errmsg']); // comma, - and / never stand together
+ //* now split list and check each entry. store used values in array for later limit-check
+ $time_list = split(",", $field_value);
+ if(count($time_list) < 1) return $this->get_error($validator['errmsg']);
+
+ $max_entry = 0;
+ $min_entry = 0;
+ $in_minutes = 1;
+ //* get maximum value of entry for each field type (name)
+ switch($field_name) {
+ case "run_min":
+ $max_entry = 59;
+ break;
+ case "run_hour":
+ $max_entry = 23;
+ $in_minutes = 60;
+ break;
+ case "run_mday":
+ $max_entry = 31;
+ $min_entry = 1;
+ $in_minutes = 1440;
+ break;
+ case "run_month":
+ $max_entry = 12;
+ $min_entry = 1;
+ $in_minutes = 1440 * 28; // not exactly but enough
+ break;
+ case "run_wday":
+ $max_entry = 7;
+ $in_minutes = 1440;
+ break;
+ }
+
+ if($max_entry == 0) return $this->get_error('unknown_fieldtype_error');
+
+ foreach($time_list as $entry) {
+ //* possible value combinations:
+ //* x => ^(\d+)$
+ //* x-y => ^(\d+)\-(\d+)$
+ //* x/y => ^(\d+)\/([1-9]\d*)$
+ //* x-y/z => ^(\d+)\-(\d+)\/([1-9]\d*)$
+ //* */x => ^\*\/([1-9]\d*)$
+ //* combined regex => ^(\d+|\*)(\-(\d+))?(\/([1-9]\d*))?$
+
+ if(preg_match("'^(((\d+)(\-(\d+))?)|\*)(\/([1-9]\d*))?$'", $entry, $matches) == false) {
+ return $this->get_error($validator['errmsg']);
+ }
+
+ //* matches contains:
+ //* 1 => * or value or x-y range
+ //* 2 => unused
+ //* 3 => value if [1] != *
+ //* 4 => empty if no range was used
+ //* 5 => 2nd value of range if [1] != * and range was used
+ //* 6 => empty if step was not used
+ //* 7 => step
+
+ $loop_step = 1;
+ $loop_from = $min_entry;
+ $loop_to = $max_entry;
+
+ //* calculate used values
+ if($matches[1] == "*") {
+ //* not to check
+ } else {
+ if($matches[3] < $min_entry || $matches[3] > $max_entry) {
+ //* check if value is in allowed range
+ return $this->get_error($validator['errmsg']);
+ } elseif($matches[4] && ($matches[5] < $min_entry || $matches[5] > $max_entry || $matches[5] <= $matches[3])) {
+ //* check if value is in allowed range and not less or equal to first value
+ return $this->get_error($validator['errmsg']);
+ }
+
+ $loop_from = $matches[3];
+ $loop_to = $matches[3];
+ if($matches[4]) $loop_to = $matches[5];
+ }
+ if($matches[6] && ($matches[7] < 2 || $matches[7] > $max_entry - 1)) {
+ //* check if step value is valid
+ return $this->get_error($validator['errmsg']);
+ }
+ if($matches[7]) $loop_step = $matches[7];
+
+ //* loop through values to set used times
+ for($t = $loop_from; $t <= $loop_to; $t = $t + $loop_step) {
+ $used_times[] = $t;
+ }
+ } //* end foreach entry loop
+
+ //* sort used times and erase doubles
+ sort($used_times);
+ $used_times = array_unique($used_times);
+
+ //* get minimum frequency and store it in $app->tform->cron_min_freq for usage in onUpdateSave and onInsertSave!
+ $min_freq = -1;
+ $prev_time = -1;
+ foreach($used_times as $curtime) {
+ if($prev_time != -1) {
+ $freq = $curtime - $prev_time;
+ if($min_freq == -1 || $freq < $min_freq) $min_freq = $freq;
+ }
+ $prev_time = $curtime;
+ }
+
+ //* check last against first (needed because e.g. wday 1,4,7 has diff 1 not 3
+ $prev_time = $used_times[0];
+ $freq = ($prev_time - $min_entry) + ($max_entry - $curtime) + 1;
+ if($min_freq == -1 || $freq < $min_freq) $min_freq = $freq;
+
+ if($min_freq > 0 && $min_freq <= $max_entry) { //* only store if > 1 && < $max_entry!
+ $min_freq = $min_freq * $in_minutes; // we have to overwrite $app->tform->cron_min_freq if this is higher value
+ if(!$app->tform->cron_min_freq || $app->tform->cron_min_freq > $min_freq) $app->tform->cron_min_freq = $min_freq;
+ }
+
+ //return "DEBUG: " . $app->tform->cron_min_freq . " ($min_freq) --- " . var_export($used_times, true) . "<br />";
+ }
+
+
+
+
+}
\ No newline at end of file
diff --git a/interface/lib/classes/validate_database.inc.php b/interface/lib/classes/validate_database.inc.php
new file mode 100644
index 0000000..c4ea5d0
--- /dev/null
+++ b/interface/lib/classes/validate_database.inc.php
@@ -0,0 +1,72 @@
+<?php
+
+/*
+Copyright (c) 2007, 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.
+*/
+
+class validate_database {
+
+ /*
+ Validator function to check if a given list of ips is ok.
+ */
+ function valid_ip_list($field_name, $field_value, $validator) {
+ global $app;
+
+ if($_POST["remote_access"] == "y") {
+ if(trim($field_value) == "") return;
+
+ $values = split(",", $field_value);
+ foreach($values as $cur_value) {
+ $cur_value = trim($cur_value);
+
+ $valid = true;
+ if(preg_match("/^[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}$/", $cur_value)) {
+ $groups = explode(".", $cur_value);
+ foreach($groups as $group){
+ if($group<0 OR $group>255)
+ $valid=false;
+ }
+ } else {
+ $valid = false;
+ }
+
+ if($valid == false) {
+ $errmsg = $validator['errmsg'];
+ if(isset($app->tform->wordbook[$errmsg])) {
+ return $app->tform->wordbook[$errmsg]."<br>\r\n";
+ } else {
+ return $errmsg."<br>\r\n";
+ }
+ }
+ }
+ }
+ }
+
+
+
+
+}
\ No newline at end of file
diff --git a/interface/lib/classes/validate_ftpuser.inc.php b/interface/lib/classes/validate_ftpuser.inc.php
new file mode 100644
index 0000000..7e04cb9
--- /dev/null
+++ b/interface/lib/classes/validate_ftpuser.inc.php
@@ -0,0 +1,89 @@
+<?php
+
+/*
+Copyright (c) 2007, 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.
+*/
+
+class validate_ftpuser {
+
+ /*
+ Validator function to check if a given dir is ok.
+ */
+ function ftp_dir($field_name, $field_value, $validator) {
+ global $app;
+
+ if($app->tform->primary_id == 0) {
+ $errmsg = $validator['errmsg'];
+ if(isset($app->tform->wordbook[$errmsg])) {
+ return $app->tform->wordbook[$errmsg]."<br>\r\n";
+ } else {
+ return $errmsg."<br>\r\n";
+ }
+ }
+
+
+ $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"]) {
+ $errmsg = $validator['errmsg'];
+ if(isset($app->tform->wordbook[$errmsg])) {
+ return $app->tform->wordbook[$errmsg]."<br>\r\n";
+ } else {
+ return $errmsg."<br>\r\n";
+ }
+ }
+
+ $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"]) {
+ $errmsg = $validator['errmsg'];
+ if(isset($app->tform->wordbook[$errmsg])) {
+ return $app->tform->wordbook[$errmsg]."<br>\r\n";
+ } else {
+ return $errmsg."<br>\r\n";
+ }
+ }
+
+ $doc_root = $domain_data["document_root"];
+ $is_ok = false;
+ if($doc_root == $field_value) $is_ok = true;
+
+ $doc_root .= "/";
+ if(substr($field_value, 0, strlen($doc_root)) == $doc_root) $is_ok = true;
+
+ if($is_ok == false) {
+ $errmsg = $validator['errmsg'];
+ if(isset($app->tform->wordbook[$errmsg])) {
+ return $app->tform->wordbook[$errmsg]."<br>\r\n";
+ } else {
+ return $errmsg."<br>\r\n";
+ }
+ }
+ }
+
+
+
+
+}
\ No newline at end of file
diff --git a/interface/lib/classes/validate_reseller.inc.php b/interface/lib/classes/validate_reseller.inc.php
new file mode 100644
index 0000000..5453905
--- /dev/null
+++ b/interface/lib/classes/validate_reseller.inc.php
@@ -0,0 +1,47 @@
+<?php
+
+/*
+Copyright (c) 2007 - 2009, 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.
+*/
+
+class validate_reseller {
+
+ /*
+ Validator function to check if a given cron command is in correct form (url only).
+ */
+ function limit_client($field_name, $field_value, $validator) {
+ global $app;
+
+ if($field_value <= 0) {
+ return $app->tform->lng('limit_client_error_positive');
+ } else {
+ return '';
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/interface/lib/lang/br.lng b/interface/lib/lang/br.lng
new file mode 100644
index 0000000..3aad6e0
--- /dev/null
+++ b/interface/lib/lang/br.lng
@@ -0,0 +1,25 @@
+<?php
+$wb['conf_format_dateshort'] = 'd/m/Y';
+$wb['conf_format_datelong'] = 'l dS of F Y';
+$wb['conf_format_timeshort'] = 'H:i';
+$wb['conf_format_timelong'] = 'H:i:s';
+$wb['conf_format_datetime'] = 'd/m/Y H:i';
+$wb['301'] = 'Módulo não permitido para o usuário corrente.';
+$wb['302'] = 'Módulo Inválido';
+$wb['1001'] = 'O nome de usuário e senha não podem estar em branco!';
+$wb['1002'] = 'Nome de usuário ou senha incorretos!';
+$wb['1003'] = 'O Usuário está inativo!';
+$wb['delete_confirmation'] = 'Tem certeza de que deseja remover este registro?';
+$wb['error_no_view_permission'] = 'Você não tem permissão para ver este registro ou o mesmo não existe!';
+$wb['error_no_delete_permission'] = 'Você não tem permissão para remover este registro!';
+$wb['page_txt'] = 'Página';
+$wb['page_of_txt'] = 'de';
+$wb['page_next_txt'] = 'Próximo';
+$wb['page_back_txt'] = 'Voltar';
+$wb['delete_txt'] = 'Remover';
+$wb['filter_txt'] = 'Filtrar';
+$wb['add_new_record_txt'] = 'Adcionar novo registro';
+$wb['btn_save_txt'] = 'Salvar';
+$wb['btn_cancel_txt'] = 'Voltar';
+?>
+
diff --git a/interface/web/admin/form/server.tform.php b/interface/web/admin/form/server.tform.php
index 80b672e..87b1c18 100644
--- a/interface/web/admin/form/server.tform.php
+++ b/interface/web/admin/form/server.tform.php
@@ -122,7 +122,7 @@
)
);
-
+/*
$form["tabs"]['config'] = array (
'title' => "Config",
'width' => 100,
@@ -146,6 +146,6 @@
##################################
)
);
-
+*/
?>
\ No newline at end of file
diff --git a/interface/web/admin/form/server_config.tform.php b/interface/web/admin/form/server_config.tform.php
index 754000b..999a1f9 100644
--- a/interface/web/admin/form/server_config.tform.php
+++ b/interface/web/admin/form/server_config.tform.php
@@ -339,6 +339,34 @@
'width' => '40',
'maxlength' => '255'
),
+ 'security_level' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'SELECT',
+ 'default' => '20',
+ 'value' => array('10' => 'Medium', '20' => 'High')
+ ),
+ 'user' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY',
+ 'errmsg'=> 'apache_user_error_empty'),
+ ),
+ 'value' => '',
+ 'width' => '40',
+ 'maxlength' => '255'
+ ),
+ 'group' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY',
+ 'errmsg'=> 'apache_group_error_empty'),
+ ),
+ 'value' => '',
+ 'width' => '40',
+ 'maxlength' => '255'
+ ),
##################################
# ENDE Datatable fields
##################################
@@ -478,6 +506,17 @@
'width' => '40',
'maxlength' => '1000'
),
+ 'jailkit_chroot_cron_programs' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY',
+ 'errmsg'=> 'jailkit_chroot_cron_programs_error_empty'),
+ ),
+ 'value' => '',
+ 'width' => '40',
+ 'maxlength' => '1000'
+ ),
##################################
# ENDE Datatable fields
##################################
@@ -485,10 +524,79 @@
);
+$form["tabs"]['vlogger'] = array (
+ 'title' => "vlogger",
+ 'width' => 80,
+ 'template' => "templates/server_config_vlogger_edit.htm",
+ 'fields' => array (
+ ##################################
+ # Begin Datatable fields
+ ##################################
+ 'config_dir' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY',
+ 'errmsg'=> 'vlogger_config_dir_error_empty'),
+ ),
+ 'value' => '',
+ 'width' => '40',
+ 'maxlength' => '255'
+ ),
+ ##################################
+ # ENDE Datatable fields
+ ##################################
+ )
+);
-
+$form["tabs"]['cron'] = array (
+ 'title' => "Cron",
+ 'width' => 80,
+ 'template' => "templates/server_config_cron_edit.htm",
+ 'fields' => array (
+ ##################################
+ # Begin Datatable fields
+ ##################################
+ 'init_script' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY',
+ 'errmsg'=> 'cron_init_script_error_empty'),
+ ),
+ 'value' => '',
+ 'width' => '40',
+ 'maxlength' => '255'
+ ),
+ 'crontab_dir' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY',
+ 'errmsg'=> 'crontab_dir_error_empty'),
+ ),
+ 'value' => '',
+ 'width' => '40',
+ 'maxlength' => '255'
+ ),
+ 'wget' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY',
+ 'errmsg'=> 'cron_wget_error_empty'),
+ ),
+ 'value' => '',
+ 'width' => '40',
+ 'maxlength' => '255'
+ ),
+ ##################################
+ # ENDE Datatable fields
+ ##################################
+ )
+);
diff --git a/interface/web/admin/lib/lang/bg_server_config.lng b/interface/web/admin/lib/lang/bg_server_config.lng
index 97f3e7f..f3a7a95 100644
--- a/interface/web/admin/lib/lang/bg_server_config.lng
+++ b/interface/web/admin/lib/lang/bg_server_config.lng
@@ -38,4 +38,10 @@
$wb['gateway_error_wrong'] = 'Invalid Gateway format.';
$wb['hostname_error_empty'] = 'Hostname is empty.';
$wb['nameservers_error_empty'] = 'Nameserver is empty.';
+$wb['jailkit_chroot_cron_programs_txt'] = 'Jailkit cron chrooted applications';
+$wb['config_dir_txt'] = 'Config directory';
+$wb['init_script_txt'] = 'Cron init script name';
+$wb['crontab_dir_txt'] = 'Path for individual crontabs';
+$wb['wget_txt'] = 'Path to wget program';
+$wb['security_level_txt'] = 'Security level';
?>
diff --git a/interface/web/admin/lib/lang/br.lng b/interface/web/admin/lib/lang/br.lng
new file mode 100644
index 0000000..6081ef2
--- /dev/null
+++ b/interface/web/admin/lib/lang/br.lng
@@ -0,0 +1,35 @@
+<?php
+$wb['1001'] = 'Por favor, preencha o nome do usuário e senha!';
+$wb['1002'] = 'Nome do usuário ou senha incorretos!';
+$wb['Firewall'] = 'Firewall';
+$wb['Groups'] = 'Grupos';
+$wb['groups_description'] = 'Formulário para edição dos Grupos de usuários do sistema.';
+$wb['Server'] = 'Servidor';
+$wb['Services'] = 'Serviços';
+$wb['Config'] = 'Configuração';
+$wb['Server Config'] = 'Configuração do Servidor';
+$wb['Mail'] = 'Mail';
+$wb['Getmail'] = 'Getmail';
+$wb['Web'] = 'Web';
+$wb['FastCGI'] = 'FastCGI';
+$wb['Jailkit'] = 'Jailkit';
+$wb['System'] = 'Sistema';
+$wb['Add user'] = 'Adicionar Usuário';
+$wb['Edit user'] = 'Editar Usuário';
+$wb['CP Users'] = 'Usuários Visar';
+$wb['Add group'] = 'Adicionar Grupo';
+$wb['Edit group'] = 'Editar Grupo';
+$wb['Edit server'] = 'Editar Servidor';
+$wb['Edit Server IP'] = 'Editar Endereço IP do Servidor';
+$wb['Servers'] = 'Servidores';
+$wb['Sync. Now'] = 'Sincronizar agora';
+$wb['DB Sync.'] = 'Sincronizar Bando de Dados';
+$wb['Languages'] = 'Idiomas';
+$wb['New Language'] = 'Novo Idioma';
+$wb['Export'] = 'Exportar';
+$wb['Import'] = 'Importar';
+$wb['Language Editor'] = 'Editor de Idiomas';
+$wb['Software'] = 'Software';
+$wb['Repositories'] = 'Repositórios';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_firewall.lng b/interface/web/admin/lib/lang/br_firewall.lng
new file mode 100644
index 0000000..1f276e5
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_firewall.lng
@@ -0,0 +1,10 @@
+<?php
+$wb['server_id_txt'] = 'Servidor';
+$wb['tcp_port_txt'] = 'Portas TCP abertas';
+$wb['udp_port_txt'] = 'Portas UDP abertas';
+$wb['tcp_port_help_txt'] = 'Separado por vírgula';
+$wb['udp_port_help_txt'] = 'Separado por vírgula';
+$wb['active_txt'] = 'Ativo';
+$wb['firewall_error_unique'] = 'Já existe uma regra de firewall para este servidor!';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_firewall_list.lng b/interface/web/admin/lib/lang/br_firewall_list.lng
new file mode 100644
index 0000000..143a966
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_firewall_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["list_head_txt"] = 'Firewall';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["tcp_port_txt"] = 'Portas TCP abertas';
+$wb["udp_port_txt"] = 'Portas UDP abertas';
+$wb["add_new_record_txt"] = 'Adcionar registro de firewall';
+?>
diff --git a/interface/web/admin/lib/lang/br_groups.lng b/interface/web/admin/lib/lang/br_groups.lng
new file mode 100644
index 0000000..ee75776
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_groups.lng
@@ -0,0 +1,6 @@
+<?php
+$wb['description_txt'] = 'Descrição';
+$wb['name_txt'] = 'Grupo';
+$wb['name_err'] = 'O Nome do Grupo deve conter de 1 a 30 caracteres!';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_groups_list.lng b/interface/web/admin/lib/lang/br_groups_list.lng
new file mode 100644
index 0000000..68a49ce
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_groups_list.lng
@@ -0,0 +1,7 @@
+<?php
+$wb['list_head_txt'] = 'Grupos de usuários do sistema';
+$wb['description_txt'] = 'Descrição';
+$wb['name_txt'] = 'Grupo';
+$wb['add_new_record_txt'] = 'Adicionar novo Grupo';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_language_add.lng b/interface/web/admin/lib/lang/br_language_add.lng
new file mode 100644
index 0000000..d31fb97
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_language_add.lng
@@ -0,0 +1,9 @@
+<?php
+$wb['list_head_txt'] = 'Adcionar novo idioma';
+$wb['language_select_txt'] = 'Selecione o idioma base';
+$wb['language_new_txt'] = 'Novo Idioma';
+$wb['language_new_hint_txt'] = '2 letras código ISO 639-1 (Veja http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)';
+$wb['btn_save_txt'] = 'Criar um novo conjunto de idioma';
+$wb['btn_cancel_txt'] = 'Voltar';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_language_complete.lng b/interface/web/admin/lib/lang/br_language_complete.lng
new file mode 100644
index 0000000..4a6795e
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_language_complete.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['list_head_txt'] = 'Mesclar Idioma';
+$wb['list_desc_txt'] = 'Mesclar o arquivo de idioma selecionado com o arquivo de idioma principal (em inglês). <br />Isto permite completar qualquer falha de tradução, com o arquivo principal original em inglês.';
+$wb['language_select_txt'] = 'Selecionar Idioma';
+$wb['btn_save_txt'] = 'Mesclar arquivos agora';
+$wb['btn_cancel_txt'] = 'Voltar';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_language_edit.lng b/interface/web/admin/lib/lang/br_language_edit.lng
new file mode 100644
index 0000000..f023e9c
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_language_edit.lng
@@ -0,0 +1,9 @@
+<?php
+$wb['list_head_txt'] = 'Editor de Arquivos de Idioma';
+$wb['language_select_txt'] = 'Selecione o idioma';
+$wb['module_txt'] = 'Módulo';
+$wb['lang_file_txt'] = 'Arquivo de Idioma';
+$wb['btn_save_txt'] = 'Salvar';
+$wb['btn_cancel_txt'] = 'Voltar';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_language_export.lng b/interface/web/admin/lib/lang/br_language_export.lng
new file mode 100644
index 0000000..f7f924c
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_language_export.lng
@@ -0,0 +1,7 @@
+<?php
+$wb['list_head_txt'] = 'Exportar arquivos de idioma';
+$wb['language_select_txt'] = 'Selecione o idioma';
+$wb['btn_save_txt'] = 'Exportar idioma selecionado para um arquivo';
+$wb['btn_cancel_txt'] = 'Voltar';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_language_import.lng b/interface/web/admin/lib/lang/br_language_import.lng
new file mode 100644
index 0000000..71d0d5e
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_language_import.lng
@@ -0,0 +1,7 @@
+<?php
+$wb["list_head_txt"] = 'Importar arquivo de idioma';
+$wb["language_import_txt"] = 'Buscar arquivo de idioma';
+$wb['btn_save_txt'] = 'Importar Arquivo de Idioma Selecionado';
+$wb["language_overwrite_txt"] = 'Sobre escrever o arquivo se existir.';
+$wb['btn_cancel_txt'] = 'Voltar';
+?>
diff --git a/interface/web/admin/lib/lang/br_language_list.lng b/interface/web/admin/lib/lang/br_language_list.lng
new file mode 100644
index 0000000..fe3d2a4
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_language_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['list_head_txt'] = 'Editor de arquivo de idioma';
+$wb['language_select_txt'] = 'Selecione o idioma';
+$wb['module_txt'] = 'Módulo';
+$wb['lang_file_txt'] = 'Arquido de Idioma';
+$wb['lang_file_date_txt'] = 'Ultima Modificação';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_server.lng b/interface/web/admin/lib/lang/br_server.lng
new file mode 100644
index 0000000..ce97f76
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_server.lng
@@ -0,0 +1,12 @@
+<?php
+$wb['config_txt'] = 'Configuração';
+$wb['server_name_txt'] = 'Nome do Servidor';
+$wb['mail_server_txt'] = 'Servidor de Mail';
+$wb['web_server_txt'] = 'Servidor Web';
+$wb['dns_server_txt'] = 'Servidor DNS';
+$wb['file_server_txt'] = 'Servidor de Arquivo';
+$wb['db_server_txt'] = 'Servidor de Banco de Dados';
+$wb['vserver_server_txt'] = 'Servidor VServer';
+$wb['active_txt'] = 'Ativado';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_server_config.lng b/interface/web/admin/lib/lang/br_server_config.lng
new file mode 100644
index 0000000..65b7b26
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_server_config.lng
@@ -0,0 +1,42 @@
+<?php
+$wb['jailkit_chroot_home_txt'] = 'Chroot Jailkit home';
+$wb['jailkit_chroot_app_sections_txt'] = 'Aplicações Jailkit chroot (Sessões)';
+$wb['jailkit_chroot_app_programs_txt'] = 'Aplicações Jailkit em ambiente chroot';
+$wb['website_path_txt'] = 'Website path';
+$wb['website_symlinks_txt'] = 'Website symlinks: link simbólico';
+$wb['website_basedir_txt'] = 'Website basedir: Diretório base ';
+$wb['vhost_conf_dir_txt'] = 'Vhost config dir';
+$wb['vhost_conf_enabled_dir_txt'] = 'Vhost diretório de configuração ativo';
+$wb['getmail_config_dir_txt'] = 'Getmail config dir';
+$wb['fastcgi_starter_path_txt'] = 'FastCGI: Caminho diretório inicial';
+$wb['fastcgi_starter_script_txt'] = 'FastCGI: Script inicial';
+$wb['fastcgi_alias_txt'] = 'FastCGI: Alias';
+$wb['fastcgi_phpini_path_txt'] = 'FastCGI: Caminho do php.ini ';
+$wb['fastcgi_children_txt'] = 'FastCGI: Filhos';
+$wb['fastcgi_max_requests_txt'] = 'FastCGI: Requisições máximas';
+$wb['fastcgi_bin_txt'] = 'FastCGI Bin';
+$wb['module_txt'] = 'Módulo';
+$wb['maildir_path_txt'] = 'Caminho do diretório Maildir';
+$wb['homedir_path_txt'] = 'Caminho do diretório Home';
+$wb['mailuser_uid_txt'] = 'UID usuário de email';
+$wb['mailuser_gid_txt'] = 'GID usuário de email';
+$wb['mailuser_name_txt'] = 'Nome usuário de email';
+$wb['mailuser_group_txt'] = 'Grupo usuário de email';
+$wb['relayhost_txt'] = 'Host Relay';
+$wb['relayhost_user_txt'] = 'Usuário do Host Relay';
+$wb['relayhost_password_txt'] = 'Senha do Host Relay';
+$wb['mailbox_size_limit_txt'] = 'Tamanho máximo da Caixa Postal';
+$wb['message_size_limit_txt'] = 'Tamanho máximo de mensagem';
+$wb['ip_address_txt'] = 'Endereço IP';
+$wb['netmask_txt'] = 'Máscara de Rede';
+$wb['gateway_txt'] = 'Gateway';
+$wb['hostname_txt'] = 'Nome do Host';
+$wb['nameservers_txt'] = 'Servidores DNS';
+$wb['auto_network_configuration_txt'] = 'Configuração de Rede';
+$wb['ip_address_error_wrong'] = 'Formato do Endereço IP inválido!';
+$wb['netmask_error_wrong'] = 'Formato da Máscara de Rede inválio!';
+$wb['gateway_error_wrong'] = 'Gateway inválido!';
+$wb['hostname_error_empty'] = 'Por favor, entre com o nome do Host.';
+$wb['nameservers_error_empty'] = 'Por favor, entre com o Servidor DNS.';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_server_config_list.lng b/interface/web/admin/lib/lang/br_server_config_list.lng
new file mode 100644
index 0000000..551867d
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_server_config_list.lng
@@ -0,0 +1,5 @@
+<?php
+$wb['list_head_txt'] = 'Configuração do Servidor';
+$wb['server_name_txt'] = 'Servidor';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_server_ip.lng b/interface/web/admin/lib/lang/br_server_ip.lng
new file mode 100644
index 0000000..b1bbc8e
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_server_ip.lng
@@ -0,0 +1,7 @@
+<?php
+$wb['server_id_txt'] = 'Servidor';
+$wb['ip_address_txt'] = 'Endereço IP';
+$wb['virtualhost_txt'] = 'Nome VirtualHost HTTP';
+$wb['ip_err'] = 'Endereço IP inválido!';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_server_ip_list.lng b/interface/web/admin/lib/lang/br_server_ip_list.lng
new file mode 100644
index 0000000..6b137cc
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_server_ip_list.lng
@@ -0,0 +1,7 @@
+<?php
+$wb['list_head_txt'] = 'Endereço IP';
+$wb['server_id_txt'] = 'Servidor';
+$wb['ip_address_txt'] = 'Endereço IP';
+$wb['add_new_record_txt'] = 'Adicionar novo Endereço IP';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_server_list.lng b/interface/web/admin/lib/lang/br_server_list.lng
new file mode 100644
index 0000000..011e47e
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_server_list.lng
@@ -0,0 +1,12 @@
+<?php
+$wb['list_head_txt'] = 'Servidor';
+$wb['server_name_txt'] = 'Nome';
+$wb['mail_server_txt'] = 'Mail';
+$wb['web_server_txt'] = 'Web';
+$wb['dns_server_txt'] = 'DNS';
+$wb['file_server_txt'] = 'Arquivo';
+$wb['db_server_txt'] = 'Banco de Dados';
+$wb['vserver_server_txt'] = 'VServer';
+$wb['add_new_record_txt'] = 'Adicionar novo Servidor';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_software_package_list.lng b/interface/web/admin/lib/lang/br_software_package_list.lng
new file mode 100644
index 0000000..2faa815
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_software_package_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['list_head_txt'] = 'Pacotes de Software';
+$wb['installed_txt'] = 'Status';
+$wb['package_title_txt'] = 'Pacote';
+$wb['package_description_txt'] = 'Descrição';
+$wb['action_txt'] = 'Acão';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_software_repo.lng b/interface/web/admin/lib/lang/br_software_repo.lng
new file mode 100644
index 0000000..9d09727
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_software_repo.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['repo_name_txt'] = 'Repositório';
+$wb['repo_url_txt'] = 'URL';
+$wb['repo_username_txt'] = 'Usuário (opcional)';
+$wb['repo_password_txt'] = 'Senha (opcional)';
+$wb['active_txt'] = 'Ativo';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_software_repo_list.lng b/interface/web/admin/lib/lang/br_software_repo_list.lng
new file mode 100644
index 0000000..4352970
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_software_repo_list.lng
@@ -0,0 +1,6 @@
+<?php
+$wb["list_head_txt"] = 'Repositório';
+$wb["active_txt"] = 'Ativo';
+$wb["repo_name_txt"] = 'Repositório';
+$wb["repo_url_txt"] = 'URL';
+?>
diff --git a/interface/web/admin/lib/lang/br_software_update_list.lng b/interface/web/admin/lib/lang/br_software_update_list.lng
new file mode 100644
index 0000000..6cc6a55
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_software_update_list.lng
@@ -0,0 +1,9 @@
+<?php
+$wb['list_head_txt'] = 'Atualizações de Programas';
+$wb['server_select_txt'] = 'Selecione o servidor';
+$wb['installed_txt'] = 'Ações';
+$wb['update_title_txt'] = 'Atualizar';
+$wb['version_txt'] = 'Versão';
+$wb['action_txt'] = 'Ação';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_system_config.lng b/interface/web/admin/lib/lang/br_system_config.lng
new file mode 100644
index 0000000..bc22ce6
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_system_config.lng
@@ -0,0 +1,14 @@
+<?php
+$wb['warning'] = 'Edite estes valores com cuidado! Não remova os prefixos em um sistema com mais de um cliente!!';
+$wb['dbname_prefix_txt'] = 'Prefixo Nome do Banco de Dados';
+$wb['dbuser_prefix_txt'] = 'Prefixo Usuário do Banco de Dados';
+$wb['shelluser_prefix_txt'] = 'Prefixo Usuário de Shell';
+$wb['ftpuser_prefix_txt'] = 'Prefixo Usuário FTP';
+$wb['dbname_prefix_error_regex'] = 'Caractere não permitido para o prefixo do nome do Banco de Dados!';
+$wb['dbuser_prefix_error_regex'] = 'Caractere não permitido para o prefixo do Usuário do Banco de Dados!';
+$wb['ftpuser_prefix_error_regex'] = 'Caractere não permitido para o prefixo do Usuário FTP!';
+$wb['shelluser_prefix_error_regex'] = 'Caractere não permitido para o prefixo do Usuário Shell!';
+$wb['dblist_phpmyadmin_link_txt'] = 'Link para phpmyadmin';
+$wb['mailboxlist_webmail_link_txt'] = 'Link para o webmail';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_users.lng b/interface/web/admin/lib/lang/br_users.lng
new file mode 100644
index 0000000..a63a2f4
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_users.lng
@@ -0,0 +1,29 @@
+<?php
+$wb['username_txt'] = 'Usuário';
+$wb['username_err'] = 'O Nome do Usuário é muito longo ou contém caracteres inválidos!';
+$wb['username_empty'] = 'Por favor, entre com o nome do Usuário.';
+$wb['username_unique'] = 'Já existe um Usuário com este nome!';
+$wb['passwort_txt'] = 'Senha';
+$wb['password_strength_txt'] = 'Segurança da Senha';
+$wb['modules_txt'] = 'Módulos';
+$wb['startmodule_txt'] = 'Módulo Inicial';
+$wb['app_theme_txt'] = 'Tema';
+$wb['typ_txt'] = 'Tipo';
+$wb['active_txt'] = 'Ativo';
+$wb['language_txt'] = 'Idioma';
+$wb['name_txt'] = 'Nome';
+$wb['vorname_txt'] = 'Sobrenome';
+$wb['unternehmen_txt'] = 'Empresa';
+$wb['strasse_txt'] = 'Endereço';
+$wb['ort_txt'] = 'Cidade';
+$wb['plz_txt'] = 'CEP';
+$wb['land_txt'] = 'País';
+$wb['email_txt'] = 'E-mail';
+$wb['url_txt'] = 'Site';
+$wb['telefon_txt'] = 'Telefone';
+$wb['fax_txt'] = 'Fax';
+$wb['groups_txt'] = 'Grupos';
+$wb['default_group_txt'] = 'Grupo Padrão';
+$wb['startmodule_err'] = 'O módulo inicial não está contido nos módulos.';
+?>
+
diff --git a/interface/web/admin/lib/lang/br_users_list.lng b/interface/web/admin/lib/lang/br_users_list.lng
new file mode 100644
index 0000000..44e69fa
--- /dev/null
+++ b/interface/web/admin/lib/lang/br_users_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["list_head_txt"] = 'Usuários';
+$wb["username_txt"] = 'Nome de Usuário';
+$wb["name_txt"] = 'Nome';
+$wb["vorname_txt"] = 'Sobrenome';
+$wb["ort_txt"] = 'cidade';
+$wb["add_new_record_txt"] = 'Adcionar novo usuário';
+?>
diff --git a/interface/web/admin/lib/lang/de_server_config.lng b/interface/web/admin/lib/lang/de_server_config.lng
index 97f3e7f..756a3c9 100644
--- a/interface/web/admin/lib/lang/de_server_config.lng
+++ b/interface/web/admin/lib/lang/de_server_config.lng
@@ -2,6 +2,7 @@
$wb['jailkit_chroot_home_txt'] = 'Jailkit chroot home';
$wb['jailkit_chroot_app_sections_txt'] = 'Jailkit chroot app sections';
$wb['jailkit_chroot_app_programs_txt'] = 'Jailkit chrooted applications';
+$wb['jailkit_chroot_cron_programs_txt'] = 'Jailkit cron chrooted applications';
$wb['website_path_txt'] = 'Website path';
$wb['website_symlinks_txt'] = 'Website symlinks';
$wb['vhost_conf_dir_txt'] = 'Vhost config dir';
@@ -38,4 +39,9 @@
$wb['gateway_error_wrong'] = 'Invalid Gateway format.';
$wb['hostname_error_empty'] = 'Hostname is empty.';
$wb['nameservers_error_empty'] = 'Nameserver is empty.';
+$wb['config_dir_txt'] = 'Config directory';
+$wb['init_script_txt'] = 'Cron init script name';
+$wb['crontab_dir_txt'] = 'Path for individual crontabs';
+$wb['wget_txt'] = 'Path to wget program';
+$wb['security_level_txt'] = 'Security level';
?>
diff --git a/interface/web/admin/lib/lang/en_firewall.lng b/interface/web/admin/lib/lang/en_firewall.lng
index 9e06314..025108b 100644
--- a/interface/web/admin/lib/lang/en_firewall.lng
+++ b/interface/web/admin/lib/lang/en_firewall.lng
@@ -6,4 +6,7 @@
$wb["udp_port_help_txt"] = 'Separated by comma';
$wb["active_txt"] = 'Active';
$wb["firewall_error_unique"] = 'There is already a firewall record for this server.';
+$wb["active_txt"] = 'Active';
+$wb["tcp_ports_error_regex"] = 'Character not allowed in tcp port definition. Allowed characters are numbers, ":" and ",".';
+$wb["udp_ports_error_regex"] = 'Character not allowed in udp port definition. Allowed characters are numbers, ":" and ",".';
?>
\ No newline at end of file
diff --git a/interface/web/admin/lib/lang/en_server_config.lng b/interface/web/admin/lib/lang/en_server_config.lng
index 447ae3a..47b2d70 100644
--- a/interface/web/admin/lib/lang/en_server_config.lng
+++ b/interface/web/admin/lib/lang/en_server_config.lng
@@ -2,6 +2,7 @@
$wb["jailkit_chroot_home_txt"] = 'Jailkit chroot home';
$wb["jailkit_chroot_app_sections_txt"] = 'Jailkit chroot app sections';
$wb["jailkit_chroot_app_programs_txt"] = 'Jailkit chrooted applications';
+$wb['jailkit_chroot_cron_programs_txt'] = 'Jailkit cron chrooted applications';
$wb["website_path_txt"] = 'Website path';
$wb["website_symlinks_txt"] = 'Website symlinks';
$wb["website_basedir_txt"] = 'Website basedir';
@@ -38,4 +39,10 @@
$wb["gateway_error_wrong"] = 'Invalid Gateway format.';
$wb["hostname_error_empty"] = 'Hostname is empty.';
$wb["nameservers_error_empty"] = 'Nameserver is empty.';
+$wb["config_dir_txt"] = 'Config directory';
+$wb["init_script_txt"] = 'Cron init script name';
+$wb["crontab_dir_txt"] = 'Path for individual crontabs';
+$wb["wget_txt"] = 'Path to wget program';
+$wb["web_user_txt"] = 'Apache user';
+$wb["web_group_txt"] = 'Apache group';
?>
\ No newline at end of file
diff --git a/interface/web/admin/lib/lang/es_server_config.lng b/interface/web/admin/lib/lang/es_server_config.lng
index dd08bd4..d279768 100644
--- a/interface/web/admin/lib/lang/es_server_config.lng
+++ b/interface/web/admin/lib/lang/es_server_config.lng
@@ -38,4 +38,10 @@
$wb['gateway_error_wrong'] = 'Invalid Gateway format.';
$wb['hostname_error_empty'] = 'Hostname is empty.';
$wb['nameservers_error_empty'] = 'Nameserver is empty.';
+$wb['jailkit_chroot_cron_programs_txt'] = 'Jailkit cron chrooted applications';
+$wb['config_dir_txt'] = 'Config directory';
+$wb['init_script_txt'] = 'Cron init script name';
+$wb['crontab_dir_txt'] = 'Path for individual crontabs';
+$wb['wget_txt'] = 'Path to wget program';
+$wb['security_level_txt'] = 'Security level';
?>
diff --git a/interface/web/admin/lib/lang/fi_server_config.lng b/interface/web/admin/lib/lang/fi_server_config.lng
index 77e0a98..ec4a7a7 100755
--- a/interface/web/admin/lib/lang/fi_server_config.lng
+++ b/interface/web/admin/lib/lang/fi_server_config.lng
@@ -38,4 +38,10 @@
$wb['gateway_error_wrong'] = 'Invalid Gateway format.';
$wb['hostname_error_empty'] = 'Hostname is empty.';
$wb['nameservers_error_empty'] = 'Nameserver is empty.';
+$wb['jailkit_chroot_cron_programs_txt'] = 'Jailkit cron chrooted applications';
+$wb['config_dir_txt'] = 'Config directory';
+$wb['init_script_txt'] = 'Cron init script name';
+$wb['crontab_dir_txt'] = 'Path for individual crontabs';
+$wb['wget_txt'] = 'Path to wget program';
+$wb['security_level_txt'] = 'Security level';
?>
diff --git a/interface/web/admin/lib/lang/fr_server_config.lng b/interface/web/admin/lib/lang/fr_server_config.lng
index 97f3e7f..f3a7a95 100644
--- a/interface/web/admin/lib/lang/fr_server_config.lng
+++ b/interface/web/admin/lib/lang/fr_server_config.lng
@@ -38,4 +38,10 @@
$wb['gateway_error_wrong'] = 'Invalid Gateway format.';
$wb['hostname_error_empty'] = 'Hostname is empty.';
$wb['nameservers_error_empty'] = 'Nameserver is empty.';
+$wb['jailkit_chroot_cron_programs_txt'] = 'Jailkit cron chrooted applications';
+$wb['config_dir_txt'] = 'Config directory';
+$wb['init_script_txt'] = 'Cron init script name';
+$wb['crontab_dir_txt'] = 'Path for individual crontabs';
+$wb['wget_txt'] = 'Path to wget program';
+$wb['security_level_txt'] = 'Security level';
?>
diff --git a/interface/web/admin/lib/lang/it_server_config.lng b/interface/web/admin/lib/lang/it_server_config.lng
index b9c68b2..ab6a29b 100644
--- a/interface/web/admin/lib/lang/it_server_config.lng
+++ b/interface/web/admin/lib/lang/it_server_config.lng
@@ -38,4 +38,10 @@
$wb['gateway_error_wrong'] = 'Invalid Gateway format.';
$wb['hostname_error_empty'] = 'Hostname is empty.';
$wb['nameservers_error_empty'] = 'Nameserver is empty.';
+$wb['jailkit_chroot_cron_programs_txt'] = 'Jailkit cron chrooted applications';
+$wb['config_dir_txt'] = 'Config directory';
+$wb['init_script_txt'] = 'Cron init script name';
+$wb['crontab_dir_txt'] = 'Path for individual crontabs';
+$wb['wget_txt'] = 'Path to wget program';
+$wb['security_level_txt'] = 'Security level';
?>
diff --git a/interface/web/admin/lib/lang/nl_server_config.lng b/interface/web/admin/lib/lang/nl_server_config.lng
index 1add83e..fe73f16 100644
--- a/interface/web/admin/lib/lang/nl_server_config.lng
+++ b/interface/web/admin/lib/lang/nl_server_config.lng
@@ -38,4 +38,10 @@
$wb['gateway_error_wrong'] = 'Invalid Gateway format.';
$wb['hostname_error_empty'] = 'Hostname is empty.';
$wb['nameservers_error_empty'] = 'Nameserver is empty.';
+$wb['jailkit_chroot_cron_programs_txt'] = 'Jailkit cron chrooted applications';
+$wb['config_dir_txt'] = 'Config directory';
+$wb['init_script_txt'] = 'Cron init script name';
+$wb['crontab_dir_txt'] = 'Path for individual crontabs';
+$wb['wget_txt'] = 'Path to wget program';
+$wb['security_level_txt'] = 'Security level';
?>
diff --git a/interface/web/admin/lib/lang/ru_server_config.lng b/interface/web/admin/lib/lang/ru_server_config.lng
index 19f9583..d84a211 100644
--- a/interface/web/admin/lib/lang/ru_server_config.lng
+++ b/interface/web/admin/lib/lang/ru_server_config.lng
@@ -38,4 +38,10 @@
$wb['gateway_error_wrong'] = 'Invalid Gateway format.';
$wb['hostname_error_empty'] = 'Hostname is empty.';
$wb['nameservers_error_empty'] = 'Nameserver is empty.';
+$wb['jailkit_chroot_cron_programs_txt'] = 'Jailkit cron chrooted applications';
+$wb['config_dir_txt'] = 'Config directory';
+$wb['init_script_txt'] = 'Cron init script name';
+$wb['crontab_dir_txt'] = 'Path for individual crontabs';
+$wb['wget_txt'] = 'Path to wget program';
+$wb['security_level_txt'] = 'Security level';
?>
diff --git a/interface/web/admin/lib/lang/se_server_config.lng b/interface/web/admin/lib/lang/se_server_config.lng
index 97f3e7f..f3a7a95 100644
--- a/interface/web/admin/lib/lang/se_server_config.lng
+++ b/interface/web/admin/lib/lang/se_server_config.lng
@@ -38,4 +38,10 @@
$wb['gateway_error_wrong'] = 'Invalid Gateway format.';
$wb['hostname_error_empty'] = 'Hostname is empty.';
$wb['nameservers_error_empty'] = 'Nameserver is empty.';
+$wb['jailkit_chroot_cron_programs_txt'] = 'Jailkit cron chrooted applications';
+$wb['config_dir_txt'] = 'Config directory';
+$wb['init_script_txt'] = 'Cron init script name';
+$wb['crontab_dir_txt'] = 'Path for individual crontabs';
+$wb['wget_txt'] = 'Path to wget program';
+$wb['security_level_txt'] = 'Security level';
?>
diff --git a/interface/web/admin/software_package_list.php b/interface/web/admin/software_package_list.php
index 19a7518..24c53ec 100644
--- a/interface/web/admin/software_package_list.php
+++ b/interface/web/admin/software_package_list.php
@@ -62,7 +62,46 @@
}
}
}
-
+
+ $packages = $app->db->queryAllRecords("SELECT software_package.package_name, v1, v2, v3, v4 FROM software_package LEFT JOIN software_update ON ( software_package.package_name = software_update.package_name ) GROUP BY package_name ORDER BY v1 DESC , v2 DESC , v3 DESC , v4 DESC");
+ if(is_array($packages)) {
+ foreach($packages as $p) {
+
+ $version = $p['v1'].'.'.$p['v2'].'.'.$p['v3'].'.'.$p['v4'];
+ $updates = $client->get_updates($p['package_name'], $version,$repo['repo_username'], $repo['repo_password']);
+
+ if(is_array($updates)) {
+ foreach($updates as $u) {
+
+ $version_array = explode('.',$u['version']);
+ $v1 = intval($version_array[0]);
+ $v2 = intval($version_array[1]);
+ $v3 = intval($version_array[2]);
+ $v4 = intval($version_array[3]);
+
+ $package_name = $app->db->quote($u['package_name']);
+ $software_repo_id = intval($repo['software_repo_id']);
+ $update_url = $app->db->quote($u['url']);
+ $update_md5 = $app->db->quote($u['md5']);
+ $update_dependencies = (isset($u['dependencies']))?$app->db->quote($u['dependencies']):'';
+ $update_title = $app->db->quote($u['title']);
+ $type = $app->db->quote($u['type']);
+
+ // Check that we do not have this update in the database yet
+ $sql = "SELECT * FROM software_update WHERE package_name = '$package_name' and v1 = '$v1' and v2 = '$v2' and v3 = '$v3' and v4 = '$v4'";
+ $tmp = $app->db->queryOneRecord($sql);
+ if(!isset($tmp['software_update_id'])) {
+ // Insert the update in the datbase
+ $sql = "INSERT INTO software_update (software_repo_id, package_name, update_url, update_md5, update_dependencies, update_title, v1, v2, v3, v4, type)
+ VALUES ($software_repo_id, '$package_name', '$update_url', '$update_md5', '$update_dependencies', '$update_title', '$v1', '$v2', '$v3', '$v4', '$type')";
+ //die($sql);
+ $app->db->query($sql);
+ }
+
+ }
+ }
+ }
+ }
}
}
@@ -74,8 +113,8 @@
$tmp = $app->db->queryOneRecord($sql);
$software_update_id = $tmp['software_update_id'];
- // $insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$server_id', '$software_update_id','installing')";
- $insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$server_id', '$software_update_id','installed')";
+ $insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$server_id', '$software_update_id','installing')";
+ // $insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$server_id', '$software_update_id','installed')";
$app->db->datalogInsert('software_update_inst', $insert_data, 'software_update_inst_id');
}
@@ -100,8 +139,10 @@
if($inst['status'] == 'installed') {
$installed_txt .= $s['server_name'].": Installed version $version<br />";
- } elseif ($inst['status'] == 'installing') {
- $installed_txt .= $s['server_name'].": Installation in progress<br />";
+ } elseif ($inst['status'] == 'installing') {
+ $installed_txt .= $s['server_name'].": Installation in progress<br />";
+ } elseif ($inst['status'] == 'failed') {
+ $installed_txt .= $s['server_name'].": Installation failed<br />";
} elseif ($inst['status'] == 'deleting') {
$installed_txt .= $s['server_name'].": Deletion in progress<br />";
} else {
diff --git a/interface/web/admin/software_update_list.php b/interface/web/admin/software_update_list.php
index d4255b7..03d2658 100644
--- a/interface/web/admin/software_update_list.php
+++ b/interface/web/admin/software_update_list.php
@@ -104,8 +104,8 @@
$server_id = intval($_GET['server_id']);
$software_update_id = intval($_GET['id']);
- // $insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$server_id', '$software_update_id','installing')";
- $insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$server_id', '$software_update_id','installed')";
+ $insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$server_id', '$software_update_id','installing')";
+ // $insert_data = "(package_name, server_id, software_update_id, status) VALUES ('$package_name', '$server_id', '$software_update_id','installed')";
$app->db->datalogInsert('software_update_inst', $insert_data, 'software_update_inst_id');
}
diff --git a/interface/web/admin/templates/language_export.htm b/interface/web/admin/templates/language_export.htm
index b8c718b..d0ba3a3 100644
--- a/interface/web/admin/templates/language_export.htm
+++ b/interface/web/admin/templates/language_export.htm
@@ -1,24 +1,28 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_language_export">
-
- <div class="pnl_formsarea">
- <fieldset class="inlineLabels"><legend>Language Export</legend>
- <div class="ctrlHolder">
- <label for="lng_select">{tmpl_var name='language_select_txt'}</label>
- <select name="lng_select" id="language" class="selectInput withicons">
- {tmpl_var name='language_option'}
- </select>
- </div>
- </fieldset>
-
- <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/language_export.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/language_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
- </div>
- </div>
-
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_language_export">
+
+ <div class="pnl_formsarea">
+ <fieldset class="inlineLabels"><legend>Language Export</legend>
+ <div class="ctrlHolder">
+ <label for="lng_select">{tmpl_var name='language_select_txt'}</label>
+ <select name="lng_select" id="lng_select" class="selectInput withicons">
+ {tmpl_var name='language_option'}
+ </select>
+ </div>
+ </fieldset>
+
+ <tmpl_if name="msg">
+ <div id="OKMsg"><p><tmpl_var name="msg"></p></div>
+ </tmpl_if>
+
+ <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/language_export.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/language_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+ </div>
+ </div>
+
+</div>
diff --git a/interface/web/admin/templates/language_import.htm b/interface/web/admin/templates/language_import.htm
index 0547e55..8f4cffb 100644
--- a/interface/web/admin/templates/language_import.htm
+++ b/interface/web/admin/templates/language_import.htm
@@ -1,28 +1,35 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_language_import">
-
- <div class="pnl_formsarea">
- <fieldset class="inlineLabels"><legend>Language Import</legend>
- <div class="ctrlHolder">
- <label for="lng_select"><em>*</em> {tmpl_var name='language_import_txt'}</label>
- <input name="file" id="file" size="30" type="file" class="fileUpload" />
- </div>
- <div class="ctrlHolder">
- <p class="label">{tmpl_var name='language_overwrite_txt'}</p>
- <div class="multiField">
- <input id="overwrite" type="checkbox" value="1" name="overwrite"/>
- </div>
- </div>
- </fieldset>
-
- <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="submitUploadForm('pageForm','admin/language_import.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/language_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
- </div>
- </div>
-
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_language_import">
+
+ <div class="pnl_formsarea">
+ <fieldset class="inlineLabels"><legend>Language Import</legend>
+ <div class="ctrlHolder">
+ <label for="lng_select"><em>*</em> {tmpl_var name='language_import_txt'}</label>
+ <input name="file" id="file" size="30" type="file" class="fileUpload" />
+ </div>
+ <div class="ctrlHolder">
+ <p class="label">{tmpl_var name='language_overwrite_txt'}</p>
+ <div class="multiField">
+ <input id="overwrite" type="checkbox" value="1" name="overwrite"/>
+ </div>
+ </div>
+ </fieldset>
+
+ <tmpl_if name="msg">
+ <div id="OKMsg"><p><tmpl_var name="msg"></p></div>
+ </tmpl_if>
+ <tmpl_if name="error">
+ <div id="errorMsg"><h3>ERROR</h3><ol><tmpl_var name="error"></ol></div>
+ </tmpl_if>
+
+ <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="submitUploadForm('pageForm','admin/language_import.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/language_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+ </div>
+ </div>
+
+</div>
diff --git a/interface/web/admin/templates/server_config_cron_edit.htm b/interface/web/admin/templates/server_config_cron_edit.htm
new file mode 100644
index 0000000..066693e
--- /dev/null
+++ b/interface/web/admin/templates/server_config_cron_edit.htm
@@ -0,0 +1,30 @@
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_server_config">
+
+ <div class="pnl_formsarea">
+ <fieldset class="inlineLabels">
+ <div class="ctrlHolder">
+ <label for="init_script">{tmpl_var name='init_script_txt'}</label>
+ <input name="init_script" id="init_script" value="{tmpl_var name='init_script'}" size="40" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="crontab_dir">{tmpl_var name='crontab_dir_txt'}</label>
+ <input name="crontab_dir" id="crontab_dir" value="{tmpl_var name='crontab_dir'}" size="40" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="wget">{tmpl_var name='wget_txt'}</label>
+ <input name="wget" id="wget" value="{tmpl_var name='wget'}" size="40" maxlength="255" type="text" class="textInput" />
+ </div>
+ </fieldset>
+
+ <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/server_config_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/server_config_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+ </div>
+ </div>
+
+</div>
diff --git a/interface/web/admin/templates/server_config_jailkit_edit.htm b/interface/web/admin/templates/server_config_jailkit_edit.htm
index ec2081d..320fb87 100644
--- a/interface/web/admin/templates/server_config_jailkit_edit.htm
+++ b/interface/web/admin/templates/server_config_jailkit_edit.htm
@@ -17,6 +17,10 @@
<label for="jailkit_chroot_app_programs">{tmpl_var name='jailkit_chroot_app_programs_txt'}</label>
<input name="jailkit_chroot_app_programs" id="jailkit_chroot_app_programs" value="{tmpl_var name='jailkit_chroot_app_programs'}" size="40" maxlength="1000" type="text" class="textInput" />
</div>
+ <div class="ctrlHolder">
+ <label for="jailkit_chroot_cron_programs">{tmpl_var name='jailkit_chroot_cron_programs_txt'}</label>
+ <input name="jailkit_chroot_cron_programs" id="jailkit_chroot_cron_programs" value="{tmpl_var name='jailkit_chroot_cron_programs'}" size="40" maxlength="1000" type="text" class="textInput" />
+ </div>
</fieldset>
<input type="hidden" name="id" value="{tmpl_var name='id'}">
diff --git a/interface/web/admin/templates/server_config_list.htm b/interface/web/admin/templates/server_config_list.htm
index d6584b6..f635cad 100644
--- a/interface/web/admin/templates/server_config_list.htm
+++ b/interface/web/admin/templates/server_config_list.htm
@@ -1,50 +1,40 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_list_server_config">
-
- <div class="pnl_toolsarea">
- <fieldset><legend>Tools</legend>
- <div class="buttons">
- <button class="iconstxt icoAdd" type="button" onClick="loadContent('admin/server_config_edit.php');">
- <span>{tmpl_var name="add_new_record_txt"}</span>
- </button>
- </div>
- </fieldset>
- </div>
-
- <div class="pnl_listarea">
- <fieldset><legend><tmpl_var name="list_head_txt"></legend>
- <table class="list">
- <thead>
- <tr>
- <th class="tbl_col_server_name" scope="col"><tmpl_var name="server_name_txt"></th>
- <th class="tbl_col_buttons" scope="col"> </th>
- </tr>
- <tr>
- <td class="tbl_col_server_name"><input type="text" name="search_server_name" value="{tmpl_var name='search_server_name'}" /></td>
- <td class="tbl_col_buttons"><div class="buttons"><button type="button" class="icons16 icoFilter" name="Filter" id="Filter" value="{tmpl_var name="filter_txt"}" onClick="submitForm('pageForm','admin/server_config_list.php');"><span>{tmpl_var name="filter_txt"}</span></button></div></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_server_name"><a href="#" onClick="loadContent('admin/server_config_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="server_name"}</a></td>
- <td class="tbl_col_buttons">
- <div class="buttons icons16">
- <a class="icons16 icoDelete" href="javascript: del_record('admin/server_config_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>
- </div>
- </td>
- </tr>
- </tmpl_loop>
- </tbody>
- <tfoot>
- <tr>
- <td class="tbl_footer tbl_paging" colspan="2"><tmpl_var name="paging"></td>
- </tr>
- </tfoot>
- </table>
- </fieldset>
- </div>
-
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_list_server_config">
+
+ <div class="pnl_listarea">
+ <fieldset><legend><tmpl_var name="list_head_txt"></legend>
+ <table class="list">
+ <thead>
+ <tr>
+ <th class="tbl_col_server_name" scope="col"><tmpl_var name="server_name_txt"></th>
+ <th class="tbl_col_buttons" scope="col"> </th>
+ </tr>
+ <tr>
+ <td class="tbl_col_server_name"><input type="text" name="search_server_name" value="{tmpl_var name='search_server_name'}" /></td>
+ <td class="tbl_col_buttons"><div class="buttons"><button type="button" class="icons16 icoFilter" name="Filter" id="Filter" value="{tmpl_var name="filter_txt"}" onClick="submitForm('pageForm','admin/server_config_list.php');"><span>{tmpl_var name="filter_txt"}</span></button></div></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_server_name"><a href="#" onClick="loadContent('admin/server_config_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="server_name"}</a></td>
+ <td class="tbl_col_buttons">
+ <div class="buttons icons16">
+ <a class="icons16 icoDelete" href="javascript: del_record('admin/server_config_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>
+ </div>
+ </td>
+ </tr>
+ </tmpl_loop>
+ </tbody>
+ <tfoot>
+ <tr>
+ <td class="tbl_footer tbl_paging" colspan="2"><tmpl_var name="paging"></td>
+ </tr>
+ </tfoot>
+ </table>
+ </fieldset>
+ </div>
+
+</div>
diff --git a/interface/web/admin/templates/server_config_vlogger_edit.htm b/interface/web/admin/templates/server_config_vlogger_edit.htm
new file mode 100644
index 0000000..bf6a82a
--- /dev/null
+++ b/interface/web/admin/templates/server_config_vlogger_edit.htm
@@ -0,0 +1,22 @@
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_server_config">
+
+ <div class="pnl_formsarea">
+ <fieldset class="inlineLabels">
+ <div class="ctrlHolder">
+ <label for="config_dir">{tmpl_var name='config_dir_txt'}</label>
+ <input name="config_dir" id="config_dir" value="{tmpl_var name='config_dir'}" size="40" maxlength="255" type="text" class="textInput" />
+ </div>
+ </fieldset>
+
+ <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/server_config_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/server_config_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+ </div>
+ </div>
+
+</div>
diff --git a/interface/web/admin/templates/server_config_web_edit.htm b/interface/web/admin/templates/server_config_web_edit.htm
index 92d5262..646c076 100644
--- a/interface/web/admin/templates/server_config_web_edit.htm
+++ b/interface/web/admin/templates/server_config_web_edit.htm
@@ -25,6 +25,22 @@
<label for="vhost_conf_enabled_dir">{tmpl_var name='vhost_conf_enabled_dir_txt'}</label>
<input name="vhost_conf_enabled_dir" id="vhost_conf_enabled_dir" value="{tmpl_var name='vhost_conf_enabled_dir'}" size="40" maxlength="255" type="text" class="textInput" />
</div>
+ <div class="ctrlHolder">
+ <p class="label">{tmpl_var name='security_level_txt'}</p>
+ <div class="multiField">
+ <select name="security_level" id="security_level" class="selectInput">
+ {tmpl_var name='security_level'}
+ </select>
+ </div>
+ </div>
+ <div class="ctrlHolder">
+ <label for="user">{tmpl_var name='web_user_txt'}</label>
+ <input name="user" id="user" value="{tmpl_var name='user'}" size="40" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="group">{tmpl_var name='web_group_txt'}</label>
+ <input name="group" id="group" value="{tmpl_var name='group'}" size="40" maxlength="255" type="text" class="textInput" />
+ </div>
</fieldset>
<input type="hidden" name="id" value="{tmpl_var name='id'}">
diff --git a/interface/web/admin/templates/server_list.htm b/interface/web/admin/templates/server_list.htm
index b0ca262..7163843 100644
--- a/interface/web/admin/templates/server_list.htm
+++ b/interface/web/admin/templates/server_list.htm
@@ -1,68 +1,58 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_list_server">
-
- <div class="pnl_toolsarea">
- <fieldset><legend>Tools</legend>
- <div class="buttons">
- <button class="iconstxt icoAdd" type="button" onClick="loadContent('admin/server_edit.php');">
- <span>{tmpl_var name="add_new_record_txt"}</span>
- </button>
- </div>
- </fieldset>
- </div>
-
- <div class="pnl_listarea">
- <fieldset><legend><tmpl_var name="list_head_txt"></legend>
- <table class="list">
- <thead>
- <tr>
- <th class="tbl_col_server_name" scope="col"><tmpl_var name="server_name_txt"></th>
- <th class="tbl_col_mail_server" scope="col"><tmpl_var name="mail_server_txt"></th>
- <th class="tbl_col_web_server" scope="col"><tmpl_var name="web_server_txt"></th>
- <th class="tbl_col_dns_server" scope="col"><tmpl_var name="dns_server_txt"></th>
- <th class="tbl_col_file_server" scope="col"><tmpl_var name="file_server_txt"></th>
- <th class="tbl_col_db_server" scope="col"><tmpl_var name="db_server_txt"></th>
- <th class="tbl_col_vserver_server" scope="col"><tmpl_var name="vserver_server_txt"></th>
- <th class="tbl_col_buttons" scope="col"> </th>
- </tr>
- <tr>
- <td class="tbl_col_server_name"><input type="text" name="search_server_name" value="{tmpl_var name='search_server_name'}" /></td>
- <td class="tbl_col_mail_server"><select name="search_active" onChange="submitForm('pageForm','admin/server_list.php');">{tmpl_var name='search_mail_server'}</select></td>
- <td class="tbl_col_web_server"><select name="search_active" onChange="submitForm('pageForm','admin/server_list.php');">{tmpl_var name='search_web_server'}</select></td>
- <td class="tbl_col_dns_server"><select name="search_active" onChange="submitForm('pageForm','admin/server_list.php');">{tmpl_var name='search_dns_server'}</select></td>
- <td class="tbl_col_file_server"><select name="search_active" onChange="submitForm('pageForm','admin/server_list.php');">{tmpl_var name='search_file_server'}</select></td>
- <td class="tbl_col_db_server"><select name="search_active" onChange="submitForm('pageForm','admin/server_list.php');">{tmpl_var name='search_db_server'}</select></td>
- <td class="tbl_col_vserver_server"><select name="search_active" onChange="submitForm('pageForm','admin/server_list.php');">{tmpl_var name='search_vserver_server'}</select></td>
- <td class="tbl_col_buttons"><div class="buttons"><button type="button" class="icons16 icoFilter" name="Filter" id="Filter" value="{tmpl_var name="filter_txt"}" onClick="submitForm('pageForm','admin/server_list.php');"><span>{tmpl_var name="filter_txt"}</span></button></div></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_server_name"><a href="#" onClick="loadContent('admin/server_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="server_name"}</a></td>
- <td class="tbl_col_mail_server">{tmpl_var name="mail_server"}</td>
- <td class="tbl_col_web_server">{tmpl_var name="web_server"}</td>
- <td class="tbl_col_dns_server">{tmpl_var name="dns_server"}</td>
- <td class="tbl_col_file_server">{tmpl_var name="file_server"}</td>
- <td class="tbl_col_db_server">{tmpl_var name="db_server"}</td>
- <td class="tbl_col_vserver_server">{tmpl_var name="vserver_server"}</td>
- <td class="tbl_col_buttons">
- <div class="buttons icons16">
- <a class="icons16 icoDelete" href="javascript: del_record('admin/server_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>
- </div>
- </td>
- </tr>
- </tmpl_loop>
- </tbody>
- <tfoot>
- <tr>
- <td class="tbl_footer tbl_paging" colspan="8"><tmpl_var name="paging"></td>
- </tr>
- </tfoot>
- </table>
- </fieldset>
- </div>
-
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_list_server">
+
+ <div class="pnl_listarea">
+ <fieldset><legend><tmpl_var name="list_head_txt"></legend>
+ <table class="list">
+ <thead>
+ <tr>
+ <th class="tbl_col_server_name" scope="col"><tmpl_var name="server_name_txt"></th>
+ <th class="tbl_col_mail_server" scope="col"><tmpl_var name="mail_server_txt"></th>
+ <th class="tbl_col_web_server" scope="col"><tmpl_var name="web_server_txt"></th>
+ <th class="tbl_col_dns_server" scope="col"><tmpl_var name="dns_server_txt"></th>
+ <th class="tbl_col_file_server" scope="col"><tmpl_var name="file_server_txt"></th>
+ <th class="tbl_col_db_server" scope="col"><tmpl_var name="db_server_txt"></th>
+ <th class="tbl_col_vserver_server" scope="col"><tmpl_var name="vserver_server_txt"></th>
+ <th class="tbl_col_buttons" scope="col"> </th>
+ </tr>
+ <tr>
+ <td class="tbl_col_server_name"><input type="text" name="search_server_name" value="{tmpl_var name='search_server_name'}" /></td>
+ <td class="tbl_col_mail_server"><select name="search_active" onChange="submitForm('pageForm','admin/server_list.php');">{tmpl_var name='search_mail_server'}</select></td>
+ <td class="tbl_col_web_server"><select name="search_active" onChange="submitForm('pageForm','admin/server_list.php');">{tmpl_var name='search_web_server'}</select></td>
+ <td class="tbl_col_dns_server"><select name="search_active" onChange="submitForm('pageForm','admin/server_list.php');">{tmpl_var name='search_dns_server'}</select></td>
+ <td class="tbl_col_file_server"><select name="search_active" onChange="submitForm('pageForm','admin/server_list.php');">{tmpl_var name='search_file_server'}</select></td>
+ <td class="tbl_col_db_server"><select name="search_active" onChange="submitForm('pageForm','admin/server_list.php');">{tmpl_var name='search_db_server'}</select></td>
+ <td class="tbl_col_vserver_server"><select name="search_active" onChange="submitForm('pageForm','admin/server_list.php');">{tmpl_var name='search_vserver_server'}</select></td>
+ <td class="tbl_col_buttons"><div class="buttons"><button type="button" class="icons16 icoFilter" name="Filter" id="Filter" value="{tmpl_var name="filter_txt"}" onClick="submitForm('pageForm','admin/server_list.php');"><span>{tmpl_var name="filter_txt"}</span></button></div></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_server_name"><a href="#" onClick="loadContent('admin/server_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="server_name"}</a></td>
+ <td class="tbl_col_mail_server">{tmpl_var name="mail_server"}</td>
+ <td class="tbl_col_web_server">{tmpl_var name="web_server"}</td>
+ <td class="tbl_col_dns_server">{tmpl_var name="dns_server"}</td>
+ <td class="tbl_col_file_server">{tmpl_var name="file_server"}</td>
+ <td class="tbl_col_db_server">{tmpl_var name="db_server"}</td>
+ <td class="tbl_col_vserver_server">{tmpl_var name="vserver_server"}</td>
+ <td class="tbl_col_buttons">
+ <div class="buttons icons16">
+ <a class="icons16 icoDelete" href="javascript: del_record('admin/server_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>
+ </div>
+ </td>
+ </tr>
+ </tmpl_loop>
+ </tbody>
+ <tfoot>
+ <tr>
+ <td class="tbl_footer tbl_paging" colspan="8"><tmpl_var name="paging"></td>
+ </tr>
+ </tfoot>
+ </table>
+ </fieldset>
+ </div>
+
+</div>
diff --git a/interface/web/admin/templates/users_list.htm b/interface/web/admin/templates/users_list.htm
index f7ef8bd..3407c9b 100644
--- a/interface/web/admin/templates/users_list.htm
+++ b/interface/web/admin/templates/users_list.htm
@@ -1,60 +1,60 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_list_users">
-
- <div class="pnl_toolsarea">
- <fieldset><legend>Tools</legend>
- <div class="buttons">
- <button class="iconstxt icoAdd" type="button" onClick="loadContent('admin/users_edit.php');">
- <span>{tmpl_var name="add_new_record_txt"}</span>
- </button>
- </div>
- </fieldset>
- </div>
-
- <div class="pnl_listarea">
- <fieldset><legend><tmpl_var name="list_head_txt"></legend>
- <table class="list">
- <thead>
- <tr>
- <th class="tbl_col_username" scope="col"><tmpl_var name="username_txt"></th>
- <th class="tbl_col_vorname" scope="col"><tmpl_var name="vorname_txt"></th>
- <th class="tbl_col_name" scope="col"><tmpl_var name="name_txt"></th>
- <th class="tbl_col_ort" scope="col"><tmpl_var name="ort_txt"></th>
- <th class="tbl_col_buttons" scope="col"> </th>
- </tr>
- <tr>
- <td class="tbl_col_username"><input type="text" name="search_username" value="{tmpl_var name='search_username'}" /></td>
- <td class="tbl_col_vorname"><input type="text" name="search_vorname" value="{tmpl_var name='search_vorname'}" /></td>
- <td class="tbl_col_name"><input type="text" name="search_name" value="{tmpl_var name='search_name'}" /></td>
- <td class="tbl_col_ort"><input type="text" name="search_ort" value="{tmpl_var name='search_ort'}" /></td>
- <td class="tbl_col_buttons"><div class="buttons"><button type="button" class="icons16 icoFilter" name="Filter" id="Filter" value="{tmpl_var name="filter_txt"}" onClick="submitForm('pageForm','admin/users_list.php');"><span>{tmpl_var name="filter_txt"}</span></button></div></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_username"><a href="#" onClick="loadContent('admin/users_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="username"}</a></td>
- <td class="tbl_col_vorname"><a href="#" onClick="loadContent('admin/users_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="vorname"}</a></td>
- <td class="tbl_col_name"><a href="#" onClick="loadContent('admin/users_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="name"}</a></td>
- <td class="tbl_col_ort"><a href="#" onClick="loadContent('admin/users_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="ort"}</a></td>
- <td class="tbl_col_buttons">
- <div class="buttons icons16">
- <a class="icons16 icoLoginAs" href="#" onclick="loadContent('admin/login_as.php?id={tmpl_var name='id'}');"><span>{tmpl_var name='login_as_txt'}</span></a>
- <a class="icons16 icoDelete" href="javascript: del_record('admin/users_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>
- </div>
- </td>
- </tr>
- </tmpl_loop>
- </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>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_list_users">
+
+ <div class="pnl_toolsarea">
+ <fieldset><legend>Tools</legend>
+ <div class="buttons">
+ <button class="iconstxt icoAdd" type="button" onClick="loadContent('admin/users_edit.php');">
+ <span>{tmpl_var name="add_new_record_txt"}</span>
+ </button>
+ </div>
+ </fieldset>
+ </div>
+
+ <div class="pnl_listarea">
+ <fieldset><legend><tmpl_var name="list_head_txt"></legend>
+ <table class="list">
+ <thead>
+ <tr>
+ <th class="tbl_col_username" scope="col"><tmpl_var name="username_txt"></th>
+ <th class="tbl_col_vorname" scope="col"><tmpl_var name="vorname_txt"></th>
+ <th class="tbl_col_name" scope="col"><tmpl_var name="name_txt"></th>
+ <th class="tbl_col_ort" scope="col"><tmpl_var name="ort_txt"></th>
+ <th class="tbl_col_buttons" scope="col"> </th>
+ </tr>
+ <tr>
+ <td class="tbl_col_username"><input type="text" name="search_username" value="{tmpl_var name='search_username'}" /></td>
+ <td class="tbl_col_vorname"><input type="text" name="search_vorname" value="{tmpl_var name='search_vorname'}" /></td>
+ <td class="tbl_col_name"><input type="text" name="search_name" value="{tmpl_var name='search_name'}" /></td>
+ <td class="tbl_col_ort"><input type="text" name="search_ort" value="{tmpl_var name='search_ort'}" /></td>
+ <td class="tbl_col_buttons"><div class="buttons"><button type="button" class="icons16 icoFilter" name="Filter" id="Filter" value="{tmpl_var name="filter_txt"}" onClick="submitForm('pageForm','admin/users_list.php');"><span>{tmpl_var name="filter_txt"}</span></button></div></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_username"><a href="#" onClick="loadContent('admin/users_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="username"}</a></td>
+ <td class="tbl_col_vorname"><a href="#" onClick="loadContent('admin/users_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="vorname"}</a></td>
+ <td class="tbl_col_name"><a href="#" onClick="loadContent('admin/users_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="name"}</a></td>
+ <td class="tbl_col_ort"><a href="#" onClick="loadContent('admin/users_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="ort"}</a></td>
+ <td class="tbl_col_buttons">
+ <div class="buttons icons16">
+ <tmpl_if name="username" op="!=" value="admin"><a class="icons16 icoLoginAs" href="#" onclick="loadContent('admin/login_as.php?id={tmpl_var name='id'}');"><span>{tmpl_var name='login_as_txt'}</span></a>
+ <a class="icons16 icoDelete" href="javascript: del_record('admin/users_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></tmpl_if>
+ </div>
+ </td>
+ </tr>
+ </tmpl_loop>
+ </tbody>
+ <tfoot>
+ <tr>
+ <td class="tbl_footer tbl_paging" colspan="5"><tmpl_var name="paging"></td>
+ </tr>
+ </tfoot>
+ </table>
+ </fieldset>
+ </div>
+
+</div>
diff --git a/interface/web/client/client_list.php b/interface/web/client/client_list.php
index 84eb799..590da21 100644
--- a/interface/web/client/client_list.php
+++ b/interface/web/client/client_list.php
@@ -18,6 +18,7 @@
$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->onLoad();
diff --git a/interface/web/client/form/client.tform.php b/interface/web/client/form/client.tform.php
index 288e893..4d369ce 100644
--- a/interface/web/client/form/client.tform.php
+++ b/interface/web/client/form/client.tform.php
@@ -1,696 +1,732 @@
-<?php
-
-/*
- Form Definition
-
- Tabledefinition
-
- Datatypes:
- - INTEGER (Forces the input to Int)
- - DOUBLE
- - CURRENCY (Formats the values to currency notation)
- - VARCHAR (no format check, maxlength: 255)
- - TEXT (no format check)
- - DATE (Dateformat, automatic conversion to timestamps)
-
- Formtype:
- - TEXT (Textfield)
- - TEXTAREA (Textarea)
- - PASSWORD (Password textfield, input is not shown when edited)
- - SELECT (Select option field)
- - RADIO
- - CHECKBOX
- - CHECKBOXARRAY
- - FILE
-
- VALUE:
- - Wert oder Array
-
- Hint:
- The ID field of the database table is not part of the datafield definition.
- The ID field must be always auto incement (int or bigint).
-
-
-*/
-
-$form["title"] = "Client";
-$form["description"] = "";
-$form["name"] = "client";
-$form["action"] = "client_edit.php";
-$form["db_table"] = "client";
-$form["db_table_idx"] = "client_id";
-$form["db_history"] = "yes";
-$form["tab_default"] = "address";
-$form["list_default"] = "client_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
-
-//* Languages
-$language_list = array();
-$handle = @opendir(ISPC_ROOT_PATH.'/lib/lang');
-while ($file = @readdir ($handle)) {
- if ($file != '.' && $file != '..') {
- if(@is_file(ISPC_ROOT_PATH.'/lib/lang/'.$file) and substr($file,-4,4) == '.lng') {
- $tmp = substr($file, 0, 2);
- $language_list[$tmp] = $tmp;
- }
- }
-}
-
-$form["tabs"]['address'] = array (
- 'title' => "Address",
- 'width' => 100,
- 'template' => "templates/client_edit_address.htm",
- 'fields' => array (
- ##################################
- # Begin Datatable fields
- ##################################
- 'company_name' => array (
- 'datatype' => 'VARCHAR',
- 'formtype' => 'TEXT',
- 'default' => '',
- 'value' => '',
- 'separator' => '',
- 'width' => '30',
- 'maxlength' => '255',
- 'rows' => '',
- 'cols' => ''
- ),
- 'contact_name' => array (
- 'datatype' => 'VARCHAR',
- 'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY',
- 'errmsg'=> 'contact_error_empty'),
- ),
- 'default' => '',
- 'value' => '',
- 'separator' => '',
- 'width' => '30',
- 'maxlength' => '255',
- 'rows' => '',
- 'cols' => ''
- ),
- 'username' => array (
- 'datatype' => 'VARCHAR',
- 'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY',
- 'errmsg'=> 'username_error_empty'),
- 1 => array ( 'type' => 'CUSTOM',
- 'class' => 'validate_client',
- 'function' => 'username_unique',
- 'errmsg'=> 'username_error_unique'),
- 2 => array ( 'type' => 'REGEX',
- 'regex' => '/^[\w\.\-\_]{0,64}$/',
- 'errmsg'=> 'username_error_regex'),
- ),
- 'default' => '',
- 'value' => '',
- 'separator' => '',
- 'width' => '30',
- 'maxlength' => '255',
- 'rows' => '',
- 'cols' => ''
- ),
- 'password' => array (
- 'datatype' => 'VARCHAR',
- 'formtype' => 'PASSWORD',
- 'encryption'=> 'CRYPT',
- 'default' => '',
- 'value' => '',
- 'separator' => '',
- 'width' => '30',
- 'maxlength' => '255',
- 'rows' => '',
- 'cols' => ''
- ),
- 'language' => array (
- 'datatype' => 'VARCHAR',
- 'formtype' => 'SELECT',
- 'default' => $conf["language"],
- 'value' => $language_list,
- 'separator' => '',
- 'width' => '30',
- 'maxlength' => '255',
- 'rows' => '',
- 'cols' => ''
- ),
- 'usertheme' => array (
- 'datatype' => 'VARCHAR',
- 'formtype' => 'SELECT',
- 'default' => 'default',
- 'value' => array('default' => 'default'),
- 'separator' => '',
- 'width' => '30',
- 'maxlength' => '255',
- 'rows' => '',
- 'cols' => ''
- ),
- 'street' => array (
- 'datatype' => 'VARCHAR',
- 'formtype' => 'TEXT',
- 'default' => '',
- 'value' => '',
- 'separator' => '',
- 'width' => '30',
- 'maxlength' => '255',
- 'rows' => '',
- 'cols' => ''
- ),
- 'zip' => array (
- 'datatype' => 'VARCHAR',
- 'formtype' => 'TEXT',
- 'default' => '',
- 'value' => '',
- 'separator' => '',
- 'width' => '10',
- 'maxlength' => '255',
- 'rows' => '',
- 'cols' => ''
- ),
- 'city' => array (
- 'datatype' => 'VARCHAR',
- 'formtype' => 'TEXT',
- 'default' => '',
- 'value' => '',
- 'separator' => '',
- 'width' => '30',
- 'maxlength' => '255',
- 'rows' => '',
- 'cols' => ''
- ),
- 'state' => array (
- 'datatype' => 'VARCHAR',
- 'formtype' => 'TEXT',
- 'default' => '',
- 'value' => '',
- 'separator' => '',
- 'width' => '30',
- 'maxlength' => '255',
- 'rows' => '',
- 'cols' => ''
- ),
- 'country' => array (
- 'datatype' => 'VARCHAR',
-
- 'formtype' => 'SELECT',
- 'default' => 'DE',
- 'datasource' => array ( 'type' => 'SQL',
- 'querystring' => 'SELECT iso,printable_name FROM country ORDER BY printable_name',
- 'keyfield'=> 'iso',
- 'valuefield'=> 'printable_name'
- ),
- 'value' => ''
- ),
- 'telephone' => array (
- 'datatype' => 'VARCHAR',
- 'formtype' => 'TEXT',
- 'default' => '',
- 'value' => '',
- 'separator' => '',
- 'width' => '30',
- 'maxlength' => '255',
- 'rows' => '',
- 'cols' => ''
- ),
- 'mobile' => array (
- 'datatype' => 'VARCHAR',
- 'formtype' => 'TEXT',
- 'default' => '',
- 'value' => '',
- 'separator' => '',
- 'width' => '30',
- 'maxlength' => '255',
- 'rows' => '',
- 'cols' => ''
- ),
- 'fax' => array (
- 'datatype' => 'VARCHAR',
- 'formtype' => 'TEXT',
- 'default' => '',
- 'value' => '',
- 'separator' => '',
- 'width' => '30',
- 'maxlength' => '255',
- 'rows' => '',
- 'cols' => ''
- ),
- 'email' => array (
- 'datatype' => 'VARCHAR',
- 'formtype' => 'TEXT',
- 'default' => '',
- 'value' => '',
- 'separator' => '',
- 'width' => '30',
- 'maxlength' => '255',
- 'rows' => '',
- 'cols' => ''
- ),
- 'internet' => array (
- 'datatype' => 'VARCHAR',
- 'formtype' => 'TEXT',
- 'default' => 'http://',
- 'value' => '',
- 'separator' => '',
- 'width' => '30',
- 'maxlength' => '255',
- 'rows' => '',
- 'cols' => ''
- ),
- 'icq' => array (
- 'datatype' => 'VARCHAR',
- 'formtype' => 'TEXT',
- 'default' => '',
- 'value' => '',
- 'separator' => '',
- 'width' => '30',
- 'maxlength' => '255',
- 'rows' => '',
- 'cols' => ''
- ),
- 'notes' => array (
- 'datatype' => 'TEXT',
- 'formtype' => 'TEXTAREA',
- 'default' => '',
- 'value' => '',
- 'separator' => '',
- 'width' => '',
- 'maxlength' => '',
- 'rows' => '10',
- 'cols' => '30'
- ),
- ##################################
- # END Datatable fields
- ##################################
- )
-);
-
-$form["tabs"]['limits'] = array (
- 'title' => "Limits",
- 'width' => 80,
- 'template' => "templates/client_edit_limits.htm",
- 'fields' => array (
- ##################################
- # Begin Datatable fields
- ##################################
- 'template_master' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'SELECT',
- 'default' => '1',
- 'datasource' => array ( 'type' => 'CUSTOM',
- 'class'=> 'custom_datasource',
- 'function'=> 'master_templates'
- ),
- 'value' => ''
- ),
- 'template_additional' => array (
- 'datatype' => 'VARCHAR',
- 'formtype' => 'TEXT',
- ),
- 'default_mailserver' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'SELECT',
- 'default' => '1',
- 'datasource' => array ( 'type' => 'SQL',
- 'querystring' => 'SELECT server_id,server_name FROM server WHERE mail_server = 1 AND {AUTHSQL} ORDER BY server_name',
- 'keyfield'=> 'server_id',
- 'valuefield'=> 'server_name'
- ),
- 'value' => ''
- ),
- 'limit_maildomain' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'ISINT',
- 'errmsg'=> 'limit_maildomain_error_notint'),
- ),
- 'default' => '-1',
- 'value' => '',
- 'separator' => '',
- 'width' => '10',
- 'maxlength' => '10',
- 'rows' => '',
- 'cols' => ''
- ),
- 'limit_mailbox' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'ISINT',
- 'errmsg'=> 'limit_mailbox_error_notint'),
- ),
- 'default' => '-1',
- 'value' => '',
- 'separator' => '',
- 'width' => '10',
- 'maxlength' => '10',
- 'rows' => '',
- 'cols' => ''
- ),
- 'limit_mailalias' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'ISINT',
- 'errmsg'=> 'limit_mailalias_error_notint'),
- ),
- 'default' => '-1',
- 'value' => '',
- 'separator' => '',
- 'width' => '10',
- 'maxlength' => '10',
- 'rows' => '',
- 'cols' => ''
- ),
- 'limit_mailforward' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'ISINT',
- 'errmsg'=> 'limit_mailforward_error_notint'),
- ),
- 'default' => '-1',
- 'value' => '',
- 'separator' => '',
- 'width' => '10',
- 'maxlength' => '10',
- 'rows' => '',
- 'cols' => ''
- ),
- 'limit_mailcatchall' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'ISINT',
- 'errmsg'=> 'limit_mailcatchall_error_notint'),
- ),
- 'default' => '-1',
- 'value' => '',
- 'separator' => '',
- 'width' => '10',
- 'maxlength' => '10',
- 'rows' => '',
- 'cols' => ''
- ),
- 'limit_mailrouting' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'ISINT',
- 'errmsg'=> 'limit_mailrouting_error_notint'),
- ),
- 'default' => '0',
- 'value' => '',
- 'separator' => '',
- 'width' => '10',
- 'maxlength' => '10',
- 'rows' => '',
- 'cols' => ''
- ),
- 'limit_mailfilter' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'ISINT',
- 'errmsg'=> 'limit_mailfilter_error_notint'),
- ),
- 'default' => '-1',
- 'value' => '',
- 'separator' => '',
- 'width' => '10',
- 'maxlength' => '10',
- 'rows' => '',
- 'cols' => ''
- ),
- 'limit_fetchmail' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'ISINT',
- 'errmsg'=> 'limit_mailfetchmail_error_notint'),
- ),
- 'default' => '-1',
- 'value' => '',
- 'separator' => '',
- 'width' => '10',
- 'maxlength' => '10',
- 'rows' => '',
- 'cols' => ''
- ),
- 'limit_mailquota' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'ISINT',
- 'errmsg'=> 'limit_mailquota_error_notint'),
- ),
- 'default' => '-1',
- 'value' => '',
- 'separator' => '',
- 'width' => '10',
- 'maxlength' => '10',
- 'rows' => '',
- 'cols' => ''
- ),
- 'limit_spamfilter_wblist' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'ISINT',
- 'errmsg'=> 'limit_spamfilter_wblist_error_notint'),
- ),
- 'default' => '-1',
- 'value' => '',
- 'separator' => '',
- 'width' => '10',
- 'maxlength' => '10',
- 'rows' => '',
- 'cols' => ''
- ),
- 'limit_spamfilter_user' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'ISINT',
- 'errmsg'=> 'limit_spamfilter_user_error_notint'),
- ),
- 'default' => '-1',
- 'value' => '',
- 'separator' => '',
- 'width' => '10',
- 'maxlength' => '10',
- 'rows' => '',
- 'cols' => ''
- ),
- 'limit_spamfilter_policy' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'ISINT',
- 'errmsg'=> 'limit_spamfilter_policy_error_notint'),
- ),
- 'default' => '-1',
- 'value' => '',
- 'separator' => '',
- 'width' => '10',
- 'maxlength' => '10',
- 'rows' => '',
- 'cols' => ''
- ),
- 'default_webserver' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'SELECT',
- 'default' => '1',
- 'datasource' => array ( 'type' => 'SQL',
- 'querystring' => 'SELECT server_id,server_name FROM server WHERE web_server = 1 AND {AUTHSQL} ORDER BY server_name',
- 'keyfield'=> 'server_id',
- 'valuefield'=> 'server_name'
- ),
- 'value' => ''
- ),
- 'limit_web_domain' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'ISINT',
- 'errmsg'=> 'limit_web_domain_error_notint'),
- ),
- 'default' => '-1',
- 'value' => '',
- 'separator' => '',
- 'width' => '10',
- 'maxlength' => '10',
- 'rows' => '',
- 'cols' => ''
- ),
- 'web_php_options' => array (
- 'datatype' => 'VARCHAR',
- 'formtype' => 'CHECKBOXARRAY',
- 'default' => '',
- 'separator' => ',',
- 'value' => array('no' => 'Disabled', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP')
- ),
- 'limit_web_aliasdomain' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'ISINT',
- 'errmsg'=> 'limit_web_aliasdomain_error_notint'),
- ),
- 'default' => '-1',
- 'value' => '',
- 'separator' => '',
- 'width' => '10',
- 'maxlength' => '10',
- 'rows' => '',
- 'cols' => ''
- ),
- 'limit_web_subdomain' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'ISINT',
- 'errmsg'=> 'limit_web_subdomain_error_notint'),
- ),
- 'default' => '-1',
- 'value' => '',
- 'separator' => '',
- 'width' => '10',
- 'maxlength' => '10',
- 'rows' => '',
- 'cols' => ''
- ),
- 'limit_ftp_user' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'ISINT',
- 'errmsg'=> 'limit_ftp_user_error_notint'),
- ),
- 'default' => '-1',
- 'value' => '',
- 'separator' => '',
- 'width' => '10',
- 'maxlength' => '10',
- 'rows' => '',
- 'cols' => ''
- ),
- 'limit_shell_user' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'ISINT',
- 'errmsg'=> 'limit_shell_user_error_notint'),
- ),
- 'default' => '-1',
- 'value' => '',
- 'separator' => '',
- 'width' => '10',
- 'maxlength' => '10',
- 'rows' => '',
- 'cols' => ''
- ),
- 'ssh_chroot' => array (
- 'datatype' => 'VARCHAR',
- 'formtype' => 'CHECKBOXARRAY',
- 'default' => '',
- 'separator' => ',',
- 'value' => array('no' => 'None', 'jailkit' => 'Jailkit')
- ),
- 'default_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_zone' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'ISINT',
- 'errmsg'=> 'limit_dns_zone_error_notint'),
- ),
- 'default' => '-1',
- 'value' => '',
- 'separator' => '',
- 'width' => '10',
- 'maxlength' => '10',
- 'rows' => '',
- 'cols' => ''
- ),
- 'limit_dns_record' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'ISINT',
- 'errmsg'=> 'limit_dns_record_error_notint'),
- ),
- 'default' => '-1',
- 'value' => '',
- 'separator' => '',
- 'width' => '10',
- 'maxlength' => '10',
- 'rows' => '',
- 'cols' => ''
- ),
- 'limit_client' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'ISINT',
- 'errmsg'=> 'limit_client_error_notint'),
- ),
- 'default' => '0',
- 'value' => '',
- 'separator' => '',
- 'width' => '10',
- 'maxlength' => '10',
- 'rows' => '',
- 'cols' => ''
- ),
- 'default_dbserver' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'SELECT',
- 'default' => '1',
- 'datasource' => array ( 'type' => 'SQL',
- 'querystring' => 'SELECT server_id,server_name FROM server WHERE db_server = 1 AND {AUTHSQL} ORDER BY server_name',
- 'keyfield'=> 'server_id',
- 'valuefield'=> 'server_name'
- ),
- 'value' => ''
- ),
- 'limit_database' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'ISINT',
- 'errmsg'=> 'limit_database_error_notint'),
- ),
- 'default' => '-1',
- 'value' => '',
- 'separator' => '',
- 'width' => '10',
- 'maxlength' => '10',
- 'rows' => '',
- 'cols' => ''
- ),
- ##################################
- # END Datatable fields
- ##################################
- )
-);
-
-/*
-$form["tabs"]['ipaddress'] = array (
- 'title' => "IP Addresses",
- 'width' => 100,
- 'template' => "templates/client_edit_ipaddress.htm",
- 'fields' => array (
- ##################################
- # Beginn Datatable fields
- ##################################
- 'ip_address' => array (
- 'datatype' => 'TEXT',
- 'formtype' => 'CHECKBOXARRAY',
- 'default' => '',
- 'value' => array('192.168.0.1' => '192.168.0.1', '192.168.0.2' => '192.168.0.2'),
- 'separator' => ';'
- ),
- ##################################
- # ENDE Datatable fields
- ##################################
- )
-);
-*/
-
-
+<?php
+
+/*
+ Form Definition
+
+ Tabledefinition
+
+ Datatypes:
+ - INTEGER (Forces the input to Int)
+ - DOUBLE
+ - CURRENCY (Formats the values to currency notation)
+ - VARCHAR (no format check, maxlength: 255)
+ - TEXT (no format check)
+ - DATE (Dateformat, automatic conversion to timestamps)
+
+ Formtype:
+ - TEXT (Textfield)
+ - TEXTAREA (Textarea)
+ - PASSWORD (Password textfield, input is not shown when edited)
+ - SELECT (Select option field)
+ - RADIO
+ - CHECKBOX
+ - CHECKBOXARRAY
+ - FILE
+
+ VALUE:
+ - Wert oder Array
+
+ Hint:
+ The ID field of the database table is not part of the datafield definition.
+ The ID field must be always auto incement (int or bigint).
+
+
+*/
+
+$form["title"] = "Client";
+$form["description"] = "";
+$form["name"] = "client";
+$form["action"] = "client_edit.php";
+$form["db_table"] = "client";
+$form["db_table_idx"] = "client_id";
+$form["db_history"] = "yes";
+$form["tab_default"] = "address";
+$form["list_default"] = "client_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
+
+//* Languages
+$language_list = array();
+$handle = @opendir(ISPC_ROOT_PATH.'/lib/lang');
+while ($file = @readdir ($handle)) {
+ if ($file != '.' && $file != '..') {
+ if(@is_file(ISPC_ROOT_PATH.'/lib/lang/'.$file) and substr($file,-4,4) == '.lng') {
+ $tmp = substr($file, 0, 2);
+ $language_list[$tmp] = $tmp;
+ }
+ }
+}
+
+$form["tabs"]['address'] = array (
+ 'title' => "Address",
+ 'width' => 100,
+ 'template' => "templates/client_edit_address.htm",
+ 'fields' => array (
+ ##################################
+ # Begin Datatable fields
+ ##################################
+ 'company_name' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'contact_name' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY',
+ 'errmsg'=> 'contact_error_empty'),
+ ),
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'username' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY',
+ 'errmsg'=> 'username_error_empty'),
+ 1 => array ( 'type' => 'CUSTOM',
+ 'class' => 'validate_client',
+ 'function' => 'username_unique',
+ 'errmsg'=> 'username_error_unique'),
+ 2 => array ( 'type' => 'REGEX',
+ 'regex' => '/^[\w\.\-\_]{0,64}$/',
+ 'errmsg'=> 'username_error_regex'),
+ ),
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'password' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'PASSWORD',
+ 'encryption'=> 'CRYPT',
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'language' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'SELECT',
+ 'default' => $conf["language"],
+ 'value' => $language_list,
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'usertheme' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'SELECT',
+ 'default' => 'default',
+ 'value' => array('default' => 'default'),
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'street' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'zip' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'city' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'state' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'country' => array (
+ 'datatype' => 'VARCHAR',
+
+ 'formtype' => 'SELECT',
+ 'default' => 'DE',
+ 'datasource' => array ( 'type' => 'SQL',
+ 'querystring' => 'SELECT iso,printable_name FROM country ORDER BY printable_name',
+ 'keyfield'=> 'iso',
+ 'valuefield'=> 'printable_name'
+ ),
+ 'value' => ''
+ ),
+ 'telephone' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'mobile' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'fax' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'email' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'internet' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => 'http://',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'icq' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'notes' => array (
+ 'datatype' => 'TEXT',
+ 'formtype' => 'TEXTAREA',
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '',
+ 'maxlength' => '',
+ 'rows' => '10',
+ 'cols' => '30'
+ ),
+ ##################################
+ # END Datatable fields
+ ##################################
+ )
+);
+
+$form["tabs"]['limits'] = array (
+ 'title' => "Limits",
+ 'width' => 80,
+ 'template' => "templates/client_edit_limits.htm",
+ 'fields' => array (
+ ##################################
+ # Begin Datatable fields
+ ##################################
+ 'template_master' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'SELECT',
+ 'default' => '1',
+ 'datasource' => array ( 'type' => 'CUSTOM',
+ 'class'=> 'custom_datasource',
+ 'function'=> 'master_templates'
+ ),
+ 'value' => ''
+ ),
+ 'template_additional' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ ),
+ 'default_mailserver' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'SELECT',
+ 'default' => '1',
+ 'datasource' => array ( 'type' => 'CUSTOM',
+ 'class'=> 'custom_datasource',
+ 'function'=> 'client_servers'
+ ),
+ 'value' => '',
+ 'name' => 'default_mailserver'
+ ),
+ 'limit_maildomain' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_maildomain_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_mailbox' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_mailbox_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_mailalias' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_mailalias_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_mailforward' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_mailforward_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_mailcatchall' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_mailcatchall_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_mailrouting' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_mailrouting_error_notint'),
+ ),
+ 'default' => '0',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_mailfilter' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_mailfilter_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_fetchmail' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_mailfetchmail_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_mailquota' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_mailquota_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_spamfilter_wblist' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_spamfilter_wblist_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_spamfilter_user' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_spamfilter_user_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_spamfilter_policy' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_spamfilter_policy_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'default_webserver' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'SELECT',
+ 'default' => '1',
+ 'datasource' => array ( 'type' => 'CUSTOM',
+ 'class'=> 'custom_datasource',
+ 'function'=> 'client_servers'
+ ),
+ 'value' => '',
+ 'name' => 'default_webserver'
+ ),
+ 'limit_web_domain' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_web_domain_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'web_php_options' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'CHECKBOXARRAY',
+ 'default' => '',
+ 'separator' => ',',
+ 'valuelimit' => 'client:web_php_options',
+ 'value' => array('no' => 'Disabled', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP')
+ ),
+ 'limit_web_aliasdomain' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_web_aliasdomain_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_web_subdomain' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_web_subdomain_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_ftp_user' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_ftp_user_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_shell_user' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_shell_user_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'ssh_chroot' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'CHECKBOXARRAY',
+ 'default' => '',
+ 'separator' => ',',
+ 'valuelimit' => 'client:ssh_chroot',
+ 'value' => array('no' => 'None', 'jailkit' => 'Jailkit')
+ ),
+ 'default_dnsserver' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'SELECT',
+ 'default' => '1',
+ 'datasource' => array ( 'type' => 'CUSTOM',
+ 'class'=> 'custom_datasource',
+ 'function'=> 'client_servers'
+ ),
+ 'value' => '',
+ 'name' => 'default_dnsserver'
+ ),
+ 'limit_dns_zone' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_dns_zone_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_dns_record' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_dns_record_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_client' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_client_error_notint'),
+ ),
+ 'default' => '0',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'default_dbserver' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'SELECT',
+ 'default' => '1',
+ 'datasource' => array ( 'type' => 'CUSTOM',
+ 'class'=> 'custom_datasource',
+ 'function'=> 'client_servers'
+ ),
+ 'value' => '',
+ 'name' => 'default_dbserver'
+ ),
+ 'limit_database' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_database_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_cron' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_cron_error_notint'),
+ ),
+ 'default' => '0',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_cron_type' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'SELECT',
+ 'default' => '',
+ 'value' => array('full' => 'Full Cron','chrooted' => 'Chrooted Cron','url' => 'URL Cron')
+ ),
+ 'limit_cron_frequency' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_cron_error_frequency'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ ##################################
+ # END Datatable fields
+ ##################################
+ )
+);
+
+/*
+$form["tabs"]['ipaddress'] = array (
+ 'title' => "IP Addresses",
+ 'width' => 100,
+ 'template' => "templates/client_edit_ipaddress.htm",
+ 'fields' => array (
+ ##################################
+ # Beginn Datatable fields
+ ##################################
+ 'ip_address' => array (
+ 'datatype' => 'TEXT',
+ 'formtype' => 'CHECKBOXARRAY',
+ 'default' => '',
+ 'value' => array('192.168.0.1' => '192.168.0.1', '192.168.0.2' => '192.168.0.2'),
+ 'separator' => ';'
+ ),
+ ##################################
+ # ENDE Datatable fields
+ ##################################
+ )
+);
+*/
+
+
?>
\ No newline at end of file
diff --git a/interface/web/client/form/client_template.tform.php b/interface/web/client/form/client_template.tform.php
index f732faf..5f34c58 100644
--- a/interface/web/client/form/client_template.tform.php
+++ b/interface/web/client/form/client_template.tform.php
@@ -367,6 +367,7 @@
'rows' => '',
'cols' => ''
),
+ /*
'limit_client' => array (
'datatype' => 'INTEGER',
'formtype' => 'TEXT',
@@ -381,6 +382,7 @@
'rows' => '',
'cols' => ''
),
+ */
'limit_database' => array (
'datatype' => 'INTEGER',
'formtype' => 'TEXT',
@@ -395,6 +397,40 @@
'rows' => '',
'cols' => ''
),
+ 'limit_cron' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_cron_error_notint'),
+ ),
+ 'default' => '0',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_cron_type' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'SELECT',
+ 'default' => '',
+ 'value' => array('full' => 'Full Cron','chrooted' => 'Chrooted Cron','url' => 'URL Cron')
+ ),
+ 'limit_cron_frequency' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_cron_error_frequency'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
##################################
# END Datatable fields
##################################
diff --git a/interface/web/client/form/reseller.tform.php b/interface/web/client/form/reseller.tform.php
new file mode 100644
index 0000000..d069e00
--- /dev/null
+++ b/interface/web/client/form/reseller.tform.php
@@ -0,0 +1,733 @@
+<?php
+
+/*
+ Form Definition
+
+ Tabledefinition
+
+ Datatypes:
+ - INTEGER (Forces the input to Int)
+ - DOUBLE
+ - CURRENCY (Formats the values to currency notation)
+ - VARCHAR (no format check, maxlength: 255)
+ - TEXT (no format check)
+ - DATE (Dateformat, automatic conversion to timestamps)
+
+ Formtype:
+ - TEXT (Textfield)
+ - TEXTAREA (Textarea)
+ - PASSWORD (Password textfield, input is not shown when edited)
+ - SELECT (Select option field)
+ - RADIO
+ - CHECKBOX
+ - CHECKBOXARRAY
+ - FILE
+
+ VALUE:
+ - Wert oder Array
+
+ Hint:
+ The ID field of the database table is not part of the datafield definition.
+ The ID field must be always auto incement (int or bigint).
+
+
+*/
+
+$form["title"] = "Reseller";
+$form["description"] = "";
+$form["name"] = "reseller";
+$form["action"] = "reseller_edit.php";
+$form["db_table"] = "client";
+$form["db_table_idx"] = "client_id";
+$form["db_history"] = "yes";
+$form["tab_default"] = "address";
+$form["list_default"] = "reseller_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
+
+//* Languages
+$language_list = array();
+$handle = @opendir(ISPC_ROOT_PATH.'/lib/lang');
+while ($file = @readdir ($handle)) {
+ if ($file != '.' && $file != '..') {
+ if(@is_file(ISPC_ROOT_PATH.'/lib/lang/'.$file) and substr($file,-4,4) == '.lng') {
+ $tmp = substr($file, 0, 2);
+ $language_list[$tmp] = $tmp;
+ }
+ }
+}
+
+$form["tabs"]['address'] = array (
+ 'title' => "Address",
+ 'width' => 100,
+ 'template' => "templates/reseller_edit_address.htm",
+ 'fields' => array (
+ ##################################
+ # Begin Datatable fields
+ ##################################
+ 'company_name' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'contact_name' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY',
+ 'errmsg'=> 'contact_error_empty'),
+ ),
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'username' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY',
+ 'errmsg'=> 'username_error_empty'),
+ 1 => array ( 'type' => 'CUSTOM',
+ 'class' => 'validate_client',
+ 'function' => 'username_unique',
+ 'errmsg'=> 'username_error_unique'),
+ 2 => array ( 'type' => 'REGEX',
+ 'regex' => '/^[\w\.\-\_]{0,64}$/',
+ 'errmsg'=> 'username_error_regex'),
+ ),
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'password' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'PASSWORD',
+ 'encryption'=> 'CRYPT',
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'language' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'SELECT',
+ 'default' => $conf["language"],
+ 'value' => $language_list,
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'usertheme' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'SELECT',
+ 'default' => 'default',
+ 'value' => array('default' => 'default'),
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'street' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'zip' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'city' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'state' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'country' => array (
+ 'datatype' => 'VARCHAR',
+
+ 'formtype' => 'SELECT',
+ 'default' => 'DE',
+ 'datasource' => array ( 'type' => 'SQL',
+ 'querystring' => 'SELECT iso,printable_name FROM country ORDER BY printable_name',
+ 'keyfield'=> 'iso',
+ 'valuefield'=> 'printable_name'
+ ),
+ 'value' => ''
+ ),
+ 'telephone' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'mobile' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'fax' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'email' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'internet' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => 'http://',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'icq' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '30',
+ 'maxlength' => '255',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'notes' => array (
+ 'datatype' => 'TEXT',
+ 'formtype' => 'TEXTAREA',
+ 'default' => '',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '',
+ 'maxlength' => '',
+ 'rows' => '10',
+ 'cols' => '30'
+ ),
+ ##################################
+ # END Datatable fields
+ ##################################
+ )
+);
+
+$form["tabs"]['limits'] = array (
+ 'title' => "Limits",
+ 'width' => 80,
+ 'template' => "templates/reseller_edit_limits.htm",
+ 'fields' => array (
+ ##################################
+ # Begin Datatable fields
+ ##################################
+ 'template_master' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'SELECT',
+ 'default' => '1',
+ 'datasource' => array ( 'type' => 'CUSTOM',
+ 'class'=> 'custom_datasource',
+ 'function'=> 'master_templates'
+ ),
+ 'value' => ''
+ ),
+ 'template_additional' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ ),
+ 'default_mailserver' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'SELECT',
+ 'default' => '1',
+ 'datasource' => array ( 'type' => 'SQL',
+ 'querystring' => 'SELECT server_id,server_name FROM server WHERE mail_server = 1 AND {AUTHSQL} ORDER BY server_name',
+ 'keyfield'=> 'server_id',
+ 'valuefield'=> 'server_name'
+ ),
+ 'value' => ''
+ ),
+ 'limit_maildomain' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_maildomain_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_mailbox' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_mailbox_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_mailalias' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_mailalias_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_mailforward' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_mailforward_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_mailcatchall' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_mailcatchall_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_mailrouting' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_mailrouting_error_notint'),
+ ),
+ 'default' => '0',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_mailfilter' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_mailfilter_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_fetchmail' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_mailfetchmail_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_mailquota' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_mailquota_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_spamfilter_wblist' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_spamfilter_wblist_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_spamfilter_user' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_spamfilter_user_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_spamfilter_policy' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_spamfilter_policy_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'default_webserver' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'SELECT',
+ 'default' => '1',
+ 'datasource' => array ( 'type' => 'SQL',
+ 'querystring' => 'SELECT server_id,server_name FROM server WHERE web_server = 1 AND {AUTHSQL} ORDER BY server_name',
+ 'keyfield'=> 'server_id',
+ 'valuefield'=> 'server_name'
+ ),
+ 'value' => ''
+ ),
+ 'limit_web_domain' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_web_domain_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'web_php_options' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'CHECKBOXARRAY',
+ 'default' => '',
+ 'separator' => ',',
+ 'value' => array('no' => 'Disabled', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP')
+ ),
+ 'limit_web_aliasdomain' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_web_aliasdomain_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_web_subdomain' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_web_subdomain_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_ftp_user' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_ftp_user_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_shell_user' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_shell_user_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'ssh_chroot' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'CHECKBOXARRAY',
+ 'default' => '',
+ 'separator' => ',',
+ 'value' => array('no' => 'None', 'jailkit' => 'Jailkit')
+ ),
+ 'default_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_zone' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_dns_zone_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_dns_record' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_dns_record_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_client' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_client_error_notint'),
+ 1 => array ( 'type' => 'CUSTOM',
+ 'class' => 'validate_reseller',
+ 'function' => 'limit_client'),
+ ),
+ 'default' => '1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'default_dbserver' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'SELECT',
+ 'default' => '1',
+ 'datasource' => array ( 'type' => 'SQL',
+ 'querystring' => 'SELECT server_id,server_name FROM server WHERE db_server = 1 AND {AUTHSQL} ORDER BY server_name',
+ 'keyfield'=> 'server_id',
+ 'valuefield'=> 'server_name'
+ ),
+ 'value' => ''
+ ),
+ 'limit_database' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_database_error_notint'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_cron' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_cron_error_notint'),
+ ),
+ 'default' => '0',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ 'limit_cron_type' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'SELECT',
+ 'default' => '',
+ 'value' => array('full' => 'Full Cron','chrooted' => 'Chrooted Cron','url' => 'URL Cron')
+ ),
+ 'limit_cron_frequency' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'ISINT',
+ 'errmsg'=> 'limit_cron_error_frequency'),
+ ),
+ 'default' => '-1',
+ 'value' => '',
+ 'separator' => '',
+ 'width' => '10',
+ 'maxlength' => '10',
+ 'rows' => '',
+ 'cols' => ''
+ ),
+ ##################################
+ # END Datatable fields
+ ##################################
+ )
+);
+
+/*
+$form["tabs"]['ipaddress'] = array (
+ 'title' => "IP Addresses",
+ 'width' => 100,
+ 'template' => "templates/client_edit_ipaddress.htm",
+ 'fields' => array (
+ ##################################
+ # Beginn Datatable fields
+ ##################################
+ 'ip_address' => array (
+ 'datatype' => 'TEXT',
+ 'formtype' => 'CHECKBOXARRAY',
+ 'default' => '',
+ 'value' => array('192.168.0.1' => '192.168.0.1', '192.168.0.2' => '192.168.0.2'),
+ 'separator' => ';'
+ ),
+ ##################################
+ # ENDE Datatable fields
+ ##################################
+ )
+);
+*/
+
+
+?>
\ No newline at end of file
diff --git a/interface/web/client/lib/lang/bg_client.lng b/interface/web/client/lib/lang/bg_client.lng
index ea51e62..2fbb064 100644
--- a/interface/web/client/lib/lang/bg_client.lng
+++ b/interface/web/client/lib/lang/bg_client.lng
@@ -80,4 +80,10 @@
$wb['template_additional_txt'] = 'Addon';
$wb['ssh_chroot_txt'] = 'SSH-Chroot Options';
$wb['web_php_options_txt'] = 'PHP Options';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$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['limit_client_error'] = 'The max. number of clients is reached.';
?>
diff --git a/interface/web/client/lib/lang/bg_client_template.lng b/interface/web/client/lib/lang/bg_client_template.lng
index 6e1aff0..c3cdfc0 100644
--- a/interface/web/client/lib/lang/bg_client_template.lng
+++ b/interface/web/client/lib/lang/bg_client_template.lng
@@ -44,4 +44,9 @@
$wb['limit_dns_zone_error_notint'] = 'The dns record limit must be a number.';
$wb['limit_database_error_notint'] = 'The database limit must be a number.';
$wb['error_template_name_empty'] = 'Please enter a Template name';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$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.';
?>
diff --git a/interface/web/client/lib/lang/br.lng b/interface/web/client/lib/lang/br.lng
new file mode 100644
index 0000000..6aed105
--- /dev/null
+++ b/interface/web/client/lib/lang/br.lng
@@ -0,0 +1,10 @@
+<?php
+$wb['Client'] = 'Cliente';
+$wb['Address'] = 'Endereço';
+$wb['Limits'] = 'Limites';
+$wb['Add Client'] = 'Adcionar Cliente';
+$wb['Edit Client'] = 'Editar Cliente';
+$wb['Clients'] = 'Clientes';
+$wb['Edit Client-Templates'] = 'Editar Gabaritos de Clientes';
+?>
+
diff --git a/interface/web/client/lib/lang/br_client.lng b/interface/web/client/lib/lang/br_client.lng
new file mode 100644
index 0000000..5391c13
--- /dev/null
+++ b/interface/web/client/lib/lang/br_client.lng
@@ -0,0 +1,85 @@
+<?php
+$wb['limit_maildomain_txt'] = 'Número máximo de domínios de correio';
+$wb['limit_mailbox_txt'] = 'Número máximo de caixas de correio';
+$wb['limit_mailalias_txt'] = 'Número máximo de aliases de correio';
+$wb['limit_mailforward_txt'] = 'Número máximo de redirecionamento de correio';
+$wb['limit_mailcatchall_txt'] = 'Número máximo de catchall de correio';
+$wb['limit_mailrouting_txt'] = 'Número máximo de rotas de correio';
+$wb['limit_mailfilter_txt'] = 'Número máximo de filtros de correio';
+$wb['limit_fetchmail_txt'] = 'Número máximo de fetchmail de correio';
+$wb['limit_mailquota_txt'] = 'Quota de Correio';
+$wb['limit_spamfilter_wblist_txt'] = 'Número máximo de filtros spam lista branca / negra';
+$wb['limit_spamfilter_user_txt'] = 'Número máximo de usuários de filtros spam';
+$wb['limit_spamfilter_policy_txt'] = 'Número máximo de políticas de filtros spam';
+$wb['default_mailserver_txt'] = 'Servidor de Correio Padrão';
+$wb['company_name_txt'] = 'Empresa';
+$wb['contact_name_txt'] = 'Contato';
+$wb['username_txt'] = 'Nome de Usuário';
+$wb['password_txt'] = 'Senha';
+$wb['password_strength_txt'] = 'Segurança da senha';
+$wb['language_txt'] = 'Idioma';
+$wb['usertheme_txt'] = 'Tema';
+$wb['street_txt'] = 'Rua';
+$wb['zip_txt'] = 'CEP';
+$wb['city_txt'] = 'Cidade';
+$wb['state_txt'] = 'Estado';
+$wb['country_txt'] = 'Pais';
+$wb['telephone_txt'] = 'Telefone';
+$wb['mobile_txt'] = 'Celular';
+$wb['fax_txt'] = 'Fax';
+$wb['email_txt'] = 'Correio Eletrônico';
+$wb['internet_txt'] = 'Internet';
+$wb['icq_txt'] = 'ICQ';
+$wb['notes_txt'] = 'Notas';
+$wb['company_txt'] = 'Empresa';
+$wb['title_txt'] = 'Título';
+$wb['firstname_txt'] = 'Nome';
+$wb['surname_txt'] = 'Sobrenome';
+$wb['limit_domain_txt'] = 'limite_dominio';
+$wb['limit_subdomain_txt'] = 'limit_subdominio';
+$wb['limit_webquota_txt'] = 'limit_webquota';
+$wb['limit_database_txt'] = 'Número máximo de banco de dados';
+$wb['ip_address_txt'] = 'endereco_ip';
+$wb['limit_client_error_notint'] = 'O limite de um sub-cliente deve ser um número';
+$wb['firstname_error_empty'] = 'Nome está em branco.';
+$wb['contact_error_empty'] = 'Contato está em branco.';
+$wb['default_webserver_txt'] = 'Servidor Web Padrão';
+$wb['limit_web_domain_txt'] = 'Número máximo de domínios web';
+$wb['limit_web_aliasdomain_txt'] = 'Número máximo de domínios alias';
+$wb['limit_web_subdomain_txt'] = 'Número máximo de sub-domínios';
+$wb['limit_ftp_user_txt'] = 'Número máximo de usuários FTP';
+$wb['default_dnsserver_txt'] = 'Servidor de Nomes Padrão';
+$wb['limit_dns_zone_txt'] = 'Número máximo de zonas DNS';
+$wb['limit_dns_record_txt'] = 'Número máximo de registros DNS';
+$wb['limit_shell_user_txt'] = 'Número máximo de usuários de shell';
+$wb['limit_client_txt'] = 'Número máximo de clientes';
+$wb['username_error_empty'] = 'Nome do usuário está em branco';
+$wb['username_error_unique'] = 'O nome do usuário deve ser único';
+$wb['limit_maildomain_error_notint'] = 'O limite de caixas de correio no domínio deve ser um número.';
+$wb['limit_mailbox_error_notint'] = 'Limite da caixa de correio deve ser um número.';
+$wb['limit_mailalias_error_notint'] = 'Limite do aliase de correio deve ser um número.';
+$wb['limit_mailforward_error_notint'] = 'Limite de redirecionamento de correio deve ser um número';
+$wb['limit_mailcatchall_error_notint'] = 'Limite de catchall deve ser um número.';
+$wb['limit_mailrouting_error_notint'] = 'Limite de rotas de correio deve ser um número.';
+$wb['limit_mailfilter_error_notint'] = 'Limite de filtros de correio deve ser um número.';
+$wb['limit_mailfetchmail_error_notint'] = 'Limite de fetchmail deve ser um número.';
+$wb['limit_mailquota_error_notint'] = 'A quota de correio deve ser um número';
+$wb['limit_spamfilter_wblist_error_notint'] = 'O limite de filtros spam lista branca / negra deve ser um número.';
+$wb['limit_spamfilter_user_error_notint'] = 'O limite de filtros spam do usuário deve ser um número.';
+$wb['limit_spamfilter_policy_error_notint'] = 'O limite de políticas de filtros spam deve ser um número.';
+$wb['limit_web_domain_error_notint'] = 'O limite de sites deve ser um número.';
+$wb['limit_web_aliasdomain_error_notint'] = 'O limite de alias de domínios de sites deve ser um número.';
+$wb['limit_web_subdomain_error_notint'] = 'O limite de sub-domínios de sites deve ser um número';
+$wb['limit_ftp_user_error_notint'] = 'O limite de usuários de FTP deve ser um número.';
+$wb['limit_shell_user_error_notint'] = 'O limite de usuários de Shell deve ser um número.';
+$wb['limit_dns_zone_error_notint'] = 'O limite de registros de DNS deve ser um número';
+$wb['default_dbserver_txt'] = 'Servidor de Banco de Dados Padrão';
+$wb['limit_database_error_notint'] = 'O limite de banco de dados deve ser um número';
+$wb['username_error_regex'] = 'O nome de usuário contem caracteres inválidos.';
+$wb['template_master_txt'] = 'Gabarito Principal';
+$wb['template_additional_txt'] = 'Template Adcional';
+$wb['ssh_chroot_txt'] = 'Opções de SSH Chroot';
+$wb['web_php_options_txt'] = 'Opções do PHP';
+$wb['limit_client_error'] = 'O número máximo de clientes foi atingido.';
+?>
+
diff --git a/interface/web/client/lib/lang/br_client_template.lng b/interface/web/client/lib/lang/br_client_template.lng
new file mode 100644
index 0000000..45a3b3e
--- /dev/null
+++ b/interface/web/client/lib/lang/br_client_template.lng
@@ -0,0 +1,48 @@
+<?php
+$wb['limit_client_error_notint'] = 'O limite do cliente não é um número.';
+$wb['limit_maildomain_txt'] = 'Limite Máximo de domínios de correio';
+$wb['limit_mailbox_txt'] = 'Limite Máximo de caixas de correio';
+$wb['limit_mailalias_txt'] = 'Limite Máximo de alias de correio';
+$wb['limit_mailforward_txt'] = 'Limite Máximo de redirecionamentos de correio';
+$wb['limit_mailcatchall_txt'] = 'Limite máximo de contas catchall';
+$wb['limit_mailrouting_txt'] = 'Limite máximo de rotas de Correio';
+$wb['limit_mailfilter_txt'] = 'Número Máximo de Filtros de Correio';
+$wb['limit_fetchmail_txt'] = 'Número Máximo de Contas fetchmail';
+$wb['limit_mailquota_txt'] = 'Espaço de Caixa de Correio';
+$wb['limit_spamfilter_wblist_txt'] = 'Número máximo de spamfilter permitidos /lista negra';
+$wb['limit_spamfilter_user_txt'] = 'Número máx de usuários spamfilter';
+$wb['limit_spamfilter_policy_txt'] = 'Número máx de políticas spamfilter';
+$wb['limit_domain_txt'] = 'limite_dominio';
+$wb['limit_subdomain_txt'] = 'limite_subdominio';
+$wb['limit_webquota_txt'] = 'limite_webquota';
+$wb['limit_database_txt'] = 'Número máximo de banco de dados';
+$wb['limit_web_domain_txt'] = 'Número máximo de domínios web';
+$wb['limit_web_aliasdomain_txt'] = 'Número maximo de apelidos web';
+$wb['limit_web_subdomain_txt'] = 'Número máximo de sub-domínios';
+$wb['limit_ftp_user_txt'] = 'Número máximo de usuários de FTP';
+$wb['limit_dns_zone_txt'] = 'Número máximo de zonas DNS';
+$wb['limit_dns_record_txt'] = 'Número máximo de registros DNS';
+$wb['limit_shell_user_txt'] = 'Número máximo de usuários de Shell';
+$wb['limit_client_txt'] = 'Número máximo de clientes';
+$wb['limit_maildomain_error_notint'] = 'O limite de correio de domínio deve ser numérico';
+$wb['limit_mailbox_error_notint'] = 'O limite da caixa de correio deve ser numérico';
+$wb['limit_mailalias_error_notint'] = 'O limite do apelido de correio deve ser númerico';
+$wb['limit_mailforward_error_notint'] = 'O limite de direcionamento de correio deve ser um número';
+$wb['limit_mailcatchall_error_notint'] = 'O limite de catchall do domínio deve ser um número';
+$wb['limit_mailrouting_error_notint'] = 'Limite de rota de correio deve ser um número';
+$wb['limit_mailfilter_error_notint'] = 'O limite de filtro de correio deve ser um número.';
+$wb['limit_mailfetchmail_error_notint'] = 'Limite fetchmail deve ser um número.';
+$wb['limit_mailquota_error_notint'] = 'Cota de correio deve ser um número.';
+$wb['limit_spamfilter_wblist_error_notint'] = 'O limite de spamfilter permitido / lista negra deve ser um número';
+$wb['limit_spamfilter_user_error_notint'] = 'O limite do spamfilter deve ser um número.';
+$wb['limit_spamfilter_policy_error_notint'] = 'O limite da política do spamfilter deve ser um número.';
+$wb['limit_web_domain_error_notint'] = 'O limite de websites deve ser um número';
+$wb['limit_web_aliasdomain_error_notint'] = 'O limite de apelidos de domínio deve ser um número';
+$wb['limit_web_subdomain_error_notint'] = 'O limite de sub-domínios deve ser um número';
+$wb['limit_ftp_user_error_notint'] = 'O limite de contas FTP deve ser um número';
+$wb['limit_shell_user_error_notint'] = 'O limite de contas shell DNS deve ser um número';
+$wb['limit_dns_zone_error_notint'] = 'O limite de zonas DNS deve ser um número';
+$wb['limit_database_error_notint'] = 'O limite dos bancos de dados deve ser um número';
+$wb['error_template_name_empty'] = 'Por favor insira o nome do gabarito';
+?>
+
diff --git a/interface/web/client/lib/lang/br_client_template_list.lng b/interface/web/client/lib/lang/br_client_template_list.lng
new file mode 100644
index 0000000..3f9dd52
--- /dev/null
+++ b/interface/web/client/lib/lang/br_client_template_list.lng
@@ -0,0 +1,6 @@
+<?php
+$wb['list_head_txt'] = 'Gabarito de Cliente ';
+$wb['template_type_txt'] = 'Tipo';
+$wb['template_name_txt'] = 'Nome do Gabarito';
+?>
+
diff --git a/interface/web/client/lib/lang/br_clients_list.lng b/interface/web/client/lib/lang/br_clients_list.lng
new file mode 100644
index 0000000..db70b35
--- /dev/null
+++ b/interface/web/client/lib/lang/br_clients_list.lng
@@ -0,0 +1,10 @@
+<?php
+$wb['list_head_txt'] = 'Clientes';
+$wb['client_id_txt'] = 'ID';
+$wb['company_name_txt'] = 'Empresa';
+$wb['contact_name_txt'] = 'Nome do contato';
+$wb['city_txt'] = 'Cidade';
+$wb['country_txt'] = 'Pais';
+$wb['add_new_record_txt'] = 'Adcionar novo cliente';
+?>
+
diff --git a/interface/web/client/lib/lang/de_client.lng b/interface/web/client/lib/lang/de_client.lng
index 05fad56..2e3bf4c 100644
--- a/interface/web/client/lib/lang/de_client.lng
+++ b/interface/web/client/lib/lang/de_client.lng
@@ -39,6 +39,9 @@
$wb['limit_subdomain_txt'] = 'Max. Anzahl an Subdomains';
$wb['limit_webquota_txt'] = 'Max. Webquota';
$wb['limit_database_txt'] = 'Max. Anzahl an Datenbanken';
+$wb['limit_cron_txt'] = 'Max. Anzahl Cron Jobs';
+$wb['limit_cron_type_txt'] = 'Max. erlaubter Typ von Cron Jobs (chrooted und full erlauben auch url)';
+$wb['limit_cron_frequency_txt'] = 'Min. Abstand zwischen Ausführungen';
$wb['ip_address_txt'] = 'IP Adresse';
$wb['limit_client_error_notint'] = 'The sub client limit must be a number.';
$wb['firstname_error_empty'] = 'Vorname ist leer.';
@@ -74,10 +77,13 @@
$wb['limit_dns_zone_error_notint'] = 'Das DNS Einträge Limit muss eine Nummer sein.';
$wb['default_dbserver_txt'] = 'Standarddatenbankserver';
$wb['limit_database_error_notint'] = 'Das Datenbank Limit muss eine Nummer sein.';
+$wb['limit_cron_error_notint'] = 'Das Cron Job Limit muss eine Zahl sein.';
+$wb['limit_cron_error_frequency'] = 'Das Cron Job Intervall-Limit muss eine Zahl sein.';
$wb['username_error_regex'] = 'Der Benutzername enthält ungültige Zeichen.';
$wb['password_strength_txt'] = 'Passwortkomplexität';
$wb['template_master_txt'] = 'Master';
$wb['template_additional_txt'] = 'Addons';
$wb['ssh_chroot_txt'] = 'SSH-Chroot Optionen';
$wb['web_php_options_txt'] = 'PHP Optionen';
+$wb['limit_client_error'] = 'The max. number of clients is reached.';
?>
diff --git a/interface/web/client/lib/lang/de_client_template.lng b/interface/web/client/lib/lang/de_client_template.lng
index 8a29d47..3efd721 100644
--- a/interface/web/client/lib/lang/de_client_template.lng
+++ b/interface/web/client/lib/lang/de_client_template.lng
@@ -17,6 +17,9 @@
$wb['limit_subdomain_txt'] = 'Max. Anzahl an Subdomains';
$wb['limit_webquota_txt'] = 'Max. Webquota';
$wb['limit_database_txt'] = 'Max. Anzahl an Datenbanken';
+$wb['limit_cron_txt'] = 'Max. Anzahl Cron Jobs';
+$wb['limit_cron_type_txt'] = 'Max. erlaubter Typ von Cron Jobs (chrooted und full erlauben auch url)';
+$wb['limit_cron_frequency_txt'] = 'Min. Abstand zwischen Ausführungen';
$wb['limit_web_domain_txt'] = 'Max. Anzahl an Web Domains';
$wb['limit_web_aliasdomain_txt'] = 'Max. Anzahl an Web Aliasdomains';
$wb['limit_web_subdomain_txt'] = 'Max. Anzahl an Web Subdomains';
@@ -43,5 +46,7 @@
$wb['limit_shell_user_error_notint'] = 'Das Shell Benutzer Limit muss eine Nummer sein.';
$wb['limit_dns_zone_error_notint'] = 'Das DNS Einträge Limit muss eine Nummer sein.';
$wb['limit_database_error_notint'] = 'Das Datenbanken Limit muss eine Nummer sein.';
+$wb['limit_cron_error_notint'] = 'Das Cron Job Limit muss eine Zahl sein.';
+$wb['limit_cron_error_frequency'] = 'Das Cron Job Intervall-Limit muss eine Zahl sein.';
$wb['error_template_name_empty'] = 'Bitte geben sie einen Vorlagenamen ein';
?>
diff --git a/interface/web/client/lib/lang/en.lng b/interface/web/client/lib/lang/en.lng
index af8ccc2..e384def 100644
--- a/interface/web/client/lib/lang/en.lng
+++ b/interface/web/client/lib/lang/en.lng
@@ -6,4 +6,7 @@
$wb['Edit Client'] = 'Edit Client';
$wb['Clients'] = 'Clients';
$wb['Edit Client-Templates'] = 'Edit Client-Templates';
+$wb['Add Reseller'] = 'Add Reseller';
+$wb['Edit Reseller'] = 'Edit Reseller';
+$wb['Resellers'] = 'Resellers';
?>
\ No newline at end of file
diff --git a/interface/web/client/lib/lang/en_client.lng b/interface/web/client/lib/lang/en_client.lng
index 74c166f..03cec3f 100644
--- a/interface/web/client/lib/lang/en_client.lng
+++ b/interface/web/client/lib/lang/en_client.lng
@@ -39,6 +39,9 @@
$wb["limit_subdomain_txt"] = 'limit_subdomain';
$wb["limit_webquota_txt"] = 'limit_webquota';
$wb["limit_database_txt"] = 'limit_database';
+$wb["limit_cron_txt"] = 'Max. number of cron jobs';
+$wb["limit_cron_type_txt"] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb["limit_cron_frequency_txt"] = 'Min. delay between executions';
$wb["ip_address_txt"] = 'ip_address';
$wb["limit_client_error_notint"] = 'Client Limit is not a number.';
$wb["firstname_error_empty"] = 'Firstname is empty.';
@@ -78,6 +81,8 @@
$wb["default_dbserver_txt"] = 'Default Database Server';
$wb["limit_database_txt"] = 'Max. number of Databases';
$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["template_master_txt"] = 'Master template';
$wb["template_additional_txt"] = 'Addon template';
diff --git a/interface/web/client/lib/lang/en_client_template.lng b/interface/web/client/lib/lang/en_client_template.lng
index c3453a8..6d9ee11 100644
--- a/interface/web/client/lib/lang/en_client_template.lng
+++ b/interface/web/client/lib/lang/en_client_template.lng
@@ -17,6 +17,9 @@
$wb["limit_subdomain_txt"] = 'limit_subdomain';
$wb["limit_webquota_txt"] = 'limit_webquota';
$wb["limit_database_txt"] = 'limit_database';
+$wb["limit_cron_txt"] = 'Max. number of cron jobs';
+$wb["limit_cron_type_txt"] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb["limit_cron_frequency_txt"] = 'Min. delay between executions';
$wb["limit_web_domain_txt"] = 'Max. number of web domains';
$wb["limit_web_aliasdomain_txt"] = 'Max. number of web aliasdomains';
$wb["limit_web_subdomain_txt"] = 'Max. number of web subdomains';
@@ -46,5 +49,7 @@
$wb["limit_dns_zone_error_notint"] = 'The dns record limit must be a number.';
$wb["limit_database_txt"] = 'Max. number of Databases';
$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["error_template_name_empty"] = 'Please enter a Template name';
?>
\ No newline at end of file
diff --git a/interface/web/client/lib/lang/en_reseller.lng b/interface/web/client/lib/lang/en_reseller.lng
new file mode 100644
index 0000000..906fd44
--- /dev/null
+++ b/interface/web/client/lib/lang/en_reseller.lng
@@ -0,0 +1,93 @@
+<?php
+$wb["limit_maildomain_txt"] = 'Max. number of email domains';
+$wb["limit_mailbox_txt"] = 'Max. number of mailboxes';
+$wb["limit_mailalias_txt"] = 'Max. number of email aliases';
+$wb["limit_mailforward_txt"] = 'Max. number of email forwarders';
+$wb["limit_mailcatchall_txt"] = 'Max. number of email catchall accounts';
+$wb["limit_mailrouting_txt"] = 'Max. number of email routes';
+$wb["limit_mailfilter_txt"] = 'Max. number of email filters';
+$wb["limit_fetchmail_txt"] = 'Max. number of fetchmail accounts';
+$wb["limit_mailquota_txt"] = 'Mailbox quota';
+$wb["limit_spamfilter_wblist_txt"] = 'Max. number of spamfilter white / blacklist filters';
+$wb["limit_spamfilter_user_txt"] = 'Max. number of spamfilter users';
+$wb["limit_spamfilter_policy_txt"] = 'Max. number of spamfilter policys';
+$wb["default_mailserver_txt"] = 'Default Mailserver';
+$wb["company_name_txt"] = 'Company name';
+$wb["contact_name_txt"] = 'Contact name';
+$wb["username_txt"] = 'Username';
+$wb["password_txt"] = 'Password';
+$wb["password_strength_txt"] = 'Password strength';
+$wb["language_txt"] = 'Language';
+$wb["usertheme_txt"] = 'Theme';
+$wb["street_txt"] = 'Street';
+$wb["zip_txt"] = 'ZIP';
+$wb["city_txt"] = 'City';
+$wb["state_txt"] = 'State';
+$wb["country_txt"] = 'Country';
+$wb["telephone_txt"] = 'Telephone';
+$wb["mobile_txt"] = 'Mobile';
+$wb["fax_txt"] = 'Fax';
+$wb["email_txt"] = 'Email';
+$wb["internet_txt"] = 'Internet';
+$wb["icq_txt"] = 'ICQ';
+$wb["notes_txt"] = 'Notes';
+$wb["company_txt"] = 'Company';
+$wb["title_txt"] = 'Title';
+$wb["firstname_txt"] = 'Firstname';
+$wb["surname_txt"] = 'Surname';
+$wb["limit_domain_txt"] = 'limit_domain';
+$wb["limit_subdomain_txt"] = 'limit_subdomain';
+$wb["limit_webquota_txt"] = 'limit_webquota';
+$wb["limit_database_txt"] = 'limit_database';
+$wb["limit_cron_txt"] = 'Max. number of cron jobs';
+$wb["limit_cron_type_txt"] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb["limit_cron_frequency_txt"] = 'Min. delay between executions';
+$wb["ip_address_txt"] = 'ip_address';
+$wb["limit_client_error_notint"] = 'Client Limit is not a number.';
+$wb["firstname_error_empty"] = 'Firstname is empty.';
+$wb["contact_error_empty"] = 'Contact name is empty.';
+$wb["default_webserver_txt"] = 'Default Webserver';
+$wb["limit_web_domain_txt"] = 'Max. number of web domains';
+$wb["limit_web_aliasdomain_txt"] = 'Max. number of web aliasdomains';
+$wb["limit_web_subdomain_txt"] = 'Max. number of web subdomains';
+$wb["limit_ftp_user_txt"] = 'Max. number of FTP users';
+$wb["default_dnsserver_txt"] = 'Default DNS Server';
+$wb["limit_dns_zone_txt"] = 'Max. number of DNS zones';
+$wb["limit_dns_record_txt"] = 'Max. number DNS records';
+$wb["limit_shell_user_txt"] = 'Max. number of Shell users';
+$wb["limit_client_txt"] = 'Max. number of Clients';
+$wb["username_error_empty"] = 'Username is empty.';
+$wb["username_error_unique"] = 'The username must be unique.';
+$wb["limit_maildomain_error_notint"] = 'The email domain limit must be a number.';
+$wb["limit_mailbox_error_notint"] = 'The mailbox limit must be a number.';
+$wb["limit_mailalias_error_notint"] = 'The email alias limit must be a number.';
+$wb["limit_mailforward_error_notint"] = 'The email forward limit must be a number.';
+$wb["limit_mailcatchall_error_notint"] = 'The email catchall limit must be a number.';
+$wb["limit_mailrouting_error_notint"] = 'The email routing limit must be a number.';
+$wb["limit_mailfilter_error_notint"] = 'The email filter limit must be a number.';
+$wb["limit_mailfetchmail_error_notint"] = 'The fetchmail limit must be a number.';
+$wb["limit_mailquota_error_notint"] = 'The email quota limit must be a number.';
+$wb["limit_spamfilter_wblist_error_notint"] = 'The spamfilter white / blacklist limit must be a number.';
+$wb["limit_spamfilter_user_error_notint"] = 'The spamfilter user limit must be a number.';
+$wb["limit_spamfilter_policy_error_notint"] = 'The spamfilter policy limit must be a number.';
+$wb["limit_web_domain_error_notint"] = 'The website limit must be a number.';
+$wb["limit_web_aliasdomain_error_notint"] = 'The website alias domain limit must be a number.';
+$wb["limit_web_subdomain_error_notint"] = 'The website subdomain limit must be a number.';
+$wb["limit_ftp_user_error_notint"] = 'The ftp user limit must be a number.';
+$wb["limit_shell_user_error_notint"] = 'The shell user limit must be a number.';
+$wb["limit_dns_zone_error_notint"] = 'The dns zone limit must be a number.';
+$wb["limit_dns_zone_error_notint"] = 'The dns record limit must be a number.';
+$wb["limit_client_error_notint"] = 'The sub client limit must be a number.';
+$wb["default_dbserver_txt"] = 'Default Database Server';
+$wb["limit_database_txt"] = 'Max. number of Databases';
+$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["template_master_txt"] = 'Master template';
+$wb["template_additional_txt"] = 'Addon template';
+$wb["ssh_chroot_txt"] = 'SSH-Chroot Options';
+$wb["web_php_options_txt"] = 'PHP Options';
+$wb["limit_client_error"] = 'The max. number of clients is reached.';
+$wb["limit_client_error_positive"] = 'The number of clients must be > 0';
+?>
diff --git a/interface/web/client/lib/lang/en_resellers_list.lng b/interface/web/client/lib/lang/en_resellers_list.lng
new file mode 100644
index 0000000..523a467
--- /dev/null
+++ b/interface/web/client/lib/lang/en_resellers_list.lng
@@ -0,0 +1,9 @@
+<?php
+$wb["list_head_txt"] = 'Resellers';
+$wb["client_id_txt"] = 'ID';
+$wb["company_name_txt"] = 'Company name';
+$wb["contact_name_txt"] = 'Contact name';
+$wb["city_txt"] = 'City';
+$wb["country_txt"] = 'Country';
+$wb["add_new_record_txt"] = 'Add new reseller';
+?>
\ No newline at end of file
diff --git a/interface/web/client/lib/lang/es_client.lng b/interface/web/client/lib/lang/es_client.lng
index 4ce030d..66ac5ad 100644
--- a/interface/web/client/lib/lang/es_client.lng
+++ b/interface/web/client/lib/lang/es_client.lng
@@ -80,4 +80,10 @@
$wb['template_additional_txt'] = 'Addon';
$wb['ssh_chroot_txt'] = 'SSH-Chroot Options';
$wb['web_php_options_txt'] = 'PHP Options';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$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['limit_client_error'] = 'The max. number of clients is reached.';
?>
diff --git a/interface/web/client/lib/lang/es_client_template.lng b/interface/web/client/lib/lang/es_client_template.lng
index 6e1aff0..c3cdfc0 100644
--- a/interface/web/client/lib/lang/es_client_template.lng
+++ b/interface/web/client/lib/lang/es_client_template.lng
@@ -44,4 +44,9 @@
$wb['limit_dns_zone_error_notint'] = 'The dns record limit must be a number.';
$wb['limit_database_error_notint'] = 'The database limit must be a number.';
$wb['error_template_name_empty'] = 'Please enter a Template name';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$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.';
?>
diff --git a/interface/web/client/lib/lang/fi_client.lng b/interface/web/client/lib/lang/fi_client.lng
index 518b935..089c981 100755
--- a/interface/web/client/lib/lang/fi_client.lng
+++ b/interface/web/client/lib/lang/fi_client.lng
@@ -80,4 +80,10 @@
$wb['template_additional_txt'] = 'Lisämalli';
$wb['ssh_chroot_txt'] = 'SSH-Chroot Options';
$wb['web_php_options_txt'] = 'PHP Options';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$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['limit_client_error'] = 'The max. number of clients is reached.';
?>
diff --git a/interface/web/client/lib/lang/fi_client_template.lng b/interface/web/client/lib/lang/fi_client_template.lng
index 3139049..983f503 100755
--- a/interface/web/client/lib/lang/fi_client_template.lng
+++ b/interface/web/client/lib/lang/fi_client_template.lng
@@ -44,4 +44,9 @@
$wb['limit_dns_zone_error_notint'] = 'DNS-tietueiden raja-arvon pitää olla numero.';
$wb['limit_database_error_notint'] = 'Tietokantojen raja-arvon pitää olla numero.';
$wb['error_template_name_empty'] = 'Anna mallilomakkeen nimi';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$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.';
?>
diff --git a/interface/web/client/lib/lang/fr_client.lng b/interface/web/client/lib/lang/fr_client.lng
index bb196de..7e8f6f6 100644
--- a/interface/web/client/lib/lang/fr_client.lng
+++ b/interface/web/client/lib/lang/fr_client.lng
@@ -80,4 +80,10 @@
$wb['template_additional_txt'] = 'Addon';
$wb['ssh_chroot_txt'] = 'SSH-Chroot Options';
$wb['web_php_options_txt'] = 'PHP Options';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$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['limit_client_error'] = 'The max. number of clients is reached.';
?>
diff --git a/interface/web/client/lib/lang/fr_client_template.lng b/interface/web/client/lib/lang/fr_client_template.lng
index 6e1aff0..c3cdfc0 100644
--- a/interface/web/client/lib/lang/fr_client_template.lng
+++ b/interface/web/client/lib/lang/fr_client_template.lng
@@ -44,4 +44,9 @@
$wb['limit_dns_zone_error_notint'] = 'The dns record limit must be a number.';
$wb['limit_database_error_notint'] = 'The database limit must be a number.';
$wb['error_template_name_empty'] = 'Please enter a Template name';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$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.';
?>
diff --git a/interface/web/client/lib/lang/it_client.lng b/interface/web/client/lib/lang/it_client.lng
index 85046ef..c3da1ad 100644
--- a/interface/web/client/lib/lang/it_client.lng
+++ b/interface/web/client/lib/lang/it_client.lng
@@ -80,4 +80,10 @@
$wb['template_additional_txt'] = 'Aggiuntivo';
$wb['ssh_chroot_txt'] = 'SSH-Chroot Options';
$wb['web_php_options_txt'] = 'PHP Options';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$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['limit_client_error'] = 'The max. number of clients is reached.';
?>
diff --git a/interface/web/client/lib/lang/it_client_template.lng b/interface/web/client/lib/lang/it_client_template.lng
index e59338d..6ad8f11 100644
--- a/interface/web/client/lib/lang/it_client_template.lng
+++ b/interface/web/client/lib/lang/it_client_template.lng
@@ -44,4 +44,9 @@
$wb['limit_dns_zone_error_notint'] = 'The dns record limit must be a number.';
$wb['limit_database_error_notint'] = 'The database limit must be a number.';
$wb['error_template_name_empty'] = 'Devi inserire il nome del modello';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$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.';
?>
diff --git a/interface/web/client/lib/lang/nl_client.lng b/interface/web/client/lib/lang/nl_client.lng
index e145844..faa9073 100644
--- a/interface/web/client/lib/lang/nl_client.lng
+++ b/interface/web/client/lib/lang/nl_client.lng
@@ -80,4 +80,10 @@
$wb['template_additional_txt'] = 'Addon';
$wb['ssh_chroot_txt'] = 'SSH-Chroot Options';
$wb['web_php_options_txt'] = 'PHP Options';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$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['limit_client_error'] = 'The max. number of clients is reached.';
?>
diff --git a/interface/web/client/lib/lang/nl_client_template.lng b/interface/web/client/lib/lang/nl_client_template.lng
index 0626847..6098bec 100644
--- a/interface/web/client/lib/lang/nl_client_template.lng
+++ b/interface/web/client/lib/lang/nl_client_template.lng
@@ -44,4 +44,9 @@
$wb['limit_dns_zone_error_notint'] = 'De dns record limiet moet een numerieke waarde zijn.';
$wb['limit_database_error_notint'] = 'De database limiet moet een numerieke waarde zijn.';
$wb['error_template_name_empty'] = 'Voer a.u.b. de template naam in.';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$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.';
?>
diff --git a/interface/web/client/lib/lang/ru_client.lng b/interface/web/client/lib/lang/ru_client.lng
index e6d2909..3f6aab3 100644
--- a/interface/web/client/lib/lang/ru_client.lng
+++ b/interface/web/client/lib/lang/ru_client.lng
@@ -80,4 +80,10 @@
$wb['template_additional_txt'] = 'Addon';
$wb['ssh_chroot_txt'] = 'SSH-Chroot Options';
$wb['web_php_options_txt'] = 'PHP Options';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$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['limit_client_error'] = 'The max. number of clients is reached.';
?>
diff --git a/interface/web/client/lib/lang/ru_client_template.lng b/interface/web/client/lib/lang/ru_client_template.lng
index 6e1aff0..c3cdfc0 100644
--- a/interface/web/client/lib/lang/ru_client_template.lng
+++ b/interface/web/client/lib/lang/ru_client_template.lng
@@ -44,4 +44,9 @@
$wb['limit_dns_zone_error_notint'] = 'The dns record limit must be a number.';
$wb['limit_database_error_notint'] = 'The database limit must be a number.';
$wb['error_template_name_empty'] = 'Please enter a Template name';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$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.';
?>
diff --git a/interface/web/client/lib/lang/se_client.lng b/interface/web/client/lib/lang/se_client.lng
index bb196de..7e8f6f6 100644
--- a/interface/web/client/lib/lang/se_client.lng
+++ b/interface/web/client/lib/lang/se_client.lng
@@ -80,4 +80,10 @@
$wb['template_additional_txt'] = 'Addon';
$wb['ssh_chroot_txt'] = 'SSH-Chroot Options';
$wb['web_php_options_txt'] = 'PHP Options';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$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['limit_client_error'] = 'The max. number of clients is reached.';
?>
diff --git a/interface/web/client/lib/lang/se_client_template.lng b/interface/web/client/lib/lang/se_client_template.lng
index 6e1aff0..c3cdfc0 100644
--- a/interface/web/client/lib/lang/se_client_template.lng
+++ b/interface/web/client/lib/lang/se_client_template.lng
@@ -44,4 +44,9 @@
$wb['limit_dns_zone_error_notint'] = 'The dns record limit must be a number.';
$wb['limit_database_error_notint'] = 'The database limit must be a number.';
$wb['error_template_name_empty'] = 'Please enter a Template name';
+$wb['limit_cron_txt'] = 'Max. number of cron jobs';
+$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)';
+$wb['limit_cron_frequency_txt'] = 'Min. delay between executions';
+$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.';
?>
diff --git a/interface/web/client/lib/module.conf.php b/interface/web/client/lib/module.conf.php
index 4d9a0ce..cc4347b 100644
--- a/interface/web/client/lib/module.conf.php
+++ b/interface/web/client/lib/module.conf.php
@@ -28,4 +28,36 @@
$module["nav"][] = array( 'title' => 'Clients',
'open' => 1,
'items' => $items);
+
+unset($items);
+
+
+if($_SESSION["s"]["user"]["typ"] == 'admin'){
+
+$items[] = array( 'title' => "Add Reseller",
+ 'target' => 'content',
+ 'link' => 'client/reseller_edit.php');
+
+$items[] = array( 'title' => "Edit Reseller",
+ 'target' => 'content',
+ 'link' => 'client/reseller_list.php');
+
+$module["nav"][] = array( 'title' => 'Resellers',
+ 'open' => 1,
+ 'items' => $items);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
?>
\ No newline at end of file
diff --git a/interface/web/client/list/reseller.list.php b/interface/web/client/list/reseller.list.php
new file mode 100644
index 0000000..39b8ecc
--- /dev/null
+++ b/interface/web/client/list/reseller.list.php
@@ -0,0 +1,87 @@
+<?php
+
+/*
+ Datatypes:
+ - INTEGER
+ - DOUBLE
+ - CURRENCY
+ - VARCHAR
+ - TEXT
+ - DATE
+*/
+
+
+
+// Name of the list
+$liste["name"] = "resellers";
+
+// Database table
+$liste["table"] = "client";
+
+// Index index field of the database table
+$liste["table_idx"] = "client_id";
+
+// Search Field Prefix
+$liste["search_prefix"] = "search_";
+
+// Records per page
+$liste["records_per_page"] = 15;
+
+// Script File of the list
+$liste["file"] = "reseller_list.php";
+
+// Script file of the edit form
+$liste["edit_file"] = "reseller_edit.php";
+
+// Script File of the delete script
+$liste["delete_file"] = "reseller_del.php";
+
+// Paging Template
+$liste["paging_tpl"] = "templates/paging.tpl.htm";
+
+// Enable authe
+$liste["auth"] = "yes";
+
+
+/*****************************************************
+* Suchfelder
+*****************************************************/
+
+$liste["item"][] = array( 'field' => "company_name",
+ 'datatype' => "VARCHAR",
+ 'formtype' => "TEXT",
+ 'op' => "like",
+ 'prefix' => "%",
+ 'suffix' => "%",
+ 'width' => "",
+ 'value' => "");
+
+$liste["item"][] = array( 'field' => "contact_name",
+ 'datatype' => "VARCHAR",
+ 'formtype' => "TEXT",
+ 'op' => "like",
+ 'prefix' => "%",
+ 'suffix' => "%",
+ 'width' => "",
+ 'value' => "");
+
+$liste["item"][] = array( 'field' => "city",
+ 'datatype' => "VARCHAR",
+ 'formtype' => "TEXT",
+ 'op' => "like",
+ 'prefix' => "%",
+ 'suffix' => "%",
+ 'width' => "",
+ 'value' => "");
+
+$liste["item"][] = array( 'field' => "country",
+ 'datatype' => "VARCHAR",
+ 'formtype' => "TEXT",
+ 'op' => "like",
+ 'prefix' => "%",
+ 'suffix' => "%",
+ 'width' => "",
+ 'value' => "");
+
+
+?>
\ No newline at end of file
diff --git a/interface/web/client/reseller_del.php b/interface/web/client/reseller_del.php
new file mode 100644
index 0000000..8ee40a5
--- /dev/null
+++ b/interface/web/client/reseller_del.php
@@ -0,0 +1,81 @@
+<?php
+
+/*
+Copyright (c) 2005 - 2009, 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
+******************************************/
+
+$list_def_file = "list/reseller.list.php";
+$tform_def_file = "form/reseller.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('Access only for administrators.');
+
+$app->uses('tpl,tform');
+$app->load('tform_actions');
+
+class page_action extends tform_actions {
+ function onAfterDelete() {
+ global $app, $conf;
+
+ $client_id = intval($this->dataRecord['client_id']);
+
+ if($client_id > 0) {
+ // TODO: Delete all records (sub-clients, mail, web, etc....) of this client.
+
+ // remove the group of the client from the resellers group
+ $parent_client_id = intval($this->dataRecord['parent_client_id']);
+ $parent_user = $app->db->queryOneRecord("SELECT userid FROM sys_user WHERE client_id = $parent_client_id");
+ $client_group = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = $client_id");
+ $app->auth->remove_group_from_user($parent_user['userid'],$client_group['groupid']);
+
+ // delete the group of the client
+ $app->db->query("DELETE FROM sys_group WHERE client_id = $client_id");
+
+ // delete the sys user(s) of the client
+ $app->db->query("DELETE FROM sys_user WHERE client_id = $client_id");
+ }
+
+ }
+}
+
+$page = new page_action;
+$page->onDelete()
+
+?>
\ No newline at end of file
diff --git a/interface/web/client/reseller_edit.php b/interface/web/client/reseller_edit.php
new file mode 100644
index 0000000..3df9375
--- /dev/null
+++ b/interface/web/client/reseller_edit.php
@@ -0,0 +1,214 @@
+<?php
+/*
+Copyright (c) 2005 - 2009, 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/reseller.tform.php";
+
+/******************************************
+* End Form configuration
+******************************************/
+
+require_once('../../lib/config.inc.php');
+require_once('../../lib/app.inc.php');
+require_once('tools.inc.php');
+
+//* Check permissions for module
+$app->auth->check_module_permissions('client');
+
+if($_SESSION["s"]["user"]["typ"] != 'admin') die('Access only for administrators.');
+
+// Loading classes
+$app->uses('tpl,tform,tform_actions');
+$app->load('tform_actions');
+
+class page_action extends tform_actions {
+
+
+ function onShowNew() {
+ global $app, $conf;
+
+ // we will check only users, not admins
+ if($_SESSION["s"]["user"]["typ"] == 'user') {
+
+ // Get the limits of the client
+ $client_group_id = $_SESSION["s"]["user"]["default_group"];
+ $client = $app->db->queryOneRecord("SELECT limit_client FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
+
+ // Check if the user may add another website.
+ if($client["limit_client"] >= 0) {
+ $tmp = $app->db->queryOneRecord("SELECT count(client_id) as number FROM client WHERE sys_groupid = $client_group_id");
+ if($tmp["number"] >= $client["limit_client"]) {
+ $app->error($app->tform->wordbook["limit_client_txt"]);
+ }
+ }
+ }
+
+ parent::onShowNew();
+ }
+
+
+ function onSubmit() {
+ global $app, $conf;
+
+ // we will check only users, not admins
+ if($_SESSION["s"]["user"]["typ"] == 'user' && $this->id == 0) {
+
+ // Get the limits of the client
+ $client_group_id = $_SESSION["s"]["user"]["default_group"];
+ $client = $app->db->queryOneRecord("SELECT limit_client FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
+
+ // Check if the user may add another website.
+ if($client["limit_client"] >= 0) {
+ $tmp = $app->db->queryOneRecord("SELECT count(client_id) as number FROM client WHERE sys_groupid = $client_group_id");
+ if($tmp["number"] >= $client["limit_client"]) {
+ $app->error($app->tform->wordbook["limit_client_txt"]);
+ }
+ }
+ }
+
+ parent::onSubmit();
+ }
+
+
+ function onShowEnd() {
+
+ global $app;
+
+ $sql = "SELECT template_id,template_name FROM client_template WHERE template_type = 'a'";
+ $tpls = $app->db->queryAllRecords($sql);
+ $option = '';
+ $tpl = array();
+ foreach($tpls as $item){
+ $option .= '<option value="' . $item['template_id'] . '|' . $item['template_name'] . '">' . $item['template_name'] . '</option>';
+ $tpl[$item['template_id']] = $item['template_name'];
+ }
+ $app->tpl->setVar('tpl_add_select',$option);
+
+ $sql = "SELECT template_additional FROM client WHERE client_id = " . $this->id;
+ $result = $app->db->queryOneRecord($sql);
+ $tplAdd = explode("/", $result['template_additional']);
+ $text = '';
+ foreach($tplAdd as $item){
+ if (trim($item) != ''){
+ if ($text != '') $text .= '<br />';
+ $text .= $tpl[$item];
+ }
+ }
+
+ $app->tpl->setVar('template_additional_list', $text);
+
+ parent::onShowEnd();
+
+ }
+
+ /*
+ This function is called automatically right after
+ the data was successful inserted in the database.
+ */
+ function onAfterInsert() {
+ global $app;
+ // Create the group for the reseller
+ $groupid = $app->db->datalogInsert('sys_group', "(name,description,client_id) VALUES ('".mysql_real_escape_string($this->dataRecord["username"])."','',".$this->id.")", 'groupid');
+ $groups = $groupid;
+
+ $username = $app->db->quote($this->dataRecord["username"]);
+ $password = $app->db->quote($this->dataRecord["password"]);
+ $modules = ISPC_INTERFACE_MODULES_ENABLED.',client';
+ $startmodule = 'client';
+ $usertheme = $app->db->quote($this->dataRecord["usertheme"]);
+ $type = 'user';
+ $active = 1;
+ $language = $app->db->quote($this->dataRecord["language"]);
+
+ // Create the controlpaneluser for the reseller
+ $sql = "INSERT INTO sys_user (username,passwort,modules,startmodule,app_theme,typ,active,language,groups,default_group,client_id)
+ VALUES ('$username',md5('$password'),'$modules','$startmodule','$usertheme','$type','$active','$language',$groups,$groupid,".$this->id.")";
+ $app->db->query($sql);
+
+ //* set the number of clients to 1
+ $app->db->query("UPDATE client SET limit_client = 1 WHERE client_id = ".$this->id);
+
+ /* If there is a client-template, process it */
+ applyClientTemplates($this->id);
+
+ parent::onAfterInsert();
+ }
+
+
+ /*
+ This function is called automatically right after
+ the data was successful updated in the database.
+ */
+ function onAfterUpdate() {
+ global $app;
+
+ // username changed
+ if(isset($this->dataRecord['username']) && $this->dataRecord['username'] != '' && $this->oldDataRecord['username'] != $this->dataRecord['username']) {
+ $username = $app->db->quote($this->dataRecord["username"]);
+ $client_id = $this->id;
+ $sql = "UPDATE sys_user SET username = '$username' WHERE client_id = $client_id";
+ $app->db->query($sql);
+
+ $tmp = $app->db->queryOneRecord("SELECT * FROM sys_group WHERE client_id = $client_id");
+ $app->db->datalogUpdate("sys_group", "name = '$username'", 'groupid', $tmp['groupid']);
+ unset($tmp);
+ }
+
+ // password changed
+ if(isset($this->dataRecord["password"]) && $this->dataRecord["password"] != '') {
+ $password = $app->db->quote($this->dataRecord["password"]);
+ $client_id = $this->id;
+ $sql = "UPDATE sys_user SET passwort = md5('$password') WHERE client_id = $client_id";
+ $app->db->query($sql);
+ }
+
+ // reseller status changed
+ if(isset($this->dataRecord["limit_client"]) && $this->dataRecord["limit_client"] != $this->oldDataRecord["limit_client"]) {
+ $modules = ISPC_INTERFACE_MODULES_ENABLED.',client';
+ $modules = $app->db->quote($modules);
+ $client_id = $this->id;
+ $sql = "UPDATE sys_user SET modules = '$modules' WHERE client_id = $client_id";
+ $app->db->query($sql);
+ }
+ /*
+ * If there is a client-template, process it */
+ applyClientTemplates($this->id);
+
+ parent::onAfterUpdate();
+ }
+}
+
+$page = new page_action;
+$page->onLoad();
+
+?>
\ No newline at end of file
diff --git a/interface/web/client/reseller_list.php b/interface/web/client/reseller_list.php
new file mode 100644
index 0000000..4d2a462
--- /dev/null
+++ b/interface/web/client/reseller_list.php
@@ -0,0 +1,55 @@
+<?php
+/*
+Copyright (c) 2005 - 2009, 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.
+*/
+
+require_once('../../lib/config.inc.php');
+require_once('../../lib/app.inc.php');
+
+/******************************************
+* Begin Form configuration
+******************************************/
+
+$list_def_file = "list/reseller.list.php";
+
+/******************************************
+* End Form configuration
+******************************************/
+
+//* Check permissions for module
+$app->auth->check_module_permissions('client');
+
+if($_SESSION["s"]["user"]["typ"] != 'admin') die('Access only for administrators.');
+
+$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->onLoad();
+
+
+?>
\ No newline at end of file
diff --git a/interface/web/client/templates/client_edit_limits.htm b/interface/web/client/templates/client_edit_limits.htm
index e12abe9..ee5ab67 100644
--- a/interface/web/client/templates/client_edit_limits.htm
+++ b/interface/web/client/templates/client_edit_limits.htm
@@ -142,10 +142,6 @@
<input name="limit_dns_record" id="limit_dns_record" value="{tmpl_var name='limit_dns_record'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
</div>
<div class="ctrlHolder">
- <label for="limit_client">{tmpl_var name='limit_client_txt'}</label>
- <input name="limit_client" id="limit_client" value="{tmpl_var name='limit_client'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
- </div>
- <div class="ctrlHolder">
<label for="default_dbserver">{tmpl_var name='default_dbserver_txt'}</label>
<select name="default_dbserver" id="default_dbserver" class="selectInput">
{tmpl_var name='default_dbserver'}
@@ -155,6 +151,20 @@
<label for="limit_database">{tmpl_var name='limit_database_txt'}</label>
<input name="limit_database" id="limit_database" value="{tmpl_var name='limit_database'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
</div>
+ <div class="ctrlHolder">
+ <label for="limit_cron">{tmpl_var name='limit_cron_txt'}</label>
+ <input name="limit_cron" id="limit_cron" value="{tmpl_var name='limit_cron'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_cron_type">{tmpl_var name='limit_cron_type_txt'}</label>
+ <select name="limit_cron_type" id="limit_cron_type" class="selectInput formLengthHalf">
+ {tmpl_var name='limit_cron_type'}
+ </select>
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_cron_frequency">{tmpl_var name='limit_cron_frequency_txt'}</label>
+ <input name="limit_cron_frequency" id="limit_cron_frequency" value="{tmpl_var name='limit_cron_frequency'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
</fieldset>
<input type="hidden" name="id" value="{tmpl_var name='id'}">
diff --git a/interface/web/client/templates/client_template_edit_limits.htm b/interface/web/client/templates/client_template_edit_limits.htm
index bd01dce..1ee1a1e 100644
--- a/interface/web/client/templates/client_template_edit_limits.htm
+++ b/interface/web/client/templates/client_template_edit_limits.htm
@@ -1,102 +1,112 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_client_template">
-
- <div class="pnl_formsarea">
- <fieldset class="inlineLabels"><legend>Limits</legend>
- <div class="ctrlHolder">
- <label for="limit_maildomain">{tmpl_var name='limit_maildomain_txt'}</label>
- <input name="limit_maildomain" id="limit_maildomain" value="{tmpl_var name='limit_maildomain'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
- </div>
- <div class="ctrlHolder">
- <label for="limit_mailbox">{tmpl_var name='limit_mailbox_txt'}</label>
- <input name="limit_mailbox" id="limit_mailbox" value="{tmpl_var name='limit_mailbox'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
- </div>
- <div class="ctrlHolder">
- <label for="limit_mailalias">{tmpl_var name='limit_mailalias_txt'}</label>
- <input name="limit_mailalias" id="limit_mailalias" value="{tmpl_var name='limit_mailalias'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
- </div>
- <div class="ctrlHolder">
- <label for="limit_mailforward">{tmpl_var name='limit_mailforward_txt'}</label>
- <input name="limit_mailforward" id="limit_mailforward" value="{tmpl_var name='limit_mailforward'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
- </div>
- <div class="ctrlHolder">
- <label for="limit_mailcatchall">{tmpl_var name='limit_mailcatchall_txt'}</label>
- <input name="limit_mailcatchall" id="limit_mailcatchall" value="{tmpl_var name='limit_mailcatchall'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
- </div>
- <div class="ctrlHolder">
- <label for="limit_mailrouting">{tmpl_var name='limit_mailrouting_txt'}</label>
- <input name="limit_mailrouting" id="limit_mailrouting" value="{tmpl_var name='limit_mailrouting'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
- </div>
- <div class="ctrlHolder">
- <label for="limit_mailfilter">{tmpl_var name='limit_mailfilter_txt'}</label>
- <input name="limit_mailfilter" id="limit_mailfilter" value="{tmpl_var name='limit_mailfilter'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
- </div>
- <div class="ctrlHolder">
- <label for="limit_fetchmail">{tmpl_var name='limit_fetchmail_txt'}</label>
- <input name="limit_fetchmail" id="limit_fetchmail" value="{tmpl_var name='limit_fetchmail'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
- </div>
- <div class="ctrlHolder">
- <label for="limit_mailquota">{tmpl_var name='limit_mailquota_txt'}</label>
- <input name="limit_mailquota" id="limit_mailquota" value="{tmpl_var name='limit_mailquota'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
- </div>
- <div class="ctrlHolder">
- <label for="limit_spamfilter_wblist">{tmpl_var name='limit_spamfilter_wblist_txt'}</label>
- <input name="limit_spamfilter_wblist" id="limit_spamfilter_wblist" value="{tmpl_var name='limit_spamfilter_wblist'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
- </div>
- <div class="ctrlHolder">
- <label for="limit_spamfilter_user">{tmpl_var name='limit_spamfilter_user_txt'}</label>
- <input name="limit_spamfilter_user" id="limit_spamfilter_user" value="{tmpl_var name='limit_spamfilter_user'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
- </div>
- <div class="ctrlHolder">
- <label for="limit_spamfilter_policy">{tmpl_var name='limit_spamfilter_policy_txt'}</label>
- <input name="limit_spamfilter_policy" id="limit_spamfilter_policy" value="{tmpl_var name='limit_spamfilter_policy'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
- </div>
- <div class="ctrlHolder">
- <label for="limit_web_domain">{tmpl_var name='limit_web_domain_txt'}</label>
- <input name="limit_web_domain" id="limit_web_domain" value="{tmpl_var name='limit_web_domain'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
- </div>
- <div class="ctrlHolder">
- <label for="limit_web_aliasdomain">{tmpl_var name='limit_web_aliasdomain_txt'}</label>
- <input name="limit_web_aliasdomain" id="limit_web_aliasdomain" value="{tmpl_var name='limit_web_aliasdomain'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
- </div>
- <div class="ctrlHolder">
- <label for="limit_web_subdomain">{tmpl_var name='limit_web_subdomain_txt'}</label>
- <input name="limit_web_subdomain" id="limit_web_subdomain" value="{tmpl_var name='limit_web_subdomain'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
- </div>
- <div class="ctrlHolder">
- <label for="limit_ftp_user">{tmpl_var name='limit_ftp_user_txt'}</label>
- <input name="limit_ftp_user" id="limit_ftp_user" value="{tmpl_var name='limit_ftp_user'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
- </div>
- <div class="ctrlHolder">
- <label for="limit_shell_user">{tmpl_var name='limit_shell_user_txt'}</label>
- <input name="limit_shell_user" id="limit_shell_user" value="{tmpl_var name='limit_shell_user'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
- </div>
- <div class="ctrlHolder">
- <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="limit_dns_record">{tmpl_var name='limit_dns_record_txt'}</label>
- <input name="limit_dns_record" id="limit_dns_record" value="{tmpl_var name='limit_dns_record'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
- </div>
- <div class="ctrlHolder">
- <label for="limit_client">{tmpl_var name='limit_client_txt'}</label>
- <input name="limit_client" id="limit_client" value="{tmpl_var name='limit_client'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
- </div>
- <div class="ctrlHolder">
- <label for="limit_database">{tmpl_var name='limit_database_txt'}</label>
- <input name="limit_database" id="limit_database" value="{tmpl_var name='limit_database'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
- </div>
- </fieldset>
-
- <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','client/client_template_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('client/client_template_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
- </div>
- </div>
-
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_client_template">
+
+ <div class="pnl_formsarea">
+ <fieldset class="inlineLabels"><legend>Limits</legend>
+ <div class="ctrlHolder">
+ <label for="limit_maildomain">{tmpl_var name='limit_maildomain_txt'}</label>
+ <input name="limit_maildomain" id="limit_maildomain" value="{tmpl_var name='limit_maildomain'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_mailbox">{tmpl_var name='limit_mailbox_txt'}</label>
+ <input name="limit_mailbox" id="limit_mailbox" value="{tmpl_var name='limit_mailbox'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_mailalias">{tmpl_var name='limit_mailalias_txt'}</label>
+ <input name="limit_mailalias" id="limit_mailalias" value="{tmpl_var name='limit_mailalias'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_mailforward">{tmpl_var name='limit_mailforward_txt'}</label>
+ <input name="limit_mailforward" id="limit_mailforward" value="{tmpl_var name='limit_mailforward'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_mailcatchall">{tmpl_var name='limit_mailcatchall_txt'}</label>
+ <input name="limit_mailcatchall" id="limit_mailcatchall" value="{tmpl_var name='limit_mailcatchall'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_mailrouting">{tmpl_var name='limit_mailrouting_txt'}</label>
+ <input name="limit_mailrouting" id="limit_mailrouting" value="{tmpl_var name='limit_mailrouting'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_mailfilter">{tmpl_var name='limit_mailfilter_txt'}</label>
+ <input name="limit_mailfilter" id="limit_mailfilter" value="{tmpl_var name='limit_mailfilter'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_fetchmail">{tmpl_var name='limit_fetchmail_txt'}</label>
+ <input name="limit_fetchmail" id="limit_fetchmail" value="{tmpl_var name='limit_fetchmail'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_mailquota">{tmpl_var name='limit_mailquota_txt'}</label>
+ <input name="limit_mailquota" id="limit_mailquota" value="{tmpl_var name='limit_mailquota'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_spamfilter_wblist">{tmpl_var name='limit_spamfilter_wblist_txt'}</label>
+ <input name="limit_spamfilter_wblist" id="limit_spamfilter_wblist" value="{tmpl_var name='limit_spamfilter_wblist'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_spamfilter_user">{tmpl_var name='limit_spamfilter_user_txt'}</label>
+ <input name="limit_spamfilter_user" id="limit_spamfilter_user" value="{tmpl_var name='limit_spamfilter_user'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_spamfilter_policy">{tmpl_var name='limit_spamfilter_policy_txt'}</label>
+ <input name="limit_spamfilter_policy" id="limit_spamfilter_policy" value="{tmpl_var name='limit_spamfilter_policy'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_web_domain">{tmpl_var name='limit_web_domain_txt'}</label>
+ <input name="limit_web_domain" id="limit_web_domain" value="{tmpl_var name='limit_web_domain'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_web_aliasdomain">{tmpl_var name='limit_web_aliasdomain_txt'}</label>
+ <input name="limit_web_aliasdomain" id="limit_web_aliasdomain" value="{tmpl_var name='limit_web_aliasdomain'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_web_subdomain">{tmpl_var name='limit_web_subdomain_txt'}</label>
+ <input name="limit_web_subdomain" id="limit_web_subdomain" value="{tmpl_var name='limit_web_subdomain'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_ftp_user">{tmpl_var name='limit_ftp_user_txt'}</label>
+ <input name="limit_ftp_user" id="limit_ftp_user" value="{tmpl_var name='limit_ftp_user'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_shell_user">{tmpl_var name='limit_shell_user_txt'}</label>
+ <input name="limit_shell_user" id="limit_shell_user" value="{tmpl_var name='limit_shell_user'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <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="limit_dns_record">{tmpl_var name='limit_dns_record_txt'}</label>
+ <input name="limit_dns_record" id="limit_dns_record" value="{tmpl_var name='limit_dns_record'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_database">{tmpl_var name='limit_database_txt'}</label>
+ <input name="limit_database" id="limit_database" value="{tmpl_var name='limit_database'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_cron">{tmpl_var name='limit_cron_txt'}</label>
+ <input name="limit_cron" id="limit_cron" value="{tmpl_var name='limit_cron'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_cron_type">{tmpl_var name='limit_cron_type_txt'}</label>
+ <select name="limit_cron_type" id="limit_cron_type" class="selectInput formLengthHalf">
+ {tmpl_var name='limit_cron_type'}
+ </select>
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_cron_frequency">{tmpl_var name='limit_cron_frequency_txt'}</label>
+ <input name="limit_cron_frequency" id="limit_cron_frequency" value="{tmpl_var name='limit_cron_frequency'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ </fieldset>
+
+ <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','client/client_template_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('client/client_template_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+ </div>
+ </div>
+
+</div>
diff --git a/interface/web/client/templates/reseller_edit_address.htm b/interface/web/client/templates/reseller_edit_address.htm
new file mode 100644
index 0000000..493a930
--- /dev/null
+++ b/interface/web/client/templates/reseller_edit_address.htm
@@ -0,0 +1,101 @@
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_client">
+
+ <div class="pnl_formsarea">
+ <fieldset class="inlineLabels"><legend>Address</legend>
+ <div class="ctrlHolder">
+ <label for="company_name">{tmpl_var name='company_name_txt'}</label>
+ <input name="company_name" id="company_name" value="{tmpl_var name='company_name'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="contact_name">{tmpl_var name='contact_name_txt'}</label>
+ <input name="contact_name" id="contact_name" value="{tmpl_var name='contact_name'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="username">{tmpl_var name='username_txt'}</label>
+ <input name="username" id="username" value="{tmpl_var name='username'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="password">{tmpl_var name='password_txt'}</label>
+ <input name="password" id="password" value="{tmpl_var name='password'}" size="30" maxlength="255" type="password" class="textInput" onkeyup="pass_check(this.value)" />
+ </div>
+ <div class="ctrlHolder">
+ <p class="label">{tmpl_var name='password_strength_txt'}</p>
+ <div id="passBar"></div>
+ <p class="formHint"><span id="passText"> </span></p>
+ </div>
+ <div class="ctrlHolder">
+ <label for="language">{tmpl_var name='language_txt'}</label>
+ <select name="language" id="language" class="selectInput withicons">
+ {tmpl_var name='language'}
+ </select>
+ </div>
+ <div class="ctrlHolder">
+ <label for="usertheme">{tmpl_var name='usertheme_txt'}</label>
+ <select name="usertheme" id="usertheme" class="selectInput">
+ {tmpl_var name='usertheme'}
+ </select>
+ </div>
+ <div class="ctrlHolder">
+ <label for="street">{tmpl_var name='street_txt'}</label>
+ <input name="street" id="street" value="{tmpl_var name='street'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="zip">{tmpl_var name='zip_txt'}</label>
+ <input name="zip" id="zip" value="{tmpl_var name='zip'}" size="10" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="city">{tmpl_var name='city_txt'}</label>
+ <input name="city" id="city" value="{tmpl_var name='city'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="state">{tmpl_var name='state_txt'}</label>
+ <input name="state" id="state" value="{tmpl_var name='state'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="country">{tmpl_var name='country_txt'}</label>
+ <select name="country" id="country" class="selectInput withicons">
+ {tmpl_var name='country'}
+ </select>
+ </div>
+ <div class="ctrlHolder">
+ <label for="telephone">{tmpl_var name='telephone_txt'}</label>
+ <input name="telephone" id="telephone" value="{tmpl_var name='telephone'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="mobile">{tmpl_var name='mobile_txt'}</label>
+ <input name="mobile" id="mobile" value="{tmpl_var name='mobile'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="fax">{tmpl_var name='fax_txt'}</label>
+ <input name="fax" id="fax" value="{tmpl_var name='fax'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="email">{tmpl_var name='email_txt'}</label>
+ <input name="email" id="email" value="{tmpl_var name='email'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="internet">{tmpl_var name='internet_txt'}</label>
+ <input name="internet" id="internet" value="{tmpl_var name='internet'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="icq">{tmpl_var name='icq_txt'}</label>
+ <input name="icq" id="icq" value="{tmpl_var name='icq'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="notes">{tmpl_var name='notes_txt'}</label>
+ <textarea name="notes" id="notes" rows='10' cols='30'>{tmpl_var name='notes'}</textarea>
+ </div>
+ </fieldset>
+
+ <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','client/reseller_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('client/reseller_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+ </div>
+ </div>
+
+</div>
diff --git a/interface/web/client/templates/reseller_edit_limits.htm b/interface/web/client/templates/reseller_edit_limits.htm
new file mode 100644
index 0000000..7e027e4
--- /dev/null
+++ b/interface/web/client/templates/reseller_edit_limits.htm
@@ -0,0 +1,171 @@
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_client">
+
+ <div class="pnl_formsarea">
+ <fieldset class="inlineLabels"><legend>Limits</legend>
+<tmpl_if name="is_admin">
+ <div class="ctrlHolder">
+ <label for="template_master">{tmpl_var name='template_master_txt'}</label>
+ <select name="template_master" id="template_master" class="selectInput">
+ {tmpl_var name='template_master'}
+ </select>
+ </div>
+ <div class="ctrlHolder">
+ <label for="template_additional">{tmpl_var name='template_additional_txt'}</label>
+ <select name="tpl_add_select" id="tpl_add_select" class="selectInput">
+ {tmpl_var name='tpl_add_select'}
+ </select>
+ <span id="template_additional_list">{tmpl_var name='template_additional_list'}</span>
+ <input type="hidden" id="template_additional" name="template_additional" value="{tmpl_var name='template_additional'}">
+ </div>
+ <div class="ctrlHolder">
+
+ </div>
+</tmpl_if>
+ <div class="ctrlHolder">
+ <label for="default_mailserver">{tmpl_var name='default_mailserver_txt'}</label>
+ <select name="default_mailserver" id="default_mailserver" class="selectInput">
+ {tmpl_var name='default_mailserver'}
+ </select>
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_maildomain">{tmpl_var name='limit_maildomain_txt'}</label>
+ <input name="limit_maildomain" id="limit_maildomain" value="{tmpl_var name='limit_maildomain'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_mailbox">{tmpl_var name='limit_mailbox_txt'}</label>
+ <input name="limit_mailbox" id="limit_mailbox" value="{tmpl_var name='limit_mailbox'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_mailalias">{tmpl_var name='limit_mailalias_txt'}</label>
+ <input name="limit_mailalias" id="limit_mailalias" value="{tmpl_var name='limit_mailalias'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_mailforward">{tmpl_var name='limit_mailforward_txt'}</label>
+ <input name="limit_mailforward" id="limit_mailforward" value="{tmpl_var name='limit_mailforward'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_mailcatchall">{tmpl_var name='limit_mailcatchall_txt'}</label>
+ <input name="limit_mailcatchall" id="limit_mailcatchall" value="{tmpl_var name='limit_mailcatchall'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_mailrouting">{tmpl_var name='limit_mailrouting_txt'}</label>
+ <input name="limit_mailrouting" id="limit_mailrouting" value="{tmpl_var name='limit_mailrouting'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_mailfilter">{tmpl_var name='limit_mailfilter_txt'}</label>
+ <input name="limit_mailfilter" id="limit_mailfilter" value="{tmpl_var name='limit_mailfilter'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_fetchmail">{tmpl_var name='limit_fetchmail_txt'}</label>
+ <input name="limit_fetchmail" id="limit_fetchmail" value="{tmpl_var name='limit_fetchmail'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_mailquota">{tmpl_var name='limit_mailquota_txt'}</label>
+ <input name="limit_mailquota" id="limit_mailquota" value="{tmpl_var name='limit_mailquota'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" /> MB
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_spamfilter_wblist">{tmpl_var name='limit_spamfilter_wblist_txt'}</label>
+ <input name="limit_spamfilter_wblist" id="limit_spamfilter_wblist" value="{tmpl_var name='limit_spamfilter_wblist'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_spamfilter_user">{tmpl_var name='limit_spamfilter_user_txt'}</label>
+ <input name="limit_spamfilter_user" id="limit_spamfilter_user" value="{tmpl_var name='limit_spamfilter_user'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_spamfilter_policy">{tmpl_var name='limit_spamfilter_policy_txt'}</label>
+ <input name="limit_spamfilter_policy" id="limit_spamfilter_policy" value="{tmpl_var name='limit_spamfilter_policy'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="default_webserver">{tmpl_var name='default_webserver_txt'}</label>
+ <select name="default_webserver" id="default_webserver" class="selectInput">
+ {tmpl_var name='default_webserver'}
+ </select>
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_web_domain">{tmpl_var name='limit_web_domain_txt'}</label>
+ <input name="limit_web_domain" id="limit_web_domain" value="{tmpl_var name='limit_web_domain'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <p class="label">{tmpl_var name='web_php_options_txt'}</p>
+ <div class="multiField">
+ {tmpl_var name='web_php_options'}
+ </div>
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_web_aliasdomain">{tmpl_var name='limit_web_aliasdomain_txt'}</label>
+ <input name="limit_web_aliasdomain" id="limit_web_aliasdomain" value="{tmpl_var name='limit_web_aliasdomain'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_web_subdomain">{tmpl_var name='limit_web_subdomain_txt'}</label>
+ <input name="limit_web_subdomain" id="limit_web_subdomain" value="{tmpl_var name='limit_web_subdomain'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_ftp_user">{tmpl_var name='limit_ftp_user_txt'}</label>
+ <input name="limit_ftp_user" id="limit_ftp_user" value="{tmpl_var name='limit_ftp_user'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_shell_user">{tmpl_var name='limit_shell_user_txt'}</label>
+ <input name="limit_shell_user" id="limit_shell_user" value="{tmpl_var name='limit_shell_user'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <p class="label">{tmpl_var name='ssh_chroot_txt'}</p>
+ <div class="multiField">
+ {tmpl_var name='ssh_chroot'}
+ </div>
+ </div>
+ <div class="ctrlHolder">
+ <label for="default_dnsserver">{tmpl_var name='default_dnsserver_txt'}</label>
+ <select name="default_dnsserver" id="default_dnsserver" class="selectInput">
+ {tmpl_var name='default_dnsserver'}
+ </select>
+ </div>
+ <div class="ctrlHolder">
+ <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="limit_dns_record">{tmpl_var name='limit_dns_record_txt'}</label>
+ <input name="limit_dns_record" id="limit_dns_record" value="{tmpl_var name='limit_dns_record'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_client">{tmpl_var name='limit_client_txt'}</label>
+ <input name="limit_client" id="limit_client" value="{tmpl_var name='limit_client'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="default_dbserver">{tmpl_var name='default_dbserver_txt'}</label>
+ <select name="default_dbserver" id="default_dbserver" class="selectInput">
+ {tmpl_var name='default_dbserver'}
+ </select>
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_database">{tmpl_var name='limit_database_txt'}</label>
+ <input name="limit_database" id="limit_database" value="{tmpl_var name='limit_database'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_cron">{tmpl_var name='limit_cron_txt'}</label>
+ <input name="limit_cron" id="limit_cron" value="{tmpl_var name='limit_cron'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_cron_type">{tmpl_var name='limit_cron_type_txt'}</label>
+ <select name="limit_cron_type" id="limit_cron_type" class="selectInput formLengthHalf">
+ {tmpl_var name='limit_cron_type'}
+ </select>
+ </div>
+ <div class="ctrlHolder">
+ <label for="limit_cron_frequency">{tmpl_var name='limit_cron_frequency_txt'}</label>
+ <input name="limit_cron_frequency" id="limit_cron_frequency" value="{tmpl_var name='limit_cron_frequency'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ </fieldset>
+
+ <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','client/reseller_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('client/reseller_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+ </div>
+ </div>
+
+</div>
diff --git a/interface/web/client/templates/resellers_list.htm b/interface/web/client/templates/resellers_list.htm
new file mode 100644
index 0000000..c8dc083
--- /dev/null
+++ b/interface/web/client/templates/resellers_list.htm
@@ -0,0 +1,62 @@
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_list_clients">
+
+ <div class="pnl_toolsarea">
+ <fieldset><legend>Tools</legend>
+ <div class="buttons">
+ <button class="iconstxt icoAdd" type="button" onClick="loadContent('client/reseller_edit.php');">
+ <span>{tmpl_var name="add_new_record_txt"}</span>
+ </button>
+ </div>
+ </fieldset>
+ </div>
+
+ <div class="pnl_listarea">
+ <fieldset><legend><tmpl_var name="list_head_txt"></legend>
+ <table class="list">
+ <thead>
+ <tr>
+ <th class="tbl_col_client_id" scope="col"><tmpl_var name="client_id_txt"></th>
+ <th class="tbl_col_company_name" scope="col"><tmpl_var name="company_name_txt"></th>
+ <th class="tbl_col_contact_name" scope="col"><tmpl_var name="contact_name_txt"></th>
+ <th class="tbl_col_city" scope="col"><tmpl_var name="city_txt"></th>
+ <th class="tbl_col_country" scope="col"><tmpl_var name="country_txt"></th>
+ <th class="tbl_col_country" scope="col"> </th>
+ </tr>
+ <tr>
+ <td class="tbl_col_client_id"><input type="text" name="search_client_id" value="{tmpl_var name='search_client_id'}" /></td>
+ <td class="tbl_col_company_name"><input type="text" name="search_company_name" value="{tmpl_var name='search_company_name'}" /></td>
+ <td class="tbl_col_contact_name"><input type="text" name="search_contact_name" value="{tmpl_var name='search_contact_name'}" /></td>
+ <td class="tbl_col_city"><input type="text" name="search_city" value="{tmpl_var name='search_city'}" /></td>
+ <td class="tbl_col_country"><input type="text" name="search_country" value="{tmpl_var name='search_country'}" /></td>
+ <td class="tbl_col_buttons"><div class="buttons"><button type="button" class="icons16 icoFilter" name="Filter" id="Filter" value="{tmpl_var name="filter_txt"}" onClick="submitForm('pageForm','client/reseller_list.php');"><span>{tmpl_var name="filter_txt"}</span></button></div></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_client_id"><a href="#" onClick="loadContent('client/reseller_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="client_id"}</a></td>
+ <td class="tbl_col_company_name"><a href="#" onClick="loadContent('client/reseller_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="company_name"}</a></td>
+ <td class="tbl_col_contact_name"><a href="#" onClick="loadContent('client/reseller_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="contact_name"}</a></td>
+ <td class="tbl_col_city"><a href="#" onClick="loadContent('client/reseller_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="city"}</a></td>
+ <td class="tbl_col_country"><a href="#" onClick="loadContent('client/reseller_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="country"}</a></td>
+ <td class="tbl_col_buttons">
+ <div class="buttons icons16">
+ <a class="icons16 icoDelete" href="javascript: del_record('client/reseller_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>
+ </div>
+ </td>
+ </tr>
+ </tmpl_loop>
+ </tbody>
+ <tfoot>
+ <tr>
+ <td class="tbl_footer tbl_paging" colspan="6"><tmpl_var name="paging"></td>
+ </tr>
+ </tfoot>
+ </table>
+ </fieldset>
+ </div>
+
+</div>
diff --git a/interface/web/designer/lib/lang/br.lng b/interface/web/designer/lib/lang/br.lng
new file mode 100644
index 0000000..62a2de0
--- /dev/null
+++ b/interface/web/designer/lib/lang/br.lng
@@ -0,0 +1,3 @@
+<?php
+
+?>
diff --git a/interface/web/designer/lib/lang/br_form_edit.lng b/interface/web/designer/lib/lang/br_form_edit.lng
new file mode 100644
index 0000000..89b84c1
--- /dev/null
+++ b/interface/web/designer/lib/lang/br_form_edit.lng
@@ -0,0 +1,26 @@
+<?php
+$wb["name_txt"] = 'Nome do Formulário';
+$wb["title_txt"] = 'Título do Formulário';
+$wb["template_txt"] = 'Gabarito';
+$wb["navframe_txt"] = 'Frame de Navegação';
+$wb["startpage_txt"] = 'Página Inicial';
+$wb["tab_width_txt"] = 'Tamanho da aba';
+$wb["save_txt"] = 'Salvar';
+$wb["cancel_txt"] = 'Cancelar';
+$wb["header_txt"] = 'Propriedades do Formulário';
+$wb["description_txt"] = 'Descrição';
+$wb["action_txt"] = 'Ação (script)';
+$wb["db_table_txt"] = 'Tabela do DB';
+$wb["db_table_idx_txt"] = 'Indíce da tabela do DB';
+$wb["db_history_txt"] = 'Desfazer Log';
+$wb["tab_default_txt"] = 'Aba Padrão';
+$wb["list_default_txt"] = 'Exibir Padrão';
+$wb["tab_width_txt"] = 'Tamanho da aba';
+$wb["auth_txt"] = 'Permissões';
+$wb["auth_preset_userid_txt"] = 'Usuário(ID)';
+$wb["auth_preset_groupid_txt"] = 'Grupo(ID)';
+$wb["auth_preset_perm_user_txt"] = 'Perm. Usuário';
+$wb["auth_preset_perm_group_txt"] = 'Perm. Grupo';
+$wb["auth_preset_perm_other_txt"] = 'Perm. Outros';
+
+?>
diff --git a/interface/web/designer/lib/lang/br_form_list.lng b/interface/web/designer/lib/lang/br_form_list.lng
new file mode 100644
index 0000000..2c6baa5
--- /dev/null
+++ b/interface/web/designer/lib/lang/br_form_list.lng
@@ -0,0 +1,7 @@
+<?php
+$wb["list_head_txt"] = 'Formulário de Backend';
+$wb["form_txt"] = 'Formulário';
+$wb["module_txt"] = 'Módulo';
+$wb["title_txt"] = 'Título';
+$wb["description_txt"] = 'Descrição';
+?>
diff --git a/interface/web/designer/lib/lang/br_form_show.lng b/interface/web/designer/lib/lang/br_form_show.lng
new file mode 100644
index 0000000..fe9cf14
--- /dev/null
+++ b/interface/web/designer/lib/lang/br_form_show.lng
@@ -0,0 +1,18 @@
+<?php
+$wb["header_txt"] = 'Editor de Formulários';
+$wb["title_txt"] = 'Título do Formulário';
+$wb["name_txt"] = 'Nome do Formulário';
+$wb["delete_txt"] = 'Remover';
+$wb["properties_txt"] = 'Propriedades';
+$wb["new_tab_txt"] = 'Nova Aba';
+$wb["edit_txt"] = 'Editar';
+$wb["new_txt"] = 'Novo';
+$wb["up_txt"] = '^';
+$wb["down_txt"] = 'v';
+$wb["module_txt"] = 'Módulo';
+$wb["form_txt"] = 'Formulário';
+$wb["description_txt"] = 'Descrição';
+$wb["module_del_txt"] = "Remover o módulo e todos seus sub-diretórios?";
+$wb["menu_del_txt"] = "Remover o menu e todos os seus itens?";
+$wb["item_del_txt"] = "Remover o item de menu?";
+?>
diff --git a/interface/web/designer/lib/lang/br_module_edit.lng b/interface/web/designer/lib/lang/br_module_edit.lng
new file mode 100644
index 0000000..de4ec59
--- /dev/null
+++ b/interface/web/designer/lib/lang/br_module_edit.lng
@@ -0,0 +1,23 @@
+<?php
+$wb["name_txt"] = 'Nome do Módulo';
+$wb["title_txt"] = 'Título do Módulo';
+$wb["template_txt"] = 'Arquivo de Gabarito';
+$wb["navframe_txt"] = 'Frame de Navegação';
+$wb["startpage_txt"] = 'Página Padrão';
+$wb["tab_width_txt"] = 'Tamanho da Aba';
+$wb["save_txt"] = 'Salvar';
+$wb["cancel_txt"] = 'Cancelar';
+$wb["header_txt"] = 'Propriedades do Módulo';
+$wb["description_txt"] = '
+<b>Descrição</b>
+<br><br>
+<b>Nome do Módulo:</b> Nome do diretório do módulo. Somente números, letras e underscores são permitidos.<br>
+<b>Título do Módulo:</b> Será exibido em caixa alta no menu de navegação.<br>
+<b>Arquivo de Gabarito:</b> Arquivo de Gabarito do Módulo Disponível: modulo.tpl.htm e modulo_tree.tpl.htm. O padrão é modulo.tpl.htm.<br>
+<b>Frame de Navegação:</b> Se modulo_tree.tpl.htm foi selecionado como arquivo de gabarito, insira aqui o caminho do script para o frame a esquerda.<br>
+<b>Página Padrão:</b> Esta página será exibida quando o módulo for aberto.<br>
+<b>Tamanho da Aba:</b> Tamanho das abas na navegação principal. Este campo fica em branco por padrão. Você pode informar valores absolutos em pixels (ex.: 20) ou valores relativos (ex.: 20%).<br>
+<b>Dica:</b> Todos os caminhos são relativos ao diretório "web".
+';
+
+?>
diff --git a/interface/web/designer/lib/lang/br_module_list.lng b/interface/web/designer/lib/lang/br_module_list.lng
new file mode 100644
index 0000000..fc33032
--- /dev/null
+++ b/interface/web/designer/lib/lang/br_module_list.lng
@@ -0,0 +1,5 @@
+<?php
+$wb["list_head_txt"] = 'Módulo do Backend';
+$wb["module_txt"] = 'Módulo';
+$wb["title_txt"] = 'Título';
+?>
diff --git a/interface/web/designer/lib/lang/br_module_nav_edit.lng b/interface/web/designer/lib/lang/br_module_nav_edit.lng
new file mode 100644
index 0000000..6fa8819
--- /dev/null
+++ b/interface/web/designer/lib/lang/br_module_nav_edit.lng
@@ -0,0 +1,6 @@
+<?php
+$wb["title_txt"] = 'Título';
+$wb["header_txt"] = 'Propriedades de Navegação';
+$wb["save_txt"] = 'Salvar';
+$wb["cancel_txt"] = 'Cancelar';
+?>
diff --git a/interface/web/designer/lib/lang/br_module_nav_item_edit.lng b/interface/web/designer/lib/lang/br_module_nav_item_edit.lng
new file mode 100644
index 0000000..9f790f0
--- /dev/null
+++ b/interface/web/designer/lib/lang/br_module_nav_item_edit.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["title_txt"] = 'Título';
+$wb["target_txt"] = 'Target';
+$wb["link_txt"] = 'Link';
+$wb["header_txt"] = 'Propriedades de Navegação';
+$wb["save_txt"] = 'Salvar';
+$wb["cancel_txt"] = 'Cancelar';
+?>
diff --git a/interface/web/designer/lib/lang/br_module_show.lng b/interface/web/designer/lib/lang/br_module_show.lng
new file mode 100644
index 0000000..6054ce7
--- /dev/null
+++ b/interface/web/designer/lib/lang/br_module_show.lng
@@ -0,0 +1,17 @@
+<?php
+$wb["header_txt"] = 'Editor de Menu';
+$wb["title_txt"] = 'Título';
+$wb["name_txt"] = 'Módulo';
+$wb["delete_txt"] = 'Remover';
+$wb["properties_txt"] = 'Propriedades';
+$wb["new_menu_txt"] = 'Novo Menu';
+$wb["edit_txt"] = 'Editar';
+$wb["delete_txt"] = 'Remover';
+$wb["new_txt"] = 'Novo';
+$wb["up_txt"] = 'Subir';
+$wb["down_txt"] = 'Descer';
+$wb["module_txt"] = 'Módulo';
+$wb['module_del_txt'] = 'Deseja eliminar este módulo e todos os arquivos contidos no diretório?';
+$wb['menu_del_txt'] = 'Deseja apagar este menu e todos seus elementos?';
+$wb['item_del_txt'] = 'Deseja apagar este elemento do menu?';
+?>
diff --git a/interface/web/dns/dns_a_edit.php b/interface/web/dns/dns_a_edit.php
index b242c81..431b4ac 100644
--- a/interface/web/dns/dns_a_edit.php
+++ b/interface/web/dns/dns_a_edit.php
@@ -96,6 +96,11 @@
}
} // end if user is not admin
+ //* Check for duplicates where IP and hostname are the same
+ $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE zone = '".$this->dataRecord["zone"]."' and data = '".$this->dataRecord["data"]."' and id != ".$this->id);
+ if($tmp['number'] > 0) $app->tform->errorMessage .= $app->tform->lng("data_error_duplicate")."<br>";
+ unset($tmp);
+
// Set the server ID of the rr record to the same server ID as the parent record.
$this->dataRecord["server_id"] = $soa["server_id"];
diff --git a/interface/web/dns/dns_soa_edit.php b/interface/web/dns/dns_soa_edit.php
index 0616c56..3f120db 100644
--- a/interface/web/dns/dns_soa_edit.php
+++ b/interface/web/dns/dns_soa_edit.php
@@ -55,17 +55,11 @@
// we will check only users, not admins
if($_SESSION["s"]["user"]["typ"] == 'user') {
-
- // Get the limits of the client
- $client_group_id = $_SESSION["s"]["user"]["default_group"];
- $client = $app->db->queryOneRecord("SELECT limit_dns_zone FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-
- // Check if the user may add another maildomain.
- if($client["limit_dns_zone"] >= 0) {
- $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_soa WHERE sys_groupid = $client_group_id");
- if($tmp["number"] >= $client["limit_dns_zone"]) {
- $app->error($app->tform->wordbook["limit_dns_zone_txt"]);
- }
+ if(!$app->tform->checkClientLimit('limit_dns_zone')) {
+ $app->error($app->tform->wordbook["limit_dns_zone_txt"]);
+ }
+ if(!$app->tform->checkResellerLimit('limit_dns_zone')) {
+ $app->error('Reseller: '.$app->tform->wordbook["limit_dns_zone_txt"]);
}
}
@@ -76,7 +70,7 @@
global $app, $conf;
// If user is admin, we will allow him to select to whom this record belongs
- if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) {
+ if($_SESSION["s"]["user"]["typ"] == 'admin') {
// Getting Domains of the user
$sql = "SELECT groupid, name FROM sys_group WHERE client_id > 0";
$clients = $app->db->queryAllRecords($sql);
@@ -89,6 +83,24 @@
}
}
$app->tpl->setVar("client_group_id",$client_select);
+ } else if($app->auth->has_clients($_SESSION['s']['user']['userid'])) {
+
+ // 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 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 groupid, name 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);
+ $client_select = '<option value="'.$client['client_id'].'">'.$client['contact_name'].'</option>';
+ if(is_array($clients)) {
+ foreach( $clients as $client) {
+ $selected = @($client["groupid"] == $this->dataRecord["sys_groupid"])?'SELECTED':'';
+ $client_select .= "<option value='$client[groupid]' $selected>$client[name]</option>\r\n";
+ }
+ }
+ $app->tpl->setVar("client_group_id",$client_select);
+
}
parent::onShowEnd();
@@ -128,9 +140,9 @@
$this->dataRecord["serial"] = $app->validate_dns->increase_serial($soa["serial"]);
//* Check if soa, ns and mbox have a dot at the end
- if(substr($this->dataRecord["origin"],-1,1) != '.') $this->dataRecord["origin"] .= '.';
- if(substr($this->dataRecord["ns"],-1,1) != '.') $this->dataRecord["ns"] .= '.';
- if(substr($this->dataRecord["mbox"],-1,1) != '.') $this->dataRecord["mbox"] .= '.';
+ if(strlen($this->dataRecord["origin"]) > 0 && substr($this->dataRecord["origin"],-1,1) != '.') $this->dataRecord["origin"] .= '.';
+ if(strlen($this->dataRecord["ns"]) > 0 && substr($this->dataRecord["ns"],-1,1) != '.') $this->dataRecord["ns"] .= '.';
+ if(strlen($this->dataRecord["mbox"]) > 0 && substr($this->dataRecord["mbox"],-1,1) != '.') $this->dataRecord["mbox"] .= '.';
//* Replace @ in mbox
if(stristr($this->dataRecord["mbox"],'@')) {
diff --git a/interface/web/dns/dns_template_edit.php b/interface/web/dns/dns_template_edit.php
index ac2704e..5dda4da 100644
--- a/interface/web/dns/dns_template_edit.php
+++ b/interface/web/dns/dns_template_edit.php
@@ -1,58 +1,60 @@
-<?php
-/*
-Copyright (c) 2007, 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/dns_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('dns');
-
-// Loading classes
-$app->uses('tpl,tform,tform_actions');
-$app->load('tform_actions');
-
-class page_action extends tform_actions {
-
-}
-
-$page = new page_action;
-$page->onLoad();
-
+<?php
+/*
+Copyright (c) 2007, 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/dns_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('dns');
+
+// Loading classes
+$app->uses('tpl,tform,tform_actions');
+$app->load('tform_actions');
+
+if($_SESSION["s"]["user"]["typ"] != 'admin') die('Access denied for non admin users.');
+
+class page_action extends tform_actions {
+
+}
+
+$page = new page_action;
+$page->onLoad();
+
?>
\ No newline at end of file
diff --git a/interface/web/dns/dns_wizard.php b/interface/web/dns/dns_wizard.php
index e01c207..1b083dc 100644
--- a/interface/web/dns/dns_wizard.php
+++ b/interface/web/dns/dns_wizard.php
@@ -93,8 +93,29 @@
}
$app->tpl->setVar("client_group_id",$client_select);
-
}
+
+if ($_SESSION["s"]["user"]["typ"] != 'admin' && $app->auth->has_clients($_SESSION['s']['user']['userid'])) {
+
+ // Get the limits of the client
+ $client_group_id = $_SESSION["s"]["user"]["default_group"];
+ $client = $app->db->queryOneRecord("SELECT client.client_id, contact_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 groupid, name 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);
+ $client_select = '<option value="'.$client['client_id'].'">'.$client['contact_name'].'</option>';
+ if(is_array($clients)) {
+ foreach( $clients as $client) {
+ $selected = ($client["groupid"] == $sys_groupid)?'SELECTED':'';
+ $client_select .= "<option value='$client[groupid]' $selected>$client[name]</option>\r\n";
+ }
+ }
+
+ $app->tpl->setVar("client_group_id",$client_select);
+}
+
$template_record = $app->db->queryOneRecord("SELECT * FROM dns_template WHERE template_id = '$template_id'");
$fields = explode(',',$template_record['fields']);
@@ -116,6 +137,18 @@
if(isset($_POST['ns2']) && $_POST['ns2'] == '') $error .= $app->lng('error_ns2_empty').'<br />';
if(isset($_POST['email']) && $_POST['email'] == '') $error .= $app->lng('error_email_empty').'<br />';
+ $tform_def_file = "form/dns_soa.tform.php";
+ $app->uses('tform');
+ $app->tform->loadFormDef($tform_def_file);
+
+
+ if(!$app->tform->checkClientLimit('limit_dns_zone')) {
+ $error .= $app->tform->wordbook["limit_dns_zone_txt"];
+ }
+ if(!$app->tform->checkResellerLimit('limit_dns_zone')) {
+ $error .= $app->tform->wordbook["limit_dns_zone_txt"];
+ }
+
// replace template placeholders
$tpl_content = $template_record['template'];
diff --git a/interface/web/dns/lib/lang/bg_dns_a.lng b/interface/web/dns/lib/lang/bg_dns_a.lng
index 12dae40..8802139 100644
--- a/interface/web/dns/lib/lang/bg_dns_a.lng
+++ b/interface/web/dns/lib/lang/bg_dns_a.lng
@@ -12,4 +12,5 @@
$wb['name_error_regex'] = 'The hostname has the wrong format.';
$wb['data_error_empty'] = 'IP-Address empty';
$wb['data_error_regex'] = 'IP-Address format invalid';
+$wb['data_error_duplicate'] = 'Duplicate A-Record';
?>
diff --git a/interface/web/dns/lib/lang/bg_dns_aaaa.lng b/interface/web/dns/lib/lang/bg_dns_aaaa.lng
new file mode 100644
index 0000000..31ef0da
--- /dev/null
+++ b/interface/web/dns/lib/lang/bg_dns_aaaa.lng
@@ -0,0 +1,15 @@
+<?php
+$wb['server_id_txt'] = 'Server';
+$wb['zone_txt'] = 'Zone';
+$wb['name_txt'] = 'Hostname';
+$wb['type_txt'] = 'type';
+$wb['data_txt'] = 'IPv6-Address';
+$wb['ttl_txt'] = 'TTL';
+$wb['active_txt'] = 'Active';
+$wb['limit_dns_record_txt'] = 'The max. number of DNS records for your account is reached.';
+$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.';
+$wb['name_error_empty'] = 'The hostname is empty.';
+$wb['name_error_regex'] = 'The hostname has the wrong format.';
+$wb['data_error_empty'] = 'IP-Address empty';
+$wb['data_error_regex'] = 'IP-Address format invalid';
+?>
diff --git a/interface/web/dns/lib/lang/bg_dns_wizard.lng b/interface/web/dns/lib/lang/bg_dns_wizard.lng
index 9a56d26..2853c02 100644
--- a/interface/web/dns/lib/lang/bg_dns_wizard.lng
+++ b/interface/web/dns/lib/lang/bg_dns_wizard.lng
@@ -10,4 +10,16 @@
$wb['ns2_txt'] = 'NS 2';
$wb['ip_txt'] = 'IP Address';
$wb['error_origin_empty'] = 'Origin empty.';
+$wb['error_ns_empty'] = 'NS empty.';
+$wb['error_mbox_empty'] = 'Mbox empty.';
+$wb['error_refresh_empty'] = 'Refresh empty.';
+$wb['error_retry_empty'] = 'Retry empty.';
+$wb['error_expire_empty'] = 'Expire empty.';
+$wb['error_minimum_empty'] = 'Minimum empty.';
+$wb['error_ttl_empty'] = 'TTL empty.';
+$wb['error_domain_empty'] = 'Domain empty';
+$wb['error_ip_empty'] = 'IP empty.';
+$wb['error_ns1_empty'] = 'NS1 empty.';
+$wb['error_ns2_empty'] = 'NS2 empty.';
+$wb['error_email_empty'] = 'EMail empty.';
?>
diff --git a/interface/web/dns/lib/lang/br.lng b/interface/web/dns/lib/lang/br.lng
new file mode 100644
index 0000000..e166b4d
--- /dev/null
+++ b/interface/web/dns/lib/lang/br.lng
@@ -0,0 +1,19 @@
+<?php
+
+$wb['DNS'] = 'DNS';
+$wb['Zones'] = 'Zonas';
+$wb['DNS A'] = 'DNS A';
+$wb['DNS ALIAS'] = 'ALIAS DNS';
+$wb['DNS CNAME'] = 'CNAME DNS';
+$wb['DNS hinfo'] = 'hinfo DNS';
+$wb['DNS mx'] = 'mx DNS';
+$wb['DNS ns'] = 'ns DNS';
+$wb['DNS ptr'] = 'ptr DNS';
+$wb['DNS RP'] = 'RP DNS';
+$wb['DNS Zone'] = 'Zona DNS';
+$wb['Records'] = 'Registros';
+$wb['DNS SRV'] = 'SRV DNS';
+$wb['DNS TXT Record'] = 'Registro TXT DNS';
+$wb['DNS TXT'] = 'TXT DNS';
+
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_a.lng b/interface/web/dns/lib/lang/br_dns_a.lng
new file mode 100644
index 0000000..68af3ba
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_a.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["zone_txt"] = 'Zona';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'tipo';
+$wb["data_txt"] = 'Endereço-IP';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_dns_record_txt"] = 'O número máximo de zonas DNS para sua conta foi atingido.';
+$wb["no_zone_perm"] = 'Você não tem permição para adcionar registros a está zona DNS.';
+$wb["name_error_empty"] = 'Hostname em branco.';
+$wb["name_error_regex"] = 'Hostname tem um formato inválido.';
+$wb["data_error_empty"] = 'Endereço-IP em branco';
+$wb["data_error_regex"] = 'Endereço-IP formato inválido';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_a_list.lng b/interface/web/dns/lib/lang/br_dns_a_list.lng
new file mode 100644
index 0000000..760c4a5
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_a_list.lng
@@ -0,0 +1,14 @@
+<?php
+$wb["list_head_txt"] = 'Registro (A)';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["zone_txt"] = 'Zona';
+$wb["name_txt"] = 'Nome';
+$wb["data_txt"] = 'Data';
+$wb["aux_txt"] = 'Prioridade';
+$wb["type_txt"] = 'Tipo';
+$wb["add_new_record_txt"] = 'Adcionar um novo registro DNS (A)';
+$wb["page_txt"] = 'Página';
+$wb["page_of_txt"] = 'de';
+$wb['delete_confirmation'] = 'Tem certeza que deseja remover este registro?';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_aaaa.lng b/interface/web/dns/lib/lang/br_dns_aaaa.lng
new file mode 100644
index 0000000..c56d558
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_aaaa.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb["zone_txt"] = 'Zone';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'type';
+$wb["data_txt"] = 'IPv6-Address';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Active';
+$wb["limit_dns_record_txt"] = 'The max. number of DNS records for your account is reached.';
+$wb["no_zone_perm"] = 'You do not have the permission to add a record to this DNS zone.';
+$wb["name_error_empty"] = 'The hostname is empty.';
+$wb["name_error_regex"] = 'The hostname has the wrong format.';
+$wb["data_error_empty"] = 'IP-Address empty';
+$wb["data_error_regex"] = 'IP-Address format invalid';
+?>
\ No newline at end of file
diff --git a/interface/web/dns/lib/lang/br_dns_alias.lng b/interface/web/dns/lib/lang/br_dns_alias.lng
new file mode 100644
index 0000000..6e9e78b
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_alias.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["zone_txt"] = 'Zona';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'tipo';
+$wb["data_txt"] = 'Hostname Alvo';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_dns_record_txt"] = 'O número máximo de registros DNS para sua conta foi atingido.';
+$wb["no_zone_perm"] = 'Você não tem permição para adcionar registros a está zona DNS.';
+$wb["name_error_empty"] = 'Hostname está em branco.';
+$wb["name_error_regex"] = 'O hostname está em um formato inválido.';
+$wb["data_error_empty"] = 'Hostname de destino está em branco';
+$wb["data_error_regex"] = 'O hostname de destino está em um formato inválido.';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_cname.lng b/interface/web/dns/lib/lang/br_dns_cname.lng
new file mode 100644
index 0000000..1bb0074
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_cname.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["zone_txt"] = 'Zona';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'tipo';
+$wb["data_txt"] = 'Hostname de Destino';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_dns_record_txt"] = 'O número máximo de registros DNS para sua conta foi atingido.';
+$wb["no_zone_perm"] = 'Você não tem permição para adcionar registros a está zona DNS.';
+$wb["name_error_empty"] = 'Hostname está em branco.';
+$wb["name_error_regex"] = 'O hostname está em um formato inválido.';
+$wb["data_error_empty"] = 'Hostname de destino está em branco';
+$wb["data_error_regex"] = 'O hostname de destino está em um formato inválido.';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_hinfo.lng b/interface/web/dns/lib/lang/br_dns_hinfo.lng
new file mode 100644
index 0000000..1e08214
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_hinfo.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["zone_txt"] = 'Zona';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'tipo';
+$wb["data_txt"] = 'Informações do Host';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_dns_record_txt"] = 'O número máximo de zonas DNS para sua conta foi atingido.';
+$wb["no_zone_perm"] = 'Você não tem permição para adcionar registros a está zona DNS.';
+$wb["name_error_empty"] = 'Hostname em branco.';
+$wb["name_error_regex"] = 'Hostname tem um formato inválido.';
+$wb["data_error_empty"] = 'Endereço-IP em branco';
+$wb["data_error_regex"] = 'Endereço-IP formato inválido';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_mx.lng b/interface/web/dns/lib/lang/br_dns_mx.lng
new file mode 100644
index 0000000..7f2cb4e
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_mx.lng
@@ -0,0 +1,16 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["zone_txt"] = 'Zona';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'tipo';
+$wb["data_txt"] = 'Hostname do servidor de correio';
+$wb["aux_txt"] = 'Prioridade';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_dns_record_txt"] = 'O número máximo de zonas DNS para sua conta foi atingido.';
+$wb["no_zone_perm"] = 'Você não tem permição para adcionar registros a está zona DNS.';
+$wb["name_error_empty"] = 'Hostname em branco.';
+$wb["name_error_regex"] = 'Hostname tem um formato inválido.';
+$wb["data_error_empty"] = 'Hostname do servidor de correio em branco';
+$wb["data_error_regex"] = 'Hostname do servidor de correio formato inválido';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_ns.lng b/interface/web/dns/lib/lang/br_dns_ns.lng
new file mode 100644
index 0000000..3632e47
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_ns.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["zone_txt"] = 'Zona';
+$wb["name_txt"] = 'Zona';
+$wb["type_txt"] = 'tipo';
+$wb["data_txt"] = 'Hostname Servidor de Nomes';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_dns_record_txt"] = 'O número máximo de zonas DNS para sua conta foi atingido.';
+$wb["no_zone_perm"] = 'Você não tem permição para adcionar registros a está zona DNS.';
+$wb["name_error_empty"] = 'A zona está em branco.';
+$wb["name_error_regex"] = 'A zona está com formato inválido.';
+$wb["data_error_empty"] = 'Servidor de nomes em branco';
+$wb["data_error_regex"] = 'Servidor de nomes com formato inválido';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_ptr.lng b/interface/web/dns/lib/lang/br_dns_ptr.lng
new file mode 100644
index 0000000..7311624
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_ptr.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["zone_txt"] = 'Zona';
+$wb["name_txt"] = 'Nnome';
+$wb["type_txt"] = 'tipo';
+$wb["data_txt"] = 'Hostname Canônico';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_dns_record_txt"] = 'O número máximo de zonas DNS para sua conta foi atingido.';
+$wb["no_zone_perm"] = 'Você não tem permição para adcionar registros a está zona DNS.';
+$wb["name_error_empty"] = 'Hostname em branco.';
+$wb["name_error_regex"] = 'Hostname tem um formato inválido.';
+$wb["data_error_empty"] = 'Endereço-IP em branco';
+$wb["data_error_regex"] = 'Endereço-IP formato inválido';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_rp.lng b/interface/web/dns/lib/lang/br_dns_rp.lng
new file mode 100644
index 0000000..b20aa21
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_rp.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["zone_txt"] = 'Zona';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'tipo';
+$wb["data_txt"] = 'Pessoa Responsável';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_dns_record_txt"] = 'O número máximo de zonas DNS para sua conta foi atingido.';
+$wb["no_zone_perm"] = 'Você não tem permição para adcionar registros a está zona DNS.';
+$wb["name_error_empty"] = 'O Hostname está em branco.';
+$wb["name_error_regex"] = 'O Hostname está com formato inválido.';
+$wb["data_error_empty"] = 'Pessoa responsável em branco';
+$wb["data_error_regex"] = 'Pessoa responsável formato inválido';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_soa.lng b/interface/web/dns/lib/lang/br_dns_soa.lng
new file mode 100644
index 0000000..673cf4c
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_soa.lng
@@ -0,0 +1,24 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["origin_txt"] = 'Zona (SOA)';
+$wb["ns_txt"] = 'NS';
+$wb["mbox_txt"] = 'Correio';
+$wb["serial_txt"] = 'Serial';
+$wb["refresh_txt"] = 'Refresh';
+$wb["retry_txt"] = 'Retry';
+$wb["expire_txt"] = 'Expire';
+$wb["minimum_txt"] = 'Minimum';
+$wb["ttl_txt"] = 'TTL';
+$wb["xfer_txt"] = 'Permitir transferências de zona para <br />estes IPs (lista separada por ponto e vírgula)';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_dns_zone_txt"] = 'O número máximo de zonas DNS para sua conta foi atingido.';
+$wb["client_txt"] = 'Cliente';
+$wb["no_zone_perm"] = 'Você não tem permição para adcionar registros a está zona DNS.';
+$wb["server_id_error_empty"] = 'Servidor não selecionado';
+$wb["origin_error_empty"] = 'Zona vazia.';
+$wb["origin_error_unique"] = 'Este registro já existe nesta zona.';
+$wb["origin_error_regex"] = 'Formato de zona inválido.';
+$wb["ns_error_regex"] = 'NS tem um formato inválido.';
+$wb["mbox_error_empty"] = 'Correio está em branco.';
+$wb["mbox_error_regex"] = 'Correio com formato inválido.';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_soa_list.lng b/interface/web/dns/lib/lang/br_dns_soa_list.lng
new file mode 100644
index 0000000..94577f3
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_soa_list.lng
@@ -0,0 +1,9 @@
+<?php
+$wb["list_head_txt"] = 'Zonas DNS';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["origin_txt"] = 'Zona';
+$wb["ns_txt"] = 'NS';
+$wb["mbox_txt"] = 'Correio';
+$wb["add_new_record_txt"] = 'Adcionar uma nova zona dns (SOA)';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_srv.lng b/interface/web/dns/lib/lang/br_dns_srv.lng
new file mode 100644
index 0000000..06610c8
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_srv.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["zone_txt"] = 'Zona';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'tipo';
+$wb["data_txt"] = 'Registro do Servidor';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_dns_record_txt"] = 'O número máximo de zonas DNS para sua conta foi atingido.';
+$wb["no_zone_perm"] = 'Você não tem permição para adcionar registros a está zona DNS.';
+$wb["name_error_empty"] = 'O Hostname está em branco.';
+$wb["name_error_regex"] = 'O Hostname está com formato inválido.';
+$wb["data_error_empty"] = 'Registro do Servidor em branco';
+$wb["data_error_regex"] = 'Registro do Servidor com formato inválido';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_template.lng b/interface/web/dns/lib/lang/br_dns_template.lng
new file mode 100644
index 0000000..92c62d3
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_template.lng
@@ -0,0 +1,6 @@
+<?php
+$wb["name_txt"] = 'Nome';
+$wb["fields_txt"] = 'Campos';
+$wb["template_txt"] = 'Gabarito';
+$wb["visible_txt"] = 'Visível';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_template_list.lng b/interface/web/dns/lib/lang/br_dns_template_list.lng
new file mode 100644
index 0000000..8fefc2e
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_template_list.lng
@@ -0,0 +1,6 @@
+<?php
+$wb["list_head_txt"] = 'Assistente de Gabaritos DNS';
+$wb["visible_txt"] = 'Visível';
+$wb["name_txt"] = 'Nome';
+$wb["add_new_record_txt"] = 'Adcionar novo registro';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_txt.lng b/interface/web/dns/lib/lang/br_dns_txt.lng
new file mode 100644
index 0000000..5fda9f2
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_txt.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["zone_txt"] = 'Zona';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'tipo';
+$wb["data_txt"] = 'Text';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_dns_record_txt"] = 'O número máximo de zonas DNS para sua conta foi atingido.';
+$wb["no_zone_perm"] = 'Você não tem permição para adcionar registros a está zona DNS.';
+$wb["name_error_empty"] = 'Hostname em branco.';
+$wb["name_error_regex"] = 'Hostname tem um formato inválido.';
+$wb["data_error_empty"] = 'Endereço-IP em branco';
+$wb["data_error_regex"] = 'Endereço-IP formato inválido';
+?>
diff --git a/interface/web/dns/lib/lang/br_dns_wizard.lng b/interface/web/dns/lib/lang/br_dns_wizard.lng
new file mode 100644
index 0000000..5d33da9
--- /dev/null
+++ b/interface/web/dns/lib/lang/br_dns_wizard.lng
@@ -0,0 +1,16 @@
+<?php
+
+$wb['template_id_txt'] = 'Gabarito';
+$wb['server_id_txt'] = 'Servidor';
+$wb['client_txt'] = 'Cliente';
+$wb["btn_save_txt"] = 'Criar Registro DNS';
+$wb["btn_cancel_txt"] = 'Cancelar';
+$wb['domain_txt'] = 'Domínio';
+$wb['email_txt'] = 'Correio';
+$wb['ns1_txt'] = 'NS 1';
+$wb['ns2_txt'] = 'NS 2';
+$wb['ip_txt'] = 'Endereço IP';
+
+$wb['error_origin_empty'] = 'Origem em branco.';
+
+?>
diff --git a/interface/web/dns/lib/lang/de_dns_a.lng b/interface/web/dns/lib/lang/de_dns_a.lng
index 8f2a6dd..1f1bd19 100644
--- a/interface/web/dns/lib/lang/de_dns_a.lng
+++ b/interface/web/dns/lib/lang/de_dns_a.lng
@@ -12,4 +12,5 @@
$wb['name_error_regex'] = 'Der Hostname hat das falsche Format.';
$wb['data_error_empty'] = 'IP Adresse ist leer';
$wb['data_error_regex'] = 'Format der IP Adresse ist ungültig';
+$wb['data_error_duplicate'] = 'Duplicate A-Record';
?>
diff --git a/interface/web/dns/lib/lang/de_dns_aaaa.lng b/interface/web/dns/lib/lang/de_dns_aaaa.lng
new file mode 100644
index 0000000..31ef0da
--- /dev/null
+++ b/interface/web/dns/lib/lang/de_dns_aaaa.lng
@@ -0,0 +1,15 @@
+<?php
+$wb['server_id_txt'] = 'Server';
+$wb['zone_txt'] = 'Zone';
+$wb['name_txt'] = 'Hostname';
+$wb['type_txt'] = 'type';
+$wb['data_txt'] = 'IPv6-Address';
+$wb['ttl_txt'] = 'TTL';
+$wb['active_txt'] = 'Active';
+$wb['limit_dns_record_txt'] = 'The max. number of DNS records for your account is reached.';
+$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.';
+$wb['name_error_empty'] = 'The hostname is empty.';
+$wb['name_error_regex'] = 'The hostname has the wrong format.';
+$wb['data_error_empty'] = 'IP-Address empty';
+$wb['data_error_regex'] = 'IP-Address format invalid';
+?>
diff --git a/interface/web/dns/lib/lang/de_dns_wizard.lng b/interface/web/dns/lib/lang/de_dns_wizard.lng
index 9a56d26..2853c02 100644
--- a/interface/web/dns/lib/lang/de_dns_wizard.lng
+++ b/interface/web/dns/lib/lang/de_dns_wizard.lng
@@ -10,4 +10,16 @@
$wb['ns2_txt'] = 'NS 2';
$wb['ip_txt'] = 'IP Address';
$wb['error_origin_empty'] = 'Origin empty.';
+$wb['error_ns_empty'] = 'NS empty.';
+$wb['error_mbox_empty'] = 'Mbox empty.';
+$wb['error_refresh_empty'] = 'Refresh empty.';
+$wb['error_retry_empty'] = 'Retry empty.';
+$wb['error_expire_empty'] = 'Expire empty.';
+$wb['error_minimum_empty'] = 'Minimum empty.';
+$wb['error_ttl_empty'] = 'TTL empty.';
+$wb['error_domain_empty'] = 'Domain empty';
+$wb['error_ip_empty'] = 'IP empty.';
+$wb['error_ns1_empty'] = 'NS1 empty.';
+$wb['error_ns2_empty'] = 'NS2 empty.';
+$wb['error_email_empty'] = 'EMail empty.';
?>
diff --git a/interface/web/dns/lib/lang/en_dns_a.lng b/interface/web/dns/lib/lang/en_dns_a.lng
index 477f9e4..599de5c 100644
--- a/interface/web/dns/lib/lang/en_dns_a.lng
+++ b/interface/web/dns/lib/lang/en_dns_a.lng
@@ -12,4 +12,5 @@
$wb["name_error_regex"] = 'The hostname has the wrong format.';
$wb["data_error_empty"] = 'IP-Address empty';
$wb["data_error_regex"] = 'IP-Address format invalid';
+$wb["data_error_duplicate"] = 'Duplicate A-Record';
?>
\ No newline at end of file
diff --git a/interface/web/dns/lib/lang/es_dns_a.lng b/interface/web/dns/lib/lang/es_dns_a.lng
index 7f923e7..dc33df0 100644
--- a/interface/web/dns/lib/lang/es_dns_a.lng
+++ b/interface/web/dns/lib/lang/es_dns_a.lng
@@ -12,4 +12,5 @@
$wb['name_error_regex'] = 'El formato del nombre de máquina es incorrecto.';
$wb['data_error_empty'] = 'Dirección IP vacía';
$wb['data_error_regex'] = 'El formato de la dirección IP es inválido.';
+$wb['data_error_duplicate'] = 'Duplicate A-Record';
?>
diff --git a/interface/web/dns/lib/lang/es_dns_aaaa.lng b/interface/web/dns/lib/lang/es_dns_aaaa.lng
new file mode 100644
index 0000000..c56d558
--- /dev/null
+++ b/interface/web/dns/lib/lang/es_dns_aaaa.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb["zone_txt"] = 'Zone';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'type';
+$wb["data_txt"] = 'IPv6-Address';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Active';
+$wb["limit_dns_record_txt"] = 'The max. number of DNS records for your account is reached.';
+$wb["no_zone_perm"] = 'You do not have the permission to add a record to this DNS zone.';
+$wb["name_error_empty"] = 'The hostname is empty.';
+$wb["name_error_regex"] = 'The hostname has the wrong format.';
+$wb["data_error_empty"] = 'IP-Address empty';
+$wb["data_error_regex"] = 'IP-Address format invalid';
+?>
\ No newline at end of file
diff --git a/interface/web/dns/lib/lang/es_dns_wizard.lng b/interface/web/dns/lib/lang/es_dns_wizard.lng
index 94852f3..d19c6e3 100644
--- a/interface/web/dns/lib/lang/es_dns_wizard.lng
+++ b/interface/web/dns/lib/lang/es_dns_wizard.lng
@@ -10,4 +10,16 @@
$wb['ns2_txt'] = 'NS 2';
$wb['ip_txt'] = 'Dirección IP';
$wb['error_origin_empty'] = 'Origen vacío.';
+$wb['error_ns_empty'] = 'NS empty.';
+$wb['error_mbox_empty'] = 'Mbox empty.';
+$wb['error_refresh_empty'] = 'Refresh empty.';
+$wb['error_retry_empty'] = 'Retry empty.';
+$wb['error_expire_empty'] = 'Expire empty.';
+$wb['error_minimum_empty'] = 'Minimum empty.';
+$wb['error_ttl_empty'] = 'TTL empty.';
+$wb['error_domain_empty'] = 'Domain empty';
+$wb['error_ip_empty'] = 'IP empty.';
+$wb['error_ns1_empty'] = 'NS1 empty.';
+$wb['error_ns2_empty'] = 'NS2 empty.';
+$wb['error_email_empty'] = 'EMail empty.';
?>
diff --git a/interface/web/dns/lib/lang/fi_dns_a.lng b/interface/web/dns/lib/lang/fi_dns_a.lng
index 0248631..184150a 100755
--- a/interface/web/dns/lib/lang/fi_dns_a.lng
+++ b/interface/web/dns/lib/lang/fi_dns_a.lng
@@ -12,4 +12,5 @@
$wb['name_error_regex'] = 'Verkkotunnus on vääränlainen.';
$wb['data_error_empty'] = 'IP-osoite tyhjä';
$wb['data_error_regex'] = 'IP-osoite on vääränlainen';
+$wb['data_error_duplicate'] = 'Duplicate A-Record';
?>
diff --git a/interface/web/dns/lib/lang/fi_dns_aaaa.lng b/interface/web/dns/lib/lang/fi_dns_aaaa.lng
new file mode 100644
index 0000000..c56d558
--- /dev/null
+++ b/interface/web/dns/lib/lang/fi_dns_aaaa.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb["zone_txt"] = 'Zone';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'type';
+$wb["data_txt"] = 'IPv6-Address';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Active';
+$wb["limit_dns_record_txt"] = 'The max. number of DNS records for your account is reached.';
+$wb["no_zone_perm"] = 'You do not have the permission to add a record to this DNS zone.';
+$wb["name_error_empty"] = 'The hostname is empty.';
+$wb["name_error_regex"] = 'The hostname has the wrong format.';
+$wb["data_error_empty"] = 'IP-Address empty';
+$wb["data_error_regex"] = 'IP-Address format invalid';
+?>
\ No newline at end of file
diff --git a/interface/web/dns/lib/lang/fi_dns_wizard.lng b/interface/web/dns/lib/lang/fi_dns_wizard.lng
index 966447f..40b6458 100755
--- a/interface/web/dns/lib/lang/fi_dns_wizard.lng
+++ b/interface/web/dns/lib/lang/fi_dns_wizard.lng
@@ -10,4 +10,16 @@
$wb['ns2_txt'] = '2. nimipalvelin';
$wb['ip_txt'] = 'IP-osoite';
$wb['error_origin_empty'] = 'Verkkotunnusta ei ole annettu.';
+$wb['error_ns_empty'] = 'NS empty.';
+$wb['error_mbox_empty'] = 'Mbox empty.';
+$wb['error_refresh_empty'] = 'Refresh empty.';
+$wb['error_retry_empty'] = 'Retry empty.';
+$wb['error_expire_empty'] = 'Expire empty.';
+$wb['error_minimum_empty'] = 'Minimum empty.';
+$wb['error_ttl_empty'] = 'TTL empty.';
+$wb['error_domain_empty'] = 'Domain empty';
+$wb['error_ip_empty'] = 'IP empty.';
+$wb['error_ns1_empty'] = 'NS1 empty.';
+$wb['error_ns2_empty'] = 'NS2 empty.';
+$wb['error_email_empty'] = 'EMail empty.';
?>
diff --git a/interface/web/dns/lib/lang/fr_dns_a.lng b/interface/web/dns/lib/lang/fr_dns_a.lng
index 12dae40..8802139 100644
--- a/interface/web/dns/lib/lang/fr_dns_a.lng
+++ b/interface/web/dns/lib/lang/fr_dns_a.lng
@@ -12,4 +12,5 @@
$wb['name_error_regex'] = 'The hostname has the wrong format.';
$wb['data_error_empty'] = 'IP-Address empty';
$wb['data_error_regex'] = 'IP-Address format invalid';
+$wb['data_error_duplicate'] = 'Duplicate A-Record';
?>
diff --git a/interface/web/dns/lib/lang/fr_dns_aaaa.lng b/interface/web/dns/lib/lang/fr_dns_aaaa.lng
new file mode 100644
index 0000000..31ef0da
--- /dev/null
+++ b/interface/web/dns/lib/lang/fr_dns_aaaa.lng
@@ -0,0 +1,15 @@
+<?php
+$wb['server_id_txt'] = 'Server';
+$wb['zone_txt'] = 'Zone';
+$wb['name_txt'] = 'Hostname';
+$wb['type_txt'] = 'type';
+$wb['data_txt'] = 'IPv6-Address';
+$wb['ttl_txt'] = 'TTL';
+$wb['active_txt'] = 'Active';
+$wb['limit_dns_record_txt'] = 'The max. number of DNS records for your account is reached.';
+$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.';
+$wb['name_error_empty'] = 'The hostname is empty.';
+$wb['name_error_regex'] = 'The hostname has the wrong format.';
+$wb['data_error_empty'] = 'IP-Address empty';
+$wb['data_error_regex'] = 'IP-Address format invalid';
+?>
diff --git a/interface/web/dns/lib/lang/fr_dns_wizard.lng b/interface/web/dns/lib/lang/fr_dns_wizard.lng
index 9a56d26..2853c02 100644
--- a/interface/web/dns/lib/lang/fr_dns_wizard.lng
+++ b/interface/web/dns/lib/lang/fr_dns_wizard.lng
@@ -10,4 +10,16 @@
$wb['ns2_txt'] = 'NS 2';
$wb['ip_txt'] = 'IP Address';
$wb['error_origin_empty'] = 'Origin empty.';
+$wb['error_ns_empty'] = 'NS empty.';
+$wb['error_mbox_empty'] = 'Mbox empty.';
+$wb['error_refresh_empty'] = 'Refresh empty.';
+$wb['error_retry_empty'] = 'Retry empty.';
+$wb['error_expire_empty'] = 'Expire empty.';
+$wb['error_minimum_empty'] = 'Minimum empty.';
+$wb['error_ttl_empty'] = 'TTL empty.';
+$wb['error_domain_empty'] = 'Domain empty';
+$wb['error_ip_empty'] = 'IP empty.';
+$wb['error_ns1_empty'] = 'NS1 empty.';
+$wb['error_ns2_empty'] = 'NS2 empty.';
+$wb['error_email_empty'] = 'EMail empty.';
?>
diff --git a/interface/web/dns/lib/lang/it_dns_a.lng b/interface/web/dns/lib/lang/it_dns_a.lng
index 12dae40..8802139 100644
--- a/interface/web/dns/lib/lang/it_dns_a.lng
+++ b/interface/web/dns/lib/lang/it_dns_a.lng
@@ -12,4 +12,5 @@
$wb['name_error_regex'] = 'The hostname has the wrong format.';
$wb['data_error_empty'] = 'IP-Address empty';
$wb['data_error_regex'] = 'IP-Address format invalid';
+$wb['data_error_duplicate'] = 'Duplicate A-Record';
?>
diff --git a/interface/web/dns/lib/lang/it_dns_aaaa.lng b/interface/web/dns/lib/lang/it_dns_aaaa.lng
new file mode 100644
index 0000000..c56d558
--- /dev/null
+++ b/interface/web/dns/lib/lang/it_dns_aaaa.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb["zone_txt"] = 'Zone';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'type';
+$wb["data_txt"] = 'IPv6-Address';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Active';
+$wb["limit_dns_record_txt"] = 'The max. number of DNS records for your account is reached.';
+$wb["no_zone_perm"] = 'You do not have the permission to add a record to this DNS zone.';
+$wb["name_error_empty"] = 'The hostname is empty.';
+$wb["name_error_regex"] = 'The hostname has the wrong format.';
+$wb["data_error_empty"] = 'IP-Address empty';
+$wb["data_error_regex"] = 'IP-Address format invalid';
+?>
\ No newline at end of file
diff --git a/interface/web/dns/lib/lang/it_dns_wizard.lng b/interface/web/dns/lib/lang/it_dns_wizard.lng
index 9a56d26..2853c02 100644
--- a/interface/web/dns/lib/lang/it_dns_wizard.lng
+++ b/interface/web/dns/lib/lang/it_dns_wizard.lng
@@ -10,4 +10,16 @@
$wb['ns2_txt'] = 'NS 2';
$wb['ip_txt'] = 'IP Address';
$wb['error_origin_empty'] = 'Origin empty.';
+$wb['error_ns_empty'] = 'NS empty.';
+$wb['error_mbox_empty'] = 'Mbox empty.';
+$wb['error_refresh_empty'] = 'Refresh empty.';
+$wb['error_retry_empty'] = 'Retry empty.';
+$wb['error_expire_empty'] = 'Expire empty.';
+$wb['error_minimum_empty'] = 'Minimum empty.';
+$wb['error_ttl_empty'] = 'TTL empty.';
+$wb['error_domain_empty'] = 'Domain empty';
+$wb['error_ip_empty'] = 'IP empty.';
+$wb['error_ns1_empty'] = 'NS1 empty.';
+$wb['error_ns2_empty'] = 'NS2 empty.';
+$wb['error_email_empty'] = 'EMail empty.';
?>
diff --git a/interface/web/dns/lib/lang/nl_dns_a.lng b/interface/web/dns/lib/lang/nl_dns_a.lng
index 3f84271..cb9ea8f 100644
--- a/interface/web/dns/lib/lang/nl_dns_a.lng
+++ b/interface/web/dns/lib/lang/nl_dns_a.lng
@@ -12,4 +12,5 @@
$wb['name_error_regex'] = 'De hostname has the wrong format.';
$wb['data_error_empty'] = 'IP-Adres is leeg.';
$wb['data_error_regex'] = 'IP-Adres formaat ongeldig.';
+$wb['data_error_duplicate'] = 'Duplicate A-Record';
?>
diff --git a/interface/web/dns/lib/lang/nl_dns_aaaa.lng b/interface/web/dns/lib/lang/nl_dns_aaaa.lng
new file mode 100644
index 0000000..c56d558
--- /dev/null
+++ b/interface/web/dns/lib/lang/nl_dns_aaaa.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb["zone_txt"] = 'Zone';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'type';
+$wb["data_txt"] = 'IPv6-Address';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Active';
+$wb["limit_dns_record_txt"] = 'The max. number of DNS records for your account is reached.';
+$wb["no_zone_perm"] = 'You do not have the permission to add a record to this DNS zone.';
+$wb["name_error_empty"] = 'The hostname is empty.';
+$wb["name_error_regex"] = 'The hostname has the wrong format.';
+$wb["data_error_empty"] = 'IP-Address empty';
+$wb["data_error_regex"] = 'IP-Address format invalid';
+?>
\ No newline at end of file
diff --git a/interface/web/dns/lib/lang/nl_dns_wizard.lng b/interface/web/dns/lib/lang/nl_dns_wizard.lng
index 9a56d26..2853c02 100644
--- a/interface/web/dns/lib/lang/nl_dns_wizard.lng
+++ b/interface/web/dns/lib/lang/nl_dns_wizard.lng
@@ -10,4 +10,16 @@
$wb['ns2_txt'] = 'NS 2';
$wb['ip_txt'] = 'IP Address';
$wb['error_origin_empty'] = 'Origin empty.';
+$wb['error_ns_empty'] = 'NS empty.';
+$wb['error_mbox_empty'] = 'Mbox empty.';
+$wb['error_refresh_empty'] = 'Refresh empty.';
+$wb['error_retry_empty'] = 'Retry empty.';
+$wb['error_expire_empty'] = 'Expire empty.';
+$wb['error_minimum_empty'] = 'Minimum empty.';
+$wb['error_ttl_empty'] = 'TTL empty.';
+$wb['error_domain_empty'] = 'Domain empty';
+$wb['error_ip_empty'] = 'IP empty.';
+$wb['error_ns1_empty'] = 'NS1 empty.';
+$wb['error_ns2_empty'] = 'NS2 empty.';
+$wb['error_email_empty'] = 'EMail empty.';
?>
diff --git a/interface/web/dns/lib/lang/ru_dns_a.lng b/interface/web/dns/lib/lang/ru_dns_a.lng
index 80d9c87..b6f3bc1 100644
--- a/interface/web/dns/lib/lang/ru_dns_a.lng
+++ b/interface/web/dns/lib/lang/ru_dns_a.lng
@@ -12,4 +12,5 @@
$wb['name_error_regex'] = 'Имя узла имеет неправильный формат.';
$wb['data_error_empty'] = 'IP-адрес пустой';
$wb['data_error_regex'] = 'Формат IP-адреса неправилен';
+$wb['data_error_duplicate'] = 'Duplicate A-Record';
?>
diff --git a/interface/web/dns/lib/lang/ru_dns_aaaa.lng b/interface/web/dns/lib/lang/ru_dns_aaaa.lng
new file mode 100644
index 0000000..c56d558
--- /dev/null
+++ b/interface/web/dns/lib/lang/ru_dns_aaaa.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb["zone_txt"] = 'Zone';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'type';
+$wb["data_txt"] = 'IPv6-Address';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Active';
+$wb["limit_dns_record_txt"] = 'The max. number of DNS records for your account is reached.';
+$wb["no_zone_perm"] = 'You do not have the permission to add a record to this DNS zone.';
+$wb["name_error_empty"] = 'The hostname is empty.';
+$wb["name_error_regex"] = 'The hostname has the wrong format.';
+$wb["data_error_empty"] = 'IP-Address empty';
+$wb["data_error_regex"] = 'IP-Address format invalid';
+?>
\ No newline at end of file
diff --git a/interface/web/dns/lib/lang/ru_dns_wizard.lng b/interface/web/dns/lib/lang/ru_dns_wizard.lng
index 9a56d26..2853c02 100644
--- a/interface/web/dns/lib/lang/ru_dns_wizard.lng
+++ b/interface/web/dns/lib/lang/ru_dns_wizard.lng
@@ -10,4 +10,16 @@
$wb['ns2_txt'] = 'NS 2';
$wb['ip_txt'] = 'IP Address';
$wb['error_origin_empty'] = 'Origin empty.';
+$wb['error_ns_empty'] = 'NS empty.';
+$wb['error_mbox_empty'] = 'Mbox empty.';
+$wb['error_refresh_empty'] = 'Refresh empty.';
+$wb['error_retry_empty'] = 'Retry empty.';
+$wb['error_expire_empty'] = 'Expire empty.';
+$wb['error_minimum_empty'] = 'Minimum empty.';
+$wb['error_ttl_empty'] = 'TTL empty.';
+$wb['error_domain_empty'] = 'Domain empty';
+$wb['error_ip_empty'] = 'IP empty.';
+$wb['error_ns1_empty'] = 'NS1 empty.';
+$wb['error_ns2_empty'] = 'NS2 empty.';
+$wb['error_email_empty'] = 'EMail empty.';
?>
diff --git a/interface/web/dns/lib/lang/se_dns_a.lng b/interface/web/dns/lib/lang/se_dns_a.lng
index 12dae40..8802139 100644
--- a/interface/web/dns/lib/lang/se_dns_a.lng
+++ b/interface/web/dns/lib/lang/se_dns_a.lng
@@ -12,4 +12,5 @@
$wb['name_error_regex'] = 'The hostname has the wrong format.';
$wb['data_error_empty'] = 'IP-Address empty';
$wb['data_error_regex'] = 'IP-Address format invalid';
+$wb['data_error_duplicate'] = 'Duplicate A-Record';
?>
diff --git a/interface/web/dns/lib/lang/se_dns_aaaa.lng b/interface/web/dns/lib/lang/se_dns_aaaa.lng
new file mode 100644
index 0000000..c56d558
--- /dev/null
+++ b/interface/web/dns/lib/lang/se_dns_aaaa.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb["zone_txt"] = 'Zone';
+$wb["name_txt"] = 'Hostname';
+$wb["type_txt"] = 'type';
+$wb["data_txt"] = 'IPv6-Address';
+$wb["ttl_txt"] = 'TTL';
+$wb["active_txt"] = 'Active';
+$wb["limit_dns_record_txt"] = 'The max. number of DNS records for your account is reached.';
+$wb["no_zone_perm"] = 'You do not have the permission to add a record to this DNS zone.';
+$wb["name_error_empty"] = 'The hostname is empty.';
+$wb["name_error_regex"] = 'The hostname has the wrong format.';
+$wb["data_error_empty"] = 'IP-Address empty';
+$wb["data_error_regex"] = 'IP-Address format invalid';
+?>
\ No newline at end of file
diff --git a/interface/web/dns/lib/lang/se_dns_wizard.lng b/interface/web/dns/lib/lang/se_dns_wizard.lng
index 9a56d26..2853c02 100644
--- a/interface/web/dns/lib/lang/se_dns_wizard.lng
+++ b/interface/web/dns/lib/lang/se_dns_wizard.lng
@@ -10,4 +10,16 @@
$wb['ns2_txt'] = 'NS 2';
$wb['ip_txt'] = 'IP Address';
$wb['error_origin_empty'] = 'Origin empty.';
+$wb['error_ns_empty'] = 'NS empty.';
+$wb['error_mbox_empty'] = 'Mbox empty.';
+$wb['error_refresh_empty'] = 'Refresh empty.';
+$wb['error_retry_empty'] = 'Retry empty.';
+$wb['error_expire_empty'] = 'Expire empty.';
+$wb['error_minimum_empty'] = 'Minimum empty.';
+$wb['error_ttl_empty'] = 'TTL empty.';
+$wb['error_domain_empty'] = 'Domain empty';
+$wb['error_ip_empty'] = 'IP empty.';
+$wb['error_ns1_empty'] = 'NS1 empty.';
+$wb['error_ns2_empty'] = 'NS2 empty.';
+$wb['error_email_empty'] = 'EMail empty.';
?>
diff --git a/interface/web/dns/lib/module.conf.php b/interface/web/dns/lib/module.conf.php
index d233ba2..0d33ad8 100644
--- a/interface/web/dns/lib/module.conf.php
+++ b/interface/web/dns/lib/module.conf.php
@@ -6,6 +6,26 @@
$module["startpage"] = "dns/dns_soa_list.php";
$module["tab_width"] = '';
+
+$items[] = array( 'title' => "Add DNS Zone",
+ 'target' => 'content',
+ 'link' => 'dns/dns_wizard.php');
+
+if($_SESSION["s"]["user"]["typ"] == 'admin') {
+
+ $items[] = array( 'title' => "Templates",
+ 'target' => 'content',
+ 'link' => 'dns/dns_template_list.php');
+}
+
+
+$module["nav"][] = array( 'title' => 'DNS Wizard',
+ 'open' => 1,
+ 'items' => $items);
+
+
+unset($items);
+
/*
Email accounts menu
*/
@@ -26,25 +46,6 @@
'items' => $items);
unset($items);
-
-
-$items[] = array( 'title' => "Add DNS Zone",
- 'target' => 'content',
- 'link' => 'dns/dns_wizard.php');
-
-
-$items[] = array( 'title' => "Templates",
- 'target' => 'content',
- 'link' => 'dns/dns_template_list.php');
-
-
-
-$module["nav"][] = array( 'title' => 'DNS Wizard',
- 'open' => 1,
- 'items' => $items);
-
-
-
diff --git a/interface/web/dns/list/dns_soa.list.php b/interface/web/dns/list/dns_soa.list.php
index 2fbea3c..c235fe7 100644
--- a/interface/web/dns/list/dns_soa.list.php
+++ b/interface/web/dns/list/dns_soa.list.php
@@ -64,10 +64,9 @@
'op' => "like",
'prefix' => "%",
'suffix' => "%",
- 'datasource' => array ( 'type' => 'SQL',
- 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name',
- 'keyfield'=> 'server_id',
- 'valuefield'=> 'server_name'
+ 'datasource' => array ( 'type' => 'CUSTOM',
+ 'class'=> 'custom_datasource',
+ 'function'=> 'dns_servers'
),
'width' => "",
'value' => "");
diff --git a/interface/web/dns/templates/dns_a_edit.htm b/interface/web/dns/templates/dns_a_edit.htm
index 395abcd..6a5577c 100644
--- a/interface/web/dns/templates/dns_a_edit.htm
+++ b/interface/web/dns/templates/dns_a_edit.htm
@@ -1,39 +1,39 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_dns_a">
-
- <div class="pnl_formsarea">
- <fieldset class="inlineLabels">
- <div class="ctrlHolder">
- <label for="name">{tmpl_var name='name_txt'}</label>
- <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
- <p class="formHint">{tmpl_var name='name_hint_txt'}</p>
- </div>
- <div class="ctrlHolder">
- <label for="data">{tmpl_var name='data_txt'}</label>
- <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput formLengthIPv4" />
- </div>
- <div class="ctrlHolder">
- <label for="ttl">{tmpl_var name='ttl_txt'}</label>
- <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <p class="label">{tmpl_var name='active_txt'}</p>
- <div class="multiField">
- {tmpl_var name='active'}
- </div>
- </div>
- </fieldset>
-
- <input type="hidden" name="id" value="{tmpl_var name='id'}">
- <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
- <input type="hidden" name="type" value="{tmpl_var name='type'}">
-
- <div class="buttonHolder buttons">
- <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_a_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('dns/dns_soa_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
- </div>
- </div>
-
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_dns_a">
+
+ <div class="pnl_formsarea">
+ <fieldset class="inlineLabels">
+ <div class="ctrlHolder">
+ <label for="name">{tmpl_var name='name_txt'}</label>
+ <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
+ <p class="formHint">{tmpl_var name='name_hint_txt'}</p>
+ </div>
+ <div class="ctrlHolder">
+ <label for="data">{tmpl_var name='data_txt'}</label>
+ <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput formLengthIPv4" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="ttl">{tmpl_var name='ttl_txt'}</label>
+ <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <p class="label">{tmpl_var name='active_txt'}</p>
+ <div class="multiField">
+ {tmpl_var name='active'}
+ </div>
+ </div>
+ </fieldset>
+
+ <input type="hidden" name="id" value="{tmpl_var name='id'}">
+ <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
+ <input type="hidden" name="type" value="{tmpl_var name='type'}">
+
+ <div class="buttonHolder buttons">
+ <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_a_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('dns/dns_soa_edit.php?id={tmpl_var name='zone'}');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+ </div>
+ </div>
+
+</div>
diff --git a/interface/web/dns/templates/dns_aaaa_edit.htm b/interface/web/dns/templates/dns_aaaa_edit.htm
index b58557e..10bfb09 100644
--- a/interface/web/dns/templates/dns_aaaa_edit.htm
+++ b/interface/web/dns/templates/dns_aaaa_edit.htm
@@ -32,7 +32,7 @@
<div class="buttonHolder buttons">
<button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_aaaa_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('dns/dns_soa_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+ <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('dns/dns_soa_edit.php?id={tmpl_var name='zone'}');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
</div>
</div>
diff --git a/interface/web/dns/templates/dns_alias_edit.htm b/interface/web/dns/templates/dns_alias_edit.htm
index 50a3335..dceb8cb 100644
--- a/interface/web/dns/templates/dns_alias_edit.htm
+++ b/interface/web/dns/templates/dns_alias_edit.htm
@@ -1,38 +1,38 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_dns_alias">
-
- <div class="pnl_formsarea">
- <fieldset class="inlineLabels">
- <div class="ctrlHolder">
- <label for="name">{tmpl_var name='name_txt'}</label>
- <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <label for="data">{tmpl_var name='data_txt'}</label>
- <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <label for="ttl">{tmpl_var name='ttl_txt'}</label>
- <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <p class="label">{tmpl_var name='active_txt'}</p>
- <div class="multiField">
- {tmpl_var name='active'}
- </div>
- </div>
- </fieldset>
-
- <input type="hidden" name="id" value="{tmpl_var name='id'}">
- <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
- <input type="hidden" name="type" value="{tmpl_var name='type'}">
-
- <div class="buttonHolder buttons">
- <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_alias_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('dns/dns_soa_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
- </div>
- </div>
-
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_dns_alias">
+
+ <div class="pnl_formsarea">
+ <fieldset class="inlineLabels">
+ <div class="ctrlHolder">
+ <label for="name">{tmpl_var name='name_txt'}</label>
+ <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="data">{tmpl_var name='data_txt'}</label>
+ <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="ttl">{tmpl_var name='ttl_txt'}</label>
+ <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <p class="label">{tmpl_var name='active_txt'}</p>
+ <div class="multiField">
+ {tmpl_var name='active'}
+ </div>
+ </div>
+ </fieldset>
+
+ <input type="hidden" name="id" value="{tmpl_var name='id'}">
+ <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
+ <input type="hidden" name="type" value="{tmpl_var name='type'}">
+
+ <div class="buttonHolder buttons">
+ <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_alias_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('dns/dns_soa_edit.php?id={tmpl_var name='zone'}');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+ </div>
+ </div>
+
+</div>
diff --git a/interface/web/dns/templates/dns_cname_edit.htm b/interface/web/dns/templates/dns_cname_edit.htm
index dd799af..9a63021 100644
--- a/interface/web/dns/templates/dns_cname_edit.htm
+++ b/interface/web/dns/templates/dns_cname_edit.htm
@@ -1,38 +1,38 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_dns_cname">
-
- <div class="pnl_formsarea">
- <fieldset class="inlineLabels">
- <div class="ctrlHolder">
- <label for="name">{tmpl_var name='name_txt'}</label>
- <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <label for="data">{tmpl_var name='data_txt'}</label>
- <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <label for="ttl">{tmpl_var name='ttl_txt'}</label>
- <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <p class="label">{tmpl_var name='active_txt'}</p>
- <div class="multiField">
- {tmpl_var name='active'}
- </div>
- </div>
- </fieldset>
-
- <input type="hidden" name="id" value="{tmpl_var name='id'}">
- <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
- <input type="hidden" name="type" value="{tmpl_var name='type'}">
-
- <div class="buttonHolder buttons">
- <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_cname_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('dns/dns_soa_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
- </div>
- </div>
-
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_dns_cname">
+
+ <div class="pnl_formsarea">
+ <fieldset class="inlineLabels">
+ <div class="ctrlHolder">
+ <label for="name">{tmpl_var name='name_txt'}</label>
+ <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="data">{tmpl_var name='data_txt'}</label>
+ <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="ttl">{tmpl_var name='ttl_txt'}</label>
+ <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <p class="label">{tmpl_var name='active_txt'}</p>
+ <div class="multiField">
+ {tmpl_var name='active'}
+ </div>
+ </div>
+ </fieldset>
+
+ <input type="hidden" name="id" value="{tmpl_var name='id'}">
+ <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
+ <input type="hidden" name="type" value="{tmpl_var name='type'}">
+
+ <div class="buttonHolder buttons">
+ <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_cname_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('dns/dns_soa_edit.php?id={tmpl_var name='zone'}');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+ </div>
+ </div>
+
+</div>
diff --git a/interface/web/dns/templates/dns_hinfo_edit.htm b/interface/web/dns/templates/dns_hinfo_edit.htm
index 976d3cf..e5a34f0 100644
--- a/interface/web/dns/templates/dns_hinfo_edit.htm
+++ b/interface/web/dns/templates/dns_hinfo_edit.htm
@@ -1,38 +1,38 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_dns_hinfo">
-
- <div class="pnl_formsarea">
- <fieldset class="inlineLabels">
- <div class="ctrlHolder">
- <label for="name">{tmpl_var name='name_txt'}</label>
- <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <label for="data">{tmpl_var name='data_txt'}</label>
- <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <label for="ttl">{tmpl_var name='ttl_txt'}</label>
- <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <p class="label">{tmpl_var name='active_txt'}</p>
- <div class="multiField">
- {tmpl_var name='active'}
- </div>
- </div>
- </fieldset>
-
- <input type="hidden" name="id" value="{tmpl_var name='id'}">
- <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
- <input type="hidden" name="type" value="{tmpl_var name='type'}">
-
- <div class="buttonHolder buttons">
- <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_hinfo_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('dns/dns_soa_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
- </div>
- </div>
-
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_dns_hinfo">
+
+ <div class="pnl_formsarea">
+ <fieldset class="inlineLabels">
+ <div class="ctrlHolder">
+ <label for="name">{tmpl_var name='name_txt'}</label>
+ <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="data">{tmpl_var name='data_txt'}</label>
+ <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="ttl">{tmpl_var name='ttl_txt'}</label>
+ <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <p class="label">{tmpl_var name='active_txt'}</p>
+ <div class="multiField">
+ {tmpl_var name='active'}
+ </div>
+ </div>
+ </fieldset>
+
+ <input type="hidden" name="id" value="{tmpl_var name='id'}">
+ <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
+ <input type="hidden" name="type" value="{tmpl_var name='type'}">
+
+ <div class="buttonHolder buttons">
+ <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_hinfo_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('dns/dns_soa_edit.php?id={tmpl_var name='zone'}');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+ </div>
+ </div>
+
+</div>
diff --git a/interface/web/dns/templates/dns_mx_edit.htm b/interface/web/dns/templates/dns_mx_edit.htm
index 3e16f7f..f212489 100644
--- a/interface/web/dns/templates/dns_mx_edit.htm
+++ b/interface/web/dns/templates/dns_mx_edit.htm
@@ -1,42 +1,42 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_dns_mx">
-
- <div class="pnl_formsarea">
- <fieldset class="inlineLabels">
- <div class="ctrlHolder">
- <label for="name">{tmpl_var name='name_txt'}</label>
- <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <label for="data">{tmpl_var name='data_txt'}</label>
- <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <label for="aux">{tmpl_var name='aux_txt'}</label>
- <input name="aux" id="aux" value="{tmpl_var name='aux'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
- </div>
- <div class="ctrlHolder">
- <label for="ttl">{tmpl_var name='ttl_txt'}</label>
- <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <p class="label">{tmpl_var name='active_txt'}</p>
- <div class="multiField">
- {tmpl_var name='active'}
- </div>
- </div>
- </fieldset>
-
- <input type="hidden" name="id" value="{tmpl_var name='id'}">
- <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
- <input type="hidden" name="type" value="{tmpl_var name='type'}">
-
- <div class="buttonHolder buttons">
- <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_mx_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('dns/dns_soa_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
- </div>
- </div>
-
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_dns_mx">
+
+ <div class="pnl_formsarea">
+ <fieldset class="inlineLabels">
+ <div class="ctrlHolder">
+ <label for="name">{tmpl_var name='name_txt'}</label>
+ <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="data">{tmpl_var name='data_txt'}</label>
+ <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="aux">{tmpl_var name='aux_txt'}</label>
+ <input name="aux" id="aux" value="{tmpl_var name='aux'}" size="10" maxlength="10" type="text" class="textInput formLengthLimit" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="ttl">{tmpl_var name='ttl_txt'}</label>
+ <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <p class="label">{tmpl_var name='active_txt'}</p>
+ <div class="multiField">
+ {tmpl_var name='active'}
+ </div>
+ </div>
+ </fieldset>
+
+ <input type="hidden" name="id" value="{tmpl_var name='id'}">
+ <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
+ <input type="hidden" name="type" value="{tmpl_var name='type'}">
+
+ <div class="buttonHolder buttons">
+ <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_mx_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('dns/dns_soa_edit.php?id={tmpl_var name='zone'}');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+ </div>
+ </div>
+
+</div>
diff --git a/interface/web/dns/templates/dns_ns_edit.htm b/interface/web/dns/templates/dns_ns_edit.htm
index 1d9d0e7..6498311 100644
--- a/interface/web/dns/templates/dns_ns_edit.htm
+++ b/interface/web/dns/templates/dns_ns_edit.htm
@@ -1,38 +1,38 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_dns_ns">
-
- <div class="pnl_formsarea">
- <fieldset class="inlineLabels">
- <div class="ctrlHolder">
- <label for="name">{tmpl_var name='name_txt'}</label>
- <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <label for="data">{tmpl_var name='data_txt'}</label>
- <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <label for="ttl">{tmpl_var name='ttl_txt'}</label>
- <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <p class="label">{tmpl_var name='active_txt'}</p>
- <div class="multiField">
- {tmpl_var name='active'}
- </div>
- </div>
- </fieldset>
-
- <input type="hidden" name="id" value="{tmpl_var name='id'}">
- <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
- <input type="hidden" name="type" value="{tmpl_var name='type'}">
-
- <div class="buttonHolder buttons">
- <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_ns_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('dns/dns_soa_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
- </div>
- </div>
-
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_dns_ns">
+
+ <div class="pnl_formsarea">
+ <fieldset class="inlineLabels">
+ <div class="ctrlHolder">
+ <label for="name">{tmpl_var name='name_txt'}</label>
+ <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="data">{tmpl_var name='data_txt'}</label>
+ <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="ttl">{tmpl_var name='ttl_txt'}</label>
+ <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <p class="label">{tmpl_var name='active_txt'}</p>
+ <div class="multiField">
+ {tmpl_var name='active'}
+ </div>
+ </div>
+ </fieldset>
+
+ <input type="hidden" name="id" value="{tmpl_var name='id'}">
+ <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
+ <input type="hidden" name="type" value="{tmpl_var name='type'}">
+
+ <div class="buttonHolder buttons">
+ <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_ns_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('dns/dns_soa_edit.php?id={tmpl_var name='zone'}');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+ </div>
+ </div>
+
+</div>
diff --git a/interface/web/dns/templates/dns_ptr_edit.htm b/interface/web/dns/templates/dns_ptr_edit.htm
index 45f3516..eaaaa23 100644
--- a/interface/web/dns/templates/dns_ptr_edit.htm
+++ b/interface/web/dns/templates/dns_ptr_edit.htm
@@ -1,38 +1,38 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_dns_ptr">
-
- <div class="pnl_formsarea">
- <fieldset class="inlineLabels">
- <div class="ctrlHolder">
- <label for="name">{tmpl_var name='name_txt'}</label>
- <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <label for="data">{tmpl_var name='data_txt'}</label>
- <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <label for="ttl">{tmpl_var name='ttl_txt'}</label>
- <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <p class="label">{tmpl_var name='active_txt'}</p>
- <div class="multiField">
- {tmpl_var name='active'}
- </div>
- </div>
- </fieldset>
-
- <input type="hidden" name="id" value="{tmpl_var name='id'}">
- <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
- <input type="hidden" name="type" value="{tmpl_var name='type'}">
-
- <div class="buttonHolder buttons">
- <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_ptr_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('dns/dns_soa_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
- </div>
- </div>
-
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_dns_ptr">
+
+ <div class="pnl_formsarea">
+ <fieldset class="inlineLabels">
+ <div class="ctrlHolder">
+ <label for="name">{tmpl_var name='name_txt'}</label>
+ <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="data">{tmpl_var name='data_txt'}</label>
+ <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="ttl">{tmpl_var name='ttl_txt'}</label>
+ <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <p class="label">{tmpl_var name='active_txt'}</p>
+ <div class="multiField">
+ {tmpl_var name='active'}
+ </div>
+ </div>
+ </fieldset>
+
+ <input type="hidden" name="id" value="{tmpl_var name='id'}">
+ <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
+ <input type="hidden" name="type" value="{tmpl_var name='type'}">
+
+ <div class="buttonHolder buttons">
+ <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_ptr_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('dns/dns_soa_edit.php?id={tmpl_var name='zone'}');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+ </div>
+ </div>
+
+</div>
diff --git a/interface/web/dns/templates/dns_rp_edit.htm b/interface/web/dns/templates/dns_rp_edit.htm
index 20adddc..59c47ee 100644
--- a/interface/web/dns/templates/dns_rp_edit.htm
+++ b/interface/web/dns/templates/dns_rp_edit.htm
@@ -1,38 +1,38 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_dns_rp">
-
- <div class="pnl_formsarea">
- <fieldset class="inlineLabels">
- <div class="ctrlHolder">
- <label for="name">{tmpl_var name='name_txt'}</label>
- <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <label for="data">{tmpl_var name='data_txt'}</label>
- <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <label for="ttl">{tmpl_var name='ttl_txt'}</label>
- <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <p class="label">{tmpl_var name='active_txt'}</p>
- <div class="multiField">
- {tmpl_var name='active'}
- </div>
- </div>
- </fieldset>
-
- <input type="hidden" name="id" value="{tmpl_var name='id'}">
- <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
- <input type="hidden" name="type" value="{tmpl_var name='type'}">
-
- <div class="buttonHolder buttons">
- <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_rp_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('dns/dns_soa_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
- </div>
- </div>
-
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_dns_rp">
+
+ <div class="pnl_formsarea">
+ <fieldset class="inlineLabels">
+ <div class="ctrlHolder">
+ <label for="name">{tmpl_var name='name_txt'}</label>
+ <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="data">{tmpl_var name='data_txt'}</label>
+ <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="ttl">{tmpl_var name='ttl_txt'}</label>
+ <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <p class="label">{tmpl_var name='active_txt'}</p>
+ <div class="multiField">
+ {tmpl_var name='active'}
+ </div>
+ </div>
+ </fieldset>
+
+ <input type="hidden" name="id" value="{tmpl_var name='id'}">
+ <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
+ <input type="hidden" name="type" value="{tmpl_var name='type'}">
+
+ <div class="buttonHolder buttons">
+ <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_rp_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('dns/dns_soa_edit.php?id={tmpl_var name='zone'}');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+ </div>
+ </div>
+
+</div>
diff --git a/interface/web/dns/templates/dns_srv_edit.htm b/interface/web/dns/templates/dns_srv_edit.htm
index 154f52d..f76ab18 100644
--- a/interface/web/dns/templates/dns_srv_edit.htm
+++ b/interface/web/dns/templates/dns_srv_edit.htm
@@ -1,38 +1,38 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_dns_srv">
-
- <div class="pnl_formsarea">
- <fieldset class="inlineLabels">
- <div class="ctrlHolder">
- <label for="name">{tmpl_var name='name_txt'}</label>
- <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <label for="data">{tmpl_var name='data_txt'}</label>
- <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <label for="ttl">{tmpl_var name='ttl_txt'}</label>
- <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <p class="label">{tmpl_var name='active_txt'}</p>
- <div class="multiField">
- {tmpl_var name='active'}
- </div>
- </div>
- </fieldset>
-
- <input type="hidden" name="id" value="{tmpl_var name='id'}">
- <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
- <input type="hidden" name="type" value="{tmpl_var name='type'}">
-
- <div class="buttonHolder buttons">
- <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_srv_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('dns/dns_soa_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
- </div>
- </div>
-
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_dns_srv">
+
+ <div class="pnl_formsarea">
+ <fieldset class="inlineLabels">
+ <div class="ctrlHolder">
+ <label for="name">{tmpl_var name='name_txt'}</label>
+ <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="data">{tmpl_var name='data_txt'}</label>
+ <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="ttl">{tmpl_var name='ttl_txt'}</label>
+ <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <p class="label">{tmpl_var name='active_txt'}</p>
+ <div class="multiField">
+ {tmpl_var name='active'}
+ </div>
+ </div>
+ </fieldset>
+
+ <input type="hidden" name="id" value="{tmpl_var name='id'}">
+ <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
+ <input type="hidden" name="type" value="{tmpl_var name='type'}">
+
+ <div class="buttonHolder buttons">
+ <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_srv_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('dns/dns_soa_edit.php?id={tmpl_var name='zone'}');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+ </div>
+ </div>
+
+</div>
diff --git a/interface/web/dns/templates/dns_txt_edit.htm b/interface/web/dns/templates/dns_txt_edit.htm
index 4dfb321..00294c8 100644
--- a/interface/web/dns/templates/dns_txt_edit.htm
+++ b/interface/web/dns/templates/dns_txt_edit.htm
@@ -1,38 +1,38 @@
-<h2><tmpl_var name="list_head_txt"></h2>
-<p><tmpl_var name="list_desc_txt"></p>
-
-<div class="panel panel_dns_txt">
-
- <div class="pnl_formsarea">
- <fieldset class="inlineLabels">
- <div class="ctrlHolder">
- <label for="name">{tmpl_var name='name_txt'}</label>
- <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <label for="data">{tmpl_var name='data_txt'}</label>
- <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <label for="ttl">{tmpl_var name='ttl_txt'}</label>
- <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
- </div>
- <div class="ctrlHolder">
- <p class="label">{tmpl_var name='active_txt'}</p>
- <div class="multiField">
- {tmpl_var name='active'}
- </div>
- </div>
- </fieldset>
-
- <input type="hidden" name="id" value="{tmpl_var name='id'}">
- <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
- <input type="hidden" name="type" value="{tmpl_var name='type'}">
-
- <div class="buttonHolder buttons">
- <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_txt_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('dns/dns_soa_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
- </div>
- </div>
-
-</div>
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_dns_txt">
+
+ <div class="pnl_formsarea">
+ <fieldset class="inlineLabels">
+ <div class="ctrlHolder">
+ <label for="name">{tmpl_var name='name_txt'}</label>
+ <input name="name" id="name" value="{tmpl_var name='name'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="data">{tmpl_var name='data_txt'}</label>
+ <input name="data" id="data" value="{tmpl_var name='data'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <label for="ttl">{tmpl_var name='ttl_txt'}</label>
+ <input name="ttl" id="ttl" value="{tmpl_var name='ttl'}" size="10" maxlength="10" type="text" class="textInput" />
+ </div>
+ <div class="ctrlHolder">
+ <p class="label">{tmpl_var name='active_txt'}</p>
+ <div class="multiField">
+ {tmpl_var name='active'}
+ </div>
+ </div>
+ </fieldset>
+
+ <input type="hidden" name="id" value="{tmpl_var name='id'}">
+ <input type="hidden" name="zone" value="{tmpl_var name='zone'}">
+ <input type="hidden" name="type" value="{tmpl_var name='type'}">
+
+ <div class="buttonHolder buttons">
+ <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','dns/dns_txt_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('dns/dns_soa_edit.php?id={tmpl_var name='zone'}');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+ </div>
+ </div>
+
+</div>
diff --git a/interface/web/dns/templates/dns_wizard.htm b/interface/web/dns/templates/dns_wizard.htm
index 4f926ba..971e521 100644
--- a/interface/web/dns/templates/dns_wizard.htm
+++ b/interface/web/dns/templates/dns_wizard.htm
@@ -29,6 +29,14 @@
</select>
</div>
</tmpl_if>
+ <tmpl_if name="is_reseller">
+ <div class="ctrlHolder">
+ <label for="client_group_id">{tmpl_var name='client_txt'}</label>
+ <select name="client_group_id" id="client_group_id" class="selectInput">
+ {tmpl_var name='client_group_id'}
+ </select>
+ </div>
+ </tmpl_if>
<tmpl_if name="DOMAIN_VISIBLE">
<div class="ctrlHolder">
<label for="domain">{tmpl_var name='domain_txt'}</label>
diff --git a/interface/web/help/lib/lang/br.lng b/interface/web/help/lib/lang/br.lng
new file mode 100644
index 0000000..0fc39c4
--- /dev/null
+++ b/interface/web/help/lib/lang/br.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['Support Message'] = 'Mensagem de Suporte';
+$wb['Message'] = 'Mensagem';
+$wb['Send message'] = 'Enviar Mensagem';
+$wb['View messages'] = 'Ver Mensagem';
+$wb['Support'] = 'Suporte';
+?>
+
diff --git a/interface/web/help/lib/lang/br_support_message.lng b/interface/web/help/lib/lang/br_support_message.lng
new file mode 100644
index 0000000..ce48ca9
--- /dev/null
+++ b/interface/web/help/lib/lang/br_support_message.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['recipient_id_txt'] = 'Para';
+$wb['sender_id_txt'] = 'De';
+$wb['subject_txt'] = 'Assunto';
+$wb['message_txt'] = 'Mensagem';
+$wb['tstamp_txt'] = 'Data';
+?>
+
diff --git a/interface/web/help/lib/lang/br_support_message_list.lng b/interface/web/help/lib/lang/br_support_message_list.lng
new file mode 100644
index 0000000..ffd7d85
--- /dev/null
+++ b/interface/web/help/lib/lang/br_support_message_list.lng
@@ -0,0 +1,7 @@
+<?php
+$wb['list_head_txt'] = 'Mensagens de Suporte';
+$wb['sender_id_txt'] = 'De';
+$wb['subject_txt'] = 'Assunto';
+$wb['add_new_record_txt'] = 'Crie uma nova mensagem de suporte';
+?>
+
diff --git a/interface/web/login/lib/lang/br.lng b/interface/web/login/lib/lang/br.lng
new file mode 100644
index 0000000..01d32b2
--- /dev/null
+++ b/interface/web/login/lib/lang/br.lng
@@ -0,0 +1,15 @@
+<?php
+$wb['1001'] = 'Nome de usuário ou senha em branco.';
+$wb['1002'] = 'Nome de usuário ou senha inválido.';
+$wb['1003'] = 'O usuário está bloqueado!';
+$wb['1004'] = 'Várias tentativas sem sucesso de login. Por favor tente novamente daqui a 15 minutos.';
+$wb['pass_reset_txt'] = 'Uma nova senha foi gerada e será enviada para você via correio eletrônico cadastrado no sistema.';
+$wb['pw_reset'] = 'Senha restabelecida! Será enviada para você via correio eletrônico cadastrado no sistema.';
+$wb['pw_error'] = 'Nome de usuário ou correio eletrônico não coincidem.';
+$wb['pw_error_noinput'] = 'Favor informar nome de usuário e endereço de correio válidos.';
+$wb['pw_reset_mail_msg'] = 'Sua senha do painel de controle foi restabelecida. A sua nova senha é: ';
+$wb['pw_reset_mail_title'] = 'Sua senha do painel de controle foi restabelecida.';
+$wb['user_regex_error'] = 'O nome de usuário contém mais de 64 caracteres ou contém caracteres inválidos.';
+$wb['pw_error_length'] = 'Tamanho da senha não pode ser maior do que 64 caracteres.';
+?>
+
diff --git a/interface/web/mail/lib/lang/bg_mail_alias.lng b/interface/web/mail/lib/lang/bg_mail_alias.lng
index 23ff84f..44b6fed 100644
--- a/interface/web/mail/lib/lang/bg_mail_alias.lng
+++ b/interface/web/mail/lib/lang/bg_mail_alias.lng
@@ -7,4 +7,5 @@
$wb['no_domain_perm'] = 'You have no permission for this domain.';
$wb['destination_error_isemail'] = 'Destination Emailaddress is invalid.';
$wb['limit_mailalias_txt'] = 'The max. number of email aliases for your account is reached.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
?>
diff --git a/interface/web/mail/lib/lang/bg_mail_forward.lng b/interface/web/mail/lib/lang/bg_mail_forward.lng
index f8c8362..7d237e1 100644
--- a/interface/web/mail/lib/lang/bg_mail_forward.lng
+++ b/interface/web/mail/lib/lang/bg_mail_forward.lng
@@ -3,4 +3,5 @@
$wb['destination_txt'] = 'Destination Email';
$wb['active_txt'] = 'Active';
$wb['limit_mailforward_txt'] = 'The max. number of email forwarders for your account is reached.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
?>
diff --git a/interface/web/mail/lib/lang/bg_mail_user.lng b/interface/web/mail/lib/lang/bg_mail_user.lng
index c181eb1..956153d 100644
--- a/interface/web/mail/lib/lang/bg_mail_user.lng
+++ b/interface/web/mail/lib/lang/bg_mail_user.lng
@@ -29,4 +29,5 @@
$wb['disablepop3_txt'] = 'Disable POP3';
$wb['welcome_mail_fromname_txt'] = 'ISPConfig3';
$wb['welcome_mail_fromemail_txt'] = 'webmaster@localhost.tld';
+$wb['duplicate_alias_or_forward_txt'] = 'There is already an alias or forwrd with this email address.';
?>
diff --git a/interface/web/mail/lib/lang/bg_mail_user_filter_list.lng b/interface/web/mail/lib/lang/bg_mail_user_filter_list.lng
index 28852d5..2754259 100644
--- a/interface/web/mail/lib/lang/bg_mail_user_filter_list.lng
+++ b/interface/web/mail/lib/lang/bg_mail_user_filter_list.lng
@@ -3,4 +3,5 @@
$wb['add_new_record_txt'] = 'Add new Filter';
$wb['page_txt'] = 'Page';
$wb['page_of_txt'] = 'of';
+$wb['delete_confirmation'] = 'Do you really want to Delete the mailfilter?';
?>
diff --git a/interface/web/mail/lib/lang/bg_spamfilter_blacklist.lng b/interface/web/mail/lib/lang/bg_spamfilter_blacklist.lng
index 02718da..5a85949 100644
--- a/interface/web/mail/lib/lang/bg_spamfilter_blacklist.lng
+++ b/interface/web/mail/lib/lang/bg_spamfilter_blacklist.lng
@@ -5,4 +5,5 @@
$wb['email_txt'] = 'Email';
$wb['priority_txt'] = 'Priority';
$wb['active_txt'] = 'Active';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
?>
diff --git a/interface/web/mail/lib/lang/bg_spamfilter_whitelist.lng b/interface/web/mail/lib/lang/bg_spamfilter_whitelist.lng
index 02718da..5a85949 100644
--- a/interface/web/mail/lib/lang/bg_spamfilter_whitelist.lng
+++ b/interface/web/mail/lib/lang/bg_spamfilter_whitelist.lng
@@ -5,4 +5,5 @@
$wb['email_txt'] = 'Email';
$wb['priority_txt'] = 'Priority';
$wb['active_txt'] = 'Active';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
?>
diff --git a/interface/web/mail/lib/lang/br.lng b/interface/web/mail/lib/lang/br.lng
new file mode 100644
index 0000000..899ef0f
--- /dev/null
+++ b/interface/web/mail/lib/lang/br.lng
@@ -0,0 +1,49 @@
+<?php
+$wb['Email Alias'] = 'Aliases de Correio';
+$wb['Email Blacklist'] = 'Lista Negra de Correio';
+$wb['Blacklist'] = 'Lista Negra';
+$wb['Mail Content Filter'] = 'Filtro de Conteúdo de Correio';
+$wb['Filter'] = 'Filtro';
+$wb['Mail Domain'] = 'Domínio de Correio';
+$wb['Domain'] = 'Domínio';
+$wb['Email Catchall'] = 'Correio Catchall';
+$wb['Email Forward'] = 'Encaminhamento de Correio';
+$wb['Get Email'] = 'Get Email';
+$wb['Spamfilter'] = 'Filtro de Spam';
+$wb['Email Routing'] = 'Rota de Correio';
+$wb['Email transport'] = 'Transporte de Correio';
+$wb['Mailbox'] = 'Caixa de Correio';
+$wb['Autoresponder'] = 'Autoresponder';
+$wb['Mail Filter'] = 'Filtro de Correio';
+$wb['Custom Rules'] = 'Regras Personalizadas';
+$wb['Email filter'] = 'Filtro de Correio';
+$wb['Email Whitelist'] = 'Lista Branca de Correio';
+$wb['Whitelist'] = 'Lista Branca';
+$wb['Spamfilter blacklist'] = 'Filtro Spam (Lista Negra)';
+$wb['Blacklist'] = 'Lista Negra';
+$wb['Spamfilter Config'] = 'Configuração do Filtro Spam';
+$wb['Server'] = 'Servidor';
+$wb['Spamfilter policy'] = 'Políticas de Filtro Spam';
+$wb['Policy'] = 'Política';
+$wb['Quarantine'] = 'Quarentena';
+$wb['Tag-Level'] = 'Tag-Level';
+$wb['Other'] = 'Outros';
+$wb['Spamfilter users'] = 'Usuários de Filtro Spam';
+$wb['Users'] = 'Usuários';
+$wb['Spamfilter Whitelist'] = 'Filtro Spam Lista Branca';
+$wb['Whitelist'] = 'Lista Branca';
+$wb['Email'] = 'Correio';
+$wb['Email Mailbox'] = 'Caixa de Correio';
+$wb['Email Accounts'] = 'Contas de Correio';
+$wb['User / Domain'] = 'Usuário / Domínio';
+$wb['Server Settings'] = 'Configurações do Servidor';
+$wb['Spamfilter'] = 'Filtro Spam';
+$wb['Fetchmail'] = 'Fetchmail';
+$wb['Mailbox traffic'] = 'Tráfego de Correio';
+$wb['Statistics'] = 'Estatísticas';
+$wb['Postfix Whitelist'] = 'Postfix (Lista Branca)';
+$wb['Postfix Blacklist'] = 'Postfix (Lista Negra)';
+$wb['Content Filter'] = 'Filtros de Conteúdo';
+$wb['Global Filters'] = 'Filtros Globais';
+
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_alias.lng b/interface/web/mail/lib/lang/br_mail_alias.lng
new file mode 100644
index 0000000..e8e38a7
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_alias.lng
@@ -0,0 +1,10 @@
+<?php
+$wb["email_txt"] = 'Correio';
+$wb["destination_txt"] = 'Destino';
+$wb["active_txt"] = 'Ativo';
+$wb["email_error_isemail"] = 'Endereço de correio inválido.';
+$wb["email_error_unique"] = 'Endereço de correio duplicado.';
+$wb["no_domain_perm"] = "Você não tem permissão para este domínio.";
+$wb["destination_error_isemail"] = 'Endereço de destino inválido';
+$wb["limit_mailalias_txt"] = 'O número máximo de aliases para sua conta foi atingido.';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_alias_list.lng b/interface/web/mail/lib/lang/br_mail_alias_list.lng
new file mode 100644
index 0000000..f4a916f
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_alias_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["list_head_txt"] = 'Email Alias';
+$wb["active_txt"] = 'Active';
+$wb["source_txt"] = 'source';
+$wb["destination_txt"] = 'Destination';
+$wb["email_txt"] = 'Email';
+$wb["add_new_record_txt"] = 'Add new Email alias';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_blacklist.lng b/interface/web/mail/lib/lang/br_mail_blacklist.lng
new file mode 100644
index 0000000..465fc02
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_blacklist.lng
@@ -0,0 +1,9 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["source_txt"] = 'Endereço Lista Negra';
+$wb["recipient_txt"] = 'Recipiente';
+$wb["active_txt"] = 'Ativo';
+$wb["source_error_notempty"] = 'Endereço em branco.';
+$wb["type_txt"] = 'Tipo';
+$wb["limit_mailfilter_txt"] = 'O número máximo de filtros de correio para sua conta foi atingido..';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_blacklist_list.lng b/interface/web/mail/lib/lang/br_mail_blacklist_list.lng
new file mode 100644
index 0000000..d31ef50
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_blacklist_list.lng
@@ -0,0 +1,10 @@
+<?php
+$wb["list_head_txt"] = 'Correio Lista Negra';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["source_txt"] = 'Correio na lista negra';
+$wb["type_txt"] = 'Tipo';
+$wb["recipient_txt"] = 'Recipiente';
+$wb["add_new_record_txt"] = 'Adcionar novo registro a lista';
+$wb["access_txt"] = 'acesso';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_content_filter.lng b/interface/web/mail/lib/lang/br_mail_content_filter.lng
new file mode 100644
index 0000000..d3ae62b
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_content_filter.lng
@@ -0,0 +1,9 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["type_txt"] = 'Filtro';
+$wb["pattern_txt"] = 'Padrão de Expressão Regular.';
+$wb["data_txt"] = 'Data';
+$wb["action_txt"] = 'Ação';
+$wb["active_txt"] = 'Ativo';
+$wb["pattern_error_empty"] = 'Padrão em branco';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_content_filter_list.lng b/interface/web/mail/lib/lang/br_mail_content_filter_list.lng
new file mode 100644
index 0000000..0de79ec
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_content_filter_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["list_head_txt"] = 'Cabeçalhos Postfix e Body Checks';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["pattern_txt"] = 'Padrão';
+$wb["action_txt"] = 'Ação';
+$wb["add_new_record_txt"] = 'Adcionar um novo filtro de conteúdo';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_domain.lng b/interface/web/mail/lib/lang/br_mail_domain.lng
new file mode 100644
index 0000000..c8ee61f
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_domain.lng
@@ -0,0 +1,14 @@
+<?php
+$wb['server_id_txt'] = 'Servidor';
+$wb['domain_txt'] = 'Domínio';
+$wb['type_txt'] = 'Tipo';
+$wb['active_txt'] = 'Ativo';
+$wb['domain_error_empty'] = 'Domínio em branco.';
+$wb['domain_error_unique'] = 'Domínio duplicado';
+$wb['domain_error_regex'] = 'Nome de domínio inválido';
+$wb['client_txt'] = 'Cliente';
+$wb['limit_maildomain_txt'] = 'O número máximo de contas de correio eletrônico para este domínio foi atingido.';
+$wb['policy_txt'] = 'Filtro Anti-Spam';
+$wb['no_policy'] = '- desativado -';
+?>
+
diff --git a/interface/web/mail/lib/lang/br_mail_domain_catchall.lng b/interface/web/mail/lib/lang/br_mail_domain_catchall.lng
new file mode 100644
index 0000000..6311a0d
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_domain_catchall.lng
@@ -0,0 +1,9 @@
+<?php
+$wb["domain_txt"] = 'Domínio';
+$wb["destination_txt"] = 'Destino';
+$wb["active_txt"] = 'Ativo';
+$wb["domain_error_unique"] = "Já existe um registro de Catchall para este domínio.";
+$wb["no_domain_perm"] = "Você não tem permissão para este domínio.";
+$wb["domain_error_regex"] = 'O nome do domínio contém caracteres inválidos';
+$wb["limit_mailcatchall_txt"] = 'O número máximo de catchall para este domínio foi atingido.';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_domain_catchall_list.lng b/interface/web/mail/lib/lang/br_mail_domain_catchall_list.lng
new file mode 100644
index 0000000..40fd05c
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_domain_catchall_list.lng
@@ -0,0 +1,9 @@
+<?php
+$wb["list_head_txt"] = 'Catchall de Correio';
+$wb["active_txt"] = 'Ativo';
+$wb["source_txt"] = 'origem';
+$wb["destination_txt"] = 'Endereço de destino';
+$wb["server_id_txt"] = 'Servidor';
+$wb["domain_txt"] = 'Domínio';
+$wb["add_new_record_txt"] = 'Adcionar novo Catchall';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_domain_list.lng b/interface/web/mail/lib/lang/br_mail_domain_list.lng
new file mode 100644
index 0000000..e08daf1
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_domain_list.lng
@@ -0,0 +1,7 @@
+<?php
+$wb["list_head_txt"] = 'Domínio de Correio';
+$wb["server_id_txt"] = 'Servidor';
+$wb["domain_txt"] = 'Domínio';
+$wb["add_new_record_txt"] = 'Adcionar novo domínio';
+$wb["active_txt"] = 'Ativo';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_forward.lng b/interface/web/mail/lib/lang/br_mail_forward.lng
new file mode 100644
index 0000000..6c40c1f
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_forward.lng
@@ -0,0 +1,6 @@
+<?php
+$wb["email_txt"] = 'Correio';
+$wb["destination_txt"] = 'Correio de Destino';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_mailforward_txt"] = 'O número máximo de encaminhamentos para sua conta foi atingido.';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_forward_list.lng b/interface/web/mail/lib/lang/br_mail_forward_list.lng
new file mode 100644
index 0000000..8bf63fe
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_forward_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["list_head_txt"] = 'Encaminhamento de Correio';
+$wb["active_txt"] = 'Ativo';
+$wb["source_txt"] = 'origem';
+$wb["destination_txt"] = 'Destino';
+$wb["email_txt"] = 'Correio';
+$wb["add_new_record_txt"] = 'Adcionar novo encaminhamento';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_get.lng b/interface/web/mail/lib/lang/br_mail_get.lng
new file mode 100644
index 0000000..cb2b0ca
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_get.lng
@@ -0,0 +1,15 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["type_txt"] = 'Tipo';
+$wb["source_server_txt"] = 'Servidor Pop3/Imap';
+$wb["source_username_txt"] = 'Usuário';
+$wb["source_password_txt"] = 'Senha';
+$wb["source_delete_txt"] = 'Remover mensagens da origem após o recebimento';
+$wb["destination_txt"] = 'Destino';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_fetchmail_txt"] = 'O número máximo de Fetchmail para sua conta foi atingido.';
+$wb["source_server_error_isempty"] = 'Servidor em branco.';
+$wb["source_username_error_isempty"] = 'Usuário em branco.';
+$wb["source_password_error_isempty"] = 'Senha em branco.';
+$wb["destination_error_isemail"] = 'Destino não selecionado.';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_get_list.lng b/interface/web/mail/lib/lang/br_mail_get_list.lng
new file mode 100644
index 0000000..5634723
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_get_list.lng
@@ -0,0 +1,9 @@
+<?php
+$wb["list_head_txt"] = 'Fetch de mensagens de um servidor POP3 / IMAP';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["source_server_txt"] = 'Servidor Externo';
+$wb["source_username_txt"] = 'Usuário';
+$wb["destination_txt"] = 'Destino';
+$wb["add_new_record_txt"] = 'Adcionar nova Conta';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_spamfilter.lng b/interface/web/mail/lib/lang/br_mail_spamfilter.lng
new file mode 100644
index 0000000..e4b6c81
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_spamfilter.lng
@@ -0,0 +1,17 @@
+<?php
+$wb["email_txt"] = 'Email';
+$wb["spam_rewrite_score_int_txt"] = 'Pontução de Rewrite';
+$wb["spam_redirect_score_int_txt"] = 'Pontuação de Redirecionamento';
+$wb["spam_delete_score_int_txt"] = 'Remover Pontuação';
+$wb["spam_rewrite_subject_txt"] = 'Re-escrever assunto';
+$wb["spam_redirect_maildir_txt"] = 'Redirecionar Caixa de Correio';
+$wb["active_txt"] = 'Active';
+$wb["spam_rewrite_txt"] = 'Re-escrever assunto da mensagem depois desta pontuação.';
+$wb["spam_redirect_txt"] = 'Redirecione esta mensagem depois desta pontuação para esta caixa postal';
+$wb["spam_delete_txt"] = 'Remover esta mensagem depois desta pontuação.';
+$wb["disable_txt"] = 'Dica: Para desativar uma opção de filtro, configure a pontuação como 0.00.';
+$wb["email_error_isemail"] = 'Endereço de correio inválido.';
+$wb["email_error_unique"] = 'Já existem registros de spamfilter para esta caixa de correio.';
+$wb["spam_redirect_maildir_purge_txt"] = 'Remover Maildir depois';
+$wb["days_txt"] = 'Dias.';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_spamfilter_list.lng b/interface/web/mail/lib/lang/br_mail_spamfilter_list.lng
new file mode 100644
index 0000000..00b8daf
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_spamfilter_list.lng
@@ -0,0 +1,9 @@
+<?php
+$wb['list_head_txt'] = 'Filtro Anti-Spam';
+$wb['active_txt'] = 'Ativo';
+$wb['server_id_txt'] = 'Servidor';
+$wb['server_name_txt'] = 'nome_servidor';
+$wb['email_txt'] = 'Correio';
+$wb['add_new_record_txt'] = 'Adcionar novo filtro anti-spam';
+?>
+
diff --git a/interface/web/mail/lib/lang/br_mail_transport.lng b/interface/web/mail/lib/lang/br_mail_transport.lng
new file mode 100644
index 0000000..b4394c6
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_transport.lng
@@ -0,0 +1,10 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["domain_txt"] = 'Domínio';
+$wb["destination_txt"] = 'Destino';
+$wb["type_txt"] = 'Tipo';
+$wb["mx_txt"] = 'Sem MX lookup';
+$wb["sort_order_txt"] = 'Ordenar por';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_mailrouting_txt"] = 'O número máximo de rotas para sua conta foi atingido.';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_transport_list.lng b/interface/web/mail/lib/lang/br_mail_transport_list.lng
new file mode 100644
index 0000000..88acaee
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_transport_list.lng
@@ -0,0 +1,9 @@
+<?php
+$wb["list_head_txt"] = 'Rota Avançada de Correio';
+$wb["active_txt"] = 'Ativa';
+$wb["server_id_txt"] = 'Servidor';
+$wb["domain_txt"] = 'Domínio';
+$wb["transport_txt"] = 'Transporte';
+$wb["sort_order_txt"] = 'Ordenar por';
+$wb["add_new_record_txt"] = 'Adcionar um novo transporte';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_user.lng b/interface/web/mail/lib/lang/br_mail_user.lng
new file mode 100644
index 0000000..1ba5162
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_user.lng
@@ -0,0 +1,31 @@
+<?php
+$wb["custom_mailfilter_txt"] = 'Formula de filtro de correio';
+$wb["email_txt"] = 'Correio';
+$wb["cryptpwd_txt"] = 'Senha';
+$wb["password_strength_txt"] = 'Tamanho da Senha';
+$wb["active_txt"] = 'Ativo';
+$wb["email_error_isemail"] = 'Endereço de Correio Inválido.';
+$wb["email_error_unique"] = 'Endereço de Correio Duplicado.';
+$wb["autoresponder_text_txt"] = 'Texto';
+$wb["autoresponder_txt"] = 'Autoresponder';
+$wb["no_domain_perm"] = 'Sem permissão para este domínio.';
+$wb["error_no_pwd"] = 'Senha em branco.';
+$wb["quota_error_isint"] = 'O tamanho da caixa de correio deve ser um número.';
+$wb["quota_txt"] = 'Quota';
+$wb["server_id_txt"] = 'Aerver_id';
+$wb["password_txt"] = 'Senha';
+$wb["maildir_txt"] = 'Maildir';
+$wb["postfix_txt"] = 'Habilitar Recebimento';
+$wb["access_txt"] = 'Habilitar Acesso';
+$wb["policy_txt"] = 'Spamfilter';
+$wb["no_policy"] = '- desativado -';
+$wb["limit_mailbox_txt"] = 'O número máximo de caixas de correio para sua conta foi atingido.';
+$wb["limit_mailquota_txt"] = 'O espaço em disco disponível para criação de contas foi atingido.';
+$wb["welcome_mail_fromname_txt"] = 'ISPConfig3';
+$wb["welcome_mail_fromemail_txt"] = "webmaster@localhost.tld";
+$wb["welcome_mail_subject"] = 'Parabéns sua conta de correio foi criada.';
+$wb["welcome_mail_message"] = "Parabéns sua conta de correio foi criada. Att. Seu webmaster.";
+$wb["disableimap_txt"] = 'Desativar IMAP';
+$wb["disablepop3_txt"] = 'Disativar POP3';
+?>
+
diff --git a/interface/web/mail/lib/lang/br_mail_user_filter.lng b/interface/web/mail/lib/lang/br_mail_user_filter.lng
new file mode 100644
index 0000000..4ab4489
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_user_filter.lng
@@ -0,0 +1,9 @@
+<?php
+$wb["rulename_txt"] = 'Nome';
+$wb["action_txt"] = 'Ação';
+$wb["target_txt"] = 'Pasta';
+$wb["active_txt"] = 'Ativo';
+$wb["rulename_error_empty"] = 'Nome está em branco.';
+$wb["searchterm_is_empty"] = 'Termo de busca em branco.';
+$wb["source_txt"] = 'Origem';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_user_filter_list.lng b/interface/web/mail/lib/lang/br_mail_user_filter_list.lng
new file mode 100644
index 0000000..0d21666
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_user_filter_list.lng
@@ -0,0 +1,6 @@
+<?php
+$wb["rulename_txt"] = 'Nome';
+$wb["add_new_record_txt"] = 'Adcionar novo filtro';
+$wb["page_txt"] = 'Página';
+$wb["page_of_txt"] = 'de';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_user_list.lng b/interface/web/mail/lib/lang/br_mail_user_list.lng
new file mode 100644
index 0000000..a8a495a
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_user_list.lng
@@ -0,0 +1,6 @@
+<?php
+$wb["list_head_txt"] = 'Caixa de Correio';
+$wb["email_txt"] = 'Correio';
+$wb["autoresponder_txt"] = 'Autoresponder';
+$wb["add_new_record_txt"] = 'Adcionar nova caixa de correio';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_user_stats_list.lng b/interface/web/mail/lib/lang/br_mail_user_stats_list.lng
new file mode 100644
index 0000000..ba41259
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_user_stats_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["list_head_txt"] = 'Tráfego de Correio';
+$wb["email_txt"] = 'Correio';
+$wb["this_month_txt"] = 'Este Mês';
+$wb["last_month_txt"] = 'Último Mês';
+$wb["this_year_txt"] = 'Este Ano';
+$wb["last_year_txt"] = 'Último Ano';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_whitelist.lng b/interface/web/mail/lib/lang/br_mail_whitelist.lng
new file mode 100644
index 0000000..12ffb66
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_whitelist.lng
@@ -0,0 +1,9 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["source_txt"] = 'Endereço Lista Branca';
+$wb["recipient_txt"] = 'Recipiente';
+$wb["active_txt"] = 'Activo';
+$wb["source_error_notempty"] = 'Endereço em Branco.';
+$wb["type_txt"] = 'Tipo';
+$wb["limit_mailfilter_txt"] = 'O número máximo de filtros para sua conta foi atingido.';
+?>
diff --git a/interface/web/mail/lib/lang/br_mail_whitelist_list.lng b/interface/web/mail/lib/lang/br_mail_whitelist_list.lng
new file mode 100644
index 0000000..fce3148
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_mail_whitelist_list.lng
@@ -0,0 +1,10 @@
+<?php
+$wb["list_head_txt"] = 'Correio Lista Branca';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["source_txt"] = 'Endereços na Lista Branca';
+$wb["type_txt"] = 'Tipo';
+$wb["recipient_txt"] = 'Recipiente';
+$wb["add_new_record_txt"] = 'Adcionar um novo registro a lista';
+$wb["access_txt"] = 'acesso';
+?>
diff --git a/interface/web/mail/lib/lang/br_spamfilter_blacklist.lng b/interface/web/mail/lib/lang/br_spamfilter_blacklist.lng
new file mode 100644
index 0000000..23ac482
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_spamfilter_blacklist.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["wb_txt"] = 'wb';
+$wb["rid_txt"] = 'Usuário';
+$wb["email_txt"] = 'Email';
+$wb["priority_txt"] = 'Prioridade';
+$wb["active_txt"] = 'Ativo';
+?>
diff --git a/interface/web/mail/lib/lang/br_spamfilter_blacklist_list.lng b/interface/web/mail/lib/lang/br_spamfilter_blacklist_list.lng
new file mode 100644
index 0000000..8ff80e1
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_spamfilter_blacklist_list.lng
@@ -0,0 +1,9 @@
+<?php
+$wb["list_head_txt"] = 'Spamfilter Lista Negra';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["priority_txt"] = 'Prioridade';
+$wb["rid_txt"] = 'Usuário';
+$wb["email_txt"] = 'Correio na Lista Negra';
+$wb["add_new_record_txt"] = 'Adcionar novo registro a lista';
+?>
diff --git a/interface/web/mail/lib/lang/br_spamfilter_config.lng b/interface/web/mail/lib/lang/br_spamfilter_config.lng
new file mode 100644
index 0000000..23ffae1
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_spamfilter_config.lng
@@ -0,0 +1,21 @@
+<?php
+$wb['getmail_config_dir_txt'] = 'Caminho de Configuração Getmail ';
+$wb['ip_address_txt'] = 'Endereço IP';
+$wb['netmask_txt'] = 'Mascara de Rede';
+$wb['gateway_txt'] = 'Gateway';
+$wb['hostname_txt'] = 'Hostname';
+$wb['nameservers_txt'] = 'Servidor de Nomes';
+$wb['module_txt'] = 'Server Module';
+$wb['maildir_path_txt'] = 'Caminho do Maildir';
+$wb['homedir_path_txt'] = 'Caminho do Homedir';
+$wb['mailuser_uid_txt'] = 'Usuário de Correio UID';
+$wb['mailuser_gid_txt'] = 'Usuário de Correio GID';
+$wb['mailuser_name_txt'] = 'Nome do Usuário de Correio';
+$wb['mailuser_group_txt'] = 'Grupo do Usuário de Correio';
+$wb['relayhost_txt'] = 'Host Relay';
+$wb['relayhost_user_txt'] = 'Usuário Host Relay';
+$wb['relayhost_password_txt'] = 'Senha Host Relay';
+$wb['mailbox_size_limit_txt'] = 'Tamanho Caixa de Correio';
+$wb['message_size_limit_txt'] = 'Tamanho da Mensagem';
+?>
+
diff --git a/interface/web/mail/lib/lang/br_spamfilter_config_list.lng b/interface/web/mail/lib/lang/br_spamfilter_config_list.lng
new file mode 100644
index 0000000..c23fcf9
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_spamfilter_config_list.lng
@@ -0,0 +1,5 @@
+<?php
+$wb["list_head_txt"] = 'Configurações do Servidor';
+$wb["server_name_txt"] = 'Servidor';
+$wb["server_id_txt"] = 'id_servidor';
+?>
diff --git a/interface/web/mail/lib/lang/br_spamfilter_policy.lng b/interface/web/mail/lib/lang/br_spamfilter_policy.lng
new file mode 100644
index 0000000..bd809bd
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_spamfilter_policy.lng
@@ -0,0 +1,38 @@
+<?php
+$wb["policy_name_txt"] = 'Nome da Regra';
+$wb["virus_lover_txt"] = 'Virusl lover';
+$wb["spam_lover_txt"] = 'SPAM lover';
+$wb["banned_files_lover_txt"] = 'Banned files lover';
+$wb["bad_header_lover_txt"] = 'Bad header lover';
+$wb["bypass_virus_checks_txt"] = 'Bypass virus checks';
+$wb["bypass_banned_checks_txt"] = 'Bypass banned checks';
+$wb["bypass_header_checks_txt"] = 'Bypass header checks';
+$wb["virus_quarantine_to_txt"] = 'Forward virus to email';
+$wb["spam_quarantine_to_txt"] = 'Forward spam to email';
+$wb["banned_quarantine_to_txt"] = 'Forward banned to email';
+$wb["bad_header_quarantine_to_txt"] = 'Forward bad header to email';
+$wb["clean_quarantine_to_txt"] = 'Forward clean to email';
+$wb["other_quarantine_to_txt"] = 'Forward other to email';
+$wb["spam_tag_level_txt"] = 'SPAM tag level';
+$wb["spam_tag2_level_txt"] = 'SPAM tag2 level';
+$wb["spam_kill_level_txt"] = 'SPAM kill level';
+$wb["spam_dsn_cutoff_level_txt"] = 'SPAM dsn cutoff level';
+$wb["spam_quarantine_cutoff_level_txt"] = 'SPAM quarantine cutoff level';
+$wb["spam_modifies_subj_txt"] = 'SPAM modifies subject';
+$wb["spam_subject_tag_txt"] = 'SPAM subject tag';
+$wb["spam_subject_tag2_txt"] = 'SPAM subject tag2';
+$wb["addr_extension_virus_txt"] = 'Addr. extension virus';
+$wb["addr_extension_spam_txt"] = 'Addr. extension SPAM';
+$wb["addr_extension_banned_txt"] = 'Addr. extension banned';
+$wb["addr_extension_bad_header_txt"] = 'Addr extension bad header';
+$wb["warnvirusrecip_txt"] = 'Warn virus recip.';
+$wb["warnbannedrecip_txt"] = 'Warn banned recip.';
+$wb["warnbadhrecip_txt"] = 'Warn bad header recip.';
+$wb["newvirus_admin_txt"] = 'Newvirus admin';
+$wb["virus_admin_txt"] = 'Virus admin';
+$wb["banned_admin_txt"] = 'Banned admin';
+$wb["bad_header_admin_txt"] = 'Bad header admin';
+$wb["spam_admin_txt"] = 'SPAM admin';
+$wb["message_size_limit_txt"] = 'Message size limit';
+$wb["banned_rulenames_txt"] = 'Banned rulenames';
+?>
diff --git a/interface/web/mail/lib/lang/br_spamfilter_policy_list.lng b/interface/web/mail/lib/lang/br_spamfilter_policy_list.lng
new file mode 100644
index 0000000..2bc05dc
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_spamfilter_policy_list.lng
@@ -0,0 +1,9 @@
+<?php
+$wb["list_head_txt"] = 'Políticas de Spam';
+$wb["policy_name_txt"] = 'Nome';
+$wb["virus_lover_txt"] = 'Virus lover';
+$wb["spam_lover_txt"] = 'Spam lover';
+$wb["banned_files_lover_txt"] = 'Banned Files lover';
+$wb["bad_header_lover_txt"] = 'Bad Header lover';
+$wb["add_new_record_txt"] = 'Adcionar Registro';
+?>
diff --git a/interface/web/mail/lib/lang/br_spamfilter_users.lng b/interface/web/mail/lib/lang/br_spamfilter_users.lng
new file mode 100644
index 0000000..058c4f6
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_spamfilter_users.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["priority_txt"] = 'Prioridade';
+$wb["policy_id_txt"] = 'Política';
+$wb["email_txt"] = 'Correio (Padrão)';
+$wb["fullname_txt"] = 'Nome';
+$wb["local_txt"] = 'Local';
+?>
diff --git a/interface/web/mail/lib/lang/br_spamfilter_users_list.lng b/interface/web/mail/lib/lang/br_spamfilter_users_list.lng
new file mode 100644
index 0000000..e17627e
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_spamfilter_users_list.lng
@@ -0,0 +1,10 @@
+<?php
+$wb["list_head_txt"] = 'Filtro Anti-Spam Usuários';
+$wb["local_txt"] = 'Local';
+$wb["server_id_txt"] = 'Servidor';
+$wb["priority_txt"] = 'Prioridade';
+$wb["policy_id_txt"] = 'Políticas';
+$wb["fullname_txt"] = 'Nome';
+$wb["email_txt"] = 'Email';
+$wb["add_new_record_txt"] = 'Adcionar Usuário';
+?>
diff --git a/interface/web/mail/lib/lang/br_spamfilter_whitelist.lng b/interface/web/mail/lib/lang/br_spamfilter_whitelist.lng
new file mode 100644
index 0000000..cbae9db
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_spamfilter_whitelist.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb["wb_txt"] = 'wb';
+$wb["rid_txt"] = 'User';
+$wb["email_txt"] = 'Email';
+$wb["priority_txt"] = 'Priority';
+$wb["active_txt"] = 'Active';
+?>
diff --git a/interface/web/mail/lib/lang/br_spamfilter_whitelist_list.lng b/interface/web/mail/lib/lang/br_spamfilter_whitelist_list.lng
new file mode 100644
index 0000000..d751df9
--- /dev/null
+++ b/interface/web/mail/lib/lang/br_spamfilter_whitelist_list.lng
@@ -0,0 +1,9 @@
+<?php
+$wb["list_head_txt"] = 'Spamfilter Lista Branca';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["priority_txt"] = 'Prioridade';
+$wb["rid_txt"] = 'Usuário';
+$wb["email_txt"] = 'Correio na lista branca';
+$wb["add_new_record_txt"] = 'Adcionar um novo correio';
+?>
diff --git a/interface/web/mail/lib/lang/de_mail_alias.lng b/interface/web/mail/lib/lang/de_mail_alias.lng
index 8001e0a..66718ad 100644
--- a/interface/web/mail/lib/lang/de_mail_alias.lng
+++ b/interface/web/mail/lib/lang/de_mail_alias.lng
@@ -7,4 +7,5 @@
$wb['no_domain_perm'] = 'Sie haben keine Berechtigung für diese Domain.';
$wb['destination_error_isemail'] = 'Ziel Emailadresse ist ungültig.';
$wb['limit_mailalias_txt'] = 'The max. number of email aliases for your account is reached.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
?>
diff --git a/interface/web/mail/lib/lang/de_mail_forward.lng b/interface/web/mail/lib/lang/de_mail_forward.lng
index db52472..c376920 100644
--- a/interface/web/mail/lib/lang/de_mail_forward.lng
+++ b/interface/web/mail/lib/lang/de_mail_forward.lng
@@ -3,4 +3,5 @@
$wb['destination_txt'] = 'Ziel Emailadresse';
$wb['active_txt'] = 'Aktiv';
$wb['limit_mailforward_txt'] = 'Die max. Anzahl an Emailweiterleitungen für ihren Account wurde erreicht.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
?>
diff --git a/interface/web/mail/lib/lang/de_mail_user.lng b/interface/web/mail/lib/lang/de_mail_user.lng
index bc288bf..63babff 100644
--- a/interface/web/mail/lib/lang/de_mail_user.lng
+++ b/interface/web/mail/lib/lang/de_mail_user.lng
@@ -27,4 +27,5 @@
$wb['password_strength_txt'] = 'Passwortkomplexität';
$wb['welcome_mail_fromname_txt'] = 'ISPConfig3';
$wb['welcome_mail_fromemail_txt'] = 'webmaster@ihredomain.at';
+$wb['duplicate_alias_or_forward_txt'] = 'There is already an alias or forwrd with this email address.';
?>
diff --git a/interface/web/mail/lib/lang/de_mail_user_filter_list.lng b/interface/web/mail/lib/lang/de_mail_user_filter_list.lng
index 08191ae..7e0d53e 100644
--- a/interface/web/mail/lib/lang/de_mail_user_filter_list.lng
+++ b/interface/web/mail/lib/lang/de_mail_user_filter_list.lng
@@ -3,4 +3,5 @@
$wb['add_new_record_txt'] = 'Neuen Filter hinzufügen';
$wb['page_txt'] = 'Seite';
$wb['page_of_txt'] = 'von';
+$wb['delete_confirmation'] = 'Do you really want to Delete the mailfilter?';
?>
diff --git a/interface/web/mail/lib/lang/de_spamfilter_blacklist.lng b/interface/web/mail/lib/lang/de_spamfilter_blacklist.lng
index e4034b8..c9441b8 100644
--- a/interface/web/mail/lib/lang/de_spamfilter_blacklist.lng
+++ b/interface/web/mail/lib/lang/de_spamfilter_blacklist.lng
@@ -5,4 +5,5 @@
$wb['email_txt'] = 'Emailadresse';
$wb['priority_txt'] = 'Priorität';
$wb['active_txt'] = 'Aktiv';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
?>
diff --git a/interface/web/mail/lib/lang/de_spamfilter_whitelist.lng b/interface/web/mail/lib/lang/de_spamfilter_whitelist.lng
index c0ffba7..7aec5c5 100644
--- a/interface/web/mail/lib/lang/de_spamfilter_whitelist.lng
+++ b/interface/web/mail/lib/lang/de_spamfilter_whitelist.lng
@@ -5,4 +5,5 @@
$wb['email_txt'] = 'Email';
$wb['priority_txt'] = 'Priorität';
$wb['active_txt'] = 'Aktiv';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
?>
diff --git a/interface/web/mail/lib/lang/en_mail_alias.lng b/interface/web/mail/lib/lang/en_mail_alias.lng
index c912bca..d7c5e7a 100644
--- a/interface/web/mail/lib/lang/en_mail_alias.lng
+++ b/interface/web/mail/lib/lang/en_mail_alias.lng
@@ -7,4 +7,5 @@
$wb["no_domain_perm"] = "You have no permission for this domain.";
$wb["destination_error_isemail"] = 'Destination Emailaddress is invalid.';
$wb["limit_mailalias_txt"] = 'The max. number of email aliases for your account is reached.';
+$wb["duplicate_mailbox_txt"] = 'There is already a mailbox with this email address';
?>
\ No newline at end of file
diff --git a/interface/web/mail/lib/lang/en_mail_forward.lng b/interface/web/mail/lib/lang/en_mail_forward.lng
index ca1764d..dee6271 100644
--- a/interface/web/mail/lib/lang/en_mail_forward.lng
+++ b/interface/web/mail/lib/lang/en_mail_forward.lng
@@ -3,4 +3,5 @@
$wb["destination_txt"] = 'Destination Email';
$wb["active_txt"] = 'Active';
$wb["limit_mailforward_txt"] = 'The max. number of email forwarders for your account is reached.';
+$wb["duplicate_mailbox_txt"] = 'There is already a mailbox with this email address';
?>
\ No newline at end of file
diff --git a/interface/web/mail/lib/lang/en_mail_user.lng b/interface/web/mail/lib/lang/en_mail_user.lng
index c6db506..65ee78a 100644
--- a/interface/web/mail/lib/lang/en_mail_user.lng
+++ b/interface/web/mail/lib/lang/en_mail_user.lng
@@ -27,4 +27,5 @@
$wb["welcome_mail_message"] = "Welcome to your new email account. Your webmaster.";
$wb["disableimap_txt"] = 'Disable IMAP';
$wb["disablepop3_txt"] = 'Disable POP3';
+$wb["duplicate_alias_or_forward_txt"] = 'There is already an alias or forwrd with this email address.';
?>
diff --git a/interface/web/mail/lib/lang/en_mail_user_filter_list.lng b/interface/web/mail/lib/lang/en_mail_user_filter_list.lng
index cc6890d..97cc11a 100644
--- a/interface/web/mail/lib/lang/en_mail_user_filter_list.lng
+++ b/interface/web/mail/lib/lang/en_mail_user_filter_list.lng
@@ -3,4 +3,5 @@
$wb["add_new_record_txt"] = 'Add new Filter';
$wb["page_txt"] = 'Page';
$wb["page_of_txt"] = 'of';
+$wb["delete_confirmation"] = 'Do you really want to Delete the mailfilter?';
?>
\ No newline at end of file
diff --git a/interface/web/mail/lib/lang/es_mail_alias.lng b/interface/web/mail/lib/lang/es_mail_alias.lng
index 57666d5..fc151c8 100644
--- a/interface/web/mail/lib/lang/es_mail_alias.lng
+++ b/interface/web/mail/lib/lang/es_mail_alias.lng
@@ -7,4 +7,5 @@
$wb['no_domain_perm'] = 'No tiene permiso para este dominio';
$wb['destination_error_isemail'] = 'La dirección de correo de destino no es válida';
$wb['limit_mailalias_txt'] = 'Ha alcanzado el número máximo de alias de correo para esta cuenta';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
?>
diff --git a/interface/web/mail/lib/lang/es_mail_forward.lng b/interface/web/mail/lib/lang/es_mail_forward.lng
index 21cd623..a31cb19 100644
--- a/interface/web/mail/lib/lang/es_mail_forward.lng
+++ b/interface/web/mail/lib/lang/es_mail_forward.lng
@@ -3,4 +3,5 @@
$wb['destination_txt'] = 'Correo de destino';
$wb['active_txt'] = 'Activar';
$wb['limit_mailforward_txt'] = 'Se ha alcanzado el número máximo de reenvíos para esta cuenta';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
?>
diff --git a/interface/web/mail/lib/lang/es_mail_user.lng b/interface/web/mail/lib/lang/es_mail_user.lng
index c181eb1..956153d 100644
--- a/interface/web/mail/lib/lang/es_mail_user.lng
+++ b/interface/web/mail/lib/lang/es_mail_user.lng
@@ -29,4 +29,5 @@
$wb['disablepop3_txt'] = 'Disable POP3';
$wb['welcome_mail_fromname_txt'] = 'ISPConfig3';
$wb['welcome_mail_fromemail_txt'] = 'webmaster@localhost.tld';
+$wb['duplicate_alias_or_forward_txt'] = 'There is already an alias or forwrd with this email address.';
?>
diff --git a/interface/web/mail/lib/lang/es_mail_user_filter_list.lng b/interface/web/mail/lib/lang/es_mail_user_filter_list.lng
index 1de7a21..b679b5b 100644
--- a/interface/web/mail/lib/lang/es_mail_user_filter_list.lng
+++ b/interface/web/mail/lib/lang/es_mail_user_filter_list.lng
@@ -3,4 +3,5 @@
$wb['add_new_record_txt'] = 'Añadir nuevo filtro';
$wb['page_txt'] = 'Page';
$wb['page_of_txt'] = 'of';
+$wb['delete_confirmation'] = 'Do you really want to Delete the mailfilter?';
?>
diff --git a/interface/web/mail/lib/lang/es_spamfilter_blacklist.lng b/interface/web/mail/lib/lang/es_spamfilter_blacklist.lng
index 437f441..efd5737 100644
--- a/interface/web/mail/lib/lang/es_spamfilter_blacklist.lng
+++ b/interface/web/mail/lib/lang/es_spamfilter_blacklist.lng
@@ -5,4 +5,5 @@
$wb['email_txt'] = 'Correo';
$wb['priority_txt'] = 'Prioridad';
$wb['active_txt'] = 'Activar';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
?>
diff --git a/interface/web/mail/lib/lang/es_spamfilter_whitelist.lng b/interface/web/mail/lib/lang/es_spamfilter_whitelist.lng
index 437f441..efd5737 100644
--- a/interface/web/mail/lib/lang/es_spamfilter_whitelist.lng
+++ b/interface/web/mail/lib/lang/es_spamfilter_whitelist.lng
@@ -5,4 +5,5 @@
$wb['email_txt'] = 'Correo';
$wb['priority_txt'] = 'Prioridad';
$wb['active_txt'] = 'Activar';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
?>
diff --git a/interface/web/mail/lib/lang/fi_mail_alias.lng b/interface/web/mail/lib/lang/fi_mail_alias.lng
index f3a6dad..02214e1 100755
--- a/interface/web/mail/lib/lang/fi_mail_alias.lng
+++ b/interface/web/mail/lib/lang/fi_mail_alias.lng
@@ -7,4 +7,5 @@
$wb['no_domain_perm'] = 'Käyttäjätunnuksella ei ole oikeuksia tähän verkkotunnukseen.';
$wb['destination_error_isemail'] = 'Kohteena oleva sähköpostiosoite on vääränlainen.';
$wb['limit_mailalias_txt'] = 'Käyttäjätunnuksella on jo sallittu määrä aliasosoitteita.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
?>
diff --git a/interface/web/mail/lib/lang/fi_mail_forward.lng b/interface/web/mail/lib/lang/fi_mail_forward.lng
index 5423874..fb69f1b 100755
--- a/interface/web/mail/lib/lang/fi_mail_forward.lng
+++ b/interface/web/mail/lib/lang/fi_mail_forward.lng
@@ -3,4 +3,5 @@
$wb['destination_txt'] = 'Vastaanottajan sähköposti';
$wb['active_txt'] = 'Käytössä';
$wb['limit_mailforward_txt'] = 'Käyttäjätunnuksella on jo sallittu määrä edelleenlähetysosoitteita.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
?>
diff --git a/interface/web/mail/lib/lang/fi_mail_user.lng b/interface/web/mail/lib/lang/fi_mail_user.lng
index e2fe0c3..ab511f6 100755
--- a/interface/web/mail/lib/lang/fi_mail_user.lng
+++ b/interface/web/mail/lib/lang/fi_mail_user.lng
@@ -27,4 +27,5 @@
$wb['disableimap_txt'] = 'Estä IMAP';
$wb['disablepop3_txt'] = 'Estä POP3';
$wb['password_strength_txt'] = 'Salasanan vahvuus';
+$wb['duplicate_alias_or_forward_txt'] = 'There is already an alias or forwrd with this email address.';
?>
diff --git a/interface/web/mail/lib/lang/fi_mail_user_filter_list.lng b/interface/web/mail/lib/lang/fi_mail_user_filter_list.lng
index 41ce0ed..5468146 100755
--- a/interface/web/mail/lib/lang/fi_mail_user_filter_list.lng
+++ b/interface/web/mail/lib/lang/fi_mail_user_filter_list.lng
@@ -3,4 +3,5 @@
$wb['add_new_record_txt'] = 'Lisää uusi suodatussääntö';
$wb['page_txt'] = 'Page';
$wb['page_of_txt'] = 'of';
+$wb['delete_confirmation'] = 'Do you really want to Delete the mailfilter?';
?>
diff --git a/interface/web/mail/lib/lang/fi_spamfilter_blacklist.lng b/interface/web/mail/lib/lang/fi_spamfilter_blacklist.lng
index f44c20f..a72ccb0 100755
--- a/interface/web/mail/lib/lang/fi_spamfilter_blacklist.lng
+++ b/interface/web/mail/lib/lang/fi_spamfilter_blacklist.lng
@@ -5,4 +5,5 @@
$wb['email_txt'] = 'Sähköpostiosoite';
$wb['priority_txt'] = 'Tärkeysjärjestys';
$wb['active_txt'] = 'Käytössä';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
?>
diff --git a/interface/web/mail/lib/lang/fi_spamfilter_whitelist.lng b/interface/web/mail/lib/lang/fi_spamfilter_whitelist.lng
index 78d2012..f691ba6 100755
--- a/interface/web/mail/lib/lang/fi_spamfilter_whitelist.lng
+++ b/interface/web/mail/lib/lang/fi_spamfilter_whitelist.lng
@@ -5,4 +5,5 @@
$wb['email_txt'] = 'Sähköpostiosoite';
$wb['priority_txt'] = 'Tärkeysjärjestys';
$wb['active_txt'] = 'Käytössä';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
?>
diff --git a/interface/web/mail/lib/lang/fr_mail_alias.lng b/interface/web/mail/lib/lang/fr_mail_alias.lng
index 23ff84f..44b6fed 100644
--- a/interface/web/mail/lib/lang/fr_mail_alias.lng
+++ b/interface/web/mail/lib/lang/fr_mail_alias.lng
@@ -7,4 +7,5 @@
$wb['no_domain_perm'] = 'You have no permission for this domain.';
$wb['destination_error_isemail'] = 'Destination Emailaddress is invalid.';
$wb['limit_mailalias_txt'] = 'The max. number of email aliases for your account is reached.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
?>
diff --git a/interface/web/mail/lib/lang/fr_mail_forward.lng b/interface/web/mail/lib/lang/fr_mail_forward.lng
index f8c8362..7d237e1 100644
--- a/interface/web/mail/lib/lang/fr_mail_forward.lng
+++ b/interface/web/mail/lib/lang/fr_mail_forward.lng
@@ -3,4 +3,5 @@
$wb['destination_txt'] = 'Destination Email';
$wb['active_txt'] = 'Active';
$wb['limit_mailforward_txt'] = 'The max. number of email forwarders for your account is reached.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
?>
diff --git a/interface/web/mail/lib/lang/fr_mail_user.lng b/interface/web/mail/lib/lang/fr_mail_user.lng
index c181eb1..956153d 100644
--- a/interface/web/mail/lib/lang/fr_mail_user.lng
+++ b/interface/web/mail/lib/lang/fr_mail_user.lng
@@ -29,4 +29,5 @@
$wb['disablepop3_txt'] = 'Disable POP3';
$wb['welcome_mail_fromname_txt'] = 'ISPConfig3';
$wb['welcome_mail_fromemail_txt'] = 'webmaster@localhost.tld';
+$wb['duplicate_alias_or_forward_txt'] = 'There is already an alias or forwrd with this email address.';
?>
diff --git a/interface/web/mail/lib/lang/fr_mail_user_filter_list.lng b/interface/web/mail/lib/lang/fr_mail_user_filter_list.lng
index 28852d5..2754259 100644
--- a/interface/web/mail/lib/lang/fr_mail_user_filter_list.lng
+++ b/interface/web/mail/lib/lang/fr_mail_user_filter_list.lng
@@ -3,4 +3,5 @@
$wb['add_new_record_txt'] = 'Add new Filter';
$wb['page_txt'] = 'Page';
$wb['page_of_txt'] = 'of';
+$wb['delete_confirmation'] = 'Do you really want to Delete the mailfilter?';
?>
diff --git a/interface/web/mail/lib/lang/fr_spamfilter_blacklist.lng b/interface/web/mail/lib/lang/fr_spamfilter_blacklist.lng
index 02718da..5a85949 100644
--- a/interface/web/mail/lib/lang/fr_spamfilter_blacklist.lng
+++ b/interface/web/mail/lib/lang/fr_spamfilter_blacklist.lng
@@ -5,4 +5,5 @@
$wb['email_txt'] = 'Email';
$wb['priority_txt'] = 'Priority';
$wb['active_txt'] = 'Active';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
?>
diff --git a/interface/web/mail/lib/lang/fr_spamfilter_whitelist.lng b/interface/web/mail/lib/lang/fr_spamfilter_whitelist.lng
index 02718da..5a85949 100644
--- a/interface/web/mail/lib/lang/fr_spamfilter_whitelist.lng
+++ b/interface/web/mail/lib/lang/fr_spamfilter_whitelist.lng
@@ -5,4 +5,5 @@
$wb['email_txt'] = 'Email';
$wb['priority_txt'] = 'Priority';
$wb['active_txt'] = 'Active';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
?>
diff --git a/interface/web/mail/lib/lang/it_mail_alias.lng b/interface/web/mail/lib/lang/it_mail_alias.lng
index 23ff84f..44b6fed 100644
--- a/interface/web/mail/lib/lang/it_mail_alias.lng
+++ b/interface/web/mail/lib/lang/it_mail_alias.lng
@@ -7,4 +7,5 @@
$wb['no_domain_perm'] = 'You have no permission for this domain.';
$wb['destination_error_isemail'] = 'Destination Emailaddress is invalid.';
$wb['limit_mailalias_txt'] = 'The max. number of email aliases for your account is reached.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
?>
diff --git a/interface/web/mail/lib/lang/it_mail_forward.lng b/interface/web/mail/lib/lang/it_mail_forward.lng
index f8c8362..7d237e1 100644
--- a/interface/web/mail/lib/lang/it_mail_forward.lng
+++ b/interface/web/mail/lib/lang/it_mail_forward.lng
@@ -3,4 +3,5 @@
$wb['destination_txt'] = 'Destination Email';
$wb['active_txt'] = 'Active';
$wb['limit_mailforward_txt'] = 'The max. number of email forwarders for your account is reached.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
?>
diff --git a/interface/web/mail/lib/lang/it_mail_user.lng b/interface/web/mail/lib/lang/it_mail_user.lng
index c181eb1..956153d 100644
--- a/interface/web/mail/lib/lang/it_mail_user.lng
+++ b/interface/web/mail/lib/lang/it_mail_user.lng
@@ -29,4 +29,5 @@
$wb['disablepop3_txt'] = 'Disable POP3';
$wb['welcome_mail_fromname_txt'] = 'ISPConfig3';
$wb['welcome_mail_fromemail_txt'] = 'webmaster@localhost.tld';
+$wb['duplicate_alias_or_forward_txt'] = 'There is already an alias or forwrd with this email address.';
?>
diff --git a/interface/web/mail/lib/lang/it_mail_user_filter_list.lng b/interface/web/mail/lib/lang/it_mail_user_filter_list.lng
index 28852d5..2754259 100644
--- a/interface/web/mail/lib/lang/it_mail_user_filter_list.lng
+++ b/interface/web/mail/lib/lang/it_mail_user_filter_list.lng
@@ -3,4 +3,5 @@
$wb['add_new_record_txt'] = 'Add new Filter';
$wb['page_txt'] = 'Page';
$wb['page_of_txt'] = 'of';
+$wb['delete_confirmation'] = 'Do you really want to Delete the mailfilter?';
?>
diff --git a/interface/web/mail/lib/lang/it_spamfilter_blacklist.lng b/interface/web/mail/lib/lang/it_spamfilter_blacklist.lng
index 02718da..5a85949 100644
--- a/interface/web/mail/lib/lang/it_spamfilter_blacklist.lng
+++ b/interface/web/mail/lib/lang/it_spamfilter_blacklist.lng
@@ -5,4 +5,5 @@
$wb['email_txt'] = 'Email';
$wb['priority_txt'] = 'Priority';
$wb['active_txt'] = 'Active';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
?>
diff --git a/interface/web/mail/lib/lang/it_spamfilter_whitelist.lng b/interface/web/mail/lib/lang/it_spamfilter_whitelist.lng
index 02718da..5a85949 100644
--- a/interface/web/mail/lib/lang/it_spamfilter_whitelist.lng
+++ b/interface/web/mail/lib/lang/it_spamfilter_whitelist.lng
@@ -5,4 +5,5 @@
$wb['email_txt'] = 'Email';
$wb['priority_txt'] = 'Priority';
$wb['active_txt'] = 'Active';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
?>
diff --git a/interface/web/mail/lib/lang/nl_mail_alias.lng b/interface/web/mail/lib/lang/nl_mail_alias.lng
index 4006c38..021749a 100644
--- a/interface/web/mail/lib/lang/nl_mail_alias.lng
+++ b/interface/web/mail/lib/lang/nl_mail_alias.lng
@@ -7,4 +7,5 @@
$wb['no_domain_perm'] = 'U heeft geen toestemming voor dit domain.';
$wb['destination_error_isemail'] = 'Emailadres geadresseerde is ongeldig.';
$wb['limit_mailalias_txt'] = 'Het max. aantal emailaliassen voor uw account is bereikt.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
?>
diff --git a/interface/web/mail/lib/lang/nl_mail_forward.lng b/interface/web/mail/lib/lang/nl_mail_forward.lng
index 12d72f7..d12e664 100644
--- a/interface/web/mail/lib/lang/nl_mail_forward.lng
+++ b/interface/web/mail/lib/lang/nl_mail_forward.lng
@@ -3,4 +3,5 @@
$wb['destination_txt'] = 'Emailadres geadresseerde';
$wb['active_txt'] = 'Actief';
$wb['limit_mailforward_txt'] = 'Het max. aantal email forwarders voor uw account is bereikt.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
?>
diff --git a/interface/web/mail/lib/lang/nl_mail_user.lng b/interface/web/mail/lib/lang/nl_mail_user.lng
index 08ef5a8..28182ef 100644
--- a/interface/web/mail/lib/lang/nl_mail_user.lng
+++ b/interface/web/mail/lib/lang/nl_mail_user.lng
@@ -29,4 +29,5 @@
$wb['disablepop3_txt'] = 'Uitschakelen POP3';
$wb['welcome_mail_fromname_txt'] = 'ISPConfig3';
$wb['welcome_mail_fromemail_txt'] = 'webmaster@localhost.tld';
+$wb['duplicate_alias_or_forward_txt'] = 'There is already an alias or forwrd with this email address.';
?>
diff --git a/interface/web/mail/lib/lang/nl_mail_user_filter_list.lng b/interface/web/mail/lib/lang/nl_mail_user_filter_list.lng
index 37f5138..c8318ee 100644
--- a/interface/web/mail/lib/lang/nl_mail_user_filter_list.lng
+++ b/interface/web/mail/lib/lang/nl_mail_user_filter_list.lng
@@ -3,4 +3,5 @@
$wb['add_new_record_txt'] = 'Toevoegen Filter';
$wb['page_txt'] = 'Page';
$wb['page_of_txt'] = 'of';
+$wb['delete_confirmation'] = 'Do you really want to Delete the mailfilter?';
?>
diff --git a/interface/web/mail/lib/lang/nl_spamfilter_blacklist.lng b/interface/web/mail/lib/lang/nl_spamfilter_blacklist.lng
index bcd3238..f7314fa 100644
--- a/interface/web/mail/lib/lang/nl_spamfilter_blacklist.lng
+++ b/interface/web/mail/lib/lang/nl_spamfilter_blacklist.lng
@@ -5,4 +5,5 @@
$wb['email_txt'] = 'Email';
$wb['priority_txt'] = 'Prioriteit';
$wb['active_txt'] = 'Actief';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
?>
diff --git a/interface/web/mail/lib/lang/nl_spamfilter_whitelist.lng b/interface/web/mail/lib/lang/nl_spamfilter_whitelist.lng
index bcd3238..f7314fa 100644
--- a/interface/web/mail/lib/lang/nl_spamfilter_whitelist.lng
+++ b/interface/web/mail/lib/lang/nl_spamfilter_whitelist.lng
@@ -5,4 +5,5 @@
$wb['email_txt'] = 'Email';
$wb['priority_txt'] = 'Prioriteit';
$wb['active_txt'] = 'Actief';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
?>
diff --git a/interface/web/mail/lib/lang/ru_mail_alias.lng b/interface/web/mail/lib/lang/ru_mail_alias.lng
index ddbe0d1..e7a451c 100644
--- a/interface/web/mail/lib/lang/ru_mail_alias.lng
+++ b/interface/web/mail/lib/lang/ru_mail_alias.lng
@@ -7,4 +7,5 @@
$wb['no_domain_perm'] = 'Вы не имеете прав для этого домена.';
$wb['destination_error_isemail'] = 'Email получателя неправилен.';
$wb['limit_mailalias_txt'] = 'Максимальное число алиасов достигнуто.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
?>
diff --git a/interface/web/mail/lib/lang/ru_mail_forward.lng b/interface/web/mail/lib/lang/ru_mail_forward.lng
index 5973116..ea8340e 100644
--- a/interface/web/mail/lib/lang/ru_mail_forward.lng
+++ b/interface/web/mail/lib/lang/ru_mail_forward.lng
@@ -3,4 +3,5 @@
$wb['destination_txt'] = 'Получатель Email';
$wb['active_txt'] = 'Активный';
$wb['limit_mailforward_txt'] = 'Максимальное число forwarders достигнуто.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
?>
diff --git a/interface/web/mail/lib/lang/ru_mail_user.lng b/interface/web/mail/lib/lang/ru_mail_user.lng
index 75e1f8d..a65096e 100644
--- a/interface/web/mail/lib/lang/ru_mail_user.lng
+++ b/interface/web/mail/lib/lang/ru_mail_user.lng
@@ -29,4 +29,5 @@
$wb['disablepop3_txt'] = 'Disable POP3';
$wb['welcome_mail_fromname_txt'] = 'ISPConfig3';
$wb['welcome_mail_fromemail_txt'] = 'webmaster@localhost.tld';
+$wb['duplicate_alias_or_forward_txt'] = 'There is already an alias or forwrd with this email address.';
?>
diff --git a/interface/web/mail/lib/lang/ru_mail_user_filter_list.lng b/interface/web/mail/lib/lang/ru_mail_user_filter_list.lng
index 7c69b92..694dc3b 100644
--- a/interface/web/mail/lib/lang/ru_mail_user_filter_list.lng
+++ b/interface/web/mail/lib/lang/ru_mail_user_filter_list.lng
@@ -3,4 +3,5 @@
$wb['add_new_record_txt'] = 'Добавить новый Фильтр';
$wb['page_txt'] = 'Page';
$wb['page_of_txt'] = 'of';
+$wb['delete_confirmation'] = 'Do you really want to Delete the mailfilter?';
?>
diff --git a/interface/web/mail/lib/lang/ru_spamfilter_blacklist.lng b/interface/web/mail/lib/lang/ru_spamfilter_blacklist.lng
index e41656c..223e88e 100644
--- a/interface/web/mail/lib/lang/ru_spamfilter_blacklist.lng
+++ b/interface/web/mail/lib/lang/ru_spamfilter_blacklist.lng
@@ -5,4 +5,5 @@
$wb['email_txt'] = 'Email';
$wb['priority_txt'] = 'Приоритет';
$wb['active_txt'] = 'Активный';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
?>
diff --git a/interface/web/mail/lib/lang/ru_spamfilter_whitelist.lng b/interface/web/mail/lib/lang/ru_spamfilter_whitelist.lng
index e41656c..223e88e 100644
--- a/interface/web/mail/lib/lang/ru_spamfilter_whitelist.lng
+++ b/interface/web/mail/lib/lang/ru_spamfilter_whitelist.lng
@@ -5,4 +5,5 @@
$wb['email_txt'] = 'Email';
$wb['priority_txt'] = 'Приоритет';
$wb['active_txt'] = 'Активный';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
?>
diff --git a/interface/web/mail/lib/lang/se_mail_alias.lng b/interface/web/mail/lib/lang/se_mail_alias.lng
index 29948b4..742a20a 100644
--- a/interface/web/mail/lib/lang/se_mail_alias.lng
+++ b/interface/web/mail/lib/lang/se_mail_alias.lng
@@ -7,4 +7,5 @@
$wb['no_domain_perm'] = 'Du har ingen beh�righet f�r denna dom�nen.';
$wb['destination_error_isemail'] = 'Destination Emailaddress is invalid.';
$wb['limit_mailalias_txt'] = 'The max. number of email aliases for your account is reached.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
?>
diff --git a/interface/web/mail/lib/lang/se_mail_forward.lng b/interface/web/mail/lib/lang/se_mail_forward.lng
index 8d73688..be714f4 100644
--- a/interface/web/mail/lib/lang/se_mail_forward.lng
+++ b/interface/web/mail/lib/lang/se_mail_forward.lng
@@ -3,4 +3,5 @@
$wb['destination_txt'] = 'Mottagande Epost';
$wb['active_txt'] = 'Aktiv';
$wb['limit_mailforward_txt'] = 'The max. number of email forwarders for your account is reached.';
+$wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address';
?>
diff --git a/interface/web/mail/lib/lang/se_mail_user.lng b/interface/web/mail/lib/lang/se_mail_user.lng
index c181eb1..956153d 100644
--- a/interface/web/mail/lib/lang/se_mail_user.lng
+++ b/interface/web/mail/lib/lang/se_mail_user.lng
@@ -29,4 +29,5 @@
$wb['disablepop3_txt'] = 'Disable POP3';
$wb['welcome_mail_fromname_txt'] = 'ISPConfig3';
$wb['welcome_mail_fromemail_txt'] = 'webmaster@localhost.tld';
+$wb['duplicate_alias_or_forward_txt'] = 'There is already an alias or forwrd with this email address.';
?>
diff --git a/interface/web/mail/lib/lang/se_mail_user_filter_list.lng b/interface/web/mail/lib/lang/se_mail_user_filter_list.lng
index 28852d5..2754259 100644
--- a/interface/web/mail/lib/lang/se_mail_user_filter_list.lng
+++ b/interface/web/mail/lib/lang/se_mail_user_filter_list.lng
@@ -3,4 +3,5 @@
$wb['add_new_record_txt'] = 'Add new Filter';
$wb['page_txt'] = 'Page';
$wb['page_of_txt'] = 'of';
+$wb['delete_confirmation'] = 'Do you really want to Delete the mailfilter?';
?>
diff --git a/interface/web/mail/lib/lang/se_spamfilter_blacklist.lng b/interface/web/mail/lib/lang/se_spamfilter_blacklist.lng
index 02718da..5a85949 100644
--- a/interface/web/mail/lib/lang/se_spamfilter_blacklist.lng
+++ b/interface/web/mail/lib/lang/se_spamfilter_blacklist.lng
@@ -5,4 +5,5 @@
$wb['email_txt'] = 'Email';
$wb['priority_txt'] = 'Priority';
$wb['active_txt'] = 'Active';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
?>
diff --git a/interface/web/mail/lib/lang/se_spamfilter_whitelist.lng b/interface/web/mail/lib/lang/se_spamfilter_whitelist.lng
index 02718da..5a85949 100644
--- a/interface/web/mail/lib/lang/se_spamfilter_whitelist.lng
+++ b/interface/web/mail/lib/lang/se_spamfilter_whitelist.lng
@@ -5,4 +5,5 @@
$wb['email_txt'] = 'Email';
$wb['priority_txt'] = 'Priority';
$wb['active_txt'] = 'Active';
+$wb['limit_spamfilter_wblist_txt'] = 'The max. number of White- or Blacklist records for your account is reached.';
?>
diff --git a/interface/web/mail/mail_alias_edit.php b/interface/web/mail/mail_alias_edit.php
index 641d609..b6ce17f 100644
--- a/interface/web/mail/mail_alias_edit.php
+++ b/interface/web/mail/mail_alias_edit.php
@@ -1,6 +1,6 @@
<?php
/*
-Copyright (c) 2005, Till Brehm, projektfarm Gmbh
+Copyright (c) 2005 - 2009, Till Brehm, projektfarm Gmbh
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
@@ -55,17 +55,11 @@
// we will check only users, not admins
if($_SESSION["s"]["user"]["typ"] == 'user') {
-
- // Get the limits of the client
- $client_group_id = $_SESSION["s"]["user"]["default_group"];
- $client = $app->db->queryOneRecord("SELECT limit_mailalias FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-
- // Check if the user may add another mailbox.
- if($client["limit_mailalias"] >= 0) {
- $tmp = $app->db->queryOneRecord("SELECT count(forwarding_id) as number FROM mail_forwarding WHERE sys_groupid = $client_group_id and type = 'alias'");
- if($tmp["number"] >= $client["limit_mailalias"]) {
- $app->error($app->tform->wordbook["limit_mailalias_txt"]);
- }
+ if(!$app->tform->checkClientLimit('limit_mailalias',"type = 'alias'")) {
+ $app->error($app->tform->wordbook["limit_mailalias_txt"]);
+ }
+ if(!$app->tform->checkResellerLimit('limit_mailalias',"type = 'alias'")) {
+ $app->error('Reseller: '.$app->tform->wordbook["limit_mailalias_txt"]);
}
}
@@ -80,7 +74,7 @@
$app->tpl->setVar("email_local_part",$email_parts[0]);
// Getting Domains of the user
- $sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r');
+ $sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r').' ORDER BY domain';
$domains = $app->db->queryAllRecords($sql);
$domain_select = '';
if(is_array($domains)) {
@@ -126,6 +120,11 @@
unset($this->dataRecord["email_local_part"]);
unset($this->dataRecord["email_domain"]);
+ //* Check if there is no mailbox with this address
+ $tmp = $app->db->queryOneRecord("SELECT count(mailuser_id) as number FROM mail_user WHERE email = '".$app->db->quote($this->dataRecord["source"])."'");
+ if($tmp['number'] > 0) $app->tform->errorMessage .= $app->tform->lng("duplicate_mailbox_txt")."<br>";
+ unset($tmp);
+
parent::onSubmit();
}
diff --git a/interface/web/mail/mail_blacklist_edit.php b/interface/web/mail/mail_blacklist_edit.php
index 558c29d..b2f4f67 100644
--- a/interface/web/mail/mail_blacklist_edit.php
+++ b/interface/web/mail/mail_blacklist_edit.php
@@ -55,17 +55,11 @@
// we will check only users, not admins
if($_SESSION["s"]["user"]["typ"] == 'user') {
-
- // Get the limits of the client
- $client_group_id = $_SESSION["s"]["user"]["default_group"];
- $client = $app->db->queryOneRecord("SELECT limit_mailfilter FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-
- // Check if the user may add another mailbox.
- if($client["limit_mailfilter"] >= 0) {
- $tmp = $app->db->queryOneRecord("SELECT count(access_id) as number FROM mail_access WHERE sys_groupid = $client_group_id");
- if($tmp["number"] >= $client["limit_mailfilter"]) {
- $app->error($app->tform->wordbook["limit_mailfilter_txt"]);
- }
+ if(!$app->tform->checkClientLimit('limit_mailfilter')) {
+ $app->error($app->tform->wordbook["limit_mailfilter_txt"]);
+ }
+ if(!$app->tform->checkResellerLimit('limit_mailfilter')) {
+ $app->error('Reseller: '.$app->tform->wordbook["limit_mailfilter_txt"]);
}
}
diff --git a/interface/web/mail/mail_domain_catchall_edit.php b/interface/web/mail/mail_domain_catchall_edit.php
index eebc7e4..c3338cc 100644
--- a/interface/web/mail/mail_domain_catchall_edit.php
+++ b/interface/web/mail/mail_domain_catchall_edit.php
@@ -55,17 +55,11 @@
// we will check only users, not admins
if($_SESSION["s"]["user"]["typ"] == 'user') {
-
- // Get the limits of the client
- $client_group_id = $_SESSION["s"]["user"]["default_group"];
- $client = $app->db->queryOneRecord("SELECT limit_mailcatchall FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-
- // Check if the user may add another mailbox.
- if($client["limit_mailcatchall"] >= 0) {
- $tmp = $app->db->queryOneRecord("SELECT count(forwarding_id) as number FROM mail_forwarding WHERE sys_groupid = $client_group_id and type = 'catchall'");
- if($tmp["number"] >= $client["limit_mailcatchall"]) {
- $app->error($app->tform->wordbook["limit_mailcatchall_txt"]);
- }
+ if(!$app->tform->checkClientLimit('limit_mailcatchall',"type = 'catchall'")) {
+ $app->error($app->tform->wordbook["limit_mailcatchall_txt"]);
+ }
+ if(!$app->tform->checkResellerLimit('limit_mailcatchall',"type = 'catchall'")) {
+ $app->error('Reseller: '.$app->tform->wordbook["limit_mailcatchall_txt"]);
}
}
diff --git a/interface/web/mail/mail_domain_edit.php b/interface/web/mail/mail_domain_edit.php
index 74ea170..14ef8e2 100644
--- a/interface/web/mail/mail_domain_edit.php
+++ b/interface/web/mail/mail_domain_edit.php
@@ -55,17 +55,11 @@
// we will check only users, not admins
if($_SESSION["s"]["user"]["typ"] == 'user') {
-
- // Get the limits of the client
- $client_group_id = $_SESSION["s"]["user"]["default_group"];
- $client = $app->db->queryOneRecord("SELECT limit_maildomain FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-
- // Check if the user may add another maildomain.
- if($client["limit_maildomain"] >= 0) {
- $tmp = $app->db->queryOneRecord("SELECT count(domain_id) as number FROM mail_domain WHERE sys_groupid = $client_group_id");
- if($tmp["number"] >= $client["limit_maildomain"]) {
- $app->error($app->tform->wordbook["limit_maildomain_txt"]);
- }
+ if(!$app->tform->checkClientLimit('limit_maildomain')) {
+ $app->error($app->tform->wordbook["limit_maildomain_txt"]);
+ }
+ if(!$app->tform->checkResellerLimit('limit_maildomain')) {
+ $app->error('Reseller: '.$app->tform->wordbook["limit_maildomain_txt"]);
}
}
@@ -98,7 +92,7 @@
// Get the limits of the client
$client_group_id = $_SESSION["s"]["user"]["default_group"];
- $client = $app->db->queryOneRecord("SELECT client.client_id, limit_web_domain, default_webserver 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, contact_name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
// Set the webserver to the default server of the client
$tmp = $app->db->queryOneRecord("SELECT server_name FROM server WHERE server_id = $client[default_webserver]");
@@ -108,7 +102,7 @@
// Fill the client select field
$sql = "SELECT groupid, name 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);
- $client_select = '';
+ $client_select = '<option value="'.$client['client_id'].'">'.$client['contact_name'].'</option>';
if(is_array($clients)) {
foreach( $clients as $client) {
$selected = @($client["groupid"] == $this->dataRecord["sys_groupid"])?'SELECTED':'';
@@ -180,6 +174,11 @@
// Clients may not set the client_group_id, so we unset them if user is not a admin
if(!$app->auth->has_clients($_SESSION['s']['user']['userid'])) unset($this->dataRecord["client_group_id"]);
}
+
+ //* make sure that the email domain is lowercase
+ if(isset($this->dataRecord["domain"])) $this->dataRecord["domain"] = strtolower($this->dataRecord["domain"]);
+
+
parent::onSubmit();
}
@@ -221,11 +220,21 @@
//* Check if the server has been changed
// We do this only for the admin or reseller users, as normal clients can not change the server ID anyway
if($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) {
- $rec = $app->db->queryOneRecord("SELECT server_id from mail_domain WHERE domain_id = ".$this->id);
+ $rec = $app->db->queryOneRecord("SELECT server_id, domain from mail_domain WHERE domain_id = ".$this->id);
if($rec['server_id'] != $this->dataRecord["server_id"]) {
//* Add a error message and switch back to old server
$app->tform->errorMessage .= $app->lng('The Server can not be changed.');
$this->dataRecord["server_id"] = $rec['server_id'];
+ }
+ unset($rec);
+ //* If the user is neither admin nor reseller
+ } else {
+ //* We do not allow users to change a domain which has been created by the admin
+ $rec = $app->db->queryOneRecord("SELECT domain from mail_domain WHERE domain_id = ".$this->id);
+ if($rec['domain'] != $this->dataRecord["domain"] && $app->tform->checkPerm($this->id,'u')) {
+ //* Add a error message and switch back to old server
+ $app->tform->errorMessage .= $app->lng('The Domain can not be changed. Please ask your Administrator if you want to change the domain name.');
+ $this->dataRecord["domain"] = $rec['domain'];
}
unset($rec);
}
@@ -298,6 +307,11 @@
}
}
+ //* Delete the old spamfilter record
+ $tmp = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = '@".mysql_real_escape_string($this->oldDataRecord["domain"])."'");
+ $app->db->datalogDelete('spamfilter_users', 'id', $tmp["id"]);
+ unset($tmp);
+
} // end if domain name changed
}
diff --git a/interface/web/mail/mail_forward_edit.php b/interface/web/mail/mail_forward_edit.php
index b6871aa..f89cd36 100644
--- a/interface/web/mail/mail_forward_edit.php
+++ b/interface/web/mail/mail_forward_edit.php
@@ -1,6 +1,6 @@
<?php
/*
-Copyright (c) 2005, Till Brehm, projektfarm Gmbh
+Copyright (c) 2005 - 2009, Till Brehm, projektfarm Gmbh
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
@@ -55,17 +55,11 @@
// we will check only users, not admins
if($_SESSION["s"]["user"]["typ"] == 'user') {
-
- // Get the limits of the client
- $client_group_id = $_SESSION["s"]["user"]["default_group"];
- $client = $app->db->queryOneRecord("SELECT limit_mailforward FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-
- // Check if the user may add another mailbox.
- if($client["limit_mailforward"] >= 0) {
- $tmp = $app->db->queryOneRecord("SELECT count(forwarding_id) as number FROM mail_forwarding WHERE sys_groupid = $client_group_id and type = 'forward'");
- if($tmp["number"] >= $client["limit_mailforward"]) {
- $app->error($app->tform->wordbook["limit_mailforward_txt"]);
- }
+ if(!$app->tform->checkClientLimit('limit_mailforward',"type = 'forward'")) {
+ $app->error($app->tform->wordbook["limit_mailforward_txt"]);
+ }
+ if(!$app->tform->checkResellerLimit('limit_mailforward',"type = 'forward'")) {
+ $app->error('Reseller: '.$app->tform->wordbook["limit_mailforward_txt"]);
}
}
@@ -80,7 +74,7 @@
$app->tpl->setVar("email_local_part",$email_parts[0]);
// Getting Domains of the user
- $sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r');
+ $sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r').' ORDER BY domain';
$domains = $app->db->queryAllRecords($sql);
$domain_select = '';
foreach( $domains as $domain) {
@@ -123,6 +117,11 @@
unset($this->dataRecord["email_local_part"]);
unset($this->dataRecord["email_domain"]);
+ //* Check if there is no mailbox with this address
+ $tmp = $app->db->queryOneRecord("SELECT count(mailuser_id) as number FROM mail_user WHERE email = '".$app->db->quote($this->dataRecord["source"])."'");
+ if($tmp['number'] > 0) $app->tform->errorMessage .= $app->tform->lng("duplicate_mailbox_txt")."<br>";
+ unset($tmp);
+
parent::onSubmit();
}
diff --git a/interface/web/mail/mail_get_edit.php b/interface/web/mail/mail_get_edit.php
index ec9aeb9..5bc512a 100644
--- a/interface/web/mail/mail_get_edit.php
+++ b/interface/web/mail/mail_get_edit.php
@@ -55,17 +55,11 @@
// we will check only users, not admins
if($_SESSION["s"]["user"]["typ"] == 'user') {
-
- // Get the limits of the client
- $client_group_id = $_SESSION["s"]["user"]["default_group"];
- $client = $app->db->queryOneRecord("SELECT limit_fetchmail FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-
- // Check if the user may add another transport.
- if($client["limit_fetchmail"] >= 0) {
- $tmp = $app->db->queryOneRecord("SELECT count(mailget_id) as number FROM mail_get WHERE sys_groupid = $client_group_id");
- if($tmp["number"] >= $client["limit_fetchmail"]) {
- $app->error($app->tform->wordbook["limit_fetchmail_txt"]);
- }
+ if(!$app->tform->checkClientLimit('limit_fetchmail')) {
+ $app->error($app->tform->wordbook["limit_fetchmail_txt"]);
+ }
+ if(!$app->tform->checkResellerLimit('limit_fetchmail')) {
+ $app->error('Reseller: '.$app->tform->wordbook["limit_fetchmail_txt"]);
}
}
diff --git a/interface/web/mail/mail_transport_edit.php b/interface/web/mail/mail_transport_edit.php
index 6ab58fb..58b06dc 100644
--- a/interface/web/mail/mail_transport_edit.php
+++ b/interface/web/mail/mail_transport_edit.php
@@ -56,17 +56,11 @@
// we will check only users, not admins
if($_SESSION["s"]["user"]["typ"] == 'user') {
-
- // Get the limits of the client
- $client_group_id = $_SESSION["s"]["user"]["default_group"];
- $client = $app->db->queryOneRecord("SELECT limit_mailrouting FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-
- // Check if the user may add another transport.
- if($client["limit_mailrouting"] >= 0) {
- $tmp = $app->db->queryOneRecord("SELECT count(transport_id) as number FROM mail_transport WHERE sys_groupid = $client_group_id");
- if($tmp["number"] >= $client["limit_mailrouting"]) {
- $app->error($app->tform->wordbook["limit_mailrouting_txt"]);
- }
+ if(!$app->tform->checkClientLimit('limit_mailrouting')) {
+ $app->error($app->tform->wordbook["limit_mailrouting_txt"]);
+ }
+ if(!$app->tform->checkResellerLimit('limit_mailrouting')) {
+ $app->error('Reseller: '.$app->tform->wordbook["limit_mailrouting_txt"]);
}
}
diff --git a/interface/web/mail/mail_user_edit.php b/interface/web/mail/mail_user_edit.php
index 5a746bc..9289eeb 100644
--- a/interface/web/mail/mail_user_edit.php
+++ b/interface/web/mail/mail_user_edit.php
@@ -1,6 +1,6 @@
<?php
/*
-Copyright (c) 2005, Till Brehm, projektfarm Gmbh
+Copyright (c) 2005 - 2009, Till Brehm, projektfarm Gmbh
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
@@ -56,17 +56,11 @@
// we will check only users, not admins
if($_SESSION["s"]["user"]["typ"] == 'user') {
-
- // Get the limits of the client
- $client_group_id = $_SESSION["s"]["user"]["default_group"];
- $client = $app->db->queryOneRecord("SELECT limit_mailbox FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-
- // Check if the user may add another mailbox.
- if($client["limit_mailbox"] >= 0) {
- $tmp = $app->db->queryOneRecord("SELECT count(mailuser_id) as number FROM mail_user WHERE sys_groupid = $client_group_id");
- if($tmp["number"] >= $client["limit_mailbox"]) {
- $app->error($app->tform->wordbook["limit_mailbox_txt"]);
- }
+ if(!$app->tform->checkClientLimit('limit_mailbox')) {
+ $app->error($app->tform->wordbook["limit_mailbox_txt"]);
+ }
+ if(!$app->tform->checkResellerLimit('limit_mailbox')) {
+ $app->error('Reseller: '.$app->tform->wordbook["limit_mailbox_txt"]);
}
}
@@ -81,7 +75,7 @@
$app->tpl->setVar("email_local_part",$email_parts[0]);
// Getting Domains of the user
- $sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r');
+ $sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r').' ORDER BY domain';
$domains = $app->db->queryAllRecords($sql);
$domain_select = '';
if(is_array($domains)) {
@@ -98,7 +92,7 @@
$tmp_user = $app->db->queryOneRecord("SELECT policy_id FROM spamfilter_users WHERE email = '".$this->dataRecord["email"]."'");
$sql = "SELECT id, policy_name FROM spamfilter_policy WHERE ".$app->tform->getAuthSQL('r');
$policys = $app->db->queryAllRecords($sql);
- $policy_select = "<option value='0'>".$app->tform->wordbook["no_policy"]."</option>";
+ $policy_select = "<option value='0'>".$app->tform->lng("no_policy")."</option>";
if(is_array($policys)) {
foreach( $policys as $p) {
$selected = ($p["id"] == $tmp_user["policy_id"])?'SELECTED':'';
@@ -119,19 +113,19 @@
function onSubmit() {
global $app, $conf;
- // Check if Domain belongs to user
+ //* Check if Domain belongs to user
if(isset($_POST["email_domain"])) {
$domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r'));
- if($domain["domain"] != $_POST["email_domain"]) $app->tform->errorMessage .= $app->tform->wordbook["no_domain_perm"];
+ if($domain["domain"] != $_POST["email_domain"]) $app->tform->errorMessage .= $app->tform->lng("no_domain_perm");
}
- // if its an insert, check that the password is not empty
+ //* if its an insert, check that the password is not empty
if($this->id == 0 && $_POST["password"] == '') {
- $app->tform->errorMessage .= $app->tform->wordbook["error_no_pwd"]."<br>";
+ $app->tform->errorMessage .= $app->tform->lng("error_no_pwd")."<br>";
}
- // Check the client limits, if user is not the admin
+ //* Check the client limits, if user is not the admin
if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin
// Get the limits of the client
$client_group_id = $_SESSION["s"]["user"]["default_group"];
@@ -142,7 +136,7 @@
if($this->id == 0 && $client["limit_mailbox"] >= 0) {
$tmp = $app->db->queryOneRecord("SELECT count(mailuser_id) as number FROM mail_user WHERE sys_groupid = $client_group_id");
if($tmp["number"] >= $client["limit_mailbox"]) {
- $app->tform->errorMessage .= $app->tform->wordbook["limit_mailbox_txt"]."<br>";
+ $app->tform->errorMessage .= $app->tform->lng("limit_mailbox_txt")."<br>";
}
unset($tmp);
}
@@ -154,7 +148,7 @@
$new_mailbox_quota = intval($this->dataRecord["quota"]);
if($mailquota + $new_mailbox_quota > $client["limit_mailquota"]) {
$max_free_quota = $client["limit_mailquota"] - $mailquota;
- $app->tform->errorMessage .= $app->tform->wordbook["limit_mailquota_txt"].": ".$max_free_quota."<br>";
+ $app->tform->errorMessage .= $app->tform->lng("limit_mailquota_txt").": ".$max_free_quota."<br>";
// Set the quota field to the max free space
$this->dataRecord["quota"] = $max_free_quota;
}
@@ -164,9 +158,9 @@
} // end if user is not admin
- // compose the email field
+ //* compose the email field
if(isset($_POST["email_local_part"]) && isset($_POST["email_domain"])) {
- $this->dataRecord["email"] = $_POST["email_local_part"]."@".$_POST["email_domain"];
+ $this->dataRecord["email"] = strtolower($_POST["email_local_part"]."@".$_POST["email_domain"]);
// Set the server id of the mailbox = server ID of mail domain.
$this->dataRecord["server_id"] = $domain["server_id"];
@@ -186,8 +180,13 @@
$this->dataRecord["homedir"] = $mail_config["homedir_path"];
$this->dataRecord["uid"] = $mail_config["mailuser_uid"];
$this->dataRecord["gid"] = $mail_config["mailuser_gid"];
+
+ //* Check if there is no alias or forward with this address
+ $tmp = $app->db->queryOneRecord("SELECT count(forwarding_id) as number FROM mail_forwarding WHERE source = '".$app->db->quote($this->dataRecord["email"])."'");
+ if($tmp['number'] > 0) $app->tform->errorMessage .= $app->tform->lng("duplicate_alias_or_forward_txt")."<br>";
+ unset($tmp);
+
}
-
parent::onSubmit();
}
@@ -203,23 +202,23 @@
// mail($this->dataRecord["email"],$app->tform->wordbook["welcome_mail_subject"],$app->tform->wordbook["welcome_mail_message"]);
// tries to detect current charset, and encode subject-header and body from it to ISO-8859-1.
- $fromCharset = mb_detect_encoding($app->tform->wordbook["welcome_mail_subject"]);
+ $fromCharset = mb_detect_encoding($app->tform->lng("welcome_mail_subject"));
$iconvPreferences = array("input-charset" => $fromCharset,
"output-charset" => "ISO-8859-1",
"line-length" => 76,
"line-break-chars" => "\n",
"scheme" => "Q");
- $welcomeFromName = $app->tform->wordbook["welcome_mail_fromname_txt"];
- $welcomeFromEmail = $app->tform->wordbook["welcome_mail_fromemail_txt"];
+ $welcomeFromName = $app->tform->lng("welcome_mail_fromname_txt");
+ $welcomeFromEmail = $app->tform->lng("welcome_mail_fromemail_txt");
$mailHeaders = "MIME-Version: 1.0" . "\n";
$mailHeaders .= "Content-type: text/plain; charset=iso-8859-1" . "\n";
$mailHeaders .= "From: $welcomeFromName <$welcomeFromEmail>" . "\n";
$mailHeaders .= "Reply-To: <$welcomeFromEmail>" . "\n";
$mailTarget = $this->dataRecord["email"];
- $mailSubject = iconv_mime_encode("trimoff", $app->tform->wordbook["welcome_mail_subject"], $iconvPreferences);
+ $mailSubject = iconv_mime_encode("trimoff", $app->tform->lng("welcome_mail_subject"), $iconvPreferences);
$mailSubject = str_replace("trimoff: ", "", $mailSubject);
- $mailBody = iconv ($fromCharset, "ISO-8859-1", $app->tform->wordbook["welcome_mail_message"]);
+ $mailBody = iconv ($fromCharset, "ISO-8859-1", $app->tform->lng("welcome_mail_message"));
mail($mailTarget, $mailSubject, $mailBody, $mailHeaders);
diff --git a/interface/web/mail/mail_user_filter_edit.php b/interface/web/mail/mail_user_filter_edit.php
index e21801e..89f4b4f 100644
--- a/interface/web/mail/mail_user_filter_edit.php
+++ b/interface/web/mail/mail_user_filter_edit.php
@@ -113,24 +113,35 @@
$content = '';
$content .= '### BEGIN FILTER_ID:'.$this->id."\n";
-
+
+ $TargetNoQuotes = $this->dataRecord["target"];
+ $TargetQuotes = "\"$TargetNoQuotes\"";
+
+ $TestChDirNoQuotes = '$DEFAULT/.'.$TargetNoQuotes;
+ $TestChDirQuotes = "\"$TestChDirNoQuotes\"";
+
+ $MailDirMakeNoQuotes = $TargetQuotes.' $DEFAULT';
+
+ $EchoTargetFinal = $TargetNoQuotes;
+
+
if($this->dataRecord["action"] == 'move') {
-
+
$content .= "
-`test -e ".'$DEFAULT/.'.$this->dataRecord["target"]."`
-if ( ".'$RETURNCODE'." != 0 )
+`test -e ".$TestChDirQuotes." && exit 1 || exit 0`
+if ( ".'$RETURNCODE'." != 1 )
{
- `maildirmake -f ".$this->dataRecord["target"].' $DEFAULT'."`
- `chmod -R 0700 ".'$DEFAULT/'.$this->dataRecord["target"]."`
- `echo INBOX.".$this->dataRecord["target"]." >> ".'$DEFAULT'."/courierimapsubscribed`
+ `maildirmake -f $MailDirMakeNoQuotes`
+ `chmod -R 0700 ".$TestChDirQuotes."`
+ `echo \"INBOX.$EchoTargetFinal\" >> ".'$DEFAULT'."/courierimapsubscribed`
}
-";
+";
}
-
+
$content .= "if (/^".$this->dataRecord["source"].":";
-
+
$searchterm = preg_quote($this->dataRecord["searchterm"]);
-
+
if($this->dataRecord["op"] == 'contains') {
$content .= ".*".$searchterm."/:h)\n";
} elseif ($this->dataRecord["op"] == 'is') {
@@ -140,18 +151,21 @@
} elseif ($this->dataRecord["op"] == 'ends') {
$content .= ".*".$searchterm."$/:h)\n";
}
-
+
$content .= "{\n";
$content .= "exception {\n";
-
+
if($this->dataRecord["action"] == 'move') {
- $content .= 'to $DEFAULT/.'.$this->dataRecord["target"]."/\n";
+ $content .= 'ID' . "$this->id" . 'EndFolder = "$DEFAULT/.' . $this->dataRecord['target'] . '/"' . "\n";
+ $content .= "to ". '$ID' . "$this->id" . 'EndFolder' . "\n";
} else {
$content .= "to /dev/null\n";
}
+
+ $content .= "}\n";
+ $content .= "}\n";
- $content .= "}\n";
- $content .= "}\n";
+ //}
$content .= '### END FILTER_ID:'.$this->id."\n";
diff --git a/interface/web/mail/mail_whitelist_edit.php b/interface/web/mail/mail_whitelist_edit.php
index c4fd8c2..a377729 100644
--- a/interface/web/mail/mail_whitelist_edit.php
+++ b/interface/web/mail/mail_whitelist_edit.php
@@ -55,17 +55,11 @@
// we will check only users, not admins
if($_SESSION["s"]["user"]["typ"] == 'user') {
-
- // Get the limits of the client
- $client_group_id = $_SESSION["s"]["user"]["default_group"];
- $client = $app->db->queryOneRecord("SELECT limit_mailfilter FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-
- // Check if the user may add another mailbox.
- if($client["limit_mailfilter"] >= 0) {
- $tmp = $app->db->queryOneRecord("SELECT count(access_id) as number FROM mail_access WHERE sys_groupid = $client_group_id");
- if($tmp["number"] >= $client["limit_mailfilter"]) {
- $app->error($app->tform->wordbook["limit_mailfilter_txt"]);
- }
+ if(!$app->tform->checkClientLimit('limit_mailfilter')) {
+ $app->error($app->tform->wordbook["limit_mailfilter_txt"]);
+ }
+ if(!$app->tform->checkResellerLimit('limit_mailfilter')) {
+ $app->error('Reseller: '.$app->tform->wordbook["limit_mailfilter_txt"]);
}
}
diff --git a/interface/web/mail/spamfilter_blacklist_edit.php b/interface/web/mail/spamfilter_blacklist_edit.php
index a75af75..b6c45dd 100644
--- a/interface/web/mail/spamfilter_blacklist_edit.php
+++ b/interface/web/mail/spamfilter_blacklist_edit.php
@@ -54,17 +54,11 @@
// we will check only users, not admins
if($_SESSION["s"]["user"]["typ"] == 'user') {
-
- // Get the limits of the client
- $client_group_id = $_SESSION["s"]["user"]["default_group"];
- $client = $app->db->queryOneRecord("SELECT limit_spamfilter_wblist FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-
- // Check if the user may add another mailbox.
- if($client["limit_spamfilter_wblist"] >= 0) {
- $tmp = $app->db->queryOneRecord("SELECT count(wblist_id) as number FROM spamfilter_wblist WHERE sys_groupid = $client_group_id");
- if($tmp["number"] >= $client["limit_spamfilter_wblist"]) {
- $app->error($app->tform->lng("limit_spamfilter_wblist_txt"));
- }
+ if(!$app->tform->checkClientLimit('limit_spamfilter_wblist')) {
+ $app->error($app->tform->wordbook["limit_spamfilter_wblist_txt"]);
+ }
+ if(!$app->tform->checkResellerLimit('limit_spamfilter_wblist')) {
+ $app->error('Reseller: '.$app->tform->wordbook["limit_spamfilter_wblist_txt"]);
}
}
diff --git a/interface/web/mail/spamfilter_policy_edit.php b/interface/web/mail/spamfilter_policy_edit.php
index 03b569b..abc28e9 100644
--- a/interface/web/mail/spamfilter_policy_edit.php
+++ b/interface/web/mail/spamfilter_policy_edit.php
@@ -54,17 +54,11 @@
// we will check only users, not admins
if($_SESSION["s"]["user"]["typ"] == 'user') {
-
- // Get the limits of the client
- $client_group_id = $_SESSION["s"]["user"]["default_group"];
- $client = $app->db->queryOneRecord("SELECT limit_spamfilter_policy FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-
- // Check if the user may add another mailbox.
- if($client["limit_limit_spamfilter_policy"] >= 0) {
- $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM spamfilter_policy WHERE sys_groupid = $client_group_id");
- if($tmp["number"] >= $client["limit_spamfilter_policy"]) {
- $app->error($app->tform->wordbook["limit_spamfilter_policy_txt"]);
- }
+ if(!$app->tform->checkClientLimit('limit_spamfilter_policy')) {
+ $app->error($app->tform->wordbook["limit_spamfilter_policy_txt"]);
+ }
+ if(!$app->tform->checkResellerLimit('limit_spamfilter_policy')) {
+ $app->error('Reseller: '.$app->tform->wordbook["limit_spamfilter_policy_txt"]);
}
}
diff --git a/interface/web/mail/spamfilter_users_edit.php b/interface/web/mail/spamfilter_users_edit.php
index f76f909..02cebbf 100644
--- a/interface/web/mail/spamfilter_users_edit.php
+++ b/interface/web/mail/spamfilter_users_edit.php
@@ -54,17 +54,11 @@
// we will check only users, not admins
if($_SESSION["s"]["user"]["typ"] == 'user') {
-
- // Get the limits of the client
- $client_group_id = $_SESSION["s"]["user"]["default_group"];
- $client = $app->db->queryOneRecord("SELECT limit_spamfilter_user FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-
- // Check if the user may add another mailbox.
- if($client["limit_limit_spamfilter_user"] >= 0) {
- $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM spamfilter_users WHERE sys_groupid = $client_group_id");
- if($tmp["number"] >= $client["limit_spamfilter_user"]) {
- $app->error($app->tform->wordbook["limit_spamfilter_user_txt"]);
- }
+ if(!$app->tform->checkClientLimit('limit_spamfilter_user')) {
+ $app->error($app->tform->wordbook["limit_spamfilter_user_txt"]);
+ }
+ if(!$app->tform->checkResellerLimit('limit_spamfilter_user')) {
+ $app->error('Reseller: '.$app->tform->wordbook["limit_spamfilter_user_txt"]);
}
}
diff --git a/interface/web/mail/spamfilter_whitelist_edit.php b/interface/web/mail/spamfilter_whitelist_edit.php
index b6762af..c4bba0e 100644
--- a/interface/web/mail/spamfilter_whitelist_edit.php
+++ b/interface/web/mail/spamfilter_whitelist_edit.php
@@ -54,17 +54,11 @@
// we will check only users, not admins
if($_SESSION["s"]["user"]["typ"] == 'user') {
-
- // Get the limits of the client
- $client_group_id = $_SESSION["s"]["user"]["default_group"];
- $client = $app->db->queryOneRecord("SELECT limit_spamfilter_wblist FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-
- // Check if the user may add another mailbox.
- if($client["limit_spamfilter_wblist"] >= 0) {
- $tmp = $app->db->queryOneRecord("SELECT count(wblist_id) as number FROM spamfilter_wblist WHERE sys_groupid = $client_group_id");
- if($tmp["number"] >= $client["limit_spamfilter_wblist"]) {
- $app->error($app->tform->lng("limit_spamfilter_wblist_txt"));
- }
+ if(!$app->tform->checkClientLimit('limit_spamfilter_wblist')) {
+ $app->error($app->tform->wordbook["limit_spamfilter_wblist_txt"]);
+ }
+ if(!$app->tform->checkResellerLimit('limit_spamfilter_wblist')) {
+ $app->error('Reseller: '.$app->tform->wordbook["limit_spamfilter_wblist_txt"]);
}
}
diff --git a/interface/web/monitor/lib/lang/br.lng b/interface/web/monitor/lib/lang/br.lng
new file mode 100644
index 0000000..e04c601
--- /dev/null
+++ b/interface/web/monitor/lib/lang/br.lng
@@ -0,0 +1,138 @@
+<?php
+$wb['Server online since'] = 'Servidor online desde';
+$wb['Users online'] = 'Usuários Online';
+$wb['System load 1 minute'] = 'Sistema carregado 1 Min';
+$wb['System load 5 minutes'] = 'Sistema carregado 5 Min';
+$wb['System load 15 minutes'] = 'Sistema carregado 15 Min';
+$wb['Server Load'] = 'Servidor carregado';
+$wb['Disk usage'] = 'Uso do disco';
+$wb['Memory usage'] = 'Uso da memória';
+$wb['no_data_serverload_txt'] = 'Sem registro carga do servidor disponíveis no momento. Tente novamente mais tarde.';
+$wb['no_data_memusage_txt'] = 'Sem registro uso de memória disponíveis no momento. Tente novamente mais tarde.';
+$wb['no_data_diskusage_txt'] = 'Sem registro de uso de disco disponíveis no momento. Tente novamente mais tarde.';
+$wb['no_data_cpuinfo_txt'] = 'Sem registro de CPU disponíveis no momento. Tente novamente mais tarde.';
+$wb['no_data_services_txt'] = 'Sem registro sobre os serviços disponíveis no momento. Tente novamente mais tarde.';
+$wb['no_data_updates_txt'] = 'Sem atualização de dados disponíveis no momento. Tente novamente mais tarde.';
+$wb['no_data_raid_txt'] = 'Sem registro de RAID disponível no momento. Tente novamente mais tarde.';
+$wb['no_data_rkhunter_txt'] = 'Sem registro de RKHUNTER disponível no momento. Tente novamente mais tarde.';
+$wb['no_data_mailq_txt'] = 'Sem registro de fila de correio disponível no momento. Tente novamente mais tarde.';
+$wb['no_logdata_txt'] = 'Sem registro de log disponível no momento. Tente novamente mais tarde.';
+$wb['Monitoring'] = 'Monitoramento';
+$wb['Server to Monitor'] = 'Servidor a monitorar';
+$wb['Logfiles'] = 'Arquivos de log';
+$wb['Status of services'] = 'Status dos serviços';
+$wb['No Refresh'] = 'Não atualize';
+$wb['minutes'] = 'minutos';
+$wb['Show Overview'] = 'Exibir Visão Geral';
+$wb['System State (All Servers)'] = 'Estado do Sistema (Todos os Servidores)';
+$wb['Hardware-Information'] = 'Informação de Hardware';
+$wb['Show CPU info'] = 'Exibir informações da UCP';
+$wb['Server State'] = 'Estado do Servidor';
+$wb['Show Update State'] = 'Exiba Status Atualizado';
+$wb['Show RAID state'] = 'Exiba Status do RAID';
+$wb['Show Server load'] = 'Exiba Carga do Servidor';
+$wb['Show Disk usage'] = 'Exiba Uso de Disco';
+$wb['Show Memory usage'] = 'Exiba Uso de Memória';
+$wb['Show Services'] = 'Exibir Serviços';
+$wb['Show Mail-Queue'] = 'Exibir Fila de Correio';
+$wb['Show Mail-Log'] = 'Exibir Log de Correio';
+$wb['Show Mail warn-Log'] = 'Exibir Log de Avisos de Correio';
+$wb['Show Mail err-Log'] = 'Exibir Log de Erros de Correio';
+$wb['Show System-Log'] = 'Exibir Log de Sistema';
+$wb['Show ISPC Cron-Log'] = 'Exibir ISPC Log do Cron';
+$wb['Show Freshclam-Log'] = 'Exibir Log do Freshclam';
+$wb['Show Clamav-Log'] = 'Exibir Log do Clamav';
+$wb['Show ISPConfig-Log'] = 'Exibir Log do ISPConfig';
+$wb['Show RKHunter-Log'] = 'Exibir Log do RKHunter';
+$wb['Show Jobqueue'] = 'Exibir Fila de Trabalho';
+$wb['monitor_general_serverstate_txt'] = 'Estado do Servidor';
+$wb['monitor_general_systemstate_txt'] = 'Estado do Sistema';
+$wb['monitor_diskusage_filesystem_txt'] = 'Sistema de Arquivos';
+$wb['monitor_diskusage_type_txt'] = 'Tipo';
+$wb['monitor_diskusage_size_txt'] = 'Tamanho';
+$wb['monitor_diskusage_used_txt'] = 'Usado';
+$wb['monitor_diskusage_available_txt'] = 'Disponível';
+$wb['monitor_diskusage_usage_txt'] = 'Uso %';
+$wb['monitor_diskusage_mounted_txt'] = 'Montado em';
+$wb['monitor_logs_mail_txt'] = 'Log de Correio';
+$wb['monitor_logs_mailwarn_txt'] = 'Log de Avisos';
+$wb['monitor_logs_mailerr_txt'] = 'Log de Erros';
+$wb['monitor_logs_messages_txt'] = 'Log de Sistema';
+$wb['monitor_logs_ispccron_txt'] = 'Log do ISPConfig Cron';
+$wb['monitor_logs_freshclam_txt'] = 'Logo do Freshclam';
+$wb['monitor_logs_clamav_txt'] = 'Log do Clamav ';
+$wb['monitor_logs_ispc_txt'] = 'Log do ISPConfig';
+$wb['monitor_nomdadm_txt'] = 'mdadm não está instalado ou seu servidor não suporta RAID';
+$wb['monitor_norkhunter_txt'] = 'RKHunter não está instalado, então não existem logs a exibir';
+$wb['monitor_serverstate_server_txt'] = 'Servidor';
+$wb['monitor_serverstate_state_txt'] = 'Estado';
+$wb['monitor_serverstate_unknown_txt'] = 'desconhecido';
+$wb['monitor_serverstate_info_txt'] = 'informações';
+$wb['monitor_serverstate_warning_txt'] = 'aviso';
+$wb['monitor_serverstate_critical_txt'] = 'crítico';
+$wb['monitor_serverstate_error_txt'] = 'erro';
+$wb['monitor_serverstate_moreinfo_txt'] = 'Mais informações..';
+$wb['monitor_serverstate_more_txt'] = 'Mais...';
+$wb['monitor_serverstate_fclamok_txt'] = 'Definições de anti-virus ok ...';
+$wb['monitor_serverstate_fclamoutdated_txt'] = 'Definições de anti-virus DESATUALIZADAS!';
+$wb['monitor_serverstate_fclamunknown_txt'] = 'Freshclam: ???!';
+$wb['monitor_serverstate_hdok_txt'] = 'Espaço em disco está ok';
+$wb['monitor_serverstate_hdgoingfull_txt'] = 'O espaço em disco está cheio';
+$wb['monitor_serverstate_hdnearlyfull_txt'] = 'Seu disco está ficando cheio';
+$wb['monitor_serverstate_hdveryfull_txt'] = 'Seu disco está muito cheio';
+$wb['monitor_serverstate_hdfull_txt'] = 'Seu disco não tem mais espaço';
+$wb['monitor_serverstate_hdunknown_txt'] = 'Disco Rígido: ???';
+$wb['monitor_serverstate_listok_txt'] = 'ok';
+$wb['monitor_serverstate_listinfo_txt'] = 'infomação';
+$wb['monitor_serverstate_listwarning_txt'] = 'aviso';
+$wb['monitor_serverstate_listcritical_txt'] = 'crítico';
+$wb['monitor_serverstate_listerror_txt'] = 'erro';
+$wb['monitor_serverstate_listunknown_txt'] = 'desconhecido';
+$wb['monitor_serverstate_loadok_txt'] = 'Servidor carregado ok';
+$wb['monitor_serverstate_loadheavy_txt'] = 'Seu servidor está com uma carga alta';
+$wb['monitor_serverstate_loadhigh_txt'] = 'Seu servidor está ficando com uma carga alta';
+$wb['monitor_serverstate_loaghigher_txt'] = 'Seu servidor está com uma carga muito alta';
+$wb['monitor_serverstate_loadhighest_txt'] = 'Seu servidor está com uma carga super alta';
+$wb['monitor_serverstate_loadunknown_txt'] = 'Carga do Servidor: ???';
+$wb['monitor_serverstate_mailqok_txt'] = 'Sua fila de correio está OK';
+$wb['monitor_serverstate_mailqheavy_txt'] = 'Sua fila de correio está ficando com uma carga alta';
+$wb['monitor_serverstate_mailqhigh_txt'] = 'Sua fila de correio está com uma carga alta';
+$wb['monitor_serverstate_mailqhigher_txt'] = 'Sua fila de correio está com uma carga muito alta';
+$wb['monitor_serverstate_mailqhighest_txt'] = 'Sua fila de correio está com uma carga super alta';
+$wb['monitor_serverstate_mailqunknown_txt'] = 'Fila de Correio: ???';
+$wb['monitor_serverstate_raidok_txt'] = 'Seu RAID está ok';
+$wb['monitor_serverstate_raidresync_txt'] = 'Seu RAID está em modo RESYNC';
+$wb['monitor_serverstate_raidfault_txt'] = 'Seu RAID possui um disco com falhas. Troque-o o mais rápido possível!';
+$wb['monitor_serverstate_raiderror_txt'] = 'Seu RAID não está mais funcionando.';
+$wb['monitor_serverstate_raidunknown_txt'] = 'Estado do RAID: ???';
+$wb['monitor_serverstate_servicesonline_txt'] = 'Todos os serviços necessários estão on-line';
+$wb['monitor_serverstate_servicesoffline_txt'] = 'Um ou mais serviços necessários estão off-line';
+$wb['monitor_serverstate_servicesunknown_txt'] = 'Serviços:???';
+$wb['monitor_serverstate_syslogok_txt'] = 'O System-Log está O.K.';
+$wb['monitor_serverstate_syslogwarning_txt'] = 'Existem alguns avisos em seu System-Log';
+$wb['monitor_serverstate_syslogerror_txt'] = 'Existem erros no seu System-Log';
+$wb['monitor_serverstate_syslogunknown_txt'] = 'sys-log:???';
+$wb['monitor_serverstate_updatesok_txt'] = 'Seu sistema está atualizado.';
+$wb['monitor_serverstate_updatesneeded_txt'] = 'Um ou mais componentes necessitam de atualização';
+$wb['monitor_serverstate_updatesunknown_txt'] = 'Atualização-Sistema:???';
+$wb['monitor_services_online_txt'] = 'Online';
+$wb['monitor_services_offline_txt'] = 'Offline';
+$wb['monitor_services_web_txt'] = 'Servidor Webr:';
+$wb['monitor_services_ftp_txt'] = 'Servidor FTP:';
+$wb['monitor_services_smtp_txt'] = 'Servidor SMTP:';
+$wb['monitor_services_pop_txt'] = 'Servidor POP:';
+$wb['monitor_services_imap_txt'] = 'Servidor IMAP:';
+$wb['monitor_services_mydns_txt'] = 'Servidor myDNS:';
+$wb['monitor_services_mysql_txt'] = 'Servidor MySql:';
+$wb['monitor_settings_datafromdate_txt'] = 'Data de: ';
+$wb['monitor_settings_datetimeformat_txt'] = 'd/m/Y H:i';
+$wb['monitor_settings_refreshsq_txt'] = 'Atualizar sequência:';
+$wb['monitor_settings_server_txt'] = 'Servidor';
+$wb['monitor_title_cpuinfo_txt'] = 'Informação da CPU';
+$wb['monitor_title_updatestate_txt'] = 'Atualizar Estado';
+$wb['monitor_title_mailq_txt'] = 'Fila de Correio';
+$wb['monitor_title_raidstate_txt'] = 'Estado do RAID';
+$wb['monitor_title_rkhunterlog_txt'] = 'Log do RKHunter';
+$wb['monitor_updates_nosupport_txt'] = 'Sua distribuição não suporta este tipo de monitoramento';
+?>
+
diff --git a/interface/web/monitor/lib/lang/br_syslog_list.lng b/interface/web/monitor/lib/lang/br_syslog_list.lng
new file mode 100644
index 0000000..f8ff04c
--- /dev/null
+++ b/interface/web/monitor/lib/lang/br_syslog_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['list_head_txt'] = 'Log do Painel';
+$wb['tstamp_txt'] = 'Data';
+$wb['server_id_txt'] = 'Servidor';
+$wb['loglevel_txt'] = 'Nível do Log';
+$wb['message_txt'] = 'Mensagem';
+?>
+
diff --git a/interface/web/sites/cron_del.php b/interface/web/sites/cron_del.php
new file mode 100644
index 0000000..516b447
--- /dev/null
+++ b/interface/web/sites/cron_del.php
@@ -0,0 +1,64 @@
+<?php
+
+/*
+Copyright (c) 2008, Till Brehm, projektfarm Gmbh
+Modified 2009, Marius Cramer, pixcept KG
+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
+******************************************/
+
+$list_def_file = "list/cron.list.php";
+$tform_def_file = "form/cron.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('sites');
+
+$app->uses('tpl,tform,tform_actions');
+$app->load('tform_actions');
+
+class page_action extends tform_actions {
+
+ function onBeforeDelete() {
+ global $app; $conf;
+
+ if($app->tform->checkPerm($this->id,'d') == false) $app->error($app->lng('error_no_delete_permission'));
+ }
+}
+
+$page = new page_action;
+$page->onDelete();
+
+?>
\ No newline at end of file
diff --git a/interface/web/sites/cron_edit.php b/interface/web/sites/cron_edit.php
new file mode 100644
index 0000000..a3244f0
--- /dev/null
+++ b/interface/web/sites/cron_edit.php
@@ -0,0 +1,220 @@
+<?php
+
+/*
+Copyright (c) 2007, Till Brehm, projektfarm Gmbh
+Modified 2009, Marius Cramer, pixcept KG
+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/cron.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('sites');
+
+// Loading classes
+$app->uses('tpl,tform,tform_actions,validate_cron');
+$app->load('tform_actions');
+
+class page_action extends tform_actions {
+
+ function onShowNew() {
+ global $app, $conf;
+
+ // we will check only users, not admins
+ if($_SESSION["s"]["user"]["typ"] == 'user') {
+ if(!$app->tform->checkClientLimit('limit_cron')) {
+ $app->error($app->tform->wordbook["limit_cron_txt"]);
+ }
+ if(!$app->tform->checkResellerLimit('limit_cron')) {
+ $app->error('Reseller: '.$app->tform->wordbook["limit_cron_txt"]);
+ }
+ }
+
+ parent::onShowNew();
+ }
+
+ function onShowEnd() {
+ global $app, $conf;
+
+ if($this->id > 0) {
+ //* we are editing a existing record
+ $app->tpl->setVar("edit_disabled", 1);
+ $app->tpl->setVar("parent_domain_id_value", $this->dataRecord["parent_domain_id"]);
+ } else {
+ $app->tpl->setVar("edit_disabled", 0);
+ }
+
+ parent::onShowEnd();
+ }
+
+ function onSubmit() {
+ global $app, $conf;
+
+ 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_cron, limit_cron_type 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) {
+ // When the record is inserted
+ } else {
+ // Check if the user may add another cron job.
+ if($client["limit_cron"] >= 0) {
+ $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM cron WHERE sys_groupid = $client_group_id");
+ if($tmp["number"] >= $client["limit_cron"]) {
+ $app->error($app->tform->wordbook["limit_cron_txt"]);
+ }
+ }
+ }
+ }
+
+ // Get the record of the parent domain
+ $parent_domain = $app->db->queryOneRecord("select * FROM web_domain WHERE domain_id = ".intval(@$this->dataRecord["parent_domain_id"]));
+
+ // Set fixed values
+ $this->dataRecord["server_id"] = $parent_domain["server_id"];
+
+ //* get type of command
+ $command = $this->dataRecord["command"];
+ if(preg_match("'^http(s)?:\/\/'i", $command)) {
+ $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 = ".intval($parent_domain["sys_groupid"]));
+ if($domain_owner["limit_cron_type"] == 'full') $this->dataRecord["type"] = 'full';
+ else $this->dataRecord["type"] = 'chrooted';
+ }
+
+ parent::onSubmit();
+ }
+
+ function onUpdateSave($sql) {
+ global $app;
+
+ $has_error = false;
+ //* last chance to stop this, so check frequency limit!
+ 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_cron_frequency FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
+
+ if($client["limit_cron_frequency"] > 1) {
+ if($app->tform->cron_min_freq < $client["limit_cron_frequency"]) {
+ $app->error($app->tform->wordbook["limit_cron_frequency_txt"]);
+ $has_error = true;
+ }
+ }
+ }
+
+ if($has_error == true) {
+ parent::onError();
+ exit;
+ }
+ else parent::onUpdateSave($sql);
+ }
+
+ function onInsertSave($sql) {
+ global $app;
+
+ $has_error = false;
+ //* last chance to stop this, so check frequency limit!
+ 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_cron_frequency FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
+
+ if($client["limit_cron_frequency"] > 1) {
+ if($app->tform->cron_min_freq < $client["limit_cron_frequency"]) {
+ $app->error($app->tform->wordbook["limit_cron_frequency_txt"]);
+ $has_error = true;
+ }
+ }
+ }
+
+ if($has_error == true) {
+ parent::onError();
+ exit;
+ }
+ else parent::onInsertSave($sql);
+ }
+
+ function onAfterInsert() {
+ global $app, $conf;
+
+ $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($this->dataRecord["parent_domain_id"]));
+ $server_id = $web["server_id"];
+
+ // The cron shall be owned by the same group then the website
+ $sys_groupid = $web['sys_groupid'];
+
+ $sql = "UPDATE shell_user SET server_id = $server_id, sys_groupid = '$sys_groupid' WHERE id = ".$this->id;
+ $app->db->query($sql);
+ }
+
+ function onAfterUpdate() {
+ global $app, $conf;
+
+
+ }
+
+ function getClientName() {
+ global $app, $conf;
+
+ if($_SESSION["s"]["user"]["typ"] != 'admin') {
+ // Get the group-id of the user
+ $client_group_id = $_SESSION["s"]["user"]["default_group"];
+ } else {
+ // Get the group-id from the data itself
+ $web = $app->db->queryOneRecord("SELECT sys_groupid FROM web_domain WHERE domain_id = ".intval($this->dataRecord['parent_domain_id']));
+ $client_group_id = $web['sys_groupid'];
+ }
+ /* get the name of the client */
+ $tmp = $app->db->queryOneRecord("SELECT name FROM sys_group WHERE groupid = " . $client_group_id);
+ $clientName = $tmp['name'];
+ if ($clientName == "") $clientName = 'default';
+ $clientName = convertClientName($clientName);
+
+ return $clientName;
+
+ }
+
+}
+
+$page = new page_action;
+$page->onLoad();
+
+?>
\ No newline at end of file
diff --git a/interface/web/sites/cron_list.php b/interface/web/sites/cron_list.php
new file mode 100644
index 0000000..68e2316
--- /dev/null
+++ b/interface/web/sites/cron_list.php
@@ -0,0 +1,23 @@
+<?php
+require_once('../../lib/config.inc.php');
+require_once('../../lib/app.inc.php');
+
+/******************************************
+* Begin Form configuration
+******************************************/
+
+$list_def_file = "list/cron.list.php";
+
+/******************************************
+* End Form configuration
+******************************************/
+
+//* Check permissions for module
+$app->auth->check_module_permissions('sites');
+
+$app->uses('listform_actions');
+
+$app->listform_actions->onLoad();
+
+
+?>
\ No newline at end of file
diff --git a/interface/web/sites/database_edit.php b/interface/web/sites/database_edit.php
index 9e1430b..088e37a 100644
--- a/interface/web/sites/database_edit.php
+++ b/interface/web/sites/database_edit.php
@@ -56,17 +56,11 @@
// we will check only users, not admins
if($_SESSION["s"]["user"]["typ"] == 'user') {
-
- // Get the limits of the client
- $client_group_id = $_SESSION["s"]["user"]["default_group"];
- $client = $app->db->queryOneRecord("SELECT limit_database FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-
- // Check if the user may add another database.
- if($client["limit_database"] >= 0) {
- $tmp = $app->db->queryOneRecord("SELECT count(database_id) as number FROM web_database WHERE sys_groupid = $client_group_id");
- if($tmp["number"] >= $client["limit_database"]) {
- $app->error($app->tform->wordbook["limit_database_txt"]);
- }
+ if(!$app->tform->checkClientLimit('limit_database')) {
+ $app->error($app->tform->wordbook["limit_database_txt"]);
+ }
+ if(!$app->tform->checkResellerLimit('limit_database')) {
+ $app->error('Reseller: '.$app->tform->wordbook["limit_database_txt"]);
}
}
diff --git a/interface/web/sites/form/cron.tform.php b/interface/web/sites/form/cron.tform.php
new file mode 100644
index 0000000..4f9f8dd
--- /dev/null
+++ b/interface/web/sites/form/cron.tform.php
@@ -0,0 +1,189 @@
+<?php
+
+/*
+ Form Definition
+
+ Tabledefinition
+
+ Datatypes:
+ - INTEGER (Forces the input to Int)
+ - DOUBLE
+ - CURRENCY (Formats the values to currency notation)
+ - VARCHAR (no format check, maxlength: 255)
+ - TEXT (no format check)
+ - DATE (Dateformat, automatic conversion to timestamps)
+
+ Formtype:
+ - TEXT (Textfield)
+ - TEXTAREA (Textarea)
+ - PASSWORD (Password textfield, input is not shown when edited)
+ - SELECT (Select option field)
+ - RADIO
+ - CHECKBOX
+ - CHECKBOXARRAY
+ - FILE
+
+ VALUE:
+ - Wert oder Array
+
+ Hint:
+ The ID field of the database table is not part of the datafield definition.
+ The ID field must be always auto incement (int or bigint).
+
+
+*/
+
+$form["title"] = "Cron Job";
+$form["description"] = "";
+$form["name"] = "cron";
+$form["action"] = "cron_edit.php";
+$form["db_table"] = "cron";
+$form["db_table_idx"] = "id";
+$form["db_history"] = "yes";
+$form["tab_default"] = "cron";
+$form["list_default"] = "cron_list.php";
+$form["auth"] = 'yes'; // yes / no
+
+$form["auth_preset"]["userid"] = 0; // 0 = id of the user, > 0 id must match with id of current user
+$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user
+$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete
+$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete
+$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete
+
+$form["tabs"]['cron'] = array (
+ 'title' => "Cron Job",
+ 'width' => 100,
+ 'template' => "templates/cron_edit.htm",
+ 'fields' => array (
+ ##################################
+ # Begin Datatable fields
+ ##################################
+ 'server_id' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'SELECT',
+ 'datasource' => array ( 'type' => 'SQL',
+ 'querystring' => 'SELECT server_id,server_name FROM server WHERE web_server = 1 AND {AUTHSQL} ORDER BY server_name',
+ 'keyfield'=> 'server_id',
+ 'valuefield'=> 'server_name'
+ ),
+ 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY',
+ 'errmsg'=> 'server_id_error_empty'),
+ ),
+ 'default' => '',
+ 'value' => '',
+ 'width' => '30',
+ 'maxlength' => '255'
+ ),
+ 'parent_domain_id' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'SELECT',
+ 'default' => '',
+ 'datasource' => array ( 'type' => 'SQL',
+ 'querystring' => "SELECT domain_id,domain FROM web_domain WHERE type = 'vhost' AND {AUTHSQL} ORDER BY domain",
+ 'keyfield'=> 'domain_id',
+ 'valuefield'=> 'domain'
+ ),
+ 'value' => ''
+ ),
+ 'run_min' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'CUSTOM',
+ 'class' => 'validate_cron',
+ 'function' => 'run_time_format',
+ 'errmsg'=> 'run_min_error_format'),
+ ),
+ 'default' => '',
+ 'value' => '',
+ 'width' => '30',
+ 'maxlength' => '255'
+ ),
+ 'run_hour' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'CUSTOM',
+ 'class' => 'validate_cron',
+ 'function' => 'run_time_format',
+ 'errmsg'=> 'run_hour_error_format'),
+ ),
+ 'default' => '',
+ 'value' => '',
+ 'width' => '30',
+ 'maxlength' => '255'
+ ),
+ 'run_mday' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'CUSTOM',
+ 'class' => 'validate_cron',
+ 'function' => 'run_time_format',
+ 'errmsg'=> 'run_mday_error_format'),
+ ),
+ 'default' => '',
+ 'value' => '',
+ 'width' => '30',
+ 'maxlength' => '255'
+ ),
+ 'run_month' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'CUSTOM',
+ 'class' => 'validate_cron',
+ 'function' => 'run_time_format',
+ 'errmsg'=> 'run_month_error_format'),
+ ),
+ 'default' => '',
+ 'value' => '',
+ 'width' => '30',
+ 'maxlength' => '255'
+ ),
+ 'run_wday' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'CUSTOM',
+ 'class' => 'validate_cron',
+ 'function' => 'run_time_format',
+ 'errmsg'=> 'run_wday_error_format'),
+ ),
+ 'default' => '',
+ 'value' => '',
+ 'width' => '30',
+ 'maxlength' => '255'
+ ),
+ 'command' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY',
+ 'errmsg'=> 'command_error_empty'),
+ 1 => array ( 'type' => 'CUSTOM',
+ 'class' => 'validate_cron',
+ 'function' => 'command_format',
+ 'errmsg'=> 'command_error_format'),
+ ),
+ 'default' => '',
+ 'value' => '',
+ 'width' => '30',
+ 'maxlength' => '255'
+ ),
+ 'type' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'SELECT',
+ 'default' => 'url',
+ 'valuelimit' => 'list:url,full,chrooted',
+ 'value' => array('url' => 'Url', 'full' => 'Full', 'chrooted' => 'Chrooted')
+ ),
+ 'active' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'CHECKBOX',
+ 'default' => 'y',
+ 'value' => array(0 => 'n',1 => 'y')
+ ),
+ ##################################
+ # ENDE Datatable fields
+ ##################################
+ )
+);
+
+
+
+?>
\ No newline at end of file
diff --git a/interface/web/sites/form/database.tform.php b/interface/web/sites/form/database.tform.php
index 7ea10ee..3a7a947 100644
--- a/interface/web/sites/form/database.tform.php
+++ b/interface/web/sites/form/database.tform.php
@@ -133,6 +133,18 @@
'default' => 'y',
'value' => array(0 => 'n',1 => 'y')
),
+ 'remote_ips' => array (
+ 'datatype' => 'TEXT',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'CUSTOM',
+ 'class' => 'validate_database',
+ 'function' => 'valid_ip_list',
+ 'errmsg' => 'database_remote_error_ips'),
+ ),
+ 'default' => '',
+ 'value' => '',
+ 'width' => '60'
+ ),
##################################
# ENDE Datatable fields
##################################
diff --git a/interface/web/sites/form/ftp_user.tform.php b/interface/web/sites/form/ftp_user.tform.php
index 4950a1b..add5c72 100644
--- a/interface/web/sites/form/ftp_user.tform.php
+++ b/interface/web/sites/form/ftp_user.tform.php
@@ -83,12 +83,10 @@
'username' => array (
'datatype' => 'VARCHAR',
'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY',
- 'errmsg'=> 'username_error_empty'),
- 1 => array ( 'type' => 'UNIQUE',
+ 'validators' => array ( 0 => array ( 'type' => 'UNIQUE',
'errmsg'=> 'username_error_unique'),
- 2 => array ( 'type' => 'REGEX',
- 'regex' => '/^[\w\.\-]{1,64}$/',
+ 1 => array ( 'type' => 'REGEX',
+ 'regex' => '/^[\w\.\-]{0,64}$/',
'errmsg'=> 'username_error_regex'),
),
'default' => '',
@@ -131,93 +129,125 @@
if($_SESSION["s"]["user"]["typ"] == 'admin') {
$form["tabs"]['advanced'] = array (
- 'title' => "Options",
- 'width' => 100,
- 'template' => "templates/ftp_user_advanced.htm",
- 'fields' => array (
- ##################################
- # Begin Datatable fields
- ##################################
- 'uid' => array (
- 'datatype' => 'VARCHAR',
- 'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY',
- 'errmsg'=> 'uid_error_empty'),
- ),
- 'default' => '0',
- 'value' => '',
- 'width' => '30',
- 'maxlength' => '255'
- ),
- 'gid' => array (
- 'datatype' => 'VARCHAR',
- 'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY',
- 'errmsg'=> 'uid_error_empty'),
- ),
- 'default' => '0',
- 'value' => '',
- 'width' => '30',
- 'maxlength' => '255'
- ),
- 'dir' => array (
- 'datatype' => 'VARCHAR',
- 'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY',
- 'errmsg'=> 'directory_error_empty'),
- ),
- 'default' => '',
- 'value' => '',
- 'width' => '30',
- 'maxlength' => '255'
- ),
- 'quota_files' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'TEXT',
- 'default' => '0',
- 'value' => '',
- 'width' => '7',
- 'maxlength' => '7'
- ),
- 'ul_ratio' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'TEXT',
- 'default' => '0',
- 'value' => '',
- 'width' => '7',
- 'maxlength' => '7'
- ),
- 'dl_ratio' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'TEXT',
- 'default' => '0',
- 'value' => '',
- 'width' => '7',
- 'maxlength' => '7'
- ),
- 'ul_bandwidth' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'TEXT',
- 'default' => '0',
- 'value' => '',
- 'width' => '7',
- 'maxlength' => '7'
- ),
- 'dl_bandwidth' => array (
- 'datatype' => 'INTEGER',
- 'formtype' => 'TEXT',
- 'default' => '0',
- 'value' => '',
- 'width' => '7',
- 'maxlength' => '7'
- ),
- ##################################
- # ENDE Datatable fields
- ##################################
- )
+ 'title' => "Options",
+ 'width' => 100,
+ 'template' => "templates/ftp_user_advanced.htm",
+ 'fields' => array (
+ ##################################
+ # Begin Datatable fields
+ ##################################
+ 'uid' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY',
+ 'errmsg'=> 'uid_error_empty'),
+ ),
+ 'default' => '0',
+ 'value' => '',
+ 'width' => '30',
+ 'maxlength' => '255'
+ ),
+ 'gid' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY',
+ 'errmsg'=> 'uid_error_empty'),
+ ),
+ 'default' => '0',
+ 'value' => '',
+ 'width' => '30',
+ 'maxlength' => '255'
+ ),
+ 'dir' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY',
+ 'errmsg'=> 'directory_error_empty'),
+ ),
+ 'default' => '',
+ 'value' => '',
+ 'width' => '30',
+ 'maxlength' => '255'
+ ),
+ 'quota_files' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'default' => '0',
+ 'value' => '',
+ 'width' => '7',
+ 'maxlength' => '7'
+ ),
+ 'ul_ratio' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'default' => '0',
+ 'value' => '',
+ 'width' => '7',
+ 'maxlength' => '7'
+ ),
+ 'dl_ratio' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'default' => '0',
+ 'value' => '',
+ 'width' => '7',
+ 'maxlength' => '7'
+ ),
+ 'ul_bandwidth' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'default' => '0',
+ 'value' => '',
+ 'width' => '7',
+ 'maxlength' => '7'
+ ),
+ 'dl_bandwidth' => array (
+ 'datatype' => 'INTEGER',
+ 'formtype' => 'TEXT',
+ 'default' => '0',
+ 'value' => '',
+ 'width' => '7',
+ 'maxlength' => '7'
+ ),
+ ##################################
+ # ENDE Datatable fields
+ ##################################
+ )
+);
+
+} else {
+
+$form["tabs"]['advanced'] = array (
+ 'title' => "Options",
+ 'width' => 100,
+ 'template' => "templates/ftp_user_advanced_client.htm",
+ 'fields' => array (
+ ##################################
+ # Begin Datatable fields
+ ##################################
+ 'dir' => array (
+ 'datatype' => 'VARCHAR',
+ 'formtype' => 'TEXT',
+ 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY',
+ 'errmsg'=> 'directory_error_empty'),
+ 1 => array ( 'type' => 'CUSTOM',
+ 'class' => 'validate_ftpuser',
+ 'function' => 'ftp_dir',
+ 'errmsg' => 'directory_error_notinweb'),
+ ),
+ 'default' => '',
+ 'value' => '',
+ 'width' => '30',
+ 'maxlength' => '255'
+ ),
+ ##################################
+ # ENDE Datatable fields
+ ##################################
+ )
);
}
+
?>
\ No newline at end of file
diff --git a/interface/web/sites/form/shell_user.tform.php b/interface/web/sites/form/shell_user.tform.php
index 03b4311..0f692e3 100644
--- a/interface/web/sites/form/shell_user.tform.php
+++ b/interface/web/sites/form/shell_user.tform.php
@@ -83,12 +83,10 @@
'username' => array (
'datatype' => 'VARCHAR',
'formtype' => 'TEXT',
- 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY',
- 'errmsg'=> 'username_error_empty'),
- 1 => array ( 'type' => 'UNIQUE',
+ 'validators' => array ( 0 => array ( 'type' => 'UNIQUE',
'errmsg'=> 'username_error_unique'),
- 2 => array ( 'type' => 'REGEX',
- 'regex' => '/^[\w\.\-]{1,64}$/',
+ 1 => array ( 'type' => 'REGEX',
+ 'regex' => '/^[\w\.\-]{0,64}$/',
'errmsg'=> 'username_error_regex'),
),
'default' => '',
diff --git a/interface/web/sites/ftp_user_edit.php b/interface/web/sites/ftp_user_edit.php
index ec35fd3..511ac90 100644
--- a/interface/web/sites/ftp_user_edit.php
+++ b/interface/web/sites/ftp_user_edit.php
@@ -56,17 +56,11 @@
// we will check only users, not admins
if($_SESSION["s"]["user"]["typ"] == 'user') {
-
- // Get the limits of the client
- $client_group_id = $_SESSION["s"]["user"]["default_group"];
- $client = $app->db->queryOneRecord("SELECT limit_ftp_user FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-
- // Check if the user may add another ftp user.
- if($client["limit_ftp_user"] >= 0) {
- $tmp = $app->db->queryOneRecord("SELECT count(ftp_user_id) as number FROM ftp_user WHERE sys_groupid = $client_group_id");
- if($tmp["number"] >= $client["limit_ftp_user"]) {
- $app->error($app->tform->wordbook["limit_ftp_user_txt"]);
- }
+ if(!$app->tform->checkClientLimit('limit_ftp_user')) {
+ $app->error($app->tform->wordbook["limit_ftp_user_txt"]);
+ }
+ if(!$app->tform->checkResellerLimit('limit_ftp_user')) {
+ $app->error('Reseller: '.$app->tform->wordbook["limit_ftp_user_txt"]);
}
}
@@ -107,6 +101,11 @@
// Set a few fixed values
$this->dataRecord["server_id"] = $parent_domain["server_id"];
+
+ //die(print_r($this->dataRecord));
+
+ if(isset($this->dataRecord['username']) && trim($this->dataRecord['username']) == '') $app->tform->errorMessage .= $app->tform->lng('username_error_empty').'<br />';
+ if(isset($this->dataRecord['username']) && empty($this->dataRecord['parent_domain_id'])) $app->tform->errorMessage .= $app->tform->lng('parent_domain_id_error_empty').'<br />';
parent::onSubmit();
}
@@ -165,6 +164,20 @@
function onAfterUpdate() {
global $app, $conf;
+ //* When the site of the FTP user has been changed
+ if($this->oldDataRecord['parent_domain_id'] != $this->dataRecord['parent_domain_id']) {
+ $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($this->dataRecord["parent_domain_id"]));
+ $server_id = $web["server_id"];
+ $dir = $web["document_root"];
+ $uid = $web["system_user"];
+ $gid = $web["system_group"];
+
+ // The FTP user shall be owned by the same group then the website
+ $sys_groupid = $web['sys_groupid'];
+
+ $sql = "UPDATE ftp_user SET server_id = $server_id, dir = '$dir', uid = '$uid', gid = '$gid', sys_groupid = '$sys_groupid' WHERE ftp_user_id = ".$this->id;
+ $app->db->query($sql);
+ }
}
diff --git a/interface/web/sites/lib/lang/bg_cron.lng b/interface/web/sites/lib/lang/bg_cron.lng
new file mode 100644
index 0000000..fecb4ab
--- /dev/null
+++ b/interface/web/sites/lib/lang/bg_cron.lng
@@ -0,0 +1,21 @@
+<?php
+$wb['server_id_txt'] = 'Server';
+$wb['parent_domain_id_txt'] = 'Parent website';
+$wb['active_txt'] = 'Active';
+$wb['client_txt'] = 'Client';
+$wb['run_min_txt'] = 'Minutes';
+$wb['run_hour_txt'] = 'Hours';
+$wb['run_mday_txt'] = 'Days of month';
+$wb['run_month_txt'] = 'Months';
+$wb['run_wday_txt'] = 'Days of week';
+$wb['command_txt'] = 'Command to run (commands are executed via sh, urls via wget)';
+$wb['limit_cron_txt'] = 'The maximum number of allowed cron jobs was reached.';
+$wb['limit_cron_frequency_txt'] = 'The cron job frequency exceeds the allowed limit.';
+$wb['run_min_error_format'] = 'Invalid format for minutes.';
+$wb['run_hour_error_format'] = 'Invalid format for hours.';
+$wb['run_mday_error_format'] = 'Invalid format for days of month.';
+$wb['run_month_error_format'] = 'Invalid format for months.';
+$wb['run_wday_error_format'] = 'Invalid format for days of the week.';
+$wb['command_error_format'] = 'Invalid command format. Please note that in case of an url call only http/https is allowed.';
+$wb['unknown_fieldtype_error'] = 'An unknown field type has been used.';
+?>
diff --git a/interface/web/sites/lib/lang/bg_cron_list.lng b/interface/web/sites/lib/lang/bg_cron_list.lng
new file mode 100644
index 0000000..ad56ea9
--- /dev/null
+++ b/interface/web/sites/lib/lang/bg_cron_list.lng
@@ -0,0 +1,12 @@
+<?php
+$wb['list_head_txt'] = 'Cron Jobs';
+$wb['active_txt'] = 'Active';
+$wb['server_id_txt'] = 'Server';
+$wb['run_min_txt'] = 'Minute';
+$wb['run_hour_txt'] = 'Hour';
+$wb['run_mday_txt'] = 'Day of month';
+$wb['run_month_txt'] = 'Month';
+$wb['run_wday_txt'] = 'Day of week';
+$wb['command_txt'] = 'Command';
+$wb['add_new_cron_txt'] = 'Add new Cron job';
+?>
diff --git a/interface/web/sites/lib/lang/bg_database.lng b/interface/web/sites/lib/lang/bg_database.lng
index ebc936a..97807e7 100644
--- a/interface/web/sites/lib/lang/bg_database.lng
+++ b/interface/web/sites/lib/lang/bg_database.lng
@@ -18,4 +18,6 @@
$wb['limit_database_txt'] = 'Достигнат е максималният разрешен брой бази данни.';
$wb['database_name_change_txt'] = 'Името на базата данни не може да бъде променено.';
$wb['database_charset_change_txt'] = 'Charset на базата данни не може да бъде променен.';
+$wb['remote_ips_txt'] = 'Remote Access IPs (separate by , and leave blank for <i>any</i>)';
+$wb['database_remote_error_ips'] = 'At least one of the entered ip addresses is invalid.';
?>
diff --git a/interface/web/sites/lib/lang/bg_ftp_user.lng b/interface/web/sites/lib/lang/bg_ftp_user.lng
index 55dce49..1b7d4aa 100644
--- a/interface/web/sites/lib/lang/bg_ftp_user.lng
+++ b/interface/web/sites/lib/lang/bg_ftp_user.lng
@@ -22,4 +22,5 @@
$wb['uid_error_empty'] = 'Не е посочено GID.';
$wb['directory_error_empty'] = 'Не е посочена директория.';
$wb['quota_files_unity_txt'] = 'Files';
+$wb['directory_error_notinweb'] = 'Directory not inside of web root directory.';
?>
diff --git a/interface/web/sites/lib/lang/bg_web_sites_stats_list.lng b/interface/web/sites/lib/lang/bg_web_sites_stats_list.lng
new file mode 100644
index 0000000..b217f80
--- /dev/null
+++ b/interface/web/sites/lib/lang/bg_web_sites_stats_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['list_head_txt'] = 'Web traffic';
+$wb['domain_txt'] = 'Domain';
+$wb['this_month_txt'] = 'This month';
+$wb['last_month_txt'] = 'Last month';
+$wb['this_year_txt'] = 'This year';
+$wb['last_year_txt'] = 'Last year';
+?>
diff --git a/interface/web/sites/lib/lang/br.lng b/interface/web/sites/lib/lang/br.lng
new file mode 100644
index 0000000..44b172a
--- /dev/null
+++ b/interface/web/sites/lib/lang/br.lng
@@ -0,0 +1,17 @@
+<?php
+$wb['Database'] = 'Banco de Dados';
+$wb['Options'] = 'Opções';
+$wb['Shell User'] = 'Usuário de Shell';
+$wb['Domain'] = 'Website';
+$wb['Redirect'] = 'Redirecionamento';
+$wb['SSL'] = 'SSL';
+$wb['Subdomain'] = 'Sub-domínio';
+$wb['Sites'] = 'Sites';
+$wb['Aliasdomain'] = 'Alias de Domínio';
+$wb['FTP-User'] = 'Usuário-FTP';
+$wb['FTP'] = 'FTP';
+$wb['Shell-User'] = 'Usuário-Shell';
+$wb['Shell'] = 'Shell';
+$wb['Websites'] = 'Websites';
+$wb["Stats"] = 'Estatísticas';
+?>
diff --git a/interface/web/sites/lib/lang/br_cron.lng b/interface/web/sites/lib/lang/br_cron.lng
new file mode 100644
index 0000000..8cb7f08
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_cron.lng
@@ -0,0 +1,21 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb['parent_domain_id_txt'] = 'Parent website';
+$wb['active_txt'] = 'Active';
+$wb['client_txt'] = 'Client';
+$wb['run_min_txt'] = 'Minutes';
+$wb['run_hour_txt'] = 'Hours';
+$wb['run_mday_txt'] = 'Days of month';
+$wb['run_month_txt'] = 'Months';
+$wb['run_wday_txt'] = 'Days of week';
+$wb['command_txt'] = 'Command to run (commands are executed via sh, urls via wget)';
+$wb['limit_cron_txt'] = 'The maximum number of allowed cron jobs was reached.';
+$wb['limit_cron_frequency_txt'] = 'The cron job frequency exceeds the allowed limit.';
+$wb['run_min_error_format'] = 'Invalid format for minutes.';
+$wb['run_hour_error_format'] = 'Invalid format for hours.';
+$wb['run_mday_error_format'] = 'Invalid format for days of month.';
+$wb['run_month_error_format'] = 'Invalid format for months.';
+$wb['run_wday_error_format'] = 'Invalid format for days of the week.';
+$wb['command_error_format'] = 'Invalid command format. Please note that in case of an url call only http/https is allowed.';
+$wb['unknown_fieldtype_error'] = 'An unknown field type has been used.';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/br_cron_list.lng b/interface/web/sites/lib/lang/br_cron_list.lng
new file mode 100644
index 0000000..b5c8d15
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_cron_list.lng
@@ -0,0 +1,12 @@
+<?php
+$wb["list_head_txt"] = 'Cron Jobs';
+$wb["active_txt"] = 'Active';
+$wb["server_id_txt"] = 'Server';
+$wb["run_min_txt"] = 'Minute';
+$wb["run_hour_txt"] = 'Hour';
+$wb["run_mday_txt"] = 'Day of month';
+$wb["run_month_txt"] = 'Month';
+$wb["run_wday_txt"] = 'Day of week';
+$wb["command_txt"] = 'Command';
+$wb["add_new_cron_txt"] = 'Add new Cron job';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/br_database.lng b/interface/web/sites/lib/lang/br_database.lng
new file mode 100644
index 0000000..3530656
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_database.lng
@@ -0,0 +1,22 @@
+<?php
+$wb["server_id_txt"] = 'Servidor';
+$wb["type_txt"] = 'Tipo';
+$wb["database_name_txt"] = 'Nome do Banco de Dados';
+$wb["database_user_txt"] = 'Usuário do Banco de Dados';
+$wb["database_password_txt"] = 'Senha do Banco de Dados';
+$wb["password_strength_txt"] = 'Segurança da Senha';
+$wb["database_charset_txt"] = 'Charset do Banco de Dados';
+$wb["remote_access_txt"] = 'Acesso Remoto';
+$wb["client_txt"] = 'Cliente';
+$wb["active_txt"] = 'Ativo';
+$wb["database_name_error_empty"] = 'O nome do banco está em branco.';
+$wb["database_name_error_unique"] = 'Já existe um banco de dados com este nome no servidor. O nome escolhido deve ser único.';
+$wb["database_name_error_regex"] = 'Nome do banco inválido. O nome do banco só pode conter estes caracteres: a-z, A-Z, 0-9 e o underscore. Tamanho: 2 - 64 caracteres.';
+$wb["database_user_error_empty"] = 'O nome do usuário está em branco.';
+$wb["database_user_error_unique"] = 'Já existe um banco de dados com este nome no servidor. O nome escolhido deve ser único.';
+$wb["database_user_error_regex"] = 'Nome do banco inválido. O nome do banco só pode conter estes caracteres: a-z, A-Z, 0-9 e o underscore. Tamanho: 2 - 64 caracteres.';
+$wb["limit_database_txt"] = 'O limite máximo de bancos de dados foi atingido.';
+$wb["database_name_change_txt"] = 'O nome do banco não pode ser modificado';
+$wb["database_charset_change_txt"] = 'O charset do banco não pode ser mudado';
+?>
+
diff --git a/interface/web/sites/lib/lang/br_database_list.lng b/interface/web/sites/lib/lang/br_database_list.lng
new file mode 100644
index 0000000..133f502
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_database_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["list_head_txt"] = 'Banco de Dados';
+$wb["active_txt"] = 'Ativo';
+$wb["remote_access_txt"] = 'Acesso Remoto';
+$wb["server_id_txt"] = 'Servidor';
+$wb["database_name_txt"] = 'Nome do banco';
+$wb["add_new_record_txt"] = 'Adcionar um novo banco';
+?>
diff --git a/interface/web/sites/lib/lang/br_ftp_user.lng b/interface/web/sites/lib/lang/br_ftp_user.lng
new file mode 100644
index 0000000..fb30f46
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_ftp_user.lng
@@ -0,0 +1,27 @@
+<?php
+$wb["uid_txt"] = 'UID';
+$wb["gid_txt"] = 'GID';
+$wb["dir_txt"] = 'Diretório';
+$wb["quota_files_txt"] = 'Quota de Arquivo';
+$wb["quota_files_unity_txt"] = 'Arquivos';
+$wb["ul_ratio_txt"] = 'Taxa de Upload';
+$wb["dl_ratio_txt"] = 'Taxa de Download';
+$wb["ul_bandwidth_txt"] = 'Banda de Upload';
+$wb["dl_bandwidth_txt"] = 'Banda de Download';
+$wb["server_id_txt"] = 'Servidor';
+$wb["parent_domain_id_txt"] = 'Website';
+$wb["username_txt"] = 'Usuário';
+$wb["password_txt"] = 'Senha';
+$wb["password_strength_txt"] = 'Tamanho da senha';
+$wb["quota_size_txt"] = 'Quota de Disco';
+$wb["active_txt"] = 'Ativo';
+$wb["limit_ftp_user_txt"] = 'O número máximo de usuários de FTP para sua conta foi atingido.';
+$wb["username_error_empty"] = 'Nome de usuário em branco.';
+$wb["username_error_unique"] = 'O nome de usuário deve ser único.';
+$wb["username_error_regex"] = 'The username contains charachters that are not allowed.';
+$wb["quota_size_error_empty"] = 'Quota em branco.';
+$wb["uid_error_empty"] = 'UID em branco.';
+$wb["uid_error_empty"] = 'GID em branco.';
+$wb["directory_error_empty"] = 'Diretório vazio.';
+?>
+
diff --git a/interface/web/sites/lib/lang/br_ftp_user_list.lng b/interface/web/sites/lib/lang/br_ftp_user_list.lng
new file mode 100644
index 0000000..0e111c2
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_ftp_user_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["list_head_txt"] = 'Usuário-FTP';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["parent_domain_id_txt"] = 'Site';
+$wb["username_txt"] = 'Usuário';
+$wb["add_new_record_txt"] = 'Adcionar um novo Usuário FTP';
+?>
diff --git a/interface/web/sites/lib/lang/br_shell_user.lng b/interface/web/sites/lib/lang/br_shell_user.lng
new file mode 100644
index 0000000..80b144a
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_shell_user.lng
@@ -0,0 +1,23 @@
+<?php
+$wb["uid_txt"] = 'Nome do usuário';
+$wb["gid_txt"] = 'Groupo';
+$wb["shell_txt"] = 'Shell';
+$wb["dir_txt"] = 'Diretório';
+$wb["server_id_txt"] = 'Servidor';
+$wb["parent_domain_id_txt"] = 'Site';
+$wb["username_txt"] = 'Nome do usuário';
+$wb["password_txt"] = 'Senha';
+$wb["password_strength_txt"] = 'Dificuldade da senha';
+$wb["chroot_txt"] = 'Chroot Shell';
+$wb["quota_size_txt"] = 'Quota';
+$wb["active_txt"] = 'Ativo';
+$wb["username_error_empty"] = 'Nome de usuário em branco.';
+$wb["username_error_unique"] = 'O nome de usuário deve ser único.';
+$wb["username_error_regex"] = 'The username contains charachters that are not allowed.';
+$wb["quota_size_error_empty"] = 'Quota em branco.';
+$wb["uid_error_empty"] = 'UID em branco.';
+$wb["uid_error_empty"] = 'GID em branco.';
+$wb["directory_error_empty"] = 'Diretório vazio.';
+$wb["limit_shell_user_txt"] = 'O número máximo de usuários shell para sua conta foi atingido.';
+?>
+
diff --git a/interface/web/sites/lib/lang/br_shell_user_list.lng b/interface/web/sites/lib/lang/br_shell_user_list.lng
new file mode 100644
index 0000000..d6080a7
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_shell_user_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["list_head_txt"] = 'Usuário de Shell';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["parent_domain_id_txt"] = 'Site';
+$wb["username_txt"] = 'Usuário';
+$wb["add_new_record_txt"] = 'Adcionar novo usuário de Shell';
+?>
diff --git a/interface/web/sites/lib/lang/br_web_aliasdomain_list.lng b/interface/web/sites/lib/lang/br_web_aliasdomain_list.lng
new file mode 100644
index 0000000..3749d6e
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_web_aliasdomain_list.lng
@@ -0,0 +1,11 @@
+<?php
+$wb["list_head_txt"] = 'Domínio Alias';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["parent_domain_id_txt"] = 'Website';
+$wb["domain_txt"] = 'Domínio Alias';
+$wb["add_new_record_txt"] = 'Adcionar novo domínio alias';
+$wb["domain_error_empty"] = 'Domínio em branco.';
+$wb["domain_error_unique"] = 'O domínio deve ser único.';
+$wb["domain_error_regex"] = 'Nome de domínio inválido.';
+?>
diff --git a/interface/web/sites/lib/lang/br_web_domain.lng b/interface/web/sites/lib/lang/br_web_domain.lng
new file mode 100644
index 0000000..5952956
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_web_domain.lng
@@ -0,0 +1,50 @@
+<?php
+$wb["ssl_state_txt"] = 'Estado';
+$wb["ssl_locality_txt"] = 'Localização';
+$wb["ssl_organisation_txt"] = 'Empresa';
+$wb["ssl_organisation_unit_txt"] = 'Departamento';
+$wb["ssl_country_txt"] = 'Pais';
+$wb["ssl_request_txt"] = 'Requisição SSL';
+$wb["ssl_cert_txt"] = 'Certificado SSL';
+$wb["ssl_bundle_txt"] = 'SSL Bundle';
+$wb["ssl_action_txt"] = 'SSL Action';
+$wb["server_id_txt"] = 'Servidor';
+$wb["domain_txt"] = 'Domínio';
+$wb["type_txt"] = 'Tipo';
+$wb["parent_domain_id_txt"] = 'Site Parente';
+$wb["redirect_type_txt"] = 'Tipo Redirecionamento';
+$wb["redirect_path_txt"] = 'Caminho de redirecionamento';
+$wb["active_txt"] = 'Ativo';
+$wb["document_root_txt"] = 'Documentroot';
+$wb["system_user_txt"] = 'Usuário Linux';
+$wb["system_group_txt"] = 'Groupo Linux';
+$wb["ip_address_txt"] = 'Endereço-IP';
+$wb["vhost_type_txt"] = 'Tipo de VHost';
+$wb["hd_quota_txt"] = 'Quota de Disco';
+$wb["traffic_quota_txt"] = 'Quota de Tráfego';
+$wb["cgi_txt"] = 'CGI';
+$wb["ssi_txt"] = 'SSI';
+$wb["errordocs_txt"] = 'Suas Páginas de Erro';
+$wb["subdomain_txt"] = 'Auto-Subdomínio';
+$wb["ssl_txt"] = 'SSL';
+$wb["suexec_txt"] = 'SuEXEC';
+$wb["php_txt"] = 'PHP';
+$wb["client_txt"] = 'Cliente';
+$wb["limit_web_domain_txt"] = 'O número máximo de domínios web para sua conta foi atingido.';
+$wb["limit_web_aliasdomain_txt"] = 'O número máximo de aliases domínio para sua conta foi atingido.';
+$wb["limit_web_subdomain_txt"] = 'O número máximo de sub-domínios para sua conta foi atingido.';
+$wb["apache_directives_txt"] = 'Diretivas do Apache';
+$wb["domain_error_empty"] = 'Domínio em branco.';
+$wb["domain_error_unique"] = 'Já existe site, alias ou sub-domínio com este nome';
+$wb["domain_error_regex"] = 'Nome de domínio inválido.';
+$wb["hd_quota_error_empty"] = 'Quota de disco está em branco.';
+$wb["traffic_quota_error_empty"] = 'Quota de tráfego está em branco.';
+$wb['error_ssl_state_empty'] = 'Estado do SSL está em branco.';
+$wb['error_ssl_locality_empty'] = 'Localização do SSL está em branco.';
+$wb['error_ssl_organisation_empty'] = 'Empresa do SSL está em branco.';
+$wb['error_ssl_organisation_unit_empty'] = 'Departamento do SSL está em branco.';
+$wb['error_ssl_country_empty'] = 'Pais do SSL em branco.';
+$wb["client_group_id_txt"] = 'Cliente';
+$wb["stats_password_txt"] = 'Senha do diretório de estatísticas';
+?>
+
diff --git a/interface/web/sites/lib/lang/br_web_domain_list.lng b/interface/web/sites/lib/lang/br_web_domain_list.lng
new file mode 100644
index 0000000..e48d6d3
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_web_domain_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["list_head_txt"] = 'Websites';
+$wb["domain_id_txt"] = 'ID';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["domain_txt"] = 'Domínio';
+$wb["add_new_record_txt"] = 'Adcionar um novo site';
+?>
diff --git a/interface/web/sites/lib/lang/br_web_sites_stats_list.lng b/interface/web/sites/lib/lang/br_web_sites_stats_list.lng
new file mode 100644
index 0000000..20f018b
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_web_sites_stats_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["list_head_txt"] = 'Web traffic';
+$wb["domain_txt"] = 'Domain';
+$wb["this_month_txt"] = 'This month';
+$wb["last_month_txt"] = 'Last month';
+$wb["this_year_txt"] = 'This year';
+$wb["last_year_txt"] = 'Last year';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/br_web_subdomain.lng b/interface/web/sites/lib/lang/br_web_subdomain.lng
new file mode 100644
index 0000000..66e162e
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_web_subdomain.lng
@@ -0,0 +1,39 @@
+<?php
+$wb["ssl_state_txt"] = 'Estado';
+$wb["ssl_locality_txt"] = 'Localidade';
+$wb["ssl_organisation_txt"] = 'Empresa';
+$wb["ssl_organisation_unit_txt"] = 'Departamento';
+$wb["ssl_country_txt"] = 'Pais';
+$wb["ssl_request_txt"] = 'Requisição SSL';
+$wb["ssl_cert_txt"] = 'Certificado SSL';
+$wb["ssl_bundle_txt"] = 'Pacote SSL';
+$wb["ssl_action_txt"] = 'Ação SSL';
+$wb["server_id_txt"] = 'Servidor';
+$wb["domain_txt"] = 'Domínio';
+$wb["type_txt"] = 'Tipo';
+$wb["parent_domain_id_txt"] = 'Site Parente';
+$wb["redirect_type_txt"] = 'Tipo do Redirecionamento';
+$wb["redirect_path_txt"] = 'Caminho do Redirecionamento';
+$wb["active_txt"] = 'Ativo';
+$wb["document_root_txt"] = 'Documentroot';
+$wb["system_user_txt"] = 'Usuário no Linux';
+$wb["system_group_txt"] = 'Grupo no Linux';
+$wb["ip_address_txt"] = 'Endereço-IP';
+$wb["vhost_type_txt"] = 'Tipo de VHost';
+$wb["hd_quota_txt"] = 'Quota de Disco';
+$wb["traffic_quota_txt"] = 'Quota de Tráfico';
+$wb["cgi_txt"] = 'CGI';
+$wb["ssi_txt"] = 'SSI';
+$wb["ssl_txt"] = 'SSL';
+$wb["suexec_txt"] = 'SuEXEC';
+$wb["php_txt"] = 'PHP';
+$wb["client_txt"] = 'Cliente';
+$wb["limit_web_domain_txt"] = 'O número máximo de domínios web para esta conta foi atingido.';
+$wb["limit_web_aliasdomain_txt"] = 'O número máximo de aliases para esta conta foi atingido.';
+$wb["limit_web_subdomain_txt"] = 'O número máximo de sub-domínios para esta conta foi atingido.';
+$wb["apache_directives_txt"] = 'Diretivas apache';
+$wb["domain_error_empty"] = 'Domínio em branco.';
+$wb["domain_error_unique"] = 'Já existe alias ou sub-domínio com este nome.';
+$wb["domain_error_regex"] = 'Nome de domínio inválido.';
+$wb["host_txt"] = 'Host';
+?>
diff --git a/interface/web/sites/lib/lang/br_web_subdomain_list.lng b/interface/web/sites/lib/lang/br_web_subdomain_list.lng
new file mode 100644
index 0000000..364d321
--- /dev/null
+++ b/interface/web/sites/lib/lang/br_web_subdomain_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["list_head_txt"] = 'Sub-domínios';
+$wb["active_txt"] = 'Ativo';
+$wb["server_id_txt"] = 'Servidor';
+$wb["parent_domain_id_txt"] = 'Website';
+$wb["domain_txt"] = 'Sub=domínio';
+$wb["add_new_record_txt"] = 'Adcionar um novo sub-domínio';
+?>
diff --git a/interface/web/sites/lib/lang/de_cron.lng b/interface/web/sites/lib/lang/de_cron.lng
new file mode 100644
index 0000000..c65bf38
--- /dev/null
+++ b/interface/web/sites/lib/lang/de_cron.lng
@@ -0,0 +1,21 @@
+<?php
+$wb['server_id_txt'] = 'Server';
+$wb['parent_domain_id_txt'] = 'Zugeordnete Website';
+$wb['active_txt'] = 'Aktiv';
+$wb['client_txt'] = 'Kunde';
+$wb['run_min_txt'] = 'Minuten';
+$wb['run_hour_txt'] = 'Stunden';
+$wb['run_mday_txt'] = 'Tage des Monats';
+$wb['run_month_txt'] = 'Monate';
+$wb['run_wday_txt'] = 'Tage der Woche';
+$wb['command_txt'] = 'Auszuführender Befehl (Befehle werden mit sh ausgeführt, urls mit wget)';
+$wb['limit_cron_txt'] = 'Die maximale Anzahl von erlaubten Cron Jobs ist bereits erreicht.';
+$wb['limit_cron_frequency_txt'] = 'Die Ausführungshäufigkeit übersteigt Ihr erlaubtes Limit.';
+$wb['run_min_error_format'] = 'Das Format für Minuten ist nicht korrekt.';
+$wb['run_hour_error_format'] = 'Das Format für Stunden ist nicht korrekt.';
+$wb['run_mday_error_format'] = 'Das Format für Tage des Monats ist nicht korrekt.';
+$wb['run_month_error_format'] = 'Das Format für Monate ist nicht korrekt.';
+$wb['run_wday_error_format'] = 'Das Format für Wochentage ist nicht korrekt.';
+$wb['command_error_format'] = 'Das Format für den Befehl ist nicht korrekt. Beachte, dass bei einem URL Aufruf nur http und https erlaubt ist.';
+$wb['unknown_fieldtype_error'] = 'Es wurde ein unbekanntes Feld verwendet.';
+?>
diff --git a/interface/web/sites/lib/lang/de_cron_list.lng b/interface/web/sites/lib/lang/de_cron_list.lng
new file mode 100644
index 0000000..7cdfd3b
--- /dev/null
+++ b/interface/web/sites/lib/lang/de_cron_list.lng
@@ -0,0 +1,12 @@
+<?php
+$wb['list_head_txt'] = 'Cron Jobs';
+$wb['active_txt'] = 'Activ';
+$wb['server_id_txt'] = 'Server';
+$wb['run_min_txt'] = 'Minute';
+$wb['run_hour_txt'] = 'Stunde';
+$wb['run_mday_txt'] = 'Tag des Monats';
+$wb['run_month_txt'] = 'Monat';
+$wb['run_wday_txt'] = 'Tag der Woche';
+$wb['command_txt'] = 'Befehl';
+$wb['add_new_cron_txt'] = 'Neuen Cron Job anlegen';
+?>
diff --git a/interface/web/sites/lib/lang/de_database.lng b/interface/web/sites/lib/lang/de_database.lng
index 8224fa3..66241ef 100644
--- a/interface/web/sites/lib/lang/de_database.lng
+++ b/interface/web/sites/lib/lang/de_database.lng
@@ -6,6 +6,8 @@
$wb['database_password_txt'] = 'Datenbank Passwort';
$wb['database_charset_txt'] = 'Datenbank Zeichensatz';
$wb['remote_access_txt'] = 'Remotezugang';
+$wb['remote_ips_txt'] = 'Remotezugang-IPs (mit Komma trennen, keine Eingabe für <i>alle</i>)';
+$wb['database_remote_error_ips'] = 'Mindestens eine der eingegebenen IP Adressen ist ungültig.';
$wb['client_txt'] = 'Kunde';
$wb['active_txt'] = 'Aktiv';
$wb['database_name_error_empty'] = 'Datenbankname ist leer.';
diff --git a/interface/web/sites/lib/lang/de_ftp_user.lng b/interface/web/sites/lib/lang/de_ftp_user.lng
index ea02532..3991289 100644
--- a/interface/web/sites/lib/lang/de_ftp_user.lng
+++ b/interface/web/sites/lib/lang/de_ftp_user.lng
@@ -22,4 +22,5 @@
$wb['uid_error_empty'] = 'GID ist leer.';
$wb['directory_error_empty'] = 'Verzeichniss ist leer.';
$wb['password_strength_txt'] = 'Passwortkomplexität';
+$wb['directory_error_notinweb'] = 'Das Verzeichnis befindet sich nicht innerhalb des Verzeichnisses der Website.';
?>
diff --git a/interface/web/sites/lib/lang/de_web_sites_stats_list.lng b/interface/web/sites/lib/lang/de_web_sites_stats_list.lng
new file mode 100644
index 0000000..660abfb
--- /dev/null
+++ b/interface/web/sites/lib/lang/de_web_sites_stats_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['list_head_txt'] = 'Web Datenverkehr';
+$wb['domain_txt'] = 'Domain';
+$wb['this_month_txt'] = 'Diesen Monat';
+$wb['last_month_txt'] = 'Letzten Monat';
+$wb['this_year_txt'] = 'Dieses Jahr';
+$wb['last_year_txt'] = 'Letztes Jahr';
+?>
diff --git a/interface/web/sites/lib/lang/en_cron.lng b/interface/web/sites/lib/lang/en_cron.lng
new file mode 100644
index 0000000..8cb7f08
--- /dev/null
+++ b/interface/web/sites/lib/lang/en_cron.lng
@@ -0,0 +1,21 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb['parent_domain_id_txt'] = 'Parent website';
+$wb['active_txt'] = 'Active';
+$wb['client_txt'] = 'Client';
+$wb['run_min_txt'] = 'Minutes';
+$wb['run_hour_txt'] = 'Hours';
+$wb['run_mday_txt'] = 'Days of month';
+$wb['run_month_txt'] = 'Months';
+$wb['run_wday_txt'] = 'Days of week';
+$wb['command_txt'] = 'Command to run (commands are executed via sh, urls via wget)';
+$wb['limit_cron_txt'] = 'The maximum number of allowed cron jobs was reached.';
+$wb['limit_cron_frequency_txt'] = 'The cron job frequency exceeds the allowed limit.';
+$wb['run_min_error_format'] = 'Invalid format for minutes.';
+$wb['run_hour_error_format'] = 'Invalid format for hours.';
+$wb['run_mday_error_format'] = 'Invalid format for days of month.';
+$wb['run_month_error_format'] = 'Invalid format for months.';
+$wb['run_wday_error_format'] = 'Invalid format for days of the week.';
+$wb['command_error_format'] = 'Invalid command format. Please note that in case of an url call only http/https is allowed.';
+$wb['unknown_fieldtype_error'] = 'An unknown field type has been used.';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/en_cron_list.lng b/interface/web/sites/lib/lang/en_cron_list.lng
new file mode 100644
index 0000000..b5c8d15
--- /dev/null
+++ b/interface/web/sites/lib/lang/en_cron_list.lng
@@ -0,0 +1,12 @@
+<?php
+$wb["list_head_txt"] = 'Cron Jobs';
+$wb["active_txt"] = 'Active';
+$wb["server_id_txt"] = 'Server';
+$wb["run_min_txt"] = 'Minute';
+$wb["run_hour_txt"] = 'Hour';
+$wb["run_mday_txt"] = 'Day of month';
+$wb["run_month_txt"] = 'Month';
+$wb["run_wday_txt"] = 'Day of week';
+$wb["command_txt"] = 'Command';
+$wb["add_new_cron_txt"] = 'Add new Cron job';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/en_database.lng b/interface/web/sites/lib/lang/en_database.lng
index df47802..555511a 100644
--- a/interface/web/sites/lib/lang/en_database.lng
+++ b/interface/web/sites/lib/lang/en_database.lng
@@ -7,6 +7,8 @@
$wb["password_strength_txt"] = 'Password strength';
$wb["database_charset_txt"] = 'Database charset';
$wb["remote_access_txt"] = 'Remote Access';
+$wb["remote_ips_txt"] = 'Remote Access IPs (separate by , and leave blank for <i>any</i>)';
+$wb["database_remote_error_ips"] = 'At least one of the entered ip addresses is invalid.';
$wb["client_txt"] = 'Client';
$wb["active_txt"] = 'Active';
$wb["database_name_error_empty"] = 'Database name is empty.';
diff --git a/interface/web/sites/lib/lang/en_ftp_user.lng b/interface/web/sites/lib/lang/en_ftp_user.lng
index 691bc7d..f5b1116 100644
--- a/interface/web/sites/lib/lang/en_ftp_user.lng
+++ b/interface/web/sites/lib/lang/en_ftp_user.lng
@@ -23,4 +23,6 @@
$wb["uid_error_empty"] = 'UID empty.';
$wb["uid_error_empty"] = 'GID empty.';
$wb["directory_error_empty"] = 'Directory empty.';
+$wb['directory_error_notinweb'] = 'Directory not inside of web root directory.';
+$wb["parent_domain_id_error_empty"] = 'No website selected.';
?>
diff --git a/interface/web/sites/lib/lang/en_shell_user.lng b/interface/web/sites/lib/lang/en_shell_user.lng
index 45fb214..80e3e0a 100644
--- a/interface/web/sites/lib/lang/en_shell_user.lng
+++ b/interface/web/sites/lib/lang/en_shell_user.lng
@@ -19,4 +19,5 @@
$wb["uid_error_empty"] = 'GID empty.';
$wb["directory_error_empty"] = 'Directory empty.';
$wb["limit_shell_user_txt"] = 'The max number of shell users is reached.';
+$wb["parent_domain_id_error_empty"] = 'No website selected.';
?>
diff --git a/interface/web/sites/lib/lang/en_web_sites_stats_list.lng b/interface/web/sites/lib/lang/en_web_sites_stats_list.lng
new file mode 100644
index 0000000..20f018b
--- /dev/null
+++ b/interface/web/sites/lib/lang/en_web_sites_stats_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb["list_head_txt"] = 'Web traffic';
+$wb["domain_txt"] = 'Domain';
+$wb["this_month_txt"] = 'This month';
+$wb["last_month_txt"] = 'Last month';
+$wb["this_year_txt"] = 'This year';
+$wb["last_year_txt"] = 'Last year';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/es_cron.lng b/interface/web/sites/lib/lang/es_cron.lng
new file mode 100644
index 0000000..8cb7f08
--- /dev/null
+++ b/interface/web/sites/lib/lang/es_cron.lng
@@ -0,0 +1,21 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb['parent_domain_id_txt'] = 'Parent website';
+$wb['active_txt'] = 'Active';
+$wb['client_txt'] = 'Client';
+$wb['run_min_txt'] = 'Minutes';
+$wb['run_hour_txt'] = 'Hours';
+$wb['run_mday_txt'] = 'Days of month';
+$wb['run_month_txt'] = 'Months';
+$wb['run_wday_txt'] = 'Days of week';
+$wb['command_txt'] = 'Command to run (commands are executed via sh, urls via wget)';
+$wb['limit_cron_txt'] = 'The maximum number of allowed cron jobs was reached.';
+$wb['limit_cron_frequency_txt'] = 'The cron job frequency exceeds the allowed limit.';
+$wb['run_min_error_format'] = 'Invalid format for minutes.';
+$wb['run_hour_error_format'] = 'Invalid format for hours.';
+$wb['run_mday_error_format'] = 'Invalid format for days of month.';
+$wb['run_month_error_format'] = 'Invalid format for months.';
+$wb['run_wday_error_format'] = 'Invalid format for days of the week.';
+$wb['command_error_format'] = 'Invalid command format. Please note that in case of an url call only http/https is allowed.';
+$wb['unknown_fieldtype_error'] = 'An unknown field type has been used.';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/es_cron_list.lng b/interface/web/sites/lib/lang/es_cron_list.lng
new file mode 100644
index 0000000..b5c8d15
--- /dev/null
+++ b/interface/web/sites/lib/lang/es_cron_list.lng
@@ -0,0 +1,12 @@
+<?php
+$wb["list_head_txt"] = 'Cron Jobs';
+$wb["active_txt"] = 'Active';
+$wb["server_id_txt"] = 'Server';
+$wb["run_min_txt"] = 'Minute';
+$wb["run_hour_txt"] = 'Hour';
+$wb["run_mday_txt"] = 'Day of month';
+$wb["run_month_txt"] = 'Month';
+$wb["run_wday_txt"] = 'Day of week';
+$wb["command_txt"] = 'Command';
+$wb["add_new_cron_txt"] = 'Add new Cron job';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/es_database.lng b/interface/web/sites/lib/lang/es_database.lng
index 1a8e0c1..10f5832 100644
--- a/interface/web/sites/lib/lang/es_database.lng
+++ b/interface/web/sites/lib/lang/es_database.lng
@@ -18,4 +18,6 @@
$wb['limit_database_txt'] = 'Se ha alcanzado el número máximo de bases de datos';
$wb['database_name_change_txt'] = 'El nombre de la base de datos no se puede cambiar';
$wb['database_charset_change_txt'] = 'La tabla de caracteres de la base de datos no se puede cambiar';
+$wb['remote_ips_txt'] = 'Remote Access IPs (separate by , and leave blank for <i>any</i>)';
+$wb['database_remote_error_ips'] = 'At least one of the entered ip addresses is invalid.';
?>
diff --git a/interface/web/sites/lib/lang/es_ftp_user.lng b/interface/web/sites/lib/lang/es_ftp_user.lng
index 53f6907..148cdc9 100644
--- a/interface/web/sites/lib/lang/es_ftp_user.lng
+++ b/interface/web/sites/lib/lang/es_ftp_user.lng
@@ -22,4 +22,5 @@
$wb['uid_error_empty'] = 'GID vacío';
$wb['directory_error_empty'] = 'Directorio vacío';
$wb['quota_files_unity_txt'] = 'Files';
+$wb['directory_error_notinweb'] = 'Directory not inside of web root directory.';
?>
diff --git a/interface/web/sites/lib/lang/es_web_sites_stats_list.lng b/interface/web/sites/lib/lang/es_web_sites_stats_list.lng
new file mode 100644
index 0000000..b2dd3e9
--- /dev/null
+++ b/interface/web/sites/lib/lang/es_web_sites_stats_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['list_head_txt'] = 'Tráfico de xxxx';
+$wb['domain_txt'] = 'xxxx';
+$wb['this_month_txt'] = 'Este mes';
+$wb['last_month_txt'] = 'Último mes';
+$wb['this_year_txt'] = 'Este año';
+$wb['last_year_txt'] = 'Último año';
+?>
diff --git a/interface/web/sites/lib/lang/fi_cron.lng b/interface/web/sites/lib/lang/fi_cron.lng
new file mode 100644
index 0000000..8cb7f08
--- /dev/null
+++ b/interface/web/sites/lib/lang/fi_cron.lng
@@ -0,0 +1,21 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb['parent_domain_id_txt'] = 'Parent website';
+$wb['active_txt'] = 'Active';
+$wb['client_txt'] = 'Client';
+$wb['run_min_txt'] = 'Minutes';
+$wb['run_hour_txt'] = 'Hours';
+$wb['run_mday_txt'] = 'Days of month';
+$wb['run_month_txt'] = 'Months';
+$wb['run_wday_txt'] = 'Days of week';
+$wb['command_txt'] = 'Command to run (commands are executed via sh, urls via wget)';
+$wb['limit_cron_txt'] = 'The maximum number of allowed cron jobs was reached.';
+$wb['limit_cron_frequency_txt'] = 'The cron job frequency exceeds the allowed limit.';
+$wb['run_min_error_format'] = 'Invalid format for minutes.';
+$wb['run_hour_error_format'] = 'Invalid format for hours.';
+$wb['run_mday_error_format'] = 'Invalid format for days of month.';
+$wb['run_month_error_format'] = 'Invalid format for months.';
+$wb['run_wday_error_format'] = 'Invalid format for days of the week.';
+$wb['command_error_format'] = 'Invalid command format. Please note that in case of an url call only http/https is allowed.';
+$wb['unknown_fieldtype_error'] = 'An unknown field type has been used.';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/fi_cron_list.lng b/interface/web/sites/lib/lang/fi_cron_list.lng
new file mode 100644
index 0000000..b5c8d15
--- /dev/null
+++ b/interface/web/sites/lib/lang/fi_cron_list.lng
@@ -0,0 +1,12 @@
+<?php
+$wb["list_head_txt"] = 'Cron Jobs';
+$wb["active_txt"] = 'Active';
+$wb["server_id_txt"] = 'Server';
+$wb["run_min_txt"] = 'Minute';
+$wb["run_hour_txt"] = 'Hour';
+$wb["run_mday_txt"] = 'Day of month';
+$wb["run_month_txt"] = 'Month';
+$wb["run_wday_txt"] = 'Day of week';
+$wb["command_txt"] = 'Command';
+$wb["add_new_cron_txt"] = 'Add new Cron job';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/fi_database.lng b/interface/web/sites/lib/lang/fi_database.lng
index ce65740..e903395 100755
--- a/interface/web/sites/lib/lang/fi_database.lng
+++ b/interface/web/sites/lib/lang/fi_database.lng
@@ -18,4 +18,6 @@
$wb['password_strength_txt'] = 'Salasanan vahvuus';
$wb['database_charset_txt'] = 'Tietokannan merkistö';
$wb['database_charset_change_txt'] = 'Tietokannan merkistöä ei voi vaihtaa';
+$wb['remote_ips_txt'] = 'Remote Access IPs (separate by , and leave blank for <i>any</i>)';
+$wb['database_remote_error_ips'] = 'At least one of the entered ip addresses is invalid.';
?>
diff --git a/interface/web/sites/lib/lang/fi_ftp_user.lng b/interface/web/sites/lib/lang/fi_ftp_user.lng
index 249bf3c..9cdfa08 100755
--- a/interface/web/sites/lib/lang/fi_ftp_user.lng
+++ b/interface/web/sites/lib/lang/fi_ftp_user.lng
@@ -22,4 +22,5 @@
$wb['directory_error_empty'] = 'Kotihakemisto-kenttä on tyhjä.';
$wb['password_strength_txt'] = 'Salasanan vahvuus';
$wb['quota_files_unity_txt'] = 'Files';
+$wb['directory_error_notinweb'] = 'Directory not inside of web root directory.';
?>
diff --git a/interface/web/sites/lib/lang/fi_web_sites_stats_list.lng b/interface/web/sites/lib/lang/fi_web_sites_stats_list.lng
new file mode 100755
index 0000000..cecf3e3
--- /dev/null
+++ b/interface/web/sites/lib/lang/fi_web_sites_stats_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['list_head_txt'] = 'Sähköpostiliikenne';
+$wb['domain_txt'] = 'Sähköpostiosoite';
+$wb['this_month_txt'] = 'Tässä kuussa';
+$wb['last_month_txt'] = 'Viime kuussa';
+$wb['this_year_txt'] = 'Tänä vuonna';
+$wb['last_year_txt'] = 'Viime vuonna';
+?>
diff --git a/interface/web/sites/lib/lang/fr_cron.lng b/interface/web/sites/lib/lang/fr_cron.lng
new file mode 100644
index 0000000..fecb4ab
--- /dev/null
+++ b/interface/web/sites/lib/lang/fr_cron.lng
@@ -0,0 +1,21 @@
+<?php
+$wb['server_id_txt'] = 'Server';
+$wb['parent_domain_id_txt'] = 'Parent website';
+$wb['active_txt'] = 'Active';
+$wb['client_txt'] = 'Client';
+$wb['run_min_txt'] = 'Minutes';
+$wb['run_hour_txt'] = 'Hours';
+$wb['run_mday_txt'] = 'Days of month';
+$wb['run_month_txt'] = 'Months';
+$wb['run_wday_txt'] = 'Days of week';
+$wb['command_txt'] = 'Command to run (commands are executed via sh, urls via wget)';
+$wb['limit_cron_txt'] = 'The maximum number of allowed cron jobs was reached.';
+$wb['limit_cron_frequency_txt'] = 'The cron job frequency exceeds the allowed limit.';
+$wb['run_min_error_format'] = 'Invalid format for minutes.';
+$wb['run_hour_error_format'] = 'Invalid format for hours.';
+$wb['run_mday_error_format'] = 'Invalid format for days of month.';
+$wb['run_month_error_format'] = 'Invalid format for months.';
+$wb['run_wday_error_format'] = 'Invalid format for days of the week.';
+$wb['command_error_format'] = 'Invalid command format. Please note that in case of an url call only http/https is allowed.';
+$wb['unknown_fieldtype_error'] = 'An unknown field type has been used.';
+?>
diff --git a/interface/web/sites/lib/lang/fr_cron_list.lng b/interface/web/sites/lib/lang/fr_cron_list.lng
new file mode 100644
index 0000000..ad56ea9
--- /dev/null
+++ b/interface/web/sites/lib/lang/fr_cron_list.lng
@@ -0,0 +1,12 @@
+<?php
+$wb['list_head_txt'] = 'Cron Jobs';
+$wb['active_txt'] = 'Active';
+$wb['server_id_txt'] = 'Server';
+$wb['run_min_txt'] = 'Minute';
+$wb['run_hour_txt'] = 'Hour';
+$wb['run_mday_txt'] = 'Day of month';
+$wb['run_month_txt'] = 'Month';
+$wb['run_wday_txt'] = 'Day of week';
+$wb['command_txt'] = 'Command';
+$wb['add_new_cron_txt'] = 'Add new Cron job';
+?>
diff --git a/interface/web/sites/lib/lang/fr_database.lng b/interface/web/sites/lib/lang/fr_database.lng
index 4dbd36f..42a4b3c 100644
--- a/interface/web/sites/lib/lang/fr_database.lng
+++ b/interface/web/sites/lib/lang/fr_database.lng
@@ -18,4 +18,6 @@
$wb['limit_database_txt'] = 'The max. number of databases is reached.';
$wb['database_name_change_txt'] = 'The database name can not be changed';
$wb['database_charset_change_txt'] = 'The database charset can not be changed';
+$wb['remote_ips_txt'] = 'Remote Access IPs (separate by , and leave blank for <i>any</i>)';
+$wb['database_remote_error_ips'] = 'At least one of the entered ip addresses is invalid.';
?>
diff --git a/interface/web/sites/lib/lang/fr_ftp_user.lng b/interface/web/sites/lib/lang/fr_ftp_user.lng
index 7ebbcc4..df48d9a 100644
--- a/interface/web/sites/lib/lang/fr_ftp_user.lng
+++ b/interface/web/sites/lib/lang/fr_ftp_user.lng
@@ -22,4 +22,5 @@
$wb['uid_error_empty'] = 'GID empty.';
$wb['directory_error_empty'] = 'Directory empty.';
$wb['quota_files_unity_txt'] = 'Files';
+$wb['directory_error_notinweb'] = 'Directory not inside of web root directory.';
?>
diff --git a/interface/web/sites/lib/lang/fr_web_sites_stats_list.lng b/interface/web/sites/lib/lang/fr_web_sites_stats_list.lng
new file mode 100644
index 0000000..b217f80
--- /dev/null
+++ b/interface/web/sites/lib/lang/fr_web_sites_stats_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['list_head_txt'] = 'Web traffic';
+$wb['domain_txt'] = 'Domain';
+$wb['this_month_txt'] = 'This month';
+$wb['last_month_txt'] = 'Last month';
+$wb['this_year_txt'] = 'This year';
+$wb['last_year_txt'] = 'Last year';
+?>
diff --git a/interface/web/sites/lib/lang/it_cron.lng b/interface/web/sites/lib/lang/it_cron.lng
new file mode 100644
index 0000000..8cb7f08
--- /dev/null
+++ b/interface/web/sites/lib/lang/it_cron.lng
@@ -0,0 +1,21 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb['parent_domain_id_txt'] = 'Parent website';
+$wb['active_txt'] = 'Active';
+$wb['client_txt'] = 'Client';
+$wb['run_min_txt'] = 'Minutes';
+$wb['run_hour_txt'] = 'Hours';
+$wb['run_mday_txt'] = 'Days of month';
+$wb['run_month_txt'] = 'Months';
+$wb['run_wday_txt'] = 'Days of week';
+$wb['command_txt'] = 'Command to run (commands are executed via sh, urls via wget)';
+$wb['limit_cron_txt'] = 'The maximum number of allowed cron jobs was reached.';
+$wb['limit_cron_frequency_txt'] = 'The cron job frequency exceeds the allowed limit.';
+$wb['run_min_error_format'] = 'Invalid format for minutes.';
+$wb['run_hour_error_format'] = 'Invalid format for hours.';
+$wb['run_mday_error_format'] = 'Invalid format for days of month.';
+$wb['run_month_error_format'] = 'Invalid format for months.';
+$wb['run_wday_error_format'] = 'Invalid format for days of the week.';
+$wb['command_error_format'] = 'Invalid command format. Please note that in case of an url call only http/https is allowed.';
+$wb['unknown_fieldtype_error'] = 'An unknown field type has been used.';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/it_cron_list.lng b/interface/web/sites/lib/lang/it_cron_list.lng
new file mode 100644
index 0000000..b5c8d15
--- /dev/null
+++ b/interface/web/sites/lib/lang/it_cron_list.lng
@@ -0,0 +1,12 @@
+<?php
+$wb["list_head_txt"] = 'Cron Jobs';
+$wb["active_txt"] = 'Active';
+$wb["server_id_txt"] = 'Server';
+$wb["run_min_txt"] = 'Minute';
+$wb["run_hour_txt"] = 'Hour';
+$wb["run_mday_txt"] = 'Day of month';
+$wb["run_month_txt"] = 'Month';
+$wb["run_wday_txt"] = 'Day of week';
+$wb["command_txt"] = 'Command';
+$wb["add_new_cron_txt"] = 'Add new Cron job';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/it_database.lng b/interface/web/sites/lib/lang/it_database.lng
index ff217b4..a8f6009 100644
--- a/interface/web/sites/lib/lang/it_database.lng
+++ b/interface/web/sites/lib/lang/it_database.lng
@@ -18,4 +18,6 @@
$wb['limit_database_txt'] = 'The max. number of databases is reached.';
$wb['database_name_change_txt'] = 'The database name can not be changed';
$wb['database_charset_change_txt'] = 'The database charset can not be changed';
+$wb['remote_ips_txt'] = 'Remote Access IPs (separate by , and leave blank for <i>any</i>)';
+$wb['database_remote_error_ips'] = 'At least one of the entered ip addresses is invalid.';
?>
diff --git a/interface/web/sites/lib/lang/it_ftp_user.lng b/interface/web/sites/lib/lang/it_ftp_user.lng
index 565b5ba..4a5893c 100644
--- a/interface/web/sites/lib/lang/it_ftp_user.lng
+++ b/interface/web/sites/lib/lang/it_ftp_user.lng
@@ -22,4 +22,5 @@
$wb['uid_error_empty'] = 'GID empty.';
$wb['directory_error_empty'] = 'Directory empty.';
$wb['quota_files_unity_txt'] = 'Files';
+$wb['directory_error_notinweb'] = 'Directory not inside of web root directory.';
?>
diff --git a/interface/web/sites/lib/lang/it_web_sites_stats_list.lng b/interface/web/sites/lib/lang/it_web_sites_stats_list.lng
new file mode 100644
index 0000000..b217f80
--- /dev/null
+++ b/interface/web/sites/lib/lang/it_web_sites_stats_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['list_head_txt'] = 'Web traffic';
+$wb['domain_txt'] = 'Domain';
+$wb['this_month_txt'] = 'This month';
+$wb['last_month_txt'] = 'Last month';
+$wb['this_year_txt'] = 'This year';
+$wb['last_year_txt'] = 'Last year';
+?>
diff --git a/interface/web/sites/lib/lang/nl_cron.lng b/interface/web/sites/lib/lang/nl_cron.lng
new file mode 100644
index 0000000..8cb7f08
--- /dev/null
+++ b/interface/web/sites/lib/lang/nl_cron.lng
@@ -0,0 +1,21 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb['parent_domain_id_txt'] = 'Parent website';
+$wb['active_txt'] = 'Active';
+$wb['client_txt'] = 'Client';
+$wb['run_min_txt'] = 'Minutes';
+$wb['run_hour_txt'] = 'Hours';
+$wb['run_mday_txt'] = 'Days of month';
+$wb['run_month_txt'] = 'Months';
+$wb['run_wday_txt'] = 'Days of week';
+$wb['command_txt'] = 'Command to run (commands are executed via sh, urls via wget)';
+$wb['limit_cron_txt'] = 'The maximum number of allowed cron jobs was reached.';
+$wb['limit_cron_frequency_txt'] = 'The cron job frequency exceeds the allowed limit.';
+$wb['run_min_error_format'] = 'Invalid format for minutes.';
+$wb['run_hour_error_format'] = 'Invalid format for hours.';
+$wb['run_mday_error_format'] = 'Invalid format for days of month.';
+$wb['run_month_error_format'] = 'Invalid format for months.';
+$wb['run_wday_error_format'] = 'Invalid format for days of the week.';
+$wb['command_error_format'] = 'Invalid command format. Please note that in case of an url call only http/https is allowed.';
+$wb['unknown_fieldtype_error'] = 'An unknown field type has been used.';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/nl_cron_list.lng b/interface/web/sites/lib/lang/nl_cron_list.lng
new file mode 100644
index 0000000..b5c8d15
--- /dev/null
+++ b/interface/web/sites/lib/lang/nl_cron_list.lng
@@ -0,0 +1,12 @@
+<?php
+$wb["list_head_txt"] = 'Cron Jobs';
+$wb["active_txt"] = 'Active';
+$wb["server_id_txt"] = 'Server';
+$wb["run_min_txt"] = 'Minute';
+$wb["run_hour_txt"] = 'Hour';
+$wb["run_mday_txt"] = 'Day of month';
+$wb["run_month_txt"] = 'Month';
+$wb["run_wday_txt"] = 'Day of week';
+$wb["command_txt"] = 'Command';
+$wb["add_new_cron_txt"] = 'Add new Cron job';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/nl_database.lng b/interface/web/sites/lib/lang/nl_database.lng
index b7275a6..afb759f 100644
--- a/interface/web/sites/lib/lang/nl_database.lng
+++ b/interface/web/sites/lib/lang/nl_database.lng
@@ -18,4 +18,6 @@
$wb['limit_database_txt'] = 'The max. aantal databases is bereikt.';
$wb['database_name_change_txt'] = 'De databasenaam kan niet worden gewijzigd.';
$wb['database_charset_change_txt'] = 'The database karakterset kan niet gewijzigd worden.';
+$wb['remote_ips_txt'] = 'Remote Access IPs (separate by , and leave blank for <i>any</i>)';
+$wb['database_remote_error_ips'] = 'At least one of the entered ip addresses is invalid.';
?>
diff --git a/interface/web/sites/lib/lang/nl_ftp_user.lng b/interface/web/sites/lib/lang/nl_ftp_user.lng
index 4100536..ed5cce6 100644
--- a/interface/web/sites/lib/lang/nl_ftp_user.lng
+++ b/interface/web/sites/lib/lang/nl_ftp_user.lng
@@ -22,4 +22,5 @@
$wb['uid_error_empty'] = 'GID is leeg.';
$wb['directory_error_empty'] = 'Directorie is leeg.';
$wb['quota_files_unity_txt'] = 'Files';
+$wb['directory_error_notinweb'] = 'Directory not inside of web root directory.';
?>
diff --git a/interface/web/sites/lib/lang/nl_web_sites_stats_list.lng b/interface/web/sites/lib/lang/nl_web_sites_stats_list.lng
new file mode 100644
index 0000000..45bcd77
--- /dev/null
+++ b/interface/web/sites/lib/lang/nl_web_sites_stats_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['list_head_txt'] = 'Web verkeer';
+$wb['domain_txt'] = 'Domain';
+$wb['this_month_txt'] = 'Deze maand';
+$wb['last_month_txt'] = 'Laatste maand';
+$wb['this_year_txt'] = 'Dit jaar';
+$wb['last_year_txt'] = 'Vorig jaar';
+?>
diff --git a/interface/web/sites/lib/lang/ru_cron.lng b/interface/web/sites/lib/lang/ru_cron.lng
new file mode 100644
index 0000000..8cb7f08
--- /dev/null
+++ b/interface/web/sites/lib/lang/ru_cron.lng
@@ -0,0 +1,21 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb['parent_domain_id_txt'] = 'Parent website';
+$wb['active_txt'] = 'Active';
+$wb['client_txt'] = 'Client';
+$wb['run_min_txt'] = 'Minutes';
+$wb['run_hour_txt'] = 'Hours';
+$wb['run_mday_txt'] = 'Days of month';
+$wb['run_month_txt'] = 'Months';
+$wb['run_wday_txt'] = 'Days of week';
+$wb['command_txt'] = 'Command to run (commands are executed via sh, urls via wget)';
+$wb['limit_cron_txt'] = 'The maximum number of allowed cron jobs was reached.';
+$wb['limit_cron_frequency_txt'] = 'The cron job frequency exceeds the allowed limit.';
+$wb['run_min_error_format'] = 'Invalid format for minutes.';
+$wb['run_hour_error_format'] = 'Invalid format for hours.';
+$wb['run_mday_error_format'] = 'Invalid format for days of month.';
+$wb['run_month_error_format'] = 'Invalid format for months.';
+$wb['run_wday_error_format'] = 'Invalid format for days of the week.';
+$wb['command_error_format'] = 'Invalid command format. Please note that in case of an url call only http/https is allowed.';
+$wb['unknown_fieldtype_error'] = 'An unknown field type has been used.';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/ru_cron_list.lng b/interface/web/sites/lib/lang/ru_cron_list.lng
new file mode 100644
index 0000000..b5c8d15
--- /dev/null
+++ b/interface/web/sites/lib/lang/ru_cron_list.lng
@@ -0,0 +1,12 @@
+<?php
+$wb["list_head_txt"] = 'Cron Jobs';
+$wb["active_txt"] = 'Active';
+$wb["server_id_txt"] = 'Server';
+$wb["run_min_txt"] = 'Minute';
+$wb["run_hour_txt"] = 'Hour';
+$wb["run_mday_txt"] = 'Day of month';
+$wb["run_month_txt"] = 'Month';
+$wb["run_wday_txt"] = 'Day of week';
+$wb["command_txt"] = 'Command';
+$wb["add_new_cron_txt"] = 'Add new Cron job';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/ru_database.lng b/interface/web/sites/lib/lang/ru_database.lng
index 7d361a6..eda3a42 100644
--- a/interface/web/sites/lib/lang/ru_database.lng
+++ b/interface/web/sites/lib/lang/ru_database.lng
@@ -18,4 +18,6 @@
$wb['database_name_change_txt'] = 'The database name can not be changed';
$wb['database_charset_change_txt'] = 'The database charset can not be changed';
$wb['password_strength_txt'] = 'Password strength';
+$wb['remote_ips_txt'] = 'Remote Access IPs (separate by , and leave blank for <i>any</i>)';
+$wb['database_remote_error_ips'] = 'At least one of the entered ip addresses is invalid.';
?>
diff --git a/interface/web/sites/lib/lang/ru_ftp_user.lng b/interface/web/sites/lib/lang/ru_ftp_user.lng
index 178dcfe..7c89c2e 100644
--- a/interface/web/sites/lib/lang/ru_ftp_user.lng
+++ b/interface/web/sites/lib/lang/ru_ftp_user.lng
@@ -22,4 +22,5 @@
$wb['directory_error_empty'] = 'Directory empty.';
$wb['password_strength_txt'] = 'Password strength';
$wb['quota_files_unity_txt'] = 'Files';
+$wb['directory_error_notinweb'] = 'Directory not inside of web root directory.';
?>
diff --git a/interface/web/sites/lib/lang/ru_web_sites_stats_list.lng b/interface/web/sites/lib/lang/ru_web_sites_stats_list.lng
new file mode 100644
index 0000000..58a4db0
--- /dev/null
+++ b/interface/web/sites/lib/lang/ru_web_sites_stats_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['list_head_txt'] = 'Web трафик';
+$wb['domain_txt'] = 'Domain';
+$wb['this_month_txt'] = 'Этот месяц';
+$wb['last_month_txt'] = 'Последний месяц';
+$wb['this_year_txt'] = 'Этот год';
+$wb['last_year_txt'] = 'Последний год';
+?>
diff --git a/interface/web/sites/lib/lang/se_cron.lng b/interface/web/sites/lib/lang/se_cron.lng
new file mode 100644
index 0000000..8cb7f08
--- /dev/null
+++ b/interface/web/sites/lib/lang/se_cron.lng
@@ -0,0 +1,21 @@
+<?php
+$wb["server_id_txt"] = 'Server';
+$wb['parent_domain_id_txt'] = 'Parent website';
+$wb['active_txt'] = 'Active';
+$wb['client_txt'] = 'Client';
+$wb['run_min_txt'] = 'Minutes';
+$wb['run_hour_txt'] = 'Hours';
+$wb['run_mday_txt'] = 'Days of month';
+$wb['run_month_txt'] = 'Months';
+$wb['run_wday_txt'] = 'Days of week';
+$wb['command_txt'] = 'Command to run (commands are executed via sh, urls via wget)';
+$wb['limit_cron_txt'] = 'The maximum number of allowed cron jobs was reached.';
+$wb['limit_cron_frequency_txt'] = 'The cron job frequency exceeds the allowed limit.';
+$wb['run_min_error_format'] = 'Invalid format for minutes.';
+$wb['run_hour_error_format'] = 'Invalid format for hours.';
+$wb['run_mday_error_format'] = 'Invalid format for days of month.';
+$wb['run_month_error_format'] = 'Invalid format for months.';
+$wb['run_wday_error_format'] = 'Invalid format for days of the week.';
+$wb['command_error_format'] = 'Invalid command format. Please note that in case of an url call only http/https is allowed.';
+$wb['unknown_fieldtype_error'] = 'An unknown field type has been used.';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/se_cron_list.lng b/interface/web/sites/lib/lang/se_cron_list.lng
new file mode 100644
index 0000000..b5c8d15
--- /dev/null
+++ b/interface/web/sites/lib/lang/se_cron_list.lng
@@ -0,0 +1,12 @@
+<?php
+$wb["list_head_txt"] = 'Cron Jobs';
+$wb["active_txt"] = 'Active';
+$wb["server_id_txt"] = 'Server';
+$wb["run_min_txt"] = 'Minute';
+$wb["run_hour_txt"] = 'Hour';
+$wb["run_mday_txt"] = 'Day of month';
+$wb["run_month_txt"] = 'Month';
+$wb["run_wday_txt"] = 'Day of week';
+$wb["command_txt"] = 'Command';
+$wb["add_new_cron_txt"] = 'Add new Cron job';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/se_database.lng b/interface/web/sites/lib/lang/se_database.lng
index 4dbd36f..42a4b3c 100644
--- a/interface/web/sites/lib/lang/se_database.lng
+++ b/interface/web/sites/lib/lang/se_database.lng
@@ -18,4 +18,6 @@
$wb['limit_database_txt'] = 'The max. number of databases is reached.';
$wb['database_name_change_txt'] = 'The database name can not be changed';
$wb['database_charset_change_txt'] = 'The database charset can not be changed';
+$wb['remote_ips_txt'] = 'Remote Access IPs (separate by , and leave blank for <i>any</i>)';
+$wb['database_remote_error_ips'] = 'At least one of the entered ip addresses is invalid.';
?>
diff --git a/interface/web/sites/lib/lang/se_ftp_user.lng b/interface/web/sites/lib/lang/se_ftp_user.lng
index 7ebbcc4..df48d9a 100644
--- a/interface/web/sites/lib/lang/se_ftp_user.lng
+++ b/interface/web/sites/lib/lang/se_ftp_user.lng
@@ -22,4 +22,5 @@
$wb['uid_error_empty'] = 'GID empty.';
$wb['directory_error_empty'] = 'Directory empty.';
$wb['quota_files_unity_txt'] = 'Files';
+$wb['directory_error_notinweb'] = 'Directory not inside of web root directory.';
?>
diff --git a/interface/web/sites/lib/lang/se_web_sites_stats_list.lng b/interface/web/sites/lib/lang/se_web_sites_stats_list.lng
new file mode 100644
index 0000000..b217f80
--- /dev/null
+++ b/interface/web/sites/lib/lang/se_web_sites_stats_list.lng
@@ -0,0 +1,8 @@
+<?php
+$wb['list_head_txt'] = 'Web traffic';
+$wb['domain_txt'] = 'Domain';
+$wb['this_month_txt'] = 'This month';
+$wb['last_month_txt'] = 'Last month';
+$wb['this_year_txt'] = 'This year';
+$wb['last_year_txt'] = 'Last year';
+?>
diff --git a/interface/web/sites/lib/module.conf.php b/interface/web/sites/lib/module.conf.php
index 1992fbb..3207caf 100644
--- a/interface/web/sites/lib/module.conf.php
+++ b/interface/web/sites/lib/module.conf.php
@@ -20,9 +20,9 @@
'link' => 'sites/web_subdomain_list.php');
-$items[] = array( 'title' => "Aliasdomain",
- 'target' => 'content',
- 'link' => 'sites/web_aliasdomain_list.php');
+$items[] = array( 'title' => "Aliasdomain",
+ 'target' => 'content',
+ 'link' => 'sites/web_aliasdomain_list.php');
$module["nav"][] = array( 'title' => 'Websites',
'open' => 1,
@@ -76,6 +76,36 @@
'open' => 1,
'items' => $items);
+
+/*
+ Cron menu
+*/
+$items = array();
+
+$items[] = array( 'title' => "Cron Jobs",
+ 'target' => 'content',
+ 'link' => 'sites/cron_list.php');
+
+
+$module["nav"][] = array( 'title' => 'Cron',
+ 'open' => 1,
+ 'items' => $items);
+
+
+//**** Statistics menu
+$items = array();
+
+$items[] = array( 'title' => 'Web traffic',
+ 'target' => 'content',
+ 'link' => 'sites/web_sites_stats.php');
+
+
+$module['nav'][] = array( 'title' => 'Statistics',
+ 'open' => 1,
+ 'items' => $items);
+
+
+
// clean up
unset($items);
diff --git a/interface/web/sites/list/cron.list.php b/interface/web/sites/list/cron.list.php
new file mode 100644
index 0000000..dfa2d4b
--- /dev/null
+++ b/interface/web/sites/list/cron.list.php
@@ -0,0 +1,152 @@
+<?php
+
+/*
+ Datatypes:
+ - INTEGER
+ - DOUBLE
+ - CURRENCY
+ - VARCHAR
+ - TEXT
+ - DATE
+*/
+
+
+
+// Name of the list
+$liste["name"] = "cron";
+
+// Database table
+$liste["table"] = "cron";
+
+// Index index field of the database table
+$liste["table_idx"] = "id";
+
+// Search Field Prefix
+$liste["search_prefix"] = "search_";
+
+// Records per page
+$liste["records_per_page"] = 15;
+
+// Script File of the list
+$liste["file"] = "cron_list.php";
+
+// Script file of the edit form
+$liste["edit_file"] = "cron_edit.php";
+
+// Script File of the delete script
+$liste["delete_file"] = "cron_del.php";
+
+// Paging Template
+$liste["paging_tpl"] = "templates/paging.tpl.htm";
+
+// Enable auth
+$liste["auth"] = "yes";
+
+
+/*****************************************************
+* Suchfelder
+*****************************************************/
+
+
+$liste["item"][] = array( 'field' => "active",
+ 'datatype' => "VARCHAR",
+ 'formtype' => "SELECT",
+ 'op' => "=",
+ 'prefix' => "",
+ 'suffix' => "",
+ 'width' => "",
+ 'value' => array('y' => "<div id=\"ir-Yes\" class=\"swap\"><span>Yes</span></div>",'n' => "<div class=\"swap\" id=\"ir-No\"><span>No</span></div>"));
+
+
+$liste["item"][] = array( 'field' => "server_id",
+ 'datatype' => "VARCHAR",
+ 'formtype' => "SELECT",
+ 'op' => "like",
+ 'prefix' => "%",
+ 'suffix' => "%",
+ 'datasource' => array ( 'type' => 'SQL',
+ 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} ORDER BY server_name',
+ 'keyfield'=> 'server_id',
+ 'valuefield'=> 'server_name'
+ ),
+ 'width' => "",
+ 'value' => "");
+
+$liste["item"][] = array( 'field' => "parent_domain_id",
+ 'datatype' => "VARCHAR",
+ 'formtype' => "SELECT",
+ 'op' => "like",
+ 'prefix' => "%",
+ 'suffix' => "%",
+ 'datasource' => array ( 'type' => 'SQL',
+ 'querystring' => "SELECT domain_id,domain FROM web_domain WHERE type = 'vhost' AND {AUTHSQL} ORDER BY domain",
+ 'keyfield'=> 'domain_id',
+ 'valuefield'=> 'domain'
+ ),
+ 'width' => "",
+ 'value' => "");
+
+$liste["item"][] = array( 'field' => "run_min",
+ 'datatype' => "VARCHAR",
+ 'formtype' => "TEXT",
+ 'op' => "=",
+ 'prefix' => "",
+ 'suffix' => "",
+ 'width' => "",
+ 'value' => "");
+
+$liste["item"][] = array( 'field' => "run_hour",
+ 'datatype' => "VARCHAR",
+ 'formtype' => "TEXT",
+ 'op' => "=",
+ 'prefix' => "",
+ 'suffix' => "",
+ 'width' => "",
+ 'value' => "");
+
+$liste["item"][] = array( 'field' => "run_mday",
+ 'datatype' => "VARCHAR",
+ 'formtype' => "TEXT",
+ 'op' => "=",
+ 'prefix' => "",
+ 'suffix' => "",
+ 'width' => "",
+ 'value' => "");
+
+$liste["item"][] = array( 'field' => "run_month",
+ 'datatype' => "VARCHAR",
+ 'formtype' => "TEXT",
+ 'op' => "=",
+ 'prefix' => "",
+ 'suffix' => "",
+ 'width' => "",
+ 'value' => "");
+
+$liste["item"][] = array( 'field' => "run_wday",
+ 'datatype' => "VARCHAR",
+ 'formtype' => "TEXT",
+ 'op' => "=",
+ 'prefix' => "",
+ 'suffix' => "",
+ 'width' => "",
+ 'value' => "");
+
+
+$liste["item"][] = array( 'field' => "command",
+ 'datatype' => "VARCHAR",
+ 'formtype' => "TEXT",
+ 'op' => "like",
+ 'prefix' => "%",
+ 'suffix' => "%",
+ 'width' => "",
+ 'value' => "");
+
+
+
+
+
+
+
+
+
+?>
\ No newline at end of file
diff --git a/interface/web/sites/list/web_sites_stats.list.php b/interface/web/sites/list/web_sites_stats.list.php
new file mode 100644
index 0000000..0824ba9
--- /dev/null
+++ b/interface/web/sites/list/web_sites_stats.list.php
@@ -0,0 +1,60 @@
+<?php
+
+/*
+ Datatypes:
+ - INTEGER
+ - DOUBLE
+ - CURRENCY
+ - VARCHAR
+ - TEXT
+ - DATE
+*/
+
+
+
+// Name of the list
+$liste["name"] = "web_sites_stats";
+
+// Database table
+$liste["table"] = "web_domain";
+
+// Index index field of the database table
+$liste["table_idx"] = "domain_id";
+
+// Search Field Prefix
+$liste["search_prefix"] = "search_";
+
+// Records per page
+$liste["records_per_page"] = 15;
+
+// Script File of the list
+$liste["file"] = "web_sites_stats.php";
+
+// Script file of the edit form
+$liste["edit_file"] = "web_domain_edit.php";
+
+// Script File of the delete script
+$liste["delete_file"] = "web_domain_del.php";
+
+// Paging Template
+$liste["paging_tpl"] = "templates/paging.tpl.htm";
+
+// Enable auth
+$liste["auth"] = "yes";
+
+
+/*****************************************************
+* Suchfelder
+*****************************************************/
+
+$liste["item"][] = array( 'field' => "domain",
+ 'datatype' => "VARCHAR",
+ 'formtype' => "TEXT",
+ 'op' => "like",
+ 'prefix' => "%",
+ 'suffix' => "%",
+ 'width' => "",
+ 'value' => "");
+
+
+?>
\ No newline at end of file
diff --git a/interface/web/sites/shell_user_edit.php b/interface/web/sites/shell_user_edit.php
index 8c92732..422c8a1 100644
--- a/interface/web/sites/shell_user_edit.php
+++ b/interface/web/sites/shell_user_edit.php
@@ -56,17 +56,11 @@
// we will check only users, not admins
if($_SESSION["s"]["user"]["typ"] == 'user') {
-
- // Get the limits of the client
- $client_group_id = $_SESSION["s"]["user"]["default_group"];
- $client = $app->db->queryOneRecord("SELECT limit_shell_user FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-
- // Check if the user may add another shell user.
- if($client["limit_shell_user"] >= 0) {
- $tmp = $app->db->queryOneRecord("SELECT count(shell_user_id) as number FROM shell_user WHERE sys_groupid = $client_group_id");
- if($tmp["number"] >= $client["limit_shell_user"]) {
- $app->error($app->tform->wordbook["limit_shell_user_txt"]);
- }
+ if(!$app->tform->checkClientLimit('limit_shell_user')) {
+ $app->error($app->tform->wordbook["limit_shell_user_txt"]);
+ }
+ if(!$app->tform->checkResellerLimit('limit_shell_user')) {
+ $app->error('Reseller: '.$app->tform->wordbook["limit_shell_user_txt"]);
}
}
@@ -115,6 +109,9 @@
// Set a few fixed values
$this->dataRecord["server_id"] = $parent_domain["server_id"];
+ if(isset($this->dataRecord['username']) && trim($this->dataRecord['username']) == '') $app->tform->errorMessage .= $app->tform->lng('username_error_empty').'<br />';
+ if(isset($this->dataRecord['username']) && empty($this->dataRecord['parent_domain_id'])) $app->tform->errorMessage .= $app->tform->lng('parent_domain_id_error_empty').'<br />';
+
parent::onSubmit();
}
@@ -129,7 +126,7 @@
}
}
unset($blacklist);
-
+
/*
* If the names should be restricted -> do it!
*/
diff --git a/interface/web/sites/templates/cron_edit.htm b/interface/web/sites/templates/cron_edit.htm
new file mode 100644
index 0000000..39f9bc6
--- /dev/null
+++ b/interface/web/sites/templates/cron_edit.htm
@@ -0,0 +1,68 @@
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_cron">
+
+ <div class="pnl_formsarea">
+ <fieldset class="inlineLabels"><legend>Cron Job</legend>
+ <div class="ctrlHolder">
+ <tmpl_if name="edit_disabled">
+ <label for="parent_domain_id">{tmpl_var name='parent_domain_id_txt'}</label>
+ <select name="parent_domain_id" id="parent_domain_id" class="selectInput" disabled="disabled">
+ {tmpl_var name='parent_domain_id'}
+ </select>
+ <input type="hidden" name="parent_domain_id" value="{tmpl_var name='parent_domain_id_value'}" />
+ <tmpl_else>
+ <label for="parent_domain_id">{tmpl_var name='parent_domain_id_txt'}</label>
+ <select name="parent_domain_id" id="parent_domain_id" class="selectInput">
+ {tmpl_var name='parent_domain_id'}
+ </select>
+ </tmpl_if>
+ </div>
+ <div class="ctrlHolder">
+ <label for="run_min">{tmpl_var name='run_min_txt'}</label>
+ <input name="run_min" id="run_min" value="{tmpl_var name='run_min'}" size="10" maxlength="255" type="text" class="textInput" />
+ <p class="formHint">e.g. *, */3, 10-20</p>
+ </div>
+ <div class="ctrlHolder">
+ <label for="run_hour">{tmpl_var name='run_hour_txt'}</label>
+ <input name="run_hour" id="run_hour" value="{tmpl_var name='run_hour'}" size="10" maxlength="255" type="text" class="textInput" />
+ <p class="formHint">e.g. *, */2, 0, 10-12</p>
+ </div>
+ <div class="ctrlHolder">
+ <label for="run_mday">{tmpl_var name='run_mday_txt'}</label>
+ <input name="run_mday" id="run_mday" value="{tmpl_var name='run_mday'}" size="10" maxlength="255" type="text" class="textInput" />
+ <p class="formHint">e.g. *, */4, 1-5</p>
+ </div>
+ <div class="ctrlHolder">
+ <label for="run_month">{tmpl_var name='run_month_txt'}</label>
+ <input name="run_month" id="run_month" value="{tmpl_var name='run_month'}" size="10" maxlength="255" type="text" class="textInput" />
+ <p class="formHint">e.g. *, 1-6</p>
+ </div>
+ <div class="ctrlHolder">
+ <label for="run_wday">{tmpl_var name='run_wday_txt'}</label>
+ <input name="run_wday" id="run_wday" value="{tmpl_var name='run_wday'}" size="10" maxlength="255" type="text" class="textInput" />
+ <p class="formHint">e.g. *, 0, 1-5</p>
+ </div>
+ <div class="ctrlHolder">
+ <label for="command">{tmpl_var name='command_txt'}</label>
+ <input name="command" id="command" value="{tmpl_var name='command'}" size="30" maxlength="255" type="text" class="textInput" />
+ <p class="formHint">e.g. /var/www/clients/client1/myscript.sh or http://www.mydomain.com/path/script.php</p>
+ </div>
+ <div class="ctrlHolder">
+ <p class="label">{tmpl_var name='active_txt'}</p>
+ <div class="multiField">
+ {tmpl_var name='active'}
+ </div>
+ </div>
+ </fieldset>
+
+ <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','sites/cron_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('sites/cron_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+ </div>
+ </div>
+
+</div>
diff --git a/interface/web/sites/templates/cron_list.htm b/interface/web/sites/templates/cron_list.htm
new file mode 100644
index 0000000..e2e8ca9
--- /dev/null
+++ b/interface/web/sites/templates/cron_list.htm
@@ -0,0 +1,71 @@
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_list_cron">
+
+ <div class="pnl_toolsarea">
+ <fieldset><legend>Tools</legend>
+ <div class="buttons">
+ <button class="iconstxt icoAdd" type="button" onClick="loadContent('sites/cron_edit.php');">
+ <span>{tmpl_var name="add_new_cron_txt"}</span>
+ </button>
+ </div>
+ </fieldset>
+ </div>
+
+ <div class="pnl_listarea">
+ <fieldset><legend><tmpl_var name="list_head_txt"></legend>
+ <table class="list">
+ <thead>
+ <tr>
+ <th class="tbl_col_active" scope="col"><tmpl_var name="active_txt"></th>
+ <th class="tbl_col_server_id" scope="col"><tmpl_var name="server_id_txt"></th>
+ <th class="tbl_col_run_min" scope="col"><tmpl_var name="run_min_txt"></th>
+ <th class="tbl_col_run_hour" scope="col"><tmpl_var name="run_hour_txt"></th>
+ <th class="tbl_col_run_mday" scope="col"><tmpl_var name="run_mday_txt"></th>
+ <th class="tbl_col_run_month" scope="col"><tmpl_var name="run_month_txt"></th>
+ <th class="tbl_col_run_wday" scope="col"><tmpl_var name="run_wday_txt"></th>
+ <th class="tbl_col_command" scope="col"><tmpl_var name="command_txt"></th>
+ <th class="tbl_col_buttons" scope="col"> </th>
+ </tr>
+ <tr>
+ <td class="tbl_col_active"><select name="search_active" onChange="submitForm('pageForm','sites/cron_list.php');">{tmpl_var name='search_active'}</select></td>
+ <td class="tbl_col_server_id"><select name="search_server_id" onChange="submitForm('pageForm','sites/cron_list.php');">{tmpl_var name='search_server_id'}</select></td>
+ <td class="tbl_col_run_min"><input type="text" name="search_run_min" size="3" value="{tmpl_var name='search_run_min'}" /></td>
+ <td class="tbl_col_run_hour"><input type="text" name="search_run_hour" size="3" value="{tmpl_var name='search_run_hour'}" /></td>
+ <td class="tbl_col_run_mday"><input type="text" name="search_run_mday" size="3" value="{tmpl_var name='search_run_mday'}" /></td>
+ <td class="tbl_col_run_month"><input type="text" name="search_run_month" size="3" value="{tmpl_var name='search_run_month'}" /></td>
+ <td class="tbl_col_run_wday"><input type="text" name="search_run_wday" size="3" value="{tmpl_var name='search_run_wday'}" /></td>
+ <td class="tbl_col_command"><input type="text" name="search_command" value="{tmpl_var name='search_command'}" /></td>
+ <td class="tbl_col_buttons"><div class="buttons"><button type="button" class="icons16 icoFilter" name="Filter" id="Filter" value="{tmpl_var name="filter_txt"}" onClick="submitForm('pageForm','sites/cron_list.php');"><span>{tmpl_var name="filter_txt"}</span></button></div></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_active"><a href="#" onClick="loadContent('sites/cron_edit.php?id={tmpl_var name='id'}');"><img src="themes/{tmpl_var name='theme'}/icons/{tmpl_var name='_active_'}" border="0" /></a></td>
+ <td class="tbl_col_server_id"><a href="#" onClick="loadContent('sites/cron_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="server_id"}</a></td>
+ <td class="tbl_col_run_min"><a href="#" onClick="loadContent('sites/cron_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="run_min"}</a></td>
+ <td class="tbl_col_run_hour"><a href="#" onClick="loadContent('sites/cron_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="run_hour"}</a></td>
+ <td class="tbl_col_run_mday"><a href="#" onClick="loadContent('sites/cron_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="run_mday"}</a></td>
+ <td class="tbl_col_run_month"><a href="#" onClick="loadContent('sites/cron_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="run_month"}</a></td>
+ <td class="tbl_col_run_wday"><a href="#" onClick="loadContent('sites/cron_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="run_wday"}</a></td>
+ <td class="tbl_col_commnd"><a href="#" onClick="loadContent('sites/cron_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="command"}</a></td>
+ <td class="tbl_col_buttons">
+ <div class="buttons icons16">
+ <a class="icons16 icoDelete" href="javascript: del_record('sites/cron_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>
+ </div>
+ </td>
+ </tr>
+ </tmpl_loop>
+ </tbody>
+ <tfoot>
+ <tr>
+ <td class="tbl_footer tbl_paging" colspan="9"><tmpl_var name="paging"></td>
+ </tr>
+ </tfoot>
+ </table>
+ </fieldset>
+ </div>
+
+</div>
diff --git a/interface/web/sites/templates/database_edit.htm b/interface/web/sites/templates/database_edit.htm
index cb982f3..da5ffec 100644
--- a/interface/web/sites/templates/database_edit.htm
+++ b/interface/web/sites/templates/database_edit.htm
@@ -80,11 +80,15 @@
</tmpl_if>
</div>
<div class="ctrlHolder">
- <p class="label">{tmpl_var name='remote_access_txt'}</p>
- <div class="multiField">
- {tmpl_var name='remote_access'}
- </div>
- </div>
+ <p class="label">{tmpl_var name='remote_access_txt'}</p>
+ <div class="multiField">
+ {tmpl_var name='remote_access'}
+ </div>
+ </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" />
+ </div>
<div class="ctrlHolder">
<p class="label">{tmpl_var name='active_txt'}</p>
<div class="multiField">
diff --git a/interface/web/sites/templates/ftp_user_advanced_client.htm b/interface/web/sites/templates/ftp_user_advanced_client.htm
new file mode 100644
index 0000000..fd8d617
--- /dev/null
+++ b/interface/web/sites/templates/ftp_user_advanced_client.htm
@@ -0,0 +1,22 @@
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_ftp_user">
+
+ <div class="pnl_formsarea">
+ <fieldset class="inlineLabels">
+ <div class="ctrlHolder">
+ <label for="dir">{tmpl_var name='dir_txt'}</label>
+ <input name="dir" id="dir" value="{tmpl_var name='dir'}" size="30" maxlength="255" type="text" class="textInput" />
+ </div>
+ </fieldset>
+
+ <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','sites/ftp_user_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('sites/ftp_user_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+ </div>
+ </div>
+
+</div>
diff --git a/interface/web/sites/templates/web_sites_stats_list.htm b/interface/web/sites/templates/web_sites_stats_list.htm
new file mode 100644
index 0000000..84a9b97
--- /dev/null
+++ b/interface/web/sites/templates/web_sites_stats_list.htm
@@ -0,0 +1,52 @@
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_list_web_sites_stats">
+
+ <div class="pnl_listarea">
+ <fieldset><legend><tmpl_var name="list_head_txt"></legend>
+ <table class="list">
+ <thead>
+ <tr>
+ <th class="tbl_col_domain" scope="col"><tmpl_var name="domain_txt"></th>
+ <th class="tbl_col_this_month" scope="col"><tmpl_var name="this_month_txt"></th>
+ <th class="tbl_col_last_month" scope="col"><tmpl_var name="last_month_txt"></th>
+ <th class="tbl_col_this_year" scope="col"><tmpl_var name="this_year_txt"></th>
+ <th class="tbl_col_last_year" scope="col"><tmpl_var name="last_year_txt"></th>
+ <th class="tbl_col_buttons" scope="col"> </th>
+ </tr>
+ <tr>
+ <td class="tbl_col_domain"><input type="text" name="search_domain" value="{tmpl_var name='search_domain'}" /></td>
+ <td class="tbl_col_this_month"></td>
+ <td class="tbl_col_last_month"></td>
+ <td class="tbl_col_this_year"></td>
+ <td class="tbl_col_last_year"></td>
+ <td class="tbl_col_buttons"><div class="buttons"><button type="button" class="icons16 icoFilter" name="Filter" id="Filter" value="{tmpl_var name="filter_txt"}" onClick="submitForm('pageForm','sites/web_sites_stats.php');"><span>{tmpl_var name="filter_txt"}</span></button></div></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_domain"><a href="#" onClick="loadContent('sites/web_domain_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="domain"}</a></td>
+ <td class="tbl_col_this_month"><a href="#" onClick="loadContent('sites/web_domain_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="this_month"} kB</a></td>
+ <td class="tbl_col_last_month"><a href="#" onClick="loadContent('sites/web_domain_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="last_month"} kB</a></td>
+ <td class="tbl_col_this_year"><a href="#" onClick="loadContent('sites/web_domain_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="this_year"} kB</a></td>
+ <td class="tbl_col_last_year"><a href="#" onClick="loadContent('sites/web_domain_edit.php?id={tmpl_var name='id'}');">{tmpl_var name="last_year"} kB</a></td>
+ <td class="tbl_col_buttons">
+ <div class="buttons icons16">
+ </div>
+ </td>
+ </tr>
+ </tmpl_loop>
+ </tbody>
+
+ <tfoot>
+ <tr>
+ <td class="tbl_footer tbl_paging" colspan="6"><tmpl_var name="paging"></td>
+ </tr>
+ </tfoot>
+ </table>
+ </fieldset>
+ </div>
+
+</div>
diff --git a/interface/web/sites/web_aliasdomain_edit.php b/interface/web/sites/web_aliasdomain_edit.php
index 0f86b62..1fdd8fe 100644
--- a/interface/web/sites/web_aliasdomain_edit.php
+++ b/interface/web/sites/web_aliasdomain_edit.php
@@ -57,17 +57,11 @@
// we will check only users, not admins
if($_SESSION["s"]["user"]["typ"] == 'user') {
-
- // Get the limits of the client
- $client_group_id = $_SESSION["s"]["user"]["default_group"];
- $client = $app->db->queryOneRecord("SELECT limit_web_aliasdomain FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-
- // Check if the user may add another maildomain.
- if($client["limit_web_aliasdomain"] >= 0) {
- $tmp = $app->db->queryOneRecord("SELECT count(domain_id) as number FROM web_domain WHERE sys_groupid = $client_group_id and type = 'alias'");
- if($tmp["number"] >= $client["limit_web_aliasdomain"]) {
- $app->error($app->tform->wordbook["limit_web_aliasdomain_txt"]);
- }
+ if(!$app->tform->checkClientLimit('limit_web_aliasdomain',"type = 'alias'")) {
+ $app->error($app->tform->wordbook["limit_web_aliasdomain_txt"]);
+ }
+ if(!$app->tform->checkResellerLimit('limit_web_aliasdomain',"type = 'alias'")) {
+ $app->error('Reseller: '.$app->tform->wordbook["limit_web_aliasdomain_txt"]);
}
}
diff --git a/interface/web/sites/web_domain_del.php b/interface/web/sites/web_domain_del.php
index 867d1f4..e5614cf 100644
--- a/interface/web/sites/web_domain_del.php
+++ b/interface/web/sites/web_domain_del.php
@@ -72,6 +72,12 @@
foreach($records as $rec) {
$app->db->datalogDelete('shell_user','shell_user_id',$rec['shell_user_id']);
}
+
+ // Delete all records that belog to this zone.
+ $records = $app->db->queryAllRecords("SELECT id FROM cron WHERE parent_domain_id = '".intval($this->id)."'");
+ foreach($records as $rec) {
+ $app->db->datalogDelete('cron','id',$rec['id']);
+ }
}
}
diff --git a/interface/web/sites/web_domain_edit.php b/interface/web/sites/web_domain_edit.php
index d9d210f..7878e82 100644
--- a/interface/web/sites/web_domain_edit.php
+++ b/interface/web/sites/web_domain_edit.php
@@ -55,17 +55,11 @@
// we will check only users, not admins
if($_SESSION["s"]["user"]["typ"] == 'user') {
-
- // Get the limits of the client
- $client_group_id = $_SESSION["s"]["user"]["default_group"];
- $client = $app->db->queryOneRecord("SELECT limit_web_domain FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-
- // Check if the user may add another website.
- if($client["limit_web_domain"] >= 0) {
- $tmp = $app->db->queryOneRecord("SELECT count(domain_id) as number FROM web_domain WHERE sys_groupid = $client_group_id and type = 'vhost'");
- if($tmp["number"] >= $client["limit_web_domain"]) {
- $app->error($app->tform->wordbook["limit_web_domain_txt"]);
- }
+ if(!$app->tform->checkClientLimit('limit_web_domain',"type = 'vhost'")) {
+ $app->error($app->tform->wordbook["limit_web_domain_txt"]);
+ }
+ if(!$app->tform->checkResellerLimit('limit_web_domain',"type = 'vhost'")) {
+ $app->error('Reseller: '.$app->tform->wordbook["limit_web_domain_txt"]);
}
}
@@ -109,7 +103,7 @@
// Get the limits of the client
$client_group_id = $_SESSION["s"]["user"]["default_group"];
- $client = $app->db->queryOneRecord("SELECT client.client_id, limit_web_domain, default_webserver 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, limit_web_domain, default_webserver, client.contact_name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
// Set the webserver to the default server of the client
$tmp = $app->db->queryOneRecord("SELECT server_name FROM server WHERE server_id = $client[default_webserver]");
@@ -119,7 +113,7 @@
// Fill the client select field
$sql = "SELECT groupid, name 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);
- $client_select = '';
+ $client_select = '<option value="'.$client['client_id'].'">'.$client['contact_name'].'</option>';
if(is_array($clients)) {
foreach( $clients as $client) {
$selected = @($client["groupid"] == $this->dataRecord["sys_groupid"])?'SELECTED':'';
@@ -207,7 +201,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_web_domain, default_webserver 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_web_domain, default_webserver, parent_client_id 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) {
@@ -294,6 +288,16 @@
}
unset($rec);
}
+ //* If the user is neither admin nor reseller
+ } else {
+ //* We do not allow users to change a domain which has been created by the admin
+ $rec = $app->db->queryOneRecord("SELECT domain from web_domain WHERE domain_id = ".$this->id);
+ if(isset($this->dataRecord["domain"]) && $rec['domain'] != $this->dataRecord["domain"] && $app->tform->checkPerm($this->id,'u')) {
+ //* Add a error message and switch back to old server
+ $app->tform->errorMessage .= $app->lng('The Domain can not be changed. Please ask your Administrator if you want to change the domain name.');
+ $this->dataRecord["domain"] = $rec['domain'];
+ }
+ unset($rec);
}
//* Check that all fields for the SSL cert creation are filled
@@ -342,10 +346,10 @@
// Set the values for document_root, system_user and system_group
$system_user = 'web'.$this->id;
$system_group = 'client'.$client_id;
- //$document_root = str_replace("[client_id]",$client_id,$document_root);
+ $document_root = str_replace("[client_id]",$client_id,$document_root);
- // $sql = "UPDATE web_domain SET system_user = '$system_user', system_group = '$system_group', document_root = '$document_root' WHERE domain_id = ".$this->id;
- $sql = "UPDATE web_domain SET system_user = '$system_user', system_group = '$system_group' WHERE domain_id = ".$this->id;
+ $sql = "UPDATE web_domain SET system_user = '$system_user', system_group = '$system_group', document_root = '$document_root' WHERE domain_id = ".$this->id;
+ //$sql = "UPDATE web_domain SET system_user = '$system_user', system_group = '$system_group' WHERE domain_id = ".$this->id;
$app->db->query($sql);
}
diff --git a/interface/web/sites/web_sites_stats.php b/interface/web/sites/web_sites_stats.php
new file mode 100644
index 0000000..ee8fd58
--- /dev/null
+++ b/interface/web/sites/web_sites_stats.php
@@ -0,0 +1,64 @@
+<?php
+require_once('../../lib/config.inc.php');
+require_once('../../lib/app.inc.php');
+
+/******************************************
+* Begin Form configuration
+******************************************/
+
+$list_def_file = "list/web_sites_stats.list.php";
+
+/******************************************
+* End Form configuration
+******************************************/
+
+//* Check permissions for module
+$app->auth->check_module_permissions('sites');
+
+$app->load('listform_actions');
+
+class list_action extends listform_actions {
+
+ function prepareDataRow($rec)
+ {
+ global $app;
+
+ $rec = $app->listform->decode($rec);
+
+ //* Alternating datarow colors
+ $this->DataRowColor = ($this->DataRowColor == '#FFFFFF') ? '#EEEEEE' : '#FFFFFF';
+ $rec['bgcolor'] = $this->DataRowColor;
+
+ //* Set the statistics colums
+ //** Traffic of the current month
+ $tmp_year = date('Y');
+ $tmp_month = date('m');
+ $tmp_rec = $app->db->queryOneRecord("SELECT SUM(traffic_bytes) as t FROM web_traffic WHERE hostname = '".$rec['domain']."' AND YEAR(traffic_date) = '$tmp_year' AND MONTH(traffic_date) = '$tmp_month'");
+ $rec['this_month'] = number_format(intval($tmp_rec['t'])/1024, 0, '.', ' ');
+
+ //** Traffic of the current year
+ $tmp_rec = $app->db->queryOneRecord("SELECT sum(traffic_bytes) as t FROM web_traffic WHERE hostname = '".$rec['domain']."' AND YEAR(traffic_date) = '$tmp_year'");
+ $rec['this_year'] = number_format(intval($tmp_rec['t'])/1024, 0, '.', ' ');
+
+ //** Traffic of the 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")));
+ $tmp_rec = $app->db->queryOneRecord("SELECT sum(traffic_bytes) as t FROM web_traffic WHERE hostname = '".$rec['domain']."' AND YEAR(traffic_date) = '$tmp_year' AND MONTH(traffic_date) = '$tmp_month'");
+ $rec['last_month'] = number_format(intval($tmp_rec['t'])/1024, 0, '.', ' ');
+
+ //** Traffic of the last year
+ $tmp_year = date('Y',mktime(0, 0, 0, date("m"), date("d"), date("Y")-1));
+ $tmp_rec = $app->db->queryOneRecord("SELECT sum(traffic_bytes) as t FROM web_traffic WHERE hostname = '".$rec['domain']."' AND YEAR(traffic_date) = '$tmp_year'");
+ $rec['last_year'] = number_format(intval($tmp_rec['t'])/1024, 0, '.', ' ');
+
+ //* The variable "id" contains always the index variable
+ $rec['id'] = $rec[$this->idx_key];
+ return $rec;
+ }
+}
+
+$list = new list_action;
+$list->onLoad();
+
+
+?>
\ No newline at end of file
diff --git a/interface/web/sites/web_subdomain_edit.php b/interface/web/sites/web_subdomain_edit.php
index 3dd2f64..2858e34 100644
--- a/interface/web/sites/web_subdomain_edit.php
+++ b/interface/web/sites/web_subdomain_edit.php
@@ -57,17 +57,11 @@
// we will check only users, not admins
if($_SESSION["s"]["user"]["typ"] == 'user') {
-
- // Get the limits of the client
- $client_group_id = $_SESSION["s"]["user"]["default_group"];
- $client = $app->db->queryOneRecord("SELECT limit_web_subdomain FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-
- // Check if the user may add another maildomain.
- if($client["limit_web_subdomain"] >= 0) {
- $tmp = $app->db->queryOneRecord("SELECT count(domain_id) as number FROM web_domain WHERE sys_groupid = $client_group_id and type = 'subdomain'");
- if($tmp["number"] >= $client["limit_web_subdomain"]) {
- $app->error($app->tform->wordbook["limit_web_subdomain_txt"]);
- }
+ if(!$app->tform->checkClientLimit('limit_web_subdomain',"type = 'subdomain'")) {
+ $app->error($app->tform->wordbook["limit_web_subdomain_txt"]);
+ }
+ if(!$app->tform->checkResellerLimit('limit_web_subdomain',"type = 'subdomain'")) {
+ $app->error('Reseller: '.$app->tform->wordbook["limit_web_subdomain_txt"]);
}
}
diff --git a/interface/web/strengthmeter/lib/lang/br_strengthmeter.lng b/interface/web/strengthmeter/lib/lang/br_strengthmeter.lng
new file mode 100644
index 0000000..b7641dd
--- /dev/null
+++ b/interface/web/strengthmeter/lib/lang/br_strengthmeter.lng
@@ -0,0 +1,9 @@
+<?php
+$wb['password_strength_0_txt'] = 'Muito Curto';
+$wb['password_strength_1_txt'] = 'Fraco';
+$wb['password_strength_2_txt'] = 'Rasoável';
+$wb['password_strength_3_txt'] = 'Bom';
+$wb['password_strength_4_txt'] = 'Forte';
+$wb['password_strength_5_txt'] = 'Muito Forte';
+?>
+
diff --git a/interface/web/tools/lib/lang/br.lng b/interface/web/tools/lib/lang/br.lng
new file mode 100644
index 0000000..0dab14b
--- /dev/null
+++ b/interface/web/tools/lib/lang/br.lng
@@ -0,0 +1,7 @@
+<?php
+$wb['User Settings'] = 'Configurações do Usuário';
+$wb['Settings'] = 'Configurações';
+$wb['ISPConfig Tools'] = 'Ferramentas';
+$wb['Password and Language'] = 'Senha e Idioma';
+?>
+
diff --git a/interface/web/tools/lib/lang/br_usersettings.lng b/interface/web/tools/lib/lang/br_usersettings.lng
new file mode 100644
index 0000000..8aaa6f1
--- /dev/null
+++ b/interface/web/tools/lib/lang/br_usersettings.lng
@@ -0,0 +1,9 @@
+<?php
+$wb['passwort_txt'] = 'Senha';
+$wb['password_strength_txt'] = 'Segurança de Senha';
+$wb['language_txt'] = 'Idioma';
+$wb['password_mismatch'] = 'As senhas não conhecidem';
+$wb['Form to edit the user password and language.'] = 'Formulário para alterar idioma e senha';
+$wb['Settings'] = 'Configurações';
+?>
+
diff --git a/server/conf/apache_ispconfig.conf.master b/server/conf/apache_ispconfig.conf.master
index a851b6e..7db2a48 100644
--- a/server/conf/apache_ispconfig.conf.master
+++ b/server/conf/apache_ispconfig.conf.master
@@ -4,7 +4,7 @@
################################################
LogFormat "%v %h %l %u %t \"%r\" %>s %B \"%{Referer}i\" \"%{User-Agent}i\"" combined_ispconfig
-CustomLog "| /usr/sbin/vlogger -s access.log -t \"%Y%m%d-access.log\" /var/log/ispconfig/httpd" combined_ispconfig
+CustomLog "| /usr/local/ispconfig/server/scripts/vlogger -s access.log -t \"%Y%m%d-access.log\" -d \"/etc/vlogger-dbi.conf\" /var/log/ispconfig/httpd" combined_ispconfig
<Directory /var/www/clients>
AllowOverride None
diff --git a/server/conf/php-fcgi-starter.master b/server/conf/php-fcgi-starter.master
index 9920c4e..c3676ba 100644
--- a/server/conf/php-fcgi-starter.master
+++ b/server/conf/php-fcgi-starter.master
@@ -7,4 +7,8 @@
export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=<tmpl_var name='php_fcgi_max_requests'>
export PHP_FCGI_MAX_REQUESTS
-exec <tmpl_var name='php_fcgi_bin'> $1
\ No newline at end of file
+exec <tmpl_var name='php_fcgi_bin'> \
+<tmpl_if name="security_level" op="==" value="20"> -d open_basedir=<tmpl_var name='document_root'> \
+-d upload_tmp_dir=<tmpl_var name='document_root'>/tmp \
+-d session.save_path=<tmpl_var name='document_root'>/tmp \
+</tmpl_if> $1
\ No newline at end of file
diff --git a/server/conf/vhost.conf.master b/server/conf/vhost.conf.master
index 162fcd4..9c8bf65 100644
--- a/server/conf/vhost.conf.master
+++ b/server/conf/vhost.conf.master
@@ -1,295 +1,298 @@
-
-<Directory {tmpl_var name='web_basedir'}/{tmpl_var name='domain'}>
- AllowOverride None
- Order Deny,Allow
- Deny from all
-</Directory>
-
-<VirtualHost <tmpl_var name='ip_address'>:80>
-<tmpl_if name='php' op='==' value='suphp'>
- DocumentRoot <tmpl_var name='web_document_root'>
-</tmpl_else>
- <tmpl_if name='php' op='==' value='cgi'>
- DocumentRoot <tmpl_var name='web_document_root'>
- </tmpl_else>
- DocumentRoot <tmpl_var name='web_document_root_www'>
- </tmpl_if>
-</tmpl_if>
-
- ServerName <tmpl_var name='domain'>
-<tmpl_if name='alias'>
- ServerAlias <tmpl_var name='alias'>
-</tmpl_if>
- ServerAdmin webmaster@<tmpl_var name='domain'>
-
- ErrorLog /var/log/ispconfig/httpd/<tmpl_var name='domain'>/error.log
-<tmpl_if name='errordocs'>
-
- ErrorDocument 400 /error/400.html
- ErrorDocument 401 /error/401.html
- ErrorDocument 403 /error/403.html
- ErrorDocument 404 /error/404.html
- ErrorDocument 405 /error/405.html
- ErrorDocument 500 /error/500.html
- ErrorDocument 503 /error/503.html
-</tmpl_if>
-
- <Directory {tmpl_var name='web_document_root_www'}>
- Options FollowSymLinks
- AllowOverride Indexes AuthConfig Limit FileInfo
- Order allow,deny
- Allow from all
-<tmpl_if name='ssi' op='==' value='y'>
-
- # ssi enabled
- AddType text/html .shtml
- AddOutputFilter INCLUDES .shtml
- Options +Includes
-</tmpl_if>
-<tmpl_if name='php' op='==' value='no'>
- <Files ~ '.php[s3-6]{0,1}$'>
- Order allow,deny
- Deny from all
- Allow from none
- </Files>
-</tmpl_if>
- </Directory>
- <Directory {tmpl_var name='web_document_root'}>
- Options FollowSymLinks
- AllowOverride Indexes AuthConfig Limit FileInfo
- Order allow,deny
- Allow from all
-<tmpl_if name='ssi' op='==' value='y'>
-
- # ssi enabled
- AddType text/html .shtml
- AddOutputFilter INCLUDES .shtml
- Options +Includes
-</tmpl_if>
-<tmpl_if name='php' op='==' value='no'>
- <Files ~ '.php[s3-6]{0,1}$'>
- Order allow,deny
- Deny from all
- Allow from none
- </Files>
-</tmpl_if>
- </Directory>
-
-<tmpl_if name='cgi' op='==' value='y'>
- # cgi enabled
- <Directory {tmpl_var name='document_root'}/cgi-bin>
- Order allow,deny
- Allow from all
- </Directory>
- ScriptAlias /cgi-bin/ <tmpl_var name='document_root'>/cgi-bin/
- AddHandler cgi-script .cgi
- AddHandler cgi-script .pl
-</tmpl_if>
-<tmpl_if name='suexec' op='==' value='y'>
- # suexec enabled
- SuexecUserGroup <tmpl_var name='system_user'> <tmpl_var name='system_group'>
-</tmpl_if>
-<tmpl_if name='php' op='==' value='mod'>
- # mod_php enabled
- AddType application/x-httpd-php .php .php3 .php4 .php5
- php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -fwebmaster@<tmpl_var name='domain'>"
- php_admin_value upload_tmp_dir <tmpl_var name='document_root'>/tmp
- php_admin_value session.save_path <tmpl_var name='document_root'>/tmp
- #php_admin_value open_basedir <tmpl_var name='document_root'>:/usr/share/php5
-</tmpl_if>
-<tmpl_if name='php' op='==' value='suphp'>
- # suphp enabled
- <Directory {tmpl_var name='web_document_root'}>
- suPHP_Engine on
- # suPHP_UserGroup <tmpl_var name='system_user'> <tmpl_var name='system_group'>
- AddHandler x-httpd-suphp .php .php3 .php4 .php5
- suPHP_AddHandler x-httpd-suphp
- </Directory>
-</tmpl_if>
-<tmpl_if name='php' op='==' value='cgi'>
- # php as cgi enabled
- ScriptAlias /php5-cgi <tmpl_var name='cgi_starter_path'><tmpl_var name='cgi_starter_script'>
- Action php5-cgi /php5-cgi
- AddHandler php5-cgi .php .php3 .php4 .php5
- <Directory {tmpl_var name='cgi_starter_path'}>
- Order allow,deny
- Allow from all
- </Directory>
-</tmpl_if>
-<tmpl_if name='php' op='==' value='fast-cgi'>
- # php as fast-cgi enabled
- <Directory {tmpl_var name='web_document_root_www'}>
- AddHandler fcgid-script .php .php3 .php4 .php5
- FCGIWrapper <tmpl_var name='fastcgi_starter_path'><tmpl_var name='fastcgi_starter_script'> .php
- Options +ExecCGI
- AllowOverride all
- Order allow,deny
- Allow from all
- </Directory>
-</tmpl_if>
-<tmpl_if name="rewrite_enabled">
-
- RewriteEngine on
-<tmpl_loop name="redirects">
- RewriteCond %{HTTP_HOST} ^<tmpl_var name='rewrite_domain'> [NC]
- RewriteRule ^/(.*)$ <tmpl_var name='rewrite_target'>$1 <tmpl_var name='rewrite_type'>
-</tmpl_loop>
-</tmpl_if>
-
-<tmpl_var name='apache_directives'>
-</VirtualHost>
-
-
-
-<tmpl_if name='ssl_enabled'>
-<IfModule mod_ssl.c>
-###########################################################
-# SSL Vhost
-###########################################################
-
-<VirtualHost <tmpl_var name='ip_address'>:443>
-<tmpl_if name='php' op='==' value='suphp'>
- DocumentRoot <tmpl_var name='web_document_root'>
-</tmpl_else>
- <tmpl_if name='php' op='==' value='cgi'>
- DocumentRoot <tmpl_var name='web_document_root'>
- </tmpl_else>
- DocumentRoot <tmpl_var name='web_document_root_www'>
- </tmpl_if>
-</tmpl_if>
-
- ServerName <tmpl_var name='domain'>
-<tmpl_if name='alias'>
- ServerAlias <tmpl_var name='alias'>
-</tmpl_if>
- ServerAdmin webmaster@<tmpl_var name='domain'>
-
- ErrorLog /var/log/ispconfig/httpd/<tmpl_var name='domain'>/error.log
-
-<tmpl_if name='errordocs'>
- ErrorDocument 400 /error/400.html
- ErrorDocument 401 /error/401.html
- ErrorDocument 403 /error/403.html
- ErrorDocument 404 /error/404.html
- ErrorDocument 405 /error/405.html
- ErrorDocument 500 /error/500.html
- ErrorDocument 503 /error/503.html
-
-</tmpl_if>
- SSLEngine on
- SSLCertificateFile <tmpl_var name='document_root'>/ssl/<tmpl_var name='domain'>.crt
- SSLCertificateKeyFile <tmpl_var name='document_root'>/ssl/<tmpl_var name='domain'>.key
-<tmpl_if name='has_bundle_cert'>
- SSLCACertificateFile <tmpl_var name='document_root'>/ssl/<tmpl_var name='domain'>.bundle
-</tmpl_if>
-
- <Directory {tmpl_var name='web_document_root_www'}>
- Options FollowSymLinks
- AllowOverride Indexes AuthConfig Limit FileInfo
- Order allow,deny
- Allow from all
-<tmpl_if name='ssi' op='==' value='y'>
-
- # ssi enabled
- AddType text/html .shtml
- AddOutputFilter INCLUDES .shtml
- Options +Includes
-</tmpl_if>
-<tmpl_if name='php' op='==' value='no'>
- <Files ~ '.php[s3-6]{0,1}$'>
- Order allow,deny
- Deny from all
- Allow from none
- </Files>
-</tmpl_if>
- </Directory>
- <Directory {tmpl_var name='web_document_root'}>
- Options FollowSymLinks
- AllowOverride Indexes AuthConfig Limit FileInfo
- Order allow,deny
- Allow from all
-<tmpl_if name='ssi' op='==' value='y'>
-
- # ssi enabled
- AddType text/html .shtml
- AddOutputFilter INCLUDES .shtml
- Options +Includes
-</tmpl_if>
-<tmpl_if name='php' op='==' value='no'>
- <Files ~ '.php[s3-6]{0,1}$'>
- Order allow,deny
- Deny from all
- Allow from none
- </Files>
-</tmpl_if>
- </Directory>
-
-<tmpl_if name='cgi' op='==' value='y'>
- # cgi enabled
- <Directory {tmpl_var name='document_root'}/cgi-bin>
- Order allow,deny
- Allow from all
- </Directory>
- ScriptAlias /cgi-bin/ <tmpl_var name='document_root'>/cgi-bin/
- AddHandler cgi-script .cgi
- AddHandler cgi-script .pl
-</tmpl_if>
-<tmpl_if name='ssi'op='==' value='y'>
- # ssi enabled
- AddType text/html .shtml
- AddOutputFilter INCLUDES .shtml
-</tmpl_if>
-<tmpl_if name='suexec'op='==' value='y'>
- # suexec enabled
- SuexecUserGroup <tmpl_var name='system_user'> <tmpl_var name='system_group'>
-</tmpl_if>
-<tmpl_if name='php' op='==' value='mod'>
- # mod_php enabled
- AddType application/x-httpd-php .php .php3 .php4 .php5
- php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -fwebmaster@<tmpl_var name='domain'>"
- php_admin_value upload_tmp_dir <tmpl_var name='document_root'>/tmp
- php_admin_value session.save_path <tmpl_var name='document_root'>/tmp
- #php_admin_value open_basedir <tmpl_var name='document_root'>:/usr/share/php5
-</tmpl_if>
-<tmpl_if name='php' op='==' value='suphp'>
- # suphp enabled
- suPHP_Engine on
- # suPHP_UserGroup <tmpl_var name='system_user'> <tmpl_var name='system_group'>
- AddHandler x-httpd-php .php .php3 .php4 .php5
- suPHP_AddHandler x-httpd-php
-</tmpl_if>
-<tmpl_if name='php' op='==' value='cgi'>
- # php as cgi enabled
- ScriptAlias /php5-cgi <tmpl_var name='cgi_starter_path'><tmpl_var name='cgi_starter_script'>
- Action php5-cgi /php5-cgi
- AddHandler php5-cgi .php .php3 .php4 .php5
- <Directory {tmpl_var name='cgi_starter_path'}>
- Order allow,deny
- Allow from all
- </Directory>
-</tmpl_if>
-<tmpl_if name='php' op='==' value='fast-cgi'>
- # php as fast-cgi enabled
- <Directory {tmpl_var name='web_document_root_www'}>
- AddHandler fcgid-script .php .php3 .php4 .php5
- FCGIWrapper <tmpl_var name='fastcgi_starter_path'><tmpl_var name='fastcgi_starter_script'> .php
- Options +ExecCGI
- AllowOverride all
- Order allow,deny
- Allow from all
- </Directory>
-</tmpl_if>
-<tmpl_if name="rewrite_enabled">
-
- RewriteEngine on
-<tmpl_loop name="redirects">
- RewriteCond %{HTTP_HOST} ^<tmpl_var name='rewrite_domain'> [NC]
- RewriteRule ^/(.*)$ <tmpl_var name='rewrite_target'>$1 <tmpl_var name='rewrite_type'>
-</tmpl_loop>
-</tmpl_if>
-
-<tmpl_var name='apache_directives'>
-</VirtualHost>
-</IfModule>
-
+
+<Directory {tmpl_var name='web_basedir'}/{tmpl_var name='domain'}>
+ AllowOverride None
+ Order Deny,Allow
+ Deny from all
+</Directory>
+
+<VirtualHost <tmpl_var name='ip_address'>:80>
+<tmpl_if name='php' op='==' value='suphp'>
+ DocumentRoot <tmpl_var name='web_document_root'>
+</tmpl_else>
+ <tmpl_if name='php' op='==' value='cgi'>
+ DocumentRoot <tmpl_var name='web_document_root'>
+ </tmpl_else>
+ DocumentRoot <tmpl_var name='web_document_root_www'>
+ </tmpl_if>
+</tmpl_if>
+
+ ServerName <tmpl_var name='domain'>
+<tmpl_if name='alias'>
+ <tmpl_var name='alias'>
+</tmpl_if>
+ ServerAdmin webmaster@<tmpl_var name='domain'>
+
+ ErrorLog /var/log/ispconfig/httpd/<tmpl_var name='domain'>/error.log
+<tmpl_if name='errordocs'>
+
+ ErrorDocument 400 /error/400.html
+ ErrorDocument 401 /error/401.html
+ ErrorDocument 403 /error/403.html
+ ErrorDocument 404 /error/404.html
+ ErrorDocument 405 /error/405.html
+ ErrorDocument 500 /error/500.html
+ ErrorDocument 503 /error/503.html
+</tmpl_if>
+
+ <Directory {tmpl_var name='web_document_root_www'}>
+ Options FollowSymLinks
+ AllowOverride Indexes AuthConfig Limit FileInfo
+ Order allow,deny
+ Allow from all
+<tmpl_if name='ssi' op='==' value='y'>
+
+ # ssi enabled
+ AddType text/html .shtml
+ AddOutputFilter INCLUDES .shtml
+ Options +Includes
+</tmpl_if>
+<tmpl_if name='php' op='==' value='no'>
+ <Files ~ '.php[s3-6]{0,1}$'>
+ Order allow,deny
+ Deny from all
+ Allow from none
+ </Files>
+</tmpl_if>
+ </Directory>
+ <Directory {tmpl_var name='web_document_root'}>
+ Options FollowSymLinks
+ AllowOverride Indexes AuthConfig Limit FileInfo
+ Order allow,deny
+ Allow from all
+<tmpl_if name='ssi' op='==' value='y'>
+
+ # ssi enabled
+ AddType text/html .shtml
+ AddOutputFilter INCLUDES .shtml
+ Options +Includes
+</tmpl_if>
+<tmpl_if name='php' op='==' value='no'>
+ <Files ~ '.php[s3-6]{0,1}$'>
+ Order allow,deny
+ Deny from all
+ Allow from none
+ </Files>
+</tmpl_if>
+ </Directory>
+
+<tmpl_if name='cgi' op='==' value='y'>
+ # cgi enabled
+ <Directory {tmpl_var name='document_root'}/cgi-bin>
+ Order allow,deny
+ Allow from all
+ </Directory>
+ ScriptAlias /cgi-bin/ <tmpl_var name='document_root'>/cgi-bin/
+ AddHandler cgi-script .cgi
+ AddHandler cgi-script .pl
+</tmpl_if>
+<tmpl_if name='suexec' op='==' value='y'>
+ # suexec enabled
+ SuexecUserGroup <tmpl_var name='system_user'> <tmpl_var name='system_group'>
+</tmpl_if>
+<tmpl_if name='php' op='==' value='mod'>
+ # mod_php enabled
+ AddType application/x-httpd-php .php .php3 .php4 .php5
+ php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -fwebmaster@<tmpl_var name='domain'>"
+ php_admin_value upload_tmp_dir <tmpl_var name='document_root'>/tmp
+ php_admin_value session.save_path <tmpl_var name='document_root'>/tmp
+<tmpl_if name='security_level' op='==' value='20'>
+ php_admin_value open_basedir <tmpl_var name='document_root'>/web:<tmpl_var name='document_root'>/tmp:/usr/share/php5
+</tmpl_if>
+</tmpl_if>
+<tmpl_if name='php' op='==' value='suphp'>
+ # suphp enabled
+ <Directory {tmpl_var name='web_document_root'}>
+ suPHP_Engine on
+ # suPHP_UserGroup <tmpl_var name='system_user'> <tmpl_var name='system_group'>
+ AddHandler x-httpd-suphp .php .php3 .php4 .php5
+ suPHP_AddHandler x-httpd-suphp
+ </Directory>
+</tmpl_if>
+<tmpl_if name='php' op='==' value='cgi'>
+ # php as cgi enabled
+ ScriptAlias /php5-cgi <tmpl_var name='cgi_starter_path'><tmpl_var name='cgi_starter_script'>
+ Action php5-cgi /php5-cgi
+ AddHandler php5-cgi .php .php3 .php4 .php5
+ <Directory {tmpl_var name='cgi_starter_path'}>
+ Order allow,deny
+ Allow from all
+ </Directory>
+</tmpl_if>
+<tmpl_if name='php' op='==' value='fast-cgi'>
+ # php as fast-cgi enabled
+ <Directory {tmpl_var name='web_document_root_www'}>
+ AddHandler fcgid-script .php .php3 .php4 .php5
+ FCGIWrapper <tmpl_var name='fastcgi_starter_path'><tmpl_var name='fastcgi_starter_script'> .php
+ Options +ExecCGI
+ AllowOverride all
+ Order allow,deny
+ Allow from all
+ </Directory>
+</tmpl_if>
+<tmpl_if name="rewrite_enabled">
+
+ RewriteEngine on
+<tmpl_loop name="redirects">
+ RewriteCond %{HTTP_HOST} ^<tmpl_var name='rewrite_domain'> [NC]
+ RewriteRule ^/(.*)$ <tmpl_var name='rewrite_target'>$1 <tmpl_var name='rewrite_type'>
+</tmpl_loop>
+</tmpl_if>
+
+<tmpl_var name='apache_directives'>
+</VirtualHost>
+
+
+
+<tmpl_if name='ssl_enabled'>
+<IfModule mod_ssl.c>
+###########################################################
+# SSL Vhost
+###########################################################
+
+<VirtualHost <tmpl_var name='ip_address'>:443>
+<tmpl_if name='php' op='==' value='suphp'>
+ DocumentRoot <tmpl_var name='web_document_root'>
+</tmpl_else>
+ <tmpl_if name='php' op='==' value='cgi'>
+ DocumentRoot <tmpl_var name='web_document_root'>
+ </tmpl_else>
+ DocumentRoot <tmpl_var name='web_document_root_www'>
+ </tmpl_if>
+</tmpl_if>
+
+ ServerName <tmpl_var name='domain'>
+<tmpl_if name='alias'>
+ <tmpl_var name='alias'>
+</tmpl_if>
+ ServerAdmin webmaster@<tmpl_var name='domain'>
+
+ ErrorLog /var/log/ispconfig/httpd/<tmpl_var name='domain'>/error.log
+
+<tmpl_if name='errordocs'>
+ ErrorDocument 400 /error/400.html
+ ErrorDocument 401 /error/401.html
+ ErrorDocument 403 /error/403.html
+ ErrorDocument 404 /error/404.html
+ ErrorDocument 405 /error/405.html
+ ErrorDocument 500 /error/500.html
+ ErrorDocument 503 /error/503.html
+
+</tmpl_if>
+ SSLEngine on
+ SSLCertificateFile <tmpl_var name='document_root'>/ssl/<tmpl_var name='domain'>.crt
+ SSLCertificateKeyFile <tmpl_var name='document_root'>/ssl/<tmpl_var name='domain'>.key
+<tmpl_if name='has_bundle_cert'>
+ SSLCACertificateFile <tmpl_var name='document_root'>/ssl/<tmpl_var name='domain'>.bundle
+</tmpl_if>
+
+ <Directory {tmpl_var name='web_document_root_www'}>
+ Options FollowSymLinks
+ AllowOverride Indexes AuthConfig Limit FileInfo
+ Order allow,deny
+ Allow from all
+<tmpl_if name='ssi' op='==' value='y'>
+
+ # ssi enabled
+ AddType text/html .shtml
+ AddOutputFilter INCLUDES .shtml
+ Options +Includes
+</tmpl_if>
+<tmpl_if name='php' op='==' value='no'>
+ <Files ~ '.php[s3-6]{0,1}$'>
+ Order allow,deny
+ Deny from all
+ Allow from none
+ </Files>
+</tmpl_if>
+ </Directory>
+ <Directory {tmpl_var name='web_document_root'}>
+ Options FollowSymLinks
+ AllowOverride Indexes AuthConfig Limit FileInfo
+ Order allow,deny
+ Allow from all
+<tmpl_if name='ssi' op='==' value='y'>
+
+ # ssi enabled
+ AddType text/html .shtml
+ AddOutputFilter INCLUDES .shtml
+ Options +Includes
+</tmpl_if>
+<tmpl_if name='php' op='==' value='no'>
+ <Files ~ '.php[s3-6]{0,1}$'>
+ Order allow,deny
+ Deny from all
+ Allow from none
+ </Files>
+</tmpl_if>
+ </Directory>
+
+<tmpl_if name='cgi' op='==' value='y'>
+ # cgi enabled
+ <Directory {tmpl_var name='document_root'}/cgi-bin>
+ Order allow,deny
+ Allow from all
+ </Directory>
+ ScriptAlias /cgi-bin/ <tmpl_var name='document_root'>/cgi-bin/
+ AddHandler cgi-script .cgi
+ AddHandler cgi-script .pl
+</tmpl_if>
+<tmpl_if name='ssi'op='==' value='y'>
+ # ssi enabled
+ AddType text/html .shtml
+ AddOutputFilter INCLUDES .shtml
+</tmpl_if>
+<tmpl_if name='suexec'op='==' value='y'>
+ # suexec enabled
+ SuexecUserGroup <tmpl_var name='system_user'> <tmpl_var name='system_group'>
+</tmpl_if>
+<tmpl_if name='php' op='==' value='mod'>
+ # mod_php enabled
+ AddType application/x-httpd-php .php .php3 .php4 .php5
+ php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -fwebmaster@<tmpl_var name='domain'>"
+ php_admin_value upload_tmp_dir <tmpl_var name='document_root'>/tmp
+ php_admin_value session.save_path <tmpl_var name='document_root'>/tmp
+<tmpl_if name='security_level' op='==' value='20'>
+ php_admin_value open_basedir <tmpl_var name='document_root'>/web:<tmpl_var name='document_root'>/tmp:/usr/share/php5
+</tmpl_if>
+</tmpl_if>
+<tmpl_if name='php' op='==' value='suphp'>
+ suPHP_Engine on
+ # suPHP_UserGroup <tmpl_var name='system_user'> <tmpl_var name='system_group'>
+ AddHandler x-httpd-suphp .php .php3 .php4 .php5
+ suPHP_AddHandler x-httpd-suphp
+</tmpl_if>
+<tmpl_if name='php' op='==' value='cgi'>
+ # php as cgi enabled
+ ScriptAlias /php5-cgi <tmpl_var name='cgi_starter_path'><tmpl_var name='cgi_starter_script'>
+ Action php5-cgi /php5-cgi
+ AddHandler php5-cgi .php .php3 .php4 .php5
+ <Directory {tmpl_var name='cgi_starter_path'}>
+ Order allow,deny
+ Allow from all
+ </Directory>
+</tmpl_if>
+<tmpl_if name='php' op='==' value='fast-cgi'>
+ # php as fast-cgi enabled
+ <Directory {tmpl_var name='web_document_root_www'}>
+ AddHandler fcgid-script .php .php3 .php4 .php5
+ FCGIWrapper <tmpl_var name='fastcgi_starter_path'><tmpl_var name='fastcgi_starter_script'> .php
+ Options +ExecCGI
+ AllowOverride all
+ Order allow,deny
+ Allow from all
+ </Directory>
+</tmpl_if>
+<tmpl_if name="rewrite_enabled">
+
+ RewriteEngine on
+<tmpl_loop name="redirects">
+ RewriteCond %{HTTP_HOST} ^<tmpl_var name='rewrite_domain'> [NC]
+ RewriteRule ^/(.*)$ <tmpl_var name='rewrite_target'>$1 <tmpl_var name='rewrite_type'>
+</tmpl_loop>
+</tmpl_if>
+
+<tmpl_var name='apache_directives'>
+</VirtualHost>
+</IfModule>
+
</tmpl_if>
diff --git a/server/cron_daily.php b/server/cron_daily.php
index f696688..2cac46c 100644
--- a/server/cron_daily.php
+++ b/server/cron_daily.php
@@ -68,7 +68,7 @@
$tstamp = date("Y-m");
$sql = "SELECT * FROM mail_traffic WHERE month = '$tstamp' AND mailuser_id = ".$rec["mailuser_id"];
- $tr = $app->db->queryOneRecord($sql);
+ $tr = $app->dbmaster->queryOneRecord($sql);
$mail_traffic += $tr["traffic"];
if($tr["traffic_id"] > 0) {
@@ -76,7 +76,7 @@
} else {
$sql = "INSERT INTO mail_traffic (month,mailuser_id,traffic) VALUES ('$tstamp',".$rec["mailuser_id"].",$mail_traffic)";
}
- $app->db->query($sql);
+ $app->dbmaster->query($sql);
echo $sql;
}
diff --git a/server/mods-available/cron_module.inc.php b/server/mods-available/cron_module.inc.php
new file mode 100644
index 0000000..778585c
--- /dev/null
+++ b/server/mods-available/cron_module.inc.php
@@ -0,0 +1,97 @@
+<?php
+
+/*
+Copyright (c) 2007, Till Brehm, projektfarm Gmbh
+Modified 2009, Marius Cramer, pixcept KG
+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.
+*/
+
+class cron_module {
+
+ var $module_name = 'cron_module';
+ var $class_name = 'cron_module';
+ var $actions_available = array( 'cron_insert',
+ 'cron_update',
+ 'cron_delete');
+
+ //* This function is called during ispconfig installation to determine
+ // if a symlink shall be created for this plugin.
+ function onInstall() {
+ global $conf;
+
+ return true;
+
+ }
+
+ /*
+ This function is called when the module is loaded
+ */
+
+ function onLoad() {
+ global $app;
+
+ /*
+ Annonce the actions that where provided by this module, so plugins
+ can register on them.
+ */
+
+ $app->plugins->announceEvents($this->module_name,$this->actions_available);
+
+ /*
+ As we want to get notified of any changes on several database tables,
+ we register for them.
+
+ The following function registers the function "functionname"
+ to be executed when a record for the table "dbtable" is
+ processed in the sys_datalog. "classname" is the name of the
+ class that contains the function functionname.
+ */
+
+ $app->modules->registerTableHook('cron',$this->module_name,'process');
+
+ }
+
+ /*
+ This function is called when a change in one of the registered tables is detected.
+ The function then raises the events for the plugins.
+ */
+
+ function process($tablename,$action,$data) {
+ global $app;
+
+ switch ($tablename) {
+ case 'cron':
+ if($action == 'i') $app->plugins->raiseEvent('cron_insert',$data);
+ if($action == 'u') $app->plugins->raiseEvent('cron_update',$data);
+ if($action == 'd') $app->plugins->raiseEvent('cron_delete',$data);
+ break;
+ } // end switch
+ } // end function
+
+
+} // end class
+
+?>
\ No newline at end of file
diff --git a/server/mods-available/monitor_core_module.inc.php b/server/mods-available/monitor_core_module.inc.php
index 9a26e83..4452fd1 100644
--- a/server/mods-available/monitor_core_module.inc.php
+++ b/server/mods-available/monitor_core_module.inc.php
@@ -698,7 +698,7 @@
function monitorRkHunter(){
/*
- * This monitoring is expensive, so do it only once a hour
+ * This monitoring is expensive, so do it only once a day
*/
$min = date('i');
$hour = date('H');
diff --git a/server/mods-available/web_module.inc.php b/server/mods-available/web_module.inc.php
index 9a3f85e..1e7bde7 100644
--- a/server/mods-available/web_module.inc.php
+++ b/server/mods-available/web_module.inc.php
@@ -80,7 +80,8 @@
*/
$app->modules->registerTableHook('web_domain','web_module','process');
- $app->modules->registerTableHook('shell_user','web_module','process');
+ $app->modules->registerTableHook('ftp_user','web_module','process');
+ $app->modules->registerTableHook('shell_user','web_module','process');
// Register service
$app->services->registerService('httpd','web_module','restartHttpd');
diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php
index 96be08b..1a962ec 100644
--- a/server/plugins-available/apache2_plugin.inc.php
+++ b/server/plugins-available/apache2_plugin.inc.php
@@ -146,8 +146,12 @@
@unlink($rand_file);
$ssl_request = file_get_contents($csr_file);
$ssl_cert = file_get_contents($crt_file);
+ /* Update the DB of the (local) Server */
$app->db->query("UPDATE web_domain SET ssl_request = '$ssl_request', ssl_cert = '$ssl_cert' WHERE domain = '".$data["new"]["domain"]."'");
$app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'");
+ /* Update also the master-DB of the Server-Farm */
+ $app->dbmaster->query("UPDATE web_domain SET ssl_request = '$ssl_request', ssl_cert = '$ssl_cert' WHERE domain = '".$data["new"]["domain"]."'");
+ $app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'");
}
//* Save a SSL certificate to disk
@@ -160,7 +164,10 @@
file_put_contents($csr_file,$data["new"]["ssl_request"]);
file_put_contents($crt_file,$data["new"]["ssl_cert"]);
if(trim($data["new"]["ssl_bundle"]) != '') file_put_contents($bundle_file,$data["new"]["ssl_bundle"]);
+ /* Update the DB of the (local) Server */
$app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'");
+ /* Update also the master-DB of the Server-Farm */
+ $app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'");
$app->log("Saving SSL Cert for: $domain",LOGLEVEL_DEBUG);
}
@@ -174,7 +181,12 @@
unlink($csr_file);
unlink($crt_file);
unlink($bundle_file);
+ /* Update the DB of the (local) Server */
+ $app->db->query("UPDATE web_domain SET ssl_request = '', ssl_cert = '' WHERE domain = '".$data["new"]["domain"]."'");
$app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'");
+ /* Update also the master-DB of the Server-Farm */
+ $app->dbmaster->query("UPDATE web_domain SET ssl_request = '', ssl_cert = '' WHERE domain = '".$data["new"]["domain"]."'");
+ $app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data["new"]["domain"]."'");
$app->log("Deleting SSL Cert for: $domain",LOGLEVEL_DEBUG);
}
@@ -249,7 +261,7 @@
// Remove trailing slash
if(substr($tmp_symlink, -1, 1) == '/') $tmp_symlink = substr($tmp_symlink, 0, -1);
// create the symlinks, if not exist
- if(!is_link($tmp_symlink)) {
+ if(is_link($tmp_symlink)) {
exec("rm -f ".escapeshellcmd($tmp_symlink));
$app->log("Removed Symlink: rm -f ".$tmp_symlink,LOGLEVEL_DEBUG);
}
@@ -431,7 +443,7 @@
$username = escapeshellcmd($data["new"]["system_user"]);
if($data["new"]["system_user"] != '' && !$app->system->is_user($data["new"]["system_user"])) {
- exec("useradd -d ".escapeshellcmd($data["new"]["document_root"])." -g $groupname $username -s /bin/false");
+ exec("useradd -d ".escapeshellcmd($data["new"]["document_root"])." -g $groupname -G sshusers $username -s /bin/false");
$app->log("Adding the user: $username",LOGLEVEL_DEBUG);
}
@@ -447,7 +459,6 @@
exec("setquota -T -u $username 604800 604800 -a &> /dev/null");
}
-
if($this->action == 'insert') {
// Chown and chmod the directories below the document root
exec("chown -R $username:$groupname ".escapeshellcmd($data["new"]["document_root"]));
@@ -456,8 +467,35 @@
exec("chown root:root ".escapeshellcmd($data["new"]["document_root"]));
}
- // make temp direcory writable for the apache user and the website user
- exec("chmod 777 ".escapeshellcmd($data["new"]["document_root"]."/tmp"));
+
+
+ // If the security level is set to high
+ if($web_config['security_level'] == 20) {
+
+ exec("chmod 711 ".escapeshellcmd($data["new"]["document_root"]."/"));
+ exec("chmod 711 ".escapeshellcmd($data["new"]["document_root"])."/*");
+ exec("chmod 710 ".escapeshellcmd($data["new"]["document_root"]."/web"));
+
+ // make temp direcory writable for the apache user and the website user
+ exec("chmod 777 ".escapeshellcmd($data["new"]["document_root"]."/tmp"));
+
+ $command = 'usermod';
+ $command .= ' --groups sshusers';
+ $command .= ' '.escapeshellcmd($data["new"]["system_user"]);
+ exec($command);
+
+ //* add the apache user to the client group
+ $app->system->add_user_to_group($groupname, escapeshellcmd($web_config['user']));
+
+ // If the security Level is set to medium
+ } else {
+
+ exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/"));
+ exec("chmod 755 ".escapeshellcmd($data["new"]["document_root"]."/*"));
+
+ // make temp direcory writable for the apache user and the website user
+ exec("chmod 777 ".escapeshellcmd($data["new"]["document_root"]."/tmp"));
+ }
// Create the vhost config file
@@ -470,6 +508,7 @@
$vhost_data["web_document_root"] = $data["new"]["document_root"]."/web";
$vhost_data["web_document_root_www"] = $web_config["website_basedir"]."/".$data["new"]["domain"]."/web";
$vhost_data["web_basedir"] = $web_config["website_basedir"];
+ $vhost_data["security_level"] = $web_config["security_level"];
// Check if a SSL cert exists
$ssl_dir = $data["new"]["document_root"]."/ssl";
@@ -494,6 +533,7 @@
// Rewrite rules
$rewrite_rules = array();
if($data["new"]["redirect_type"] != '') {
+ if(substr($data["new"]["redirect_path"],-1) != '/') $data["new"]["redirect_path"] .= '/';
$rewrite_rules[] = array( 'rewrite_domain' => $data["new"]["domain"],
'rewrite_type' => ($data["new"]["redirect_type"] == 'no')?'':'['.$data["new"]["redirect_type"].']',
'rewrite_target' => $data["new"]["redirect_path"]);
@@ -515,30 +555,32 @@
// get alias domains (co-domains and subdomains)
$aliases = $app->db->queryAllRecords("SELECT * FROM web_domain WHERE parent_domain_id = ".$data["new"]["domain_id"]." AND active = 'y'");
- switch($data["new"]["subdomain"]) {
+ $server_alias = array();
+ switch($data["new"]["subdomain"]) {
case 'www':
- $server_alias .= 'www.'.$data["new"]["domain"].' ';
+ $server_alias[] .= 'www.'.$data["new"]["domain"].' ';
break;
case '*':
- $server_alias .= '*.'.$data["new"]["domain"].' ';
+ $server_alias[] .= '*.'.$data["new"]["domain"].' ';
break;
}
if(is_array($aliases)) {
foreach($aliases as $alias) {
switch($alias["subdomain"]) {
case 'www':
- $server_alias .= 'www.'.$alias["domain"].' '.$alias["domain"].' ';
+ $server_alias[] .= 'www.'.$alias["domain"].' '.$alias["domain"].' ';
break;
case '*':
- $server_alias .= '*.'.$alias["domain"].' '.$alias["domain"].' ';
+ $server_alias[] .= '*.'.$alias["domain"].' '.$alias["domain"].' ';
break;
default:
- $server_alias .= $alias["domain"].' ';
+ $server_alias[] .= $alias["domain"].' ';
break;
}
$app->log("Add server alias: $alias[domain]",LOGLEVEL_DEBUG);
// Rewriting
if($alias["redirect_type"] != '') {
+ if(substr($data["new"]["redirect_path"],-1) != '/') $data["new"]["redirect_path"] .= '/';
$rewrite_rules[] = array( 'rewrite_domain' => $alias["domain"],
'rewrite_type' => ($alias["redirect_type"] == 'no')?'':'['.$alias["redirect_type"].']',
'rewrite_target' => $alias["redirect_path"]);
@@ -558,7 +600,24 @@
}
}
}
- $tpl->setVar('alias',trim($server_alias));
+
+ //* If we have some alias records
+ if(count($server_alias) > 0) {
+ $server_alias_str = '';
+ $n = 0;
+
+ // begin a new ServerAlias line after 30 alias domains
+ foreach($server_alias as $tmp_alias) {
+ if($n % 30 == 0) $server_alias_str .= "\n ServerAlias ";
+ $server_alias_str .= $tmp_alias;
+ }
+ unset($tmp_alias);
+
+ $tpl->setVar('alias',trim($server_alias_str));
+ } else {
+ $tpl->setVar('alias','');
+ }
+
if(count($rewrite_rules) > 0) {
$tpl->setVar('rewrite_enabled',1);
} else {
@@ -599,6 +658,7 @@
$fcgi_tpl->setVar('php_fcgi_children',$fastcgi_config["fastcgi_children"]);
$fcgi_tpl->setVar('php_fcgi_max_requests',$fastcgi_config["fastcgi_max_requests"]);
$fcgi_tpl->setVar('php_fcgi_bin',$fastcgi_config["fastcgi_bin"]);
+ $fcgi_tpl->setVar('security_level',$web_config["security_level"]);
$fcgi_starter_script = escapeshellcmd($fastcgi_starter_path.$fastcgi_config["fastcgi_starter_script"]);
file_put_contents($fcgi_starter_script,$fcgi_tpl->grab());
@@ -650,6 +710,7 @@
// This will NOT work!
//$cgi_tpl->setVar('open_basedir', "/var/www/" . $data["new"]["domain"]);
$cgi_tpl->setVar('php_cgi_bin',$cgi_config["cgi_bin"]);
+ $cgi_tpl->setVar('security_level',$web_config["security_level"]);
$cgi_starter_script = escapeshellcmd($cgi_starter_path.$cgi_config["cgi_starter_script"]);
file_put_contents($cgi_starter_script,$cgi_tpl->grab());
@@ -695,7 +756,7 @@
}
//* Create .htaccess and .htpasswd file for website statistics
- if(!is_file($data["new"]["document_root"].'/web/stats/.htaccess')) {
+ if(!is_file($data["new"]["document_root"].'/web/stats/.htaccess') or $data["old"]["document_root"] != $data["new"]["document_root"]) {
if(!is_dir($data["new"]["document_root"].'/web/stats')) mkdir($data["new"]["document_root"].'/web/stats');
$ht_file = "AuthType Basic\nAuthName \"Members Only\"\nAuthUserFile ".$data["new"]["document_root"]."/.htpasswd_stats\n<limit GET PUT POST>\nrequire valid-user\n</limit>";
file_put_contents($data["new"]["document_root"].'/web/stats/.htaccess',$ht_file);
@@ -717,6 +778,9 @@
// request a httpd reload when all records have been processed
$app->services->restartServiceDelayed('httpd','reload');
+ //* Unset action to clean it for next processed vhost.
+ $this->action = '';
+
}
function delete($event_name,$data) {
diff --git a/server/plugins-available/cron_jailkit_plugin.inc.php b/server/plugins-available/cron_jailkit_plugin.inc.php
new file mode 100644
index 0000000..fc19db6
--- /dev/null
+++ b/server/plugins-available/cron_jailkit_plugin.inc.php
@@ -0,0 +1,272 @@
+<?php
+
+/*
+Copyright (c) 2007, Till Brehm, projektfarm Gmbh
+Modified 2009, Marius Cramer, pixcept KG
+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.
+*/
+
+class cron_jailkit_plugin {
+
+ //* $plugin_name and $class_name have to be the same then the name of this class
+ var $plugin_name = 'cron_jailkit_plugin';
+ var $class_name = 'cron_jailkit_plugin';
+
+ //* This function is called during ispconfig installation to determine
+ // if a symlink shall be created for this plugin.
+ function onInstall() {
+ global $conf;
+
+ if($conf['services']['web'] == true) {
+ return true;
+ } else {
+ return false;
+ }
+
+ }
+
+
+ /*
+ This function is called when the plugin is loaded
+ */
+
+ function onLoad() {
+ global $app;
+
+ /*
+ Register for the events
+ */
+
+ $app->plugins->registerEvent('cron_insert', $this->plugin_name, 'insert');
+ $app->plugins->registerEvent('cron_update', $this->plugin_name, 'update');
+ $app->plugins->registerEvent('cron_delete', $this->plugin_name, 'delete');
+
+ }
+
+ //* This function is called, when a cron job is inserted in the database
+ function insert($event_name,$data) {
+ global $app, $conf;
+
+ if($data["new"]["parent_domain_id"] == '') {
+ $app->log("Parent domain not set",LOGLEVEL_WARN);
+ return 0;
+ }
+
+ //* get data from web
+ $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `domain` FROM `web_domain` WHERE `domain_id` = ".intval($data["new"]["parent_domain_id"]));
+ if(!$parent_domain["domain_id"]) {
+ $app->log("Parent domain not found",LOGLEVEL_WARN);
+ return 0;
+ } elseif($parent_domain["system_user"] == 'root' or $parent_domain["system_group"] == 'root') {
+ $app->log("Websites (and Crons) can not be owned by the root user or group.",LOGLEVEL_WARN);
+ return 0;
+ }
+
+ $app->uses('system');
+
+ if($app->system->is_user($parent_domain['system_user'])) {
+
+ /**
+ * Setup Jailkit Chroot System If Enabled
+ */
+ if ($data['new']['type'] == "chrooted")
+ {
+ // load the server configuration options
+ $app->uses("getconf");
+ $this->data = $data;
+ $this->app = $app;
+ $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit');
+ $this->parent_domain = $parent_domain;
+
+ $this->_setup_jailkit_chroot();
+
+ //$command .= 'usermod -U '.escapeshellcmd($parent_domain['system_user']);
+ //exec($command);
+
+ $this->_add_jailkit_user();
+ }
+
+ $app->log("Jailkit Plugin (Cron) -> insert username:".$parent_domain['system_user'],LOGLEVEL_DEBUG);
+
+ } else {
+ $app->log("Jailkit Plugin (Cron) -> insert username:".$parent_domain['system_user']." skipped, the user does not exist.",LOGLEVEL_WARN);
+ }
+
+ }
+
+ //* This function is called, when a cron job is updated in the database
+ function update($event_name,$data) {
+ global $app, $conf;
+
+ if($data["new"]["parent_domain_id"] == '') {
+ $app->log("Parent domain not set",LOGLEVEL_WARN);
+ return 0;
+ }
+ //* get data from web
+ $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `domain` FROM `web_domain` WHERE `domain_id` = ".intval($data["new"]["parent_domain_id"]));
+
+ if(!$parent_domain["domain_id"]) {
+ $app->log("Parent domain not found",LOGLEVEL_WARN);
+ return 0;
+ } elseif($parent_domain["system_user"] == 'root' or $parent_domain["system_group"] == 'root') {
+ $app->log("Websites (and Crons) can not be owned by the root user or group.",LOGLEVEL_WARN);
+ return 0;
+ }
+
+ $app->uses('system');
+
+ if($app->system->is_user($parent_domain['system_user'])) {
+
+ /**
+ * Setup Jailkit Chroot System If Enabled
+ */
+ if ($data['new']['type'] == "chrooted")
+ {
+ $app->log("Jailkit Plugin (Cron) -> setting up jail", LOGLEVEL_DEBUG);
+ // load the server configuration options
+ $app->uses("getconf");
+ $this->data = $data;
+ $this->app = $app;
+ $this->jailkit_config = $app->getconf->get_server_config($conf["server_id"], 'jailkit');
+ $this->parent_domain = $parent_domain;
+
+ $this->_setup_jailkit_chroot();
+ $this->_add_jailkit_user();
+ }
+
+ $app->log("Jailkit Plugin (Cron) -> update username:".$parent_domain['system_user'],LOGLEVEL_DEBUG);
+
+ } else {
+ $app->log("Jailkit Plugin (Cron) -> update username:".$parent_domain['system_user']." skipped, the user does not exist.",LOGLEVEL_WARN);
+ }
+
+ }
+
+ //* This function is called, when a cron job is deleted in the database
+ function delete($event_name,$data) {
+ global $app, $conf;
+
+ //* nothing to do here!
+
+ }
+
+ function _setup_jailkit_chroot()
+ {
+ //check if the chroot environment is created yet if not create it with a list of program sections from the config
+ if (!is_dir($this->parent_domain['document_root'].'/etc/jailkit'))
+ {
+ $command = '/usr/local/ispconfig/server/scripts/create_jailkit_chroot.sh';
+ $command .= ' '.escapeshellcmd($this->parent_domain['document_root']);
+ $command .= ' \''.$this->jailkit_config['jailkit_chroot_app_sections'].'\'';
+ exec($command);
+
+ $this->app->log("Added jailkit chroot with command: ".$command,LOGLEVEL_DEBUG);
+
+ //$this->_add_jailkit_programs(); // done later on
+
+ $this->app->load('tpl');
+
+ $tpl = new tpl();
+ $tpl->newTemplate("bash.bashrc.master");
+
+ $tpl->setVar('jailkit_chroot',true);
+ $tpl->setVar('domain',$this->parent_domain['domain']);
+ $tpl->setVar('home_dir',$this->_get_home_dir(""));
+
+ $bashrc = escapeshellcmd($this->parent_domain['document_root']).'/etc/bash.bashrc';
+ if(@is_file($bashrc)) exec('rm '.$bashrc);
+
+ file_put_contents($bashrc,$tpl->grab());
+ unset($tpl);
+
+ $this->app->log("Added bashrc scrpt : ".$bashrc,LOGLEVEL_DEBUG);
+
+ $tpl = new tpl();
+ $tpl->newTemplate("motd.master");
+
+ $tpl->setVar('domain',$this->parent_domain['domain']);
+
+ $motd = escapeshellcmd($this->parent_domain['document_root']).'/var/run/motd';
+ if(@is_file($motd)) exec('rm '.$motd);
+
+ file_put_contents($motd,$tpl->grab());
+
+ }
+ $this->_add_jailkit_programs();
+ }
+
+ function _add_jailkit_programs()
+ {
+ //copy over further programs and its libraries
+ $command = '/usr/local/ispconfig/server/scripts/create_jailkit_programs.sh';
+ $command .= ' '.escapeshellcmd($this->parent_domain['document_root']);
+ $command .= ' \''.$this->jailkit_config['jailkit_chroot_app_programs'].'\'';
+ exec($command);
+
+ $this->app->log("Added programs to jailkit chroot with command: ".$command,LOGLEVEL_DEBUG);
+
+ $command = '/usr/local/ispconfig/server/scripts/create_jailkit_programs.sh';
+ $command .= ' '.escapeshellcmd($this->parent_domain['document_root']);
+ $command .= ' \''.$this->jailkit_config['jailkit_chroot_cron_programs'].'\'';
+ exec($command);
+
+ $this->app->log("Added cron programs to jailkit chroot with command: ".$command,LOGLEVEL_DEBUG);
+ }
+
+ function _add_jailkit_user()
+ {
+ //add the user to the chroot
+ $jailkit_chroot_userhome = $this->_get_home_dir($this->parent_domain['system_user']);
+
+ if(!is_dir($this->parent_domain['document_root'].'/etc')) mkdir($this->parent_domain['document_root'].'/etc');
+ if(!is_file($this->parent_domain['document_root'].'/etc/passwd')) exec('touch '.$this->parent_domain['document_root'].'/etc/passwd');
+
+ // IMPORTANT!
+ // ALWAYS create the user. Even if the user was created before
+ // if we check if the user exists, then a update (no shell -> jailkit) will not work
+ // and the user has FULL ACCESS to the root of the server!
+ $command = '/usr/local/ispconfig/server/scripts/create_jailkit_user.sh';
+ $command .= ' '.escapeshellcmd($this->parent_domain['system_user']);
+ $command .= ' '.escapeshellcmd($this->parent_domain['document_root']);
+ $command .= ' '.$jailkit_chroot_userhome;
+ $command .= ' '.escapeshellcmd("/bin/bash");
+ exec($command);
+
+ $this->app->log("Added jailkit user to chroot with command: ".$command,LOGLEVEL_DEBUG);
+
+ exec("mkdir -p ".escapeshellcmd($this->parent_domain['document_root'].$jailkit_chroot_userhome));
+ }
+
+ function _get_home_dir($username)
+ {
+ return str_replace("[username]",escapeshellcmd($username),$this->jailkit_config["jailkit_chroot_home"]);
+ }
+
+
+
+} // end class
+
+?>
\ No newline at end of file
diff --git a/server/plugins-available/cron_plugin.inc.php b/server/plugins-available/cron_plugin.inc.php
new file mode 100644
index 0000000..233f2d2
--- /dev/null
+++ b/server/plugins-available/cron_plugin.inc.php
@@ -0,0 +1,239 @@
+<?php
+
+/*
+Copyright (c) 2007 - 2009, Till Brehm, projektfarm Gmbh
+Modified 2009, Marius Cramer, pixcept KG
+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.
+*/
+
+class cron_plugin {
+
+ var $plugin_name = 'cron_plugin';
+ var $class_name = 'cron_plugin';
+
+ // private variables
+ var $action = '';
+
+ //* This function is called during ispconfig installation to determine
+ // if a symlink shall be created for this plugin.
+ function onInstall() {
+ global $conf;
+
+ if($conf['services']['web'] == true) {
+ return true;
+ } else {
+ return false;
+ }
+
+ }
+
+
+ /*
+ This function is called when the plugin is loaded
+ */
+
+ function onLoad() {
+ global $app;
+
+ /*
+ Register for the events
+ */
+
+ $app->plugins->registerEvent('cron_insert',$this->plugin_name,'insert');
+ $app->plugins->registerEvent('cron_update',$this->plugin_name,'update');
+ $app->plugins->registerEvent('cron_delete',$this->plugin_name,'delete');
+
+ }
+
+ function insert($event_name,$data) {
+ global $app, $conf;
+
+ $this->action = 'insert';
+ // just run the update function
+ $this->update($event_name,$data);
+
+ }
+
+
+ function update($event_name,$data) {
+ global $app, $conf;
+
+ if($this->action != 'insert') $this->action = 'update';
+
+ // load the server configuration options
+ $app->uses("getconf");
+
+ if($data["new"]["parent_domain_id"] == '') {
+ $app->log("Parent domain not set",LOGLEVEL_WARN);
+ return 0;
+ }
+
+ //* get data from web
+ $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `hd_quota` FROM `web_domain` WHERE `domain_id` = ".intval($data["new"]["parent_domain_id"]));
+ if(!$parent_domain["domain_id"]) {
+ $app->log("Parent domain not found",LOGLEVEL_WARN);
+ return 0;
+ } elseif($parent_domain["system_user"] == 'root' or $parent_domain["system_group"] == 'root') {
+ $app->log("Websites (and Crons) can not be owned by the root user or group.",LOGLEVEL_WARN);
+ return 0;
+ }
+
+ // Get the client ID
+ $client = $app->dbmaster->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval($data["new"]["sys_groupid"]));
+ $client_id = intval($client["client_id"]);
+ unset($client);
+
+ // Create group and user, if not exist
+ $app->uses("system");
+
+ $groupname = escapeshellcmd($parent_domain["system_group"]);
+ if($parent_domain["system_group"] != '' && !$app->system->is_group($parent_domain["system_group"])) {
+ exec("groupadd $groupname");
+ $app->log("Adding the group: $groupname",LOGLEVEL_DEBUG);
+ }
+
+ $username = escapeshellcmd($parent_domain["system_user"]);
+ if($parent_domain["system_user"] != '' && !$app->system->is_user($parent_domain["system_user"])) {
+ exec("useradd -d ".escapeshellcmd($parent_domain["document_root"])." -g $groupname $username -s /bin/false");
+ $app->log("Adding the user: $username",LOGLEVEL_DEBUG);
+ }
+
+ // Set the quota for the user
+ if($username != '' && $app->system->is_user($username)) {
+ if($parent_domain["hd_quota"] > 0){
+ $blocks_soft = $parent_domain["hd_quota"] * 1024;
+ $blocks_hard = $blocks_soft + 1024;
+ } else {
+ $blocks_soft = $blocks_hard = 0;
+ }
+ exec("setquota -u $username $blocks_soft $blocks_hard 0 0 -a &> /dev/null");
+ exec("setquota -T -u $username 604800 604800 -a &> /dev/null");
+ }
+
+ // make temp direcory writable for the apache user and the website user
+ exec("chmod 777 ".escapeshellcmd($parent_domain["document_root"]."/tmp"));
+
+ /** TODO READ CRON MASTER **/
+
+ $this->parent_domain = $parent_domain;
+ $this->_write_crontab();
+
+ $this->action = '';
+
+ }
+
+ function delete($event_name,$data) {
+ global $app, $conf;
+
+ //* get data from web
+ $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `hd_quota` FROM `web_domain` WHERE `domain_id` = ".intval($data["old"]["parent_domain_id"]));
+ if(!$parent_domain["domain_id"]) {
+ $app->log("Parent domain not found",LOGLEVEL_WARN);
+ return 0;
+ }
+
+ // Get the client ID
+ $client = $app->dbmaster->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ".intval($data["old"]["sys_groupid"]));
+ $client_id = intval($client["client_id"]);
+ unset($client);
+
+ $this->parent_domain = $parent_domain;
+ $this->_write_crontab();
+ }
+
+ function _write_crontab() {
+ global $app, $conf;
+
+ //* load the server configuration options
+ $app->uses("getconf");
+
+ $cron_config = $app->getconf->get_server_config($conf["server_id"], 'cron');
+
+ //* try to find customer's mail address
+
+ /** TODO: add possibility for client to choose mail notification! **/
+ $cron_content = "MAILTO=''\n\n";
+ $chr_cron_content = "MAILTO=''\n\n";
+ $chr_cron_content .= "SHELL='/usr/sbin/jk_chrootsh'\n\n";
+
+ $cmd_count = 0;
+ $chr_cmd_count = 0;
+
+ //* read all active cron jobs from database and write them to file
+ $cron_jobs = $app->db->queryAllRecords("SELECT `run_min`, `run_hour`, `run_mday`, `run_month`, `run_wday`, `command`, `type` FROM `cron` WHERE `parent_domain_id` = ".intval($this->parent_domain["domain_id"]) . " AND `active` = 'y'");
+ if($cron_jobs && count($cron_jobs) > 0) {
+ foreach($cron_jobs as $job) {
+ $command = "{$job['run_min']}\t{$job['run_hour']}\t{$job['run_mday']}\t{$job['run_month']}\t{$job['run_wday']}";
+ $command .= "\t{$this->parent_domain['system_user']}"; //* running as user
+ if($job['type'] == 'url') {
+ $command .= "\t{$cron_config['wget']} -q -O /dev/null " . escapeshellarg($job['command']) . " >/dev/null 2>&1";
+ } else {
+ if($job['type'] == 'chrooted') {
+ if(substr($job['command'], 0, strlen($this->parent_domain['document_root'])) == $this->parent_domain['document_root']) {
+ //* delete the unneeded path part
+ $job['command'] = substr($job['command'], strlen($this->parent_domain['document_root']));
+ }
+ }
+
+ $command .= "\t";
+ if(substr($job['command'], 0, 1) != "/") $command .= $this->parent_domain['document_root'];
+ $command .= $job['command'];
+ }
+
+ if($job['type'] == 'chrooted') {
+ $chr_cron_content .= $command . "\n";
+ $chr_cmd_count++;
+ } else {
+ $cron_content .= $command . "\n";
+ $cmd_count++;
+ }
+ }
+ }
+
+ $cron_file = escapeshellcmd($cron_config["crontab_dir"].'/ispc_'.$this->parent_domain["system_user"]);
+ if($cmd_count > 0) {
+ file_put_contents($cron_file, $cron_content);
+ $app->log("Wrote Cron file $cron_file with content:\n$cron_content",LOGLEVEL_DEBUG);
+ } else {
+ @unlink($cron_file);
+ $app->log("Deleted Cron file $cron_file",LOGLEVEL_DEBUG);
+ }
+
+ $cron_file = escapeshellcmd($cron_config["crontab_dir"].'/ispc_chrooted_'.$this->parent_domain["system_user"]);
+ if($chr_cmd_count > 0) {
+ file_put_contents($cron_file, $chr_cron_content);
+ $app->log("Wrote Cron file $cron_file with content:\n$chr_cron_content",LOGLEVEL_DEBUG);
+ } else {
+ @unlink($cron_file);
+ $app->log("Deleted Cron file $cron_file",LOGLEVEL_DEBUG);
+ }
+
+ return 0;
+ }
+
+} // end class
+
+?>
\ No newline at end of file
diff --git a/server/plugins-available/firewall_plugin.inc.php b/server/plugins-available/firewall_plugin.inc.php
index e46d0ca..c446852 100644
--- a/server/plugins-available/firewall_plugin.inc.php
+++ b/server/plugins-available/firewall_plugin.inc.php
@@ -79,8 +79,13 @@
$ports = explode(',',$data["new"]["tcp_port"]);
if(is_array($ports)) {
foreach($ports as $p) {
- $p_int = intval($p);
- if($p_int > 0) $tcp_ports .= $p_int . ' ';
+ if(strstr($p,':')) {
+ $p_parts = explode(':',$p);
+ $p_clean = intval($p_parts[0]).':'.intval($p_parts[1]);
+ } else {
+ $p_clean = intval($p);
+ }
+ if($p_int > 0) $tcp_ports .= $p_clean . ' ';
}
}
$tcp_ports = trim($tcp_ports);
@@ -88,8 +93,13 @@
$ports = explode(',',$data["new"]["udp_port"]);
if(is_array($ports)) {
foreach($ports as $p) {
- $p_int = intval($p);
- if($p_int > 0) $udp_ports .= $p_int . ' ';
+ if(strstr($p,':')) {
+ $p_parts = explode(':',$p);
+ $p_clean = intval($p_parts[0]).':'.intval($p_parts[1]);
+ } else {
+ $p_clean = intval($p);
+ }
+ if($p_int > 0) $udp_ports .= $p_clean . ' ';
}
}
$udp_ports = trim($udp_ports);
diff --git a/server/plugins-available/ftpuser_base_plugin.inc.php b/server/plugins-available/ftpuser_base_plugin.inc.php
new file mode 100644
index 0000000..42edbb5
--- /dev/null
+++ b/server/plugins-available/ftpuser_base_plugin.inc.php
@@ -0,0 +1,112 @@
+<?php
+
+/*
+Copyright (c) 2007, 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.
+*/
+
+class ftpuser_base_plugin {
+
+ var $plugin_name = 'ftpuser_base_plugin';
+ var $class_name = 'ftpuser_base_plugin';
+
+ //* This function is called during ispconfig installation to determine
+ // if a symlink shall be created for this plugin.
+ function onInstall() {
+ global $conf;
+
+ if($conf['services']['web'] == true) {
+ return true;
+ } else {
+ return false;
+ }
+
+ }
+
+
+ /*
+ This function is called when the plugin is loaded
+ */
+
+ function onLoad() {
+ global $app;
+
+ /*
+ Register for the events
+ */
+
+ $app->plugins->registerEvent('ftp_user_insert',$this->plugin_name,'insert');
+ $app->plugins->registerEvent('ftp_user_update',$this->plugin_name,'update');
+ $app->plugins->registerEvent('ftp_user_delete',$this->plugin_name,'delete');
+
+
+ }
+
+
+ function insert($event_name,$data) {
+ global $app, $conf;
+
+ if(!is_dir($data['new']['dir'])) {
+ $app->log("FTP User directory '".$data['new']['dir']."' does not exist. Creating it now.",LOGLEVEL_DEBUG);
+
+ $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($data['new']['parent_domain_id']));
+
+ exec('mkdir -p '.escapeshellcmd($data['new']['dir']));
+ exec('chown '.escapeshellcmd($web["system_user"]).':'.escapeshellcmd($web['system_group']).' '.$data['new']['dir']);
+
+ $app->log("Added ftpuser_dir: ".$data['new']['dir'],LOGLEVEL_DEBUG);
+ }
+
+ }
+
+ function update($event_name,$data) {
+ global $app, $conf;
+
+ if(!is_dir($data['new']['dir'])) {
+ $app->log("FTP User directory '".$data['new']['dir']."' does not exist. Creating it now.",LOGLEVEL_DEBUG);
+
+ $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($data['new']['parent_domain_id']));
+
+ exec('mkdir -p '.escapeshellcmd($data['new']['dir']));
+ exec('chown '.escapeshellcmd($web["system_user"]).':'.escapeshellcmd($web['system_group']).' '.$data['new']['dir']);
+
+ $app->log("Added ftpuser_dir: ".$data['new']['dir'],LOGLEVEL_DEBUG);
+ }
+ }
+
+ function delete($event_name,$data) {
+ global $app, $conf;
+
+ $app->log("Ftpuser:".$data['new']['username']." deleted.",LOGLEVEL_DEBUG);
+
+ }
+
+
+
+
+} // end class
+
+?>
\ No newline at end of file
diff --git a/server/plugins-available/mail_plugin.inc.php b/server/plugins-available/mail_plugin.inc.php
index baa8edb..e486f0e 100644
--- a/server/plugins-available/mail_plugin.inc.php
+++ b/server/plugins-available/mail_plugin.inc.php
@@ -94,6 +94,12 @@
exec("su -c 'mkdir -p ".escapeshellcmd($base_path)."' ".$mail_config['mailuser_name']);
$app->log('Created Directory: '.$base_path,LOGLEVEL_DEBUG);
}
+
+ //* When the mail user dir exists but it is not a valid maildir, remove it
+ if(!empty($maildomain_path) && is_dir($maildomain_path) && !is_dir($maildomain_path.'/new') && !is_dir($maildomain_path.'/cur')) {
+ exec("su -c 'rm -rf ".escapeshellcmd($data['new']['maildir'])."' vmail");
+ $app->log("Removed invalid maildir and rebuild it: ".escapeshellcmd($data['new']['maildir']),LOGLEVEL_WARN);
+ }
//* Create the maildir, if it doesn not exist, set permissions, set quota.
if(!empty($maildomain_path) && !is_dir($maildomain_path)) {
@@ -106,8 +112,10 @@
}
//* Set the maildir quota
- exec("su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name']);
- $app->log('Set Maildir quota: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG);
+ if(is_dir($data['new']['maildir'].'/new')) {
+ exec("su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name']);
+ $app->log('Set Maildir quota: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG);
+ }
}
function user_update($event_name,$data) {
@@ -118,10 +126,41 @@
$mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail');
// Create the maildir, if it does not exist
+ /*
if(!is_dir($data['new']['maildir'])) {
exec('mkdir -p '.escapeshellcmd($data['new']['maildir']));
exec('chown '.$mail_config['mailuser_name'].':'.$mail_config['mailuser_group'].' '.escapeshellcmd($data['new']['maildir']));
$app->log('Created Maildir: '.$data['new']['maildir'],LOGLEVEL_DEBUG);
+ }
+ */
+
+ $maildomain_path = $data['new']['maildir'];
+ $tmp_basepath = $data['new']['maildir'];
+ $tmp_basepath_parts = explode('/',$tmp_basepath);
+ unset($tmp_basepath_parts[count($tmp_basepath_parts)-1]);
+ $base_path = implode('/',$tmp_basepath_parts);
+
+ //* Create the mail domain directory, if it does not exist
+ if(!empty($base_path) && !is_dir($base_path)) {
+ exec("su -c 'mkdir -p ".escapeshellcmd($base_path)."' ".$mail_config['mailuser_name']);
+ $app->log('Created Directory: '.$base_path,LOGLEVEL_DEBUG);
+ }
+
+ //* When the mail user dir exists but it is not a valid maildir, remove it
+ if(!empty($maildomain_path) && is_dir($maildomain_path) && !is_dir($maildomain_path.'/new') && !is_dir($maildomain_path.'/cur')) {
+ exec("su -c 'rm -rf ".escapeshellcmd($data['new']['maildir'])."' vmail");
+ $app->log("Removed invalid maildir and rebuild it: ".escapeshellcmd($data['new']['maildir']),LOGLEVEL_WARN);
+ }
+
+ //* Create the maildir, if it doesn not exist, set permissions, set quota.
+ if(!empty($maildomain_path) && !is_dir($maildomain_path.'/new')) {
+ exec("su -c 'maildirmake ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']);
+ $app->log("Created Maildir "."su -c 'maildirmake ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG);
+ exec('chown -R '.$mail_config['mailuser_name'].':'.$mail_config['mailuser_group'].' '.escapeshellcmd($data['new']['maildir']));
+ $app->log("Set ownership on ".escapeshellcmd($data['new']['maildir']),LOGLEVEL_DEBUG);
+ //* This is to fix the maildrop quota not being rebuilt after the quota is changed.
+ exec("su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name']); // Avoid maildirmake quota bug, see debian bug #214911
+ $app->log('Updated Maildir quota: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($maildomain_path)."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG);
}
// Move mailbox, if domain has changed and delete old mailbox
@@ -137,8 +176,10 @@
$app->log('Moved Maildir from: '.$data['old']['maildir'].' to '.$data['new']['maildir'],LOGLEVEL_DEBUG);
}
//This is to fix the maildrop quota not being rebuilt after the quota is changed.
- exec("su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name']);
- $app->log('Created Maildir: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG);
+ if(is_dir($data['new']['maildir'].'/new')) {
+ exec("su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name']);
+ $app->log('Updated Maildir quota: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".escapeshellcmd($data['new']['maildir'])."' ".$mail_config['mailuser_name'],LOGLEVEL_DEBUG);
+ }
}
function user_delete($event_name,$data) {
diff --git a/server/plugins-available/mysql_clientdb_plugin.inc.php b/server/plugins-available/mysql_clientdb_plugin.inc.php
index eaf85e7..493d80f 100644
--- a/server/plugins-available/mysql_clientdb_plugin.inc.php
+++ b/server/plugins-available/mysql_clientdb_plugin.inc.php
@@ -66,6 +66,52 @@
}
+ function process_host_list($action, $database_name, $database_user, $database_password, $host_list, $link, $database_rename_user = "") {
+ global $app;
+
+ $action = strtoupper($action);
+
+ // set to all hosts if none given
+ if(trim($host_list) == "") $host_list = "%";
+
+ // process arrays and comma separated strings
+ if(!is_array($host_list)) $host_list = split(",", $host_list);
+
+ $success = true;
+
+ // loop through hostlist
+ foreach($host_list as $db_host) {
+ $db_host = trim($db_host);
+
+ // check if entry is valid ip address
+ $valid = true;
+ if(preg_match("/^[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}$/", $db_host)) {
+ $groups = explode(".", $db_host);
+ foreach($groups as $group){
+ if($group<0 OR $group>255)
+ $valid=false;
+ }
+ } else {
+ $valid = false;
+ }
+
+ if($valid == false) continue;
+
+ if($action == "GRANT") {
+ if(!mysql_query("GRANT ALL ON ".mysql_real_escape_string($database_name,$link).".* TO '".mysql_real_escape_string($database_user,$link)."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($database_password,$link)."';",$link)) $success = false;
+ } elseif($action == "REVOKE") {
+ //mysql_query("REVOKE ALL PRIVILEGES ON ".mysql_real_escape_string($database_name,$link).".* FROM '".mysql_real_escape_string($database_user,$link)."';",$link);
+ } elseif($action == "DROP") {
+ if(!mysql_query("DROP USER '".mysql_real_escape_string($database_user,$link)."'@'$db_host';",$link)) $success = false;
+ } elseif($action == "RENAME") {
+ if(!mysql_query("RENAME USER '".mysql_real_escape_string($database_user,$link)."'@'$db_host' TO '".mysql_real_escape_string($database_rename_user,$link)."'@'$db_host'",$link)) $success = false;
+ } elseif($action == "PASSWORD") {
+ if(!mysql_query("SET PASSWORD FOR '".mysql_real_escape_string($database_user,$link)."'@'$db_host' = PASSWORD('".mysql_real_escape_string($database_password,$link)."');",$link)) $success = false;
+ }
+ }
+
+ return $success;
+ }
function db_insert($event_name,$data) {
global $app, $conf;
@@ -101,8 +147,7 @@
if($data["new"]["active"] == 'y') {
if($data["new"]["remote_access"] == 'y') {
- $db_host = '%';
- mysql_query("GRANT ALL ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* TO '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($data["new"]["database_password"],$link)."';",$link);
+ $this->process_host_list("GRANT", $data["new"]["database_name"], $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link);
}
$db_host = 'localhost';
@@ -136,8 +181,7 @@
if($data["new"]["active"] == 'y' && $data["old"]["active"] == 'n') {
if($data["new"]["remote_access"] == 'y') {
- $db_host = '%';
- mysql_query("GRANT ALL ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* TO '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($data["new"]["database_password"],$link)."';",$link);
+ $this->process_host_list("GRANT", $data["new"]["database_name"], $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link);
}
$db_host = 'localhost';
@@ -151,8 +195,7 @@
if($data["new"]["active"] == 'n' && $data["old"]["active"] == 'y') {
if($data["old"]["remote_access"] == 'y') {
- $db_host = '%';
- mysql_query("DROP USER '".mysql_real_escape_string($data["old"]["database_user"],$link)."'@'$db_host';",$link);
+ $this->process_host_list("DROP", "", $data["old"]["database_user"], "", $data["old"]["remote_ips"], $link);
}
$db_host = 'localhost';
@@ -167,8 +210,7 @@
$db_host = 'localhost';
mysql_query("RENAME USER '".mysql_real_escape_string($data["old"]["database_user"],$link)."'@'$db_host' TO '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host'",$link);
if($data["old"]["remote_access"] == 'y') {
- $db_host = '%';
- mysql_query("RENAME USER '".mysql_real_escape_string($data["old"]["database_user"],$link)."'@'$db_host' TO '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host'",$link);
+ $this->process_host_list("RENAME", "", $data["new"]["database_user"], "", $data["new"]["remote_ips"], $link, $data["new"]["database_user"]);
}
$app->log('Renaming mysql user: '.$data["old"]["database_user"].' to '.$data["new"]["database_user"],LOGLEVEL_DEBUG);
}
@@ -180,23 +222,25 @@
//mysql_query("REVOKE ALL PRIVILEGES ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* FROM '".mysql_real_escape_string($data["new"]["database_user"],$link)."';",$link);
//* set new priveliges
- $db_host = '%';
if($data["new"]["remote_access"] == 'y') {
- mysql_query("GRANT ALL ON ".mysql_real_escape_string($data["new"]["database_name"],$link).".* TO '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host' IDENTIFIED BY '".mysql_real_escape_string($data["new"]["database_password"],$link)."';",$link);
+ $this->process_host_list("GRANT", $data["new"]["database_name"], $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link);
} else {
- mysql_query("DROP USER '".mysql_real_escape_string($data["old"]["database_user"],$link)."'@'$db_host';",$link);
+ $this->process_host_list("DROP", "", $data["old"]["database_user"], "", $data["old"]["remote_ips"], $link);
}
$app->log('Changing mysql remote access priveliges 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
+ $this->process_host_list("DROP", "", $data["old"]["database_user"], "", $data["old"]["remote_ips"], $link);
+ $this->process_host_list("GRANT", $data["new"]["database_name"], $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link);
+ }
+
//* Change password
if($data["new"]["database_password"] != $data["old"]["database_password"]) {
$db_host = 'localhost';
mysql_query("SET PASSWORD FOR '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host' = PASSWORD('".mysql_real_escape_string($data["new"]["database_password"],$link)."');",$link);
if($data["new"]["remote_access"] == 'y') {
- $db_host = '%';
- mysql_query("SET PASSWORD FOR '".mysql_real_escape_string($data["new"]["database_user"],$link)."'@'$db_host' = PASSWORD('".mysql_real_escape_string($data["new"]["database_password"],$link)."');",$link);
+ $this->process_host_list("PASSWORD", "", $data["new"]["database_user"], $data["new"]["database_password"], $data["new"]["remote_ips"], $link);
}
$app->log('Changing mysql user password for: '.$data["new"]["database_user"],LOGLEVEL_DEBUG);
}
@@ -225,9 +269,8 @@
//* Get the db host setting for the access priveliges
if($data["old"]["remote_access"] == 'y') {
- $db_host = '%';
- if(mysql_query("DROP USER '".mysql_real_escape_string($data["old"]["database_user"],$link)."'@'$db_host';",$link)) {
- $app->log('Dropping mysql user: '.$data["old"]["database_user"],LOGLEVEL_DEBUG);
+ if($this->process_host_list("DROP", "", $data["old"]["database_user"], "", $data["old"]["remote_ips"], $link)) {
+ $app->log('Dropping mysql user: '.$data["old"]["database_user"],LOGLEVEL_DEBUG);
} else {
$app->log('Error while dropping mysql user: '.$data["old"]["database_user"].' '.mysql_error($link),LOGLEVEL_ERROR);
}
diff --git a/server/plugins-available/pma_symlink_plugin.inc.php b/server/plugins-available/pma_symlink_plugin.inc.php
new file mode 100644
index 0000000..06ce787
--- /dev/null
+++ b/server/plugins-available/pma_symlink_plugin.inc.php
@@ -0,0 +1,121 @@
+<?php
+
+/*
+Copyright (c) 2007 - 2009, Till Brehm, projektfarm Gmbh
+All rights reserved.
+Modification (c) 2009, Marius Cramer, pixcept KG
+
+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.
+*/
+
+class pma_symlink_plugin {
+
+ var $plugin_name = 'pma_symlink_plugin';
+ var $class_name = 'pma_symlink_plugin';
+
+ var $action;
+
+ //* This function is called during ispconfig installation to determine
+ // if a symlink shall be created for this plugin.
+ function onInstall() {
+ global $conf;
+
+ return false;
+
+ }
+
+
+ /*
+ This function is called when the plugin is loaded
+ */
+
+ function onLoad() {
+ global $app;
+
+ /*
+ Register for the events
+ */
+
+ $app->plugins->registerEvent('web_domain_insert',$this->plugin_name,'insert');
+ $app->plugins->registerEvent('web_domain_update',$this->plugin_name,'update');
+ }
+
+ function insert($event_name,$data) {
+ global $app, $conf;
+
+ $this->action = 'insert';
+ // just run the update function
+ $this->update($event_name,$data);
+ }
+
+ function update($event_name,$data) {
+ global $app, $conf;
+
+ if($this->action != 'insert') $this->action = 'update';
+
+ if($data["new"]["type"] != "vhost" && $data["new"]["parent_domain_id"] > 0) {
+
+ $old_parent_domain_id = intval($data["old"]["parent_domain_id"]);
+ $new_parent_domain_id = intval($data["new"]["parent_domain_id"]);
+
+ // If the parent_domain_id has been chenged, we will have to update the old site as well.
+ if($this->action == 'update' && $data["new"]["parent_domain_id"] != $data["old"]["parent_domain_id"]) {
+ $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$old_parent_domain_id." AND active = 'y'");
+ $data["new"] = $tmp;
+ $data["old"] = $tmp;
+ $this->action = 'update';
+ $this->update($event_name,$data);
+ }
+
+ // This is not a vhost, so we need to update the parent record instead.
+ $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$new_parent_domain_id." AND active = 'y'");
+ $data["new"] = $tmp;
+ $data["old"] = $tmp;
+ $this->action = 'update';
+ }
+
+ if($data["new"]["document_root"] == '') {
+ $app->log("document_root not set",LOGLEVEL_WARN);
+ return 0;
+ }
+
+ $symlink = true;
+ if($data["new"]["php"] == "suphp") $symlink = false;
+ elseif($data["new"]["php"] == "cgi" && $data["new"]["suexec"] == "y") $symlink = false;
+ elseif($data["new"]["php"] == "fast-cgi" && $data["new"]["suexec"] == "y") $symlink = false;
+
+
+ if(!is_dir($data["new"]["document_root"]."/web")) exec("mkdir -p ".$data["new"]["document_root"]."/web");
+ if($symlink == false) {
+ if(is_link($data["new"]["document_root"]."/web/phpmyadmin")) exec("rm -f ".$data["new"]["document_root"]."/web/phpmyadmin");
+ } else {
+ if(!is_link($data["new"]["document_root"]."/web/phpmyadmin")) exec("ln -s /var/www/phpmyadmin ".$data["new"]["document_root"]."/web/phpmyadmin");
+ else exec("ln -sf /var/www/phpmyadmin ".$data["new"]["document_root"]."/web/phpmyadmin");
+ }
+ }
+
+
+} // end class
+
+?>
\ No newline at end of file
diff --git a/server/plugins-available/software_update_plugin.inc.php b/server/plugins-available/software_update_plugin.inc.php
index bf6aa56..f3b0c32 100644
--- a/server/plugins-available/software_update_plugin.inc.php
+++ b/server/plugins-available/software_update_plugin.inc.php
@@ -62,17 +62,24 @@
}
-
+ function set_install_status($inst_id, $status) {
+ global $app;
+
+ $app->db->query("UPDATE software_update_inst SET status = '{$status}' WHERE software_update_inst_id = '{$inst_id}'");
+ $app->dbmaster->query("UPDATE software_update_inst SET status = '{$status}' WHERE software_update_inst_id = '{$inst_id}'");
+ }
+
function process($event_name,$data) {
global $app, $conf;
- if(!$conf['software_updates_enabled'] == true) {
+ if(!$conf['software_updates_enabled'] == true) {
$app->log('Software Updates not enabled on this server. To enable updates, set $conf["software_updates_enabled"] = true; in config.inc.php',LOGLEVEL_ERROR);
+ $this->set_install_status($data["new"]["software_update_inst_id"], "failed");
return false;
}
//* Get the info of the package:
- $software_update_id = intval($data["new"]["software_update_id"]);
+ $software_update_id = intval($data["new"]["software_update_id"]);
$software_update = $app->db->queryOneRecord("SELECT * FROM software_update WHERE software_update_id = '$software_update_id'");
$temp_dir = '/tmp/'.md5 (uniqid (rand()));
@@ -80,6 +87,7 @@
mkdir($temp_dir);
if(!is_dir($temp_dir)) {
$app->log("Unable to create temp directory.",LOGLEVEL_ERROR);
+ $this->set_install_status($data["new"]["software_update_inst_id"], "failed");
return false;
}
@@ -97,6 +105,7 @@
$app->log("The md5 sum of the downloaded file is incorrect. Update aborted.",LOGLEVEL_ERROR);
exec("rm -rf $temp_dir");
$app->log("Deleting the temp directory $temp_dir",LOGLEVEL_DEBUG);
+ $this->set_install_status($data["new"]["software_update_inst_id"], "failed");
return false;
} else {
$app->log("md5sum of the downloaded file is verified.",LOGLEVEL_DEBUG);
@@ -110,18 +119,28 @@
// Execute the setup script
exec('chmod +x '.$temp_dir.'/setup.sh');
$app->log("Executing setup.sh file in directory $temp_dir",LOGLEVEL_DEBUG);
- exec('cd '.$temp_dir.' && ./setup.sh');
- $app->db->query("UPDATE software_update_inst SET status = 'installed' WHERE software_update_inst_id = ".$data["new"]["software_update_inst_id"]);
+ exec('cd '.$temp_dir.' && ./setup.sh > package_install.log');
+
+ $log_data = @file_get_contents("{$temp_dir}/package_install.log");
+ if(preg_match("'.*\[OK\]\s*$'is", $log_data)) {
+ $app->log("Installation successful",LOGLEVEL_DEBUG);
+ $app->log($log_data,LOGLEVEL_DEBUG);
+ $this->set_install_status($data["new"]["software_update_inst_id"], "installed");
+ } else {
+ $app->log("Installation failed:\n\n" . $log_data,LOGLEVEL_ERROR);
+ $this->set_install_status($data["new"]["software_update_inst_id"], "failed");
+ }
} else {
$app->log("setup.sh file not found",LOGLEVEL_ERROR);
+ $this->set_install_status($data["new"]["software_update_inst_id"], "failed");
}
} else {
$app->log("Download of the update file failed",LOGLEVEL_ERROR);
+ $this->set_install_status($data["new"]["software_update_inst_id"], "failed");
}
exec("rm -rf $temp_dir");
$app->log("Deleting the temp directory $temp_dir",LOGLEVEL_DEBUG);
-
}
diff --git a/server/plugins-available/webmail_symlink_plugin.inc.php b/server/plugins-available/webmail_symlink_plugin.inc.php
new file mode 100644
index 0000000..db5fd26
--- /dev/null
+++ b/server/plugins-available/webmail_symlink_plugin.inc.php
@@ -0,0 +1,121 @@
+<?php
+
+/*
+Copyright (c) 2007 - 2009, Till Brehm, projektfarm Gmbh
+All rights reserved.
+Modification (c) 2009, Marius Cramer, pixcept KG
+
+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.
+*/
+
+class webmail_symlink_plugin {
+
+ var $plugin_name = 'webmail_symlink_plugin';
+ var $class_name = 'webmail_symlink_plugin';
+
+ var $action;
+
+ //* This function is called during ispconfig installation to determine
+ // if a symlink shall be created for this plugin.
+ function onInstall() {
+ global $conf;
+
+ return false;
+
+ }
+
+
+ /*
+ This function is called when the plugin is loaded
+ */
+
+ function onLoad() {
+ global $app;
+
+ /*
+ Register for the events
+ */
+
+ $app->plugins->registerEvent('web_domain_insert',$this->plugin_name,'insert');
+ $app->plugins->registerEvent('web_domain_update',$this->plugin_name,'update');
+ }
+
+ function insert($event_name,$data) {
+ global $app, $conf;
+
+ $this->action = 'insert';
+ // just run the update function
+ $this->update($event_name,$data);
+ }
+
+ function update($event_name,$data) {
+ global $app, $conf;
+
+ if($this->action != 'insert') $this->action = 'update';
+
+ if($data["new"]["type"] != "vhost" && $data["new"]["parent_domain_id"] > 0) {
+
+ $old_parent_domain_id = intval($data["old"]["parent_domain_id"]);
+ $new_parent_domain_id = intval($data["new"]["parent_domain_id"]);
+
+ // If the parent_domain_id has been chenged, we will have to update the old site as well.
+ if($this->action == 'update' && $data["new"]["parent_domain_id"] != $data["old"]["parent_domain_id"]) {
+ $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$old_parent_domain_id." AND active = 'y'");
+ $data["new"] = $tmp;
+ $data["old"] = $tmp;
+ $this->action = 'update';
+ $this->update($event_name,$data);
+ }
+
+ // This is not a vhost, so we need to update the parent record instead.
+ $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$new_parent_domain_id." AND active = 'y'");
+ $data["new"] = $tmp;
+ $data["old"] = $tmp;
+ $this->action = 'update';
+ }
+
+ if($data["new"]["document_root"] == '') {
+ $app->log("document_root not set",LOGLEVEL_WARN);
+ return 0;
+ }
+
+ $symlink = true;
+ if($data["new"]["php"] == "suphp") $symlink = false;
+ elseif($data["new"]["php"] == "cgi" && $data["new"]["suexec"] == "y") $symlink = false;
+ elseif($data["new"]["php"] == "fast-cgi" && $data["new"]["suexec"] == "y") $symlink = false;
+
+
+ if(!is_dir($data["new"]["document_root"]."/web")) exec("mkdir -p ".$data["new"]["document_root"]."/web");
+ if($symlink == false) {
+ if(is_link($data["new"]["document_root"]."/web/webmail")) exec("rm -f ".$data["new"]["document_root"]."/web/webmail");
+ } else {
+ if(!is_link($data["new"]["document_root"]."/web/webmail")) exec("ln -s /var/www/webmail ".$data["new"]["document_root"]."/web/webmail");
+ else exec("ln -sf /var/www/webmail ".$data["new"]["document_root"]."/web/webmail");
+ }
+ }
+
+
+} // end class
+
+?>
\ No newline at end of file
diff --git a/server/scripts/getmail.sh b/server/scripts/getmail.sh
deleted file mode 100644
index cf9160a..0000000
--- a/server/scripts/getmail.sh
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/bash
-getmail -g /etc/getmail/ -r /etc/getmail/*.conf
\ No newline at end of file
diff --git a/server/scripts/ispconfig_update.php b/server/scripts/ispconfig_update.php
index f18963f..f7615e1 100644
--- a/server/scripts/ispconfig_update.php
+++ b/server/scripts/ispconfig_update.php
@@ -95,11 +95,13 @@
$new_version = trim($new_version);
if($new_version != ISPC_APP_VERSION) {
passthru('/usr/local/ispconfig/server/scripts/update_from_tgz.sh');
+ exit;
} else {
echo "There are no updates available for ISPConfig ".ISPC_APP_VERSION."\n";
}
} else {
passthru('/usr/local/ispconfig/server/scripts/update_from_svn.sh');
+ exit;
}
diff --git a/server/scripts/run-getmail.sh b/server/scripts/run-getmail.sh
index fab297d..998ecab 100644
--- a/server/scripts/run-getmail.sh
+++ b/server/scripts/run-getmail.sh
@@ -3,7 +3,11 @@
cd /etc/getmail
rcfiles=""
for file in *.conf ; do
+if [ $file != "*.conf" ]; then
rcfiles="$rcfiles -r $file"
+fi
done
#echo $rcfiles
-exec /usr/bin/getmail -n -v -g /etc/getmail $rcfiles
\ No newline at end of file
+if [ "$rcfiles" != "" ]; then
+exec /usr/bin/getmail -n -v -g /etc/getmail $rcfiles
+fi
\ No newline at end of file
diff --git a/server/scripts/update_from_svn.sh b/server/scripts/update_from_svn.sh
index becd7e7..d8ed236 100644
--- a/server/scripts/update_from_svn.sh
+++ b/server/scripts/update_from_svn.sh
@@ -5,4 +5,6 @@
cd trunk/install
php -q update.php
cd /tmp
-rm -rf /tmp/trunk
\ No newline at end of file
+rm -rf /tmp/trunk
+
+exit 0
\ No newline at end of file
diff --git a/server/scripts/update_from_tgz.sh b/server/scripts/update_from_tgz.sh
index 424a390..09dddeb 100644
--- a/server/scripts/update_from_tgz.sh
+++ b/server/scripts/update_from_tgz.sh
@@ -8,8 +8,15 @@
fi
wget http://www.ispconfig.org/downloads/ISPConfig-3-stable.tar.gz
-tar xvfz ISPConfig-3-stable.tar.gz
-cd ispconfig3_install/install/
-php -q update.php
-rm -rf /tmp/ispconfig3_install/install
-rm -f ISPConfig-3-stable.tar.gz
\ No newline at end of file
+if [ -f ISPConfig-3-stable.tar.gz ]
+then
+ tar xvfz ISPConfig-3-stable.tar.gz
+ cd ispconfig3_install/install/
+ php -q update.php
+ rm -rf /tmp/ispconfig3_install/install
+ rm -f ISPConfig-3-stable.tar.gz
+else
+ echo "Unable to download the update."
+fi
+
+exit 0
\ No newline at end of file
diff --git a/server/scripts/vlogger b/server/scripts/vlogger
new file mode 100755
index 0000000..d136af1
--- /dev/null
+++ b/server/scripts/vlogger
@@ -0,0 +1,564 @@
+#!/usr/bin/perl -T
+#
+# vlogger - smarter logging for apache
+# steve j. kondik <shade@chemlab.org>
+#
+# this script will take piped logs in STDIN, break off the first component
+# and log the line into the proper directory under $LOGDIR. it will roll the
+# logs over at midnight on-the-fly and maintain a symlink to the most recent log.
+#
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Library General Public License for more details.
+#
+#
+# CHANGELOG:
+# 0.1 initial release
+# 0.2 cleanups, added -e option for errorlogs, added strict stuff
+# 0.3 cleanups, bugfixes, docs, added -r size rotation option
+# 0.4 added dbi usage tracking option, code cleanups from cz@digitalfreaks.org
+# 1.0 small bugfixes, first production release
+# 1.1 bugfix release
+# 1.2 support for mod_logio
+# 1.3 various contributed bugfixes
+#
+#
+# TODO:
+# configurable file compression using Compress::Zlib, maybe.
+#
+
+package vlogger;
+
+$ENV{PATH} = "/bin:/usr/bin";
+
+my $VERSION = "1.3";
+
+=head1 NAME
+
+vlogger - flexible log rotation and usage tracking in perl
+
+=head1 SYNOPSIS
+
+vlogger [OPTIONS]... [LOGDIR]
+
+=head1 DESCRIPTION
+
+Vlogger is designed to make webserver log rotation simple and easy to manage.
+It deals with VirtualHost logs automatically, so only one directive is required
+to manage all hosts on a webserver. Vlogger takes piped output from Apache or
+another webserver, splits off the first field, and writes the logs to logfiles
+in subdirectories. It uses a filehandle cache to avoid resource limitations.
+It will start a new logfile at the beginning of a new day, and optionally start
+new files when a certain filesize is reached. It can maintain a symlink to
+the most recent log for easy access. Optionally, host parsing can be disabled
+for use in ErrorLog directives.
+
+To use vlogger, you need to add a "%v" to the first part of your LogFormat:
+
+LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
+
+Then call it from a customlog:
+
+CustomLog "| /usr/local/sbin/vlogger -s access.log -u www-logs -g www-logs /var/log/apache" combined
+
+=head1 OPTIONS
+
+Options are given in short format on the command line.
+
+-a
+ Do not autoflush files. This may improve performance but may break logfile
+analyzers that depend on full entries in the logs.
+
+-e
+ ErrorLog mode. In this mode, the host parsing is disabled, and the file is
+written out using the template under the specified LOGDIR.
+
+-n
+ Disables rotation. This option disables rotation altogether.
+
+-f MAXFILES
+ Maximum number of filehandles to keep open. Defaults to 100. Setting this
+value too high may result in the system running out of file descriptors.
+Setting it too low may affect performance.
+
+-u UID
+ Change user to UID when running as root.
+
+-g GID
+ Change group to GID when running as root.
+
+-t TEMPLATE
+ Filename template using Date::Format codes. Default is "%m%d%Y-access.log",
+or "%m%d%Y-error.log". When using the -r option, the default becomes
+"%m%d%Y-%T-access.log" or "%m%d%Y-%T-error.log".
+
+-s SYMLINK
+ Specifies the name of a symlink to the current file.
+
+-r SIZE
+ Rotate files when they reach SIZE. SIZE is given in bytes.
+
+-d CONFIG
+ Use the DBI usage tracker.
+
+-h
+ Displays help.
+
+-v
+ Prints version information.
+
+=head1 DBI USAGE TRACKER
+
+ Vlogger can automatically keep track of per-virtualhost usage statistics in a
+database. DBI and the relevant drivers (eg. DBD::mysql) needs to be installed for
+this to work. Create a table in your database to hold the data. A "mysql_create.sql"
+script is provided for using this feature with MySQL. Configure the dsn, user, pass
+and dump values in the vlogger-dbi.conf file. The "dump" parameter controls how often
+vlogger will dump its stats into the database (the default is 30 seconds). Copy this
+file to somewhere convienient on your filesystem (like /etc/apache/vlogger-dbi.conf) and
+start vlogger with "-d /etc/apache/vlogger-dbi.conf". You might want to use this feature
+to easily bill customers on a daily/weekly/monthly basis for bandwidth usage.
+
+=head1 SEE ALSO
+cronolog(1), httplog(1)
+
+=head1 BUGS
+None, yet.
+
+=head1 AUTHORS
+Steve J. Kondik <shade@chemlab.org>
+
+WWW: http://n0rp.chemlab.org/vlogger
+
+=cut
+
+# a couple modules we need
+use strict;
+no strict "refs";
+use warnings;
+use sigtrap qw(handler exitall HUP USR1 TERM INT PIPE);
+use Date::Format;
+use Getopt::Std;
+use IO::Handle;
+
+# get command line options
+our %OPTS;
+getopts( 'f:t:s:hu:g:aeivr:d:', \%OPTS );
+
+# print out version
+if ( $OPTS{'v'} ) {
+ print "VLogger $VERSION (apache logfile parser)\n";
+ print "Written by Steve J. Kondik <shade\@chemlab.org>\n\n";
+ print "This is free software; see the source for copying conditions. There is NO\n";
+ print "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n";
+ exit;
+}
+
+# print help
+if ( $OPTS{'h'} || !$ARGV[0] ) {
+ usage();
+ exit;
+}
+
+# log directory
+my $LOGDIR;
+if ( $ARGV[0] ) {
+ if ( !-d $ARGV[0] ) {
+ print STDERR
+ "[vlogger] target directory $ARGV[0] does not exist - exiting.\n\n";
+ exit;
+ }
+ $LOGDIR = $ARGV[0];
+}
+$LOGDIR =~ /(.*)/;
+$LOGDIR = $1;
+
+# change uid/gid if requested (and running as root)
+if ( $> == "0" ) {
+ if ( $OPTS{'g'} ) {
+ my $guid = getgrnam( $OPTS{'g'} );
+ if ( !defined $guid || $guid == 0 ) {
+ print STDERR
+ "[vlogger] cannot run as root or nonexistant group.\n\n";
+ exit;
+ }
+
+ $) = $guid;
+ $( = $guid;
+ if ( $) != $guid and $) != ( $guid - 2**32 ) ) {
+ die "fatal: setgid to gid $guid failed\n";
+ }
+ }
+
+ if ( $OPTS{'u'} ) {
+ my $uuid = getpwnam( $OPTS{'u'} );
+ if ( !defined $uuid || $uuid == 0 ) {
+ print STDERR
+ "[vlogger] cannot run as root or nonexistant user.\n\n";
+ exit;
+ }
+
+ $> = $uuid;
+ $< = $uuid;
+ if ( $> != $uuid and $> != ( $uuid - 2**32 ) ) {
+ die "fatal: setuid to uid $uuid failed\n";
+ }
+ }
+}
+
+# set up dbi stuffs
+
+my $DBI_DSN;
+my $DBI_USER;
+my $DBI_PASS;
+my $DBI_DUMP;
+if ( $OPTS{'d'} ) {
+ if ( $OPTS{'e'} ) {
+ print "-d not valid with -e. exiting.\n";
+ exit;
+ }
+
+ eval "use DBI";
+
+ open CONF, $OPTS{'d'};
+ while (<CONF>) {
+ chomp;
+ my @conf = split (/\s/);
+ if ( $conf[0] eq "dsn" ) {
+ $DBI_DSN = $conf[1];
+ }
+ elsif ( $conf[0] eq "user" ) {
+ $DBI_USER = $conf[1];
+ }
+ elsif ( $conf[0] eq "pass" ) {
+ $DBI_PASS = $conf[1];
+ }
+ elsif ( $conf[0] eq "dump" ) {
+ $DBI_DUMP = $conf[1];
+ }
+ }
+ close CONF;
+
+ unless ( $DBI_DSN && $DBI_USER && $DBI_PASS && $DBI_DUMP ) {
+ print "All values for DBI configuration are not properly defined.\n\n";
+ exit;
+ }
+
+ # test the connection
+ my $dbh = DBI->connect( $DBI_DSN, $DBI_USER, $DBI_PASS )
+ or die "DBI Error: $!";
+ $dbh->disconnect;
+
+ # SIGALRM dumps the tracker hash
+ $SIG{ALRM} = \&dump_tracker;
+
+ alarm $DBI_DUMP;
+
+}
+
+# max files to keep open
+my $MAXFILES;
+if ( $OPTS{'f'} ) {
+ $MAXFILES = $OPTS{'f'};
+}
+else {
+ $MAXFILES = "100";
+}
+
+# filesize rotation
+my $MAXSIZE;
+if ( $OPTS{'r'} ) {
+ $MAXSIZE = $OPTS{'r'};
+}
+
+# filename template
+my $TEMPLATE;
+if ( $OPTS{'t'} ) {
+ $TEMPLATE = $OPTS{'t'};
+ $TEMPLATE =~ /(.*)/;
+ $TEMPLATE = $1;
+
+}
+elsif ( $OPTS{'e'} ) {
+ if ( $OPTS{'r'} ) {
+ $TEMPLATE = "%m%d%Y-%T-error.log";
+ }
+ else {
+ $TEMPLATE = "%m%d%Y-error.log";
+ }
+}
+else {
+ if ( $OPTS{'r'} ) {
+ $TEMPLATE = "%m%d%Y-%T-access.log";
+ }
+ else {
+ $TEMPLATE = "%m%d%Y-access.log";
+ }
+}
+
+# symlink
+if ( $OPTS{'s'} ) {
+ $OPTS{'s'} =~ /(.*)/;
+ $OPTS{'s'} = $1;
+}
+
+# chroot to the logdir
+chdir($LOGDIR);
+#chroot("."); we better do not chroot as DBI requires to load a module on the fly -> error!
+
+my %logs = ();
+my %tracker = ();
+my $LASTDUMP = time();
+
+# pick a mode
+if ( $OPTS{'e'} ) {
+
+ $0 = "vlogger (error log)";
+ # errorlog mode
+ open ELOG, ">>" . time2str( $TEMPLATE, time() )
+ or die ( "can't open $LOGDIR/" . time2str( $TEMPLATE, time() ) );
+
+ unless ( $OPTS{'a'} ) {
+ ELOG->autoflush(1);
+ }
+ if ( $OPTS{'s'} ) {
+ if ( -l $OPTS{'s'} ) {
+ unlink( $OPTS{'s'} );
+ }
+ symlink( time2str( $TEMPLATE, time() ), $OPTS{'s'} );
+ }
+
+ my $LASTWRITE = time();
+
+ while ( my $log_line = <STDIN> ) {
+ unless ( $OPTS{'n'} ) {
+ if ( time2str( "%Y%m%d", time() ) >
+ time2str( "%Y%m%d", $LASTWRITE ) )
+ {
+
+ # open a new file
+ close ELOG;
+ open_errorlog();
+ }
+ elsif ( $OPTS{'r'} ) {
+
+ # check the size
+ my @filesize = ELOG->stat;
+ print $filesize[7] . "\n";
+ if ( $filesize[7] > $MAXSIZE ) {
+ close ELOG;
+ open_errorlog();
+ }
+ }
+
+ $LASTWRITE = time();
+ }
+
+ # we dont need to do any other parsing at all, so write the line.
+ print ELOG $log_line;
+ }
+
+}
+else {
+
+ # accesslog mode
+ $0 = "vlogger (access log)";
+ while ( my $log_line = <STDIN> ) {
+
+ # parse out the first word (the vhost)
+ my @this_line = split ( /\s/, $log_line );
+ my ($vhost) = $this_line[0];
+ my $reqsize = $this_line[10];
+ $vhost = lc($vhost) || "default";
+ if ( $vhost =~ m#[/\\]# ) { $vhost = "default" }
+ $vhost =~ /(.*)/o;
+ $vhost = $1;
+ $vhost = 'default' unless $vhost;
+
+ if ( $OPTS{'i'} ) {
+ $reqsize = $this_line[1] + $this_line[2];
+ }
+
+ # if we're writing to a log, and it rolls to a new day, close all files.
+ unless ( $OPTS{'n'} ) {
+ if ( $logs{$vhost}
+ && ( time2str( "%Y%m%d", time() ) >
+ time2str( "%Y%m%d", $logs{$vhost} ) ) )
+ {
+ foreach my $key ( keys %logs ) {
+ close $key;
+ }
+ %logs = ();
+ }
+ elsif ( $OPTS{'r'} && $logs{$vhost} ) {
+
+ # check the size
+ my @filesize = $vhost->stat;
+ if ( $filesize[7] > $MAXSIZE ) {
+ close $vhost;
+ delete( $logs{$vhost} );
+ }
+ }
+ }
+
+ # open a new log
+ if ( !$logs{$vhost} ) {
+
+ # check how many files we have open, close the oldest one
+ if ( keys(%logs) > $MAXFILES ) {
+ my ( $key, $value ) =
+ sort { $logs{$a} <=> $logs{$b} } ( keys(%logs) );
+ close $key;
+ delete( $logs{$key} );
+ }
+
+ # check if directory is there
+ unless ( -d "${vhost}" ) {
+ mkdir("${vhost}");
+ }
+
+ # open the file using the template
+ open $vhost, ">>${vhost}/" . time2str( $TEMPLATE, time() )
+ or die ( "can't open $LOGDIR/${vhost}/"
+ . time2str( $TEMPLATE, time() ) );
+
+ # autoflush the handle unless -a
+ if ( !$OPTS{'a'} ) {
+ $vhost->autoflush(1);
+ }
+
+ # make a symlink if -s
+ if ( $OPTS{'s'} ) {
+ chdir("${vhost}");
+ if ( -l $OPTS{'s'} ) {
+ unlink( $OPTS{'s'} );
+ }
+ symlink( time2str( $TEMPLATE, time() ), $OPTS{'s'} );
+ chdir("..");
+ }
+ }
+
+ # update the timestamp and write the line
+ $logs{$vhost} = time();
+ if ($OPTS{'i'}) {
+ $log_line =~ s/^\S*\s+\S*\s+\S*\s+//o;
+ }
+ else {
+ $log_line =~ s/^\S*\s+//o;
+ }
+
+ if ( $reqsize =~ m/^\d*$/ && $reqsize > 0 ) {
+ $tracker{$vhost} += $reqsize;
+ }
+
+ print $vhost $log_line;
+
+ }
+}
+
+# sub to close all files
+sub closeall {
+ if ( $OPTS{'e'} ) {
+ close ELOG;
+ }
+ else {
+ foreach my $key ( keys %logs ) {
+ close $key;
+ }
+ %logs = ();
+ if ( $OPTS{'d'} ) {
+ vlogger::dump_tracker();
+ }
+ }
+}
+
+sub exitall {
+ vlogger::closeall;
+ exit;
+}
+
+# sub to open new errorlog
+sub open_errorlog {
+ open ELOG, ">>" . time2str( $TEMPLATE, time() )
+ or die ( "can't open $LOGDIR/" . time2str( $TEMPLATE, time() ) );
+ if ( $OPTS{'s'} ) {
+ if ( -l $OPTS{'s'} ) {
+ unlink( $OPTS{'s'} );
+ }
+ symlink( time2str( $TEMPLATE, time() ), $OPTS{'s'} );
+ }
+
+ # autoflush it unless -a
+ unless ( $OPTS{'a'} ) {
+ ELOG->autoflush(1);
+ }
+}
+
+# sub to update the database with the tracker data
+sub dump_tracker {
+ if ( keys(%tracker) > 0 ) {
+ my $dbh = DBI->connect( $DBI_DSN, $DBI_USER, $DBI_PASS )
+ or warn "DBI Error: $!";
+ foreach my $key ( keys(%tracker) ) {
+ my $ts = time2str( "%Y-%m-%d", time() );
+ my $sth =
+ $dbh->prepare( "select * from web_traffic where hostname='" . $key
+ . "' and traffic_date='" . $ts . "'" );
+ $sth->execute;
+ if ( $sth->rows ) {
+ my $query =
+ "update web_traffic set traffic_bytes=traffic_bytes+"
+ . $tracker{$key}
+ . " where hostname='" . $key
+ . "' and traffic_date='" . $ts . "'";
+ $dbh->do($query);
+ }
+ else {
+ my $query = "insert into web_traffic (hostname, traffic_date, traffic_bytes) values ('$key', '$ts', '$tracker{$key}')";
+ $dbh->do($query);
+ }
+ }
+ $dbh->disconnect;
+ %tracker = ();
+ }
+ alarm $DBI_DUMP;
+}
+
+# print usage info
+sub usage {
+ print "Usage: vlogger [OPTIONS]... [LOGDIR]\n";
+ print "Handles a piped logfile from a webserver, splitting it into it's\n";
+ print "host components, and rotates the files daily.\n\n";
+ print " -a do not autoflush files\n";
+ print " -e errorlog mode\n";
+ print " -n don't rotate files\n";
+ print " -f MAXFILES max number of files to keep open\n";
+ print " -u UID uid to switch to when running as root\n";
+ print " -g GID gid to switch to when running as root\n";
+ print " -t TEMPLATE filename template (see perldoc Date::Format)\n";
+ print " -s SYMLINK maintain a symlink to most recent file\n";
+ print " -r SIZE rotate when file reaches SIZE\n";
+ print " -d CONFIG use DBI usage tracker (see perldoc vlogger)\n";
+ print " -i extract mod_logio instead of filesize\n";
+ print " -h display this help\n";
+ print " -v output version information\n\n";
+ print "TEMPLATE may be a filename with Date::Format codes. The default template\n";
+ print "is %m%d%Y-access.log. SYMLINK is the name of a file that will be linked to\n";
+ print "the most recent file inside the log directory. The default is access.log.\n";
+ print "MAXFILES is the maximum number of filehandles to cache. This defaults to 100.\n";
+ print "When running with -a, performance may improve, but this might confuse some\n";
+ print "log analysis software that expects complete log entries at all times.\n";
+ print "Errorlog mode is used when running with an Apache errorlog. In this mode,\n";
+ print "virtualhost parsing is disabled, and a single file is written in LOGDIR\n";
+ print "using the TEMPLATE (%m%d%Y-error.log is default for -e). When running with\n";
+ print "-r, the template becomes %m%d%Y-%T-xxx.log. SIZE is given in bytes.\n\n";
+ print "Report bugs to <shade\@chemlab.org>.\n";
+}
+
diff --git a/server/server.php b/server/server.php
index 3646f81..93e4c21 100644
--- a/server/server.php
+++ b/server/server.php
@@ -54,8 +54,13 @@
// Check if another process is running
if(is_file($conf["temppath"].$conf["fs_div"].".ispconfig_lock")){
clearstatcache();
- for($i=0;$i<1200;$i++){ // Wait max. 1200 sec, then proceed
+ for($i=0;$i<120;$i++){ // Wait max. 1200 sec, then proceed
if(is_file($conf["temppath"].$conf["fs_div"].".ispconfig_lock")){
+ exec("ps aux | grep '/usr/local/ispconfig/server/server.php' | grep -v 'grep' | wc -l", $check);
+ if(intval($check[0]) > 1) { // 1 because this is 2nd instance!
+ $app->log("There is already an instance of server.php running. Exiting.", LOGLEVEL_DEBUG);
+ exit;
+ }
$app->log("There is already a lockfile set. Waiting another 10 seconds...", LOGLEVEL_DEBUG);
sleep(10);
clearstatcache();
--
Gitblit v1.9.1