Full Code of froxlor/Froxlor for AI

main 070e537744f2 cached
443 files
4.7 MB
1.3M tokens
1533 symbols
1 requests
Download .txt
Showing preview only (5,118K chars total). Download the full file or copy to clipboard to get everything.
Repository: froxlor/Froxlor
Branch: main
Commit: 070e537744f2
Files: 443
Total size: 4.7 MB

Directory structure:
gitextract_fhz65cs7/

├── .editorconfig
├── .github/
│   ├── CONTRIBUTING.md
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   ├── ISSUE_TEMPLATE.md
│   ├── LICENSE_HEADER
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows/
│       ├── build-docs.yml
│       ├── build-mariadb.yml
│       └── build-mysql.yml
├── .gitignore
├── 2fa.php
├── COPYING
├── README.md
├── SECURITY.md
├── actions/
│   ├── admin/
│   │   ├── index.html
│   │   └── settings/
│   │       ├── 100.panel.php
│   │       ├── 110.accounts.php
│   │       ├── 120.system.php
│   │       ├── 122.froxlorvhost.php
│   │       ├── 125.cronjob.php
│   │       ├── 130.webserver.php
│   │       ├── 131.ssl.php
│   │       ├── 135.fcgid.php
│   │       ├── 136.phpfpm.php
│   │       ├── 137.perl.php
│   │       ├── 140.statistics.php
│   │       ├── 150.mail.php
│   │       ├── 155.ftpserver.php
│   │       ├── 160.nameserver.php
│   │       ├── 170.logger.php
│   │       ├── 180.antispam.php
│   │       ├── 210.security.php
│   │       ├── 220.quota.php
│   │       └── index.html
│   └── index.html
├── admin_admins.php
├── admin_apcuinfo.php
├── admin_autoupdate.php
├── admin_configfiles.php
├── admin_cronjobs.php
├── admin_customers.php
├── admin_domains.php
├── admin_index.php
├── admin_ipsandports.php
├── admin_logger.php
├── admin_message.php
├── admin_mysqlserver.php
├── admin_opcacheinfo.php
├── admin_phpsettings.php
├── admin_plans.php
├── admin_settings.php
├── admin_templates.php
├── admin_traffic.php
├── admin_updates.php
├── api.php
├── api_keys.php
├── bin/
│   └── froxlor-cli
├── build.xml
├── composer.json
├── customer_domains.php
├── customer_email.php
├── customer_extras.php
├── customer_ftp.php
├── customer_index.php
├── customer_logger.php
├── customer_mysql.php
├── customer_traffic.php
├── dns_editor.php
├── doc/
│   ├── example/
│   │   ├── FroxlorAPI.php
│   │   ├── create_customer.php
│   │   ├── index.html
│   │   └── list_functions.php
│   └── index.html
├── error_report.php
├── index.php
├── install/
│   ├── froxlor.sql.php
│   ├── index.html
│   ├── install.php
│   ├── updates/
│   │   ├── froxlor/
│   │   │   ├── index.html
│   │   │   ├── update_2.0.inc.php
│   │   │   ├── update_2.1.inc.php
│   │   │   ├── update_2.2.inc.php
│   │   │   └── update_2.3.inc.php
│   │   ├── index.html
│   │   └── preconfig/
│   │       ├── index.html
│   │       ├── preconfig_2.0.inc.php
│   │       ├── preconfig_2.1.inc.php
│   │       ├── preconfig_2.2.inc.php
│   │       └── preconfig_2.3.inc.php
│   └── updatesql.php
├── lib/
│   ├── Froxlor/
│   │   ├── Ajax/
│   │   │   ├── Ajax.php
│   │   │   ├── GlobalSearch.php
│   │   │   └── index.html
│   │   ├── Api/
│   │   │   ├── Api.php
│   │   │   ├── ApiCommand.php
│   │   │   ├── ApiParameter.php
│   │   │   ├── Commands/
│   │   │   │   ├── Admins.php
│   │   │   │   ├── Certificates.php
│   │   │   │   ├── Cronjobs.php
│   │   │   │   ├── Customers.php
│   │   │   │   ├── DataDump.php
│   │   │   │   ├── DirOptions.php
│   │   │   │   ├── DirProtections.php
│   │   │   │   ├── DomainZones.php
│   │   │   │   ├── Domains.php
│   │   │   │   ├── EmailAccounts.php
│   │   │   │   ├── EmailDomains.php
│   │   │   │   ├── EmailForwarders.php
│   │   │   │   ├── EmailSender.php
│   │   │   │   ├── Emails.php
│   │   │   │   ├── FpmDaemons.php
│   │   │   │   ├── Froxlor.php
│   │   │   │   ├── Ftps.php
│   │   │   │   ├── HostingPlans.php
│   │   │   │   ├── IpsAndPorts.php
│   │   │   │   ├── MysqlServer.php
│   │   │   │   ├── Mysqls.php
│   │   │   │   ├── PhpSettings.php
│   │   │   │   ├── SshKeys.php
│   │   │   │   ├── SubDomains.php
│   │   │   │   ├── SysLog.php
│   │   │   │   ├── Traffic.php
│   │   │   │   └── index.html
│   │   │   ├── FroxlorRPC.php
│   │   │   ├── ResourceEntity.php
│   │   │   ├── Response.php
│   │   │   └── index.html
│   │   ├── Bulk/
│   │   │   ├── BulkAction.php
│   │   │   ├── DomainBulkAction.php
│   │   │   └── index.html
│   │   ├── Cli/
│   │   │   ├── CliCommand.php
│   │   │   ├── ConfigDiff.php
│   │   │   ├── ConfigServices.php
│   │   │   ├── InstallCommand.php
│   │   │   ├── MasterCron.php
│   │   │   ├── PhpSessionclean.php
│   │   │   ├── RunApiCommand.php
│   │   │   ├── SwitchServerIp.php
│   │   │   ├── UpdateCommand.php
│   │   │   ├── UserCommand.php
│   │   │   ├── ValidateAcmeWebroot.php
│   │   │   ├── index.html
│   │   │   └── install.functions.php
│   │   ├── Config/
│   │   │   ├── ConfigDaemon.php
│   │   │   ├── ConfigDisplay.php
│   │   │   ├── ConfigParser.php
│   │   │   ├── ConfigService.php
│   │   │   └── index.html
│   │   ├── Cron/
│   │   │   ├── CronConfig.php
│   │   │   ├── Dns/
│   │   │   │   ├── Bind.php
│   │   │   │   ├── DnsBase.php
│   │   │   │   ├── PowerDNS.php
│   │   │   │   └── index.html
│   │   │   ├── Forkable.php
│   │   │   ├── FroxlorCron.php
│   │   │   ├── Http/
│   │   │   │   ├── Apache.php
│   │   │   │   ├── ApacheFcgi.php
│   │   │   │   ├── ConfigIO.php
│   │   │   │   ├── DomainSSL.php
│   │   │   │   ├── HttpConfigBase.php
│   │   │   │   ├── LetsEncrypt/
│   │   │   │   │   ├── AcmeSh.php
│   │   │   │   │   └── index.html
│   │   │   │   ├── Nginx.php
│   │   │   │   ├── NginxFcgi.php
│   │   │   │   ├── Php/
│   │   │   │   │   ├── Fcgid.php
│   │   │   │   │   ├── Fpm.php
│   │   │   │   │   ├── PhpInterface.php
│   │   │   │   │   └── index.html
│   │   │   │   ├── WebserverBase.php
│   │   │   │   └── index.html
│   │   │   ├── Mail/
│   │   │   │   └── Rspamd.php
│   │   │   ├── System/
│   │   │   │   ├── ExportCron.php
│   │   │   │   ├── Extrausers.php
│   │   │   │   ├── MailboxsizeCron.php
│   │   │   │   ├── SshKeys.php
│   │   │   │   ├── TasksCron.php
│   │   │   │   └── index.html
│   │   │   ├── TaskId.php
│   │   │   ├── Traffic/
│   │   │   │   ├── ReportsCron.php
│   │   │   │   ├── TrafficCron.php
│   │   │   │   └── index.html
│   │   │   └── index.html
│   │   ├── CurrentUser.php
│   │   ├── Customer/
│   │   │   ├── Customer.php
│   │   │   └── index.html
│   │   ├── Database/
│   │   │   ├── Database.php
│   │   │   ├── DbManager.php
│   │   │   ├── IntegrityCheck.php
│   │   │   ├── Manager/
│   │   │   │   ├── DbManagerMySQL.php
│   │   │   │   └── index.html
│   │   │   └── index.html
│   │   ├── Dns/
│   │   │   ├── Dns.php
│   │   │   ├── DnsEntry.php
│   │   │   ├── DnsZone.php
│   │   │   ├── PowerDNS.php
│   │   │   └── index.html
│   │   ├── Domain/
│   │   │   ├── Domain.php
│   │   │   ├── IpAddr.php
│   │   │   └── index.html
│   │   ├── ErrorBag.php
│   │   ├── FileDir.php
│   │   ├── Froxlor.php
│   │   ├── FroxlorLogger.php
│   │   ├── FroxlorTwoFactorAuth.php
│   │   ├── Http/
│   │   │   ├── Directory.php
│   │   │   ├── HttpClient.php
│   │   │   ├── PhpConfig.php
│   │   │   ├── RateLimiter.php
│   │   │   ├── Statistics.php
│   │   │   └── index.html
│   │   ├── Idna/
│   │   │   ├── IdnaWrapper.php
│   │   │   └── index.html
│   │   ├── Install/
│   │   │   ├── AutoUpdate.php
│   │   │   ├── Install/
│   │   │   │   └── Core.php
│   │   │   ├── Install.php
│   │   │   ├── Preconfig.php
│   │   │   ├── Requirements.php
│   │   │   └── Update.php
│   │   ├── Language.php
│   │   ├── MailLogParser.php
│   │   ├── PhpHelper.php
│   │   ├── SImExporter.php
│   │   ├── Settings/
│   │   │   ├── FroxlorVhostSettings.php
│   │   │   ├── Store.php
│   │   │   └── index.html
│   │   ├── Settings.php
│   │   ├── System/
│   │   │   ├── Cronjob.php
│   │   │   ├── Crypt.php
│   │   │   ├── IPTools.php
│   │   │   ├── Mailer.php
│   │   │   ├── Markdown.php
│   │   │   ├── MysqlHandler.php
│   │   │   └── index.html
│   │   ├── Traffic/
│   │   │   ├── Traffic.php
│   │   │   └── index.html
│   │   ├── UI/
│   │   │   ├── Callbacks/
│   │   │   │   ├── Admin.php
│   │   │   │   ├── Customer.php
│   │   │   │   ├── Dns.php
│   │   │   │   ├── Domain.php
│   │   │   │   ├── Email.php
│   │   │   │   ├── Ftp.php
│   │   │   │   ├── Impersonate.php
│   │   │   │   ├── Mysql.php
│   │   │   │   ├── PHPConf.php
│   │   │   │   ├── ProgressBar.php
│   │   │   │   ├── SSLCertificate.php
│   │   │   │   ├── Style.php
│   │   │   │   ├── SysLog.php
│   │   │   │   ├── Text.php
│   │   │   │   └── index.html
│   │   │   ├── Collection.php
│   │   │   ├── Data.php
│   │   │   ├── Form.php
│   │   │   ├── HTML.php
│   │   │   ├── Linker.php
│   │   │   ├── Listing.php
│   │   │   ├── Pagination.php
│   │   │   ├── Panel/
│   │   │   │   ├── CustomReflection.php
│   │   │   │   ├── FroxlorTwig.php
│   │   │   │   ├── UI.php
│   │   │   │   └── index.html
│   │   │   ├── Request.php
│   │   │   ├── Response.php
│   │   │   └── index.html
│   │   ├── User.php
│   │   ├── Validate/
│   │   │   ├── Check.php
│   │   │   ├── Form/
│   │   │   │   ├── Data.php
│   │   │   │   └── index.html
│   │   │   ├── Form.php
│   │   │   ├── Validate.php
│   │   │   └── index.html
│   │   └── index.html
│   ├── ajax.php
│   ├── config.example.inc.php
│   ├── configfiles/
│   │   ├── bookworm.xml
│   │   ├── bullseye.xml
│   │   ├── focal.xml
│   │   ├── index.html
│   │   ├── jammy.xml
│   │   ├── noble.xml
│   │   └── trixie.xml
│   ├── formfields/
│   │   ├── admin/
│   │   │   ├── admin/
│   │   │   │   ├── formfield.admin_add.php
│   │   │   │   ├── formfield.admin_edit.php
│   │   │   │   └── index.html
│   │   │   ├── cronjobs/
│   │   │   │   ├── formfield.cronjobs_edit.php
│   │   │   │   └── index.html
│   │   │   ├── customer/
│   │   │   │   ├── formfield.customer_add.php
│   │   │   │   ├── formfield.customer_edit.php
│   │   │   │   └── index.html
│   │   │   ├── domains/
│   │   │   │   ├── formfield.domains_add.php
│   │   │   │   ├── formfield.domains_duplicate.php
│   │   │   │   ├── formfield.domains_edit.php
│   │   │   │   ├── formfield.domains_import.php
│   │   │   │   └── index.html
│   │   │   ├── index.html
│   │   │   ├── ipsandports/
│   │   │   │   ├── formfield.ipsandports_add.php
│   │   │   │   ├── formfield.ipsandports_edit.php
│   │   │   │   └── index.html
│   │   │   ├── messages/
│   │   │   │   ├── formfield.messages_add.php
│   │   │   │   └── index.html
│   │   │   ├── mysqlserver/
│   │   │   │   ├── formfield.mysqlserver_add.php
│   │   │   │   ├── formfield.mysqlserver_edit.php
│   │   │   │   └── index.html
│   │   │   ├── phpconfig/
│   │   │   │   ├── formfield.fpmconfig_add.php
│   │   │   │   ├── formfield.fpmconfig_edit.php
│   │   │   │   ├── formfield.phpconfig_add.php
│   │   │   │   ├── formfield.phpconfig_edit.php
│   │   │   │   └── index.html
│   │   │   ├── plans/
│   │   │   │   ├── formfield.plans_add.php
│   │   │   │   ├── formfield.plans_edit.php
│   │   │   │   └── index.html
│   │   │   ├── settings/
│   │   │   │   ├── formfield.settings_import.php
│   │   │   │   ├── formfield.settings_mailtest.php
│   │   │   │   └── index.html
│   │   │   └── templates/
│   │   │       ├── formfield.filetemplate_add.php
│   │   │       ├── formfield.filetemplate_edit.php
│   │   │       ├── formfield.template_add.php
│   │   │       ├── formfield.template_edit.php
│   │   │       ├── index.html
│   │   │       └── template.replacers.php
│   │   ├── customer/
│   │   │   ├── domains/
│   │   │   │   ├── formfield.domains_add.php
│   │   │   │   ├── formfield.domains_edit.php
│   │   │   │   └── index.html
│   │   │   ├── email/
│   │   │   │   ├── formfield.emails_accountchangepasswd.php
│   │   │   │   ├── formfield.emails_accountchangequota.php
│   │   │   │   ├── formfield.emails_add.php
│   │   │   │   ├── formfield.emails_addaccount.php
│   │   │   │   ├── formfield.emails_addforwarder.php
│   │   │   │   ├── formfield.emails_addsender.php
│   │   │   │   ├── formfield.emails_edit.php
│   │   │   │   └── index.html
│   │   │   ├── extras/
│   │   │   │   ├── formfield.export.php
│   │   │   │   ├── formfield.htaccess_add.php
│   │   │   │   ├── formfield.htaccess_edit.php
│   │   │   │   ├── formfield.htpasswd_add.php
│   │   │   │   ├── formfield.htpasswd_edit.php
│   │   │   │   └── index.html
│   │   │   ├── ftp/
│   │   │   │   ├── formfield.ftp_add.php
│   │   │   │   ├── formfield.ftp_edit.php
│   │   │   │   ├── formfield.ftp_ssh_add.php
│   │   │   │   ├── formfield.ftp_ssh_edit.php
│   │   │   │   └── index.html
│   │   │   ├── index.html
│   │   │   └── mysql/
│   │   │       ├── formfield.mysql_add.php
│   │   │       ├── formfield.mysql_edit.php
│   │   │       ├── formfield.mysql_global_user.php
│   │   │       └── index.html
│   │   ├── formfield.api_key.php
│   │   ├── formfield.dns_add.php
│   │   ├── formfield.domain_ssleditor.php
│   │   ├── index.html
│   │   └── install/
│   │       ├── formfield.install.php
│   │       └── index.html
│   ├── functions.php
│   ├── index.html
│   ├── init.php
│   ├── navigation/
│   │   ├── 00.froxlor.main.php
│   │   └── index.html
│   ├── tablelisting/
│   │   ├── admin/
│   │   │   ├── index.html
│   │   │   ├── tablelisting.admins.php
│   │   │   ├── tablelisting.cronjobs.php
│   │   │   ├── tablelisting.customers.php
│   │   │   ├── tablelisting.domains.php
│   │   │   ├── tablelisting.filetemplates.php
│   │   │   ├── tablelisting.fpmconfigs.php
│   │   │   ├── tablelisting.integrity.php
│   │   │   ├── tablelisting.ipsandports.php
│   │   │   ├── tablelisting.mailtemplates.php
│   │   │   ├── tablelisting.mysqlserver.php
│   │   │   ├── tablelisting.phpconfigs.php
│   │   │   └── tablelisting.plans.php
│   │   ├── customer/
│   │   │   ├── index.html
│   │   │   ├── tablelisting.domains.php
│   │   │   ├── tablelisting.emails.php
│   │   │   ├── tablelisting.emails_overview.php
│   │   │   ├── tablelisting.export.php
│   │   │   ├── tablelisting.ftps.php
│   │   │   ├── tablelisting.htaccess.php
│   │   │   ├── tablelisting.htpasswd.php
│   │   │   ├── tablelisting.mysqls.php
│   │   │   └── tablelisting.sshkeys.php
│   │   ├── index.html
│   │   ├── tablelisting.apikeys.php
│   │   ├── tablelisting.dns.php
│   │   ├── tablelisting.sslcertificates.php
│   │   └── tablelisting.syslog.php
│   └── tables.inc.php
├── lng/
│   ├── ca.lng.php
│   ├── cz.lng.php
│   ├── de.lng.php
│   ├── en.lng.php
│   ├── es.lng.php
│   ├── fr.lng.php
│   ├── hu.lng.php
│   ├── index.html
│   ├── it.lng.php
│   ├── nl.lng.php
│   ├── pt.lng.php
│   ├── se.lng.php
│   ├── sk.lng.php
│   └── zh_CN.lng.php
├── logfiles_viewer.php
├── logs/
│   └── index.html
├── package.json
├── phpcs.xml
├── phpdox.xml
├── phpmd.xml
├── phpunit.xml
├── ssl_certificates.php
├── ssl_editor.php
├── templates/
│   └── index.html
├── tests/
│   ├── Admins/
│   │   └── AdminsTest.php
│   ├── Backup/
│   │   └── DataDumpTest.php
│   ├── Bulk/
│   │   └── DomainBulkTest.php
│   ├── Certificates/
│   │   └── CertificatesTest.php
│   ├── Cron/
│   │   └── TaskIdTest.php
│   ├── Cronjobs/
│   │   └── CronjobsTest.php
│   ├── Customers/
│   │   ├── CustomersTest.php
│   │   └── HostingPlansTest.php
│   ├── DomainZones/
│   │   └── DomainZonesTest.php
│   ├── Domains/
│   │   └── DomainsTest.php
│   ├── Emails/
│   │   └── EmailsTest.php
│   ├── Extras/
│   │   ├── DirOptionsTest.php
│   │   └── DirProtectionsTest.php
│   ├── Froxlor/
│   │   ├── FroxlorTest.php
│   │   ├── IPToolsTest.php
│   │   ├── SettingsTest.php
│   │   ├── StoreTest.php
│   │   └── ValidateTest.php
│   ├── Ftps/
│   │   └── FtpsTest.php
│   ├── Global/
│   │   ├── ApiParameterTest.php
│   │   └── FroxlorRpcTest.php
│   ├── IpsAndPorts/
│   │   └── IpsAndPortsTest.php
│   ├── Mysqls/
│   │   ├── MysqlServerTest.php
│   │   └── MysqlsTest.php
│   ├── PhpAndFpm/
│   │   ├── FpmDaemonsTest.php
│   │   └── PhpSettingsTest.php
│   ├── SubDomains/
│   │   └── SubDomainsTest.php
│   ├── Traffic/
│   │   └── TrafficTest.php
│   └── bootstrap.php
└── vite.config.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .editorconfig
================================================
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = tab
indent_size = 4
trim_trailing_whitespace = true

[*.md]
trim_trailing_whitespace = false

[*.{yml,yaml}]
indent_style = space
indent_size = 2

[docker-compose.yml]
indent_size = 4


================================================
FILE: .github/CONTRIBUTING.md
================================================
# Contribution

Before you start working on a PR, contact us via [Discord](https://discord.froxlor.org) or the forum at [https://forum.froxlor.org](https://forum.froxlor.org) to get a clue whether someone else isn't already working on it or if we don not want/need this certain change. Of course, bugfixes are always welcome.

Please always focus on the **main** branch of our [Github repository](https://github.com/Froxlor/Froxlor).

## Checklist

General rules for PRs are:

* Please save us all some trouble and unnecessary round-trips by _testing_ your changes.
* Re-write your commit history to provide a CLEAN history!
    * i.e. do not provide PRs which contain a commit that changes something, the next changes it back, a third one changes it again, only a little differently...

Thanks!

### Service changes

If you make changes to the functionality of service configurations, please make sure your implementation covers all supported services and distributions.

### l10n

If you add new language strings, please make sure you add the english fallback strings in `lng/en.php`.

### New settings and database-layout changes

If you add new settings or implement database-changes, please make sure you add these to

* `install/froxlor.sql.php`
* handle the update (see [`install/updates/froxlor/update_2.x.inc.php`](https://github.com/Froxlor/Froxlor/blob/main/install/updates/froxlor/update_2.x.inc.php))
* if you have any question on how update-process works, please contact us


================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: d00p
custom: ['https://paypal.me/Froxlor']


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''

---

**As a rule of thumb: before reporting an issue**
* see if it hasn't been [reported](https://github.com/Froxlor/froxlor/issues) (and possibly already been [fixed](https://github.com/Froxlor/froxlor/issues?utf8=✓&q=is:issue%20is:closed)) first
* try with the git master

**Describe the bug**
A clear and concise description of what the bug is.

**System information**
* Froxlor version: \$version/\$gitSHA1
* PHP sapi & version: php-fpm 8.3 / fcgid 8.0 / etc.
* Web server: apache2/nginx
* DNS server: Bind/PowerDNS (standalone)/PowerDNS (Bind-backend)
* POP/IMAP server: Courier/Dovecot
* SMTP server: postfix/exim
* FTP server: proftpd/pureftpd
* OS/Version: ...

**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error

**Expected behavior**
A clear and concise description of what you expected to happen.

**Logfiles**
If applicable, add log-entries to help explain your problem.

**Additional context**
Add any other context about the problem here.


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''

---

**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

**Describe the solution you'd like**
A clear and concise description of what you want to happen.

**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.

**Additional context**
Add any other context or screenshots about the feature request here.


================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
# Bug report vs. support request

If you're unsure of whether your problem is a bug or a configuration error
* contact us via IRC in #froxlor on irc.libera.chat
* or post a thread in our forum at https://forum.froxlor.org

As a rule of thumb: before reporting an issue

* see if it hasn't been [reported](https://github.com/Froxlor/froxlor/issues) (and possibly already been [fixed](https://github.com/Froxlor/froxlor/issues?utf8=✓&q=is:issue%20is:closed)) first
* try with the git master

# Summary

Please provide a concise summary of the problem you're experiencing...

# System information

* Froxlor version: $version/$gitSHA1
* PHP sapi & version: php-fpm 8.3 / fcgid 8.0 / etc.
* Web server: apache2/nginx
* DNS server: Bind/PowerDNS (standalone)/PowerDNS (Bind-backend)
* POP/IMAP server: Courier/Dovecot
* SMTP server: postfix/exim
* FTP server: proftpd/pureftpd
* OS/Version: ...

# Steps to reproduce

1.
2.
3.

# Expected behavior

1.
2.
3.

# Actual behavior

1.
2.
3.

# Log files/log entries

syslog:
<pre>
example
</pre>


================================================
FILE: .github/LICENSE_HEADER
================================================
/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 */


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
# Description

Please include a summary of the change and which issue is fixed if any. Please also include relevant motivation and context. List any dependencies that are required for this change.

Fixes # (issue)

## Type of change

Please delete options that are not relevant.

- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [ ] This change requires a documentation update

# How Has This Been Tested?

Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration

- [ ] Test A
- [ ] Test B

**Test Configuration**:

* Distribution:
* Webserver:
* PHP:
* etc.etc.:

# Checklist:

- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my feature works
- [ ] New and existing unit tests pass locally with my changes


================================================
FILE: .github/workflows/build-docs.yml
================================================
name: build-documentation

on:
  release:
    # only run for stable releases
    types: [released]

jobs:
  build_docs:
    runs-on: ubuntu-latest
    steps:
      - env:
          GITHUB_TOKEN: ${{ secrets.ORG_GITHUB_TOKEN }}
        run: |
          gh workflow run --repo Froxlor/Documentation build-and-deploy.yml -f type=tags -f ref=${{github.ref_name}}


================================================
FILE: .github/workflows/build-mariadb.yml
================================================
name: Froxlor-CI-MariaDB
on: [ 'push', 'pull_request', 'create' ]

jobs:
  froxlor:
    name: Froxlor (PHP ${{ matrix.php-versions }}, MariaDB ${{ matrix.mariadb-version }})
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        php-versions: [ '7.4', '8.4' ]
        mariadb-version: [ 10.11, 11.7 ]
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup PHP, with composer and extensions
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php-versions }}
          tools: composer:v2
          extensions: mbstring, xml, ctype, pdo_mysql, mysql, curl, json, zip, session, filter, posix, openssl, fileinfo, bcmath, gmp

      - name: Install tools
        run: sudo apt-get install -y ant

      - name: Adjust firewall
        run: |
          sudo ufw allow out 3306/tcp
          sudo ufw allow in 3306/tcp

      - name: Setup MariaDB
        uses: shogo82148/actions-setup-mysql@v1.47.0
        with:
          distribution: "mariadb"
          mysql-version: ${{ matrix.mariadb-version }}
          root-password: 'fr0xl0r.TravisCI'
          user: 'froxlor010'
          password: 'fr0xl0r.TravisCI'

      - name: Wait for database
        run: sleep 15

      - name: Setup databases
        run: |
          mysql -h 127.0.0.1 --protocol=TCP -u root -pfr0xl0r.TravisCI -e "CREATE DATABASE froxlor010;"
          php -r "echo include('install/froxlor.sql.php');" > /tmp/froxlor.sql
          mysql -h 127.0.0.1 --protocol=TCP -u root -pfr0xl0r.TravisCI froxlor010 < /tmp/froxlor.sql

      - name: Run testing
        run: ant quick-build

  nightly:
    name: Create nightly/testing tarball
    runs-on: ubuntu-latest
    needs: froxlor
    if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup PHP with PECL extension
        uses: shivammathur/setup-php@v2
        with:
          php-version: '7.4'
          tools: composer:v2
          extensions: mbstring, xml, ctype, pdo_mysql, mysql, curl, json, zip, session, filter, posix, openssl, fileinfo, bcmath, gmp, gnupg

      - name: Install composer dependencies
        run: composer install --no-dev

      - name: Install Node.js
        uses: actions/setup-node@v5
        with:
          node-version: '22.x'

      - name: Install npm dependencies
        run: npm install

      - name: Build assets
        run: npm run build
        working-directory: .

      - name: Setting file/directory permissions
        run: |
          find -exec chmod ugo+r,u+w,go-w {} \;
          find -type f -exec chmod ugo-x {} \;
          find -type d -exec chmod ugo+x {} \;
          chmod 0755 bin/froxlor-cli

      - name: Remove vcs and unneeded files
        run: |
          rm .gitignore
          rm .editorconfig
          rm -rf node_modules
          rm composer.json
          rm composer.lock
          rm package.json
          rm package-lock.json
          rm *.xml
          rm vite.config.js

      - name: Create empty index.html in built assets directory
        run: |
          touch templates/Froxlor/build/index.html
          touch templates/Froxlor/build/assets/index.html

      - name: Set outputs
        id: vars
        run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT

      - name: Set nightly branding
        run: |
          sed -i "s/const BRANDING = '';/const BRANDING = '+nightly.${{steps.vars.outputs.sha_short}}';/" lib/Froxlor/Froxlor.php
          zip -r froxlor-nightly.${{steps.vars.outputs.sha_short}}.zip . -x "*.git*"
          sha256sum froxlor-nightly.${{steps.vars.outputs.sha_short}}.zip > froxlor-nightly.${{steps.vars.outputs.sha_short}}.zip.sha256
          mkdir dist
          mv froxlor-nightly.${{steps.vars.outputs.sha_short}}.zip dist/
          mv froxlor-nightly.${{steps.vars.outputs.sha_short}}.zip.sha256 dist/

      - name: Deploy nightly to server
        uses: easingthemes/ssh-deploy@main
        with:
          ARGS: "-rltDzvO --chown=${{ secrets.WEB_USER }}:${{ secrets.WEB_USER }}"
          SOURCE: "dist/"
          SSH_PRIVATE_KEY: ${{ secrets.SERVER_SSH_KEY }}
          REMOTE_HOST: ${{ secrets.REMOTE_HOST }}
          REMOTE_USER: ${{ secrets.REMOTE_USER }}
          TARGET: "${{ secrets.REMOTE_TARGET }}"


================================================
FILE: .github/workflows/build-mysql.yml
================================================
name: Froxlor-CI-MySQL
on: ['push', 'pull_request', 'create']

jobs:
  froxlor:
    name: Froxlor (PHP ${{ matrix.php-versions }}, MySQL ${{ matrix.mysql-version }})
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        php-versions: ['7.4', '8.4']
        mysql-version: [8.4, 5.7]
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup PHP, with composer and extensions
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php-versions }}
          tools: composer:v2
          extensions: mbstring, xml, ctype, pdo_mysql, mysql, curl, json, zip, session, filter, posix, openssl, fileinfo, bcmath, gmp

      - name: Install tools
        run: sudo apt-get install -y ant

      - name: Adjust firewall
        run: |
          sudo ufw allow out 3306/tcp
          sudo ufw allow in 3306/tcp

      - name: Setup MySQL
        uses: shogo82148/actions-setup-mysql@v1.47.0
        with:
          mysql-version: ${{ matrix.mysql-version }}
          root-password: 'fr0xl0r.TravisCI'
          user: 'froxlor010'
          password: 'fr0xl0r.TravisCI'

      - name: Wait for database
        run: sleep 15

      - name: Setup database
        run: |
          mysql -h 127.0.0.1 --protocol=TCP -u root -pfr0xl0r.TravisCI -e "CREATE DATABASE froxlor010;"
          php -r "echo include('install/froxlor.sql.php');" > /tmp/froxlor.sql
          mysql -h 127.0.0.1 --protocol=TCP -u root -pfr0xl0r.TravisCI froxlor010 < /tmp/froxlor.sql

      - name: Run testing
        run: ant quick-build


================================================
FILE: .gitignore
================================================
install/update.log
install/*.json
lib/userdata.inc.php
lib/userdata.inc.php.bak
lib/config.inc.php
logs/*
!logs/index.html
.buildpath
.project
.settings/
.test/
*.diff
*.patch
*~
.well-known
.idea
.DS_Store
*.iml
img/
vendor/
node_modules/
fonts/
templates/*
!templates/index.html
!templates/Froxlor/
templates/Froxlor/build/
templates/Froxlor/hot
!templates/misc/


================================================
FILE: 2fa.php
================================================
<?php

/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 */

if (!defined('AREA')) {
	header("Location: index.php");
	exit();
}

use Froxlor\Database\Database;
use Froxlor\FroxlorLogger;
use Froxlor\FroxlorTwoFactorAuth;
use Froxlor\Settings;
use Froxlor\UI\Panel\UI;
use Froxlor\UI\Request;
use Froxlor\UI\Response;
use Froxlor\PhpHelper;
use Froxlor\User;

if (Settings::Get('2fa.enabled') != '1') {
	Response::dynamicError('2fa.2fa_not_activated');
}

// This file is being included in admin_index and customer_index
// and therefore does not need to require lib/init.php
if (AREA == 'admin') {
	$upd_stmt = Database::prepare("UPDATE `" . TABLE_PANEL_ADMINS . "` SET `type_2fa` = :t2fa, `data_2fa` = :d2fa WHERE adminid = :id");
	$uid = $userinfo['adminid'];
} elseif (AREA == 'customer') {
	$upd_stmt = Database::prepare("UPDATE `" . TABLE_PANEL_CUSTOMERS . "` SET `type_2fa` = :t2fa, `data_2fa` = :d2fa WHERE customerid = :id");
	$uid = $userinfo['customerid'];
}
$success_message = "";

$tfa = new FroxlorTwoFactorAuth('Froxlor ' . Settings::Get('system.hostname'));

// do the delete and then just show a success-message
if ($action == 'delete') {
	Database::pexecute($upd_stmt, [
		't2fa' => 0,
		'd2fa' => "",
		'id' => $uid
	]);
	Response::standardSuccess('2fa.2fa_removed');
} elseif ($action == 'preadd') {
	$type = Request::post('type_2fa', '0');

	$data = "";
	if ($type > 0) {
		// generate secret for TOTP
		$data = $tfa->createSecret();

		$userinfo['type_2fa'] = $type;
		$userinfo['data_2fa'] = $data;
		$userinfo['2fa_unsaved'] = true;

		// if type = email, send a code there for confirmation
		if ($type == 1) {
			$code = $tfa->getCode($data);
			$_mailerror = false;
			$mailerr_msg = "";
			$replace_arr = [
				'CODE' => $code
			];
			$mail_body = html_entity_decode(PhpHelper::replaceVariables(lng('mails.2fa.mailbody'), $replace_arr));

			try {
				$mail->Subject = lng('mails.2fa.subject');
				$mail->AltBody = $mail_body;
				$mail->MsgHTML(str_replace("\n", "<br />", $mail_body));
				$mail->AddAddress($userinfo['email'], User::getCorrectUserSalutation($userinfo));
				$mail->Send();
			} catch (\PHPMailer\PHPMailer\Exception $e) {
				$mailerr_msg = $e->errorMessage();
				$_mailerror = true;
			} catch (Exception $e) {
				$mailerr_msg = $e->getMessage();
				$_mailerror = true;
			}

			if ($_mailerror) {
				Response::dynamicError($mailerr_msg);
			}
		}
		UI::twig()->addGlobal('userinfo', $userinfo);
	} else {
		Response::dynamicError('Select one of the possible values for 2FA');
	}
} elseif ($action == 'add') {
	$type = Request::post('type_2fa', '0');
	$data = Request::post('data_2fa', '');
	$code = Request::post('codevalidation', '');

	// validate
	$result = $tfa->verifyCode($data, $code, 3);

	if ($result) {
		if ($type == 0 || $type == 1) {
			// no fixed secret for email validation, the validation code will be set on the fly
			$data = "";
		}
		Database::pexecute($upd_stmt, [
			't2fa' => $type,
			'd2fa' => $data,
			'id' => $uid
		]);
		Response::standardSuccess('2fa.2fa_added', $filename);
	}
	Response::dynamicError('Invalid/wrong code');
}

$log->logAction(FroxlorLogger::USR_ACTION, LOG_NOTICE, "viewed 2fa::overview");

$type_select_values = [];
$ga_qrcode = '';
if ($userinfo['type_2fa'] == '0') {
	// available types
	$type_select_values = [
		0 => '-',
		1 => 'E-Mail',
		2 => 'Authenticator'
	];
	asort($type_select_values);
} elseif ($userinfo['type_2fa'] == '1') {
	// email 2fa enabled
} elseif ($userinfo['type_2fa'] == '2') {
	// authenticator 2fa enabled
	$ga_qrcode = $tfa->getQRCodeImageAsDataUri($userinfo['loginname'], $userinfo['data_2fa']);
}

UI::view('user/2fa.html.twig', [
	'type_select_values' => $type_select_values,
	'ga_qrcode' => $ga_qrcode
]);


================================================
FILE: COPYING
================================================
		    GNU GENERAL PUBLIC LICENSE
		       Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

			    Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users.  This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it.  (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.)  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.

  To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have.  You must make sure that they, too, receive or can get the
source code.  And you must show them these terms so they know their
rights.

  We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.

  Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software.  If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.

  Finally, any free program is threatened constantly by software
patents.  We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary.  To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.

  The precise terms and conditions for copying, distribution and
modification follow.

		    GNU GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License.  The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language.  (Hereinafter, translation is included without limitation in
the term "modification".)  Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.

  1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.

You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.

  2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) You must cause the modified files to carry prominent notices
    stating that you changed the files and the date of any change.

    b) You must cause any work that you distribute or publish, that in
    whole or in part contains or is derived from the Program or any
    part thereof, to be licensed as a whole at no charge to all third
    parties under the terms of this License.

    c) If the modified program normally reads commands interactively
    when run, you must cause it, when started running for such
    interactive use in the most ordinary way, to print or display an
    announcement including an appropriate copyright notice and a
    notice that there is no warranty (or else, saying that you provide
    a warranty) and that users may redistribute the program under
    these conditions, and telling the user how to view a copy of this
    License.  (Exception: if the Program itself is interactive but
    does not normally print such an announcement, your work based on
    the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.

In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:

    a) Accompany it with the complete corresponding machine-readable
    source code, which must be distributed under the terms of Sections
    1 and 2 above on a medium customarily used for software interchange; or,

    b) Accompany it with a written offer, valid for at least three
    years, to give any third party, for a charge no more than your
    cost of physically performing source distribution, a complete
    machine-readable copy of the corresponding source code, to be
    distributed under the terms of Sections 1 and 2 above on a medium
    customarily used for software interchange; or,

    c) Accompany it with the information you received as to the offer
    to distribute corresponding source code.  (This alternative is
    allowed only for noncommercial distribution and only if you
    received the program in object code or executable form with such
    an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for
making modifications to it.  For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable.  However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.

If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.

  4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License.  Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.

  5. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Program or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.

  6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.

  7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all.  For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded.  In such case, this License incorporates
the limitation as if written in the body of this License.

  9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

Each version is given a distinguishing version number.  If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation.  If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.

  10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission.  For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this.  Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.

			    NO WARRANTY

  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.

  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

		     END OF TERMS AND CONDITIONS


================================================
FILE: README.md
================================================
[![Froxlor-CI](https://github.com/Froxlor/Froxlor/actions/workflows/build-mariadb.yml/badge.svg?branch=main)](https://github.com/Froxlor/Froxlor/actions/workflows/build-mariadb.yml)
[![Froxlor-CI](https://github.com/Froxlor/Froxlor/actions/workflows/build-mysql.yml/badge.svg?branch=main)](https://github.com/Froxlor/Froxlor/actions/workflows/build-mysql.yml)
[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.froxlor.org)

# Froxlor

The server administration software for your needs.
Developed by experienced server administrators, this panel simplifies the effort of managing your hosting platform.

## Installation

### Fast install

1. Ensure that your webserver serves /var/www/html
2. Extract froxlor into /var/www/html
3. Point your browser to http://[ip-of-webserver]/froxlor
4. Follow the installer
5. Login as administrator
6. Have fun!

If you have chosen to do the configuration by hand during the installation, you have to complete some more steps:

1. Adjust "System > Settings" according to your needs
2. Choose your distribution under "System > Configuration"
3. Follow the steps for your services

### Detailed installation

https://docs.froxlor.org/latest/general/installation/

## Help

You may find help in the following places:

### Discord

The froxlor community discord server can be found here: https://discord.froxlor.org

### Forum

The community is located on https://forum.froxlor.org/

### Documentation

The documentation may be found at https://docs.froxlor.org/

## License

May be found in [COPYING](COPYING)

## Downloads

### Tarball

https://files.froxlor.org/releases/froxlor-latest.tar.gz [MD5](https://files.froxlor.org/releases/froxlor-latest.tar.gz.md5) [SHA1](https://files.froxlor.org/releases/froxlor-latest.tar.gz.sha1)

### Debian / Ubuntu repository

[HowTo](https://docs.froxlor.org/latest/general/installation/apt-package.html)

#### Debian

```
apt -y install apt-transport-https lsb-release ca-certificates curl gnupg
curl -sSLo /usr/share/keyrings/deb.froxlor.org-froxlor.gpg https://deb.froxlor.org/froxlor.gpg
sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.froxlor.org-froxlor.gpg] https://deb.froxlor.org/debian $(lsb_release -sc) main" > /etc/apt/sources.list.d/froxlor.list'
```

#### Ubuntu

```
apt -y install apt-transport-https lsb-release ca-certificates curl gnupg
curl -sSLo /usr/share/keyrings/deb.froxlor.org-froxlor.gpg https://deb.froxlor.org/froxlor.gpg
sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.froxlor.org-froxlor.gpg] https://deb.froxlor.org/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/froxlor.list'
```

## Contributing

[see here](.github/CONTRIBUTING.md)


================================================
FILE: SECURITY.md
================================================
# froxlor's Security Policy

Welcome and thanks for taking interest in [froxlor](https://www.froxlor.org)!

We are mostly interested in reports by actual froxlor users but all high quality contributions are welcome.

Please try your best to describe a clear and realistic impact for your report and please don't open any public issues on GitHub or social media, we're doing our best to respond through huntr as quickly as we can.

With that, good luck hacking us ;)

## Supported versions

- ️✅ **2.3.x**  (`main` and `v2.3` git-branch)
- ️❌ <=2.2.x
- ❌ other git-branches

## Qualifying Vulnerabilities

### Vulnerabilities we really care about
- SQL injection bugs
- server-side code execution bugs
- cross-site scripting vulnerabilities
- cross-site request forgery vulnerabilities
- authentication and authorization flaws
- sensitive information disclosure

### Vulnerabilities we accept

Only reproducible issues on a default/clean setup from the latest stable release of a supported version will be accepted.

## Non-Qualifying Vulnerabilities

- Reports from automated tools or scanners
- Theoretical attacks without proof of exploitability
- Attacks that are the result of a third party library should be reported to the library maintainers
- Social engineering
- Attacks that require disabling security features or reducing the security level of the environment
- Exploits by an admin user itself (privileged user and implicitly trusted)
- Reflected file download
- Physical attacks
- Weak SSL/TLS/SSH algorithms or protocols
- Attacks involving physical access to a user’s device, or involving a device or network that’s already seriously compromised (eg man-in-the-middle).
- The user attacks themselves
- anything in `/doc`
- anything in `/tests`

## Reporting a Vulnerability

If you think you have found a vulnerability in froxlor, please head over to [https://github.com/Froxlor/Froxlor/security/advisories](https://github.com/Froxlor/Froxlor/security/advisories/new) and use the reporting possibilities there. Also, please give us appropriate time to fix the issue and build update-packages before publishing anything into the wild. Alternatively you can email us to [team@froxlor.org](team@froxlor.org).


================================================
FILE: actions/admin/index.html
================================================


================================================
FILE: actions/admin/settings/100.panel.php
================================================
<?php

/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 */

return [
	'groups' => [
		'panel' => [
			'title' => lng('admin.panelsettings'),
			'icon' => 'fa-solid fa-chalkboard-user',
			'fields' => [
				'panel_standardlanguage' => [
					'label' => [
						'title' => lng('login.language'),
						'description' => lng('serversettings.language.description')
					],
					'settinggroup' => 'panel',
					'varname' => 'standardlanguage',
					'type' => 'select',
					'default' => 'en',
					'option_options_method' => [
						'\\Froxlor\\Language',
						'getLanguages'
					],
					'save_method' => 'storeSettingField'
				],
				'panel_default_theme' => [
					'label' => [
						'title' => lng('panel.theme'),
						'description' => lng('serversettings.default_theme')
					],
					'settinggroup' => 'panel',
					'varname' => 'default_theme',
					'type' => 'select',
					'default' => 'Froxlor',
					'option_options_method' => [
						'\\Froxlor\\UI\\Panel\\UI',
						'getThemes'
					],
					'save_method' => 'storeSettingDefaultTheme'
				],
				'panel_allow_theme_change_customer' => [
					'label' => lng('serversettings.panel_allow_theme_change_customer'),
					'settinggroup' => 'panel',
					'varname' => 'allow_theme_change_customer',
					'type' => 'checkbox',
					'default' => true,
					'save_method' => 'storeSettingField'
				],
				'panel_allow_theme_change_admin' => [
					'label' => lng('serversettings.panel_allow_theme_change_admin'),
					'settinggroup' => 'panel',
					'varname' => 'allow_theme_change_admin',
					'type' => 'checkbox',
					'default' => true,
					'save_method' => 'storeSettingField'
				],
				'panel_natsorting' => [
					'label' => lng('serversettings.natsorting'),
					'settinggroup' => 'panel',
					'varname' => 'natsorting',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'panel_paging' => [
					'label' => lng('serversettings.paging'),
					'settinggroup' => 'panel',
					'varname' => 'paging',
					'type' => 'number',
					'min' => 0,
					'default' => 0,
					'save_method' => 'storeSettingField'
				],
				'panel_pathedit' => [
					'label' => lng('serversettings.pathedit'),
					'settinggroup' => 'panel',
					'varname' => 'pathedit',
					'type' => 'select',
					'default' => 'Manual',
					'select_var' => [
						'Manual' => lng('serversettings.manual'),
						'Dropdown' => lng('serversettings.dropdown')
					],
					'save_method' => 'storeSettingField'
				],
				'panel_adminmail' => [
					'label' => lng('serversettings.adminmail'),
					'settinggroup' => 'panel',
					'varname' => 'adminmail',
					'type' => 'email',
					'string_emptyallowed' => true,
					'default' => '',
					'save_method' => 'storeSettingField'
				],
				'panel_adminmail_defname' => [
					'label' => lng('serversettings.adminmail_defname'),
					'settinggroup' => 'panel',
					'varname' => 'adminmail_defname',
					'type' => 'text',
					'default' => 'Froxlor Administrator',
					'save_method' => 'storeSettingField'
				],
				'panel_adminmail_return' => [
					'label' => lng('serversettings.adminmail_return'),
					'settinggroup' => 'panel',
					'varname' => 'adminmail_return',
					'type' => 'email',
					'string_emptyallowed' => true,
					'default' => '',
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'panel_decimal_places' => [
					'label' => lng('serversettings.decimal_places'),
					'settinggroup' => 'panel',
					'varname' => 'decimal_places',
					'type' => 'number',
					'min' => 0,
					'max' => 15,
					'default' => 4,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'panel_phpmyadmin_url' => [
					'label' => lng('serversettings.phpmyadmin_url'),
					'settinggroup' => 'panel',
					'varname' => 'phpmyadmin_url',
					'type' => 'url',
					'string_emptyallowed' => true,
					'default' => '',
					'save_method' => 'storeSettingField'
				],
				'panel_webmail_url' => [
					'label' => lng('serversettings.webmail_url'),
					'settinggroup' => 'panel',
					'varname' => 'webmail_url',
					'type' => 'url',
					'string_emptyallowed' => true,
					'default' => '',
					'save_method' => 'storeSettingField'
				],
				'panel_webftp_url' => [
					'label' => lng('serversettings.webftp_url'),
					'settinggroup' => 'panel',
					'varname' => 'webftp_url',
					'type' => 'url',
					'string_emptyallowed' => true,
					'default' => '',
					'save_method' => 'storeSettingField'
				],
				'admin_show_version_login' => [
					'label' => lng('admin.show_version_login'),
					'settinggroup' => 'admin',
					'varname' => 'show_version_login',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'admin_show_version_footer' => [
					'label' => lng('admin.show_version_footer'),
					'settinggroup' => 'admin',
					'varname' => 'show_version_footer',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField'
				],
				'admin_show_news_feed' => [
					'label' => lng('admin.show_news_feed'),
					'settinggroup' => 'admin',
					'varname' => 'show_news_feed',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField'
				],
				'customer_show_news_feed' => [
					'label' => lng('admin.customer_show_news_feed'),
					'settinggroup' => 'customer',
					'varname' => 'show_news_feed',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField'
				],
				'customer_news_feed_url' => [
					'label' => lng('admin.customer_news_feed_url'),
					'settinggroup' => 'customer',
					'varname' => 'news_feed_url',
					'type' => 'url',
					'string_emptyallowed' => true,
					'default' => '',
					'save_method' => 'storeSettingField'
				],
				'panel_allow_domain_change_admin' => [
					'label' => lng('serversettings.panel_allow_domain_change_admin'),
					'settinggroup' => 'panel',
					'varname' => 'allow_domain_change_admin',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'panel_allow_domain_change_customer' => [
					'label' => lng('serversettings.panel_allow_domain_change_customer'),
					'settinggroup' => 'panel',
					'varname' => 'allow_domain_change_customer',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'panel_phpconfigs_hidesubdomains' => [
					'label' => lng('serversettings.panel_phpconfigs_hidesubdomains'),
					'settinggroup' => 'panel',
					'varname' => 'phpconfigs_hidesubdomains',
					'type' => 'checkbox',
					'default' => true,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'panel_phpconfigs_hidestdsubdomain' => [
					'label' => lng('serversettings.panel_phpconfigs_hidestdsubdomain'),
					'settinggroup' => 'panel',
					'varname' => 'phpconfigs_hidestdsubdomain',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'panel_customer_hide_options' => [
					'label' => lng('serversettings.panel_customer_hide_options'),
					'settinggroup' => 'panel',
					'varname' => 'customer_hide_options',
					'type' => 'select',
					'default' => '',
					'select_mode' => 'multiple',
					'option_emptyallowed' => true,
					'select_var' => [
						'email' => lng('menue.email.email'),
						'mysql' => lng('menue.mysql.mysql'),
						'domains' => lng('menue.domains.domains'),
						'ftp' => lng('menue.ftp.ftp'),
						'extras' => lng('menue.extras.extras'),
						'extras.directoryprotection' => lng('menue.extras.extras') . " / " . lng('menue.extras.directoryprotection'),
						'extras.pathoptions' => lng('menue.extras.extras') . " / " . lng('menue.extras.pathoptions'),
						'extras.logger' => lng('menue.extras.extras') . " / " . lng('menue.logger.logger'),
						'extras.export' => lng('menue.extras.extras') . " / " . lng('menue.extras.export'),
						'traffic' => lng('menue.traffic.traffic'),
						'traffic.http' => lng('menue.traffic.traffic') . " / HTTP",
						'traffic.ftp' => lng('menue.traffic.traffic') . " / FTP",
						'traffic.mail' => lng('menue.traffic.traffic') . " / Mail",
						'misc.documentation' => lng('admin.documentation'),
					],
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'panel_imprint_url' => [
					'label' => lng('serversettings.imprint_url'),
					'settinggroup' => 'panel',
					'varname' => 'imprint_url',
					'type' => 'url',
					'string_emptyallowed' => true,
					'default' => '',
					'save_method' => 'storeSettingField'
				],
				'panel_terms_url' => [
					'label' => lng('serversettings.terms_url'),
					'settinggroup' => 'panel',
					'varname' => 'terms_url',
					'type' => 'url',
					'string_emptyallowed' => true,
					'default' => '',
					'save_method' => 'storeSettingField'
				],
				'panel_privacy_url' => [
					'label' => lng('serversettings.privacy_url'),
					'settinggroup' => 'panel',
					'varname' => 'privacy_url',
					'type' => 'url',
					'string_emptyallowed' => true,
					'default' => '',
					'save_method' => 'storeSettingField'
				],
				'panel_logo_overridetheme' => [
					'label' => lng('serversettings.logo_overridetheme'),
					'settinggroup' => 'panel',
					'varname' => 'logo_overridetheme',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField'
				],
				'panel_logo_overridecustom' => [
					'label' => lng('serversettings.logo_overridecustom'),
					'settinggroup' => 'panel',
					'varname' => 'logo_overridecustom',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField'
				],
				'panel_logo_image_header' => [
					'label' => lng('serversettings.logo_image_header'),
					'settinggroup' => 'panel',
					'varname' => 'logo_image_header',
					'type' => 'image',
					'accept' => 'image/jpeg, image/jpg, image/png, image/gif',
					'image_name' => 'logo_header',
					'default' => '',
					'save_method' => 'storeSettingImage'
				],
				'panel_logo_image_login' => [
					'label' => lng('serversettings.logo_image_login'),
					'settinggroup' => 'panel',
					'varname' => 'logo_image_login',
					'type' => 'image',
					'accept' => 'image/jpeg, image/jpg, image/png, image/gif',
					'image_name' => 'logo_login',
					'default' => '',
					'save_method' => 'storeSettingImage'
				],
				'panel_menu_collapsed' => [
					'label' => lng('serversettings.panel_menu_collapsed'),
					'settinggroup' => 'panel',
					'varname' => 'menu_collapsed',
					'type' => 'checkbox',
					'default' => true,
					'save_method' => 'storeSettingField',
				],
			]
		]
	]
];


================================================
FILE: actions/admin/settings/110.accounts.php
================================================
<?php

/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 */

return [
	'groups' => [
		'accounts' => [
			'title' => lng('admin.accountsettings'),
			'icon' => 'fa-solid fa-users-gear',
			'fields' => [
				'session_sessiontimeout' => [
					'label' => lng('serversettings.session_timeout'),
					'settinggroup' => 'session',
					'varname' => 'sessiontimeout',
					'type' => 'number',
					'min' => 60,
					'max' => 31536000,
					'default' => 600,
					'save_method' => 'storeSettingField'
				],
				'session_allow_multiple_login' => [
					'label' => lng('serversettings.session_allow_multiple_login'),
					'settinggroup' => 'session',
					'varname' => 'allow_multiple_login',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField'
				],
				'login_domain_login' => [
					'label' => lng('serversettings.login_domain_login'),
					'settinggroup' => 'login',
					'varname' => 'domain_login',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField'
				],
				'login_maxloginattempts' => [
					'label' => lng('serversettings.maxloginattempts'),
					'settinggroup' => 'login',
					'varname' => 'maxloginattempts',
					'type' => 'number',
					'min' => 1,
					'default' => 3,
					'save_method' => 'storeSettingField'
				],
				'login_deactivatetime' => [
					'label' => lng('serversettings.deactivatetime'),
					'settinggroup' => 'login',
					'varname' => 'deactivatetime',
					'type' => 'number',
					'min' => 0,
					'default' => 900,
					'save_method' => 'storeSettingField'
				],
				'2fa_enabled' => [
					'label' => lng('2fa.2fa_enabled'),
					'settinggroup' => '2fa',
					'varname' => 'enabled',
					'type' => 'checkbox',
					'default' => true,
					'save_method' => 'storeSettingField'
				],
				'panel_password_min_length' => [
					'label' => lng('serversettings.panel_password_min_length'),
					'settinggroup' => 'panel',
					'varname' => 'password_min_length',
					'type' => 'number',
					'min' => 0,
					'default' => 0,
					'save_method' => 'storeSettingField'
				],
				'panel_password_alpha_lower' => [
					'label' => lng('serversettings.panel_password_alpha_lower'),
					'settinggroup' => 'panel',
					'varname' => 'password_alpha_lower',
					'type' => 'checkbox',
					'default' => true,
					'save_method' => 'storeSettingField'
				],
				'panel_password_alpha_upper' => [
					'label' => lng('serversettings.panel_password_alpha_upper'),
					'settinggroup' => 'panel',
					'varname' => 'password_alpha_upper',
					'type' => 'checkbox',
					'default' => true,
					'save_method' => 'storeSettingField'
				],
				'panel_password_numeric' => [
					'label' => lng('serversettings.panel_password_numeric'),
					'settinggroup' => 'panel',
					'varname' => 'password_numeric',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField'
				],
				'panel_password_special_char_required' => [
					'label' => lng('serversettings.panel_password_special_char_required'),
					'settinggroup' => 'panel',
					'varname' => 'password_special_char_required',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField'
				],
				'panel_password_special_char' => [
					'label' => lng('serversettings.panel_password_special_char'),
					'settinggroup' => 'panel',
					'varname' => 'password_special_char',
					'type' => 'text',
					'default' => '!?<>§$%+#=@',
					'save_method' => 'storeSettingField'
				],
				'panel_password_regex' => [
					'label' => lng('serversettings.panel_password_regex'),
					'settinggroup' => 'panel',
					'varname' => 'password_regex',
					'type' => 'text',
					'default' => '',
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'system_req_limit_per_interval' => [
					'label' => lng('serversettings.req_limit_per_interval'),
					'settinggroup' => 'system',
					'varname' => 'req_limit_per_interval',
					'type' => 'number',
					'min' => 30,
					'default' => 60,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'system_req_limit_interval' => [
					'label' => lng('serversettings.req_limit_interval'),
					'settinggroup' => 'system',
					'varname' => 'req_limit_interval',
					'type' => 'number',
					'min' => 5,
					'default' => 60,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'customer_accountprefix' => [
					'label' => lng('serversettings.accountprefix'),
					'settinggroup' => 'customer',
					'varname' => 'accountprefix',
					'type' => 'text',
					'default' => '',
					'plausibility_check_method' => [
						'\\Froxlor\\Validate\\Check',
						'checkUsername'
					],
					'save_method' => 'storeSettingField'
				],
				'customer_mysqlprefix' => [
					'label' => lng('serversettings.mysqlprefix'),
					'settinggroup' => 'customer',
					'varname' => 'mysqlprefix',
					'type' => 'text',
					'default' => '',
					'plausibility_check_method' => [
						'\\Froxlor\\Validate\\Check',
						'checkUsername'
					],
					'save_method' => 'storeSettingField'
				],
				'customer_ftpprefix' => [
					'label' => lng('serversettings.ftpprefix'),
					'settinggroup' => 'customer',
					'varname' => 'ftpprefix',
					'type' => 'text',
					'default' => '',
					'save_method' => 'storeSettingField'
				],
				'customer_ftpatdomain' => [
					'label' => lng('serversettings.ftpdomain'),
					'settinggroup' => 'customer',
					'varname' => 'ftpatdomain',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField'
				],
				'panel_allow_preset' => [
					'label' => lng('serversettings.allow_password_reset'),
					'settinggroup' => 'panel',
					'varname' => 'allow_preset',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'dependency' => [
						'fieldname' => 'panel_allow_preset_admin',
						'fielddata' => [
							'settinggroup' => 'panel',
							'varname' => 'allow_preset_admin'
						],
						'onlyif' => 0
					]
				],
				'panel_allow_preset_admin' => [
					'label' => lng('serversettings.allow_password_reset_admin'),
					'settinggroup' => 'panel',
					'varname' => 'allow_preset_admin',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'dependency' => [
						'fieldname' => 'panel_allow_preset',
						'fielddata' => [
							'settinggroup' => 'panel',
							'varname' => 'allow_preset'
						],
						'onlyif' => 1
					]
				],
				'system_exportenabled' => [
					'label' => lng('serversettings.exportenabled'),
					'settinggroup' => 'system',
					'varname' => 'exportenabled',
					'type' => 'checkbox',
					'default' => false,
					'cronmodule' => 'froxlor/export',
					'save_method' => 'storeSettingField'
				],
				'system_createstdsubdom_default' => [
					'label' => lng('serversettings.createstdsubdom_default'),
					'settinggroup' => 'system',
					'varname' => 'createstdsubdom_default',
					'type' => 'select',
					'default' => '1',
					'select_var' => [
						'0' => lng('panel.no'),
						'1' => lng('panel.yes')
					],
					'save_method' => 'storeSettingField'
				],
			]
		]
	]
];


================================================
FILE: actions/admin/settings/120.system.php
================================================
<?php

/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 */

return [
	'groups' => [
		'system' => [
			'title' => lng('admin.systemsettings'),
			'icon' => 'fa-solid fa-gears',
			'fields' => [
				'system_documentroot_prefix' => [
					'label' => lng('serversettings.documentroot_prefix'),
					'settinggroup' => 'system',
					'varname' => 'documentroot_prefix',
					'type' => 'text',
					'string_type' => 'dir',
					'default' => '/var/customers/webs/',
					'save_method' => 'storeSettingField',
					'plausibility_check_method' => [
						'\\Froxlor\\Validate\\Check',
						'checkPathConflicts'
					],
					'requires_reconf' => ['http']
				],
				'system_documentroot_use_default_value' => [
					'label' => lng('serversettings.documentroot_use_default_value'),
					'settinggroup' => 'system',
					'varname' => 'documentroot_use_default_value',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField'
				],
				'system_ipaddress' => [
					'label' => lng('serversettings.ipaddress'),
					'settinggroup' => 'system',
					'varname' => 'ipaddress',
					'type' => 'select',
					'option_options_method' => [
						'\\Froxlor\\Domain\\IpAddr',
						'getIpAddresses'
					],
					'default' => '',
					'save_method' => 'storeSettingIpAddress'
				],
				'system_defaultip' => [
					'label' => lng('serversettings.defaultip'),
					'settinggroup' => 'system',
					'varname' => 'defaultip',
					'type' => 'select',
					'select_mode' => 'multiple',
					'option_options_method' => [
						'\\Froxlor\\Domain\\IpAddr',
						'getIpPortCombinations'
					],
					'default' => '',
					'save_method' => 'storeSettingDefaultIp'
				],
				'system_defaultsslip' => [
					'label' => lng('serversettings.defaultsslip'),
					'settinggroup' => 'system',
					'varname' => 'defaultsslip',
					'type' => 'select',
					'select_mode' => 'multiple',
					'option_options_method' => [
						'\\Froxlor\\Domain\\IpAddr',
						'getSslIpPortCombinations'
					],
					'default' => '',
					'save_method' => 'storeSettingDefaultSslIp'
				],
				'system_hostname' => [
					'label' => lng('serversettings.hostname'),
					'settinggroup' => 'system',
					'varname' => 'hostname',
					'type' => 'text',
					'default' => '',
					'save_method' => 'storeSettingHostname',
					'plausibility_check_method' => [
						'\\Froxlor\\Validate\\Check',
						'checkHostname'
					]
				],
				'api_enabled' => [
					'label' => lng('serversettings.enable_api'),
					'settinggroup' => 'api',
					'varname' => 'enabled',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'required_otp' => true
				],
				'api_customer_default' => [
					'label' => lng('serversettings.api_customer_default'),
					'settinggroup' => 'api',
					'varname' => 'customer_default',
					'type' => 'select',
					'default' => 1,
					'select_var' => [
						1 => lng('panel.yes'),
						0 => lng('panel.no')
					],
					'save_method' => 'storeSettingField'
				],
				'system_update_channel' => [
					'label' => lng('serversettings.update_channel'),
					'settinggroup' => 'system',
					'varname' => 'update_channel',
					'type' => 'select',
					'default' => 'stable',
					'select_var' => [
						'stable' => lng('serversettings.uc_stable'),
						'testing' => lng('serversettings.uc_testing'),
						'nightly' => lng('serversettings.uc_nightly')
					],
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'system_validate_domain' => [
					'label' => lng('serversettings.validate_domain'),
					'settinggroup' => 'system',
					'varname' => 'validate_domain',
					'type' => 'checkbox',
					'default' => true,
					'save_method' => 'storeSettingField'
				],
				'system_stdsubdomain' => [
					'label' => lng('serversettings.stdsubdomainhost'),
					'settinggroup' => 'system',
					'varname' => 'stdsubdomain',
					'type' => 'text',
					'default' => '',
					'save_method' => 'storeSettingHostname'
				],
				'system_mysql_access_host' => [
					'label' => lng('serversettings.mysql_access_host'),
					'settinggroup' => 'system',
					'varname' => 'mysql_access_host',
					'type' => 'text',
					'default' => '127.0.0.1,localhost',
					'plausibility_check_method' => [
						'\\Froxlor\\Validate\\Check',
						'checkMysqlAccessHost'
					],
					'save_method' => 'storeSettingMysqlAccessHost'
				],
				'system_nssextrausers' => [
					'label' => lng('serversettings.nssextrausers'),
					'settinggroup' => 'system',
					'varname' => 'nssextrausers',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField'
				],
				'system_store_index_file_subs' => [
					'label' => lng('serversettings.system_store_index_file_subs'),
					'settinggroup' => 'system',
					'varname' => 'store_index_file_subs',
					'type' => 'checkbox',
					'default' => true,
					'save_method' => 'storeSettingField'
				],
				'system_report_enable' => [
					'label' => lng('serversettings.report.report'),
					'settinggroup' => 'system',
					'varname' => 'report_enable',
					'type' => 'checkbox',
					'default' => true,
					'cronmodule' => 'froxlor/reports',
					'save_method' => 'storeSettingField'
				],
				'system_report_webmax' => [
					'label' => lng('serversettings.report.webmax'),
					'settinggroup' => 'system',
					'varname' => 'report_webmax',
					'type' => 'number',
					'min' => 0,
					'max' => 150,
					'default' => 90,
					'save_method' => 'storeSettingField'
				],
				'system_report_trafficmax' => [
					'label' => lng('serversettings.report.trafficmax'),
					'settinggroup' => 'system',
					'varname' => 'report_trafficmax',
					'type' => 'number',
					'min' => 0,
					'max' => 150,
					'default' => 90,
					'save_method' => 'storeSettingField'
				],
				'system_report_web_bccadmin' => [
					'label' => lng('serversettings.report.report_web_bccadmin'),
					'settinggroup' => 'system',
					'varname' => 'report_web_bccadmin',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField'
				],
				'system_mail_use_smtp' => [
					'label' => lng('serversettings.mail_use_smtp'),
					'settinggroup' => 'system',
					'varname' => 'mail_use_smtp',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField'
				],
				'system_mail_smtp_host' => [
					'label' => lng('serversettings.mail_smtp_host'),
					'settinggroup' => 'system',
					'varname' => 'mail_smtp_host',
					'type' => 'text',
					'default' => 'localhost',
					'save_method' => 'storeSettingField'
				],
				'system_mail_smtp_port' => [
					'label' => lng('serversettings.mail_smtp_port'),
					'settinggroup' => 'system',
					'varname' => 'mail_smtp_port',
					'type' => 'number',
					'min' => 1,
					'max' => 65535,
					'default' => 25,
					'save_method' => 'storeSettingField'
				],
				'system_mail_smtp_usetls' => [
					'label' => lng('serversettings.mail_smtp_usetls'),
					'settinggroup' => 'system',
					'varname' => 'mail_smtp_usetls',
					'type' => 'checkbox',
					'default' => true,
					'save_method' => 'storeSettingField'
				],
				'system_mail_smtp_auth' => [
					'label' => lng('serversettings.mail_smtp_auth'),
					'settinggroup' => 'system',
					'varname' => 'mail_smtp_auth',
					'type' => 'checkbox',
					'default' => true,
					'save_method' => 'storeSettingField'
				],
				'system_mail_smtp_user' => [
					'label' => lng('serversettings.mail_smtp_user'),
					'settinggroup' => 'system',
					'varname' => 'mail_smtp_user',
					'type' => 'text',
					'default' => '',
					'save_method' => 'storeSettingField',
					'autocomplete' => 'off'
				],
				'system_mail_smtp_passwd' => [
					'label' => lng('serversettings.mail_smtp_passwd'),
					'settinggroup' => 'system',
					'varname' => 'mail_smtp_passwd',
					'type' => 'password',
					'default' => '',
					'save_method' => 'storeSettingField',
					'autocomplete' => 'new-password'
				],
				'system_apply_specialsettings_default' => [
					'label' => lng('serversettings.apply_specialsettings_default'),
					'settinggroup' => 'system',
					'varname' => 'apply_specialsettings_default',
					'type' => 'checkbox',
					'default' => true,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'system_apply_phpconfigs_default' => [
					'label' => lng('serversettings.apply_phpconfigs_default'),
					'settinggroup' => 'system',
					'varname' => 'apply_phpconfigs_default',
					'type' => 'checkbox',
					'default' => true,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'system_domaindefaultalias' => [
					'label' => lng('admin.domaindefaultalias'),
					'settinggroup' => 'system',
					'varname' => 'domaindefaultalias',
					'type' => 'select',
					'default' => '0',
					'select_var' => [
						'0' => lng('domains.serveraliasoption_wildcard'),
						'1' => lng('domains.serveraliasoption_www'),
						'2' => lng('domains.serveraliasoption_none')
					],
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'system_hide_incompatible_settings' => [
					'label' => lng('serversettings.hide_incompatible_settings'),
					'settinggroup' => 'system',
					'varname' => 'hide_incompatible_settings',
					'type' => 'checkbox',
					'default' => true,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
			]
		]
	]
];


================================================
FILE: actions/admin/settings/122.froxlorvhost.php
================================================
<?php

/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 */

use Froxlor\Settings;

return [
	'groups' => [
		'froxlorvhost' => [
			'title' => lng('admin.froxlorvhost') . (call_user_func([
				'\Froxlor\Settings\FroxlorVhostSettings',
				'hasVhostContainerEnabled'
			]) == false ? lng('admin.novhostcontainer') : ''),
			'icon' => 'fa-solid fa-wrench',
			'fields' => [
				/**
				 * Webserver-Vhost
				 */
				'system_froxlordirectlyviahostname' => [
					'label' => lng('serversettings.froxlordirectlyviahostname'),
					'settinggroup' => 'system',
					'varname' => 'froxlordirectlyviahostname',
					'type' => 'checkbox',
					'default' => true,
					'save_method' => 'storeSettingField'
				],
				'system_froxloraliases' => [
					'label' => lng('serversettings.froxloraliases'),
					'settinggroup' => 'system',
					'varname' => 'froxloraliases',
					'type' => 'text',
					'string_regexp' => '/^(([a-z0-9\-\._]+, ?)*[a-z0-9\-\._]+)?$/i',
					'string_emptyallowed' => true,
					'default' => '',
					'save_method' => 'storeSettingClearCertificates',
					'advanced_mode' => true
				],
				/**
				 * SSL / Let's Encrypt
				 */
				'system_le_froxlor_enabled' => [
					'label' => lng('serversettings.le_froxlor_enabled'),
					'settinggroup' => 'system',
					'varname' => 'le_froxlor_enabled',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingClearCertificates',
					'visible' => Settings::Get('system.leenabled') && call_user_func([
						'\Froxlor\Settings\FroxlorVhostSettings',
						'hasVhostContainerEnabled'
					], true),
					'requires_reconf' => ['http']
				],
				'system_le_froxlor_redirect' => [
					'label' => lng('serversettings.le_froxlor_redirect'),
					'settinggroup' => 'system',
					'varname' => 'le_froxlor_redirect',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'visible' => Settings::Get('system.use_ssl') && call_user_func([
						'\Froxlor\Settings\FroxlorVhostSettings',
						'hasVhostContainerEnabled'
					], true)
				],
				'system_hsts_maxage' => [
					'label' => lng('admin.domain_hsts_maxage'),
					'settinggroup' => 'system',
					'varname' => 'hsts_maxage',
					'type' => 'number',
					'min' => 0,
					'max' => 94608000, // 3-years
					'default' => 10368000,
					'save_method' => 'storeSettingField',
					'visible' => Settings::Get('system.use_ssl') && call_user_func([
						'\Froxlor\Settings\FroxlorVhostSettings',
						'hasVhostContainerEnabled'
					], true),
					'advanced_mode' => true
				],
				'system_hsts_incsub' => [
					'label' => lng('admin.domain_hsts_incsub'),
					'settinggroup' => 'system',
					'varname' => 'hsts_incsub',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'visible' => Settings::Get('system.use_ssl') && call_user_func([
						'\Froxlor\Settings\FroxlorVhostSettings',
						'hasVhostContainerEnabled'
					], true),
					'advanced_mode' => true
				],
				'system_hsts_preload' => [
					'label' => lng('admin.domain_hsts_preload'),
					'settinggroup' => 'system',
					'varname' => 'hsts_preload',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'visible' => Settings::Get('system.use_ssl') && call_user_func([
						'\Froxlor\Settings\FroxlorVhostSettings',
						'hasVhostContainerEnabled'
					], true),
					'advanced_mode' => true
				],
				'system_honorcipherorder' => [
					'label' => lng('admin.domain_honorcipherorder'),
					'settinggroup' => 'system',
					'varname' => 'honorcipherorder',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'visible' => Settings::Get('system.use_ssl') && call_user_func([
						'\Froxlor\Settings\FroxlorVhostSettings',
						'hasVhostContainerEnabled'
					], true),
					'advanced_mode' => true
				],
				'system_sessiontickets' => [
					'label' => lng('admin.domain_sessiontickets'),
					'settinggroup' => 'system',
					'varname' => 'sessiontickets',
					'type' => 'checkbox',
					'default' => true,
					'save_method' => 'storeSettingField',
					'visible' => Settings::Get('system.use_ssl') && call_user_func([
						'\Froxlor\Settings\FroxlorVhostSettings',
						'hasVhostContainerEnabled'
					], true),
					'advanced_mode' => true
				],
				/**
				 * FCGID
				 */
				'system_mod_fcgid_ownvhost' => [
					'label' => lng('serversettings.mod_fcgid_ownvhost'),
					'settinggroup' => 'system',
					'varname' => 'mod_fcgid_ownvhost',
					'type' => 'checkbox',
					'default' => true,
					'save_method' => 'storeSettingField',
					'websrv_avail' => [
						'apache2'
					],
					'visible' => Settings::Get('system.mod_fcgid') && call_user_func([
						'\Froxlor\Settings\FroxlorVhostSettings',
						'hasVhostContainerEnabled'
					]),
					'requires_reconf' => ['system:fcgid']
				],
				'system_mod_fcgid_httpuser' => [
					'label' => lng('admin.mod_fcgid_user'),
					'settinggroup' => 'system',
					'varname' => 'mod_fcgid_httpuser',
					'type' => 'text',
					'default' => 'froxlorlocal',
					'string_emptyallowed' => false,
					'plausibility_check_method' => [
						'\\Froxlor\\Validate\\Check',
						'checkSystemUsername'
					],
					'save_method' => 'storeSettingWebserverFcgidFpmUser',
					'websrv_avail' => [
						'apache2'
					],
					'visible' => Settings::Get('system.mod_fcgid') && call_user_func([
						'\Froxlor\Settings\FroxlorVhostSettings',
						'hasVhostContainerEnabled'
					]),
					'requires_reconf' => ['system:fcgid']
				],
				'system_mod_fcgid_httpgroup' => [
					'label' => lng('admin.mod_fcgid_group'),
					'settinggroup' => 'system',
					'varname' => 'mod_fcgid_httpgroup',
					'type' => 'text',
					'default' => 'froxlorlocal',
					'save_method' => 'storeSettingField',
					'string_emptyallowed' => false,
					'websrv_avail' => [
						'apache2'
					],
					'visible' => Settings::Get('system.mod_fcgid') && call_user_func([
						'\Froxlor\Settings\FroxlorVhostSettings',
						'hasVhostContainerEnabled'
					]),
					'requires_reconf' => ['system:fcgid']
				],
				'system_mod_fcgid_defaultini_ownvhost' => [
					'label' => lng('serversettings.mod_fcgid.defaultini_ownvhost'),
					'settinggroup' => 'system',
					'varname' => 'mod_fcgid_defaultini_ownvhost',
					'type' => 'select',
					'default' => '2',
					'option_options_method' => [
						'\\Froxlor\\Http\\PhpConfig',
						'getPhpConfigs'
					],
					'save_method' => 'storeSettingField',
					'websrv_avail' => [
						'apache2'
					],
					'visible' => Settings::Get('system.mod_fcgid') && call_user_func([
						'\Froxlor\Settings\FroxlorVhostSettings',
						'hasVhostContainerEnabled'
					])
				],
				/**
				 * php-fpm
				 */
				'phpfpm_enabled_ownvhost' => [
					'label' => lng('phpfpm.ownvhost'),
					'settinggroup' => 'phpfpm',
					'varname' => 'enabled_ownvhost',
					'type' => 'checkbox',
					'default' => true,
					'save_method' => 'storeSettingField',
					'visible' => Settings::Get('phpfpm.enabled') && call_user_func([
						'\Froxlor\Settings\FroxlorVhostSettings',
						'hasVhostContainerEnabled'
					]),
					'requires_reconf' => ['system:php-fpm']
				],
				'phpfpm_vhost_httpuser' => [
					'label' => lng('phpfpm.vhost_httpuser'),
					'settinggroup' => 'phpfpm',
					'varname' => 'vhost_httpuser',
					'type' => 'text',
					'default' => 'froxlorlocal',
					'string_emptyallowed' => false,
					'plausibility_check_method' => [
						'\\Froxlor\\Validate\\Check',
						'checkSystemUsername'
					],
					'save_method' => 'storeSettingWebserverFcgidFpmUser',
					'visible' => Settings::Get('phpfpm.enabled') && call_user_func([
						'\Froxlor\Settings\FroxlorVhostSettings',
						'hasVhostContainerEnabled'
					]),
					'requires_reconf' => ['system:php-fpm']
				],
				'phpfpm_vhost_httpgroup' => [
					'label' => lng('phpfpm.vhost_httpgroup'),
					'settinggroup' => 'phpfpm',
					'varname' => 'vhost_httpgroup',
					'type' => 'text',
					'default' => 'froxlorlocal',
					'string_emptyallowed' => false,
					'save_method' => 'storeSettingField',
					'visible' => Settings::Get('phpfpm.enabled') && call_user_func([
						'\Froxlor\Settings\FroxlorVhostSettings',
						'hasVhostContainerEnabled'
					]),
					'requires_reconf' => ['system:php-fpm']
				],
				'phpfpm_vhost_defaultini' => [
					'label' => lng('serversettings.mod_fcgid.defaultini_ownvhost'),
					'settinggroup' => 'phpfpm',
					'varname' => 'vhost_defaultini',
					'type' => 'select',
					'default' => '2',
					'option_options_method' => [
						'\\Froxlor\\Http\\PhpConfig',
						'getPhpConfigs'
					],
					'save_method' => 'storeSettingField',
					'visible' => Settings::Get('phpfpm.enabled') && call_user_func([
						'\Froxlor\Settings\FroxlorVhostSettings',
						'hasVhostContainerEnabled'
					])
				],
				/**
				 * DNS
				 */
				'system_dns_createhostnameentry' => [
					'label' => lng('serversettings.dns_createhostnameentry'),
					'settinggroup' => 'system',
					'varname' => 'dns_createhostnameentry',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'visible' => Settings::Get('system.bind_enable')
				]
			]
		]
	]
];


================================================
FILE: actions/admin/settings/125.cronjob.php
================================================
<?php

/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 */

return [
	'groups' => [
		'crond' => [
			'title' => lng('admin.cronsettings'),
			'icon' => 'fa-solid fa-clock-rotate-left',
			'advanced_mode' => true,
			'fields' => [
				'system_cronconfig' => [
					'label' => lng('serversettings.system_cronconfig'),
					'settinggroup' => 'system',
					'varname' => 'cronconfig',
					'type' => 'text',
					'string_type' => 'file',
					'default' => '/etc/cron.d/froxlor',
					'save_method' => 'storeSettingField'
				],
				'system_croncmdline' => [
					'label' => lng('serversettings.system_croncmdline'),
					'settinggroup' => 'system',
					'varname' => 'croncmdline',
					'type' => 'text',
					'string_regexp' => '/^[a-z0-9\/\._\- ]+$/i',
					'default' => '/usr/bin/nice -n 5 /usr/bin/php -q',
					'save_method' => 'storeSettingField',
					'required_otp' => true
				],
				'system_crondreload' => [
					'label' => lng('serversettings.system_crondreload'),
					'settinggroup' => 'system',
					'varname' => 'crondreload',
					'type' => 'text',
					'string_regexp' => '/^[a-z0-9\/\._\- ]+$/i',
					'default' => '/etc/init.d/cron reload',
					'save_method' => 'storeSettingField',
					'required_otp' => true
				],
				'system_cron_allowautoupdate' => [
					'label' => lng('serversettings.system_cron_allowautoupdate'),
					'settinggroup' => 'system',
					'varname' => 'cron_allowautoupdate',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'required_otp' => true
				]
			]
		]
	]
];


================================================
FILE: actions/admin/settings/130.webserver.php
================================================
<?php

/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 */

use Froxlor\Settings;

return [
	'groups' => [
		'webserver' => [
			'title' => lng('admin.webserversettings'),
			'icon' => 'fa-solid fa-server',
			'fields' => [
				'system_webserver' => [
					'label' => lng('admin.webserver'),
					'settinggroup' => 'system',
					'varname' => 'webserver',
					'type' => 'select',
					'default' => 'apache2',
					'select_var' => [
						'apache2' => 'Apache 2',
						'nginx' => 'Nginx'
					],
					'save_method' => 'storeSettingField',
					'plausibility_check_method' => [
						'\\Froxlor\\Validate\\Check',
						'checkPhpInterfaceSetting'
					],
					'requires_reconf' => ['http']
				],
				'system_apache24' => [
					'label' => lng('serversettings.apache_24'),
					'settinggroup' => 'system',
					'varname' => 'apache24',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'websrv_avail' => [
						'apache2'
					]
				],
				'system_apacheitksupport' => [
					'label' => lng('serversettings.apache_itksupport'),
					'settinggroup' => 'system',
					'varname' => 'apacheitksupport',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'visible' => (Settings::Get('system.mod_fcgid') == 0 && Settings::Get('phpfpm.enabled') == 0),
					'websrv_avail' => [
						'apache2'
					],
					'advanced_mode' => true
				],
				'system_http2_support' => [
					'label' => lng('serversettings.http2_support'),
					'settinggroup' => 'system',
					'varname' => 'http2_support',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'websrv_avail' => [
						'apache2',
						'nginx'
					],
					'visible' => Settings::Get('system.use_ssl')
				],
				'system_http3_support' => [
					'label' => lng('serversettings.http3_support'),
					'settinggroup' => 'system',
					'varname' => 'http3_support',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'websrv_avail' => [
						'nginx'
					],
					'visible' => Settings::Get('system.use_ssl')
				],
				'system_dhparams_file' => [
					'label' => lng('serversettings.dhparams_file'),
					'settinggroup' => 'system',
					'varname' => 'dhparams_file',
					'type' => 'text',
					'string_type' => 'file',
					'string_emptyallowed' => true,
					'default' => '',
					'save_method' => 'storeSettingField',
					'visible' => Settings::Get('system.use_ssl'),
					'advanced_mode' => true
				],
				'system_httpuser' => [
					'label' => lng('admin.webserver_user'),
					'settinggroup' => 'system',
					'varname' => 'httpuser',
					'type' => 'text',
					'default' => 'www-data',
					'plausibility_check_method' => [
						'\\Froxlor\\Validate\\Check',
						'checkSystemUsername'
					],
					'save_method' => 'storeSettingWebserverFcgidFpmUser'
				],
				'system_httpgroup' => [
					'label' => lng('admin.webserver_group'),
					'settinggroup' => 'system',
					'varname' => 'httpgroup',
					'type' => 'text',
					'default' => 'www-data',
					'save_method' => 'storeSettingField'
				],
				'system_apacheconf_vhost' => [
					'label' => lng('serversettings.apacheconf_vhost'),
					'settinggroup' => 'system',
					'varname' => 'apacheconf_vhost',
					'type' => 'text',
					'string_type' => 'filedir',
					'default' => '/etc/apache2/sites-enabled/',
					'save_method' => 'storeSettingField',
					'requires_reconf' => ['http']
				],
				'system_apacheconf_diroptions' => [
					'label' => lng('serversettings.apacheconf_diroptions'),
					'settinggroup' => 'system',
					'varname' => 'apacheconf_diroptions',
					'type' => 'text',
					'string_type' => 'filedir',
					'default' => '/etc/apache2/sites-enabled/',
					'save_method' => 'storeSettingField',
					'requires_reconf' => ['http']
				],
				'system_apacheconf_htpasswddir' => [
					'label' => lng('serversettings.apacheconf_htpasswddir'),
					'settinggroup' => 'system',
					'varname' => 'apacheconf_htpasswddir',
					'type' => 'text',
					'string_type' => 'confdir',
					'default' => '/etc/apache2/htpasswd/',
					'save_method' => 'storeSettingField'
				],
				'system_logfiles_directory' => [
					'label' => lng('serversettings.logfiles_directory'),
					'settinggroup' => 'system',
					'varname' => 'logfiles_directory',
					'type' => 'text',
					'string_type' => 'dir',
					'default' => '/var/customers/logs/',
					'save_method' => 'storeSettingField',
					'requires_reconf' => ['http']
				],
				'system_logfiles_script' => [
					'label' => lng('serversettings.logfiles_script'),
					'settinggroup' => 'system',
					'varname' => 'logfiles_script',
					'type' => 'text',
					'default' => '',
					'save_method' => 'storeSettingField',
					'websrv_avail' => [
						'apache2'
					],
					'advanced_mode' => true
				],
				'system_logfiles_piped' => [
					'label' => lng('serversettings.logfiles_piped'),
					'settinggroup' => 'system',
					'varname' => 'logfiles_piped',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'websrv_avail' => [
						'apache2'
					],
					'advanced_mode' => true
				],
				'system_logfiles_format' => [
					'label' => lng('serversettings.logfiles_format'),
					'settinggroup' => 'system',
					'varname' => 'logfiles_format',
					'type' => (strpos(Settings::Get('system.logfiles_format'), '"') !== false ? 'textarea' : 'text'),
					'string_regexp' => '/^[^\0\r\n<>]*$/i',
					'default' => '',
					'string_emptyallowed' => true,
					'save_method' => 'storeSettingField',
					'websrv_avail' => [
						'apache2',
						'nginx'
					],
					'visible' => Settings::Get('system.traffictool') != 'webalizer',
					'advanced_mode' => true
				],
				'system_logfiles_type' => [
					'label' => lng('serversettings.logfiles_type'),
					'settinggroup' => 'system',
					'varname' => 'logfiles_type',
					'type' => 'select',
					'default' => '1',
					'select_var' => [
						'1' => 'combined',
						'2' => 'vhost_combined'
					],
					'save_method' => 'storeSettingField',
					'websrv_avail' => [
						'apache2'
					]
				],
				'system_errorlog_level' => [
					'label' => lng('serversettings.errorlog_level'),
					'settinggroup' => 'system',
					'varname' => 'errorlog_level',
					'type' => 'select',
					'default' => (Settings::Get('system.webserver') == 'nginx' ? 'error' : 'warn'),
					'select_var' => [
						'emerg' => 'emerg',
						'alert' => 'alert',
						'crit' => 'crit',
						'error' => 'error',
						'warn' => 'warn',
						'notice' => 'notice',
						'info' => 'info',
						'debug' => 'debug'
					],
					'save_method' => 'storeSettingField',
					'websrv_avail' => [
						'apache2',
						'nginx'
					]
				],
				'system_customer_ssl_path' => [
					'label' => lng('serversettings.customerssl_directory'),
					'settinggroup' => 'system',
					'varname' => 'customer_ssl_path',
					'type' => 'text',
					'string_type' => 'confdir',
					'default' => '/etc/ssl/froxlor-custom/',
					'save_method' => 'storeSettingField'
				],
				'system_phpappendopenbasedir' => [
					'label' => lng('serversettings.phpappendopenbasedir'),
					'settinggroup' => 'system',
					'varname' => 'phpappendopenbasedir',
					'type' => 'text',
					'string_emptyallowed' => true,
					'default' => '',
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'system_deactivateddocroot' => [
					'label' => lng('serversettings.deactivateddocroot'),
					'settinggroup' => 'system',
					'varname' => 'deactivateddocroot',
					'type' => 'text',
					'string_type' => 'dir',
					'string_emptyallowed' => true,
					'default' => '',
					'save_method' => 'storeSettingField',
					'requires_reconf' => ['http']
				],
				'system_default_vhostconf' => [
					'label' => lng('serversettings.default_vhostconf'),
					'settinggroup' => 'system',
					'varname' => 'default_vhostconf',
					'type' => 'textarea',
					'default' => '',
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'system_default_sslvhostconf' => [
					'label' => lng('serversettings.default_sslvhostconf'),
					'settinggroup' => 'system',
					'varname' => 'default_sslvhostconf',
					'type' => 'textarea',
					'default' => '',
					'save_method' => 'storeSettingField',
					'visible' => Settings::Get('system.use_ssl') == 1,
					'advanced_mode' => true
				],
				'system_include_default_vhostconf' => [
					'label' => lng('serversettings.includedefault_sslvhostconf'),
					'settinggroup' => 'system',
					'varname' => 'include_default_vhostconf',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'system_apacheglobaldiropt' => [
					'label' => lng('serversettings.apache_globaldiropt'),
					'settinggroup' => 'system',
					'varname' => 'apacheglobaldiropt',
					'type' => 'textarea',
					'default' => '',
					'save_method' => 'storeSettingField',
					'visible' => (Settings::Get('system.mod_fcgid') == 0 && Settings::Get('phpfpm.enabled') == 0),
					'websrv_avail' => [
						'apache2'
					],
					'advanced_mode' => true
				],
				'system_apachereload_command' => [
					'label' => lng('serversettings.apachereload_command'),
					'settinggroup' => 'system',
					'varname' => 'apachereload_command',
					'type' => 'text',
					'string_regexp' => '/^[a-z0-9\/\._\- ]+$/i',
					'default' => '/etc/init.d/apache2 reload',
					'save_method' => 'storeSettingField',
					'required_otp' => true
				],
				'system_phpreload_command' => [
					'label' => lng('serversettings.phpreload_command'),
					'settinggroup' => 'system',
					'varname' => 'phpreload_command',
					'type' => 'text',
					'string_regexp' => '/^[a-z0-9\/\._\- ]+$/i',
					'default' => '',
					'save_method' => 'storeSettingField',
					'websrv_avail' => [
						'nginx'
					],
					'required_otp' => true
				],
				'system_nginx_php_backend' => [
					'label' => lng('serversettings.nginx_php_backend'),
					'settinggroup' => 'system',
					'varname' => 'nginx_php_backend',
					'type' => 'text',
					'default' => '127.0.0.1:8888',
					'save_method' => 'storeSettingField',
					'websrv_avail' => [
						'nginx'
					]
				],
				'nginx_fastcgiparams' => [
					'label' => lng('serversettings.nginx_fastcgiparams'),
					'settinggroup' => 'nginx',
					'varname' => 'fastcgiparams',
					'type' => 'text',
					'string_type' => 'file',
					'default' => '/etc/nginx/fastcgi_params',
					'save_method' => 'storeSettingField',
					'websrv_avail' => [
						'nginx'
					]
				],
				'defaultwebsrverrhandler_enabled' => [
					'label' => lng('serversettings.defaultwebsrverrhandler_enabled'),
					'settinggroup' => 'defaultwebsrverrhandler',
					'varname' => 'enabled',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'defaultwebsrverrhandler_err401' => [
					'label' => lng('serversettings.defaultwebsrverrhandler_err401'),
					'settinggroup' => 'defaultwebsrverrhandler',
					'varname' => 'err401',
					'type' => 'text',
					'default' => '',
					'save_method' => 'storeSettingField',
					'websrv_avail' => [
						'apache2',
						'nginx'
					],
					'advanced_mode' => true
				],
				'defaultwebsrverrhandler_err403' => [
					'label' => lng('serversettings.defaultwebsrverrhandler_err403'),
					'settinggroup' => 'defaultwebsrverrhandler',
					'varname' => 'err403',
					'type' => 'text',
					'default' => '',
					'save_method' => 'storeSettingField',
					'websrv_avail' => [
						'apache2',
						'nginx'
					],
					'advanced_mode' => true
				],
				'defaultwebsrverrhandler_err404' => [
					'label' => lng('serversettings.defaultwebsrverrhandler_err404'),
					'settinggroup' => 'defaultwebsrverrhandler',
					'varname' => 'err404',
					'type' => 'text',
					'default' => '',
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'defaultwebsrverrhandler_err500' => [
					'label' => lng('serversettings.defaultwebsrverrhandler_err500'),
					'settinggroup' => 'defaultwebsrverrhandler',
					'varname' => 'err500',
					'type' => 'text',
					'default' => '',
					'save_method' => 'storeSettingField',
					'websrv_avail' => [
						'apache2',
						'nginx'
					],
					'advanced_mode' => true
				],
				'customredirect_enabled' => [
					'label' => lng('serversettings.customredirect_enabled'),
					'settinggroup' => 'customredirect',
					'varname' => 'enabled',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField'
				],
				'customredirect_default' => [
					'label' => lng('serversettings.customredirect_default'),
					'settinggroup' => 'customredirect',
					'varname' => 'default',
					'type' => 'select',
					'default' => '1',
					'option_options_method' => ['\\Froxlor\\Domain\\Domain', 'getRedirectCodes'],
					'save_method' => 'storeSettingField'
				],
				'system_webserver_serveradmin' => [
					'label' => lng('admin.webserver_serveradmin.setting'),
					'settinggroup' => 'system',
					'varname' => 'webserver_serveradmin',
					'type' => 'select',
					'default' => 'customer',
					'select_var' => [
						'customer' => lng('admin.webserver_serveradmin.customer'),
						'admin' => lng('admin.webserver_serveradmin.admin'),
						'global' => lng('admin.webserver_serveradmin.global'),
						'none' => lng('admin.webserver_serveradmin.none')
					],
					'save_method' => 'storeSettingField',
					'websrv_avail' => [
						'apache2',
					],
				],
			]
		]
	]
];


================================================
FILE: actions/admin/settings/131.ssl.php
================================================
<?php

/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 */

use Froxlor\Froxlor;
use Froxlor\Settings;

return [
	'groups' => [
		'ssl' => [
			'title' => lng('admin.sslsettings'),
			'icon' => 'fa-solid fa-shield',
			'fields' => [
				'system_use_ssl' => [
					'label' => lng('serversettings.ssl.use_ssl'),
					'settinggroup' => 'system',
					'varname' => 'use_ssl',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'overview_option' => true,
					'requires_reconf' => ['http']
				],
				'system_ssl_protocols' => [
					'label' => lng('serversettings.ssl.ssl_protocols'),
					'settinggroup' => 'system',
					'varname' => 'ssl_protocols',
					'type' => 'select',
					'default' => 'TLSv1.2',
					'select_mode' => 'multiple',
					'select_var' => [
						'TLSv1' => 'TLSv1',
						'TLSv1.1' => 'TLSv1.1',
						'TLSv1.2' => 'TLSv1.2',
						'TLSv1.3' => 'TLSv1.3'
					],
					'save_method' => 'storeSettingField'
				],
				'system_ssl_cipher_list' => [
					'label' => lng('serversettings.ssl.ssl_cipher_list'),
					'settinggroup' => 'system',
					'varname' => 'ssl_cipher_list',
					'type' => 'text',
					'string_emptyallowed' => false,
					'default' => 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305',
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'system_tlsv13_cipher_list' => [
					'label' => lng('serversettings.ssl.tlsv13_cipher_list'),
					'settinggroup' => 'system',
					'varname' => 'tlsv13_cipher_list',
					'type' => 'text',
					'string_emptyallowed' => true,
					'default' => '',
					'visible' => Settings::Get('system.webserver') == "apache2" && Settings::Get('system.apache24') == 1,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'system_ssl_cert_file' => [
					'label' => lng('serversettings.ssl.ssl_cert_file'),
					'settinggroup' => 'system',
					'varname' => 'ssl_cert_file',
					'type' => 'text',
					'string_type' => 'file',
					'string_emptyallowed' => true,
					'default' => '/etc/ssl/froxlor_selfsigned.pem',
					'save_method' => 'storeSettingField'
				],
				'system_ssl_key_file' => [
					'label' => lng('serversettings.ssl.ssl_key_file'),
					'settinggroup' => 'system',
					'varname' => 'ssl_key_file',
					'type' => 'text',
					'string_type' => 'file',
					'string_emptyallowed' => true,
					'default' => '/etc/ssl/froxlor_selfsigned.key',
					'save_method' => 'storeSettingField'
				],
				'system_ssl_cert_chainfile' => [
					'label' => lng('admin.ipsandports.ssl_cert_chainfile'),
					'settinggroup' => 'system',
					'varname' => 'ssl_cert_chainfile',
					'type' => 'text',
					'string_type' => 'file',
					'string_emptyallowed' => true,
					'default' => '',
					'save_method' => 'storeSettingField'
				],
				'system_ssl_ca_file' => [
					'label' => lng('serversettings.ssl.ssl_ca_file'),
					'settinggroup' => 'system',
					'varname' => 'ssl_ca_file',
					'type' => 'text',
					'string_type' => 'file',
					'string_emptyallowed' => true,
					'default' => '',
					'save_method' => 'storeSettingField'
				],
				'system_apache24_ocsp_cache_path' => [
					'label' => lng('serversettings.ssl.apache24_ocsp_cache_path'),
					'settinggroup' => 'system',
					'varname' => 'apache24_ocsp_cache_path',
					'type' => 'text',
					'string_emptyallowed' => false,
					'default' => 'shmcb:/var/run/apache2/ocsp-stapling.cache(131072)',
					'visible' => Settings::Get('system.webserver') == "apache2" && Settings::Get('system.apache24') == 1,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'system_sessionticketsenabled' => [
					'label' => lng('admin.domain_sessionticketsenabled'),
					'settinggroup' => 'system',
					'varname' => 'sessionticketsenabled',
					'type' => 'checkbox',
					'default' => true,
					'save_method' => 'storeSettingField',
					'visible' => Settings::Get('system.use_ssl') && (Settings::Get('system.webserver') == "nginx" || (Settings::Get('system.webserver') == "apache2" && Settings::Get('system.apache24') == 1)),
					'advanced_mode' => true
				],
				'system_leenabled' => [
					'label' => lng('serversettings.leenabled'),
					'settinggroup' => 'system',
					'varname' => 'leenabled',
					'type' => 'checkbox',
					'default' => false,
					'cronmodule' => 'froxlor/letsencrypt',
					'save_method' => 'storeSettingField',
					'requires_reconf' => ['http']
				],
				'system_acmeshpath' => [
					'label' => lng('serversettings.acmeshpath'),
					'settinggroup' => 'system',
					'varname' => 'acmeshpath',
					'type' => 'text',
					'string_type' => 'file',
					'default' => '/root/.acme.sh/acme.sh',
					'save_method' => 'storeSettingField',
					'advanced_mode' => true,
					'required_otp' => true
				],
				'system_letsencryptacmeconf' => [
					'label' => lng('serversettings.letsencryptacmeconf'),
					'settinggroup' => 'system',
					'varname' => 'letsencryptacmeconf',
					'type' => 'text',
					'string_type' => 'file',
					'default' => '/etc/apache2/conf-enabled/acme.conf',
					'save_method' => 'storeSettingField',
					'requires_reconf' => ['http']
				],
				'system_letsencryptca' => [
					'label' => lng('serversettings.letsencryptca'),
					'settinggroup' => 'system',
					'varname' => 'letsencryptca',
					'type' => 'select',
					'default' => 'letsencrypt',
					'select_var' => [
						'letsencrypt_test' => 'Let\'s Encrypt (Test / Staging)',
						'letsencrypt' => 'Let\'s Encrypt (Live)',
						'buypass_test' => 'Buypass (Test / Staging)',
						'buypass' => 'Buypass (Live)',
						'zerossl' => 'ZeroSSL (Live)',
						'google' => 'Google (Live)',
						'google_test' => 'Google (Test / Staging)',
					],
					'save_method' => 'storeSettingField'
				],
				'system_letsencryptchallengepath' => [
					'label' => lng('serversettings.letsencryptchallengepath'),
					'settinggroup' => 'system',
					'varname' => 'letsencryptchallengepath',
					'type' => 'text',
					'string_emptyallowed' => false,
					'default' => Froxlor::getInstallDir(),
					'save_method' => 'storeSettingField',
					'advanced_mode' => true,
					'requires_reconf' => ['http']
				],
				'system_letsencryptkeysize' => [
					'label' => lng('serversettings.letsencryptkeysize'),
					'settinggroup' => 'system',
					'varname' => 'letsencryptkeysize',
					'type' => 'select',
					'default' => '2048',
					'select_var' => [
						'2048' => '2048',
						'3072' => '3072',
						'4096' => '4096',
						'8192' => '8192'
					],
					'save_method' => 'storeSettingField'
				],
				'system_leecc' => [
					'label' => lng('serversettings.letsencryptecc'),
					'settinggroup' => 'system',
					'varname' => 'leecc',
					'type' => 'select',
					'default' => '0',
					'select_var' => [
						'0' => '-',
						'256' => 'ec-256',
						'384' => 'ec-384'
					],
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'system_letsencryptreuseold' => [
					'label' => lng('serversettings.letsencryptreuseold'),
					'settinggroup' => 'system',
					'varname' => 'letsencryptreuseold',
					'type' => 'checkbox',
					'default' => true,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'system_le_domain_dnscheck' => [
					'label' => lng('serversettings.le_domain_dnscheck'),
					'settinggroup' => 'system',
					'varname' => 'le_domain_dnscheck',
					'type' => 'checkbox',
					'default' => true,
					'save_method' => 'storeSettingField'
				],
				'system_le_domain_dnscheck_resolver' => [
					'label' => lng('serversettings.le_domain_dnscheck_resolver'),
					'settinggroup' => 'system',
					'varname' => 'le_domain_dnscheck_resolver',
					'type' => 'text',
					'string_type' => 'validate_ip',
					'string_emptyallowed' => true,
					'default' => '',
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'system_le_renew_services' => [
					'label' => lng('serversettings.le_renew_services'),
					'settinggroup' => 'system',
					'varname' => 'le_renew_services',
					'type' => 'select',
					'default' => '',
					'select_mode' => 'multiple',
					'option_emptyallowed' => true,
					'select_var' => [
						'' => lng('panel.none_value'),
						'postfix' => 'postfix (smtp)',
						'dovecot' => 'dovecot <2.4 (imap/pop3)',
						'dovecot24' => 'dovecot >=2.4 (imap/pop3)',
						'proftpd' => 'proftpd (ftp)',
					],
					'save_method' => 'storeSettingFieldInsertUpdateServicesTask',
					'advanced_mode' => true
				],
				'system_le_renew_hook' => [
					'label' => lng('serversettings.le_renew_hook'),
					'settinggroup' => 'system',
					'varname' => 'le_renew_hook',
					'type' => 'text',
					'string_regexp' => '/^[a-z0-9\/\._\- ]+$/i',
					'default' => 'systemctl restart postfix dovecot proftpd',
					'save_method' => 'storeSettingFieldInsertUpdateServicesTask',
					'advanced_mode' => true,
					'required_otp' => true
				],
			]
		]
	]
];


================================================
FILE: actions/admin/settings/135.fcgid.php
================================================
<?php

/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 */

return [
	'groups' => [
		'fcgid' => [
			'title' => lng('admin.fcgid_settings'),
			'icon' => 'fa-brands fa-php',
			'websrv_avail' => [
				'apache2',
			],
			'fields' => [
				'system_mod_fcgid' => [
					'label' => lng('serversettings.mod_fcgid'),
					'settinggroup' => 'system',
					'varname' => 'mod_fcgid',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'plausibility_check_method' => [
						'\\Froxlor\\Validate\\Check',
						'checkFcgidPhpFpm'
					],
					'overview_option' => true,
					'requires_reconf' => ['http', 'system:fcgid']
				],
				'system_mod_fcgid_configdir' => [
					'label' => lng('serversettings.mod_fcgid.configdir'),
					'settinggroup' => 'system',
					'varname' => 'mod_fcgid_configdir',
					'type' => 'text',
					'string_type' => 'confdir',
					'default' => '/var/www/php-fcgi-scripts/',
					'plausibility_check_method' => [
						'\\Froxlor\\Validate\\Check',
						'checkPathConflicts'
					],
					'save_method' => 'storeSettingField',
					'requires_reconf' => ['system:fcgid']
				],
				'system_mod_fcgid_tmpdir' => [
					'label' => lng('serversettings.mod_fcgid.tmpdir'),
					'settinggroup' => 'system',
					'varname' => 'mod_fcgid_tmpdir',
					'type' => 'text',
					'string_type' => 'dir',
					'default' => '/var/customers/tmp/',
					'save_method' => 'storeSettingField',
					'requires_reconf' => ['http']
				],
				'system_mod_fcgid_peardir' => [
					'label' => lng('serversettings.mod_fcgid.peardir'),
					'settinggroup' => 'system',
					'varname' => 'mod_fcgid_peardir',
					'type' => 'text',
					'string_type' => 'dir',
					'string_delimiter' => ':',
					'string_emptyallowed' => true,
					'default' => '/usr/share/php/:/usr/share/php5/',
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'system_mod_fcgid_wrapper' => [
					'label' => lng('serversettings.mod_fcgid.wrapper'),
					'settinggroup' => 'system',
					'varname' => 'mod_fcgid_wrapper',
					'type' => 'select',
					'select_var' => [
						0 => 'ScriptAlias',
						1 => 'FcgidWrapper'
					],
					'default' => 1,
					'save_method' => 'storeSettingField',
					'websrv_avail' => [
						'apache2'
					],
					'advanced_mode' => true
				],
				'system_mod_fcgid_starter' => [
					'label' => lng('serversettings.mod_fcgid.starter'),
					'settinggroup' => 'system',
					'varname' => 'mod_fcgid_starter',
					'type' => 'number',
					'min' => 0,
					'default' => 0,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'system_mod_fcgid_maxrequests' => [
					'label' => lng('serversettings.mod_fcgid.maxrequests'),
					'settinggroup' => 'system',
					'varname' => 'mod_fcgid_maxrequests',
					'type' => 'number',
					'default' => 250,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'system_mod_fcgid_defaultini' => [
					'label' => lng('serversettings.mod_fcgid.defaultini'),
					'settinggroup' => 'system',
					'varname' => 'mod_fcgid_defaultini',
					'type' => 'select',
					'default' => '1',
					'option_options_method' => [
						'\\Froxlor\\Http\\PhpConfig',
						'getPhpConfigs'
					],
					'save_method' => 'storeSettingField'
				],
				'system_mod_fcgid_idle_timeout' => [
					'label' => lng('serversettings.mod_fcgid.idle_timeout'),
					'settinggroup' => 'system',
					'varname' => 'mod_fcgid_idle_timeout',
					'type' => 'number',
					'default' => 30,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				]
			]
		]
	]
];


================================================
FILE: actions/admin/settings/136.phpfpm.php
================================================
<?php

/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 */

use Froxlor\Settings;

return [
	'groups' => [
		'phpfpm' => [
			'title' => lng('admin.phpfpm_settings'),
			'icon' => 'fa-brands fa-php',
			'fields' => [
				'phpfpm_enabled' => [
					'label' => lng('serversettings.phpfpm'),
					'settinggroup' => 'phpfpm',
					'varname' => 'enabled',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'plausibility_check_method' => [
						'\\Froxlor\\Validate\\Check',
						'checkFcgidPhpFpm'
					],
					'overview_option' => true,
					'requires_reconf' => ['http', 'system:php-fpm']
				],
				'phpfpm_defaultini' => [
					'label' => lng('serversettings.mod_fcgid.defaultini'),
					'settinggroup' => 'phpfpm',
					'varname' => 'defaultini',
					'type' => 'select',
					'default' => '1',
					'option_options_method' => [
						'\\Froxlor\\Http\\PhpConfig',
						'getPhpConfigs'
					],
					'save_method' => 'storeSettingField'
				],
				'phpfpm_aliasconfigdir' => [
					'label' => lng('serversettings.phpfpm_settings.aliasconfigdir'),
					'settinggroup' => 'phpfpm',
					'varname' => 'aliasconfigdir',
					'type' => 'text',
					'string_type' => 'confdir',
					'default' => '/var/www/php-fpm/',
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'phpfpm_tmpdir' => [
					'label' => lng('serversettings.mod_fcgid.tmpdir'),
					'settinggroup' => 'phpfpm',
					'varname' => 'tmpdir',
					'type' => 'text',
					'string_type' => 'dir',
					'default' => '/var/customers/tmp/',
					'save_method' => 'storeSettingField'
				],
				'phpfpm_peardir' => [
					'label' => lng('serversettings.mod_fcgid.peardir'),
					'settinggroup' => 'phpfpm',
					'varname' => 'peardir',
					'type' => 'text',
					'string_type' => 'dir',
					'string_delimiter' => ':',
					'string_emptyallowed' => true,
					'default' => '/usr/share/php/:/usr/share/php5/',
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'phpfpm_envpath' => [
					'label' => lng('serversettings.phpfpm_settings.envpath'),
					'settinggroup' => 'phpfpm',
					'varname' => 'envpath',
					'type' => 'text',
					'string_type' => 'dir',
					'string_delimiter' => ':',
					'string_emptyallowed' => true,
					'default' => '/usr/local/bin:/usr/bin:/bin',
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'phpfpm_fastcgi_ipcdir' => [
					'label' => lng('serversettings.phpfpm_settings.ipcdir'),
					'settinggroup' => 'phpfpm',
					'varname' => 'fastcgi_ipcdir',
					'type' => 'text',
					'string_type' => 'dir',
					'default' => '/var/lib/apache2/fastcgi/',
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'phpfpm_use_mod_proxy' => [
					'label' => lng('phpfpm.use_mod_proxy'),
					'settinggroup' => 'phpfpm',
					'varname' => 'use_mod_proxy',
					'type' => 'checkbox',
					'default' => true,
					'visible' => Settings::Get('system.apache24'),
					'save_method' => 'storeSettingField'
				],
				'phpfpm_ini_flags' => [
					'label' => lng('phpfpm.ini_flags'),
					'settinggroup' => 'phpfpm',
					'varname' => 'ini_flags',
					'type' => 'textarea',
					'default' => '',
					'save_method' => 'storeSettingField',
					'advanced_mode' => true,
					'required_otp' => true
				],
				'phpfpm_ini_values' => [
					'label' => lng('phpfpm.ini_values'),
					'settinggroup' => 'phpfpm',
					'varname' => 'ini_values',
					'type' => 'textarea',
					'default' => '',
					'save_method' => 'storeSettingField',
					'advanced_mode' => true,
					'required_otp' => true
				],
				'phpfpm_ini_admin_flags' => [
					'label' => lng('phpfpm.ini_admin_flags'),
					'settinggroup' => 'phpfpm',
					'varname' => 'ini_admin_flags',
					'type' => 'textarea',
					'default' => '',
					'save_method' => 'storeSettingField',
					'advanced_mode' => true,
					'required_otp' => true
				],
				'phpfpm_ini_admin_values' => [
					'label' => lng('phpfpm.ini_admin_values'),
					'settinggroup' => 'phpfpm',
					'varname' => 'ini_admin_values',
					'type' => 'textarea',
					'default' => '',
					'save_method' => 'storeSettingField',
					'advanced_mode' => true,
					'required_otp' => true
				]
			]
		]
	]
];


================================================
FILE: actions/admin/settings/137.perl.php
================================================
<?php

/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 */

return [
	'groups' => [
		'perl' => [
			'title' => lng('admin.perl_settings'),
			'icon' => 'fa-solid fa-code',
			'fields' => [
				'perl_suexecworkaround' => [
					'label' => lng('serversettings.perl.suexecworkaround'),
					'settinggroup' => 'perl',
					'varname' => 'suexecworkaround',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'websrv_avail' => [
						'apache2'
					]
				],
				'perl_suexecpath' => [
					'label' => lng('serversettings.perl.suexeccgipath'),
					'settinggroup' => 'perl',
					'varname' => 'suexecpath',
					'type' => 'text',
					'string_type' => 'dir',
					'default' => '/var/www/cgi-bin/',
					'save_method' => 'storeSettingField',
					'websrv_avail' => [
						'apache2'
					]
				],
				'serversettings_perl_server' => [
					'label' => lng('serversettings.perl_server'),
					'settinggroup' => 'serversettings',
					'varname' => 'perl_server',
					'type' => 'text',
					'default' => 'unix:/var/run/nginx/cgiwrap-dispatch.sock',
					'save_method' => 'storeSettingField',
					'websrv_avail' => [
						'nginx'
					]
				]
			]
		]
	]
];


================================================
FILE: actions/admin/settings/140.statistics.php
================================================
<?php

/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 */

use Froxlor\Settings;

return [
	'groups' => [
		'statistics' => [
			'title' => lng('admin.statisticsettings'),
			'icon' => 'fa-solid fa-chart-area',
			'fields' => [
				'system_traffictool' => [
					'label' => lng('serversettings.traffictool.toolselect'),
					'settinggroup' => 'system',
					'varname' => 'traffictool',
					'type' => 'select',
					'default' => 'goaccess',
					'select_var' => [
						'webalizer' => lng('serversettings.traffictool.webalizer'),
						'awstats' => lng('serversettings.traffictool.awstats'),
						'goaccess' => lng('serversettings.traffictool.goaccess')
					],
					'save_method' => 'storeSettingUpdateTrafficTool',
					'requires_reconf' => ['system']
				],
				'system_webalizer_quiet' => [
					'label' => lng('serversettings.webalizer_quiet'),
					'settinggroup' => 'system',
					'varname' => 'webalizer_quiet',
					'type' => 'select',
					'default' => 2,
					'select_var' => [
						0 => lng('admin.webalizer.normal'),
						1 => lng('admin.webalizer.quiet'),
						2 => lng('admin.webalizer.veryquiet')
					],
					'save_method' => 'storeSettingField',
					'visible' => Settings::Get('system.traffictool') == 'webalizer'
				],
				'system_awstats_path' => [
					'label' => lng('serversettings.awstats_path'),
					'settinggroup' => 'system',
					'varname' => 'awstats_path',
					'type' => 'text',
					'string_type' => 'dir',
					'default' => '/usr/share/awstats/tools/',
					'save_method' => 'storeSettingField',
					'visible' => Settings::Get('system.traffictool') == 'awstats'
				],
				'system_awstats_awstatspath' => [
					'label' => lng('serversettings.awstats_awstatspath'),
					'settinggroup' => 'system',
					'varname' => 'awstats_awstatspath',
					'type' => 'text',
					'string_type' => 'dir',
					'default' => '/usr/lib/cgi-bin/',
					'save_method' => 'storeSettingField',
					'visible' => Settings::Get('system.traffictool') == 'awstats'
				],
				'system_awstats_conf' => [
					'label' => lng('serversettings.awstats_conf'),
					'settinggroup' => 'system',
					'varname' => 'awstats_conf',
					'type' => 'text',
					'string_type' => 'dir',
					'default' => '/etc/awstats/',
					'save_method' => 'storeSettingField',
					'visible' => Settings::Get('system.traffictool') == 'awstats',
					'requires_reconf' => ['system:awstats']
				],
				'system_awstats_icons' => [
					'label' => lng('serversettings.awstats_icons'),
					'settinggroup' => 'system',
					'varname' => 'awstats_icons',
					'type' => 'text',
					'string_type' => 'dir',
					'default' => '/usr/share/awstats/icon/',
					'save_method' => 'storeSettingField',
					'visible' => Settings::Get('system.traffictool') == 'awstats'
				],
				'system_awstats_logformat' => [
					'label' => lng('serversettings.awstats.logformat'),
					'settinggroup' => 'system',
					'varname' => 'awstats_logformat',
					'type' => 'text',
					'default' => '1',
					'save_method' => 'storeSettingField',
					'visible' => Settings::Get('system.traffictool') == 'awstats',
					'advanced_mode' => true
				]
			]
		]
	]
];


================================================
FILE: actions/admin/settings/150.mail.php
================================================
<?php

/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 */

return [
	'groups' => [
		'mail' => [
			'title' => lng('admin.mailserversettings'),
			'icon' => 'fa-solid fa-envelope',
			'fields' => [
				'system_vmail_uid' => [
					'label' => lng('serversettings.vmail_uid'),
					'settinggroup' => 'system',
					'varname' => 'vmail_uid',
					'type' => 'number',
					'default' => 2000,
					'min' => 2,
					'max' => 65535,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true,
					'requires_reconf' => ['smtp']
				],
				'system_vmail_gid' => [
					'label' => lng('serversettings.vmail_gid'),
					'settinggroup' => 'system',
					'varname' => 'vmail_gid',
					'type' => 'number',
					'default' => 2000,
					'min' => 2,
					'max' => 65535,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true,
					'requires_reconf' => ['smtp']
				],
				'system_vmail_homedir' => [
					'label' => lng('serversettings.vmail_homedir'),
					'settinggroup' => 'system',
					'varname' => 'vmail_homedir',
					'type' => 'text',
					'string_type' => 'dir',
					'default' => '/var/customers/mail/',
					'save_method' => 'storeSettingField',
					'requires_reconf' => ['smtp']
				],
				'system_vmail_maildirname' => [
					'label' => lng('serversettings.vmail_maildirname'),
					'settinggroup' => 'system',
					'varname' => 'vmail_maildirname',
					'type' => 'text',
					'string_type' => 'dir',
					'default' => 'Maildir',
					'string_emptyallowed' => true,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'panel_sendalternativemail' => [
					'label' => lng('serversettings.sendalternativemail'),
					'settinggroup' => 'panel',
					'varname' => 'sendalternativemail',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField'
				],
				'system_mail_quota_enabled' => [
					'label' => lng('serversettings.mail_quota_enabled'),
					'settinggroup' => 'system',
					'varname' => 'mail_quota_enabled',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField'
				],
				'system_mail_quota' => [
					'label' => lng('serversettings.mail_quota'),
					'settinggroup' => 'system',
					'varname' => 'mail_quota',
					'type' => 'number',
					'default' => 100,
					'save_method' => 'storeSettingField'
				],
				'catchall_catchall_enabled' => [
					'label' => lng('serversettings.catchall_enabled'),
					'settinggroup' => 'catchall',
					'varname' => 'catchall_enabled',
					'type' => 'checkbox',
					'default' => true,
					'save_method' => 'storeSettingResetCatchall'
				],
				'system_mailtraffic_enabled' => [
					'label' => lng('serversettings.mailtraffic_enabled'),
					'settinggroup' => 'system',
					'varname' => 'mailtraffic_enabled',
					'type' => 'checkbox',
					'default' => true,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'system_mdaserver' => [
					'label' => lng('serversettings.mdaserver'),
					'settinggroup' => 'system',
					'varname' => 'mdaserver',
					'type' => 'select',
					'default' => 'dovecot',
					'select_var' => [
						'courier' => 'Courier',
						'dovecot' => 'Dovecot'
					],
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'system_mdalog' => [
					'label' => lng('serversettings.mdalog'),
					'settinggroup' => 'system',
					'varname' => 'mdalog',
					'type' => 'text',
					'string_type' => 'file',
					'default' => '/var/log/mail.log',
					'string_emptyallowed' => true,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'system_mtaserver' => [
					'label' => lng('serversettings.mtaserver'),
					'settinggroup' => 'system',
					'varname' => 'mtaserver',
					'type' => 'select',
					'default' => 'postfix',
					'select_var' => [
						'exim4' => 'Exim4',
						'postfix' => 'Postfix'
					],
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'system_mtalog' => [
					'label' => lng('serversettings.mtalog'),
					'settinggroup' => 'system',
					'varname' => 'mtalog',
					'type' => 'text',
					'string_type' => 'file',
					'default' => '/var/log/mail.log',
					'string_emptyallowed' => true,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'mail_enable_allow_sender' => [
					'label' => lng('serversettings.mail_enable_allow_sender'),
					'settinggroup' => 'mail',
					'varname' => 'enable_allow_sender',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField'
				],
				'mail_allow_external_domains' => [
					'label' => lng('serversettings.mail_allow_external_domains'),
					'settinggroup' => 'mail',
					'varname' => 'allow_external_domains',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField'
				],
			]
		]
	]
];


================================================
FILE: actions/admin/settings/155.ftpserver.php
================================================
<?php

/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 */

return [
	'groups' => [
		'ftpserver' => [
			'title' => lng('admin.ftpserversettings'),
			'icon' => 'fa-solid fa-arrow-right-arrow-left',
			'fields' => [
				'system_ftpserver' => [
					'label' => lng('admin.ftpserver'),
					'settinggroup' => 'system',
					'varname' => 'ftpserver',
					'type' => 'select',
					'default' => 'proftpd',
					'select_var' => [
						'proftpd' => 'Proftpd',
						'pureftpd' => 'Pureftpd'
					],
					'save_method' => 'storeSettingField'
				]
			]
		]
	]
];


================================================
FILE: actions/admin/settings/160.nameserver.php
================================================
<?php

/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 */

use Froxlor\Settings;

return [
	'groups' => [
		'nameserver' => [
			'title' => lng('admin.nameserversettings'),
			'icon' => 'fa-solid fa-globe',
			'fields' => [
				'system_bind_enable' => [
					'label' => lng('serversettings.bindenable'),
					'settinggroup' => 'system',
					'varname' => 'bind_enable',
					'type' => 'checkbox',
					'default' => true,
					'save_method' => 'storeSettingField',
					'overview_option' => true,
					'requires_reconf' => ['dns']
				],
				'system_dnsenabled' => [
					'label' => lng('serversettings.dnseditorenable'),
					'settinggroup' => 'system',
					'varname' => 'dnsenabled',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField'
				],
				'system_dns_server' => [
					'label' => lng('serversettings.dns_server'),
					'settinggroup' => 'system',
					'varname' => 'dns_server',
					'type' => 'select',
					'default' => 'Bind',
					'select_var' => [
						'Bind' => 'Bind9',
						'PowerDNS' => 'PowerDNS'
					],
					'save_method' => 'storeSettingField',
					'requires_reconf' => ['dns']
				],
				'system_bindconf_directory' => [
					'label' => lng('serversettings.bindconf_directory'),
					'settinggroup' => 'system',
					'varname' => 'bindconf_directory',
					'type' => 'text',
					'string_type' => 'dir',
					'default' => '/etc/bind/',
					'save_method' => 'storeSettingField',
					'visible' => Settings::Get('system.dns_server') == 'Bind',
					'requires_reconf' => ['dns:bind']
				],
				'system_bindreload_command' => [
					'label' => lng('serversettings.bindreload_command'),
					'settinggroup' => 'system',
					'varname' => 'bindreload_command',
					'type' => 'text',
					'string_regexp' => '/^[a-z0-9\/\._\- ]+$/i',
					'default' => '/etc/init.d/bind9 reload',
					'save_method' => 'storeSettingField',
					'required_otp' => true
				],
				'system_nameservers' => [
					'label' => lng('serversettings.nameservers'),
					'settinggroup' => 'system',
					'varname' => 'nameservers',
					'type' => 'text',
					'string_regexp' => '/^(([a-z0-9\-\._]+, ?)*[a-z0-9\-\._]+)?$/i',
					'string_emptyallowed' => true,
					'default' => '',
					'save_method' => 'storeSettingFieldInsertBindTask'
				],
				'system_mxservers' => [
					'label' => lng('serversettings.mxservers'),
					'settinggroup' => 'system',
					'varname' => 'mxservers',
					'type' => 'text',
					'string_regexp' => '/^(([0-9]+ [a-z0-9\-\._]+, ?)*[0-9]+ [a-z0-9\-\._]+)?$/i',
					'string_emptyallowed' => true,
					'default' => '',
					'save_method' => 'storeSettingField'
				],
				'system_axfrservers' => [
					'label' => lng('serversettings.axfrservers'),
					'settinggroup' => 'system',
					'varname' => 'axfrservers',
					'type' => 'text',
					'string_type' => 'validate_ip_incl_private',
					'string_delimiter' => ',',
					'string_emptyallowed' => true,
					'default' => '',
					'save_method' => 'storeSettingField',
					'required_otp' => true
				],
				'system_powerdns_mode' => [
					'label' => lng('serversettings.powerdns_mode'),
					'settinggroup' => 'system',
					'varname' => 'powerdns_mode',
					'type' => 'select',
					'default' => 'Native',
					'select_var' => [
						'Native' => 'Native',
						'Master' => 'Master'
					],
					'save_method' => 'storeSettingField',
					'advanced_mode' => true,
					'visible' => Settings::Get('system.dns_server') == 'PowerDNS',
				],
				'system_dns_createmailentry' => [
					'label' => lng('serversettings.mail_also_with_mxservers'),
					'settinggroup' => 'system',
					'varname' => 'dns_createmailentry',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField'
				],
				'system_dns_createcaaentry' => [
					'label' => lng('serversettings.caa_entry'),
					'settinggroup' => 'system',
					'varname' => 'dns_createcaaentry',
					'type' => 'checkbox',
					'default' => true,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'caa_caa_entry' => [
					'label' => lng('serversettings.caa_entry_custom'),
					'settinggroup' => 'caa',
					'varname' => 'caa_entry',
					'type' => 'textarea',
					'default' => '',
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'system_defaultttl' => [
					'label' => lng('serversettings.defaultttl'),
					'settinggroup' => 'system',
					'varname' => 'defaultttl',
					'type' => 'number',
					'default' => 604800, /* 1 week */
					'min' => 3600, /* 1 hour */
					'max' => 2147483647, /* integer max */
					'save_method' => 'storeSettingField'
				],
				'system_soaemail' => [
					'label' => lng('serversettings.soaemail'),
					'settinggroup' => 'system',
					'varname' => 'soaemail',
					'type' => 'email',
					'string_emptyallowed' => true,
					'default' => '',
					'save_method' => 'storeSettingField'
				]
			]
		]
	]
];


================================================
FILE: actions/admin/settings/170.logger.php
================================================
<?php

/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 */

return [
	'groups' => [
		'logging' => [
			'title' => lng('admin.loggersettings'),
			'icon' => 'fa-solid fa-file-lines',
			'fields' => [
				'logger_enabled' => [
					'label' => lng('serversettings.logger.enable'),
					'settinggroup' => 'logger',
					'varname' => 'enabled',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'overview_option' => true
				],
				'logger_severity' => [
					'label' => lng('serversettings.logger.severity'),
					'settinggroup' => 'logger',
					'varname' => 'severity',
					'type' => 'select',
					'default' => 1,
					'select_var' => [
						1 => lng('admin.logger.normal'),
						2 => lng('admin.logger.paranoid')
					],
					'save_method' => 'storeSettingField'
				],
				'logger_logtypes' => [
					'label' => lng('serversettings.logger.types'),
					'settinggroup' => 'logger',
					'varname' => 'logtypes',
					'type' => 'select',
					'default' => 'syslog,mysql',
					'select_mode' => 'multiple',
					'select_var' => [
						'syslog' => 'syslog',
						'file' => 'file',
						'mysql' => 'mysql'
					],
					'save_method' => 'storeSettingField'
				],
				'logger_logfile' => [
					'label' => lng('serversettings.logger.logfile'),
					'settinggroup' => 'logger',
					'varname' => 'logfile',
					'type' => 'text',
					'string_type' => 'file',
					'string_emptyallowed' => true,
					'default' => '',
					'save_method' => 'storeSettingField'
				],
				'logger_log_cron' => [
					'label' => lng('serversettings.logger.logcron'),
					'settinggroup' => 'logger',
					'varname' => 'log_cron',
					'type' => 'select',
					'default' => 0,
					'select_var' => [
						0 => lng('serversettings.logger.logcronoption.never'),
						1 => lng('serversettings.logger.logcronoption.once'),
						2 => lng('serversettings.logger.logcronoption.always')
					],
					'save_method' => 'storeSettingField'
				]
			]
		]
	]
];


================================================
FILE: actions/admin/settings/180.antispam.php
================================================
<?php

/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 */

return [
	'groups' => [
		'antispam' => [
			'title' => lng('admin.antispam_settings'),
			'icon' => 'fa-solid fa-clipboard-check',
			'fields' => [
				'antispam_activated' => [
					'label' => lng('antispam.activated'),
					'settinggroup' => 'antispam',
					'varname' => 'activated',
					'type' => 'checkbox',
					'default' => true,
					'overview_option' => true,
					'save_method' => 'storeSettingFieldInsertAntispamTask',
				],
				'antispam_config_file' => [
					'label' => lng('antispam.config_file'),
					'settinggroup' => 'antispam',
					'varname' => 'config_file',
					'type' => 'text',
					'string_type' => 'file',
					'default' => '/etc/rspamd/local.d/froxlor_settings.conf',
					'save_method' => 'storeSettingFieldInsertAntispamTask',
					'requires_reconf' => ['antispam']
				],
				'antispam_reload_command' => [
					'label' => lng('antispam.reload_command'),
					'settinggroup' => 'antispam',
					'varname' => 'reload_command',
					'type' => 'text',
					'string_regexp' => '/^[a-z0-9\/\._\- ]+$/i',
					'default' => 'service rspamd restart',
					'save_method' => 'storeSettingField',
					'required_otp' => true
				],
				'antispam_default_bypass_spam' => [
					'label' => lng('antispam.default_bypass_spam'),
					'settinggroup' => 'antispam',
					'varname' => 'default_bypass_spam',
					'type' => 'select',
					'default' => 2,
					'select_var' => [
						1 => lng('antispam.default_select.on_changeable'),
						2 => lng('antispam.default_select.off_changeable'),
						3 => lng('antispam.default_select.on_unchangeable'),
						4 => lng('antispam.default_select.off_unchangeable'),
					],
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'antispam_default_spam_rewrite_subject' => [
					'label' => lng('antispam.default_spam_rewrite_subject'),
					'settinggroup' => 'antispam',
					'varname' => 'default_spam_rewrite_subject',
					'type' => 'select',
					'default' => 1,
					'select_var' => [
						1 => lng('antispam.default_select.on_changeable'),
						2 => lng('antispam.default_select.off_changeable'),
						3 => lng('antispam.default_select.on_unchangeable'),
						4 => lng('antispam.default_select.off_unchangeable'),
					],
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'antispam_default_policy_greylist' => [
					'label' => lng('antispam.default_policy_greylist'),
					'settinggroup' => 'antispam',
					'varname' => 'default_policy_greylist',
					'type' => 'select',
					'default' => 1,
					'select_var' => [
						1 => lng('antispam.default_select.on_changeable'),
						2 => lng('antispam.default_select.off_changeable'),
						3 => lng('antispam.default_select.on_unchangeable'),
						4 => lng('antispam.default_select.off_unchangeable'),
					],
					'save_method' => 'storeSettingField',
					'advanced_mode' => true
				],
				'antispam_dkim_keylength' => [
					'label' => lng('antispam.dkim_keylength'),
					'settinggroup' => 'antispam',
					'varname' => 'dkim_keylength',
					'type' => 'select',
					'default' => '1024',
					'select_var' => [
						'1024' => '1024 Bit',
						'2048' => '2048 Bit'
					],
					'save_method' => 'storeSettingFieldInsertBindTask',
					'advanced_mode' => true,
				],
				'spf_use_spf' => [
					'label' => lng('spf.use_spf'),
					'settinggroup' => 'spf',
					'varname' => 'use_spf',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
				],
				'spf_spf_entry' => [
					'label' => lng('spf.spf_entry'),
					'settinggroup' => 'spf',
					'varname' => 'spf_entry',
					'type' => 'text',
					'string_regexp' => '/^v=spf[a-z0-9:~?\s\.\-\/]+$/i',
					'default' => 'v=spf1 a mx -all',
					'save_method' => 'storeSettingField'
				],
				'dmarc_use_dmarc' => [
					'label' => lng('dmarc.use_dmarc'),
					'settinggroup' => 'dmarc',
					'varname' => 'use_dmarc',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
				],
				'dmarc_dmarc_entry' => [
					'label' => lng('dmarc.dmarc_entry'),
					'settinggroup' => 'dmarc',
					'varname' => 'dmarc_entry',
					'type' => 'text',
					'string_regexp' => '/^v=dmarc1(.+)$/i',
					'default' => 'v=DMARC1; p=none;',
					'save_method' => 'storeSettingField'
				]
			]
		]
	]
];


================================================
FILE: actions/admin/settings/210.security.php
================================================
<?php

/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 */

use Froxlor\Settings;

return [
	'groups' => [
		'security' => [
			'title' => lng('admin.security_settings'),
			'icon' => 'fa-solid fa-user-lock',
			'fields' => [
				'panel_unix_names' => [
					'label' => lng('serversettings.unix_names'),
					'settinggroup' => 'panel',
					'varname' => 'unix_names',
					'type' => 'checkbox',
					'default' => true,
					'save_method' => 'storeSettingField',
					'required_otp' => true
				],
				'system_mailpwcleartext' => [
					'label' => lng('serversettings.mailpwcleartext'),
					'settinggroup' => 'system',
					'varname' => 'mailpwcleartext',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true,
					'required_otp' => true
				],
				'system_passwordcryptfunc' => [
					'label' => lng('serversettings.passwordcryptfunc'),
					'settinggroup' => 'system',
					'varname' => 'passwordcryptfunc',
					'type' => 'select',
					'default' => PASSWORD_DEFAULT,
					'option_options_method' => [
						'\\Froxlor\\System\\Crypt',
						'getAvailablePasswordHashes'
					],
					'save_method' => 'storeSettingField',
					'advanced_mode' => true,
					'required_otp' => true
				],
				'system_allow_error_report_admin' => [
					'label' => lng('serversettings.allow_error_report_admin'),
					'settinggroup' => 'system',
					'varname' => 'allow_error_report_admin',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'required_otp' => true
				],
				'system_allow_error_report_customer' => [
					'label' => lng('serversettings.allow_error_report_customer'),
					'settinggroup' => 'system',
					'varname' => 'allow_error_report_customer',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'required_otp' => true
				],
				'system_allow_customer_shell' => [
					'label' => lng('serversettings.allow_allow_customer_shell'),
					'settinggroup' => 'system',
					'varname' => 'allow_customer_shell',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'advanced_mode' => true,
					'required_otp' => true
				],
				'system_available_shells' => [
					'label' => lng('serversettings.available_shells'),
					'settinggroup' => 'system',
					'varname' => 'available_shells',
					'type' => 'text',
					'string_emptyallowed' => true,
					'default' => '',
					'save_method' => 'storeSettingField',
					'advanced_mode' => true,
					'required_otp' => true
				],
				'system_froxlorusergroup' => [
					'label' => lng('serversettings.froxlorusergroup'),
					'settinggroup' => 'system',
					'varname' => 'froxlorusergroup',
					'type' => 'text',
					'default' => '',
					'save_method' => 'storeSettingField',
					'plausibility_check_method' => [
						'\\Froxlor\\Validate\\Check',
						'checkLocalGroup'
					],
					'visible' => Settings::Get('system.nssextrausers'),
					'advanced_mode' => true,
					'required_otp' => true
				],
			]
		]
	]
];


================================================
FILE: actions/admin/settings/220.quota.php
================================================
<?php

/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 */

return [
	'groups' => [
		'diskquota' => [
			'title' => lng('diskquota'),
			'icon' => 'fa-solid fa-sliders',
			'advanced_mode' => true,
			'fields' => [
				'system_diskquota_enabled' => [
					'label' => lng('serversettings.diskquota_enabled'),
					'settinggroup' => 'system',
					'varname' => 'diskquota_enabled',
					'type' => 'checkbox',
					'default' => false,
					'save_method' => 'storeSettingField',
					'overview_option' => true
				],
				'system_diskquota_repquota_path' => [
					'label' => lng('serversettings.diskquota_repquota_path.description'),
					'settinggroup' => 'system',
					'varname' => 'diskquota_repquota_path',
					'type' => 'text',
					'string_type' => 'file',
					'default' => '/usr/sbin/repquota',
					'save_method' => 'storeSettingField',
					'required_otp' => true
				],
				'system_diskquota_quotatool_path' => [
					'label' => lng('serversettings.diskquota_quotatool_path.description'),
					'settinggroup' => 'system',
					'varname' => 'diskquota_quotatool_path',
					'type' => 'text',
					'string_type' => 'file',
					'default' => '/usr/bin/quotatool',
					'save_method' => 'storeSettingField',
					'required_otp' => true
				],
				'system_diskquota_customer_partition' => [
					'label' => lng('serversettings.diskquota_customer_partition.description'),
					'settinggroup' => 'system',
					'varname' => 'diskquota_customer_partition',
					'type' => 'text',
					'string_type' => 'file',
					'default' => '/dev/root',
					'save_method' => 'storeSettingField',
					'required_otp' => true
				]
			]
		]
	]
];


================================================
FILE: actions/admin/settings/index.html
================================================


================================================
FILE: actions/index.html
================================================


================================================
FILE: admin_admins.php
================================================
<?php

/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 */

const AREA = 'admin';
require __DIR__ . '/lib/init.php';

use Froxlor\Api\Commands\Admins;
use Froxlor\CurrentUser;
use Froxlor\Database\Database;
use Froxlor\FroxlorLogger;
use Froxlor\PhpHelper;
use Froxlor\Settings;
use Froxlor\UI\Collection;
use Froxlor\UI\HTML;
use Froxlor\UI\Listing;
use Froxlor\UI\Panel\UI;
use Froxlor\UI\Request;
use Froxlor\UI\Response;

$id = (int)Request::any('id');

if (($page == 'admins' || $page == 'overview') && $userinfo['change_serversettings'] == '1') {
	if ($action == '') {
		$log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, "viewed admin_admins");

		try {
			$admin_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/admin/tablelisting.admins.php';
			$collection = (new Collection(Admins::class, $userinfo))
				->withPagination($admin_list_data['admin_list']['columns'], $admin_list_data['admin_list']['default_sorting']);
		} catch (Exception $e) {
			Response::dynamicError($e->getMessage());
		}

		UI::view('user/table.html.twig', [
			'listing' => Listing::format($collection, $admin_list_data, 'admin_list'),
			'actions_links' => [
				[
					'href' => $linker->getLink(['section' => 'admins', 'page' => $page, 'action' => 'add']),
					'label' => lng('admin.admin_add')
				]
			]
		]);
	} elseif ($action == 'su') {
		try {
			$json_result = Admins::getLocal($userinfo, [
				'id' => $id
			])->get();
		} catch (Exception $e) {
			Response::dynamicError($e->getMessage());
		}
		$result = json_decode($json_result, true)['data'];
		$destination_admin = $result['loginname'];

		if ($destination_admin != '' && $result['adminid'] != $userinfo['userid']) {
			$result['switched_user'] = CurrentUser::getData();
			$result['adminsession'] = 1;
			$result['userid'] = $result['adminid'];
			session_regenerate_id(true);
			CurrentUser::setData($result);

			$log->logAction(
                FroxlorLogger::ADM_ACTION,
                LOG_INFO,
                "switched adminuser and is now '" . $destination_admin . "'"
            );
			Response::redirectTo('admin_index.php');
		} else {
			Response::redirectTo('index.php', [
				'action' => 'login'
			]);
		}
	} elseif ($action == 'delete' && $id != 0) {
		try {
			$json_result = Admins::getLocal($userinfo, [
				'id' => $id
			])->get();
		} catch (Exception $e) {
			Response::dynamicError($e->getMessage());
		}
		$result = json_decode($json_result, true)['data'];

		if ($result['loginname'] != '') {
			if ($result['adminid'] == $userinfo['userid']) {
				Response::standardError('youcantdeleteyourself');
			}

			if (Request::post('send') == 'send') {
				Admins::getLocal($userinfo, [
					'id' => $id
				])->delete();
				Response::redirectTo($filename, [
					'page' => $page
				]);
			} else {
				HTML::askYesNo('admin_admin_reallydelete', $filename, [
					'id' => $id,
					'page' => $page,
					'action' => $action
				], $result['loginname']);
			}
		}
	} elseif ($action == 'add') {
		if (Request::post('send') == 'send') {
			try {
				Admins::getLocal($userinfo, Request::postAll())->add();
			} catch (Exception $e) {
				Response::dynamicError($e->getMessage());
			}
			Response::redirectTo($filename, [
				'page' => $page
			]);
		} else {
			$ipaddress = [];
			$ipaddress[-1] = lng('admin.allips');
			$ipsandports_stmt = Database::query("
				SELECT `id`, `ip` FROM `" . TABLE_PANEL_IPSANDPORTS . "` GROUP BY `ip` ORDER BY `ip` ASC
			");
			while ($row = $ipsandports_stmt->fetch(PDO::FETCH_ASSOC)) {
				$ipaddress[$row['id']] = $row['ip'];
			}

			$admin_add_data = include_once dirname(__FILE__) . '/lib/formfields/admin/admin/formfield.admin_add.php';

			UI::view('user/form.html.twig', [
				'formaction' => $linker->getLink(['section' => 'admins']),
				'formdata' => $admin_add_data['admin_add']
			]);
		}
	} elseif ($action == 'edit' && $id != 0) {
		try {
			$json_result = Admins::getLocal($userinfo, [
				'id' => $id
			])->get();
		} catch (Exception $e) {
			Response::dynamicError($e->getMessage());
		}
		$result = json_decode($json_result, true)['data'];

		if ($result['loginname'] != '') {
			if (Request::post('send') == 'send') {
				try {
					Admins::getLocal($userinfo, Request::postAll())->update();
				} catch (Exception $e) {
					Response::dynamicError($e->getMessage());
				}
				Response::redirectTo($filename, [
					'page' => $page
				]);
			} else {
				$dec_places = Settings::Get('panel.decimal_places');
				$result['traffic'] = round($result['traffic'] / (1024 * 1024), $dec_places);
				$result['diskspace'] = round($result['diskspace'] / 1024, $dec_places);
				$result['email'] = $idna_convert->decode($result['email']);

				$ipaddress = [];
				$ipaddress[-1] = lng('admin.allips');
				$ipsandports_stmt = Database::query("
					SELECT `id`, `ip` FROM `" . TABLE_PANEL_IPSANDPORTS . "` GROUP BY `ip` ORDER BY `ip` ASC
				");
				while ($row = $ipsandports_stmt->fetch(PDO::FETCH_ASSOC)) {
					$ipaddress[$row['id']] = $row['ip'];
				}

				$result = PhpHelper::htmlentitiesArray($result);

				$admin_edit_data = include_once dirname(__FILE__) . '/lib/formfields/admin/admin/formfield.admin_edit.php';

				UI::view('user/form.html.twig', [
					'formaction' => $linker->getLink(['section' => 'admins', 'id' => $id]),
					'formdata' => $admin_edit_data['admin_edit'],
					'editid' => $id
				]);
			}
		}
	}
}


================================================
FILE: admin_apcuinfo.php
================================================
<?php

/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @author     Janos Muzsi <muzsij@hypernics.hu>
 * @author     Ralf Becker <beckerr@php.net>
 * @author     Rasmus Lerdorf <rasmus@php.net>
 * @author     Ilia Alshanetsky <ilia@prohost.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 *
 * Based on https://github.com/krakjoe/apcu/blob/master/apc.php, which is
 * licensed under the PHP licence (version 3.01), which can be viewed
 * online at https://www.php.net/license/3_01.txt
 */

use Froxlor\FroxlorLogger;
use Froxlor\UI\Panel\UI;
use Froxlor\UI\Request;
use Froxlor\UI\Response;
use Froxlor\UI\HTML;

const AREA = 'admin';
require __DIR__ . '/lib/init.php';

$horizontal_bar_size = 950; // 1280px window width

if ($action == 'delete' && function_exists('apcu_clear_cache') && $userinfo['change_serversettings'] == '1') {
	if (Request::post('send') == 'send') {
		apcu_clear_cache();
		$log->logAction(FroxlorLogger::ADM_ACTION, LOG_INFO, "cleared APCu cache");
		header('Location: ' . $linker->getLink([
				'section' => 'apcuinfo',
				'page' => 'showinfo'
			]));
		exit();
	} else {
		HTML::askYesNo('cache_reallydelete', $filename, [
			'page' => $page,
			'action' => 'delete',
		], '', [
			'section' => 'apcuinfo',
			'page' => 'showinfo'
		]);
	}
}

if (!function_exists('apcu_cache_info') || !function_exists('apcu_sma_info')) {
	Response::standardError('no_apcuinfo');
}

if ($page == 'showinfo' && $userinfo['change_serversettings'] == '1') {
	$cache = apcu_cache_info();
	$mem = apcu_sma_info();
	$time = time();
	$log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, "viewed admin_apcuinfo");

	// check for possible empty values that are used in the templates
	if (!isset($cache['file_upload_progress'])) {
		$cache['file_upload_progress'] = lng('logger.unknown');
	}

	if (!isset($cache['num_expunges'])) {
		$cache['num_expunges'] = lng('logger.unknown');
	}

	$overview = [
		'mem_size' => $mem['num_seg'] * $mem['seg_size'],
		'mem_avail' => $mem['avail_mem'],
		'mem_used' => ($mem['num_seg'] * $mem['seg_size']) - $mem['avail_mem'],
		'seg_size' => bsize($mem['seg_size']),
		'num_hits' => $cache['num_hits'],
		'num_misses' => $cache['num_misses'],
		'num_inserts' => $cache['num_inserts'],
		'req_rate_user' => sprintf("%.2f",
			$cache['num_hits'] ? (($cache['num_hits'] + $cache['num_misses']) / ($time - $cache['start_time'])) : 0),
		'hit_rate_user' => sprintf("%.2f",
			$cache['num_hits'] ? (($cache['num_hits']) / ($time - $cache['start_time'])) : 0),
		'miss_rate_user' => sprintf("%.2f",
			$cache['num_misses'] ? (($cache['num_misses']) / ($time - $cache['start_time'])) : 0),
		'insert_rate_user' => sprintf("%.2f",
			$cache['num_inserts'] ? (($cache['num_inserts']) / ($time - $cache['start_time'])) : 0),
		'apcversion' => phpversion('apcu'),
		'phpversion' => phpversion(),
		'number_vars' => $cache['num_entries'],
		'size_vars' => bsize($cache['mem_size']),
		'num_hits_and_misses' => 0 >= ($cache['num_hits'] + $cache['num_misses']) ? 1 : ($cache['num_hits'] + $cache['num_misses']),
		'file_upload_progress' => $cache['file_upload_progress'],
		'num_expunges' => $cache['num_expunges'],
		'host' => (function_exists('gethostname')
			? gethostname()
			: (php_uname('n')
				?: (empty($_SERVER['SERVER_NAME'])
					? $_SERVER['HOST_NAME']
					: $_SERVER['SERVER_NAME']
				)
			)
		),
		'server' => $_SERVER['SERVER_SOFTWARE'] ?: '',
		'start_time' => $cache['start_time'],
		'uptime' => duration($cache['start_time'])
	];

	$overview['mem_used_percentage'] = number_format(($overview['mem_used'] / $overview['mem_size']) * 100, 1);
	$overview['num_hits_percentage'] = number_format(($overview['num_hits'] / $overview['num_hits_and_misses']) * 100,
		1);
	$overview['num_misses_percentage'] = number_format(($overview['num_misses'] / $overview['num_hits_and_misses']) * 100,
		1);
	$overview['readable'] = [
		'mem_size' => bsize($overview['mem_size']),
		'mem_avail' => bsize($overview['mem_avail']),
		'mem_used' => bsize($overview['mem_used']),
		'num_hits' => number_format($overview['num_hits']),
		'num_misses' => number_format($overview['num_misses']),
		'number_vars' => number_format($overview['number_vars']),
	];

	$overview['runtimelines'] = [];
	foreach (ini_get_all('apcu') as $name => $v) {
		$value = $v['local_value'];
		$overview['runtimelines'][$name] = $value;
	}

	// Fragementation: (freeseg - 1) / total_seg
	$nseg = $freeseg = $fragsize = $freetotal = 0;
	for ($i = 0; $i < $mem['num_seg']; $i++) {
		$ptr = 0;
		foreach ($mem['block_lists'][$i] as $block) {
			if ($block['offset'] != $ptr) {
				++$nseg;
			}
			$ptr = $block['offset'] + $block['size'];
			/* Only consider blocks <5M for the fragmentation % */
			if ($block['size'] < (5 * 1024 * 1024)) {
				$fragsize += $block['size'];
			}
			$freetotal += $block['size'];
		}
		$freeseg += count($mem['block_lists'][$i]);
	}

	$overview['fragmentation'] = [];
	if ($freeseg > 1) {
		$overview['fragmentation']['used_percentage'] = number_format(($fragsize / $freetotal) * 100, 1);
		$overview['fragmentation']['used_bytes'] = $fragsize;
		$overview['fragmentation']['total_bytes'] = $freetotal;
		$overview['fragmentation']['num_frags'] = $freeseg;
		$overview['fragmentation']['readable'] = [
			'used_bytes' => bsize($fragsize),
			'total_bytes' => bsize($freetotal),
			'num_frags' => number_format($freeseg)
		];
	} else {
		$overview['fragmentation'] = 0;
	}

	UI::view('settings/apcuinfo.html.twig', [
		'apcuinfo' => $overview
	]);
}
// pretty printer for byte values
function bsize($size)
{
	$i = 0;
	$val = ['b', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
	while (($size / 1024) > 1) {
		$size /= 1024;
		++$i;
	}
	return sprintf(
		'%.2f%s%s',
		$size,
		'',
		$val[$i]
	);
}

function duration($ts)
{
	global $time;
	$years = (int)((($time - $ts) / (7 * 86400)) / 52.177457);
	$rem = (int)(($time - $ts) - ($years * 52.177457 * 7 * 86400));
	$weeks = (int)(($rem) / (7 * 86400));
	$days = (int)(($rem) / 86400) - $weeks * 7;
	$hours = (int)(($rem) / 3600) - $days * 24 - $weeks * 7 * 24;
	$mins = (int)(($rem) / 60) - $hours * 60 - $days * 24 * 60 - $weeks * 7 * 24 * 60;
	$str = '';
	if ($years == 1) {
		$str .= "$years year, ";
	}
	if ($years > 1) {
		$str .= "$years years, ";
	}
	if ($weeks == 1) {
		$str .= "$weeks week, ";
	}
	if ($weeks > 1) {
		$str .= "$weeks weeks, ";
	}
	if ($days == 1) {
		$str .= "$days day,";
	}
	if ($days > 1) {
		$str .= "$days days,";
	}
	if ($hours == 1) {
		$str .= " $hours hour and";
	}
	if ($hours > 1) {
		$str .= " $hours hours and";
	}
	if ($mins == 1) {
		$str .= " 1 minute";
	} else {
		$str .= " $mins minutes";
	}
	return $str;
}


================================================
FILE: admin_autoupdate.php
================================================
<?php

/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 */

const AREA = 'admin';
require __DIR__ . '/lib/init.php';

use Froxlor\Froxlor;
use Froxlor\FroxlorLogger;
use Froxlor\FileDir;
use Froxlor\Install\AutoUpdate;
use Froxlor\Settings;
use Froxlor\UI\Panel\UI;
use Froxlor\UI\Request;
use Froxlor\UI\Response;

if ($page != 'error') {
	// check for webupdate to be enabled
	if (Settings::Config('enable_webupdate') != true) {
		Response::redirectTo($filename, [
			'page' => 'error',
			'errno' => 11
		]);
	}
}

// display initial version check
if ($page == 'overview') {
	// log our actions
	$log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, "checking auto-update");

	// check for new version
	try {
		$result = AutoUpdate::checkVersion();
	} catch (Exception $e) {
		Response::dynamicError($e->getMessage());
	}

	if ($result == 1) {

		// anzeige über version-status mit ggfls. formular
		// zum update schritt #1 -> download
		$text = lng('admin.newerversionavailable') . ' ' . lng('admin.newerversiondetails', [AutoUpdate::getFromResult('version'), Froxlor::VERSION]);

		$upd_formfield = [
			'updates' => [
				'title' => lng('update.update'),
				'image' => 'fa-solid fa-download',
				'sections' => [
					'section_autoupd' => [
						'fields' => [
							'newversion' => ['type' => 'hidden', 'value' => AutoUpdate::getFromResult('version')]
						]
					]
				],
				'buttons' => [
					[
						'class' => 'btn-outline-secondary',
						'label' => lng('panel.cancel'),
						'type' => 'reset'
					],
					[
						'label' => lng('update.proceed')
					]
				]
			]
		];

		UI::view('user/form-note.html.twig', [
			'formaction' => $linker->getLink(['section' => 'autoupdate', 'page' => 'getdownload']),
			'formdata' => $upd_formfield['updates'],
			// alert
			'type' => 'warning',
			'alert_msg' => $text
		]);
	} else if ($result < 0 || $result > 1) {
		// remote errors
		if ($result < 0) {
			Response::dynamicError(AutoUpdate::getLastError());
		} else {
			Response::redirectTo($filename, [
				'page' => 'error',
				'errno' => $result
			]);
		}
	} else {
		// no new version
		Response::standardSuccess('update.noupdatesavail', (Settings::Get('system.update_channel') == 'testing' ? lng('serversettings.uc_testing') . ' ' : ''));
	}
} // download the new archive
elseif ($page == 'getdownload') {
	// retrieve the new version from the form
	$newversion = Request::post('newversion');

	$result = 6;
	// valid?
	if ($newversion !== null) {
		$result = AutoUpdate::downloadZip($newversion);
		if (!is_numeric($result)) {
			// to the next step
			Response::redirectTo($filename, [
				'page' => 'extract',
				'archive' => $result
			]);
		}
	}
	Response::redirectTo($filename, [
		'page' => 'error',
		'errno' => $result
	]);
} // extract and install new version
elseif ($page == 'extract') {
	if (Request::post('send') == 'send') {
		$toExtract = Request::post('archive');
		$localArchive = FileDir::makeCorrectFile(Froxlor::getInstallDir() . '/updates/' . $toExtract);
		$log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, "Extracting " . $localArchive . " to " . Froxlor::getInstallDir());
		$result = AutoUpdate::extractZip($localArchive);
		if ($result > 0) {
			// error
			Response::redirectTo($filename, [
				'page' => 'error',
				'errno' => $result
			]);
		}
		if (function_exists('opcache_reset')) {
			@opcache_reset();
		}
		// redirect to update-page
		Response::redirectTo('admin_updates.php');
	} else {
		$toExtract = Request::get('archive');
		$localArchive = FileDir::makeCorrectFile(Froxlor::getInstallDir() . '/updates/' . $toExtract);
	}

	if (!file_exists($localArchive)) {
		Response::redirectTo($filename, [
			'page' => 'error',
			'errno' => 7
		]);
	}

	$text = lng('admin.extractdownloadedzip', [$toExtract]);

	$upd_formfield = [
		'updates' => [
			'title' => lng('update.update'),
			'image' => 'fa-solid fa-download',
			'sections' => [
				'section_autoupd' => [
					'fields' => [
						'archive' => ['type' => 'hidden', 'value' => $toExtract]
					]
				]
			],
			'buttons' => [
				[
					'class' => 'btn-outline-secondary',
					'label' => lng('panel.cancel'),
					'type' => 'reset'
				],
				[
					'label' => lng('update.proceed')
				]
			]
		]
	];

	UI::view('user/form-note.html.twig', [
		'formaction' => $linker->getLink(['section' => 'autoupdate', 'page' => 'extract']),
		'formdata' => $upd_formfield['updates'],
		// alert
		'type' => 'warning',
		'alert_msg' => $text
	]);
} // display error
elseif ($page == 'error') {
	// retrieve error-number via url-parameter
	$errno = Request::get('errno', 0);

	// 2 = no Zlib
	// 3 = custom version detected
	// 4 = could not store archive to local hdd
	// 5 = some weird value came from version.froxlor.org
	// 6 = download without valid version
	// 7 = local archive does not exist
	// 8 = could not extract archive
	// 9 = checksum mismatch
	// 10 = <php-7.4
	// 11 = enable_webupdate = false
	$errmsg = 'autoupdate_' . $errno;
	if ($errno == 3) {
		$errmsg = 'customized_version';
	}
	Response::standardError($errmsg);
}


================================================
FILE: admin_configfiles.php
================================================
<?php

/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 */

const AREA = 'admin';
require __DIR__ . '/lib/init.php';

use Froxlor\Config\ConfigParser;
use Froxlor\FileDir;
use Froxlor\Froxlor;
use Froxlor\Settings;
use Froxlor\UI\Panel\UI;
use Froxlor\UI\Request;
use Froxlor\UI\Response;
use Froxlor\Validate\Validate;

if ($userinfo['change_serversettings'] == '1') {
	if ($action == 'setconfigured') {
		Settings::Set('panel.is_configured', '1', true);
		Response::redirectTo('admin_configfiles.php');
	}

	// get distro from URL param
	$distribution = Request::any('distribution');
	$reselect = Request::any('reselect', 0);

	// check for possible setting
	if (empty($distribution)) {
		$distribution = Settings::Get('system.distribution') ?? "";
	}
	if ($reselect == 2) {
		Settings::Set('system.distro_mismatch', '2');
		$reselect = 1;
	}
	if ($reselect == 1) {
		$distribution = '';
	}

	$distributions_select = [];

	$services = [];
	$config_dir = FileDir::makeCorrectDir(Froxlor::getInstallDir() . '/lib/configfiles/');

	if (!empty($distribution)) {
		if (!file_exists($config_dir . '/' . $distribution . ".xml")) {
			// unknown distribution -> redirect to select a valid distribution for config-templates
			Settings::Set('system.distribution', '');
			Response::redirectTo('admin_configfiles.php', ['reselect' => 1]);
		}

		// update setting if different
		if ($distribution != Settings::Get('system.distribution')) {
			Settings::Set('system.distribution', $distribution);
			Settings::Set('system.distro_mismatch', '0');
		}

		// create configparser object
		$configfiles = new ConfigParser($config_dir . '/' . $distribution . ".xml");

		// get distro-info
		$dist_display = $configfiles->getCompleteDistroName();

		// get all the services from the distro
		$services = $configfiles->getServices();
	} else {
		// show list of available distro's
		$distros = glob($config_dir . '*.xml');
		// read in all the distros
		foreach ($distros as $_distribution) {
			// get configparser object
			$dist = new ConfigParser($_distribution);
			// store in tmp array
			$distributions_select[str_replace(".xml", "", strtolower(basename($_distribution)))] = $dist->getCompleteDistroName();
		}

		// sort by distribution name
		asort($distributions_select);
	}

	if ($distribution != "" && !empty(Request::post('finish'))) {
		$valid_keys = ['http', 'dns', 'smtp', 'mail', 'antispam', 'ftp', 'system', 'distro'];
		unset($_POST['finish']);
		unset($_POST['csrf_token']);
		$params = Request::postAll();
		$params['distro'] = $distribution;
		$params['system'] = [];
		foreach (Request::post('system', []) as $sysdaemon) {
			$params['system'][] = $sysdaemon;
		}
		// validate params
		foreach ($params as $key => $value) {
			if (!in_array($key, $valid_keys)) {
				unset($params[$key]);
				continue;
			}
			if (!is_array($value)) {
				$params[$key] = Validate::validate($value, $key);
			} else {
				foreach ($value as $subkey => $subvalue) {
					$params[$key][$subkey] = Validate::validate($subvalue, $key.'.'.$subkey);
				}
			}
		}
		$params_content = json_encode($params);
		$params_filename = FileDir::makeCorrectFile(Froxlor::getInstallDir() . 'install/' . Froxlor::genSessionId() . '.json');
		file_put_contents($params_filename, $params_content);

		UI::twigBuffer('settings/configuration-final.html.twig', [
			'distribution' => $distribution,
			// alert
			'type' => 'info',
			'alert_msg' => lng('admin.configfiles.finishnote'),
			'basedir' => Froxlor::getInstallDir(),
			'params_filename' => $params_filename
		]);
	} else {
		if (!empty($distribution)) {
			// show available services to configure
			$fields = $services;
			$link_params = ['section' => 'configfiles', 'distribution' => $distribution];
			UI::twigBuffer('settings/configuration.html.twig', [
				'action' => $linker->getLink($link_params),
				'fields' => $fields,
				'distribution' => $distribution
			]);
		} else {
			$cfg_formfield = [
				'config' => [
					'title' => lng('admin.configfiles.serverconfiguration'),
					'image' => 'fa-solid fa-wrench',
					'description' => lng('admin.configfiles.description'),
					'sections' => [
						'section_config' => [
							'fields' => [
								'distribution' => [
									'type' => 'select',
									'select_var' => $distributions_select,
									'label' => lng('admin.configfiles.distribution'),
									'selected' => Settings::Get('system.distribution') ?? ''
								]
							]
						]
					],
					'buttons' => [
						[
							'class' => 'btn-outline-secondary',
							'label' => lng('panel.cancel'),
							'type' => 'reset'
						],
						[
							'label' => lng('update.proceed')
						]
					]
				]
			];

			UI::twigBuffer('user/form-note.html.twig', [
				'formaction' => $linker->getLink(['section' => 'configfiles']),
				'formdata' => $cfg_formfield['config'],
				'actions_links' => (int)Settings::Get('panel.is_configured') == 0 ? [
					[
						'href' => $linker->getLink([
							'section' => 'configfiles',
							'page' => 'overview',
							'action' => 'setconfigured'
						]),
						'label' => lng('panel.ihave_configured'),
						'class' => 'btn-outline-warning',
						'icon' => 'fa-solid fa-circle-check'
					]
				] : [],
				// alert
				'type' => 'warning',
				'alert_msg' => lng('panel.settings_before_configuration') . ((int)Settings::Get('panel.is_configured') == 1 ? '<br><br>' . lng('panel.system_is_configured') : '')
			]);
		}
	}

	UI::twigOutputBuffer();
} else {
	Response::redirectTo('admin_index.php');
}


================================================
FILE: admin_cronjobs.php
================================================
<?php

/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 */

const AREA = 'admin';
require __DIR__ . '/lib/init.php';

use Froxlor\Api\Commands\Cronjobs;
use Froxlor\FroxlorLogger;
use Froxlor\UI\Collection;
use Froxlor\UI\Listing;
use Froxlor\UI\Panel\UI;
use Froxlor\UI\Request;
use Froxlor\UI\Response;

$id = (int)Request::any('id');

if (($page == 'cronjobs' || $page == 'overview') && $userinfo['change_serversettings'] == '1') {
	if ($action == '') {
		$log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, 'viewed admin_cronjobs');

		try {
			$cron_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/admin/tablelisting.cronjobs.php';
			$collection = (new Collection(Cronjobs::class, $userinfo))
				->withPagination($cron_list_data['cron_list']['columns'], $cron_list_data['cron_list']['default_sorting']);
		} catch (Exception $e) {
			Response::dynamicError($e->getMessage());
		}

		UI::view('user/table-note.html.twig', [
			'listing' => Listing::format($collection, $cron_list_data, 'cron_list'),
			// alert-box
			'type' => 'warning',
			'alert_msg' => lng('cron.changewarning')
		]);
	} elseif ($action == 'new') {
		/*
		 * @TODO later
		 */
	} elseif ($action == 'edit' && $id != 0) {
		try {
			$json_result = Cronjobs::getLocal($userinfo, [
				'id' => $id
			])->get();
		} catch (Exception $e) {
			Response::dynamicError($e->getMessage());
		}
		$result = json_decode($json_result, true)['data'];
		if ($result['cronfile'] != '') {
			if (Request::post('send') == 'send') {
				try {
					Cronjobs::getLocal($userinfo, Request::postAll())->update();
				} catch (Exception $e) {
					Response::dynamicError($e->getMessage());
				}
				Response::redirectTo($filename, [
					'page' => $page
				]);
			} else {
				$cronjobs_edit_data = include_once dirname(__FILE__) . '/lib/formfields/admin/cronjobs/formfield.cronjobs_edit.php';

				UI::view('user/form.html.twig', [
					'formaction' => $linker->getLink(['section' => 'cronjobs', 'id' => $id]),
					'formdata' => $cronjobs_edit_data['cronjobs_edit'],
					'editid' => $id
				]);
			}
		}
	} elseif ($action == 'delete' && $id != 0) {
		/*
		 * @TODO later
		 */
	}
}


================================================
FILE: admin_customers.php
================================================
<?php

/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 */

const AREA = 'admin';
require __DIR__ . '/lib/init.php';

use Froxlor\Api\Commands\Admins;
use Froxlor\Api\Commands\Customers;
use Froxlor\Api\Commands\MysqlServer;
use Froxlor\CurrentUser;
use Froxlor\Database\Database;
use Froxlor\Froxlor;
use Froxlor\FroxlorLogger;
use Froxlor\PhpHelper;
use Froxlor\Settings;
use Froxlor\UI\Collection;
use Froxlor\UI\HTML;
use Froxlor\UI\Listing;
use Froxlor\UI\Panel\UI;
use Froxlor\UI\Request;
use Froxlor\UI\Response;

$id = (int)Request::any('id');

if (($page == 'customers' || $page == 'overview') && $userinfo['customers'] != '0') {
	if ($action == '') {
		$log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, "viewed admin_customers");

		try {
			$customer_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/admin/tablelisting.customers.php';
			$collection = (new Collection(Customers::class, $userinfo, ['show_usages' => true]))
				->withPagination($customer_list_data['customer_list']['columns'], $customer_list_data['customer_list']['default_sorting']);
			if ($userinfo['change_serversettings']) {
				$collection->has('admin', Admins::class, 'adminid', 'adminid');
			}
		} catch (Exception $e) {
			Response::dynamicError($e->getMessage());
		}

		$actions_links = false;
		if (CurrentUser::canAddResource('customers')) {
			$actions_links = [
				[
					'href' => $linker->getLink(['section' => 'customers', 'page' => $page, 'action' => 'add']),
					'label' => lng('admin.customer_add')
				]
			];
		}

		UI::view('user/table.html.twig', [
			'listing' => Listing::format($collection, $customer_list_data, 'customer_list'),
			'actions_links' => $actions_links
		]);
	} elseif ($action == 'su' && $id != 0) {
		try {
			$json_result = Customers::getLocal($userinfo, [
				'id' => $id
			])->get();
		} catch (Exception $e) {
			Response::dynamicError($e->getMessage());
		}
		$result = json_decode($json_result, true)['data'];

		$destination_user = $result['loginname'];

		if ($destination_user != '') {
			if ($result['deactivated'] == '1') {
				Response::standardError("usercurrentlydeactivated", $destination_user);
			}

			$result['switched_user'] = CurrentUser::getData();
			$result['adminsession'] = 0;
			$result['userid'] = $result['customerid'];
			session_regenerate_id(true);
			CurrentUser::setData($result);

			$log->logAction(FroxlorLogger::ADM_ACTION, LOG_INFO, "switched user and is now '" . $destination_user . "'");

			$target = Request::get('target', 'index');
			$redirect = "customer_" . $target . ".php";
			if (!file_exists(Froxlor::getInstallDir() . "/" . $redirect)) {
				$redirect = "customer_index.php";
			}
			Response::redirectTo($redirect, null, true);
		} else {
			Response::redirectTo('index.php', [
				'action' => 'login'
			]);
		}
	} elseif ($action == 'unlock' && $id != 0) {
		try {
			$json_result = Customers::getLocal($userinfo, [
				'id' => $id
			])->get();
		} catch (Exception $e) {
			Response::dynamicError($e->getMessage());
		}
		$result = json_decode($json_result, true)['data'];

		if (Request::post('send') == 'send') {
			try {
				$json_result = Customers::getLocal($userinfo, [
					'id' => $id
				])->unlock();
			} catch (Exception $e) {
				Response::dynamicError($e->getMessage());
			}
			Response::redirectTo($filename, [
				'page' => $page
			]);
		} else {
			HTML::askYesNo('customer_reallyunlock', $filename, [
				'id' => $id,
				'page' => $page,
				'action' => $action
			], $result['loginname']);
		}
	} elseif ($action == 'delete' && $id != 0) {
		try {
			$json_result = Customers::getLocal($userinfo, [
				'id' => $id
			])->get();
		} catch (Exception $e) {
			Response::dynamicError($e->getMessage());
		}
		$result = json_decode($json_result, true)['data'];

		if (Request::post('send') == 'send') {
			try {
				$json_result = Customers::getLocal($userinfo, [
					'id' => $id,
					'delete_userfiles' => Request::post('delete_userfiles', 0)
				])->delete();
			} catch (Exception $e) {
				Response::dynamicError($e->getMessage());
			}
			Response::redirectTo($filename, [
				'page' => $page
			]);
		} else {
			HTML::askYesNoWithCheckbox('admin_customer_reallydelete', 'admin_customer_alsoremovefiles', $filename, [
				'id' => $id,
				'page' => $page,
				'action' => $action
			], $result['loginname']);
		}
	} elseif ($action == 'add') {
		if (Request::post('send') == 'send') {
			try {
				Customers::getLocal($userinfo, Request::postAll())->add();
			} catch (Exception $e) {
				Response::dynamicError($e->getMessage());
			}
			Response::redirectTo($filename, [
				'page' => $page
			]);
		} else {
			$mysql_servers = [];
			try {
				$result_json = MysqlServer::getLocal($userinfo)->listing();
				$result_decoded = json_decode($result_json, true)['data']['list'];
				foreach ($result_decoded as $dbserver => $dbdata) {
					$mysql_servers[] = [
						'label' => $dbdata['caption'],
						'value' => $dbserver
					];
				}
			} catch (Exception $e) {
				/* just none */
			}

			$phpconfigs = [];
			$configs = Database::query("
				SELECT c.*, fc.description as interpreter
				FROM `" . TABLE_PANEL_PHPCONFIGS . "` c
				LEFT JOIN `" . TABLE_PANEL_FPMDAEMONS . "` fc ON fc.id = c.fpmsettingid
			");
			while ($row = $configs->fetch(PDO::FETCH_ASSOC)) {
				if ((int)Settings::Get('phpfpm.enabled') == 1) {
					$phpconfigs[] = [
						'label' => $row['description'] . " [" . $row['interpreter'] . "]",
						'value' => $row['id']
					];
				} else {
					$phpconfigs[] = [
						'label' => $row['description'],
						'value' => $row['id']
					];
				}
			}

			// hosting plans
			$hosting_plans = [];
			$plans = Database::query("
				SELECT *
				FROM `" . TABLE_PANEL_PLANS . "`
				ORDER BY name ASC
			");
			$hosting_plans = [
				0 => "---"
			];
			while ($row = $plans->fetch(PDO::FETCH_ASSOC)) {
				$hosting_plans[$row['id']] = $row['name'];
			}

			$customer_add_data = include_once dirname(__FILE__) . '/lib/formfields/admin/customer/formfield.customer_add.php';

			UI::view('user/form.html.twig', [
				'formaction' => $linker->getLink(['section' => 'customers']),
				'formdata' => $customer_add_data['customer_add']
			]);
		}
	} elseif ($action == 'edit' && $id != 0) {
		try {
			$json_result = Customers::getLocal($userinfo, [
				'id' => $id
			])->get();
		} catch (Exception $e) {
			Response::dynamicError($e->getMessage());
		}
		$result = json_decode($json_result, true)['data'];

		if ($result['loginname'] != '') {
			if (Request::post('send') == 'send') {
				try {
					Customers::getLocal($userinfo, Request::postAll())->update();
				} catch (Exception $e) {
					Response::dynamicError($e->getMessage());
				}
				Response::redirectTo($filename, [
					'page' => $page
				]);
			} else {
				$dec_places = Settings::Get('panel.decimal_places');
				$result['traffic'] = round($result['traffic'] / (1024 * 1024), $dec_places);
				$result['diskspace'] = round($result['diskspace'] / 1024, $dec_places);
				$result['email'] = $idna_convert->decode($result['email']);

				$result = PhpHelper::htmlentitiesArray($result);

				$mysql_servers = [];
				try {
					$result_json = MysqlServer::getLocal($userinfo)->listing();
					$result_decoded = json_decode($result_json, true)['data']['list'];
					foreach ($result_decoded as $dbserver => $dbdata) {
						$mysql_servers[] = [
							'label' => $dbdata['caption'],
							'value' => $dbserver
						];
					}
				} catch (Exception $e) {
					/* just none */
				}

				$phpconfigs = [];
				$configs = Database::query("
					SELECT c.*, fc.description as interpreter
					FROM `" . TABLE_PANEL_PHPCONFIGS . "` c
					LEFT JOIN `" . TABLE_PANEL_FPMDAEMONS . "` fc ON fc.id = c.fpmsettingid
				");
				while ($row = $configs->fetch(PDO::FETCH_ASSOC)) {
					if ((int)Settings::Get('phpfpm.enabled') == 1) {
						$phpconfigs[] = [
							'label' => $row['description'] . " [" . $row['interpreter'] . "]",
							'value' => $row['id']
						];
					} else {
						$phpconfigs[] = [
							'label' => $row['description'],
							'value' => $row['id']
						];
					}
				}

				// hosting plans
				$plans = Database::query("
					SELECT *
					FROM `" . TABLE_PANEL_PLANS . "`
					ORDER BY name ASC
				");
				$hosting_plans = [
					0 => "---"
				];
				while ($row = $plans->fetch(PDO::FETCH_ASSOC)) {
					$hosting_plans[$row['id']] = $row['name'];
				}

				$admin_select = [];
				if ($userinfo['customers_see_all'] == '1') {
					$available_admins_stmt = Database::prepare("
						SELECT * FROM `" . TABLE_PANEL_ADMINS . "`
						WHERE (`customers` = '-1' OR `customers` > `customers_used`)
						AND adminid <> :currentadmin
					");
					Database::pexecute($available_admins_stmt, ['currentadmin' => $result['adminid']]);
					$admin_select = [
						0 => "---"
					];
					while ($available_admin = $available_admins_stmt->fetch()) {
						$admin_select[$available_admin['adminid']] = $available_admin['name'] . " (" . $available_admin['loginname'] . ")";
					}
				}

				$customer_edit_data = include_once dirname(__FILE__) . '/lib/formfields/admin/customer/formfield.customer_edit.php';

				UI::view('user/form.html.twig', [
					'formaction' => $linker->getLink(['section' => 'customers', 'id' => $id]),
					'formdata' => $customer_edit_data['customer_edit'],
					'editid' => $id
				]);
			}
		}
	}
}


================================================
FILE: admin_domains.php
================================================
<?php

/**
 * This file is part of the froxlor project.
 * Copyright (c) 2010 the froxlor Team (see authors).
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you can also view it online at
 * https://files.froxlor.org/misc/COPYING.txt
 *
 * @copyright  the authors
 * @author     froxlor team <team@froxlor.org>
 * @license    https://files.froxlor.org/misc/COPYING.txt GPLv2
 */

const AREA = 'admin';
require __DIR__ . '/lib/init.php';

use Froxlor\Api\Commands\Customers as Customers;
use Froxlor\Api\Commands\Domains as Domains;
use Froxlor\Bulk\DomainBulkAction;
use Froxlor\Cron\TaskId;
use Froxlor\CurrentUser;
use Froxlor\Customer\Customer;
use Froxlor\Database\Database;
use Froxlor\FileDir;
use Froxlor\FroxlorLogger;
use Froxlor\Settings;
use Froxlor\System\Cronjob;
use Froxlor\UI\Collection;
use Froxlor\UI\HTML;
use Froxlor\UI\Listing;
use Froxlor\UI\Panel\UI;
use Froxlor\UI\Request;
use Froxlor\UI\Response;
use Froxlor\User;
use Froxlor\Validate\Validate;

$id = (int)Request::any('id');

if ($page == 'domains' || $page == 'overview') {
	if ($action == '') {
		$log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, "viewed admin_domains");

		try {
			$customerCollection = (new Collection(Customers::class, $userinfo));
			$domain_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/admin/tablelisting.domains.php';
			$collection = (new Collection(Domains::class, $userinfo))
				->has('customer', Customers::class, 'customerid', 'customerid')
				->withPagination($domain_list_data['domain_list']['columns'], $domain_list_data['domain_list']['default_sorting']);
		} catch (Exception $e) {
			Response::dynamicError($e->getMessage());
		}

		$actions_links = false;
		if (CurrentUser::canAddResource('domains')) {
			$actions_links = [];
			$actions_links[] = [
				'href' => $linker->getLink(['section' => 'domains', 'page' => $page, 'action' => 'add']),
				'label' => lng('admin.domain_add')
			];
			$actions_links[] = [
				'href' => $linker->getLink(['section' => 'domains', 'page' => $page, 'action' => 'import']),
				'label' => lng('domains.domain_import'),
				'icon' => 'fa-solid fa-file-import',
				'class' => 'btn-outline-secondary'
			];
		}

		UI::view('user/table.html.twig', [
			'listing' => Listing::format($collection, $domain_list_data, 'domain_list'),
			'actions_links' => $actions_links
		]);
	} elseif ($action == 'delete' && $id != 0) {
		try {
			$json_result = Domains::getLocal($userinfo, [
				'id' => $id,
				'no_std_subdomain' => true
			])->get();
		} catch (Exception $e) {
			Response::dynamicError($e->getMessage());
		}
		$result = json_decode($json_result, true)['data'];

		$alias_check_stmt = Database::prepare("
			SELECT COUNT(`id`) AS `count` FROM `" . TABLE_PANEL_DOMAINS . "`
			WHERE `aliasdomain`= :id");
		$alias_check = Database::pexecute_first($alias_check_stmt, [
			'id' => $id
		]);

		if ($result['domain'] != '') {
			if (Request::post('send') == 'send' && $alias_check['count'] == 0) {
				try {
					Domains::getLocal($userinfo, Request::postAll())->delete();
				} catch (Exception $e) {
					Response::dynamicError($e->getMessage());
				}

				Response::redirectTo($filename, [
					'page' => $page
				]);
			} elseif ($alias_check['count'] > 0) {
				Response::standardError('domains_cantdeletedomainwithaliases');
			} else {
				HTML::askYesNoWithCheckbox('admin_domain_reallydelete', 'admin_customer_alsoremovemail', $filename, [
					'id' => $id,
					'page' => $page,
					'action' => $action
				], $idna_convert->decode($result['domain']));
			}
		}
	} elseif ($action == 'add') {
		if (Request::post('send') == 'send') {
			try {
				Domains::getLocal($userinfo, Request::postAll())->add();
			} catch (Exception $e) {
				Response::dynamicError($e->getMessage());
			}
			Response::redirectTo($filename, [
				'page' => $page
			]);
		} else {
			$customers = [
				0 => lng('panel.please_choose')
			];
			$result_customers_stmt = Database::prepare("
					SELECT `customerid`, `loginname`, `name`, `firstname`, `company`
					FROM `" . TABLE_PANEL_CUSTOMERS . "` " . ($userinfo['customers_see_all'] ? '' : " WHERE `adminid` = :adminid ") . " ORDER BY COALESCE(NULLIF(`name`,''), `company`) ASC");
			$params = [];
			if ($userinfo['customers_see_all'] == '0') {
				$params['adminid'] = $userinfo['adminid'];
			}
			Database::pexecute($result_customers_stmt, $params);

			while ($row_customer = $result_customers_stmt->fetch(PDO::FETCH_ASSOC)) {
				$customers[$row_customer['customerid']] = User::getCorrectFullUserDetails($row_customer) . ' (' . $row_customer['loginname'] . ')';
			}

			$admins = [];
			if ($userinfo['customers_see_all'] == '1') {
				$result_admins_stmt = Database::query("
						SELECT `adminid`, `loginname`, `name`
						FROM `" . TABLE_PANEL_ADMINS . "`
						WHERE `domains_used` < `domains` OR `domains` = '-1' ORDER BY `name` ASC");

				while ($row_admin = $result_admins_stmt->fetch(PDO::FETCH_ASSOC)) {
					$admins[$row_admin['adminid']] = User::getCorrectFullUserDetails($row_admin) . ' (' . $row_admin['loginname'] . ')';
				}
			}

			if ($userinfo['ip'] == "-1") {
				$result_ipsand
Download .txt
gitextract_fhz65cs7/

├── .editorconfig
├── .github/
│   ├── CONTRIBUTING.md
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   ├── ISSUE_TEMPLATE.md
│   ├── LICENSE_HEADER
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows/
│       ├── build-docs.yml
│       ├── build-mariadb.yml
│       └── build-mysql.yml
├── .gitignore
├── 2fa.php
├── COPYING
├── README.md
├── SECURITY.md
├── actions/
│   ├── admin/
│   │   ├── index.html
│   │   └── settings/
│   │       ├── 100.panel.php
│   │       ├── 110.accounts.php
│   │       ├── 120.system.php
│   │       ├── 122.froxlorvhost.php
│   │       ├── 125.cronjob.php
│   │       ├── 130.webserver.php
│   │       ├── 131.ssl.php
│   │       ├── 135.fcgid.php
│   │       ├── 136.phpfpm.php
│   │       ├── 137.perl.php
│   │       ├── 140.statistics.php
│   │       ├── 150.mail.php
│   │       ├── 155.ftpserver.php
│   │       ├── 160.nameserver.php
│   │       ├── 170.logger.php
│   │       ├── 180.antispam.php
│   │       ├── 210.security.php
│   │       ├── 220.quota.php
│   │       └── index.html
│   └── index.html
├── admin_admins.php
├── admin_apcuinfo.php
├── admin_autoupdate.php
├── admin_configfiles.php
├── admin_cronjobs.php
├── admin_customers.php
├── admin_domains.php
├── admin_index.php
├── admin_ipsandports.php
├── admin_logger.php
├── admin_message.php
├── admin_mysqlserver.php
├── admin_opcacheinfo.php
├── admin_phpsettings.php
├── admin_plans.php
├── admin_settings.php
├── admin_templates.php
├── admin_traffic.php
├── admin_updates.php
├── api.php
├── api_keys.php
├── bin/
│   └── froxlor-cli
├── build.xml
├── composer.json
├── customer_domains.php
├── customer_email.php
├── customer_extras.php
├── customer_ftp.php
├── customer_index.php
├── customer_logger.php
├── customer_mysql.php
├── customer_traffic.php
├── dns_editor.php
├── doc/
│   ├── example/
│   │   ├── FroxlorAPI.php
│   │   ├── create_customer.php
│   │   ├── index.html
│   │   └── list_functions.php
│   └── index.html
├── error_report.php
├── index.php
├── install/
│   ├── froxlor.sql.php
│   ├── index.html
│   ├── install.php
│   ├── updates/
│   │   ├── froxlor/
│   │   │   ├── index.html
│   │   │   ├── update_2.0.inc.php
│   │   │   ├── update_2.1.inc.php
│   │   │   ├── update_2.2.inc.php
│   │   │   └── update_2.3.inc.php
│   │   ├── index.html
│   │   └── preconfig/
│   │       ├── index.html
│   │       ├── preconfig_2.0.inc.php
│   │       ├── preconfig_2.1.inc.php
│   │       ├── preconfig_2.2.inc.php
│   │       └── preconfig_2.3.inc.php
│   └── updatesql.php
├── lib/
│   ├── Froxlor/
│   │   ├── Ajax/
│   │   │   ├── Ajax.php
│   │   │   ├── GlobalSearch.php
│   │   │   └── index.html
│   │   ├── Api/
│   │   │   ├── Api.php
│   │   │   ├── ApiCommand.php
│   │   │   ├── ApiParameter.php
│   │   │   ├── Commands/
│   │   │   │   ├── Admins.php
│   │   │   │   ├── Certificates.php
│   │   │   │   ├── Cronjobs.php
│   │   │   │   ├── Customers.php
│   │   │   │   ├── DataDump.php
│   │   │   │   ├── DirOptions.php
│   │   │   │   ├── DirProtections.php
│   │   │   │   ├── DomainZones.php
│   │   │   │   ├── Domains.php
│   │   │   │   ├── EmailAccounts.php
│   │   │   │   ├── EmailDomains.php
│   │   │   │   ├── EmailForwarders.php
│   │   │   │   ├── EmailSender.php
│   │   │   │   ├── Emails.php
│   │   │   │   ├── FpmDaemons.php
│   │   │   │   ├── Froxlor.php
│   │   │   │   ├── Ftps.php
│   │   │   │   ├── HostingPlans.php
│   │   │   │   ├── IpsAndPorts.php
│   │   │   │   ├── MysqlServer.php
│   │   │   │   ├── Mysqls.php
│   │   │   │   ├── PhpSettings.php
│   │   │   │   ├── SshKeys.php
│   │   │   │   ├── SubDomains.php
│   │   │   │   ├── SysLog.php
│   │   │   │   ├── Traffic.php
│   │   │   │   └── index.html
│   │   │   ├── FroxlorRPC.php
│   │   │   ├── ResourceEntity.php
│   │   │   ├── Response.php
│   │   │   └── index.html
│   │   ├── Bulk/
│   │   │   ├── BulkAction.php
│   │   │   ├── DomainBulkAction.php
│   │   │   └── index.html
│   │   ├── Cli/
│   │   │   ├── CliCommand.php
│   │   │   ├── ConfigDiff.php
│   │   │   ├── ConfigServices.php
│   │   │   ├── InstallCommand.php
│   │   │   ├── MasterCron.php
│   │   │   ├── PhpSessionclean.php
│   │   │   ├── RunApiCommand.php
│   │   │   ├── SwitchServerIp.php
│   │   │   ├── UpdateCommand.php
│   │   │   ├── UserCommand.php
│   │   │   ├── ValidateAcmeWebroot.php
│   │   │   ├── index.html
│   │   │   └── install.functions.php
│   │   ├── Config/
│   │   │   ├── ConfigDaemon.php
│   │   │   ├── ConfigDisplay.php
│   │   │   ├── ConfigParser.php
│   │   │   ├── ConfigService.php
│   │   │   └── index.html
│   │   ├── Cron/
│   │   │   ├── CronConfig.php
│   │   │   ├── Dns/
│   │   │   │   ├── Bind.php
│   │   │   │   ├── DnsBase.php
│   │   │   │   ├── PowerDNS.php
│   │   │   │   └── index.html
│   │   │   ├── Forkable.php
│   │   │   ├── FroxlorCron.php
│   │   │   ├── Http/
│   │   │   │   ├── Apache.php
│   │   │   │   ├── ApacheFcgi.php
│   │   │   │   ├── ConfigIO.php
│   │   │   │   ├── DomainSSL.php
│   │   │   │   ├── HttpConfigBase.php
│   │   │   │   ├── LetsEncrypt/
│   │   │   │   │   ├── AcmeSh.php
│   │   │   │   │   └── index.html
│   │   │   │   ├── Nginx.php
│   │   │   │   ├── NginxFcgi.php
│   │   │   │   ├── Php/
│   │   │   │   │   ├── Fcgid.php
│   │   │   │   │   ├── Fpm.php
│   │   │   │   │   ├── PhpInterface.php
│   │   │   │   │   └── index.html
│   │   │   │   ├── WebserverBase.php
│   │   │   │   └── index.html
│   │   │   ├── Mail/
│   │   │   │   └── Rspamd.php
│   │   │   ├── System/
│   │   │   │   ├── ExportCron.php
│   │   │   │   ├── Extrausers.php
│   │   │   │   ├── MailboxsizeCron.php
│   │   │   │   ├── SshKeys.php
│   │   │   │   ├── TasksCron.php
│   │   │   │   └── index.html
│   │   │   ├── TaskId.php
│   │   │   ├── Traffic/
│   │   │   │   ├── ReportsCron.php
│   │   │   │   ├── TrafficCron.php
│   │   │   │   └── index.html
│   │   │   └── index.html
│   │   ├── CurrentUser.php
│   │   ├── Customer/
│   │   │   ├── Customer.php
│   │   │   └── index.html
│   │   ├── Database/
│   │   │   ├── Database.php
│   │   │   ├── DbManager.php
│   │   │   ├── IntegrityCheck.php
│   │   │   ├── Manager/
│   │   │   │   ├── DbManagerMySQL.php
│   │   │   │   └── index.html
│   │   │   └── index.html
│   │   ├── Dns/
│   │   │   ├── Dns.php
│   │   │   ├── DnsEntry.php
│   │   │   ├── DnsZone.php
│   │   │   ├── PowerDNS.php
│   │   │   └── index.html
│   │   ├── Domain/
│   │   │   ├── Domain.php
│   │   │   ├── IpAddr.php
│   │   │   └── index.html
│   │   ├── ErrorBag.php
│   │   ├── FileDir.php
│   │   ├── Froxlor.php
│   │   ├── FroxlorLogger.php
│   │   ├── FroxlorTwoFactorAuth.php
│   │   ├── Http/
│   │   │   ├── Directory.php
│   │   │   ├── HttpClient.php
│   │   │   ├── PhpConfig.php
│   │   │   ├── RateLimiter.php
│   │   │   ├── Statistics.php
│   │   │   └── index.html
│   │   ├── Idna/
│   │   │   ├── IdnaWrapper.php
│   │   │   └── index.html
│   │   ├── Install/
│   │   │   ├── AutoUpdate.php
│   │   │   ├── Install/
│   │   │   │   └── Core.php
│   │   │   ├── Install.php
│   │   │   ├── Preconfig.php
│   │   │   ├── Requirements.php
│   │   │   └── Update.php
│   │   ├── Language.php
│   │   ├── MailLogParser.php
│   │   ├── PhpHelper.php
│   │   ├── SImExporter.php
│   │   ├── Settings/
│   │   │   ├── FroxlorVhostSettings.php
│   │   │   ├── Store.php
│   │   │   └── index.html
│   │   ├── Settings.php
│   │   ├── System/
│   │   │   ├── Cronjob.php
│   │   │   ├── Crypt.php
│   │   │   ├── IPTools.php
│   │   │   ├── Mailer.php
│   │   │   ├── Markdown.php
│   │   │   ├── MysqlHandler.php
│   │   │   └── index.html
│   │   ├── Traffic/
│   │   │   ├── Traffic.php
│   │   │   └── index.html
│   │   ├── UI/
│   │   │   ├── Callbacks/
│   │   │   │   ├── Admin.php
│   │   │   │   ├── Customer.php
│   │   │   │   ├── Dns.php
│   │   │   │   ├── Domain.php
│   │   │   │   ├── Email.php
│   │   │   │   ├── Ftp.php
│   │   │   │   ├── Impersonate.php
│   │   │   │   ├── Mysql.php
│   │   │   │   ├── PHPConf.php
│   │   │   │   ├── ProgressBar.php
│   │   │   │   ├── SSLCertificate.php
│   │   │   │   ├── Style.php
│   │   │   │   ├── SysLog.php
│   │   │   │   ├── Text.php
│   │   │   │   └── index.html
│   │   │   ├── Collection.php
│   │   │   ├── Data.php
│   │   │   ├── Form.php
│   │   │   ├── HTML.php
│   │   │   ├── Linker.php
│   │   │   ├── Listing.php
│   │   │   ├── Pagination.php
│   │   │   ├── Panel/
│   │   │   │   ├── CustomReflection.php
│   │   │   │   ├── FroxlorTwig.php
│   │   │   │   ├── UI.php
│   │   │   │   └── index.html
│   │   │   ├── Request.php
│   │   │   ├── Response.php
│   │   │   └── index.html
│   │   ├── User.php
│   │   ├── Validate/
│   │   │   ├── Check.php
│   │   │   ├── Form/
│   │   │   │   ├── Data.php
│   │   │   │   └── index.html
│   │   │   ├── Form.php
│   │   │   ├── Validate.php
│   │   │   └── index.html
│   │   └── index.html
│   ├── ajax.php
│   ├── config.example.inc.php
│   ├── configfiles/
│   │   ├── bookworm.xml
│   │   ├── bullseye.xml
│   │   ├── focal.xml
│   │   ├── index.html
│   │   ├── jammy.xml
│   │   ├── noble.xml
│   │   └── trixie.xml
│   ├── formfields/
│   │   ├── admin/
│   │   │   ├── admin/
│   │   │   │   ├── formfield.admin_add.php
│   │   │   │   ├── formfield.admin_edit.php
│   │   │   │   └── index.html
│   │   │   ├── cronjobs/
│   │   │   │   ├── formfield.cronjobs_edit.php
│   │   │   │   └── index.html
│   │   │   ├── customer/
│   │   │   │   ├── formfield.customer_add.php
│   │   │   │   ├── formfield.customer_edit.php
│   │   │   │   └── index.html
│   │   │   ├── domains/
│   │   │   │   ├── formfield.domains_add.php
│   │   │   │   ├── formfield.domains_duplicate.php
│   │   │   │   ├── formfield.domains_edit.php
│   │   │   │   ├── formfield.domains_import.php
│   │   │   │   └── index.html
│   │   │   ├── index.html
│   │   │   ├── ipsandports/
│   │   │   │   ├── formfield.ipsandports_add.php
│   │   │   │   ├── formfield.ipsandports_edit.php
│   │   │   │   └── index.html
│   │   │   ├── messages/
│   │   │   │   ├── formfield.messages_add.php
│   │   │   │   └── index.html
│   │   │   ├── mysqlserver/
│   │   │   │   ├── formfield.mysqlserver_add.php
│   │   │   │   ├── formfield.mysqlserver_edit.php
│   │   │   │   └── index.html
│   │   │   ├── phpconfig/
│   │   │   │   ├── formfield.fpmconfig_add.php
│   │   │   │   ├── formfield.fpmconfig_edit.php
│   │   │   │   ├── formfield.phpconfig_add.php
│   │   │   │   ├── formfield.phpconfig_edit.php
│   │   │   │   └── index.html
│   │   │   ├── plans/
│   │   │   │   ├── formfield.plans_add.php
│   │   │   │   ├── formfield.plans_edit.php
│   │   │   │   └── index.html
│   │   │   ├── settings/
│   │   │   │   ├── formfield.settings_import.php
│   │   │   │   ├── formfield.settings_mailtest.php
│   │   │   │   └── index.html
│   │   │   └── templates/
│   │   │       ├── formfield.filetemplate_add.php
│   │   │       ├── formfield.filetemplate_edit.php
│   │   │       ├── formfield.template_add.php
│   │   │       ├── formfield.template_edit.php
│   │   │       ├── index.html
│   │   │       └── template.replacers.php
│   │   ├── customer/
│   │   │   ├── domains/
│   │   │   │   ├── formfield.domains_add.php
│   │   │   │   ├── formfield.domains_edit.php
│   │   │   │   └── index.html
│   │   │   ├── email/
│   │   │   │   ├── formfield.emails_accountchangepasswd.php
│   │   │   │   ├── formfield.emails_accountchangequota.php
│   │   │   │   ├── formfield.emails_add.php
│   │   │   │   ├── formfield.emails_addaccount.php
│   │   │   │   ├── formfield.emails_addforwarder.php
│   │   │   │   ├── formfield.emails_addsender.php
│   │   │   │   ├── formfield.emails_edit.php
│   │   │   │   └── index.html
│   │   │   ├── extras/
│   │   │   │   ├── formfield.export.php
│   │   │   │   ├── formfield.htaccess_add.php
│   │   │   │   ├── formfield.htaccess_edit.php
│   │   │   │   ├── formfield.htpasswd_add.php
│   │   │   │   ├── formfield.htpasswd_edit.php
│   │   │   │   └── index.html
│   │   │   ├── ftp/
│   │   │   │   ├── formfield.ftp_add.php
│   │   │   │   ├── formfield.ftp_edit.php
│   │   │   │   ├── formfield.ftp_ssh_add.php
│   │   │   │   ├── formfield.ftp_ssh_edit.php
│   │   │   │   └── index.html
│   │   │   ├── index.html
│   │   │   └── mysql/
│   │   │       ├── formfield.mysql_add.php
│   │   │       ├── formfield.mysql_edit.php
│   │   │       ├── formfield.mysql_global_user.php
│   │   │       └── index.html
│   │   ├── formfield.api_key.php
│   │   ├── formfield.dns_add.php
│   │   ├── formfield.domain_ssleditor.php
│   │   ├── index.html
│   │   └── install/
│   │       ├── formfield.install.php
│   │       └── index.html
│   ├── functions.php
│   ├── index.html
│   ├── init.php
│   ├── navigation/
│   │   ├── 00.froxlor.main.php
│   │   └── index.html
│   ├── tablelisting/
│   │   ├── admin/
│   │   │   ├── index.html
│   │   │   ├── tablelisting.admins.php
│   │   │   ├── tablelisting.cronjobs.php
│   │   │   ├── tablelisting.customers.php
│   │   │   ├── tablelisting.domains.php
│   │   │   ├── tablelisting.filetemplates.php
│   │   │   ├── tablelisting.fpmconfigs.php
│   │   │   ├── tablelisting.integrity.php
│   │   │   ├── tablelisting.ipsandports.php
│   │   │   ├── tablelisting.mailtemplates.php
│   │   │   ├── tablelisting.mysqlserver.php
│   │   │   ├── tablelisting.phpconfigs.php
│   │   │   └── tablelisting.plans.php
│   │   ├── customer/
│   │   │   ├── index.html
│   │   │   ├── tablelisting.domains.php
│   │   │   ├── tablelisting.emails.php
│   │   │   ├── tablelisting.emails_overview.php
│   │   │   ├── tablelisting.export.php
│   │   │   ├── tablelisting.ftps.php
│   │   │   ├── tablelisting.htaccess.php
│   │   │   ├── tablelisting.htpasswd.php
│   │   │   ├── tablelisting.mysqls.php
│   │   │   └── tablelisting.sshkeys.php
│   │   ├── index.html
│   │   ├── tablelisting.apikeys.php
│   │   ├── tablelisting.dns.php
│   │   ├── tablelisting.sslcertificates.php
│   │   └── tablelisting.syslog.php
│   └── tables.inc.php
├── lng/
│   ├── ca.lng.php
│   ├── cz.lng.php
│   ├── de.lng.php
│   ├── en.lng.php
│   ├── es.lng.php
│   ├── fr.lng.php
│   ├── hu.lng.php
│   ├── index.html
│   ├── it.lng.php
│   ├── nl.lng.php
│   ├── pt.lng.php
│   ├── se.lng.php
│   ├── sk.lng.php
│   └── zh_CN.lng.php
├── logfiles_viewer.php
├── logs/
│   └── index.html
├── package.json
├── phpcs.xml
├── phpdox.xml
├── phpmd.xml
├── phpunit.xml
├── ssl_certificates.php
├── ssl_editor.php
├── templates/
│   └── index.html
├── tests/
│   ├── Admins/
│   │   └── AdminsTest.php
│   ├── Backup/
│   │   └── DataDumpTest.php
│   ├── Bulk/
│   │   └── DomainBulkTest.php
│   ├── Certificates/
│   │   └── CertificatesTest.php
│   ├── Cron/
│   │   └── TaskIdTest.php
│   ├── Cronjobs/
│   │   └── CronjobsTest.php
│   ├── Customers/
│   │   ├── CustomersTest.php
│   │   └── HostingPlansTest.php
│   ├── DomainZones/
│   │   └── DomainZonesTest.php
│   ├── Domains/
│   │   └── DomainsTest.php
│   ├── Emails/
│   │   └── EmailsTest.php
│   ├── Extras/
│   │   ├── DirOptionsTest.php
│   │   └── DirProtectionsTest.php
│   ├── Froxlor/
│   │   ├── FroxlorTest.php
│   │   ├── IPToolsTest.php
│   │   ├── SettingsTest.php
│   │   ├── StoreTest.php
│   │   └── ValidateTest.php
│   ├── Ftps/
│   │   └── FtpsTest.php
│   ├── Global/
│   │   ├── ApiParameterTest.php
│   │   └── FroxlorRpcTest.php
│   ├── IpsAndPorts/
│   │   └── IpsAndPortsTest.php
│   ├── Mysqls/
│   │   ├── MysqlServerTest.php
│   │   └── MysqlsTest.php
│   ├── PhpAndFpm/
│   │   ├── FpmDaemonsTest.php
│   │   └── PhpSettingsTest.php
│   ├── SubDomains/
│   │   └── SubDomainsTest.php
│   ├── Traffic/
│   │   └── TrafficTest.php
│   └── bootstrap.php
└── vite.config.js
Download .txt
SYMBOL INDEX (1533 symbols across 185 files)

FILE: admin_apcuinfo.php
  function bsize (line 179) | function bsize($size)
  function duration (line 195) | function duration($ts)

FILE: doc/example/FroxlorAPI.php
  class FroxlorAPI (line 26) | class FroxlorAPI
    method __construct (line 34) | public function __construct($url, $key, $secret)
    method request (line 41) | public function request($command, array $data = [])
    method getLastStatusCode (line 63) | public function getLastStatusCode(): ?string

FILE: index.php
  function finishLogin (line 870) | function finishLogin($userinfo)

FILE: lib/Froxlor/Ajax/Ajax.php
  class Ajax (line 45) | class Ajax
    method __construct (line 54) | public function __construct()
    method handle (line 66) | public function handle()
    method getValidatedSession (line 97) | private function getValidatedSession(): array
    method getNewsfeed (line 108) | private function getNewsfeed()
    method errorResponse (line 179) | public function errorResponse($message, int $response_code = 500)
    method jsonResponse (line 185) | public function jsonResponse($value, int $response_code = 200)
    method getUpdateCheck (line 191) | private function getUpdateCheck()
    method searchGlobal (line 218) | private function searchGlobal()
    method updateTablelisting (line 238) | private function updateTablelisting()
    method resetTablelisting (line 251) | private function resetTablelisting()
    method editApiKey (line 257) | private function editApiKey()
    method getConfigDetails (line 320) | private function getConfigDetails()
    method getConfigJsonExport (line 363) | private function getConfigJsonExport()
    method loadLanguageString (line 379) | private function loadLanguageString()

FILE: lib/Froxlor/Ajax/GlobalSearch.php
  class GlobalSearch (line 45) | class GlobalSearch
    method searchSettings (line 49) | public static function searchSettings(string $searchtext, array $useri...
    method searchGlobal (line 104) | public static function searchGlobal(string $searchtext, array $userinf...
    method searchStringSql (line 365) | private static function searchStringSql(array $searchfields, $searchtext)
    method getFieldFromResult (line 377) | private static function getFieldFromResult(array $resultset, string $f...

FILE: lib/Froxlor/Api/Api.php
  class Api (line 33) | class Api
    method __construct (line 44) | public function __construct()
    method formatMiddleware (line 65) | public function formatMiddleware($request): Api
    method handle (line 86) | public function handle()
    method phpErrHandler (line 116) | public static function phpErrHandler($errno, $errstr, $errfile, $errline)
    method stripcslashesDeep (line 121) | private function stripcslashesDeep($value)

FILE: lib/Froxlor/Api/ApiCommand.php
  class ApiCommand (line 37) | abstract class ApiCommand extends ApiParameter
    method __construct (line 108) | final public function __construct($header = null, $params = null, $use...
    method readUserData (line 156) | private function readUserData($header = null)
    method getUserDetail (line 196) | protected function getUserDetail($detail = null)
    method logger (line 206) | protected function logger()
    method initLang (line 214) | private function initLang()
    method updateResourceUsage (line 236) | protected static function updateResourceUsage($table = null, $keyfield...
    method getSearchWhere (line 262) | protected function getSearchWhere(&$query_fields = [], $append = false)
    method getLimit (line 358) | protected function getLimit()
    method getOrderBy (line 387) | protected function getOrderBy($append = false)
    method mailer (line 453) | protected function mailer()
    method response (line 465) | protected function response($data = null, int $response_code = 200)
    method getAllowedCustomerIds (line 480) | protected function getAllowedCustomerIds($customer_hide_option = '')
    method isAdmin (line 523) | protected function isAdmin()
    method apiCall (line 539) | protected function apiCall($command = null, $params = null, $internal ...
    method getLocal (line 563) | public static function getLocal($userinfo = null, $params = null, $int...
    method getUserData (line 573) | protected function getUserData()
    method isInternal (line 583) | protected function isInternal()
    method getCustomerData (line 601) | protected function getCustomerData($customer_resource_check = '')
    method getMailTemplate (line 631) | protected function getMailTemplate($customerdata = null, $group = null...

FILE: lib/Froxlor/Api/ApiParameter.php
  class ApiParameter (line 30) | abstract class ApiParameter
    method __construct (line 47) | public function __construct(?array $params = null)
    method trimArray (line 62) | private function trimArray($input)
    method getUlParam (line 94) | protected function getUlParam(?string $param = null, ?string $ul_field...
    method getParam (line 119) | protected function getParam(?string $param = null, bool $optional = fa...
    method getModFunctionString (line 155) | private function getModFunctionString(int $level = 1, int $max_level =...
    method getBoolParam (line 186) | protected function getBoolParam(?string $param = null, bool $optional ...
    method getParamList (line 204) | protected function getParamList()

FILE: lib/Froxlor/Api/Commands/Admins.php
  class Admins (line 45) | class Admins extends ApiCommand implements ResourceEntity
    method increaseUsage (line 58) | public static function increaseUsage($adminid = 0, $resource = null, $...
    method decreaseUsage (line 73) | public static function decreaseUsage($adminid = 0, $resource = null, $...
    method listing (line 96) | public function listing()
    method listingCount (line 124) | public function listingCount()
    method add (line 220) | public function add()
    method get (line 420) | public function get()
    method update (line 529) | public function update()
    method delete (line 792) | public function delete()
    method unlock (line 888) | public function unlock()

FILE: lib/Froxlor/Api/Commands/Certificates.php
  class Certificates (line 42) | class Certificates extends ApiCommand implements ResourceEntity
    method add (line 63) | public function add()
    method addOrUpdateCertificate (line 123) | private function addOrUpdateCertificate($domainid = 0, $ssl_cert_file ...
    method update (line 230) | public function update()
    method listing (line 276) | public function listing()
    method get (line 348) | public function get()
    method listingCount (line 382) | public function listingCount()
    method delete (line 420) | public function delete()

FILE: lib/Froxlor/Api/Commands/Cronjobs.php
  class Cronjobs (line 42) | class Cronjobs extends ApiCommand implements ResourceEntity
    method add (line 56) | public function add()
    method get (line 71) | public function get()
    method update (line 105) | public function update()
    method listing (line 177) | public function listing()
    method listingCount (line 204) | public function listingCount()
    method delete (line 223) | public function delete()

FILE: lib/Froxlor/Api/Commands/Customers.php
  class Customers (line 49) | class Customers extends ApiCommand implements ResourceEntity
    method listing (line 72) | public function listing()
    method listingCount (line 149) | public function listingCount()
    method add (line 290) | public function add()
    method get (line 903) | public function get()
    method increaseUsage (line 989) | public static function increaseUsage($customerid = 0, $resource = null...
    method update (line 1113) | public function update()
    method delete (line 1714) | public function delete()
    method decreaseUsage (line 1958) | public static function decreaseUsage($customerid = 0, $resource = null...
    method unlock (line 1975) | public function unlock()
    method move (line 2020) | public function move()

FILE: lib/Froxlor/Api/Commands/DataDump.php
  class DataDump (line 44) | class DataDump extends ApiCommand implements ResourceEntity
    method add (line 69) | public function add()
    method validateAccess (line 144) | private function validateAccess()
    method get (line 161) | public function get()
    method update (line 170) | public function update()
    method listing (line 198) | public function listing()
    method listingCount (line 234) | public function listingCount()
    method delete (line 268) | public function delete()

FILE: lib/Froxlor/Api/Commands/DirOptions.php
  class DirOptions (line 44) | class DirOptions extends ApiCommand implements ResourceEntity
    method add (line 71) | public function add()
    method correctErrorDocument (line 166) | private function correctErrorDocument(string $errdoc, $throw_exception...
    method get (line 198) | public function get()
    method update (line 273) | public function update()
    method listing (line 358) | public function listing()
    method listingCount (line 393) | public function listingCount()
    method delete (line 423) | public function delete()

FILE: lib/Froxlor/Api/Commands/DirProtections.php
  class DirProtections (line 45) | class DirProtections extends ApiCommand implements ResourceEntity
    method add (line 65) | public function add()
    method get (line 153) | public function get()
    method update (line 226) | public function update()
    method listing (line 312) | public function listing()
    method listingCount (line 347) | public function listingCount()
    method delete (line 379) | public function delete()

FILE: lib/Froxlor/Api/Commands/DomainZones.php
  class DomainZones (line 45) | class DomainZones extends ApiCommand implements ResourceEntity
    method add (line 70) | public function add()
    method get (line 388) | public function get()
    method update (line 428) | public function update()
    method listing (line 455) | public function listing()
    method listingCount (line 501) | public function listingCount()
    method delete (line 545) | public function delete()

FILE: lib/Froxlor/Api/Commands/Domains.php
  class Domains (line 48) | class Domains extends ApiCommand implements ResourceEntity
    method listing (line 71) | public function listing()
    method getIpsForDomain (line 116) | private function getIpsForDomain($domain_id = 0, $ssl_only = false)
    method getHasCertValueForDomain (line 137) | private function getHasCertValueForDomain(int $domainid, int $parentdo...
    method listingCount (line 173) | public function listingCount()
    method add (line 317) | public function add()
    method get (line 936) | public function get()
    method validateIpAddresses (line 991) | private function validateIpAddresses($p_ipandports = null, $ssl = fals...
    method getIpsFromIdArray (line 1066) | private function getIpsFromIdArray(array $ids)
    method update (line 1203) | public function update()
    method delete (line 2192) | public function delete()
    method duplicate (line 2344) | public function duplicate()

FILE: lib/Froxlor/Api/Commands/EmailAccounts.php
  class EmailAccounts (line 47) | class EmailAccounts extends ApiCommand implements ResourceEntity
    method add (line 75) | public function add()
    method get (line 335) | public function get()
    method update (line 362) | public function update()
    method listing (line 482) | public function listing()
    method listingCount (line 491) | public function listingCount()
    method delete (line 514) | public function delete()

FILE: lib/Froxlor/Api/Commands/EmailDomains.php
  class EmailDomains (line 39) | class EmailDomains extends ApiCommand implements ResourceEntity
    method listing (line 66) | public function listing()
    method listingCount (line 112) | public function listingCount()
    method get (line 136) | public function get()
    method add (line 151) | public function add()
    method update (line 166) | public function update()
    method delete (line 181) | public function delete()

FILE: lib/Froxlor/Api/Commands/EmailForwarders.php
  class EmailForwarders (line 42) | class EmailForwarders extends ApiCommand implements ResourceEntity
    method add (line 63) | public function add()
    method get (line 138) | public function get()
    method update (line 147) | public function update()
    method listing (line 168) | public function listing()
    method listingCount (line 217) | public function listingCount()
    method delete (line 258) | public function delete()

FILE: lib/Froxlor/Api/Commands/EmailSender.php
  class EmailSender (line 42) | class EmailSender extends ApiCommand implements ResourceEntity
    method add (line 63) | public function add()
    method update (line 146) | public function update()
    method get (line 155) | public function get()
    method listing (line 176) | public function listing()
    method listingCount (line 239) | public function listingCount()
    method delete (line 294) | public function delete()
    method validateLocalDomainOwnership (line 346) | private static function validateLocalDomainOwnership(string $domain): ...

FILE: lib/Froxlor/Api/Commands/Emails.php
  class Emails (line 44) | class Emails extends ApiCommand implements ResourceEntity
    method add (line 77) | public function add()
    method get (line 235) | public function get()
    method update (line 290) | public function update()
    method listing (line 428) | public function listing()
    method listingCount (line 465) | public function listingCount()
    method delete (line 501) | public function delete()

FILE: lib/Froxlor/Api/Commands/FpmDaemons.php
  class FpmDaemons (line 43) | class FpmDaemons extends ApiCommand implements ResourceEntity
    method listing (line 64) | public function listing()
    method listingCount (line 111) | public function listingCount()
    method get (line 137) | public function get()
    method add (line 185) | public function add()
    method update (line 305) | public function update()
    method delete (line 407) | public function delete()

FILE: lib/Froxlor/Api/Commands/Froxlor.php
  class Froxlor (line 51) | class Froxlor extends ApiCommand
    method checkUpdate (line 65) | public function checkUpdate()
    method importSettings (line 142) | public function importSettings()
    method exportSettings (line 170) | public function exportSettings()
    method listSettings (line 187) | public function listSettings()
    method getSetting (line 219) | public function getSetting()
    method updateSetting (line 240) | public function updateSetting()
    method generatePassword (line 268) | public function generatePassword(): string
    method generateLoginLink (line 286) | public function generateLoginLink()
    method integrityCheck (line 354) | public function integrityCheck()
    method listFunctions (line 379) | public function listFunctions()
    method requireModules (line 455) | private function requireModules($modules = null)
    method getParamListFromDoc (line 494) | private function getParamListFromDoc($module = null, $function = null)

FILE: lib/Froxlor/Api/Commands/Ftps.php
  class Ftps (line 47) | class Ftps extends ApiCommand implements ResourceEntity
    method add (line 82) | public function add()
    method get (line 338) | public function get()
    method update (line 413) | public function update()
    method listing (line 547) | public function listing()
    method listingCount (line 578) | public function listingCount()
    method delete (line 608) | public function delete()

FILE: lib/Froxlor/Api/Commands/HostingPlans.php
  class HostingPlans (line 40) | class HostingPlans extends ApiCommand implements ResourceEntity
    method listing (line 61) | public function listing()
    method listingCount (line 95) | public function listingCount()
    method add (line 180) | public function add()
    method get (line 253) | public function get()
    method update (line 345) | public function update()
    method delete (line 437) | public function delete()

FILE: lib/Froxlor/Api/Commands/IpsAndPorts.php
  class IpsAndPorts (line 44) | class IpsAndPorts extends ApiCommand implements ResourceEntity
    method listing (line 65) | public function listing()
    method listingCount (line 98) | public function listingCount()
    method add (line 162) | public function add()
    method get (line 325) | public function get()
    method update (line 396) | public function update()
    method delete (line 575) | public function delete()

FILE: lib/Froxlor/Api/Commands/MysqlServer.php
  class MysqlServer (line 40) | class MysqlServer extends ApiCommand implements ResourceEntity
    method validateAccess (line 48) | private function validateAccess()
    method add (line 81) | public function add()
    method delete (line 191) | public function delete()
    method listing (line 237) | public function listing()
    method listingCount (line 276) | public function listingCount()
    method get (line 303) | public function get()
    method update (line 364) | public function update()
    method databasesOnServer (line 482) | public function databasesOnServer(bool $internal_all = false, int $dbs...
    method removeDatabaseFromCustomerAllowedList (line 503) | private function removeDatabaseFromCustomerAllowedList(int $dbserver)
    method addDatabaseFromCustomerAllowedList (line 523) | private function addDatabaseFromCustomerAllowedList(int $dbserver)
    method generateNewUserData (line 546) | private function generateNewUserData(array $sql, array $sql_root)

FILE: lib/Froxlor/Api/Commands/Mysqls.php
  class Mysqls (line 44) | class Mysqls extends ApiCommand implements ResourceEntity
    method add (line 69) | public function add()
    method get (line 238) | public function get()
    method update (line 342) | public function update()
    method listing (line 434) | public function listing()
    method listingCount (line 498) | public function listingCount()
    method delete (line 531) | public function delete()
    method getDefaultMySqlServer (line 574) | private function getDefaultMySqlServer(array $customer) {

FILE: lib/Froxlor/Api/Commands/PhpSettings.php
  class PhpSettings (line 44) | class PhpSettings extends ApiCommand implements ResourceEntity
    method listing (line 67) | public function listing()
    method get (line 158) | public function get()
    method listingCount (line 184) | public function listingCount()
    method add (line 257) | public function add()
    method addForAllCustomers (line 415) | private function addForAllCustomers(bool $allow_all_customers, int $co...
    method update (line 498) | public function update()
    method delete (line 654) | public function delete()

FILE: lib/Froxlor/Api/Commands/SshKeys.php
  class SshKeys (line 42) | class SshKeys extends ApiCommand implements ResourceEntity
    method add (line 65) | public function add()
    method get (line 160) | public function get()
    method update (line 233) | public function update()
    method listing (line 307) | public function listing()
    method listingCount (line 350) | public function listingCount()
    method delete (line 388) | public function delete()
    method isValidSshPublicKey (line 427) | private function isValidSshPublicKey(string $key): bool

FILE: lib/Froxlor/Api/Commands/SubDomains.php
  class SubDomains (line 47) | class SubDomains extends ApiCommand implements ResourceEntity
    method add (line 101) | public function add()
    method get (line 441) | public function get()
    method getHasCertValueForDomain (line 516) | private function getHasCertValueForDomain(int $domainid, int $parentdo...
    method validateDomainDocumentRoot (line 557) | private function validateDomainDocumentRoot($path = null, $url = null,...
    method update (line 646) | public function update()
    method listing (line 948) | public function listing()
    method getIpsForDomain (line 1043) | private function getIpsForDomain($domain_id = 0, $ssl_only = false)
    method listingCount (line 1080) | public function listingCount()
    method delete (line 1145) | public function delete()

FILE: lib/Froxlor/Api/Commands/SysLog.php
  class SysLog (line 38) | class SysLog extends ApiCommand implements ResourceEntity
    method listing (line 59) | public function listing()
    method listingCount (line 111) | public function listingCount()
    method get (line 162) | public function get()
    method add (line 170) | public function add()
    method update (line 178) | public function update()
    method delete (line 193) | public function delete()

FILE: lib/Froxlor/Api/Commands/Traffic.php
  class Traffic (line 38) | class Traffic extends ApiCommand implements ResourceEntity
    method add (line 46) | public function add()
    method get (line 56) | public function get()
    method update (line 66) | public function update()
    method listing (line 96) | public function listing()
    method listingCount (line 181) | public function listingCount()
    method delete (line 191) | public function delete()

FILE: lib/Froxlor/Api/FroxlorRPC.php
  class FroxlorRPC (line 32) | class FroxlorRPC
    method validateRequest (line 41) | public static function validateRequest($request): array
    method validateAuth (line 75) | private static function validateAuth(string $key, string $secret): bool
    method validateAllowedFrom (line 115) | public static function validateAllowedFrom(array $allowed_from, string...
    method validateBody (line 141) | private static function validateBody($request)

FILE: lib/Froxlor/Api/ResourceEntity.php
  type ResourceEntity (line 31) | interface ResourceEntity
    method listing (line 34) | public function listing();
    method listingCount (line 36) | public function listingCount();
    method get (line 38) | public function get();
    method add (line 40) | public function add();
    method update (line 42) | public function update();
    method delete (line 44) | public function delete();

FILE: lib/Froxlor/Api/Response.php
  class Response (line 28) | class Response
    method jsonDataResponse (line 30) | public static function jsonDataResponse($data = null, int $response_co...
    method jsonResponse (line 35) | public static function jsonResponse($data = null, int $response_code =...
    method jsonErrorResponse (line 44) | public static function jsonErrorResponse($message = null, int $respons...

FILE: lib/Froxlor/Bulk/BulkAction.php
  class BulkAction (line 37) | abstract class BulkAction
    method __construct (line 79) | protected function __construct(string $import_file = null, array $user...
    method doImport (line 96) | abstract public function doImport(string $separator = ";", int $offset...
    method setImportFile (line 105) | public function setImportFile($import_file = null)
    method getErrors (line 115) | public function getErrors()
    method setApiCall (line 127) | protected function setApiCall($api_call = "")
    method importEntity (line 132) | protected function importEntity($data_array = null)
    method parseImportFile (line 166) | protected function parseImportFile($separator = ";")

FILE: lib/Froxlor/Bulk/DomainBulkAction.php
  class DomainBulkAction (line 33) | class DomainBulkAction extends BulkAction
    method __construct (line 42) | public function __construct(string $import_file = null, array $userinf...
    method doImport (line 57) | public function doImport(string $separator = ";", int $offset = 0)

FILE: lib/Froxlor/Cli/CliCommand.php
  class CliCommand (line 36) | class CliCommand extends Command
    method validateRequirements (line 39) | protected function validateRequirements(OutputInterface $output, bool ...
    method getUserByName (line 64) | protected function getUserByName(?string $loginname, bool $deactivated...
    method runUpdate (line 118) | protected function runUpdate(OutputInterface $output, bool $manual = f...
    method cleanUpdateOutput (line 135) | private function cleanUpdateOutput($buffer): string

FILE: lib/Froxlor/Cli/ConfigDiff.php
  class ConfigDiff (line 36) | final class ConfigDiff extends CliCommand
    method configure (line 38) | protected function configure(): void
    method execute (line 51) | protected function execute(InputInterface $input, OutputInterface $out...
    method filterContent (line 162) | private function filterContent(string $content): string

FILE: lib/Froxlor/Cli/ConfigServices.php
  class ConfigServices (line 42) | final class ConfigServices extends CliCommand
    method configure (line 53) | protected function configure()
    method execute (line 66) | protected function execute(InputInterface $input, OutputInterface $out...
    method importSettings (line 113) | private function importSettings(InputInterface $input, OutputInterface...
    method downloadFile (line 142) | private function downloadFile($src, $dest)
    method createConfig (line 162) | private function createConfig(OutputInterface $output, SymfonyStyle $i...
    method applyConfig (line 296) | private function applyConfig(InputInterface $input, OutputInterface $o...
    method getReplacerArray (line 455) | private function getReplacerArray(): array

FILE: lib/Froxlor/Cli/InstallCommand.php
  class InstallCommand (line 43) | final class InstallCommand extends Command
    method configure (line 50) | protected function configure()
    method execute (line 63) | protected function execute(InputInterface $input, OutputInterface $out...
    method showStep (line 162) | private function showStep(int $step = 0, bool $extended = false, array...
    method printExampleFile (line 299) | private function printExampleFile(OutputInterface $output)
    method downloadFile (line 347) | private function downloadFile($src, $dest)
    method printSysInfo (line 364) | private function printSysInfo(OutputInterface $output)
    method cliTextFormat (line 415) | private function cliTextFormat(string $text, string $nl_char = "\n"): ...

FILE: lib/Froxlor/Cli/MasterCron.php
  class MasterCron (line 43) | final class MasterCron extends CliCommand
    method configure (line 49) | protected function configure()
    method execute (line 63) | protected function execute(InputInterface $input, OutputInterface $out...
    method validateOwnership (line 193) | private function validateOwnership(OutputInterface $output)
    method lockJob (line 219) | private function lockJob(string $job, OutputInterface $output): bool
    method unlockJob (line 256) | private function unlockJob(): bool
    method getCronModule (line 261) | private function getCronModule(string $cronname, OutputInterface $output)

FILE: lib/Froxlor/Cli/PhpSessionclean.php
  class PhpSessionclean (line 36) | final class PhpSessionclean extends CliCommand
    method configure (line 39) | protected function configure()
    method execute (line 46) | protected function execute(InputInterface $input, OutputInterface $out...
    method cleanSessionfiles (line 68) | private function cleanSessionfiles(int $maxlifetime = 1440)

FILE: lib/Froxlor/Cli/RunApiCommand.php
  class RunApiCommand (line 36) | final class RunApiCommand extends CliCommand
    method configure (line 39) | protected function configure()
    method execute (line 49) | protected function execute(InputInterface $input, OutputInterface $out...
    method outputParamsList (line 89) | private function outputParamsList(string $json, SymfonyStyle $io): int
    method validateCommand (line 112) | private function validateCommand(string $command): array

FILE: lib/Froxlor/Cli/SwitchServerIp.php
  class SwitchServerIp (line 35) | final class SwitchServerIp extends CliCommand
    method configure (line 38) | protected function configure()
    method execute (line 46) | protected function execute(InputInterface $input, OutputInterface $out...
    method switchIPs (line 79) | private function switchIPs(InputInterface $input, OutputInterface $out...

FILE: lib/Froxlor/Cli/UpdateCommand.php
  class UpdateCommand (line 45) | final class UpdateCommand extends CliCommand
    method configure (line 48) | protected function configure()
    method execute (line 61) | protected function execute(InputInterface $input, OutputInterface $out...
    method askUpdateOptions (line 238) | private function askUpdateOptions(InputInterface $input, OutputInterfa...
    method mailNotify (line 360) | private function mailNotify(InputInterface $input, OutputInterface $ou...

FILE: lib/Froxlor/Cli/UserCommand.php
  class UserCommand (line 39) | final class UserCommand extends CliCommand
    method configure (line 42) | protected function configure()
    method execute (line 53) | protected function execute(InputInterface $input, OutputInterface $out...

FILE: lib/Froxlor/Cli/ValidateAcmeWebroot.php
  class ValidateAcmeWebroot (line 41) | final class ValidateAcmeWebroot extends CliCommand
    method configure (line 44) | protected function configure()
    method execute (line 54) | protected function execute(InputInterface $input, OutputInterface $out...

FILE: lib/Froxlor/Cli/install.functions.php
  function lng (line 28) | function lng(string $identifier, array $arguments = [])
  function old (line 33) | function old(string $identifier, string $default = null, string $session...

FILE: lib/Froxlor/Config/ConfigDaemon.php
  class ConfigDaemon (line 39) | class ConfigDaemon
    method __construct (line 89) | public function __construct($xml, $xpath)
    method parseContent (line 112) | private function parseContent($content)
    method returnDynamic (line 146) | private function returnDynamic($key = null)
    method getConfig (line 164) | public function getConfig()
    method parse (line 175) | private function parse()
    method checkVisibility (line 263) | private function checkVisibility($order)
    method parseOrder (line 351) | private function parseOrder($order)
    method parseFile (line 383) | private function parseFile($order, $attributes)
    method parseCommand (line 477) | private function parseCommand($order, $attributes)
    method parseInstall (line 518) | private function parseInstall($order, $attributes)

FILE: lib/Froxlor/Config/ConfigDisplay.php
  class ConfigDisplay (line 35) | class ConfigDisplay
    method fromConfigArr (line 57) | public static function fromConfigArr(array $confarr, string $editor, s...
    method getFileContentContainer (line 230) | private static function getFileContentContainer(string $file_content, ...

FILE: lib/Froxlor/Config/ConfigParser.php
  class ConfigParser (line 36) | class ConfigParser
    method __construct (line 103) | public function __construct($filename)
    method getServices (line 155) | public function getServices()
    method parseServices (line 169) | private function parseServices()
    method getDefaults (line 203) | public function getDefaults()
    method parseDefaults (line 217) | private function parseDefaults()
    method getCompleteDistroName (line 240) | public function getCompleteDistroName(): string

FILE: lib/Froxlor/Config/ConfigService.php
  class ConfigService (line 38) | class ConfigService
    method __construct (line 72) | public function __construct($xml, $xpath)
    method parseContent (line 89) | private function parseContent($content)
    method getDaemons (line 109) | public function getDaemons()
    method parse (line 120) | private function parse()

FILE: lib/Froxlor/Cron/CronConfig.php
  class CronConfig (line 34) | class CronConfig
    method checkCrondConfigurationFile (line 42) | public static function checkCrondConfigurationFile()

FILE: lib/Froxlor/Cron/Dns/Bind.php
  class Bind (line 36) | class Bind extends DnsBase
    method writeConfigs (line 41) | public function writeConfigs()
    method cleanZonefiles (line 79) | private function cleanZonefiles()
    method walkDomainList (line 100) | private function walkDomainList($domain, $domains)
    method generateDomainConfig (line 134) | private function generateDomainConfig($domain = [])

FILE: lib/Froxlor/Cron/Dns/DnsBase.php
  class DnsBase (line 41) | abstract class DnsBase
    method __construct (line 52) | public function __construct($logger)
    method writeConfigs (line 105) | abstract public function writeConfigs();
    method reloadDaemon (line 107) | public function reloadDaemon()
    method getDomainList (line 120) | protected function getDomainList()

FILE: lib/Froxlor/Cron/Dns/PowerDNS.php
  class PowerDNS (line 34) | class PowerDNS extends DnsBase
    method writeConfigs (line 37) | public function writeConfigs()
    method clearZoneTables (line 63) | private function clearZoneTables($domains = null)
    method walkDomainList (line 93) | private function walkDomainList($domain, $domains)
    method insertZone (line 128) | private function insertZone($domainname, $serial = 0)
    method insertRecords (line 142) | private function insertRecords($domainid = 0, $records = [], $origin =...
    method insertAllowedTransfers (line 179) | private function insertAllowedTransfers($domainid)

FILE: lib/Froxlor/Cron/Forkable.php
  type Forkable (line 8) | trait Forkable
    method runFork (line 10) | public static function runFork($closure, array $attributes = [], int $...

FILE: lib/Froxlor/Cron/FroxlorCron.php
  class FroxlorCron (line 28) | abstract class FroxlorCron
    method run (line 34) | abstract public static function run();
    method getLockfile (line 36) | public static function getLockfile()
    method setLockfile (line 41) | public static function setLockfile($lockfile = null)
    method setCronlog (line 46) | public static function setCronlog($cronlog = null)

FILE: lib/Froxlor/Cron/Http/Apache.php
  class Apache (line 44) | class Apache extends HttpConfigBase
    method createIpPort (line 66) | public function createIpPort()
    method createStandardDirectoryEntry (line 510) | private function createStandardDirectoryEntry()
    method createStandardErrorHandler (line 550) | private function createStandardErrorHandler()
    method createOwnVhostStarter (line 579) | public function createOwnVhostStarter()
    method createVirtualHosts (line 587) | public function createVirtualHosts()
    method getVhostContent (line 617) | protected function getVhostContent($domain, $ssl_vhost = false)
    method getServerNames (line 871) | protected function getServerNames($domain)
    method getWebroot (line 930) | protected function getWebroot($domain)
    method composePhpOptions (line 966) | protected function composePhpOptions(&$domain, $ssl_vhost = false)
    method getStats (line 1012) | protected function getStats($domain)
    method getLogfiles (line 1039) | protected function getLogfiles($domain)
    method createFileDirOptions (line 1159) | public function createFileDirOptions()
    method writeConfigs (line 1333) | public function writeConfigs()

FILE: lib/Froxlor/Cron/Http/ApacheFcgi.php
  class ApacheFcgi (line 40) | class ApacheFcgi extends Apache
    method createOwnVhostStarter (line 43) | public function createOwnVhostStarter()
    method composePhpOptions (line 106) | protected function composePhpOptions(&$domain, $ssl_vhost = false)

FILE: lib/Froxlor/Cron/Http/ConfigIO.php
  class ConfigIO (line 36) | class ConfigIO
    method cleanUp (line 46) | public function cleanUp()
    method cleanErrLogs (line 70) | private function cleanErrLogs()
    method cleanAwstatsFiles (line 86) | private function cleanAwstatsFiles()
    method getFile (line 139) | private function getFile($group, $varname, $check_exists = true)
    method cleanFcgidFiles (line 156) | private function cleanFcgidFiles()
    method cleanFpmFiles (line 195) | private function cleanFpmFiles()
    method cleanWebserverConfigs (line 234) | private function cleanWebserverConfigs()
    method cleanHtpasswdFiles (line 276) | private function cleanHtpasswdFiles()
    method cleanCustomerSslCerts (line 299) | private function cleanCustomerSslCerts()

FILE: lib/Froxlor/Cron/Http/DomainSSL.php
  class DomainSSL (line 33) | class DomainSSL
    method setDomainSSLFilesArray (line 48) | public function setDomainSSLFilesArray(?array &$domain = null)
    method validateCertificate (line 134) | private function validateCertificate($dom_certs = []): bool

FILE: lib/Froxlor/Cron/Http/HttpConfigBase.php
  class HttpConfigBase (line 45) | class HttpConfigBase
    method init (line 68) | public function init()
    method reload (line 80) | public function reload()
    method processSpecialConfigTemplate (line 130) | protected function processSpecialConfigTemplate($template, $domain, $i...
    method getMyPath (line 147) | protected function getMyPath($ip_port = null)
    method checkAlternativeSslPort (line 162) | protected function checkAlternativeSslPort()
    method froxlorVhostHasLetsEncryptCert (line 184) | protected function froxlorVhostHasLetsEncryptCert()
    method froxlorVhostLetsEncryptNeedsRenew (line 198) | protected function froxlorVhostLetsEncryptNeedsRenew()
    method getVhostFilename (line 215) | protected function getVhostFilename(array $domain, bool $ssl_vhost = f...
    method getCustomVhostFilename (line 226) | protected function getCustomVhostFilename(string $name)

FILE: lib/Froxlor/Cron/Http/LetsEncrypt/AcmeSh.php
  class AcmeSh (line 42) | class AcmeSh extends FroxlorCron
    method run (line 75) | public static function run(bool $internal = false)
    method issueFroxlorVhost (line 226) | private static function issueFroxlorVhost()
    method checkFsFilesAreNewer (line 243) | private static function checkFsFilesAreNewer($domain, $cert_date = 0):...
    method getWorkingDirFromEnv (line 260) | public static function getWorkingDirFromEnv($domain = "", $forced_ecc ...
    method getAcmeSh (line 283) | public static function getAcmeSh()
    method issueDomains (line 295) | private static function issueDomains()
    method renewFroxlorVhost (line 348) | private static function renewFroxlorVhost()
    method renewDomains (line 368) | private static function renewDomains($check = false)
    method checkInstall (line 418) | private static function checkInstall($tries = 0)
    method checkUpgrade (line 449) | private static function checkUpgrade()
    method runIssueFor (line 463) | private static function runIssueFor($certrows = [])
    method validateDns (line 549) | private static function validateDns(array &$domains, $domain_id, &$cro...
    method runAcmeSh (line 583) | private static function runAcmeSh(array $certrow, array $domains, &$cr...
    method renewHookConfigs (line 635) | public static function renewHookConfigs($cronlog)
    method certToDb (line 719) | private static function certToDb($certrow, &$cronlog, $acme_result): bool
    method readCertificateToVar (line 767) | private static function readCertificateToVar($domain, &$return, &$cron...
    method getCertificateFolder (line 793) | private static function getCertificateFolder(string $domain): string

FILE: lib/Froxlor/Cron/Http/Nginx.php
  class Nginx (line 44) | class Nginx extends HttpConfigBase
    method __construct (line 64) | public function __construct()
    method createVirtualHosts (line 76) | public function createVirtualHosts()
    method createFileDirOptions (line 81) | public function createFileDirOptions()
    method createIpPort (line 86) | public function createIpPort()
    method createLogformatEntry (line 346) | private function createLogformatEntry()
    method composeSslSettings (line 367) | protected function composeSslSettings($domain_or_ip)
    method createNginxHosts (line 465) | protected function createNginxHosts()
    method getVhostContent (line 496) | protected function getVhostContent($domain, $ssl_vhost = false)
    method getServerNames (line 676) | protected function getServerNames($domain)
    method getLogFiles (line 714) | protected function getLogFiles($domain)
    method getWebroot (line 803) | protected function getWebroot($domain)
    method mergeVhostCustom (line 842) | protected function mergeVhostCustom($vhost_frx, $vhost_usr)
    method cleanVhostStruct (line 904) | private function cleanVhostStruct($vhost = null)
    method createPathOptions (line 926) | protected function createPathOptions($domain)
    method getHtpasswds (line 1080) | protected function getHtpasswds($domain)
    method getStats (line 1146) | protected function getStats($domain, $single)
    method composePhpOptions (line 1177) | protected function composePhpOptions(&$domain, $ssl_vhost = false)
    method createStandardErrorHandler (line 1207) | private function createStandardErrorHandler()
    method createOwnVhostStarter (line 1234) | public function createOwnVhostStarter()
    method writeConfigs (line 1239) | public function writeConfigs()

FILE: lib/Froxlor/Cron/Http/NginxFcgi.php
  class NginxFcgi (line 34) | class NginxFcgi extends Nginx
    method createOwnVhostStarter (line 37) | public function createOwnVhostStarter()
    method composePhpOptions (line 95) | protected function composePhpOptions(&$domain, $ssl_vhost = false)

FILE: lib/Froxlor/Cron/Http/Php/Fcgid.php
  class Fcgid (line 34) | class Fcgid
    method __construct (line 54) | public function __construct($domain)
    method createConfig (line 64) | public function createConfig($phpconfig)
    method getConfigDir (line 126) | public function getConfigDir($createifnotexists = true)
    method getStarterFile (line 145) | public function getStarterFile()
    method createIniFile (line 156) | public function createIniFile($phpconfig)
    method getTempDir (line 230) | public function getTempDir($createifnotexists = true)
    method getAdminData (line 251) | private function getAdminData($adminid)
    method getIniFile (line 270) | public function getIniFile()

FILE: lib/Froxlor/Cron/Http/Php/Fpm.php
  class Fpm (line 35) | class Fpm
    method __construct (line 70) | public function __construct($domain)
    method readFpmConfig (line 80) | private function readFpmConfig($fpm_config_id)
    method buildIniMapping (line 88) | private function buildIniMapping()
    method createDummyPool (line 104) | public static function createDummyPool($configdir)
    method createConfig (line 124) | public function createConfig($phpconfig)
    method getConfigFile (line 324) | public function getConfigFile($createifnotexists = true)
    method getSocketFile (line 344) | public function getSocketFile($createifnotexists = true)
    method getTempDir (line 375) | public function getTempDir($createifnotexists = true)
    method getAdminData (line 396) | private function getAdminData($adminid)
    method createIniFile (line 416) | public function createIniFile($phpconfig)
    method getAliasConfigDir (line 429) | public function getAliasConfigDir($createifnotexists = true)
    method durationCompare (line 452) | private function durationCompare(&$request_terminate_timeout, &$reques...

FILE: lib/Froxlor/Cron/Http/Php/PhpInterface.php
  class PhpInterface (line 31) | class PhpInterface
    method __construct (line 58) | public function __construct($domain)
    method setInterface (line 69) | private function setInterface()
    method getInterface (line 83) | public function getInterface()
    method getPhpConfig (line 96) | public function getPhpConfig(int $php_config_id)

FILE: lib/Froxlor/Cron/Http/WebserverBase.php
  class WebserverBase (line 33) | class WebserverBase
    method getVhostsToCreate (line 42) | public static function getVhostsToCreate()

FILE: lib/Froxlor/Cron/Mail/Rspamd.php
  class Rspamd (line 34) | class Rspamd
    method __construct (line 43) | public function __construct(FroxlorLogger $logger)
    method writeConfigs (line 51) | public function writeConfigs()
    method writeDkimConfigs (line 86) | public function writeDkimConfigs()
    method generateEmailAddrConfig (line 163) | private function generateEmailAddrConfig(array $email): void
    method reloadDaemon (line 206) | public function reloadDaemon()

FILE: lib/Froxlor/Cron/System/ExportCron.php
  class ExportCron (line 36) | class ExportCron extends FroxlorCron
    method run (line 40) | public static function run()
    method handle (line 54) | public static function handle(array $row)
    method createCustomerExport (line 93) | private static function createCustomerExport($data = null, $customerdo...

FILE: lib/Froxlor/Cron/System/Extrausers.php
  class Extrausers (line 35) | class Extrausers
    method generateFiles (line 38) | public static function generateFiles(&$cronlog)
    method generateFile (line 65) | private static function generateFile($file, $query, &$cronlog, &$resul...
    method cleanString (line 131) | private static function cleanString($string = null)

FILE: lib/Froxlor/Cron/System/MailboxsizeCron.php
  class MailboxsizeCron (line 34) | class MailboxsizeCron extends FroxlorCron
    method run (line 37) | public static function run()

FILE: lib/Froxlor/Cron/System/SshKeys.php
  class SshKeys (line 34) | class SshKeys
    method generateFiles (line 39) | public static function generateFiles(&$cronlog)
    method removeFroxlorKeys (line 112) | private static function removeFroxlorKeys(string $authFile, &$cronlog)...

FILE: lib/Froxlor/Cron/System/TasksCron.php
  class TasksCron (line 43) | class TasksCron extends FroxlorCron
    method run (line 49) | public static function run()
    method rebuildWebserverConfigs (line 160) | private static function rebuildWebserverConfigs()
    method createNewHome (line 215) | private static function createNewHome($row = null)
    method rebuildDnsConfigs (line 269) | private static function rebuildDnsConfigs()
    method createNewFtpHome (line 276) | private static function createNewFtpHome($row = null)
    method deleteCustomerData (line 289) | private static function deleteCustomerData($row = null)
    method deleteEmailData (line 340) | private static function deleteEmailData($row = null)
    method deleteFtpData (line 371) | private static function deleteFtpData($row = null)
    method setFilesystemQuota (line 389) | private static function setFilesystemQuota()
    method rebuildAntiSpamConfigs (line 428) | private static function rebuildAntiSpamConfigs()
    method refreshUsers (line 434) | private static function refreshUsers()

FILE: lib/Froxlor/Cron/TaskId.php
  class TaskId (line 30) | final class TaskId
    method isValid (line 116) | public static function isValid($id)
    method convertToConstant (line 136) | public static function convertToConstant($id)

FILE: lib/Froxlor/Cron/Traffic/ReportsCron.php
  class ReportsCron (line 44) | class ReportsCron extends FroxlorCron
    method run (line 47) | public static function run()
    method usageDiskspace (line 338) | private static function usageDiskspace()

FILE: lib/Froxlor/Cron/Traffic/TrafficCron.php
  class TrafficCron (line 44) | class TrafficCron extends FroxlorCron
    method run (line 48) | public static function run()
    method handle (line 53) | public static function handle()
    method callGoaccessGetTraffic (line 597) | private static function callGoaccessGetTraffic($customerid, $logfile, ...
    method callWebalizerGetTraffic (line 675) | private static function callWebalizerGetTraffic($logfile, $outputdir, ...
    method callAwstatsGetTraffic (line 785) | private static function callAwstatsGetTraffic($customerid, $outputdir,...
    method awstatsDoSingleDomain (line 831) | private static function awstatsDoSingleDomain($domain, $outputdir, $cu...
    method awstatsGenerateIndex (line 903) | private static function awstatsGenerateIndex($domain, $outputdir)

FILE: lib/Froxlor/CurrentUser.php
  class CurrentUser (line 39) | class CurrentUser
    method hasSession (line 47) | public static function hasSession(): bool
    method setField (line 60) | public static function setField(string $index, $data): bool
    method reReadUserData (line 72) | public static function reReadUserData(): bool
    method isAdmin (line 100) | public static function isAdmin(): bool
    method getField (line 112) | public static function getField(string $index)
    method getData (line 122) | public static function getData(): array
    method setData (line 132) | public static function setData(array $data = []): void
    method canAddResource (line 142) | public static function canAddResource(string $resource): bool
    method sendOtpEmail (line 183) | public static function sendOtpEmail()

FILE: lib/Froxlor/Customer/Customer.php
  class Customer (line 31) | class Customer
    method getCustomerDetail (line 42) | public static function getCustomerDetail(int $customerid, string $varn...
    method getLoginNameByUid (line 65) | public static function getLoginNameByUid(int $uid)
    method customerHasPerlEnabled (line 91) | public static function customerHasPerlEnabled(int $cid = 0)

FILE: lib/Froxlor/Database/Database.php
  class Database (line 51) | class Database
    method pexecute_first (line 100) | public static function pexecute_first(PDOStatement &$stmt, $params = n...
    method pexecute (line 119) | public static function pexecute(PDOStatement &$stmt, $params = null, b...
    method showerror (line 136) | private static function showerror(Exception $error, bool $showerror = ...
    method substitute (line 265) | private static function substitute(string $content, array $substitutio...
    method createShiftedSubstitutions (line 293) | private static function createShiftedSubstitutions(string $search, str...
    method genUniqueToken (line 314) | private static function genUniqueToken(int $length = 16): string
    method num_rows (line 337) | public static function num_rows(): int
    method getDbName (line 347) | public static function getDbName(): ?string
    method needRoot (line 362) | public static function needRoot(bool $needroot = false, int $dbserver ...
    method setServer (line 376) | private static function setServer(int $dbserver = 0)
    method getServer (line 385) | public static function getServer()
    method needSqlData (line 398) | public static function needSqlData()
    method getDB (line 418) | private static function getDB()
    method getSqlData (line 556) | public static function getSqlData()
    method getSqlUsernameLength (line 573) | public static function getSqlUsernameLength(): int
    method __callStatic (line 599) | public static function __callStatic(string $name, $args)
    method generateNewUserData (line 617) | private static function generateNewUserData(array $sql, array $sql_root)

FILE: lib/Froxlor/Database/DbManager.php
  class DbManager (line 41) | class DbManager
    method __construct (line 63) | public function __construct($log = null)
    method setManager (line 75) | private function setManager()
    method correctMysqlUsers (line 89) | public static function correctMysqlUsers(array $mysql_access_host_array)
    method createDatabase (line 177) | public function createDatabase(string $loginname = null, string $passw...
    method getManager (line 225) | public function getManager()

FILE: lib/Froxlor/Database/IntegrityCheck.php
  class IntegrityCheck (line 32) | class IntegrityCheck
    method __construct (line 45) | public function __construct()
    method checkAll (line 64) | public function checkAll()
    method fixAll (line 76) | public function fixAll()
    method databaseCharset (line 93) | public function databaseCharset(bool $fix = false): bool
    method domainIpTable (line 134) | public function domainIpTable(bool $fix = false): bool
    method subdomainSslRedirect (line 251) | public function subdomainSslRedirect(bool $fix = false): bool
    method subdomainLetsencrypt (line 338) | public function subdomainLetsencrypt(bool $fix = false): bool
    method webserverGroupMemberForFcgidPhpFpm (line 426) | public function webserverGroupMemberForFcgidPhpFpm(bool $fix = false):...
    method froxlorLocalGroupMemberForFcgidPhpFpm (line 480) | public function froxlorLocalGroupMemberForFcgidPhpFpm(bool $fix = fals...

FILE: lib/Froxlor/Database/Manager/DbManagerMySQL.php
  class DbManagerMySQL (line 38) | class DbManagerMySQL
    method __construct (line 53) | public function __construct(&$log = null)
    method createDatabase (line 63) | public function createDatabase(string $dbname = null)
    method grantPrivilegesTo (line 83) | public function grantPrivilegesTo(string $username, $password, string ...
    method deleteDatabase (line 150) | public function deleteDatabase(string $dbname, string $global_user = "")
    method deleteUser (line 196) | public function deleteUser(string $username, string $host)
    method disableUser (line 224) | public function disableUser(string $username, string $host)
    method enableUser (line 238) | public function enableUser(string $username, string $host, bool $grant...
    method userExistsOnHost (line 258) | public function userExistsOnHost(string $username, string $host): bool
    method flushPrivileges (line 268) | public function flushPrivileges()
    method getAllSqlUsers (line 281) | public function getAllSqlUsers(bool $user_only = true): array
    method grantCreateToCustomerDbs (line 316) | private function grantCreateToCustomerDbs(string $username, string $ac...
    method grantCreateToDb (line 347) | public function grantCreateToDb(string $username, string $database, st...

FILE: lib/Froxlor/Dns/Dns.php
  class Dns (line 34) | class Dns
    method getAllowedDomainEntry (line 44) | public static function getAllowedDomainEntry(int $domain_id, string $a...
    method createDomainZone (line 86) | public static function createDomainZone($domain_id, bool $froxlorhostn...
    method addRequiredEntry (line 538) | private static function addRequiredEntry(string $record = '@', string ...
    method generateDkimEntries (line 550) | private static function generateDkimEntries(array $domain): array
    method encloseTXTContent (line 571) | public static function encloseTXTContent(string $txt_content, bool $is...
    method escapeSoaAdminMail (line 598) | private static function escapeSoaAdminMail(string $email): string

FILE: lib/Froxlor/Dns/DnsEntry.php
  class DnsEntry (line 30) | class DnsEntry
    method __construct (line 47) | public function __construct(string $record = '', string $type = 'A', s...
    method __toString (line 57) | public function __toString()

FILE: lib/Froxlor/Dns/DnsZone.php
  class DnsZone (line 30) | class DnsZone
    method __construct (line 43) | public function __construct(int $ttl = 0, string $origin = '', string ...
    method __toString (line 51) | public function __toString()

FILE: lib/Froxlor/Dns/PowerDNS.php
  class PowerDNS (line 33) | class PowerDNS
    method cleanDomainZone (line 42) | public static function cleanDomainZone(string $domain = null)
    method getDB (line 72) | public static function getDB(): \PDO
    method connectToPdnsDb (line 83) | private static function connectToPdnsDb()

FILE: lib/Froxlor/Domain/Domain.php
  class Domain (line 35) | class Domain
    method getIpsOfDomain (line 46) | public static function getIpsOfDomain(int $domain_id = 0): array
    method getRedirectCodesArray (line 79) | public static function getRedirectCodesArray(): array
    method getDomainRedirectCode (line 101) | public static function getDomainRedirectCode(int $domainid = 0): string
    method getRedirectCodes (line 136) | public static function getRedirectCodes(bool $add_desc = true): array
    method getDomainRedirectId (line 161) | public static function getDomainRedirectId(int $domainid = 0): int
    method addRedirectToDomain (line 190) | public static function addRedirectToDomain(int $domainid = 0, int $red...
    method updateRedirectOfDomain (line 213) | public static function updateRedirectOfDomain(int $domainid = 0, int $...
    method getMainSubdomainIds (line 245) | public static function getMainSubdomainIds(int $id): array
    method domainHasSslIpPort (line 272) | public static function domainHasSslIpPort(int $domainid): bool
    method isCustomerStdSubdomain (line 297) | public static function isCustomerStdSubdomain(int $did): bool
    method triggerLetsEncryptCSRForAliasDestinationDomain (line 322) | public static function triggerLetsEncryptCSRForAliasDestinationDomain(
    method doLetsEncryptCleanUp (line 349) | public static function doLetsEncryptCleanUp(string $domainname): bool
    method appendOpenBasedirPath (line 385) | public static function appendOpenBasedirPath(string $path = '', bool $...

FILE: lib/Froxlor/Domain/IpAddr.php
  class IpAddr (line 31) | class IpAddr
    method getIpAddresses (line 36) | public static function getIpAddresses(): array
    method getSslIpPortCombinations (line 57) | public static function getSslIpPortCombinations(): array
    method getIpPortCombinations (line 69) | public static function getIpPortCombinations(bool $ssl = false): array

FILE: lib/Froxlor/ErrorBag.php
  class ErrorBag (line 33) | class ErrorBag
    method hasErrors (line 41) | public static function hasErrors(): bool
    method addError (line 53) | public static function addError(string $data): void
    method getErrors (line 67) | public static function getErrors(): array

FILE: lib/Froxlor/FileDir.php
  class FileDir (line 34) | class FileDir
    method mkDirWithCorrectOwnership (line 51) | public static function mkDirWithCorrectOwnership(
    method makeCorrectDir (line 120) | public static function makeCorrectDir(string $dir, string $fixed_homed...
    method makeSecurePath (line 172) | public static function makeSecurePath(string $path): string
    method safe_exec (line 224) | public static function safe_exec(string $exec_string, &$return_value =...
    method getUnknownDomainTemplate (line 274) | public static function getUnknownDomainTemplate(string $servername = "")
    method storeDefaultIndex (line 312) | public static function storeDefaultIndex(
    method makeCorrectFile (line 378) | public static function makeCorrectFile(string $filename, string $fixed...
    method checkDisallowedPaths (line 445) | public static function checkDisallowedPaths(string $path): bool
    method makeCorrectDestination (line 487) | public static function makeCorrectDestination(string $destination): st...
    method makePathfield (line 519) | public static function makePathfield(string $path, int $uid, int $gid,...
    method findDirs (line 587) | private static function findDirs(string $path, int $uid, int $gid): array
    method setImmutable (line 651) | public static function setImmutable(string $filename)
    method getImmutableFunction (line 664) | private static function getImmutableFunction(bool $remove = false): st...
    method isFreeBSD (line 684) | public static function isFreeBSD(bool $exact = false): bool
    method removeImmutable (line 699) | public static function removeImmutable(string $filename)
    method getFilesystemQuota (line 708) | public static function getFilesystemQuota()

FILE: lib/Froxlor/Froxlor.php
  class Froxlor (line 30) | final class Froxlor
    method getInstallDir (line 50) | public static function getInstallDir(): string
    method getDocsUrl (line 55) | public static function getDocsUrl(): string
    method getVersion (line 68) | public static function getVersion(): string
    method getShortVersion (line 78) | public static function getShortVersion(): string
    method getVersionString (line 88) | public static function getVersionString(): string
    method getFullVersion (line 98) | public static function getFullVersion(): string
    method hasUpdates (line 112) | public static function hasUpdates(string $to_check = ''): bool
    method hasDbUpdates (line 132) | public static function hasDbUpdates(string $to_check = ''): bool
    method isDatabaseVersion (line 152) | public static function isDatabaseVersion(string $to_check): bool
    method updateToDbVersion (line 171) | public static function updateToDbVersion(string $new_version): bool
    method updateToVersion (line 197) | public static function updateToVersion(string $new_version): bool
    method isFroxlor (line 219) | public static function isFroxlor(): bool
    method isFroxlorVersion (line 237) | public static function isFroxlorVersion(string $to_check): bool
    method genSessionId (line 252) | public static function genSessionId(int $length = 16): string
    method versionCompare2 (line 278) | public static function versionCompare2(string $a, string $b): int
    method parseVersionArray (line 319) | private static function parseVersionArray(?array &$arr)

FILE: lib/Froxlor/FroxlorLogger.php
  class FroxlorLogger (line 36) | class FroxlorLogger
    method __construct (line 83) | protected function __construct(array $userinfo = [])
    method initMonolog (line 133) | private function initMonolog()
    method getInstanceOf (line 150) | public static function getInstanceOf(array $userinfo = [])
    method logAction (line 167) | public function logAction($action = FroxlorLogger::USR_ACTION, int $ty...
    method getLogLevelDesc (line 221) | public function getLogLevelDesc(int $type): string
    method getActionTypeDesc (line 253) | private function getActionTypeDesc($action): string
    method setCronLog (line 285) | public function setCronLog(int $cronlog = 0): int
    method setCronDebugFlag (line 301) | public function setCronDebugFlag(bool $flag = false)

FILE: lib/Froxlor/FroxlorTwoFactorAuth.php
  class FroxlorTwoFactorAuth (line 30) | class FroxlorTwoFactorAuth extends TwoFactorAuth

FILE: lib/Froxlor/Http/Directory.php
  class Directory (line 35) | class Directory
    method __construct (line 50) | public function __construct(?string $dir = null)
    method hasUserOptions (line 60) | public function hasUserOptions(): bool
    method isUserProtected (line 79) | public function isUserProtected(): bool
    method isConfigDir (line 101) | public function isConfigDir(bool $ifexists = false): bool

FILE: lib/Froxlor/Http/HttpClient.php
  class HttpClient (line 31) | class HttpClient
    method urlGet (line 43) | public static function urlGet(string $url, bool $follow_location = tru...
    method fileGet (line 70) | public static function fileGet(string $url, string $target)

FILE: lib/Froxlor/Http/PhpConfig.php
  class PhpConfig (line 31) | class PhpConfig
    method getPhpConfigs (line 40) | public static function getPhpConfigs(): array

FILE: lib/Froxlor/Http/RateLimiter.php
  class RateLimiter (line 9) | class RateLimiter
    method run (line 14) | public static function run(bool $install_mode = false)

FILE: lib/Froxlor/Http/Statistics.php
  class Statistics (line 32) | class Statistics
    method createAWStatsConf (line 48) | public static function createAWStatsConf(
    method makeChownWithNewStats (line 144) | public static function makeChownWithNewStats(array $row)

FILE: lib/Froxlor/Idna/IdnaWrapper.php
  class IdnaWrapper (line 36) | class IdnaWrapper
    method __construct (line 50) | public function __construct()
    method encode (line 65) | public function encode(string $to_encode): string
    method isUtf8 (line 85) | private function isUtf8(string $string)
    method decode (line 129) | public function decode(string $to_decode): string

FILE: lib/Froxlor/Install/AutoUpdate.php
  class AutoUpdate (line 34) | class AutoUpdate
    method checkVersion (line 62) | public static function checkVersion(): int
    method downloadZip (line 98) | public static function downloadZip(string $newversion)
    method extractZip (line 141) | public static function extractZip(string $localArchive): int
    method checkPrerequisites (line 163) | private static function checkPrerequisites(): int
    method getLastError (line 174) | public static function getLastError(): string
    method getFromResult (line 179) | public static function getFromResult(string $index)

FILE: lib/Froxlor/Install/Install.php
  class Install (line 39) | class Install
    method __construct (line 56) | public function __construct(array $cliData = [])
    method handle (line 115) | public function handle(): void
    method handleFormData (line 150) | private function handleFormData(array $formfield): void
    method checkInstallStateFinished (line 192) | private function checkInstallStateFinished(): bool
    method checkRequirements (line 213) | public function checkRequirements(): array
    method getInformationText (line 251) | private function getInformationText(): string
    method validateRequest (line 265) | private function validateRequest(array $fields): array
    method validateAttribute (line 281) | private function validateAttribute($attribute, array $field)
    method checkSystem (line 293) | public function checkSystem(array $validatedData): void
    method checkAdminUser (line 319) | public function checkAdminUser(array $validatedData): void
    method checkDatabase (line 347) | public function checkDatabase(array $validatedData): void
    method guessWebserver (line 393) | private function guessWebserver(): ?string
    method guessDistribution (line 403) | private function guessDistribution(): ?string

FILE: lib/Froxlor/Install/Install/Core.php
  class Core (line 40) | class Core
    method __construct (line 44) | public function __construct(array $validatedData)
    method doInstall (line 55) | public function doInstall(bool $create_ud_str = true)
    method getUnprivilegedPdo (line 127) | public function getUnprivilegedPdo(): PDO
    method backupExistingDatabase (line 160) | private function backupExistingDatabase(object &$db_root)
    method createDatabaseAndUser (line 218) | private function createDatabaseAndUser(object &$db_root)
    method grantDbPrivilegesTo (line 293) | private function grantDbPrivilegesTo(&$db_root, $database, $username, ...
    method importDatabaseData (line 338) | private function importDatabaseData()
    method doSettings (line 363) | private function doSettings(object &$db_user)
    method updateSetting (line 470) | private function updateSetting(PDOStatement &$stmt = null, string $val...
    method doDataEntries (line 485) | private function doDataEntries(&$db_user)
    method createUserdataConf (line 601) | public function createUserdataConf()
    method createJsonArray (line 656) | private function createJsonArray(&$db_user)
    method createUserdataParamStr (line 688) | private function createUserdataParamStr()

FILE: lib/Froxlor/Install/Preconfig.php
  class Preconfig (line 31) | class Preconfig
    method hasPreConfig (line 40) | public function hasPreConfig(): bool
    method getData (line 50) | public function getData(): array
    method addToPreConfig (line 62) | public function addToPreConfig(array $array)
    method __construct (line 72) | public function __construct()
    method getPreConfig (line 98) | public static function getPreConfig(bool $no_check = false): array

FILE: lib/Froxlor/Install/Requirements.php
  class Requirements (line 5) | class Requirements

FILE: lib/Froxlor/Install/Update.php
  class Update (line 33) | class Update
    method showUpdateStep (line 49) | public static function showUpdateStep(string $task, bool $needs_status...
    method lastStepStatus (line 74) | public static function lastStepStatus(int $status = -1, string $messag...
    method versionInUpdate (line 102) | public static function versionInUpdate($current_version, $version_to_c...
    method storeUpdateCheckData (line 111) | public static function storeUpdateCheckData(array $response)
    method getUpdateCheckData (line 121) | public static function getUpdateCheckData()
    method getUpdateTasks (line 131) | public static function getUpdateTasks(): array
    method getTaskCounter (line 136) | public static function getTaskCounter(): int
    method cleanOldFiles (line 141) | public static function cleanOldFiles(array $to_clean)

FILE: lib/Froxlor/Language.php
  class Language (line 31) | class Language
    method getLanguages (line 40) | public static function getLanguages(): array
    method getTranslation (line 53) | public static function getTranslation(string $identifier, array $argum...
    method loadLanguage (line 89) | private static function loadLanguage($iso): array
    method setDefaultLanguage (line 118) | public static function setDefaultLanguage(string $string)
    method setLanguage (line 123) | public static function setLanguage(string $string)

FILE: lib/Froxlor/MailLogParser.php
  class MailLogParser (line 32) | class MailLogParser
    method __construct (line 49) | public function __construct($startTime = 0)
    method parsePostfixLog (line 85) | private function parsePostfixLog($logFile)
    method getLogTimestamp (line 153) | private function getLogTimestamp($line)
    method addDomainTraffic (line 177) | private function addDomainTraffic($domain, $traffic, $timestamp)
    method parseExim4Log (line 199) | private function parseExim4Log($logFile)
    method parseDovecotLog (line 243) | private function parseDovecotLog($logFile)
    method parseCourierLog (line 291) | private function parseCourierLog($logFile)
    method getDomainTraffic (line 333) | public function getDomainTraffic($domain)

FILE: lib/Froxlor/PhpHelper.php
  class PhpHelper (line 35) | class PhpHelper
    method htmlentitiesArray (line 49) | public static function htmlentitiesArray($subject, $fields = '', $quot...
    method arrayTrim (line 75) | public static function arrayTrim(array $source): array
    method phpErrHandler (line 93) | public static function phpErrHandler($errno, $errstr, $errfile, $errline)
    method phpExceptionHandler (line 137) | public static function phpExceptionHandler(Throwable $exception)
    method loadConfigArrayDir (line 158) | public static function loadConfigArrayDir(...$configdirs)
    method gethostbynamel6 (line 202) | public static function gethostbynamel6(string $host, bool $try_a = tru...
    method randomStr (line 267) | public static function randomStr(int $length): string
    method sizeReadable (line 285) | public static function sizeReadable(
    method replaceVariables (line 343) | public static function replaceVariables(string $text, array $vars): st...
    method recursive_array_search (line 369) | public static function recursive_array_search(
    method cleanGlobal (line 399) | public static function cleanGlobal(array &$global, AntiXSS &$antiXss)
    method parseArrayToPhpFile (line 445) | public static function parseArrayToPhpFile(array $array, ?string $comm...
    method parseArrayToString (line 467) | public static function parseArrayToString(array $array, ?string $key =...
    method tabPrefix (line 506) | private static function tabPrefix(int $depth, string $str = ''): string
    method array_merge_recursive_distinct (line 515) | public static function array_merge_recursive_distinct(array &$array1, ...

FILE: lib/Froxlor/SImExporter.php
  class SImExporter (line 39) | class SImExporter
    method export (line 65) | public static function export()
    method import (line 108) | public static function import($json_str = null)

FILE: lib/Froxlor/Settings.php
  class Settings (line 38) | class Settings
    method IsInList (line 79) | public static function IsInList($setting = null, $entry = null)
    method init (line 93) | private static function init()
    method readSettings (line 112) | private static function readSettings()
    method readConfig (line 129) | private static function readConfig()
    method Get (line 153) | public static function Get($setting = null)
    method Set (line 178) | public static function Set($setting = null, $value = null, $instant_sa...
    method storeSetting (line 216) | private static function storeSetting($group = null, $varname = null, $...
    method AddNew (line 235) | public static function AddNew($setting = null, $value = null)
    method Flush (line 269) | public static function Flush()
    method Stash (line 290) | public static function Stash()
    method loadSettingsInto (line 299) | public static function loadSettingsInto(&$settings_data)
    method refreshState (line 335) | public static function refreshState(): void
    method getAll (line 341) | public static function getAll(): array
    method Config (line 351) | public static function Config(string $config)

FILE: lib/Froxlor/Settings/FroxlorVhostSettings.php
  class FroxlorVhostSettings (line 30) | class FroxlorVhostSettings
    method hasVhostContainerEnabled (line 39) | public static function hasVhostContainerEnabled(bool $need_ssl = false...

FILE: lib/Froxlor/Settings/Store.php
  class Store (line 43) | class Store
    method storeSettingClearCertificates (line 46) | public static function storeSettingClearCertificates($fieldname, $fiel...
    method storeSettingField (line 70) | public static function storeSettingField($fieldname, $fielddata, $newf...
    method storeSettingDefaultIp (line 101) | public static function storeSettingDefaultIp($fieldname, $fielddata, $...
    method updateStdSubdomainDefaultIp (line 114) | private static function updateStdSubdomainDefaultIp($newfieldvalue, $d...
    method storeSettingDefaultSslIp (line 160) | public static function storeSettingDefaultSslIp($fieldname, $fielddata...
    method cleanIpSelection (line 176) | private static function cleanIpSelection(&$selection)
    method storeSettingDefaultTheme (line 195) | public static function storeSettingDefaultTheme($fieldname, $fielddata...
    method storeSettingFieldInsertBindTask (line 224) | public static function storeSettingFieldInsertBindTask($fieldname, $fi...
    method storeSettingFieldInsertAntispamTask (line 235) | public static function storeSettingFieldInsertAntispamTask($fieldname,...
    method storeSettingFieldInsertUpdateServicesTask (line 246) | public static function storeSettingFieldInsertUpdateServicesTask($fiel...
    method storeSettingHostname (line 257) | public static function storeSettingHostname($fieldname, $fielddata, $n...
    method storeSettingIpAddress (line 312) | public static function storeSettingIpAddress($fieldname, $fielddata, $...
    method storeSettingMysqlAccessHost (line 328) | public static function storeSettingMysqlAccessHost($fieldname, $fieldd...
    method storeSettingResetCatchall (line 381) | public static function storeSettingResetCatchall($fieldname, $fielddat...
    method storeSettingWebserverFcgidFpmUser (line 398) | public static function storeSettingWebserverFcgidFpmUser($fieldname, $...
    method storeSettingImage (line 437) | public static function storeSettingImage($fieldname, $fielddata)
    method cleanMySQLAccessHost (line 510) | private static function cleanMySQLAccessHost($value)
    method storeSettingUpdateTrafficTool (line 518) | public static function storeSettingUpdateTrafficTool($fieldname, $fiel...

FILE: lib/Froxlor/System/Cronjob.php
  class Cronjob (line 36) | class Cronjob
    method checkLastGuid (line 48) | public static function checkLastGuid()
    method checkCurrentDistro (line 122) | public static function checkCurrentDistro(bool $is_install = false): s...
    method checkLocalUserGroupMembership (line 159) | public static function checkLocalUserGroupMembership(): bool
    method inserttask (line 210) | public static function inserttask(int $type, ...$params)
    method getCronjobsLastRun (line 316) | public static function getCronjobsLastRun(): array
    method toggleCronStatus (line 337) | public static function toggleCronStatus(string $module, int $isactive ...
    method getOutstandingTasks (line 357) | public static function getOutstandingTasks(): array
    method notifyMailToAdmin (line 408) | public static function notifyMailToAdmin(string $message, string $subj...
    method updateLastRunOfCron (line 439) | public static function updateLastRunOfCron(string $cronname)

FILE: lib/Froxlor/System/Crypt.php
  class Crypt (line 33) | class Crypt
    method generatePassword (line 44) | public static function generatePassword(int $length = 0, bool $isSalt ...
    method specialShuffle (line 81) | private static function specialShuffle(string $str): string
    method getAvailablePasswordHashes (line 97) | public static function getAvailablePasswordHashes(): array
    method validatePassword (line 128) | public static function validatePassword(string $password, bool $json_r...
    method validatePasswordLogin (line 179) | public static function validatePasswordLogin(
    method makeCryptPassword (line 228) | public static function makeCryptPassword(string $password, bool $htpas...
    method createSelfSignedCertificate (line 250) | public static function createSelfSignedCertificate()

FILE: lib/Froxlor/System/IPTools.php
  class IPTools (line 28) | class IPTools
    method cidr2NetmaskAddr (line 39) | public static function cidr2NetmaskAddr(string $cidr): string
    method ip_in_range (line 59) | public static function ip_in_range(array $ip_cidr, string $ip): bool
    method is_ipv6 (line 80) | public static function is_ipv6(string $address)
    method ipv6_in_range (line 93) | private static function ipv6_in_range(array $ip_cidr, string $ip): bool
    method inet6_expand (line 137) | private static function inet6_expand(string $addr)
    method inet6_prefix_to_mask (line 174) | private static function inet6_prefix_to_mask(int $prefix)
    method ip2long6 (line 200) | private static function ip2long6(string $ip): string

FILE: lib/Froxlor/System/Mailer.php
  class Mailer (line 32) | class Mailer extends PHPMailer
    method __construct (line 42) | public function __construct(bool $exceptions = false)

FILE: lib/Froxlor/System/Markdown.php
  class Markdown (line 31) | class Markdown
    method converter (line 36) | public static function converter(): ?GithubFlavoredMarkdownConverter
    method cleanCustomNotes (line 47) | public static function cleanCustomNotes(string $note = ""): string

FILE: lib/Froxlor/System/MysqlHandler.php
  class MysqlHandler (line 32) | class MysqlHandler extends AbstractProcessingHandler
    method __construct (line 53) | public function __construct($level = Logger::DEBUG, bool $bubble = true)
    method write (line 64) | protected function write(array $record)
    method insert (line 81) | protected function insert(array $data): bool

FILE: lib/Froxlor/Traffic/Traffic.php
  class Traffic (line 33) | class Traffic
    method getCustomerStats (line 41) | public static function getCustomerStats(array $userinfo, string $range...
    method getParamsByRange (line 168) | private static function getParamsByRange(string $range = null, array $...

FILE: lib/Froxlor/UI/Callbacks/Admin.php
  class Admin (line 30) | class Admin
    method canChangeServerSettings (line 32) | public static function canChangeServerSettings(array $attributes)
    method isNotMe (line 37) | public static function isNotMe(array $attributes)

FILE: lib/Froxlor/UI/Callbacks/Customer.php
  class Customer (line 31) | class Customer
    method isLocked (line 33) | public static function isLocked(array $attributes): bool
    method hasNote (line 39) | public static function hasNote(array $attributes): bool

FILE: lib/Froxlor/UI/Callbacks/Dns.php
  class Dns (line 28) | class Dns
    method prio (line 30) | public static function prio(array $attributes): string

FILE: lib/Froxlor/UI/Callbacks/Domain.php
  class Domain (line 35) | class Domain
    method domainEditLink (line 37) | public static function domainEditLink(array $attributes): array
    method domainWithCustomerLink (line 55) | public static function domainWithCustomerLink(array $attributes): string
    method domainTarget (line 71) | public static function domainTarget(array $attributes)
    method domainExternalLinkInfo (line 101) | public static function domainExternalLinkInfo(array $attributes): string
    method canEdit (line 127) | public static function canEdit(array $attributes): bool
    method canViewLogs (line 132) | public static function canViewLogs(array $attributes): bool
    method canDelete (line 144) | public static function canDelete(array $attributes): bool
    method adminCanDelete (line 150) | public static function adminCanDelete(array $attributes): bool
    method canEditDNS (line 157) | public static function canEditDNS(array $attributes): bool
    method adminCanEditDNS (line 167) | public static function adminCanEditDNS(array $attributes): bool
    method hasLetsEncryptActivated (line 174) | public static function hasLetsEncryptActivated(array $attributes): bool
    method canEditSSL (line 182) | public static function canEditSSL(array $attributes): bool
    method canEditAlias (line 196) | public static function canEditAlias(array $attributes): bool
    method isAssigned (line 201) | public static function isAssigned(array $attributes): bool
    method editSSLButtons (line 206) | public static function editSSLButtons(array $attributes): array
    method listIPs (line 237) | public static function listIPs(array $attributes): string
    method getPhpConfigName (line 252) | public static function getPhpConfigName(array $attributes): string

FILE: lib/Froxlor/UI/Callbacks/Email.php
  class Email (line 31) | class Email
    method account (line 33) | public static function account(array $attributes)
    method forwarderList (line 44) | public static function forwarderList(array $attributes)

FILE: lib/Froxlor/UI/Callbacks/Ftp.php
  class Ftp (line 31) | class Ftp
    method pathRelative (line 33) | public static function pathRelative(array $attributes): string

FILE: lib/Froxlor/UI/Callbacks/Impersonate.php
  class Impersonate (line 30) | class Impersonate
    method apiAdminCustomerLink (line 32) | public static function apiAdminCustomerLink(array $attributes)
    method admin (line 65) | public static function admin(array $attributes)
    method customer (line 85) | public static function customer(array $attributes): array

FILE: lib/Froxlor/UI/Callbacks/Mysql.php
  class Mysql (line 30) | class Mysql
    method dbserver (line 32) | public static function dbserver(array $attributes): string

FILE: lib/Froxlor/UI/Callbacks/PHPConf.php
  class PHPConf (line 32) | class PHPConf
    method domainList (line 34) | public static function domainList(array $attributes): string
    method configsList (line 57) | public static function configsList(array $attributes)
    method isNotDefault (line 66) | public static function isNotDefault(array $attributes)
    method fpmConfLink (line 74) | public static function fpmConfLink(array $attributes)

FILE: lib/Froxlor/UI/Callbacks/ProgressBar.php
  class ProgressBar (line 34) | class ProgressBar
    method diskspace (line 42) | public static function diskspace(array $attributes): array
    method pbData (line 58) | private static function pbData(string $field, array $attributes, int $...
    method traffic (line 93) | public static function traffic(array $attributes): array
    method traffic_admins (line 124) | public static function traffic_admins(array $attributes): array

FILE: lib/Froxlor/UI/Callbacks/SSLCertificate.php
  class SSLCertificate (line 28) | class SSLCertificate
    method domainWithSan (line 30) | public static function domainWithSan(array $attributes): array
    method canEditSSL (line 41) | public static function canEditSSL(array $attributes): bool
    method isNotLetsEncrypt (line 51) | public static function isNotLetsEncrypt(array $attributes): bool

FILE: lib/Froxlor/UI/Callbacks/Style.php
  class Style (line 31) | class Style
    method deactivated (line 33) | public static function deactivated(array $attributes): string
    method loginDisabled (line 38) | public static function loginDisabled(array $attributes): string
    method resultIntegrityBad (line 43) | public static function resultIntegrityBad(array $attributes): string
    method invalidApiKey (line 48) | public static function invalidApiKey(array $attributes): string
    method resultDomainTerminatedOrDeactivated (line 60) | public static function resultDomainTerminatedOrDeactivated(array $attr...
    method resultCustomerLockedOrDeactivated (line 76) | public static function resultCustomerLockedOrDeactivated(array $attrib...
    method diskspaceWarning (line 90) | public static function diskspaceWarning(array $attributes): string
    method getWarningStyle (line 95) | private static function getWarningStyle(string $field, array $attribut...
    method trafficWarning (line 108) | public static function trafficWarning(array $attributes): string

FILE: lib/Froxlor/UI/Callbacks/SysLog.php
  class SysLog (line 30) | class SysLog
    method typeDescription (line 33) | public static function typeDescription(array $attributes): string

FILE: lib/Froxlor/UI/Callbacks/Text.php
  class Text (line 37) | class Text
    method boolean (line 39) | public static function boolean(array $attributes): array
    method yesno (line 47) | public static function yesno(array $attributes): array
    method type2fa (line 55) | public static function type2fa(array $attributes): array
    method customerfullname (line 63) | public static function customerfullname(array $attributes): string
    method size (line 68) | public static function size(array $attributes): string
    method timestamp (line 73) | public static function timestamp(array $attributes): string
    method timestampUntil (line 78) | public static function timestampUntil(array $attributes): string
    method crondesc (line 83) | public static function crondesc(array $attributes): string
    method shorten (line 88) | public static function shorten(array $attributes): string
    method wordwrap (line 93) | public static function wordwrap(array $attributes): string
    method customerNoteDetailModal (line 98) | public static function customerNoteDetailModal(array $attributes): array
    method apikeyDetailModal (line 110) | public static function apikeyDetailModal(array $attributes): array
    method domainDuplicateModal (line 130) | public static function domainDuplicateModal(array $attributes): array

FILE: lib/Froxlor/UI/Collection.php
  class Collection (line 30) | class Collection
    method __construct (line 39) | public function __construct(string $class, array $userInfo, array $par...
    method getList (line 46) | public function getList(): array
    method getData (line 51) | public function getData(): array
    method get (line 56) | public function get(): array
    method getListing (line 83) | private function getListing($class, $params): array
    method getJson (line 88) | public function getJson(): string
    method has (line 93) | public function has(string $column, string $class, string $parentKey =...
    method addParam (line 106) | public function addParam(array $keyval): Collection
    method withPagination (line 113) | public function withPagination(array $columns, array $default_sorting ...
    method count (line 130) | public function count(bool $with_pagination = false): int
    method getPagination (line 138) | public function getPagination(): ?Pagination
    method setInternal (line 143) | public function setInternal(bool $internal): Collection {

FILE: lib/Froxlor/UI/Data.php
  class Data (line 28) | class Data
    method getFormFieldDataEmail (line 31) | public static function getFormFieldDataEmail($fieldname, $fielddata, $...
    method getFormFieldDataText (line 36) | public static function getFormFieldDataText($fieldname, $fielddata, $i...
    method getFormFieldDataUrl (line 47) | public static function getFormFieldDataUrl($fieldname, $fielddata, $in...
    method getFormFieldDataSelect (line 52) | public static function getFormFieldDataSelect($fieldname, $fielddata, ...
    method getFormFieldDataNumber (line 67) | public static function getFormFieldDataNumber($fieldname, $fielddata, ...
    method getFormFieldDataCheckbox (line 78) | public static function getFormFieldDataCheckbox($fieldname, $fielddata...
    method getFormFieldDataImage (line 89) | public static function getFormFieldDataImage($fieldname, $fielddata, $...
    method manipulateFormFieldDataDate (line 95) | public static function manipulateFormFieldDataDate($fieldname, $fieldd...

FILE: lib/Froxlor/UI/Form.php
  class Form (line 33) | class Form
    method buildForm (line 35) | public static function buildForm(array $form, string $part = ''): array
    method getFormOverviewGroupOutput (line 96) | public static function getFormOverviewGroupOutput($groupname, $groupde...
    method getFormFieldOutput (line 136) | public static function getFormFieldOutput($fieldname, $fielddata): array
    method prefetchFormFieldData (line 216) | public static function prefetchFormFieldData($fieldname, $fielddata)
    method processForm (line 228) | public static function processForm(&$form, &$input, $url_params = [], ...
    method getFormFieldData (line 375) | public static function getFormFieldData($fieldname, $fielddata, &$input)
    method checkPlausibilityFormField (line 395) | public static function checkPlausibilityFormField($fieldname, $fieldda...
    method saveFormField (line 406) | public static function saveFormField($fieldname, $fielddata, $newfield...
    method manipulateFormFieldData (line 422) | public static function manipulateFormFieldData($fieldname, $fielddata,...
    method saveForm (line 434) | public static function saveForm($fielddata, $newfieldvalue)

FILE: lib/Froxlor/UI/HTML.php
  class HTML (line 30) | class HTML
    method buildNavigation (line 41) | public static function buildNavigation(array $navigation, array $useri...
    method makeoption (line 156) | public static function makeoption($title, $value, $selvalue = null, $t...
    method askYesNo (line 203) | public static function askYesNo(string $text, string $yesfile, array $...
    method askYesNoWithCheckbox (line 216) | public static function askYesNoWithCheckbox(string $text, string $chk_...
    method askOTP (line 233) | public static function askOTP(string $text, string $targetfile, array ...
    method askUserPasswd (line 246) | public static function askUserPasswd(string $text, string $targetfile,...

FILE: lib/Froxlor/UI/Linker.php
  class Linker (line 28) | class Linker
    method __construct (line 38) | public function __construct($file = 'index.php', $hostname = '', $prot...
    method __set (line 49) | public function __set($key, $value)
    method add (line 76) | public function add($key, $value)
    method del (line 82) | public function del($key)
    method getLink (line 90) | public function getLink()
    method delAll (line 164) | public function delAll()

FILE: lib/Froxlor/UI/Listing.php
  class Listing (line 34) | class Listing
    method format (line 36) | public static function format(Collection $collection, array $tabellist...
    method formatFromArray (line 61) | public static function formatFromArray(array $collection, array $tabel...
    method generateTableHeadings (line 80) | private static function generateTableHeadings(array $tabellisting): array
    method generateTableRows (line 110) | private static function generateTableRows(array $list, array $tabellis...
    method getMultiArrayFromString (line 167) | public static function getMultiArrayFromString(array $arr, ?string $str)
    method setLinks (line 179) | private static function setLinks(array $actions, array $item): array
    method getAvailableColumnsForListing (line 221) | private static function getAvailableColumnsForListing(array $tabellist...
    method storeColumnListingForUser (line 254) | public static function storeColumnListingForUser(array $tabellisting):...
    method deleteColumnListingForUser (line 303) | public static function deleteColumnListingForUser(array $tabellisting)...
    method getVisibleColumnsForListing (line 320) | public static function getVisibleColumnsForListing(string $listing, ar...

FILE: lib/Froxlor/UI/Pagination.php
  class Pagination (line 33) | class Pagination
    method __construct (line 62) | public function __construct(
    method checkPageNumber (line 134) | private function checkPageNumber(): void
    method addLimit (line 155) | public function addLimit(int $limit = 0): Pagination
    method addSearch (line 170) | public function addSearch(?string $searchtext = null, string $field = ...
    method addOrderBy (line 191) | public function addOrderBy($field = null, $order = 'ASC'): Pagination
    method addOffset (line 206) | public function addOffset(int $offset = 0): Pagination
    method getEntries (line 217) | public function getEntries(): int
    method setEntries (line 222) | public function setEntries(int $entries): void
    method getApiCommandParams (line 228) | public function getApiCommandParams(): array
    method getApiResponseParams (line 233) | public function getApiResponseParams(): array
    method isSearchResult (line 249) | public function isSearchResult(): bool

FILE: lib/Froxlor/UI/Panel/CustomReflection.php
  class CustomReflection (line 33) | class CustomReflection extends AbstractExtension
    method getFunctions (line 40) | public function getFunctions()
    method callStaticMethod (line 54) | public function callStaticMethod($class, $method, array $args = [])
    method getStaticProperty (line 64) | public function getStaticProperty($class, $property)
    method getName (line 78) | public function getName()

FILE: lib/Froxlor/UI/Panel/FroxlorTwig.php
  class FroxlorTwig (line 39) | class FroxlorTwig extends AbstractExtension
    method getFilters (line 42) | public function getFilters()
    method getTests (line 64) | public function getTests()
    method getFunctions (line 73) | public function getFunctions()
    method formatBytesFilter (line 103) | public function formatBytesFilter($size, $suffix = "B", $factor = 1)
    method formatIPFilter (line 125) | public function formatIPFilter($addr)
    method idnDecodeFilter (line 130) | public function idnDecodeFilter($entity)
    method getSetting (line 136) | public function getSetting($setting = null)
    method getConfig (line 141) | public function getConfig($config = null)
    method getLang (line 146) | public function getLang($identifier = null, array $arguments = [])
    method getLink (line 151) | public function getLink($linkopts)
    method callMarkdown (line 156) | public function callMarkdown($string): string
    method getName (line 165) | public function getName()
    method getMix (line 170) | public function getMix($mix = '')
    method getVite (line 175) | public function getVite($basehref = '', $vite = [], $defaults = [])

FILE: lib/Froxlor/UI/Panel/UI.php
  class UI (line 42) | class UI
    method requestIsHttps (line 80) | public static function requestIsHttps(): bool
    method getCookieHost (line 94) | public static function getCookieHost(): ?string
    method sendHeaders (line 116) | public static function sendHeaders()
    method sendSslHeaders (line 158) | public static function sendSslHeaders()
    method initTwig (line 182) | public static function initTwig(bool $install_mode = false)
    method twig (line 207) | public static function twig(): ?Environment
    method getLinker (line 212) | public static function getLinker(): Linker
    method setLinker (line 217) | public static function setLinker($linker = null)
    method setCurrentUser (line 222) | public static function setCurrentUser($userinfo = null)
    method getCurrentUser (line 227) | public static function getCurrentUser(): array
    method getThemes (line 238) | public static function getThemes(): array
    method view (line 271) | public static function view($name, array $context = [])
    method twigBuffer (line 282) | public static function twigBuffer($name, array $context = [])
    method validateThemeTemplate (line 291) | public static function validateThemeTemplate(string $name, string $the...
    method getTheme (line 307) | public static function getTheme()
    method twigOutputBuffer (line 338) | public static function twigOutputBuffer()
    method activeUserSession (line 376) | public static function activeUserSession(): bool

FILE: lib/Froxlor/UI/Request.php
  class Request (line 31) | class Request
    method any (line 42) | public static function any($key, $default = null)
    method get (line 56) | public static function get($key, $default = null)
    method post (line 70) | public static function post($key, $default = null)
    method postAll (line 82) | public static function postAll()
    method cleanAll (line 93) | public static function cleanAll()
    method exist (line 125) | public static function exist($key)

FILE: lib/Froxlor/UI/Response.php
  class Response (line 31) | class Response
    method redirectTo (line 47) | public static function redirectTo($destination, $get_variables = null,...
    method standardError (line 100) | public static function standardError($errors = '', $replacer = '', $th...
    method dynamicError (line 142) | public static function dynamicError($message, bool $nosession = false)
    method standardSuccess (line 174) | public static function standardSuccess($success_message = '', $replace...

FILE: lib/Froxlor/User.php
  class User (line 31) | class User
    method getCorrectFullUserDetails (line 41) | public static function getCorrectFullUserDetails($userinfo, $html = fa...
    method getCorrectUserSalutation (line 74) | public static function getCorrectUserSalutation($userinfo)
    method updateCounters (line 100) | public static function updateCounters($returndebuginfo = false)
    method addResourceCountEx (line 340) | private static function addResourceCountEx(&$arr, $customer_arr, $used...
    method initArrField (line 361) | private static function initArrField($field = null, &$arr = [], $init_...
    method addResourceCount (line 379) | private static function addResourceCount(&$arr, $customer_arr, $used_f...

FILE: lib/Froxlor/Validate/Check.php
  class Check (line 33) | class Check
    method checkFcgidPhpFpm (line 49) | public static function checkFcgidPhpFpm($fieldname, $fielddata, $newfi...
    method checkMysqlAccessHost (line 120) | public static function checkMysqlAccessHost($fieldname, $fielddata, $n...
    method checkHostname (line 155) | public static function checkHostname($fieldname, $fielddata, $newfield...
    method checkMailAccDeletionState (line 178) | public static function checkMailAccDeletionState(string $email_addr): ...
    method checkPathConflicts (line 206) | public static function checkPathConflicts($fieldname, $fielddata, $new...
    method checkPhpInterfaceSetting (line 250) | public static function checkPhpInterfaceSetting($fieldname, $fielddata...
    method checkUsername (line 276) | public static function checkUsername($fieldname, $fielddata, $newfield...
    method checkLocalGroup (line 311) | public static function checkLocalGroup($fieldname, $fielddata, $newfie...
    method checkPgpPublicKeySetting (line 337) | public static function checkPgpPublicKeySetting($fieldname, $fielddata...
    method checkSystemUsername (line 371) | public static function checkSystemUsername($fieldname, $fielddata, $ne...

FILE: lib/Froxlor/Validate/Form.php
  class Form (line 28) | class Form
    method validateFormDefinition (line 35) | public static function validateFormDefinition(array $form): bool
    method validateFieldDefinition (line 47) | public static function validateFieldDefinition(array $field): bool
    method validateFormField (line 61) | public static function validateFormField($fieldname, array $fielddata,...

FILE: lib/Froxlor/Validate/Form/Data.php
  class Data (line 31) | class Data
    method validateFormFieldText (line 33) | public static function validateFormFieldText($fieldname, $fielddata, $...
    method validateFormFieldPassword (line 38) | public static function validateFormFieldPassword($fieldname, $fielddat...
    method validateFormFieldString (line 43) | public static function validateFormFieldString($fieldname, $fielddata,...
    method validateFormFieldEmail (line 167) | public static function validateFormFieldEmail($fieldname, $fielddata, ...
    method validateFormFieldUrl (line 173) | public static function validateFormFieldUrl($fieldname, $fielddata, $n...
    method validateFormFieldCheckbox (line 179) | public static function validateFormFieldCheckbox($fieldname, $fielddat...
    method validateFormFieldDate (line 188) | public static function validateFormFieldDate($fieldname, $fielddata, $...
    method validateFormFieldFile (line 199) | public static function validateFormFieldFile($fieldname, $fielddata, $...
    method validateFormFieldHidden (line 204) | public static function validateFormFieldHidden($fieldname, $fielddata,...
    method validateFormFieldNumber (line 218) | public static function validateFormFieldNumber($fieldname, $fielddata,...
    method validateFormFieldSelect (line 231) | public static function validateFormFieldSelect($fieldname, $fielddata,...
    method validateFormFieldTextarea (line 254) | public static function validateFormFieldTextarea($fieldname, $fielddat...
    method validateFormFieldImage (line 269) | public static function validateFormFieldImage($fieldname, $fielddata, ...

FILE: lib/Froxlor/Validate/Validate.php
  class Validate (line 34) | class Validate
    method validate (line 61) | public static function validate(
    method validate_ip2 (line 123) | public static function validate_ip2(
    method validateUrl (line 198) | public static function validateUrl(string $url, bool $allow_private_ip...
    method validateDomain (line 246) | public static function validateDomain(string $domainname, bool $allow_...
    method validateLocalHostname (line 268) | public static function validateLocalHostname(string $hostname)
    method validateEmail (line 284) | public static function validateEmail(string $email)
    method validateUsername (line 303) | public static function validateUsername(string $username, bool $unix_n...
    method validateSqlInterval (line 326) | public static function validateSqlInterval(string $interval = ''): bool
    method validateBase64Image (line 360) | public static function validateBase64Image(string $base64string)
    method validateDnsLoc (line 390) | public static function validateDnsLoc(string $input)
    method validateDnsRp (line 431) | public static function validateDnsRp(string $input)
    method validateDnsSshfp (line 456) | public static function validateDnsSshfp(string $input)
    method validateDnsTlsa (line 508) | public static function validateDnsTlsa(string $input)
    method validateDnsNaptr (line 561) | public static function validateDnsNaptr(string $input): bool

FILE: lib/functions.php
  function view (line 37) | function view($template, $attributes)
  function lng (line 51) | function lng(string $identifier, array $arguments = [])
  function old (line 64) | function old(string $identifier, ?string $default, ?string $session = null)
  function mix (line 81) | function mix($filename)
  function vite (line 106) | function vite($basehref, array $filenames): string

FILE: tests/Admins/AdminsTest.php
  class AdminsTest (line 13) | class AdminsTest extends TestCase
    method testAdminAdminsAdd (line 16) | public function testAdminAdminsAdd()
    method testAdminAdminsAddLoginnameExists (line 61) | public function testAdminAdminsAddLoginnameExists()
    method testAdminAdminsAddLoginnameIsSystemaccount (line 79) | public function testAdminAdminsAddLoginnameIsSystemaccount()
    method testAdminAdminsAddLoginnameInvalid (line 97) | public function testAdminAdminsAddLoginnameInvalid()
    method testAdminAdminsAddLoginnameInvalidEmail (line 115) | public function testAdminAdminsAddLoginnameInvalidEmail()
    method testAdminAdminsAddNotAllowed (line 129) | public function testAdminAdminsAddNotAllowed()
    method testAdminAdminsGetNotFound (line 140) | public function testAdminAdminsGetNotFound()
    method testAdminAdminsList (line 152) | public function testAdminAdminsList()
    method testAdminAdminsListLimitOffsetOrderSearch (line 165) | public function testAdminAdminsListLimitOffsetOrderSearch()
    method testResellerAdminsGet (line 206) | public function testResellerAdminsGet()
    method testResellerAdminsListNotAllowed (line 225) | public function testResellerAdminsListNotAllowed()
    method testAdminAdminsUnlock (line 241) | public function testAdminAdminsUnlock()
    method testAdminAdminsUnlockNotAllowed (line 253) | public function testAdminAdminsUnlockNotAllowed()
    method testAdminAdminsDeleteMyOwn (line 266) | public function testAdminAdminsDeleteMyOwn()
    method testAdminAdminsDeleteReseller (line 275) | public function testAdminAdminsDeleteReseller()
    method testResellerAdminsDelete (line 295) | public function testResellerAdminsDelete()
    method testAdminAdminsEditMyOwn (line 312) | public function testAdminAdminsEditMyOwn()
    method testAdminAdminsEdit (line 327) | public function testAdminAdminsEdit()
    method testAdminsAdminsEditNotAllowed (line 346) | public function testAdminsAdminsEditNotAllowed()
    method testAdminsAdminsCannotDeleteFirstAdmin (line 359) | public function testAdminsAdminsCannotDeleteFirstAdmin()

FILE: tests/Backup/DataDumpTest.php
  class DataDumpTest (line 15) | class DataDumpTest extends TestCase
    method testAdminDataDumpNotEnabled (line 18) | public function testAdminDataDumpNotEnabled()
    method testAdminDataDumpExtrasHidden (line 38) | public function testAdminDataDumpExtrasHidden()
    method testAdminDataDumpExtrasExportHidden (line 59) | public function testAdminDataDumpExtrasExportHidden()
    method testCustomerDataDumpAdd (line 79) | public function testCustomerDataDumpAdd()
    method testCustomerDataDumpAddPathNotDocroot (line 110) | public function testCustomerDataDumpAddPathNotDocroot()
    method testAdminDataDumpGet (line 129) | public function testAdminDataDumpGet()
    method testAdminDataDumpUpdate (line 136) | public function testAdminDataDumpUpdate()
    method testAdminDataDumpListing (line 147) | public function testAdminDataDumpListing()
    method testCustomerDataDumpDelete (line 167) | public function testCustomerDataDumpDelete()
    method testCustomerDataDumpDeleteNotFound (line 189) | public function testCustomerDataDumpDeleteNotFound()

FILE: tests/Bulk/DomainBulkTest.php
  class DomainBulkTest (line 12) | class DomainBulkTest extends TestCase
    method testNoImportFile (line 14) | public function testNoImportFile()
    method testImportFileDoesNotExist (line 22) | public function testImportFileDoesNotExist()
    method testImportDomains (line 30) | public function testImportDomains()
    method testImportDomainsMaxAlloc (line 58) | public function testImportDomainsMaxAlloc()

FILE: tests/Certificates/CertificatesTest.php
  class CertificatesTest (line 15) | class CertificatesTest extends TestCase
    method testAdminCertificatesAdd (line 18) | public function testAdminCertificatesAdd()
    method testResellerCertificatesAddAgain (line 38) | public function testResellerCertificatesAddAgain()
    method testCustomerCertificatesAdd (line 58) | public function testCustomerCertificatesAdd()
    method testAdminCertificatesList (line 83) | public function testAdminCertificatesList()
    method testResellerCertificatesList (line 96) | public function testResellerCertificatesList()
    method testCustomerCertificatesList (line 115) | public function testCustomerCertificatesList()
    method testAdminCertificatesUpdate (line 133) | public function testAdminCertificatesUpdate()
    method testCustomerCertificatesUpdate (line 147) | public function testCustomerCertificatesUpdate()
    method testCustomerCertificatesDelete (line 170) | public function testCustomerCertificatesDelete()
    method generateKey (line 186) | private function generateKey()

FILE: tests/Cron/TaskIdTest.php
  class TaskIDTest (line 10) | class TaskIDTest extends TestCase
    method testValidTaskId (line 38) | public function testValidTaskId()
    method testIdMappingCorrect (line 51) | public function testIdMappingCorrect() {
    method testConvertToConstant (line 58) | public function testConvertToConstant() {

FILE: tests/Cronjobs/CronjobsTest.php
  class CronjobsTest (line 14) | class CronjobsTest extends TestCase
    method testAdminCronjobsList (line 17) | public function testAdminCronjobsList()
    method testCustomerCronjobsListNotAllowed (line 30) | public function testCustomerCronjobsListNotAllowed()
    method testAdminCronjobsAdd (line 43) | public function testAdminCronjobsAdd()
    method testAdminCronjobsGetNotFound (line 52) | public function testAdminCronjobsGetNotFound()
    method testCustomerCronjobsGetNotAllowed (line 62) | public function testCustomerCronjobsGetNotAllowed()
    method testAdminCronjobsEdit (line 77) | public function testAdminCronjobsEdit()
    method testResellerCronjobsEditNotAllowed (line 91) | public function testResellerCronjobsEditNotAllowed()
    method testAdminCronjobsDelete (line 109) | public function testAdminCronjobsDelete()

FILE: tests/Customers/CustomersTest.php
  class CustomersTest (line 18) | class CustomersTest extends TestCase
    method testAdminCustomersAdd (line 21) | public function testAdminCustomersAdd()
    method testAdminCustomersAddEmptyMail (line 77) | public function testAdminCustomersAddEmptyMail()
    method testAdminCustomersAddInvalidMail (line 92) | public function testAdminCustomersAddInvalidMail()
    method testAdminCustomersList (line 111) | public function testAdminCustomersList()
    method testResellerCustomersList (line 136) | public function testResellerCustomersList()
    method testCustomerCustomersList (line 158) | public function testCustomerCustomersList()
    method testCustomerCustomersGet (line 180) | public function testCustomerCustomersGet()
    method testAdminCustomersGetNotFound (line 202) | public function testAdminCustomersGetNotFound()
    method testCustomerCustomersGetForeign (line 216) | public function testCustomerCustomersGetForeign()
    method testAdminCustomerUpdateDeactivate (line 237) | public function testAdminCustomerUpdateDeactivate()
    method testCustomerCustomersGetWhenDeactivated (line 262) | public function testCustomerCustomersGetWhenDeactivated()
    method testCustomerCustomersUpdate (line 284) | public function testCustomerCustomersUpdate()
    method testResellerCustomersAddAllocateMore (line 321) | public function testResellerCustomersAddAllocateMore()
    method testCustomerCustomersDelete (line 345) | public function testCustomerCustomersDelete()
    method testResellerCustomersDeleteNotOwned (line 360) | public function testResellerCustomersDeleteNotOwned()
    method testAdminCustomersDelete (line 375) | public function testAdminCustomersDelete()
    method testAdminCustomersUnlock (line 395) | public function testAdminCustomersUnlock()
    method testAdminCustomersUnlockNotAllowed (line 407) | public function testAdminCustomersUnlockNotAllowed()
    method testAdminCustomersMoveNotAllowed (line 420) | public function testAdminCustomersMoveNotAllowed()
    method testAdminCustomersMoveTargetIsSource (line 434) | public function testAdminCustomersMoveTargetIsSource()
    method testAdminCustomersMove (line 445) | public function testAdminCustomersMove()
    method testAdminCustomersAddLoginnameIsSystemaccount (line 461) | public function testAdminCustomersAddLoginnameIsSystemaccount()
    method testAdminCustomersAddAutoLoginname (line 502) | public function testAdminCustomersAddAutoLoginname()
    method testAdminCustomersAddLoginnameExists (line 530) | public function testAdminCustomersAddLoginnameExists()
    method testAdminCustomersAddLoginnameInvalid (line 550) | public function testAdminCustomersAddLoginnameInvalid()
    method testAdminCustomersAddLoginnameInvalid2 (line 570) | public function testAdminCustomersAddLoginnameInvalid2()
    method testResellerCustomersAddNoFtpValidateDefaultUserExists (line 591) | public function testResellerCustomersAddNoFtpValidateDefaultUserExists()

FILE: tests/Customers/HostingPlansTest.php
  class HostingPlansTest (line 17) | class HostingPlansTest extends TestCase
    method testAdminPlanAdd (line 20) | public function testAdminPlanAdd()
    method testAdminPlanAddEmptyName (line 59) | public function testAdminPlanAddEmptyName()
    method testAdminPlanList (line 79) | public function testAdminPlanList()
    method testResellerPlanList (line 96) | public function testResellerPlanList()
    method testCustomerPlanList (line 118) | public function testCustomerPlanList()
    method testCustomerPlanAdd (line 136) | public function testCustomerPlanAdd()
    method testCustomerPlanGet (line 151) | public function testCustomerPlanGet()
    method testCustomerPlanUpdate (line 166) | public function testCustomerPlanUpdate()
    method testCustomerPlanDelete (line 181) | public function testCustomerPlanDelete()
    method testAdminPlanGetNotFound (line 196) | public function testAdminPlanGetNotFound()
    method testAdminPlanUpdate (line 210) | public function testAdminPlanUpdate()
    method testResellerPlanDeleteNotOwned (line 236) | public function testResellerPlanDeleteNotOwned()
    method testAdminPlanDelete (line 255) | public function testAdminPlanDelete()
    method testAdminCustomersAddWithHostingPlan (line 275) | public function testAdminCustomersAddWithHostingPlan()

FILE: tests/DomainZones/DomainZonesTest.php
  class DomainZonesTest (line 18) | class DomainZonesTest extends TestCase
    method testCustomerDomainZonesGet (line 21) | public function testCustomerDomainZonesGet()
    method testCustomerDomainZonesGetNoSubdomains (line 50) | public function testCustomerDomainZonesGetNoSubdomains()
    method testCustomerDomainZonesGetWithDMARC (line 72) | public function testCustomerDomainZonesGetWithDMARC()
    method testCustomerDomainZonesGetWithDMARCSubdomain (line 108) | public function testCustomerDomainZonesGetWithDMARCSubdomain()
    method testAdminDomainZonesUpdate (line 151) | public function testAdminDomainZonesUpdate()
    method testCustomerDomainZonesAddA (line 162) | public function testCustomerDomainZonesAddA()
    method testAdminDomainZonesListing (line 196) | public function testAdminDomainZonesListing()
    method testCustomerDomainZonesAddAInvalid (line 220) | public function testCustomerDomainZonesAddAInvalid()
    method testCustomerDomainZonesAddADuplicate (line 245) | public function testCustomerDomainZonesAddADuplicate()
    method testCustomerDomainZonesAddAAAA (line 270) | public function testCustomerDomainZonesAddAAAA()
    method testCustomerDomainZonesAddAAAAInvalid (line 304) | public function testCustomerDomainZonesAddAAAAInvalid()
    method testAdminDomainZonesAddMX (line 325) | public function testAdminDomainZonesAddMX()
    method testAdminDomainZonesAddMXNoPrio (line 354) | public function testAdminDomainZonesAddMXNoPrio()
    method testAdminDomainZonesAddMXInvalid (line 372) | public function testAdminDomainZonesAddMXInvalid()
    method testAdminDomainZonesAddCAAIssue (line 387) | public function testAdminDomainZonesAddCAAIssue()
    method testAdminDomainZonesAddCAAIssueWithParameters (line 412) | public function testAdminDomainZonesAddCAAIssueWithParameters()
    method testAdminDomainZonesAddCAAIssueWithTwoParameters (line 437) | public function testAdminDomainZonesAddCAAIssueWithTwoParameters()
    method testAdminDomainZonesAddCAAInvalidIssueValue (line 462) | public function testAdminDomainZonesAddCAAInvalidIssueValue()
    method testAdminDomainZonesAddCAAInvalidIssueDomain (line 477) | public function testAdminDomainZonesAddCAAInvalidIssueDomain()
    method testAdminDomainZonesAddCAAInvalidIssueTld (line 492) | public function testAdminDomainZonesAddCAAInvalidIssueTld()
    method testAdminDomainZonesAddCAAIssueWild (line 507) | public function testAdminDomainZonesAddCAAIssueWild()
    method testAdminDomainZonesAddCAAIssueWildWithParameters (line 532) | public function testAdminDomainZonesAddCAAIssueWildWithParameters()
    method testAdminDomainZonesAddCAAIssueWildWithTwoParameters (line 557) | public function testAdminDomainZonesAddCAAIssueWildWithTwoParameters()
    method testAdminDomainZonesAddCAAInvalidIssueWildValue (line 582) | public function testAdminDomainZonesAddCAAInvalidIssueWildValue()
    method testAdminDomainZonesAddCAAInvalidIssueWildDomain (line 597) | public function testAdminDomainZonesAddCAAInvalidIssueWildDomain()
    method testAdminDomainZonesAddCAAInvalidIssueWildTld (line 612) | public function testAdminDomainZonesAddCAAInvalidIssueWildTld()
    method testAdminDomainZonesAddCAAIodefMail (line 627) | public function testAdminDomainZonesAddCAAIodefMail()
    method testAdminDomainZonesAddCAAIodefMailInvalid (line 652) | public function testAdminDomainZonesAddCAAIodefMailInvalid()
    method testAdminDomainZonesAddCAAIodefHttp (line 667) | public function testAdminDomainZonesAddCAAIodefHttp()
    method testAdminDomainZonesAddCAAIodefHttpInvalid (line 692) | public function testAdminDomainZonesAddCAAIodefHttpInvalid()
    method testAdminDomainZonesAddCAAIodefHttps (line 707) | public function testAdminDomainZonesAddCAAIodefHttps()
    method testAdminDomainZonesAddCAAIodefHttpsInvalid (line 732) | public function testAdminDomainZonesAddCAAIodefHttpsInvalid()
    method testAdminDomainZonesAddCname (line 747) | public function testAdminDomainZonesAddCname()
    method testAdminDomainZonesAddCnameLocal (line 771) | public function testAdminDomainZonesAddCnameLocal()
    method testAdminDomainZonesAddCnameInvalid (line 799) | public function testAdminDomainZonesAddCnameInvalid()
    method testAdminDomainZonesAddCnameInvalidWwwAlias (line 817) | public function testAdminDomainZonesAddCnameInvalidWwwAlias()
    method testAdminDomainZonesAddForExistingCname (line 842) | public function testAdminDomainZonesAddForExistingCname()
    method testAdminDomainZonesAddCnameUnderscore (line 874) | public function testAdminDomainZonesAddCnameUnderscore()
    method testAdminDomainZonesAddNS (line 898) | public function testAdminDomainZonesAddNS()
    method testAdminDomainZonesAddNsInvalid (line 922) | public function testAdminDomainZonesAddNsInvalid()
    method testAdminDomainZonesAddTXT (line 936) | public function testAdminDomainZonesAddTXT()
    method testAdminDomainZonesAddTXTCustomDMARC (line 964) | public function testAdminDomainZonesAddTXTCustomDMARC()
    method testAdminDomainZonesAddTXTCustomDMARCSubdomain (line 995) | public function testAdminDomainZonesAddTXTCustomDMARCSubdomain()
    method testAdminDomainZonesAddSRV (line 1022) | public function testAdminDomainZonesAddSRV()
    method testAdminDomainZonesAddSrvInvalid (line 1047) | public function testAdminDomainZonesAddSrvInvalid()
    method testCustomerDomainZonesDelete (line 1062) | public function testCustomerDomainZonesDelete()
    method testCustomerDomainZonesDeleteUnmodified (line 1082) | public function testCustomerDomainZonesDeleteUnmodified()

FILE: tests/Domains/DomainsTest.php
  class DomainsTest (line 17) | class DomainsTest extends TestCase
    method testAdminDomainsAdd (line 20) | public function testAdminDomainsAdd()
    method testAdminDomainsList (line 51) | public function testAdminDomainsList()
    method testResellerDomainsList (line 76) | public function testResellerDomainsList()
    method testResellerDomainsAddWithCanEditPhpSettingsDefaultIp (line 94) | public function testResellerDomainsAddWithCanEditPhpSettingsDefaultIp()
    method testResellerDomainsAddWithCanEditPhpSettingsAllowedIp (line 114) | public function testResellerDomainsAddWithCanEditPhpSettingsAllowedIp()
    method testResellerDomainsAddWithAbsolutePathNoChangeServerSettings (line 141) | public function testResellerDomainsAddWithAbsolutePathNoChangeServerSe...
    method testResellerDomainsUpdate (line 164) | public function testResellerDomainsUpdate()
    method testResellerDomainsUpdateAboslutePathNotAllowed (line 189) | public function testResellerDomainsUpdateAboslutePathNotAllowed()
    method testAdminDomainsAddSysHostname (line 206) | public function testAdminDomainsAddSysHostname()
    method testAdminDomainsAddNoPunycode (line 217) | public function testAdminDomainsAddNoPunycode()
    method testAdminDomainsAddInvalidDomain (line 228) | public function testAdminDomainsAddInvalidDomain()
    method testAdminDomainsUpdate (line 243) | public function testAdminDomainsUpdate()
    method testAdminDomainsUpdateAbsolutePath (line 271) | public function testAdminDomainsUpdateAbsolutePath()
    method testAdminDomainsUpdateIssue756 (line 287) | public function testAdminDomainsUpdateIssue756()
    method testAdminDomainsMoveButUnknownCustomer (line 342) | public function testAdminDomainsMoveButUnknownCustomer()
    method testAdminDomainsMove (line 359) | public function testAdminDomainsMove()
    method testAdminDomainsDuplicate (line 388) | public function testAdminDomainsDuplicate()
    method testAdminDomainsDelete (line 408) | public function testAdminDomainsDelete()
    method testCustomerDomainsList (line 425) | public function testCustomerDomainsList()
    method testAdminIdnDomainsAdd (line 443) | public function testAdminIdnDomainsAdd()
    method testAdminIdn2DomainsAdd (line 470) | public function testAdminIdn2DomainsAdd()
    method testAdminDomainsAddDnsLetsEncryptFail (line 493) | public function testAdminDomainsAddDnsLetsEncryptFail()

FILE: tests/Emails/EmailsTest.php
  class MailsTest (line 21) | class MailsTest extends TestCase
    method testCustomerEmailsAdd (line 24) | public function testCustomerEmailsAdd()
    method testAdminEmailsAdd (line 52) | public function testAdminEmailsAdd()
    method testAdminEmailsUpdate (line 67) | public function testAdminEmailsUpdate()
    method testCustomerEmailsUpdate (line 80) | public function testCustomerEmailsUpdate()
    method testCustomerEmailForwardersAdd (line 101) | public function testCustomerEmailForwardersAdd()
    method testCustomerEmailForwardersAddNoMoreResources (line 124) | public function testCustomerEmailForwardersAddNoMoreResources()
    method testCustomerEmailForwardersAddEmailHidden (line 143) | public function testCustomerEmailForwardersAddEmailHidden()
    method testCustomerEmailForwardersDeleteEmailHidden (line 163) | public function testCustomerEmailForwardersDeleteEmailHidden()
    method testCustomerEmailForwardersAddAnother (line 183) | public function testCustomerEmailForwardersAddAnother()
    method testCustomerEmailForwardersListing (line 208) | public function testCustomerEmailForwardersListing()
    method testCustomerEmailForwardersAddWithSpaces (line 240) | public function testCustomerEmailForwardersAddWithSpaces()
    method testCustomerEmailForwardersAddExistingAsMail (line 265) | public function testCustomerEmailForwardersAddExistingAsMail()
    method testCustomerEmailForwardersAddExistingAsDestination (line 287) | public function testCustomerEmailForwardersAddExistingAsDestination()
    method testCustomerEmailForwardersAddInvalid (line 305) | public function testCustomerEmailForwardersAddInvalid()
    method testAdminEmailForwadersUndefinedGet (line 323) | public function testAdminEmailForwadersUndefinedGet()
    method testAdminEmailForwadersUndefinedUpdate (line 330) | public function testAdminEmailForwadersUndefinedUpdate()
    method testCustomerEmailForwardersDelete (line 341) | public function testCustomerEmailForwardersDelete()
    method testCustomerEmailForwardersDeleteUnknown (line 364) | public function testCustomerEmailForwardersDeleteUnknown()
    method testCustomerEmailsListing (line 383) | public function testCustomerEmailsListing()
    method testCustomerEmailAccountsAdd (line 406) | public function testCustomerEmailAccountsAdd()
    method testAdminEmailAccountsUpdate (line 445) | public function testAdminEmailAccountsUpdate()
    method testAdminEmailAccountsUpdateDeactivated (line 467) | public function testAdminEmailAccountsUpdateDeactivated()
    method testAdminEmailAccountsUndefinedGet (line 497) | public function testAdminEmailAccountsUndefinedGet()
    method testAdminEmailAccountsUndefinedListing (line 504) | public function testAdminEmailAccountsUndefinedListing()
    method testCustomerEmailAccountsDelete (line 511) | public function testCustomerEmailAccountsDelete()
    method testCustomerEmailsDelete (line 530) | public function testCustomerEmailsDelete()

FILE: tests/Extras/DirOptionsTest.php
  class DirOptionsTest (line 14) | class DirOptionsTest extends TestCase
    method testCustomerDirOptionsAdd (line 17) | public function testCustomerDirOptionsAdd()
    method testCustomerDirOptionsAddDuplicatePath (line 42) | public function testCustomerDirOptionsAddDuplicatePath()
    method testAdminDirOptionsGet (line 64) | public function testAdminDirOptionsGet()
    method testResellerDirOptionsGet (line 83) | public function testResellerDirOptionsGet()
    method testCustomerDirOptionsGetNotFound (line 107) | public function testCustomerDirOptionsGetNotFound()
    method testCustomerDirOptionsUpdate (line 124) | public function testCustomerDirOptionsUpdate()
    method testAdminDirOptionsList (line 147) | public function testAdminDirOptionsList()
    method testCustomerDirOptionsDelete (line 171) | public function testCustomerDirOptionsDelete()
    method testCustomerDirOptionsAddMalformed (line 195) | public function testCustomerDirOptionsAddMalformed()
    method testCustomerDirOptionsAddMalformedInvalid (line 215) | public function testCustomerDirOptionsAddMalformedInvalid()

FILE: tests/Extras/DirProtectionsTest.php
  class DirProtectionsTest (line 14) | class DirProtectionsTest extends TestCase
    method testCustomerDirProtectionsAdd (line 17) | public function testCustomerDirProtectionsAdd()
    method testCustomerDirProtectionsAddSameUserPath (line 39) | public function testCustomerDirProtectionsAddSameUserPath()
    method testCustomerDirProtectionsAddPasswordEqualsUsername (line 59) | public function testCustomerDirProtectionsAddPasswordEqualsUsername()
    method testAdminDirProtectionsGet (line 83) | public function testAdminDirProtectionsGet()
    method testResellerDirProtectionsGet (line 105) | public function testResellerDirProtectionsGet()
    method testCustomerDirProtectionsUpdate (line 132) | public function testCustomerDirProtectionsUpdate()
    method testCustomerDirProtectionsList (line 163) | public function testCustomerDirProtectionsList()
    method testCustomerDirProtectionsDelete (line 188) | public function testCustomerDirProtectionsDelete()

FILE: tests/Froxlor/FroxlorTest.php
  class FroxlorTest (line 12) | class FroxlorTest extends TestCase
    method testFroxlorcheckUpdate (line 15) | public function testFroxlorcheckUpdate()

FILE: tests/Froxlor/IPToolsTest.php
  class IPToolsTest (line 11) | class IPToolsTest extends TestCase
    method testValidateIPv6 (line 13) | public function testValidateIPv6()
    method testValidateIPinRange (line 27) | public function testValidateIPinRange()

FILE: tests/Froxlor/SettingsTest.php
  class SettingsTest (line 9) | class SettingsTest extends TestCase
    method setUp (line 12) | protected function setUp(): void
    method testSettingGet (line 18) | public function testSettingGet()
    method testSettingGetNoSeparator (line 24) | public function testSettingGetNoSeparator()
    method testSettingGetUnknown (line 30) | public function testSettingGetUnknown()
    method testSettingsAddNew (line 36) | public function testSettingsAddNew()
    method testSettingsAddNewSettingExists (line 43) | public function testSettingsAddNewSettingExists()
    method testSettingSetNoSave (line 53) | public function testSettingSetNoSave()
    method testSettingsSetInstantSave (line 69) | public function testSettingsSetInstantSave()
    method testSettingsSetFlushSave (line 81) | public function testSettingsSetFlushSave()
    method testSettingsIsInList (line 89) | public function testSettingsIsInList()
    method testFroxlorVhostSettings (line 97) | public function testFroxlorVhostSettings()

FILE: tests/Froxlor/StoreTest.php
  class StoreTest (line 12) | class StoreTest extends TestCase
    method testStoreSettingClearCertificates (line 15) | public function testStoreSettingClearCertificates()
    method testStoreSettingDefaultIp (line 38) | public function testStoreSettingDefaultIp()
    method testStoreSettingDefaultTheme (line 98) | public function testStoreSettingDefaultTheme()

FILE: tests/Froxlor/ValidateTest.php
  class ValidateTest (line 13) | class ValidateTest extends TestCase
    method testValidate (line 16) | public function testValidate()
    method testValidateStrInEmptyDefault (line 22) | public function testValidateStrInEmptyDefault()
    method testValidateEmptyDefaultNoArray (line 32) | public function testValidateEmptyDefaultNoArray()
    method testValidateRemoveNotAllowedChar (line 38) | public function testValidateRemoveNotAllowedChar()
    method testValidateStringFormatError (line 44) | public function testValidateStringFormatError()
    method testValidateIp (line 51) | public function testValidateIp()
    method testValidateIpPrivNotAllowed (line 57) | public function testValidateIpPrivNotAllowed()
    method testValidateIpPrivNotAllowedBool (line 64) | public function testValidateIpPrivNotAllowedBool()
    method testValidateIpCidrNotAllowed (line 70) | public function testValidateIpCidrNotAllowed()
    method testValidateIpCidrNotAllowedBool (line 77) | public function testValidateIpCidrNotAllowedBool()
    method testValidateIpCidr (line 83) | public function testValidateIpCidr()
    method testValidateIpv6Disallowed (line 89) | public function testValidateIpv6Disallowed()
    method testValidateIpLocalhostAllowed (line 96) | public function testValidateIpLocalhostAllowed()
    method testValidateCidrNoationToNetmaskNotationIPv4 (line 102) | public function testValidateCidrNoationToNetmaskNotationIPv4()
    method testValidateIpLocalhostAllowedWrongIp (line 112) | public function testValidateIpLocalhostAllowedWrongIp()
    method testValidateUrl (line 119) | public function testValidateUrl()
    method testValidateDomain (line 153) | public function testValidateDomain()
    method testValidateHostname (line 169) | public function testValidateHostname()
    method testValidateEmail (line 187) | public function testValidateEmail()
    method testValidateUsername (line 195) | public function testValidateUsername()
    method testValidateSqlInterval (line 219) | public function testValidateSqlInterval()

FILE: tests/Ftps/FtpsTest.php
  class FtpsTest (line 17) | class FtpsTest extends TestCase
    method testAdminFtpsGetId (line 20) | public function testAdminFtpsGetId()
    method testResellerFtpsGetId (line 33) | public function testResellerFtpsGetId()
    method testCustomerFtpsGetId (line 49) | public function testCustomerFtpsGetId()
    method testCustomerFtpsGetOtherId (line 68) | public function testCustomerFtpsGetOtherId()
    method testAdminFtpsList (line 85) | public function testAdminFtpsList()
    method testAdminFtpsListSpecificCustomer (line 98) | public function testAdminFtpsListSpecificCustomer()
    method testResellerFtpsList (line 110) | public function testResellerFtpsList()
    method testCustomerFtpsList (line 129) | public function testCustomerFtpsList()
    method testCustomerFtpsAdd (line 147) | public function testCustomerFtpsAdd()
    method testCustomerFtpsAddSymlinkOutsideHomedir (line 168) | public function testCustomerFtpsAddSymlinkOutsideHomedir()
    method testCustomerFtpsAddNoMoreResources (line 193) | public function testCustomerFtpsAddNoMoreResources()
    method testAdminFtpsAddCustomerRequired (line 210) | public function testAdminFtpsAddCustomerRequired()
    method testCustomerFtpsEdit (line 226) | public function testCustomerFtpsEdit()
    method testAdminFtpsEdit (line 248) | public function testAdminFtpsEdit()
    method testAdminFtpsAdd (line 269) | public function testAdminFtpsAdd()
    method testCustomerFtpsDelete (line 291) | public function testCustomerFtpsDelete()
    method testAdminFtpsDelete (line 308) | public function testAdminFtpsDelete()
    method testCustomerFtpsDeleteDefaultUser (line 319) | public function testCustomerFtpsDeleteDefaultUser()

FILE: tests/Global/ApiParameterTest.php
  class ApiParameterTest (line 12) | class ApiParameterTest extends TestCase
    method testMissingRequiredParameter (line 15) | public function testMissingRequiredParameter()

FILE: tests/Global/FroxlorRpcTest.php
  class FroxlorRpcTest (line 11) | class FroxlorRpcTest extends TestCase
    method testNoCredentialsGiven (line 14) | public function testNoCredentialsGiven()
    method testValidateAuthInvalid (line 21) | public function testValidateAuthInvalid()
    method testValidateAuthAllowFromInvalid (line 30) | public function testValidateAuthAllowFromInvalid()
    method testEmptyRequestBody (line 41) | public function testEmptyRequestBody()
    method testInvalidJSON (line 51) | public function testInvalidJSON()
    method testNoCommandGiven (line 60) | public function testNoCommandGiven()
    method testInvalidCommandGiven (line 69) | public function testInvalidCommandGiven()
    method testUnknownCommandGiven (line 78) | public function testUnknownCommandGiven()
    method testCommandOk (line 87) | public function testCommandOk()
    method testApiPhpEscaping (line 97) | public function testApiPhpEscaping()
    method stripcslashes_deep (line 111) | private function stripcslashes_deep($value)
    method generateKey (line 116) | private function generateKey()

FILE: tests/IpsAndPorts/IpsAndPortsTest.php
  class IpsAndPortsTest (line 14) | class IpsAndPortsTest extends TestCase
    method testAdminIpsAndPortsList (line 17) | public function testAdminIpsAndPortsList()
    method testResellerIpsAndPortsListHasNone (line 30) | public function testResellerIpsAndPortsListHasNone()
    method testAdminIpsAndPortsAdd (line 45) | public function testAdminIpsAndPortsAdd()
    method testAdminIpsAndPortsAddExists (line 61) | public function testAdminIpsAndPortsAddExists()
    method testAdminIpsAndPortsAddIpv6 (line 71) | public function testAdminIpsAndPortsAddIpv6()
    method testAdminIpsAndPortsGetNotFound (line 84) | public function testAdminIpsAndPortsGetNotFound()
    method testResellerIpsAndPortsList (line 98) | public function testResellerIpsAndPortsList()
    method testResellerIpsAndPortsGet (line 124) | public function testResellerIpsAndPortsGet()
    method testResellerIpsAndPortsGetRestrictedNotOwned (line 144) | public function testResellerIpsAndPortsGetRestrictedNotOwned()
    method testResellerIpsAndPortsAdd (line 160) | public function testResellerIpsAndPortsAdd()
    method testCustomerIpsAndPortsGetNotAllowed (line 177) | public function testCustomerIpsAndPortsGetNotAllowed()
    method testAdminIpsAndPortsEdit (line 192) | public function testAdminIpsAndPortsEdit()
    method testResellerIpsAndPortsEditNotAllowed (line 206) | public function testResellerIpsAndPortsEditNotAllowed()
    method testCustomerIpsAndPortsEditNotAllowed (line 224) | public function testCustomerIpsAndPortsEditNotAllowed()
    method testAdminIpsAndPortsEditCantChangeSystemIp (line 241) | public function testAdminIpsAndPortsEditCantChangeSystemIp()
    method testAdminIpsAndPortsDeleteCantDeleteDefaultIp (line 252) | public function testAdminIpsAndPortsDeleteCantDeleteDefaultIp()
    method testAdminIpsAndPortsDelete (line 262) | public function testAdminIpsAndPortsDelete()
    method testResellerIpsAndPortsDeleteNotAllowed (line 273) | public function testResellerIpsAndPortsDeleteNotAllowed()

FILE: tests/Mysqls/MysqlServerTest.php
  class MysqlServerTest (line 14) | class MysqlServerTest extends TestCase
    method testAdminMysqlServerAdd (line 17) | public function testAdminMysqlServerAdd()
    method testAdminMysqlServerAddInvalidHostOrIP (line 33) | public function testAdminMysqlServerAddInvalidHostOrIP()
    method testAdminMysqlServerDeleteDefault (line 51) | public function testAdminMysqlServerDeleteDefault()
    method testAdminMysqlServerDeleteUnknown (line 67) | public function testAdminMysqlServerDeleteUnknown()

FILE: tests/Mysqls/MysqlsTest.php
  class MysqlsTest (line 24) | class MysqlsTest extends TestCase
    method testCustomerMysqlsAdd (line 27) | public function testCustomerMysqlsAdd()
    method testCustomerMysqlsDBNameAdd (line 57) | public function testCustomerMysqlsDBNameAdd()
    method testAdminMysqlsGet (line 95) | public function testAdminMysqlsGet()
    method testResellerMysqlsGet (line 112) | public function testResellerMysqlsGet()
    method testCustomerMysqlsGetUnknown (line 129) | public function testCustomerMysqlsGetUnknown()
    method testAdminMysqlsUpdate (line 151) | public function testAdminMysqlsUpdate()
    method testAdminMysqlsUpdatePwdOnly (line 180) | public function testAdminMysqlsUpdatePwdOnly()
    method testCustomerMysqlsList (line 199) | public function testCustomerMysqlsList()
    method testUpdateCustomerAllowedMysqlWithExistingDbs (line 237) | public function testUpdateCustomerAllowedMysqlWithExistingDbs()
    method testCustomerMysqlsDelete (line 254) | public function testCustomerMysqlsDelete()
    method testCustomerMysqlsDBNameDelete (line 276) | public function testCustomerMysqlsDBNameDelete()
    method testStoreSettingIpAddress (line 298) | public function testStoreSettingIpAddress()
    method testGetAllSqlUsers (line 316) | public function testGetAllSqlUsers()

FILE: tests/PhpAndFpm/FpmDaemonsTest.php
  class FpmDaemonsTest (line 13) | class FpmDaemonsTest extends TestCase
    method testAdminFpmDaemonsAdd (line 18) | public function testAdminFpmDaemonsAdd()
    method testAdminFpmDaemonsAddUnknownPM (line 36) | public function testAdminFpmDaemonsAddUnknownPM()
    method testAdminFpmDaemonsAddInvalidDesc (line 50) | public function testAdminFpmDaemonsAddInvalidDesc()
    method testAdminFpmDaemonsUpdate (line 67) | public function testAdminFpmDaemonsUpdate()
    method testAdminFpmDaemonsUpdate2 (line 89) | public function testAdminFpmDaemonsUpdate2()
    method testAdminFpmDaemonsUpdateUnknownPM (line 105) | public function testAdminFpmDaemonsUpdateUnknownPM()
    method testAdminFpmDaemonsUpdateInvalidDesc (line 121) | public function testAdminFpmDaemonsUpdateInvalidDesc()
    method testAdminFpmDaemonsList (line 137) | public function testAdminFpmDaemonsList()
    method testAdminFpmDaemonsGetNotFound (line 151) | public function testAdminFpmDaemonsGetNotFound()
    method testCustomerFpmDaemonsAdd (line 161) | public function testCustomerFpmDaemonsAdd()
    method testCustomerFpmDaemonsGet (line 174) | public function testCustomerFpmDaemonsGet()
    method testCustomerFpmDaemonsList (line 187) | public function testCustomerFpmDaemonsList()
    method testCustomerFpmDaemonsUpdate (line 204) | public function testCustomerFpmDaemonsUpdate()
    method testCustomerFpmDaemonsDelete (line 217) | public function testCustomerFpmDaemonsDelete()
    method testAdminFpmDaemonsDelete (line 234) | public function testAdminFpmDaemonsDelete()
    method testAdminFpmDaemonsDeleteDefaultConfig (line 251) | public function testAdminFpmDaemonsDeleteDefaultConfig()

FILE: tests/PhpAndFpm/PhpSettingsTest.php
  class PhpSettingsText (line 14) | class PhpSettingsText extends TestCase
    method testAdminPhpSettingsList (line 19) | public function testAdminPhpSettingsList()
    method testCustomerPhpSettingsListNotAllowed (line 32) | public function testCustomerPhpSettingsListNotAllowed()
    method testAdminPhpSettingsAdd (line 49) | public function testAdminPhpSettingsAdd()
    method testAdminPhpSettingsGet (line 64) | public function testAdminPhpSettingsGet()
    method testAdminPhpSettingsGetNotFound (line 76) | public function testAdminPhpSettingsGetNotFound()
    method testCustomerPhpSettingsGetNotAllowed (line 86) | public function testCustomerPhpSettingsGetNotAllowed()
    method testAdminPhpSettingsAddForAll (line 104) | public function testAdminPhpSettingsAddForAll()

FILE: tests/SubDomains/SubDomainsTest.php
  class SubDomainsTest (line 17) | class SubDomainsTest extends TestCase
    method testCustomerSubDomainsAdd (line 20) | public function testCustomerSubDomainsAdd()
    method testResellerSubDomainsAdd (line 39) | public function testResellerSubDomainsAdd()
    method testCustomerSubDomainsAddNoPunycode (line 59) | public function testCustomerSubDomainsAddNoPunycode()
    method testCustomerSubDomainsAddMainDomainUnknown (line 77) | public function testCustomerSubDomainsAddMainDomainUnknown()
    method testCustomerSubDomainsAddInvalidDomain (line 95) | public function testCustomerSubDomainsAddInvalidDomain()
    method testAdminSubDomainsGet (line 117) | public function testAdminSubDomainsGet()
    method testAdminSubDomainsGetMainDomain (line 134) | public function testAdminSubDomainsGetMainDomain()
    method testAdminSubDomainsUpdate (line 151) | public function testAdminSubDomainsUpdate()
    method testCustomerSubDomainsUpdate (line 174) | public function testCustomerSubDomainsUpdate()
    method testCustomerSubDomainsList (line 192) | public function testCustomerSubDomainsList()
    method testResellerSubDomainsList (line 210) | public function testResellerSubDomainsList()
    method testAdminSubDomainsListWithCustomer (line 228) | public function testAdminSubDomainsListWithCustomer()
    method testCustomerSubDomainsDelete (line 248) | public function testCustomerSubDomainsDelete()
    method testCustomerSubDomainsAddDnsLetsEncryptFail (line 264) | public function testCustomerSubDomainsAddDnsLetsEncryptFail()

FILE: tests/Traffic/TrafficTest.php
  class TrafficTest (line 16) | class TrafficTest extends TestCase
    method setUpBeforeClass (line 19) | public static function setUpBeforeClass(): void
    method testAdminTrafficList (line 73) | public function testAdminTrafficList()
    method testAdminTrafficListSpecificDate (line 88) | public function testAdminTrafficListSpecificDate()
    method testAdminTrafficListCustomers (line 101) | public function testAdminTrafficListCustomers()
    method testAdminTrafficListCustomersFilterCustomer (line 114) | public function testAdminTrafficListCustomersFilterCustomer()
    method testCustomerTrafficList (line 127) | public function testCustomerTrafficList()
    method testAdminTrafficAdd (line 146) | public function testAdminTrafficAdd()
    method testAdminTrafficGet (line 155) | public function testAdminTrafficGet()
    method testAdminTrafficUpdate (line 164) | public function testAdminTrafficUpdate()
    method testAdminTrafficDelete (line 173) | public function testAdminTrafficDelete()
Condensed preview — 443 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,503K chars).
[
  {
    "path": ".editorconfig",
    "chars": 277,
    "preview": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\nindent_style = tab\nindent_size = 4\ntrim_tr"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "chars": 1488,
    "preview": "# Contribution\n\nBefore you start working on a PR, contact us via [Discord](https://discord.froxlor.org) or the forum at "
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 98,
    "preview": "# These are supported funding model platforms\n\ngithub: d00p\ncustom: ['https://paypal.me/Froxlor']\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 1123,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**As a rule of t"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 595,
    "preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Is your fea"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "chars": 1037,
    "preview": "# Bug report vs. support request\n\nIf you're unsure of whether your problem is a bug or a configuration error\n* contact u"
  },
  {
    "path": ".github/LICENSE_HEADER",
    "chars": 936,
    "preview": "/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This progra"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 1244,
    "preview": "# Description\n\nPlease include a summary of the change and which issue is fixed if any. Please also include relevant moti"
  },
  {
    "path": ".github/workflows/build-docs.yml",
    "chars": 359,
    "preview": "name: build-documentation\n\non:\n  release:\n    # only run for stable releases\n    types: [released]\n\njobs:\n  build_docs:\n"
  },
  {
    "path": ".github/workflows/build-mariadb.yml",
    "chars": 4383,
    "preview": "name: Froxlor-CI-MariaDB\non: [ 'push', 'pull_request', 'create' ]\n\njobs:\n  froxlor:\n    name: Froxlor (PHP ${{ matrix.ph"
  },
  {
    "path": ".github/workflows/build-mysql.yml",
    "chars": 1595,
    "preview": "name: Froxlor-CI-MySQL\non: ['push', 'pull_request', 'create']\n\njobs:\n  froxlor:\n    name: Froxlor (PHP ${{ matrix.php-ve"
  },
  {
    "path": ".gitignore",
    "chars": 365,
    "preview": "install/update.log\ninstall/*.json\nlib/userdata.inc.php\nlib/userdata.inc.php.bak\nlib/config.inc.php\nlogs/*\n!logs/index.ht"
  },
  {
    "path": "2fa.php",
    "chars": 4627,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "COPYING",
    "chars": 15146,
    "preview": "\t\t    GNU GENERAL PUBLIC LICENSE\n\t\t       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc."
  },
  {
    "path": "README.md",
    "chars": 2697,
    "preview": "[![Froxlor-CI](https://github.com/Froxlor/Froxlor/actions/workflows/build-mariadb.yml/badge.svg?branch=main)](https://gi"
  },
  {
    "path": "SECURITY.md",
    "chars": 2221,
    "preview": "# froxlor's Security Policy\n\nWelcome and thanks for taking interest in [froxlor](https://www.froxlor.org)!\n\nWe are mostl"
  },
  {
    "path": "actions/admin/index.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "actions/admin/settings/100.panel.php",
    "chars": 11737,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "actions/admin/settings/110.accounts.php",
    "chars": 8116,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "actions/admin/settings/120.system.php",
    "chars": 10340,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "actions/admin/settings/122.froxlorvhost.php",
    "chars": 10154,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "actions/admin/settings/125.cronjob.php",
    "chars": 2445,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "actions/admin/settings/130.webserver.php",
    "chars": 14540,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "actions/admin/settings/131.ssl.php",
    "chars": 10053,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "actions/admin/settings/135.fcgid.php",
    "chars": 4512,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "actions/admin/settings/136.phpfpm.php",
    "chars": 5163,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "actions/admin/settings/137.perl.php",
    "chars": 2083,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "actions/admin/settings/140.statistics.php",
    "chars": 4014,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "actions/admin/settings/150.mail.php",
    "chars": 5789,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "actions/admin/settings/155.ftpserver.php",
    "chars": 1442,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "actions/admin/settings/160.nameserver.php",
    "chars": 5805,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "actions/admin/settings/170.logger.php",
    "chars": 2868,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "actions/admin/settings/180.antispam.php",
    "chars": 5251,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "actions/admin/settings/210.security.php",
    "chars": 3970,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "actions/admin/settings/220.quota.php",
    "chars": 2519,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "actions/admin/settings/index.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "actions/index.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "admin_admins.php",
    "chars": 6266,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "admin_apcuinfo.php",
    "chars": 7480,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "admin_autoupdate.php",
    "chars": 5938,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "admin_configfiles.php",
    "chars": 6391,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "admin_cronjobs.php",
    "chars": 3046,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "admin_customers.php",
    "chars": 10244,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "admin_domains.php",
    "chars": 25084,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "admin_index.php",
    "chars": 11474,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "admin_ipsandports.php",
    "chars": 5109,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "admin_logger.php",
    "chars": 2510,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "admin_message.php",
    "chars": 4902,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "admin_mysqlserver.php",
    "chars": 4629,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "admin_opcacheinfo.php",
    "chars": 2716,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "admin_phpsettings.php",
    "chars": 9697,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "admin_plans.php",
    "chars": 9019,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "admin_settings.php",
    "chars": 14611,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "admin_templates.php",
    "chars": 19270,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "admin_traffic.php",
    "chars": 1514,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "admin_updates.php",
    "chars": 3749,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "api.php",
    "chars": 1404,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "api_keys.php",
    "chars": 6548,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "bin/froxlor-cli",
    "chars": 2376,
    "preview": "#!/usr/bin/env php\n<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see a"
  },
  {
    "path": "build.xml",
    "chars": 10431,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<project name=\"froxlor\" default=\"build\">\n\n\t<!-- Use this when the tools are mana"
  },
  {
    "path": "composer.json",
    "chars": 2594,
    "preview": "{\n\t\"name\": \"froxlor/froxlor\",\n\t\"description\": \"The server administration software for your needs. Developed by experienc"
  },
  {
    "path": "customer_domains.php",
    "chars": 15516,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "customer_email.php",
    "chars": 25646,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "customer_extras.php",
    "chars": 12709,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "customer_ftp.php",
    "chars": 11404,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "customer_index.php",
    "chars": 10881,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "customer_logger.php",
    "chars": 1877,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "customer_mysql.php",
    "chars": 8844,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "customer_traffic.php",
    "chars": 1616,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "dns_editor.php",
    "chars": 4765,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "doc/example/FroxlorAPI.php",
    "chars": 2170,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "doc/example/create_customer.php",
    "chars": 1017,
    "preview": "<?php\n\n// include FroxlorAPI helper class\nrequire __DIR__ . '/FroxlorAPI.php';\n\n// create object of FroxlorAPI with URL,"
  },
  {
    "path": "doc/example/index.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "doc/example/list_functions.php",
    "chars": 543,
    "preview": "<?php\n\n// include FroxlorAPI helper class\nrequire __DIR__ . '/FroxlorAPI.php';\n\n// create object of FroxlorAPI with URL,"
  },
  {
    "path": "doc/index.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "error_report.php",
    "chars": 4027,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "index.php",
    "chars": 30051,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "install/froxlor.sql.php",
    "chars": 47582,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "install/index.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "install/install.php",
    "chars": 2113,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "install/updates/froxlor/index.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "install/updates/froxlor/update_2.0.inc.php",
    "chars": 21806,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "install/updates/froxlor/update_2.1.inc.php",
    "chars": 9260,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "install/updates/froxlor/update_2.2.inc.php",
    "chars": 11361,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "install/updates/froxlor/update_2.3.inc.php",
    "chars": 7446,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "install/updates/index.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "install/updates/preconfig/index.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "install/updates/preconfig/preconfig_2.0.inc.php",
    "chars": 4651,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "install/updates/preconfig/preconfig_2.1.inc.php",
    "chars": 1169,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "install/updates/preconfig/preconfig_2.2.inc.php",
    "chars": 1792,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "install/updates/preconfig/preconfig_2.3.inc.php",
    "chars": 3491,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "install/updatesql.php",
    "chars": 3032,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Ajax/Ajax.php",
    "chars": 11363,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Ajax/GlobalSearch.php",
    "chars": 12145,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Ajax/index.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lib/Froxlor/Api/Api.php",
    "chars": 3458,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/ApiCommand.php",
    "chars": 17940,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/ApiParameter.php",
    "chars": 5709,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/Admins.php",
    "chars": 34200,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/Certificates.php",
    "chars": 16858,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/Cronjobs.php",
    "chars": 6782,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/Customers.php",
    "chars": 86957,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/DataDump.php",
    "chars": 10008,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/DirOptions.php",
    "chars": 17155,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/DirProtections.php",
    "chars": 15048,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/DomainZones.php",
    "chars": 18168,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/Domains.php",
    "chars": 99578,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/EmailAccounts.php",
    "chars": 21136,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/EmailDomains.php",
    "chars": 6588,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/EmailForwarders.php",
    "chars": 9936,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/EmailSender.php",
    "chars": 12063,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/Emails.php",
    "chars": 21688,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/FpmDaemons.php",
    "chars": 15471,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/Froxlor.php",
    "chars": 17882,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/Ftps.php",
    "chars": 26016,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/HostingPlans.php",
    "chars": 19753,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/IpsAndPorts.php",
    "chars": 25189,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/MysqlServer.php",
    "chars": 19539,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/Mysqls.php",
    "chars": 21787,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/PhpSettings.php",
    "chars": 28479,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/SshKeys.php",
    "chars": 14543,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/SubDomains.php",
    "chars": 48282,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/SysLog.php",
    "chars": 7878,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/Traffic.php",
    "chars": 5686,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Commands/index.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lib/Froxlor/Api/FroxlorRPC.php",
    "chars": 4905,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/ResourceEntity.php",
    "chars": 1191,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/Response.php",
    "chars": 1550,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Api/index.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lib/Froxlor/Bulk/BulkAction.php",
    "chars": 5008,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Bulk/DomainBulkAction.php",
    "chars": 2883,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Bulk/index.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lib/Froxlor/Cli/CliCommand.php",
    "chars": 4420,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cli/ConfigDiff.php",
    "chars": 5954,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cli/ConfigServices.php",
    "chars": 19828,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cli/InstallCommand.php",
    "chars": 15007,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cli/MasterCron.php",
    "chars": 9915,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cli/PhpSessionclean.php",
    "chars": 3844,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cli/RunApiCommand.php",
    "chars": 4515,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cli/SwitchServerIp.php",
    "chars": 7463,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cli/UpdateCommand.php",
    "chars": 14521,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cli/UserCommand.php",
    "chars": 4856,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cli/ValidateAcmeWebroot.php",
    "chars": 6651,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cli/index.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lib/Froxlor/Cli/install.functions.php",
    "chars": 1190,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Config/ConfigDaemon.php",
    "chars": 14400,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Config/ConfigDisplay.php",
    "chars": 8422,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Config/ConfigParser.php",
    "chars": 5893,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Config/ConfigService.php",
    "chars": 4304,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Config/index.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lib/Froxlor/Cron/CronConfig.php",
    "chars": 5697,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cron/Dns/Bind.php",
    "chars": 6720,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cron/Dns/DnsBase.php",
    "chars": 5891,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cron/Dns/PowerDNS.php",
    "chars": 6471,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cron/Dns/index.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lib/Froxlor/Cron/Forkable.php",
    "chars": 1715,
    "preview": "<?php\n\nnamespace Froxlor\\Cron;\n\nuse Froxlor\\Database\\Database;\nuse Froxlor\\FroxlorLogger;\n\ntrait Forkable\n{\n\tpublic stat"
  },
  {
    "path": "lib/Froxlor/Cron/FroxlorCron.php",
    "chars": 1370,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cron/Http/Apache.php",
    "chars": 67349,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cron/Http/ApacheFcgi.php",
    "chars": 10577,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cron/Http/ConfigIO.php",
    "chars": 8989,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cron/Http/DomainSSL.php",
    "chars": 5403,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cron/Http/HttpConfigBase.php",
    "chars": 8854,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cron/Http/LetsEncrypt/AcmeSh.php",
    "chars": 30458,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cron/Http/LetsEncrypt/index.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lib/Froxlor/Cron/Http/Nginx.php",
    "chars": 53789,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cron/Http/NginxFcgi.php",
    "chars": 4909,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cron/Http/Php/Fcgid.php",
    "chars": 9533,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cron/Http/Php/Fpm.php",
    "chars": 16611,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cron/Http/Php/PhpInterface.php",
    "chars": 3385,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cron/Http/Php/index.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lib/Froxlor/Cron/Http/WebserverBase.php",
    "chars": 4215,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cron/Http/index.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lib/Froxlor/Cron/Mail/Rspamd.php",
    "chars": 9028,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cron/System/ExportCron.php",
    "chars": 12367,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cron/System/Extrausers.php",
    "chars": 5007,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cron/System/MailboxsizeCron.php",
    "chars": 2635,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cron/System/SshKeys.php",
    "chars": 4696,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cron/System/TasksCron.php",
    "chars": 21168,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cron/System/index.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lib/Froxlor/Cron/TaskId.php",
    "chars": 3708,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cron/Traffic/ReportsCron.php",
    "chars": 21486,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cron/Traffic/TrafficCron.php",
    "chars": 36625,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Cron/Traffic/index.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lib/Froxlor/Cron/index.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lib/Froxlor/CurrentUser.php",
    "chars": 6598,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Customer/Customer.php",
    "chars": 2761,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Customer/index.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lib/Froxlor/Database/Database.php",
    "chars": 17994,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Database/DbManager.php",
    "chars": 6983,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Database/IntegrityCheck.php",
    "chars": 18124,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Database/Manager/DbManagerMySQL.php",
    "chars": 11604,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Database/Manager/index.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lib/Froxlor/Database/index.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lib/Froxlor/Dns/Dns.php",
    "chars": 20723,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Dns/DnsEntry.php",
    "chars": 2711,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Dns/DnsZone.php",
    "chars": 1767,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Dns/PowerDNS.php",
    "chars": 4542,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Dns/index.html",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lib/Froxlor/Domain/Domain.php",
    "chars": 11175,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  },
  {
    "path": "lib/Froxlor/Domain/IpAddr.php",
    "chars": 3327,
    "preview": "<?php\n\n/**\n * This file is part of the froxlor project.\n * Copyright (c) 2010 the froxlor Team (see authors).\n *\n * This"
  }
]

// ... and 243 more files (download for full content)

About this extraction

This page contains the full source code of the froxlor/Froxlor GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 443 files (4.7 MB), approximately 1.3M tokens, and a symbol index with 1533 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!