Compare commits

..

2149 Commits

Author SHA1 Message Date
Michael Kaufmann
fc8ca57f8c set version to 2.0.14 for upcoming release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-04-07 08:52:12 +02:00
Michael Kaufmann
7e4bba2d55 corrected mail-log parsing, refs #1119
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-03-27 12:53:21 +02:00
Michael Kaufmann
7e635f9be4 correctly retriggered certificate issue on froxlor-vhost alias-domain changes, fixes #1115
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-03-24 09:17:04 +01:00
Michael Kaufmann
e9406a20f2 readd php interpretation to php-enabled customers/domains in directory protection, fixes #1118
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-03-23 19:18:39 +01:00
Michael Kaufmann
de7729cec8 add certificate metadata to db table
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-03-23 12:40:01 +01:00
Michael Kaufmann
d60e48849b correct languages for mail/file templates
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-03-23 08:56:45 +01:00
Michael Kaufmann
908df5a7bb remove sorting from ssl 'issuer' as this data is being read from the certificate content and not the database/table and therefore cannot be sorted using the API, fixes #1116
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-03-21 14:22:34 +01:00
Michael Kaufmann
c1952afb94 dont sort indexed array as the keys get lost; fixes #1114
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-03-20 11:12:30 +01:00
Michael Kaufmann
7a22e8f4dd open newsfeed-links in a new tab, fixes #1112
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-03-18 20:04:02 +01:00
Michael Kaufmann
3ac0da2cdd corrected checkLocalGroup() validation if setting did not change, fixes #1111
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-03-17 08:27:31 +01:00
dependabot[bot]
eb816c4cc6 Bump webpack from 5.75.0 to 5.76.1 (#1109)
Bumps [webpack](https://github.com/webpack/webpack) from 5.75.0 to 5.76.1.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.75.0...v5.76.1)

---
updated-dependencies:
- dependency-name: webpack
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-03-15 13:21:01 +01:00
Michael Kaufmann
64d8bf4fba avoid socket length limitations leading to cut-off/invalid filename for very long domain and/or loginnames, fixes #1108
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-03-15 13:18:43 +01:00
Michael Kaufmann
ae6ee95973 avoid using posix-extension function before requirement-check can test for it and inform user
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-03-15 08:54:50 +01:00
Michael Kaufmann
e9051dc30a add spanish language translation reference to german language file
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-03-08 09:48:13 +01:00
scramatte
b6c7c53c3a Add Spanish language (#1105)
* Add Spanish localization
* add spanish to languages list
2023-03-08 09:43:35 +01:00
Michael Kaufmann
f36bc61fc7 better validation for uploaded/imported image files
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-03-08 09:33:30 +01:00
Michael Kaufmann
c56e0b9dac add 'Passing HTTP AUTH BASIC' header option when using FCGID; fix typeerror in parameter for Froxlor\Dns\Dns; require php-gd extension for validating uploaded images
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-03-08 09:33:02 +01:00
Michael Kaufmann
1deb08bf75 use correct parameter in PowerDNS::cleanDomainZone(), fixes #1104
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-03-04 14:42:31 +01:00
Michael Kaufmann
b30d7a8252 set version to 2.0.13 for maintenance release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-03-03 13:05:09 +01:00
Michael Kaufmann
b03e11c18d fix email-domain navigation and descriptions
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-03-03 13:03:12 +01:00
Michael Kaufmann
bf7d22a794 typecast parameter values for sizeReadable(), fixes #1103
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-28 08:15:31 +01:00
Michael Kaufmann
fb57a8a3b5 update dependencies
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-26 10:24:44 +01:00
Mickey
0d625797b0 Add command to remove debians prerotate script (#1101)
Co-authored-by: Mickey Knox <mickey@netfreaks.org>
2023-02-22 10:01:25 +01:00
Michael Kaufmann
6777fbf229 type-safe comparsion of md5-compatibility hash-validation
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-22 09:35:27 +01:00
Michael Kaufmann
23f1f79eff specify clearly which tls settings are being overwritten/ignored depending on the 'Override system TLS settings' flag when adding/updating Domains
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-19 12:27:56 +01:00
Michael Kaufmann
a5af104d53 keep search-fields/text in pagination links of displaying a search-result
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-19 12:06:47 +01:00
Michael Kaufmann
38d94698ce set version to 2.0.12 for bugfix release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-17 20:47:17 +01:00
Michael Kaufmann
5ba28ef599 fix wrong request-parameter reading for table-column mangement
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-17 19:32:27 +01:00
Michael Kaufmann
a3486cc5b3 updated workflow for building/deploying documentation; added missing api-method-description for EmailDomains-API
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-17 17:53:32 +01:00
Michael Kaufmann
5ab322ab1d remove unused required function parameter in nginx cron; set default value for function parameter in lighttpd cron
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-17 13:19:48 +01:00
Michael Kaufmann
4f26bdd535 set version to 2.0.11 for upcoming release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-17 10:26:32 +01:00
Michael Kaufmann
88f76e4355 use bcrypt hash algorithms for htpasswd password hashing instead of the old SHA1
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-17 10:00:08 +01:00
Oliver Rahner
a464d8cb19 fixed duplicated column heading (#1100) 2023-02-15 20:44:57 +01:00
Michael Kaufmann
0f596dce8b fix api parameter issue when empty values are passed
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-15 08:33:49 +01:00
Michael Kaufmann
60270b20b3 backup possible remote-db-server databases in backup-cron
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-14 11:36:39 +01:00
Michael Kaufmann
4003a8d2b6 check for existing fields when setting/updating tablelisting-columns
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-14 11:36:11 +01:00
Michael Kaufmann
89843d6f37 fix referenced quota field for searching/sorting, fixes #1099
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-12 10:08:41 +01:00
Michael Kaufmann
256a52a5da fix setting incorrect acme-challenge path on installation; fixes #1097
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-11 08:54:09 +01:00
Michael Kaufmann
c9b2bfe53c fix pagination for entity-listings with extra parameters
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-11 08:52:43 +01:00
Michael Kaufmann
98cb36327e add SPF/DKIM to Subdomain DNS Zone separately if isemaildomain = 1
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-08 12:37:20 +01:00
Michael Kaufmann
7d23e4882d fix '0 illegal offset type' when changing mysql-access-host setting
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-08 12:36:38 +01:00
Michael Kaufmann
1cc3a1d066 re-add special image_data import for exported custom-logos
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-07 17:21:39 +01:00
Michael Kaufmann
de0f7d2f01 generalize array-index name of settings to be settingsgroup_varname
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-07 13:39:09 +01:00
Michael Kaufmann
aa48ffca2b run Form::processForm() when importing settings so the same validations apply if the import file has malicious content
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-07 13:02:11 +01:00
Michael Kaufmann
802168cb5b forgot to add Validate/Validate to the last commit
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-07 11:45:57 +01:00
Michael Kaufmann
6ace2e9f3d corrected call to Domain::triggerLetsEncryptCSRForAliasDestinationDomain only if aliasdomain is a valid id; validate registration-date and termination-date only if given
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-07 11:44:07 +01:00
Michael Kaufmann
0bff360d22 another type fix
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-07 11:26:13 +01:00
Michael Kaufmann
e300acf109 corrected return type of pexecute_first
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-07 11:23:21 +01:00
Michael Kaufmann
14d8e12cdc honor deactivated flag for redirects and prepare to use domain.deactivated for domain-specific deactivation
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-07 11:19:31 +01:00
Michael Kaufmann
d29411dba6 backup nginx.conf when configuring service
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-07 11:15:56 +01:00
Michael Kaufmann
464663877c cleanup function/parameters and add type declarations where possible
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-07 11:15:19 +01:00
Michael Kaufmann
c3f769d48b remove robots.txt to actually make meta-tag robots work; fixes #1096
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-06 14:27:23 +01:00
Michael Kaufmann
f97536ed02 minor adjustments in customer-email-domain-overview
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-05 18:30:29 +01:00
Michael Kaufmann
7686effc8c new setting to select default value of 'allow api access' for new customers; fixes #1087
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-03 14:16:37 +01:00
Michael Kaufmann
ee8385467b add fallback to system-hostname for faulty http-clients not setting 'Host' in the request
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-03 13:59:12 +01:00
Michael Kaufmann
0a51d97684 add translation for new email domain overview
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-02-03 13:57:28 +01:00
Michael Kaufmann
67fc762eef fix let's encrypt dns validation check caused by issue in PhpHelper::gethostbynamel6()
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-31 17:32:56 +01:00
Michael Kaufmann
8378795f5d Merge branch 'main' of github.com:Froxlor/Froxlor 2023-01-31 09:33:02 +01:00
Michael Kaufmann
98e6f1df4a Merge branch 'main' of github.com:Froxlor/Froxlor 2023-01-31 09:32:21 +01:00
Michael Kaufmann
674e35e5c5 add new EmailDomains API Commands for listing domain/email-usage information; show email-domain overview when customer has >1 domains with email addresses; add EmailDomains to GlobalSearch
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-31 09:31:58 +01:00
Michael Kaufmann
b24ca44e6f fix typos
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-30 08:47:11 +01:00
Michael Kaufmann
e0f7fcd2ef fix awstats path in generated vhost config if speciallogfile=0
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-29 15:58:49 +01:00
Michael Kaufmann
c5bece64ce set version to 2.0.10 for security release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-28 20:07:15 +01:00
Michael Kaufmann
0034681412 fix possible privilege escalation from customer to root when specifying custom error documents in directory-options
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-28 20:00:24 +01:00
Michael Kaufmann
bd5b99dc1c verify cronjob interval is one of the fixed available values
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-28 13:06:44 +01:00
Michael Kaufmann
2feb802094 validate existence of language in admin-templates
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-28 12:16:40 +01:00
Michael Kaufmann
7b08a71c59 add missing use statement for error-reporting to include the dbms version
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-28 11:57:43 +01:00
Michael Kaufmann
2a84e9c120 enforce password requirements set in settings for directory-protection
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-28 11:40:07 +01:00
Michael Kaufmann
d854e8e991 Merge branch 'main' of github.com:Froxlor/Froxlor 2023-01-26 15:23:03 +01:00
Michael Kaufmann
0a363910d6 fix potential infinite loop on errors in cli-installation; fixes #1092
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-26 15:22:39 +01:00
Maurice Preuß (envoyr)
b23d5cd909 merge branch 'main' of github.com:Froxlor/Froxlor 2023-01-25 18:51:03 +01:00
Maurice Preuß (envoyr)
3b753aa69d change session/cookie domain value, this prevents using the _ server_name when using nginx
Signed-off-by: Maurice Preuß (envoyr) <envoyr@froxlor.org>
2023-01-25 18:50:49 +01:00
Michael Kaufmann
492cd288bc enhanced themefile validation for non-default themes
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-25 13:09:06 +01:00
Marvin Stark
47938c5082 Update README.md (#1090)
Fixed typo.
2023-01-24 18:56:29 +01:00
Michael Kaufmann
97c4c9a366 Merge branch 'main' of github.com:Froxlor/Froxlor 2023-01-23 09:00:21 +01:00
Michael Kaufmann
d090e48544 validate result of Net_DNS2_Resolver::query (CNAME's are being resolved to their corresponding target A/AAAA addresses); fixes #1089
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-23 08:58:42 +01:00
Michael Kaufmann
314e4407a0 add lasst successful login to table-columns for customer overview
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-22 15:04:19 +01:00
Michael Kaufmann
ed50e03957 Merge remote-tracking branch 'origin/main' into customeremail-overview 2023-01-22 14:03:07 +01:00
Michael Kaufmann
dff7530cc5 include froxlor-vhost in validate-acme-webroot command; fixes #1088
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-22 13:01:20 +01:00
Maurice Preuß (envoyr)
19423c9644 normalize (compress) ip addresses
Signed-off-by: Maurice Preuß (envoyr) <envoyr@froxlor.org>
2023-01-20 21:26:24 +01:00
Michael Kaufmann
42b3f1e59d set version to 2.0.9
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-20 18:01:28 +01:00
Michael Kaufmann
1b77632fa8 correctly display config-services command in updater if manual commands are needed
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-19 20:19:43 +01:00
Maurice Preuß (envoyr)
867b7b1390 fix domain variable for gethostbynamel6 function
Signed-off-by: Maurice Preuß (envoyr) <envoyr@froxlor.org>
2023-01-18 14:47:25 +01:00
Maurice Preuß (envoyr)
4c6ebde58c adding new dns resolver setting for let's encrypt
Signed-off-by: Maurice Preuß (envoyr) <envoyr@froxlor.org>
Co-authored-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-18 13:57:47 +01:00
Michael Kaufmann
1e013d9e9a enhance information on updater regarding acme-challenge (if lets encrypt is enabled and applicable)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-18 11:47:55 +01:00
Michael Kaufmann
c56bc651b9 allow hiding documentation menu for customers via customers-hide-option; use --staging for acme.sh for every test-CA
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-18 08:59:59 +01:00
aPollO2k
6cbdf45a7c Typo fixed in update_2.x.inc.php (#1082)
PHO_EOL => PHP_EOL
2023-01-16 21:32:56 +01:00
Michael Kaufmann
715667e227 Merge branch 'main' of github.com:Froxlor/Froxlor 2023-01-15 23:49:09 +01:00
Michael Kaufmann
41de161555 show exact froxlor:config-services parameter for updater; better checks for changed acme-challenge paths; fix typo in PHP_EOL statement; remove crsf token from config-apply-parameter generation from within the ui
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-15 23:48:37 +01:00
Maurice Preuß (envoyr)
1f1ea370c0 add version to mix-manifest.json and add mix function
Signed-off-by: Maurice Preuß (envoyr) <envoyr@froxlor.org>
2023-01-14 21:14:55 +01:00
Michael Kaufmann
090cfc26f2 set file-log (if enabled) to be in froxlor/logs/ folder; fix ssl param directive for dovecot in Ubuntu Bionic; set version to 2.0.8
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-14 13:09:42 +01:00
Michael Kaufmann
529890b5d2 fix typo in langauge-definition
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-12 22:27:45 +01:00
Michael Kaufmann
d4a6ab146d re-add total-disspace dashboard-display on customer dashboard
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-12 16:52:14 +01:00
Michael Kaufmann
e3f02879cf restore mandatory field on domain-formfields; add translated require message and correct error-placement of the message
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-12 15:16:42 +01:00
Michael Kaufmann
b52d6df777 [UI] change require of ipandport field in domains.add and domains.delete to one-of instead of all; fixes #1078
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-12 14:53:05 +01:00
Michael Kaufmann
9e671100ae acme-challenge path adjustments if docroot changed after update from 0.10.x (via apt)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-12 14:21:14 +01:00
Michael Kaufmann
7e801ea502 Merge branch 'main' of github.com:Froxlor/Froxlor 2023-01-12 12:20:23 +01:00
Daniel
b68522f7d5 Fix formfield image preview path (#1077) 2023-01-12 12:19:31 +01:00
Michael Kaufmann
86852942e0 add missing language-strings for traffic page
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-12 11:30:52 +01:00
Michael Kaufmann
ea88d53e39 Merge remote-tracking branch 'origin/main' into customeremail-overview 2023-01-12 09:59:22 +01:00
Michael Kaufmann
61f6a474e4 add emails-overview tablelisting
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-12 09:59:19 +01:00
Michael Kaufmann
ec05c84f4d check whether let's encrypt is enabled at all and correct acme-alias configuration file if necessary/selected
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-12 09:40:35 +01:00
Michael Kaufmann
9e13c077e9 show command to regenerate cron.d-file if previous deletion of old files could not be done automatically, fixes #1076
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-12 08:33:19 +01:00
Maurice Preuß (envoyr)
da8d315e77 remove hardcoded logo height
Signed-off-by: Maurice Preuß (envoyr) <envoyr@froxlor.org>
2023-01-11 22:43:00 +01:00
Michael Kaufmann
82af9af1e1 group email-domains in overview if there are email addresses for multiple domains
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-11 22:22:39 +01:00
Michael Kaufmann
cb67e3ae63 continue checking domains even if no config was found, thx knox
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-11 21:07:00 +01:00
Michael Kaufmann
82d15c4dc2 fixes for ValidateAcmeWebroot command
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-11 20:47:07 +01:00
Michael Kaufmann
6d048e2cee fix default mysql-dbserver for customers if not allowed to use the default (id=0) one; fixes #1075
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-11 19:41:24 +01:00
Michael Kaufmann
87bd80eea1 reenable access to ftp view for customers with ftps=0 because the main account is always being created
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-11 14:58:18 +01:00
Michael Kaufmann
80e442e396 set version to 2.0.7
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-10 22:15:57 +01:00
Michael Kaufmann
489ad375bd ensure latest userdata.inc.php layout for updaters/users of old format
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-10 16:54:20 +01:00
Michael Kaufmann
c420196e73 check explicitly for template existence and try to use default theme as fallback; fixes #1071
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-10 16:53:36 +01:00
Michael Kaufmann
cc6d8d5f8b fix login if non-standard ports are used for froxlor vhost
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-10 12:43:04 +01:00
Michael Kaufmann
24f47bc58b set version to 2.0.6
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-09 10:09:15 +01:00
Michael Kaufmann
c769c074e0 add Google CA to available acme.sh providers; fixes #1065
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-09 10:00:08 +01:00
dependabot[bot]
2ecb8eb034 Bump json5 from 1.0.1 to 1.0.2 (#1069)
Bumps [json5](https://github.com/json5/json5) from 1.0.1 to 1.0.2.
- [Release notes](https://github.com/json5/json5/releases)
- [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md)
- [Commits](https://github.com/json5/json5/compare/v1.0.1...v1.0.2)

---
updated-dependencies:
- dependency-name: json5
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-01-09 09:51:52 +01:00
Michael Kaufmann
6827c100c3 fix updating email account password-hashes in updater
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-09 09:50:51 +01:00
Michael Kaufmann
c402acd1bd disable correct mod_php in bionic-config-templates when fcgid/php-fpm is selected
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-09 09:25:29 +01:00
Michael Kaufmann
c4ec2509fa fix resetting of isemaildomain-flag of subdomains when nothing changed; fixes #1067
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-09 09:24:22 +01:00
Michael Kaufmann
0f382586ce set version to 2.0.5
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-08 23:24:43 +01:00
Michael Kaufmann
9c2f12ecb1 mysql-remote-server fixes
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-08 23:20:31 +01:00
Michael Kaufmann
12da117cab fix chmod() command in compatibility cronjob for updaters
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-08 20:20:44 +01:00
Michael Kaufmann
ef48f4b48e set version to 2.0.3
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-08 19:44:07 +01:00
Michael Kaufmann
aae6db52b5 temporarily change innodb_strict_mode to run table updates (shorten fields)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-08 19:36:05 +01:00
Michael Kaufmann
fb7d65d645 need pagination-context for sortfields; only disable pagination-code on view
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-08 19:01:10 +01:00
Michael Kaufmann
3b9c60e985 fix pagination when pagination is diabled (entries per page = 0)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-08 18:52:58 +01:00
Michael Kaufmann
452df60866 set version to 2.0.2
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-08 17:58:42 +01:00
Michael Kaufmann
7ce7123756 fix sql text defaults in updater
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-08 17:34:58 +01:00
Michael Kaufmann
d42072e3ad re-enable/fix sortable tablelisting flag
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-08 17:25:19 +01:00
Michael Kaufmann
d69a7eeb07 sql text field corrections
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-08 15:47:54 +01:00
Michael Kaufmann
a8a112af49 sql text field corrections
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-08 15:44:32 +01:00
Michael Kaufmann
46c696811d fix customer listing for admins when deactivated customers exist; fix potential row-size too large error for panel_customers; fix possible undefined timestamps in opcache-info; set version to 2.0.1
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-08 15:37:46 +01:00
Michael Kaufmann
1d2f5a693c fix cli-updater
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-08 13:27:17 +01:00
Michael Kaufmann
5688690eb8 set version to 2.0.0 for upcoming stable release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2023-01-08 11:00:59 +01:00
Michael Kaufmann
f7f356e896 fix csrf for clearing apcu/opcache cache
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-31 09:08:34 +01:00
Michael Kaufmann
5a807e3dbe do not show apcuinfo or opcacheinfo to users with change_serversettings=0
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-31 08:51:05 +01:00
Michael Kaufmann
fede81700e set correct expected return-code from exception in unit-test
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-31 00:50:30 +01:00
Michael Kaufmann
b7264cdc5d adjust tests for new reseller permission (edit ipsandports not necessary)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-31 00:47:37 +01:00
Michael Kaufmann
0527f22dc9 dont show page content for resellers withouth required permissions to actually do something
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-31 00:42:58 +01:00
Michael Kaufmann
d643e8c673 exclude csrf_token from froxlor-config.json export; exclude system.updatecheck_data from settings-export
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-30 21:48:59 +01:00
Michael Kaufmann
f2485ecd9a adjust Request-class methods to be more flexible
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-30 21:43:27 +01:00
Michael Kaufmann
983d929460 validate image data/filename when importing
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-30 14:39:32 +01:00
Maurice Preuß (envoyr)
37980060ea update form validation for customers
Signed-off-by: Maurice Preuß (envoyr) <envoyr@froxlor.org>
2022-12-27 15:21:53 +01:00
Maurice Preuß (envoyr)
03a39ca69f Merge branch 'main' of github.com:Froxlor/Froxlor 2022-12-26 14:12:45 +01:00
Maurice Preuß (envoyr)
1b63534563 update csrf initialization
Signed-off-by: Maurice Preuß (envoyr) <envoyr@froxlor.org>
2022-12-26 14:12:21 +01:00
Michael Kaufmann
07814f8e46 fix email 2fa; insert task to rebuild vhosts after customer changes password for statistics-page
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-26 13:00:34 +01:00
Michael Kaufmann
c696542cf5 remove unnecessary domains_see_all column
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-26 12:12:06 +01:00
Michael Kaufmann
15ed0521c5 use proxymap for mysql connection in postfix
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-26 11:39:23 +01:00
Maurice Preuß (envoyr)
ae4b961ac1 fix edit button for ssl certificates 2022-12-25 22:44:49 +01:00
Maurice Preuß (envoyr)
6ad78a4818 add csrf token header to jquery requests 2022-12-25 22:14:39 +01:00
Maurice Preuß (envoyr)
ddc95762eb fix of name translation due to incorrect display in lists and forms 2022-12-25 20:54:35 +01:00
Maurice Preuß (envoyr)
6bf0396c76 fix user details in form fields
Signed-off-by: Maurice Preuß (envoyr) <envoyr@froxlor.org>
2022-12-25 20:42:34 +01:00
Maurice Preuß (envoyr)
746d30c65b fix unknown configuration directive on some systems
Signed-off-by: Maurice Preuß (envoyr) <envoyr@froxlor.org>
2022-12-25 20:23:56 +01:00
Michael Kaufmann
9013fd63d7 correct pure-ftpd quota-query
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-22 19:16:26 +01:00
Michael Kaufmann
7079e2f2bf correct sql-alter-queries in updater
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-22 19:15:42 +01:00
rex2630
03466158a7 Renamed name to Last name instead (#1060) 2022-12-22 19:11:09 +01:00
Michael Kaufmann
ef8dabeb89 re-add edit button in ssl-certificates overview when manually set
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-22 11:14:11 +01:00
rex2630
38fb3bc25a Deleted duplicated string (#1058) 2022-12-22 09:29:12 +01:00
Maurice Preuß (envoyr)
d2d3cec4f5 Merge branch 'main' of github.com:Froxlor/Froxlor 2022-12-21 20:25:11 +01:00
Maurice Preuß (envoyr)
669072d996 update navigation for better mobile handling
Signed-off-by: Maurice Preuß (envoyr) <envoyr@froxlor.org>
2022-12-21 20:23:54 +01:00
Michael Kaufmann
a81065a1b0 add dashboard-language string, fix missing { in customer_mysql
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-21 11:54:29 +01:00
Michael Kaufmann
4f89d7a9f0 set theme correctly when updating from 0.10.x
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-20 23:07:52 +01:00
Maurice Preuß (envoyr)
996b2e4a78 fix translation strings and update session lifetime to default panel sessiontimeout
Signed-off-by: Maurice Preuß (envoyr) <envoyr@froxlor.org>
2022-12-20 21:27:53 +01:00
Maurice Preuß (envoyr)
4acd1d4ef6 add missing translation strings
Signed-off-by: Maurice Preuß (envoyr) <envoyr@froxlor.org>
2022-12-20 19:59:24 +01:00
Michael Kaufmann
795a3d846c regex-validate services commands
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-20 19:38:05 +01:00
Michael Kaufmann
2dd226c96c allow domain-redirect to internal-ipaddress
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-20 17:20:40 +01:00
Michael Kaufmann
24fa1d39ed add pass_authorizationheader=1 to froxlor vhost php-config; fix issue with assigning mysql-server when editing customer with mysql=0 prior; fix blank page when customer does not have resources but opens page via url manipulation
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-16 10:52:12 +01:00
Michael Kaufmann
c19b7d02ab allow api _plainsql special parameter only for internal calls, not needed anywhere else
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-14 18:42:06 +01:00
Michael Kaufmann
e5b6492804 fix typo when creating new home for new customer
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-14 14:46:51 +01:00
Michael Kaufmann
f4f00352eb add missing csrf-token to configuration-form
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-14 10:53:32 +01:00
Michael Kaufmann
ebc44a737e trim fpm ini directives of possible newline characters
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-08 23:16:27 +01:00
Michael Kaufmann
4d908ff6ee fix session-timeout not being set
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-08 10:05:44 +01:00
Michael Kaufmann
34e3290497 adding csrf-token to all forms
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-08 09:33:34 +01:00
Maurice Preuß (envoyr)
fe37313b7b update readme, fix badges and links
Signed-off-by: Maurice Preuß (envoyr) <envoyr@froxlor.org>
2022-12-07 10:58:45 +01:00
Michael Kaufmann
3d033262ed adjustments to dovecot-sql config template; correct enctype for form
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-06 23:08:54 +01:00
Michael Kaufmann
6135ba8468 backward compatibility for updaters to update cron.d configuration file after update
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-06 16:47:16 +01:00
Michael Kaufmann
d7a2ec35cc clearify customer add/edit name/company requirements
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-06 16:25:33 +01:00
Michael Kaufmann
4501eb2723 fix correct increasing of used customers and recalculat resources
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-06 08:26:42 +01:00
Michael Kaufmann
609c15688c fix api-key edit (thx Davidd), fix dns-editor ttl field (thx Rolf)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-05 20:58:57 +01:00
Michael Kaufmann
5b7a76b608 Update CONTRIBUTING.md 2022-12-05 10:14:35 +01:00
Michael Kaufmann
4eaf9d2c46 add new graphics/logos; theme dependent logos; layout fixes in forgot-password/reset-password sites;
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-04 13:18:33 +01:00
Maurice Preuß
b3da3cf218 Merge pull request #1056 from Froxlor/dependabot/npm_and_yarn/loader-utils-1.4.2
Bump loader-utils from 1.4.0 to 1.4.2
2022-12-03 20:01:46 +01:00
Michael Kaufmann
abf3328ea9 fix api-key creation
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-02 13:42:33 +01:00
Michael Kaufmann
89f73f571e use same error message for invalid user and disabled password reset to not give away if a user exists
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-02 13:25:17 +01:00
Michael Kaufmann
63f6d221cd secure logo uploading, avoid frame-inclusion, adjustments to SECURITY.md and minor changes in UI for domain import and darkmode
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-12-02 09:24:08 +01:00
Michael Kaufmann
40997762a4 small adjustments for tooltip/popover and icons in top-right menu
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-30 10:06:13 +01:00
Michael Kaufmann
fa547197e8 fix server-side version-check response message check
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-27 15:38:35 +01:00
Michael Kaufmann
ae8cd3dc8a enhance version-check and beautify displayed information
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-27 15:33:25 +01:00
Maurice Preuß (envoyr)
685b6076a0 enable tooltip and popover
Signed-off-by: Maurice Preuß (envoyr) <envoyr@froxlor.org>
2022-11-27 12:51:39 +01:00
Michael Kaufmann
137db0432e adjust validate-test for 'sql username too long' for mariadb
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-24 10:29:39 +01:00
Michael Kaufmann
73fe533870 adjust mysql-usernamelength values for mariadb according to docs
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-24 10:03:40 +01:00
Michael Kaufmann
4b7ae46fd7 fix missing language-strings
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-21 12:52:33 +01:00
Michael Kaufmann
777991e0e3 honor caneditdomain flag correctly; corrected error messages; updated external URLs
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-20 12:22:03 +01:00
Michael Kaufmann
eb13796976 use correct docs-url
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-19 12:51:18 +01:00
Michael Kaufmann
51aafafd73 update links to new docs.froxlor.org pages (v2 will be /latest/ when released); fixed required-checkbox attribute when having a hidden fallback to value 0 (bool checkboxes); added automatic creation of symlink for bin/froxlor-cli to /usr/local/bin
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-17 14:27:51 +01:00
dependabot[bot]
7084cd8c54 Bump loader-utils from 1.4.0 to 1.4.2
Bumps [loader-utils](https://github.com/webpack/loader-utils) from 1.4.0 to 1.4.2.
- [Release notes](https://github.com/webpack/loader-utils/releases)
- [Changelog](https://github.com/webpack/loader-utils/blob/v1.4.2/CHANGELOG.md)
- [Commits](https://github.com/webpack/loader-utils/compare/v1.4.0...v1.4.2)

---
updated-dependencies:
- dependency-name: loader-utils
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-15 02:29:29 +00:00
Michael Kaufmann
ed231f159f forgot to save the last changes before committing
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-14 15:57:49 +01:00
Michael Kaufmann
da6c1992fa added documentation links to sidebar
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-14 12:59:51 +01:00
Michael Kaufmann
5fa98811ab fix reduction of used resources when deleting a customer
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-13 18:04:29 +01:00
Michael Kaufmann
6904acc9ea use preinstalled dh params file instead of generating a new one which takes a lot of time
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-13 15:09:16 +01:00
Michael Kaufmann
cc1d427a69 enable ssl for postfix/dovecot by default using a self-signed certificate if not otherwise specified
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-12 16:36:57 +01:00
Michael Kaufmann
1d938f2a43 remove 'default_password_scheme' for dovecot configs as hashes can be different now and are read by given hash-algo prefix;
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-12 09:38:43 +01:00
Michael Kaufmann
f49fd5f0f7 show replacer-variables in php-config add/edit and fpm-versions add/edit; catch potential Exception thrown by Form::processForm() to display the error nicely; minor fixes in field-visibility for phpconfigs depending on php-interface and webserver; validate fcgid/fpm enable-flag correctly if not POST'ed at the same time (older behaviour)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-09 17:07:48 +01:00
Michael Kaufmann
2b12cde77e minor UI/UX fix for settings import (button label)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-08 15:18:39 +01:00
Michael Kaufmann
61dc40ec88 respect domains 'no try_files' option correctly; fix directory-protection generator in nginx
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-08 12:41:54 +01:00
Michael Kaufmann
ec8338592d add notice for settings that might require reconfiguration of specific services
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-08 10:24:39 +01:00
Michael Kaufmann
b6d850dac3 adjusting texts of standardcustomer-index file; always display current year in copyright
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-08 08:30:21 +01:00
envoyr
1b75863823 update domain default page 2022-11-06 15:34:20 +01:00
Maurice Preuß
73aa2ec431 fix html section and use import 2022-11-06 13:58:22 +01:00
Maurice Preuß
fc42b04537 fix missing use Froxlor\UI\Request 2022-11-06 13:49:09 +01:00
Michael Kaufmann
da82403b55 don't check for resource availability if none is going to be given to the customer
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-06 13:45:09 +01:00
Michael Kaufmann
c05245c891 correct recalculation of resource usage for admins
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-06 11:55:18 +01:00
Michael Kaufmann
1f70327112 show traffic details in admin and customer listings with the info-icon
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-06 11:27:32 +01:00
Michael Kaufmann
78945768ec add persistent db storage to goaccess-traffictool to have more data in the output index.html; add security questions when deleting certificates as we do for apikeys and dns-entries
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-06 10:11:40 +01:00
Maurice Preuß
8eedf87ac3 Merge pull request #1051 from Froxlor/dependabot/npm_and_yarn/node-forge-1.3.1
Bump node-forge from 1.2.1 to 1.3.1
2022-11-05 14:13:48 +01:00
Michael Kaufmann
4fc50fba1f avoid possible html injection via forgot-password-error-message
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-05 12:51:23 +01:00
Michael Kaufmann
4a4188a96b prefer combined operators, refs #999
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-05 11:07:18 +01:00
Michael Kaufmann
b0a66b687d allow plaintext_auth in dovecot by default in case no ssl certificate is used
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-04 19:59:30 +01:00
Maurice Preuß
6bb2036ebc use bytes instead of kilobytes 2022-11-04 18:32:38 +01:00
Michael Kaufmann
d16608c94a correctly calculate traffic usage and output bytes in Traffic-Api-Command instead of KB
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-04 18:02:04 +01:00
Michael Kaufmann
338eca4eb6 rework monthly traffic stats mail
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-04 16:08:07 +01:00
Michael Kaufmann
0608713b6a fix traffic/dispace usage reports
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-04 15:44:00 +01:00
Michael Kaufmann
6acd4f4df3 corrected usage in reportscron
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-04 14:28:17 +01:00
Michael Kaufmann
a14af67e2d typo
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-04 14:16:25 +01:00
Michael Kaufmann
a310df0704 language fixes
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-04 14:15:26 +01:00
Michael Kaufmann
ecd209b1d9 revert storing traffic in bytes as webalizer/awstats store in KB so goaccess needs to do that as well in order to stay consinstent throughout the system
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-04 12:49:26 +01:00
Michael Kaufmann
8aa857ea36 store traffic in bytes
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-04 12:44:56 +01:00
Michael Kaufmann
dbec714af8 fix traffic display in dashboards
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-04 12:39:10 +01:00
Michael Kaufmann
5abe663cbe fix stats-alias-path for subdomains with parent having speciallogfile == 1
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-03 12:08:16 +01:00
Michael Kaufmann
91c8fed5f4 fix stats-url generation in vhosts
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-03 11:38:21 +01:00
Michael Kaufmann
1bf9b38cfb fix callGoaccessGetTraffic parameters
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-03 11:17:02 +01:00
Michael Kaufmann
2698a730eb fix reading in JSON values from goaccess stats in case they are really large and cant be handled by php's json_decode
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-03 10:09:52 +01:00
Michael Kaufmann
1ecbad497a fix updating of path in directory-protections when changing traffic tool
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-03 09:13:23 +01:00
Michael Kaufmann
a8dc576833 add 'goaccess' as new and default traffic analyzer tool
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-03 08:58:11 +01:00
Michael Kaufmann
a052333296 enhance listing of customer domains; add third openbasedir-option to make 'parentdirectory of domain-docroot' value possible (refs #515); corrected some formfield definitions
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-01 15:36:21 +01:00
Michael Kaufmann
0f218914a2 re-add replacer-information for php-configs
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-01 15:32:10 +01:00
Michael Kaufmann
cc8814bf16 Merge branch 'main' of github.com:Froxlor/Froxlor 2022-11-01 14:22:05 +01:00
envoyr
67ca368863 Merge branch 'main' of github.com:Froxlor/Froxlor 2022-11-01 13:56:05 +01:00
envoyr
b6b0148495 update packages and badge color for dark mode 2022-11-01 13:54:17 +01:00
Michael Kaufmann
ec0094e754 UI/UX fixes in dns-editor and logfiles-viewer
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-11-01 13:38:27 +01:00
Michael Kaufmann
19284cad00 forgot to remove leftover variable in Ftps.update()
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-30 15:06:07 +01:00
Michael Kaufmann
e86f093d31 forgot to remove leftover prepared statement variable in Ftps.add()
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-30 14:31:21 +01:00
Michael Kaufmann
5aa059bb24 prefer sha256 (the old-way) over sha1 mixup for two different ftpds
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-30 14:22:25 +01:00
Michael Kaufmann
1f43f5d514 pure-ftpd compatible password hashes for ftp users
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-30 11:11:12 +01:00
Michael Kaufmann
85e3b6af0e add installation command for cron in case it's somehow not present on the system
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-27 14:21:09 +02:00
Michael Kaufmann
7cb5135725 secure userinput when adding/editing admins/customers
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-27 14:20:07 +02:00
Michael Kaufmann
afde51ecf6 email validation check input before display
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-27 14:14:16 +02:00
envoyr
34d5583333 display better exception for traffic results if admin has no customers 2022-10-25 13:37:33 +02:00
envoyr
3acc5457b2 fix darkmode search, textarea, progress bars and list groups 2022-10-25 13:00:04 +02:00
Michael Kaufmann
1f69ab7e3f fix keep-current-password when editing mysql-server
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-24 14:25:53 +02:00
Michael Kaufmann
a55cd86a4c adjust button styles in ssl- and dns-editor; don't show notice about pcntl when using --no-fork
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-23 20:43:21 +02:00
envoyr
996976d9f3 fix traffic overview in darkmode 2022-10-23 20:01:50 +02:00
envoyr
cc83099670 remove mix-manifest.json and fix gray colors 2022-10-23 19:43:27 +02:00
envoyr
8e17dda79a refactored scss files and beautify darkmode 2022-10-23 17:35:18 +02:00
Michael Kaufmann
861786f064 fix formfield visibility of ipandports:listen_statement; adjusted settings submit-buttons; fix traffic timescale-selectbox for responsive devices
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-21 10:51:06 +02:00
Michael Kaufmann
e30ad7ef9b added shortcut-add-action link to sidebar menu
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-19 10:16:17 +02:00
Michael Kaufmann
8b87bd055e optimize form-submit buttons on mobile devices
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-19 08:59:32 +02:00
Michael Kaufmann
b9e9cb9377 add subnavigation to hosting-plans
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-19 08:32:48 +02:00
Michael Kaufmann
f07bc950c6 Revert "update github-actions to redirect output as wanted"
This reverts commit 3de0d7ae6e.
2022-10-18 22:38:46 +02:00
Michael Kaufmann
3de0d7ae6e update github-actions to redirect output as wanted
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-18 22:36:19 +02:00
Michael Kaufmann
a2c8096b57 update github-actions to use node16
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-18 22:32:34 +02:00
Michael Kaufmann
e7ccc7bf76 more sub-navigation links; rename 'cancel' to 'discard changes' as it is a form-reset button
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-18 20:39:01 +02:00
Michael Kaufmann
3e1ad050a8 add more subnavigation for customer-email section; correctly display next_to elements when type=label in formfields
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-18 13:52:26 +02:00
Michael Kaufmann
60beaf8440 fix form-control-plaintext color; make non-href action buttons in table-listings <span> instead of <a>; deactivate let's encrypt for froxlor vhost correctly if dns check returns false
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-18 12:20:28 +02:00
Michael Kaufmann
56f5c7b487 fix missing custom_notes for admins/resellers
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-18 09:30:02 +02:00
Michael Kaufmann
5b3db2f096 Merge branch 'main' of github.com:Froxlor/Froxlor 2022-10-18 08:57:48 +02:00
Michael Kaufmann
3e931443f7 fix wrongly-escaping of some form-field values
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-18 08:57:34 +02:00
envoyr
afc821099a add jammy to yes-to-all supported os 2022-10-17 22:28:41 +02:00
envoyr
91cae70b5b fix php version for bookworm and jammy 2022-10-17 22:05:26 +02:00
Michael Kaufmann
c91047bb62 fix custom rss feed for customers on dashboard
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-17 19:30:58 +02:00
Michael Kaufmann
b4ba8f9225 fixing brainfart
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-17 17:29:38 +02:00
Michael Kaufmann
28f6d59336 allow optional length parameter for Froxlor.generatePassword API command
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-17 17:26:13 +02:00
Michael Kaufmann
2987ae5a05 respect newsfeed-visibility-settings; fix typo for saving column-visibility in apikeys; added back-to-overview button in cronjobs-edit; strings fixes
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-17 08:52:58 +02:00
Michael Kaufmann
71274f8f08 rewirk tablecolum js a bit when more than once tablelisting is on one page; do not allow empty column selection
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-16 17:10:57 +02:00
Michael Kaufmann
1704875cea remove unnecessary language selection in login-form
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-16 15:28:30 +02:00
Michael Kaufmann
dd30ab8f93 corrected updating language format and also update default-language of admins/customers to new format
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-16 14:15:19 +02:00
Michael Kaufmann
68c93a17b3 fix column-customizer for non-api based resources; add more no_search=true tags in various tablelistings where search is not available
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-16 13:35:50 +02:00
Michael Kaufmann
64142d2158 dont show search-icon/exclude specific non-searchable fields from overviews
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-16 13:13:26 +02:00
Michael Kaufmann
21954505b2 only set default_theme to fixed value if in update process of 0.10.x to 2.0.0-beta1 (or later)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-16 11:39:30 +02:00
Michael Kaufmann
d3ed765945 fix link to internal frolxor.panel user, thx to Davidd
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-16 11:16:18 +02:00
Michael Kaufmann
1c653c7cb1 only show link to customer when user is admin in Domain::domainWithCustomerLink callback
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-16 09:29:32 +02:00
Michael Kaufmann
4003c53dc4 use correct response field for domain-name in ssl-overview
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-16 09:18:53 +02:00
Michael Kaufmann
7d55b94a91 corrected default sorting field for sslcertificates overview
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-15 12:46:27 +02:00
Michael Kaufmann
f19f7ba936 add default-sorting to dns-record tablelisting; add edit-domain button in ssl-editor
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-15 11:11:05 +02:00
Michael Kaufmann
6953d0f883 minor fixes to fpm/php resources-forms and language-strings
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-13 16:53:36 +02:00
Michael Kaufmann
52857c208a fix standardSuccess language-replacer parameter; if hide-incompatible-settings is activated, also hide settings-overview-panel if incompatible
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-13 11:24:58 +02:00
Michael Kaufmann
a1b5f57f99 fix saving subdomain when only http2 flag has changed; fix superfluous comma in user/form.html.twig
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-10 15:22:00 +02:00
Michael Kaufmann
0757cc25ce fix ftp user passwords
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-07 17:56:51 +02:00
Michael Kaufmann
fb163f8006 minor adjustments in templates
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-07 12:29:11 +02:00
Michael Kaufmann
a37beef18e fix shell-select for customer ftp-accounts if shell is enabled; fix typo in UserCommand
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-06 14:23:56 +02:00
Michael Kaufmann
13c53b074c show search-text on listings with link to remove set filter
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-10-02 10:35:43 +02:00
dependabot[bot]
8bd133b488 Bump twig/twig from 3.4.1 to 3.4.3 (#1055)
Bumps [twig/twig](https://github.com/twigphp/Twig) from 3.4.1 to 3.4.3.
- [Release notes](https://github.com/twigphp/Twig/releases)
- [Changelog](https://github.com/twigphp/Twig/blob/3.x/CHANGELOG)
- [Commits](https://github.com/twigphp/Twig/compare/v3.4.1...v3.4.3)

---
updated-dependencies:
- dependency-name: twig/twig
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-09-30 20:20:31 +02:00
Michael Kaufmann
e944a886b6 add default-sorting of listings in frontend
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-09-30 09:44:11 +02:00
Michael Kaufmann
fa826aa87e format diskspace and traffic correctly in recalculate resources
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-09-26 17:45:46 +02:00
Michael Kaufmann
4701f41e67 fix typo in actions_links merge in form-template
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-09-26 13:07:06 +02:00
Michael Kaufmann
b1f7cf4bc7 minor language additions and css adjustments
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-09-20 08:09:53 +02:00
Michael Kaufmann
fd596801e2 use correct classes and not 0.10.x format
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-09-17 17:20:58 +02:00
Michael Kaufmann
5591bc41b4 add missing update steps of 0.10.x to (last) 0.10.38; more darkmode adjustments
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-09-17 17:17:09 +02:00
Michael Kaufmann
8f2fbe675a color adjustment for tables rows in darkmode
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-09-17 12:12:22 +02:00
Michael Kaufmann
11b1688ae6 minor adjustments for darkmode and formfields mandatory-flag for checkboxes
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-09-16 10:36:06 +02:00
Michael Kaufmann
04a485ca77 minor fixes in darkmode
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-09-14 20:44:30 +02:00
Michael Kaufmann
7687b27e13 work on darkmode
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-09-14 11:48:42 +02:00
Michael Kaufmann
8660afc010 adjust ftp and mail to new traffic-data too
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-09-13 08:53:56 +02:00
Michael Kaufmann
ddedce1671 more work on traffic and npm dependencies update
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-09-12 21:52:32 +02:00
Michael Kaufmann
15a1ff2f83 translate welcome-screen for unconfigured installations
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-09-11 17:08:24 +02:00
Michael Kaufmann
589f2b8124 adjust awstats default paths
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-09-08 16:45:21 +02:00
Michael Kaufmann
2e8e09cb2c rework search-result-window
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-09-08 15:05:19 +02:00
Michael Kaufmann
5f2f3bee0a DirectoryMatch the start of the folder, not every folder in any subdirectory
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-09-08 13:13:23 +02:00
Michael Kaufmann
9decb077d3 fixing icons
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-09-08 13:13:06 +02:00
Michael Kaufmann
1290cbea15 update npm requirements
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-09-08 10:29:06 +02:00
Michael Kaufmann
bc7e4be47a more work on new traffic view
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-09-08 10:27:03 +02:00
dependabot[bot]
21c0e27f2f Bump node-forge from 1.2.1 to 1.3.1
Bumps [node-forge](https://github.com/digitalbazaar/forge) from 1.2.1 to 1.3.1.
- [Release notes](https://github.com/digitalbazaar/forge/releases)
- [Changelog](https://github.com/digitalbazaar/forge/blob/main/CHANGELOG.md)
- [Commits](https://github.com/digitalbazaar/forge/compare/v1.2.1...v1.3.1)

---
updated-dependencies:
- dependency-name: node-forge
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-07 14:39:09 +00:00
Michael Kaufmann
6f2652f9dd start work on traffic-view refactoring
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-09-07 12:56:02 +02:00
Michael Kaufmann
5f95293e0d cleanup language file
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-09-02 10:11:12 +02:00
Michael Kaufmann
3fdc034f17 minor enhancements in dns-editor
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-09-02 09:50:18 +02:00
Michael Kaufmann
a7454b00b4 add icon to show admin/customer custom-notes in overview
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-09-01 15:44:38 +02:00
Michael Kaufmann
754b56aba0 fix missing use-statement for new subdomains in php-config setting
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-08-29 19:03:45 +02:00
Michael Kaufmann
5c7f5be5b9 fix generated json for config-services script after install
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-08-26 16:59:43 +02:00
Michael Kaufmann
05634adc66 display which is the default password-hash; fix language selection on login
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-08-26 16:07:40 +02:00
Michael Kaufmann
f47d203215 block access to more folders to enhance security
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-08-26 14:14:00 +02:00
Michael Kaufmann
546040541c add possibility to show subdomains fully in php-settings listing; UI adjustments
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-08-26 09:54:06 +02:00
Michael Kaufmann
7f6ea29e15 correction for mandatory fields in forms
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-08-26 09:06:42 +02:00
Michael Kaufmann
8f64460647 set new beta version for the new major release this year
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-08-25 21:49:26 +02:00
Michael Kaufmann
e5620b22e0 fix preselected values in customer-edit form; adjust version checking to include '-beta' and drop long unused '-svn'
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-08-25 21:42:53 +02:00
Michael Kaufmann
5525b927c1 various minor fixes for issues found by community member awsome
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-08-25 21:02:54 +02:00
envoyr
402dc8cf42 Merge remote-tracking branch 'refs/remotes/origin/0.11-dev' into 0.11-dev 2022-08-21 17:49:21 +02:00
envoyr
b5f5c4f4b5 update admin traffic overview 2022-08-21 17:47:17 +02:00
Michael Kaufmann
bcda1d51c4 added new cli command froxlor:user for unlocking, password-changing and info-display of a user
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-08-21 12:47:20 +02:00
Michael Kaufmann
f389226aae fix styling of deactivated/locked customers in overview and 0-value in edit-form
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-08-21 11:43:25 +02:00
Michael Kaufmann
3ee04a6e75 install-finish-magic
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-08-20 13:44:44 +02:00
Michael Kaufmann
07094f231a minor fixes in installation process
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-08-20 11:21:49 +02:00
Michael Kaufmann
2c9b2c1d67 fixes for finishing installation correctly
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-08-20 10:44:05 +02:00
Michael Kaufmann
9dc95e086d correct Dropdown directory selection; fixes #1044
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-08-16 08:33:37 +02:00
Michael Kaufmann
94a19ee2b6 more minor fixes and code-cleaning
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-08-10 12:01:26 +02:00
Michael Kaufmann
e82d7b5d8b add missing namespaces, fix typo
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-08-10 11:15:06 +02:00
Michael Kaufmann
16a9b18dad fix type of parameter in Validate::validate()
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-08-10 11:06:38 +02:00
Michael Kaufmann
50e35e149c various minor bugfixes; composer requirements update
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-08-10 00:17:11 +02:00
Michael Kaufmann
31500522ce make froxlor_master_cronkjob a froxlor-cli command; secure files/folders in froxlor-virtualhost;
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-08-09 15:49:44 +02:00
Michael Kaufmann
293c0ceb9d move needed view() function declaration above first potential usage
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-07-31 16:45:05 +02:00
Michael Kaufmann
5b3ea24725 add paramter 'mail-notify' to froxlor:update CLI script to notify the system administrator via email about a new version (once per version)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-07-31 16:26:39 +02:00
Michael Kaufmann
fabc68d13f pass mysql_server after adding to Mysqls.get command, do not validate in Mysqls.get if left empty on purpose
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-07-29 09:49:24 +02:00
Michael Kaufmann
dfb2d625c9 use correct target-dbserver to add db and user when using multiple database servers
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-07-29 09:35:11 +02:00
Michael Kaufmann
4d1a6728f6 fix first time updatecheck run when null is returned from Update::getUpdateCheckData()
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-07-24 11:51:32 +02:00
Michael Kaufmann
b6267e610a add interval for external update-check; add parameter 'force' to Froxlor.checkUpdate() API call; fix session/language update when changing language
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-07-24 11:47:10 +02:00
Michael Kaufmann
771d6c483a add onpage mini-search for listings
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-07-23 11:52:22 +02:00
Michael Kaufmann
b48c135d6d re-add image-logo upload in settings
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-07-22 11:44:01 +02:00
Michael Kaufmann
6b36508388 autofocus login field
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-07-22 09:01:21 +02:00
Michael Kaufmann
d6b97399d4 fix missing languages-array for change-language action
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-07-22 08:57:47 +02:00
Michael Kaufmann
8b930f7655 inject success-message to avoid re-sending of form
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-07-22 08:52:52 +02:00
Michael Kaufmann
72d14770de catch php errors to return valid JSON when invoking API, refs #1047
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-07-22 08:37:19 +02:00
Michael Kaufmann
cb3be2556b dont show section if section is not visible completely
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-07-22 08:36:40 +02:00
Michael Kaufmann
b5e613a794 re-add update paths from last 0.9.x 2022-07-22 08:09:18 +02:00
Michael Kaufmann
faba5b0715 update sql-users with their corresponding password-hash-algorithm; remove a few notices for empty values in str_replace and others
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-07-17 12:22:06 +02:00
Michael Kaufmann
430aefe0f7 added input-file option for automatic cli-installation
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-07-08 16:52:22 +02:00
Michael Kaufmann
7c812df4e0 re-enable quota and sieve plugins for dovecot in buster and bullseye config-templates, fixes #1042
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-07-07 15:29:10 +02:00
Michael Kaufmann
f1ad8b6cfd rework FileDir::makePathfield() is mode is 'dropdown' to show all directories correctly (depth limited); fixes #1044
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-07-07 15:28:50 +02:00
Michael Kaufmann
c8183fbbbf avoid accessing api_keys page if not allowed for loggedin user
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-06-30 14:53:58 +02:00
Michael Kaufmann
d4e94c0390 rearrange logfiles-view template contents to suite the overall layout better
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-06-30 14:02:21 +02:00
Michael Kaufmann
546a001092 fix passing complex passwords with special characters to mysqldump in backup-cron; fixes #1038
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-06-28 20:08:40 +02:00
Michael Kaufmann
7f546bb096 store userdata.inc.php when cli-install is finished and passthru config-services command so output can be seen
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-06-22 15:35:22 +02:00
Michael Kaufmann
fca80de995 fixes to install (mostly CLI)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-06-02 20:33:27 +02:00
Michael Kaufmann
bbd754c198 add USERNAME replacer to all email templates; fixes #1032
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-06-01 14:07:01 +02:00
Michael Kaufmann
d545e7e09d add CLI install command (more testing tbd)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-06-01 14:05:18 +02:00
Michael Kaufmann
f3b277237e add missing whitespace after channel-name fir update.noupdatesavail language string
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-26 14:06:32 +02:00
Michael Kaufmann
ceb621b9b5 set update-channel to testing for unittests as long as this branch is not main/stable
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-26 13:50:31 +02:00
Michael Kaufmann
75fedcb7e8 return more detailed message (include update_channel if testing)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-26 13:46:44 +02:00
Michael Kaufmann
66c3694809 fix lng() usage in RunApiCommand-class; fix title-tag content if newerversion=0 in update-check
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-26 13:29:26 +02:00
Michael Kaufmann
282e6f4cd7 update UI version check via AutoUpdate class in Froxlor.checkUpdate()
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-26 13:14:43 +02:00
Michael Kaufmann
ac143b2bbf Merge branch '0.11-dev' of github.com:Froxlor/Froxlor into 0.11-dev 2022-05-26 13:13:57 +02:00
envoyr
3b1250f557 add install/*.json to .gitignore 2022-05-26 13:12:43 +02:00
Michael Kaufmann
3e3ced946f add styling classes to dnszone textarea
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-26 12:29:03 +02:00
Michael Kaufmann
2e72fa8445 use new Language class in formfields
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-26 12:24:44 +02:00
Michael Kaufmann
dbd1fe3846 corrected domain-formfields visibility flag for ssl-related settings
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-26 12:07:55 +02:00
Michael Kaufmann
c087ac18d5 fix wrong number of bound variables when customers_see_all == 0
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-25 18:57:50 +02:00
Michael Kaufmann
ab6a8fefd2 make test-hostname actually an invalid hostname when testing for invalid hostnames
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-24 20:24:37 +02:00
Michael Kaufmann
d8bcf52b3b add frontend for new MysqlServer API command
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-24 19:50:30 +02:00
Michael Kaufmann
7cbc14f4aa enhance MysqlServer.add(), implement MysqlServer.update(), adjusted MysqlServer.get() to be callable by customer if allowed access to the given dbserver
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-24 09:30:09 +02:00
Michael Kaufmann
d3a8c8628e add with_ips parameter to SubDomains.listing() and SubDomains.get(); add column ips/ports to domain tablelisting (admin and customer)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-23 13:50:50 +02:00
Michael Kaufmann
9b5d3aed97 fix emails-edit formfield
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-23 13:07:59 +02:00
Michael Kaufmann
e02164049e add update cli-command; add update-channel setting (stable|testing)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-22 20:18:18 +02:00
Michael Kaufmann
1de39ac39c minor fix in templates due to new Language class + other minor language fixes
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-21 17:29:14 +02:00
Michael Kaufmann
309abc6150 remove some already fixed todo markers
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-21 17:03:34 +02:00
Michael Kaufmann
f6c265dfa1 re-adding the different certificate sources for domains in overview
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-20 15:41:06 +02:00
Michael Kaufmann
fef416ce84 fix show-version check on login/footer-template
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-20 14:50:51 +02:00
envoyr
0311ced7c3 check/uncheck all-checkbox 2022-05-16 14:42:05 +02:00
envoyr
8e85437b4b align switch correctly to the right 2022-05-16 14:06:23 +02:00
Michael Kaufmann
a68db7c80d adjust css/js of global-search; added missing id fields for searchable entities
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-15 19:01:44 +02:00
Michael Kaufmann
e6916de532 do not list column to available columns list if not visible
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-15 18:44:16 +02:00
Michael Kaufmann
14d5c9da6c add more columns for custom-column selection (customer view)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-15 18:39:36 +02:00
Michael Kaufmann
b12d9abaf2 add more columns for custom-column selection (admin view)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-15 17:50:12 +02:00
Michael Kaufmann
a5115414a8 verify 2FA code once before storing secret and activation for login to be sure it works; fixes #1030
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-15 12:27:48 +02:00
Michael Kaufmann
dd896659ae dynamically load dns-record help-text for selected dns-type; fixes #719
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-15 11:45:50 +02:00
Michael Kaufmann
ed7faae947 output preflight-checks nicely
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-15 10:27:46 +02:00
Michael Kaufmann
07a1ad8c58 add date/datetime input fields to relevant formfields
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-15 10:07:25 +02:00
Michael Kaufmann
4d5473ff14 translate new install-language-string to german
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-14 14:10:29 +02:00
Michael Kaufmann
616334284b migrate old replacer format in lng files
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-13 16:50:27 +02:00
Michael Kaufmann
fb38e0e21d add basic/advanced switcher for installation-mode
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-13 15:15:20 +02:00
Michael Kaufmann
7e14e9edd7 minor ui/lang adjustments; add security question for backup-abort action
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-13 11:22:14 +02:00
Michael Kaufmann
cc11e2de51 avoid jumping through install steps by url-manipulating; fix pre-selections of select-multiple-settings values;
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-12 14:53:22 +02:00
Michael Kaufmann
300db4602b fixes to installation and sequence of events in there
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-12 13:38:34 +02:00
Michael Kaufmann
cb3143e76d possibility to specify both ipv4 and ipv6
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-11 16:51:27 +02:00
envoyr
4c9b6adb1f merge branch '0.11-dev' of github.com:Froxlor/Froxlor into 0.11-dev 2022-05-11 16:27:04 +02:00
envoyr
5cab0e46bd small fixes for error reporting 2022-05-11 16:26:41 +02:00
Michael Kaufmann
da0136650e base for simple/extended install-mode
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-11 16:26:09 +02:00
Michael Kaufmann
56e4739b98 fix wrong sql-field for cronjobs_run description
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-11 11:35:10 +02:00
Michael Kaufmann
3adc5dc119 remove config-templates for centos; unmaintained and rarely used - also voted on discord to be removed
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-09 08:51:45 +02:00
Michael Kaufmann
ed73dbb5f3 set default-ca for acme.sh after updating acme.sh
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-09 08:40:09 +02:00
Michael Kaufmann
7dd96ff6bd also adjust error messages when adding admins + fix phpunit tests
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-08 13:28:57 +02:00
Michael Kaufmann
31b79d6471 distinct error messages for loginname begins with customer.prefix and loginname exists on the system
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-08 13:22:14 +02:00
Michael Kaufmann
d42e71fa9f small adjustments to install when ssl is activated and gentoo-config-templates
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-07 13:23:32 +02:00
Michael Kaufmann
2ae67c39fd fix wrong checkbox markup for install-specific checkboxes
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-06 17:02:57 +02:00
Michael Kaufmann
008cbc964f fixes and adjustments (+ notes) to install (on gentoo)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-06 16:23:11 +02:00
Michael Kaufmann
ac638041fa check for supported distribution in config-services parameter 'yes-to-all'
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-06 14:13:52 +02:00
Michael Kaufmann
b15d452981 enable re-selecting of system-distribution; move some distribution-related settings which are adjusted via installation to config-templates 'defaults'
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-06 10:19:19 +02:00
Michael Kaufmann
d0eaf12b34 fix checkbox-value for installation; fix session-initialization; preselect various guessable fields to ease installation
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-05 17:26:28 +02:00
Michael Kaufmann
65eeab299d set values for finishing json-parameter string for config-services call
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-05 16:12:36 +02:00
Michael Kaufmann
df6df4c5d3 validating input of install
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-05 15:02:09 +02:00
Michael Kaufmann
ad49a63eae use floating labels for installation, looks less confusing
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-04 15:35:48 +02:00
Michael Kaufmann
f67d596866 language enhancements and tiny fixes in new installation
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-04 14:15:19 +02:00
Michael Kaufmann
f8386062cf create self-signed certificate as last fallback if system-wide cert/key file cannot be found; add english translations for installation (wip)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-02 19:16:58 +02:00
Michael Kaufmann
c4a2d87d70 use PhpHelper::parseArrayToPhpFile in new MysqlServer API command; show asterisk for mandatory fields in formfields; add ssl-flag for ssl-enabled ip in installation
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-02 10:00:59 +02:00
Michael Kaufmann
00a3424f65 resolve old lng-references
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-02 08:56:39 +02:00
Michael Kaufmann
7b6d5f1642 add Crypt::createSelfSignedCertificate; bugfix display of no-ssl-ip in domain-add formfield
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-02 08:33:42 +02:00
envoyr
82ea54863d added more fields and defaults 2022-05-01 18:27:00 +02:00
envoyr
fb8143991c merge branch '0.11-dev' of github.com:Froxlor/Froxlor into 0.11-dev 2022-05-01 17:27:36 +02:00
envoyr
86e01191d2 make a more complete version of the installer 2022-05-01 17:26:51 +02:00
Michael Kaufmann
0535420334 possibility to use complete string-identifier paths in standard_error and standard_success
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-01 17:08:22 +02:00
Michael Kaufmann
54b467887b use correct array-structure for output of preconfig
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-01 16:58:51 +02:00
Michael Kaufmann
c59c5efc11 migrate update/preconfig to a more OOP way and remove unnecessary file/dir complexity
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-05-01 16:48:43 +02:00
envoyr
1557482d17 merge branch '0.11-dev' of github.com:Froxlor/Froxlor into 0.11-dev 2022-05-01 13:48:12 +02:00
envoyr
b9bb689796 add array to string/file helper 2022-05-01 13:47:50 +02:00
Michael Kaufmann
e768d834c1 add new setting to preselect system distribution to ease configuration
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-30 14:01:49 +02:00
Michael Kaufmann
14c86d3d21 add cli parameter -s to froxlor:api-call to show possible command-parameters
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-30 13:11:33 +02:00
envoyr
98c7c81fb8 merge branch '0.11-dev' of github.com:Froxlor/Froxlor into 0.11-dev 2022-04-30 11:59:58 +02:00
envoyr
4ea31c7124 update installer class and ui 2022-04-30 11:59:38 +02:00
Michael Kaufmann
c7226a16d2 make selection of config-services downloadable as json e.g. for config-services script
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-30 11:26:39 +02:00
Michael Kaufmann
422950d386 add cli command to run API commands
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-30 10:18:09 +02:00
Michael Kaufmann
9b064cdcce more php8.1 compatibility
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-29 18:01:59 +02:00
Michael Kaufmann
3065b5fbf9 unittests / php8.1
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-29 17:51:31 +02:00
Michael Kaufmann
10313d9058 fix allowed_myserver parameter in unit-test
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-29 17:02:01 +02:00
Michael Kaufmann
449897039c add testing for mysql-server/customer-update of allowed_mysqlserver; beautify config-command/file details
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-29 16:53:01 +02:00
Michael Kaufmann
bff499caed hopefully the last language migrations needed
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-29 10:33:42 +02:00
Michael Kaufmann
9ab185a71c even more language migration/fixing
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-29 10:23:45 +02:00
Michael Kaufmann
6116dda9bb more language migrations
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-29 10:01:58 +02:00
Michael Kaufmann
0dc77997fe more language cleanup and adding mysql-servers to customer add/delete in UI
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-29 09:36:46 +02:00
Michael Kaufmann
fe747b321c fix unit-tests with new language-class; fix language access in standard_error/standard_success; add MysqlServer API command and possibility to allow/disallow customers available mysql-servers
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-29 08:55:07 +02:00
envoyr
4f4c71d79b major refactoring of almost all files 2022-04-28 20:48:00 +02:00
Michael Kaufmann
a2e95b960f use new language class in API
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-28 18:14:00 +02:00
envoyr
373dfa7ad9 merge branch '0.11-dev' of github.com:Froxlor/Froxlor into 0.11-dev 2022-04-28 17:43:36 +02:00
envoyr
3d7d03b1f5 fix language strings in formfiles, navigation and tablelisting 2022-04-28 17:43:12 +02:00
Michael Kaufmann
450c682e7f try to fix github actions with new install/froxlor.sql.php; migrate update-functions into class
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-28 17:42:41 +02:00
Michael Kaufmann
6cc8ab0fb4 additional removes for new language mgmt; combined pre-requirement checks for cli commands; removed updaters for 0.9.x and 0.10.x (the last 0.10.x will be upgradable to 0.11.x of course)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-28 17:11:40 +02:00
envoyr
da89315a10 fix view function in init and update dirname level in install 2022-04-28 16:57:35 +02:00
envoyr
5d08d5235d major changes in language management and installer 2022-04-28 16:49:11 +02:00
Michael Kaufmann
f2ea821948 forgot to save one more file, again fix wrong visible-callback for ssl-editor in domain-listing
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-25 09:05:58 +02:00
Michael Kaufmann
0c647e0acb fix wrong visible-callback for ssl-editor in domain-listing; fix adding new certificate via form; don't show logs-icon when domain is email_only
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-25 08:36:11 +02:00
Michael Kaufmann
eb8b17efd7 update debian/ubuntu instructions
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-24 18:48:44 +02:00
Michael Kaufmann
57eeca5818 fix missing $ for a variable in Lighttpd-class
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-24 18:44:39 +02:00
Michael Kaufmann
1adb095918 corrections in config-templates
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-24 13:20:34 +02:00
Michael Kaufmann
b5794e463f add icon to display detailed commands/file-contents from config-templates in admin_configfiles
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-24 11:08:09 +02:00
Michael Kaufmann
000cb93def updating config-file xml's; prepare config-details view via ajax for config-commands/files to show in configuration
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-23 19:42:23 +02:00
envoyr
91d41af44a add button to restore table column defaults and ux improvements 2022-04-23 18:59:25 +02:00
envoyr
6ca071a31f merge branch '0.11-dev' of github.com:Froxlor/Froxlor into 0.11-dev 2022-04-23 16:11:51 +02:00
envoyr
3f17e893b5 add bootstrap to global variable 2022-04-23 16:11:43 +02:00
Michael Kaufmann
7178b49101 add security question when deleting api-key
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-23 10:00:41 +02:00
Michael Kaufmann
d267f408eb re-add contextual classes to domain-entry depending on deactivated/termination_date
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-22 14:29:36 +02:00
Michael Kaufmann
68fcfd2cf5 fix ajax responses; re-add statistics link to main-domains for customers
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-22 13:52:08 +02:00
Michael Kaufmann
8c1621cced fix deprecated jquery calls; move editapikey jq call to Ajax.php; fix edit of apikeys::allowed_from and allow cidr
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-22 13:17:09 +02:00
envoyr
a615b04eb4 add function to manage table columns 2022-04-22 10:59:56 +02:00
envoyr
03df082cf2 merge branch '0.11-dev' of github.com:Froxlor/Froxlor into 0.11-dev 2022-04-22 10:37:13 +02:00
Michael Kaufmann
b869c84f4d add new IPTools class; add new callback to show link to domain in domain-overview; validate possible allowed_ip-ranges in FroxlorRPC; fix possible duplicate ips for mysql-access-host in installation
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-22 10:36:46 +02:00
envoyr
5752222baa update alert ui 2022-04-21 20:02:14 +02:00
envoyr
d3ae4c5d72 improve error messages and language 2022-04-21 19:07:14 +02:00
envoyr
e638511826 merge branch '0.11-dev' of github.com:Froxlor/Froxlor into 0.11-dev 2022-04-21 18:20:13 +02:00
envoyr
cb7f180d8d update cron fpm config builder and webpack assets 2022-04-21 18:19:23 +02:00
Michael Kaufmann
f82d78ad5d add 'back to overview' links when adding/editing entities
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-20 17:08:49 +02:00
Michael Kaufmann
35a8fe7372 Merge branch '0.11-dev' of github.com:Froxlor/Froxlor into 0.11-dev 2022-04-20 17:06:57 +02:00
envoyr
16c38b4066 merge branch '0.11-dev' of https://github.com/Froxlor/Froxlor into 0.11-dev 2022-04-20 17:01:33 +02:00
envoyr
8c942178d2 fix font assets path, logo path, database installation and checks 2022-04-20 17:01:25 +02:00
Michael Kaufmann
74021ae142 fix ftp-action-links in listing; fix display of running/scheduled backup-job
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-20 16:51:40 +02:00
Michael Kaufmann
949f258f54 reflect same permission requirement for documentroot in Domains.add() and Domains.update()
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-20 16:18:02 +02:00
Michael Kaufmann
b1191917b8 avoid redirect-loop when displaying error in admin-autoupdate; fix description for 'move to domain to other customer'
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-20 16:12:42 +02:00
Michael Kaufmann
ebceab96b4 introduce static configs to enable/disable web-update (and possibly more later on)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-20 15:18:50 +02:00
Michael Kaufmann
b362c1f232 remove unused IgnorantRecursiveDirectoryIterator and fix uninitialized variables
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-20 15:13:35 +02:00
Michael Kaufmann
58c646f59e allow api interaction via kind-of-RESTful style via api.php?/module/command/
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-17 20:59:25 +02:00
Michael Kaufmann
d1dda00a1c Merge branch '0.11-dev' of github.com:Froxlor/Froxlor into 0.11-dev 2022-04-17 17:18:13 +02:00
Michael Kaufmann
9f0253819b adjustments
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-17 17:18:09 +02:00
Dennis Dudek
25d9c52c58 remove unnecessary ternaries (#1027)
* remove unnecessary ternaries

* fix: !($id <= 0);

* remove ternary
2022-04-14 09:02:10 +02:00
Dennis Dudek
d90676a793 Optimised phpdoc and array value use in foreach (#1026)
* use array values by already destructed values in foreach
corrected php docs to use string|array

* use values by already desctructered array values in foreach
2022-04-13 10:37:25 +02:00
Dennis Dudek
7a13e4a421 remove nested dirname and use level parameter for better readability (#1025) 2022-04-13 10:14:03 +02:00
Michael Kaufmann
3fbf23cb47 switch from crypt() to password_hash() and password_verify(), thx to kapsonfire for the hint
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-10 14:35:20 +02:00
Michael Kaufmann
90682b774a fine-tuning configservices cli script
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-10 14:32:43 +02:00
envoyr
cf19331f75 Merge branch '0.11-dev' of github.com:Froxlor/Froxlor into 0.11-dev 2022-04-10 13:41:19 +02:00
envoyr
e9d1f9d68f update search 2022-04-10 13:41:07 +02:00
Michael Kaufmann
5081d6d916 fix php compatibility hopefully for real now
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-10 10:29:43 +02:00
Michael Kaufmann
f540ed4eb5 require correct version of symfony/console to be php7.4 compatible
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-10 10:15:29 +02:00
Michael Kaufmann
0f4325f68d migrate shell/helper scripts to symfony/console components
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-10 10:05:21 +02:00
Michael Kaufmann
7f0eb97f9b show apikey details in modal-overlay; todo: edit allowed_from and valid_until
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-09 13:32:08 +02:00
Michael Kaufmann
9272c15706 add advanced_mode flag to various settings; exclude from output and global-search when settings-mode is 'basic'
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-08 18:41:28 +02:00
Michael Kaufmann
578b2811a5 add new settings_mode setting to switch between basic and advanced view
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-08 15:53:20 +02:00
Michael Kaufmann
01c6096998 use correct (new) class to call getThemes()
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-03 23:00:14 +02:00
Michael Kaufmann
2bb5c31a0f use correct method to get CurrentUser data-field
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-03 20:04:55 +02:00
Michael Kaufmann
64994e6444 don't try to globalsearch specific 'settings' search
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-03 18:56:40 +02:00
Michael Kaufmann
a4b780e7f7 don't search setting when using specific search and not settings: specified
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-03 18:54:37 +02:00
Michael Kaufmann
7779ec376a remove unused lib/version.inc.php file; added module-specific search to global-search; added new table for user-column-settings
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-03 18:42:49 +02:00
Michael Kaufmann
07049909ef remove accidentally added character
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-03 14:44:13 +02:00
Michael Kaufmann
c7833beff4 fix exit statement in cli scripts
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-03 14:42:02 +02:00
Michael Kaufmann
d18fa771f4 respect domain.writeerrorlog and domain.writeaccesslog when using log-to-pipe
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-03 14:35:09 +02:00
Michael Kaufmann
1441ed9a99 make search-result links a filter/search for the overview instead of the direct edit-link; show number of total entries in overview; show 'back to overview' button when showing search-result
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-01 16:47:22 +02:00
Michael Kaufmann
0312548e88 don't rely on executable flag for php-sessionclean script
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-01 14:48:55 +02:00
Michael Kaufmann
ef04d6532a fix phpunit-tests for dev-versions
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-01 10:36:27 +02:00
Michael Kaufmann
eacf383928 set valid version
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-01 10:32:39 +02:00
Michael Kaufmann
5f0429ef77 set development version to 0.11.0-dev
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-01 10:27:37 +02:00
Michael Kaufmann
78a4c109e4 validate sql_search and sql_orderby API parameters, fix unit-tests as of new default skin is 'Froxlor'
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-04-01 09:37:07 +02:00
envoyr
6ce2afa6a4 remove compiled assets from git 2022-03-27 16:02:07 +02:00
envoyr
957f41ae87 update default theme in froxlor.sql 2022-03-27 15:36:13 +02:00
Michael Kaufmann
4e8fddadff fix filename of template
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-27 15:00:44 +02:00
Michael Kaufmann
60433358f6 remove Sparkle-theme (old template-engine)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-27 14:59:17 +02:00
Michael Kaufmann
fb7091403c migrate recalc.resource-usage
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-27 14:58:52 +02:00
Michael Kaufmann
51ba6c757e migrate customer::backups
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-27 13:19:26 +02:00
Michael Kaufmann
943301e908 refactor error-reporting for admin/customer; remove now unused Froxlor\UI\Template class
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-27 12:44:44 +02:00
FliegenKLATSCH
2a91dafe20 Fix distro in postfix smtpd banner (#1014) 2022-03-27 11:11:05 +02:00
Michael Kaufmann
0b7443e875 refactor admin_acpuinfo
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-26 16:47:46 +01:00
FliegenKLATSCH
1d455ec4fb Set RC 1 if an exception occured (#1013) 2022-03-26 14:09:18 +01:00
Michael Kaufmann
439635d329 fix typo and re-add button to reset opcache in opcache-overview
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-26 14:09:16 +01:00
Michael Kaufmann
82fc148d8e migrate admin_opcacheinfo
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-25 09:32:33 +01:00
Michael Kaufmann
9a9089cde3 a few old session-variable leftovers
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-25 08:11:31 +01:00
Michael Kaufmann
2b53c4b918 migrate phpinfo page
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-24 15:10:00 +01:00
Michael Kaufmann
04a08f9095 add empty index.html file to all folders to avoid accidental folder-content disclosure if 'Options Indexes' is set for a (parent)folder containing froxlor in webserver-config
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-24 14:35:30 +01:00
Michael Kaufmann
bf41c84c6a migrate admin_settings::testmail
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-24 14:25:29 +01:00
Michael Kaufmann
25b9e5b540 migrated admin_messages; minor fixes in admin-listing and ipsandports::add defaults
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-24 13:40:43 +01:00
Michael Kaufmann
66f97738c2 added more entities to globalsearch (customer-side)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-21 09:07:43 +01:00
Michael Kaufmann
59682ba620 added a few more entities to globalsearch (admin-side)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-20 09:53:30 +01:00
Michael Kaufmann
860306b855 adjustments in ssl-certificates for customers; fix change-password for customers
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-18 19:25:25 +01:00
Michael Kaufmann
c1f4ee4e05 fully migrate admin_updates; removed unused Froxlor\UI\Paging;
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-18 16:11:56 +01:00
envoyr
69895943bd update ui class and traffic stats 2022-03-18 12:53:34 +01:00
Michael Kaufmann
ba0d33392c 2fa template migration; fix menu-active-state; removed unused code from UI/HTML-class
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-18 11:41:07 +01:00
Michael Kaufmann
12bf7db481 add language strings for configfiles
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-18 10:28:02 +01:00
Michael Kaufmann
406b9241ce fix user/form heading-icon; re-add button to set panel configured manually
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-18 10:04:33 +01:00
Michael Kaufmann
974e02694e first refactor of config-files
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-18 09:37:50 +01:00
Michael Kaufmann
dc798c63c7 migrate admin-autoupdate
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-16 14:32:10 +01:00
Michael Kaufmann
d30c9a2ff7 migrated ssl-editor; also usable as admin now
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-16 13:54:57 +01:00
Michael Kaufmann
401eb60062 admin-updates, settings-import and some minor ui tweaks
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-16 13:22:59 +01:00
Michael Kaufmann
d25c5ec4dd tiny fixes in customer_email
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-15 09:06:02 +01:00
Michael Kaufmann
6a9c2b8fdf remove old/unused javascript files
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-15 09:05:25 +01:00
Michael Kaufmann
0d282d29d8 move email settings to the top and hide then optional domain-settings when adding/editing domain as admin; fixes #1012
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-15 09:05:05 +01:00
Michael Kaufmann
af6b5f0ec5 correctly secure session-cookie
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-14 23:08:11 +01:00
Michael Kaufmann
164b46ece3 get rid of session variable in URL
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-14 22:51:59 +01:00
Michael Kaufmann
2972d95e8b use new form style for settings too
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-14 18:36:34 +01:00
envoyr
2c5c0258bf multiple ui improvements 2022-03-14 18:18:35 +01:00
Michael Kaufmann
31fbe434b4 domain import form
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-14 17:29:16 +01:00
Michael Kaufmann
21228b5359 style apikeys and integrity-check
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-14 12:36:53 +01:00
Michael Kaufmann
05cc08c376 add dns-editor in twig/tablelisting/formfield
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-14 11:13:21 +01:00
Michael Kaufmann
237476b30d add parsedown for markdown-usage in a few cases
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-13 16:33:57 +01:00
Michael Kaufmann
7e9e89e1fd handle speciallogfile-warning-note when editing domain as admin
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-13 16:16:48 +01:00
Michael Kaufmann
343339d510 generated css/js
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-13 12:21:10 +01:00
Michael Kaufmann
9a524da5b4 re-add some of the js/ajax actions
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-13 12:16:42 +01:00
Michael Kaufmann
b098dd1e15 correct alias-domainid for reverse-lookup-search
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-11 17:07:26 +01:00
Michael Kaufmann
e4144d8c6a logfiles view to twig
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-11 16:20:16 +01:00
Michael Kaufmann
9c60cf006f fomfields for admin/domains and some fixes in tablelistings
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-10 16:39:49 +01:00
Michael Kaufmann
5def8c1635 Merge branch '0.11-dev' of github.com:Froxlor/Froxlor into 0.11-dev 2022-03-09 14:10:47 +01:00
Michael Kaufmann
f236896764 use prepared statements for global-search
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-09 14:10:44 +01:00
envoyr
7e78bc6dd1 removed typeahead 2022-03-08 21:53:41 +01:00
envoyr
ba1a16b39e update search 2022-03-08 21:29:14 +01:00
Michael Kaufmann
1a40c9ba17 restructure searchresult
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-08 17:33:21 +01:00
Michael Kaufmann
218028de2b add userinfo to ajax calls; combine settings and global-search to one
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-08 16:57:55 +01:00
Michael Kaufmann
f758d0d943 fix installation for mariadb-10.5; minor fixes for global search later
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-07 18:43:06 +01:00
Michael Kaufmann
3c20fe4202 fix settings-search
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-07 10:37:00 +01:00
envoyr
958e783e77 add favicon 2022-03-06 20:55:04 +01:00
envoyr
bc64c82119 add language to ajax and typeahead 2022-03-06 20:54:36 +01:00
envoyr
3da11ca7fb remove incorrectly created files 2022-03-06 19:42:48 +01:00
Michael Kaufmann
3f9769103b function for setting-search
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-06 10:59:55 +01:00
Michael Kaufmann
a3a33c0da4 mail & filetemplates listing/forms
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-06 09:43:06 +01:00
Michael Kaufmann
54ce296018 some work on mail/file template formfields
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-05 11:46:35 +01:00
Michael Kaufmann
8256f31374 minor fixes in pagination and alertbox stuff
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-04 16:12:25 +01:00
Michael Kaufmann
30d64973c3 fix pagination back links
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-04 12:19:40 +01:00
Michael Kaufmann
7b28a33aba fix nav-sections to be open when active; show error if customer has no (email)domain assigned when trying to add a new address
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-04 10:47:22 +01:00
Michael Kaufmann
0c93a5166b admin_cronjobs form and admin/customer logger overview
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-04 10:21:45 +01:00
Michael Kaufmann
56f51703c7 testing api-key listing
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-03-03 19:19:18 +01:00
envoyr
7a26ade8de update preview image to english version 2022-02-28 19:08:28 +01:00
envoyr
49b77f9ed0 Merge branch '0.11-dev' of github.com:Froxlor/Froxlor into 0.11-dev 2022-02-28 18:54:29 +01:00
envoyr
289498296d update preview image 2022-02-28 18:54:07 +01:00
Michael Kaufmann
bd1e5c83e6 fix tablelisting in customer_extras; formatting js files
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-28 13:57:53 +01:00
envoyr
8742c9302e update icons 2022-02-28 13:54:39 +01:00
envoyr
95f2e63ac8 fix data when no field is set 2022-02-28 13:45:06 +01:00
envoyr
8f6f85ea8e update listing, handle fields with or without callbacks or callbacks only 2022-02-28 13:28:57 +01:00
Michael Kaufmann
8ff6e71729 tablelisting fpmdaemons
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-28 12:10:44 +01:00
Michael Kaufmann
5133d26f6f more tablelistings and php-related formfields
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-28 10:51:19 +01:00
envoyr
bebdb3a93f optimize spacing and imports of tabellisting 2022-02-28 09:33:32 +01:00
envoyr
4fc84652c5 forget to push spacing 2022-02-28 09:30:49 +01:00
envoyr
1c228c9ba9 fix class name and spacing 2022-02-28 09:28:13 +01:00
Michael Kaufmann
5b961be0f8 enhanced listing actions
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-28 09:21:04 +01:00
envoyr
2b771b11d6 fix usage info 2022-02-28 09:01:29 +01:00
envoyr
fb9dccc94a update naming 2022-02-27 21:10:23 +01:00
envoyr
639a262599 implement visible callbacks for tabellisting 2022-02-27 20:53:24 +01:00
envoyr
3186c2b37d rename tabellisting column to filed 2022-02-27 20:04:40 +01:00
Michael Kaufmann
f1e91af58a show note if no entries exist for a listing
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-27 18:54:36 +01:00
envoyr
1a6b899c67 refactoring callbacks, add class for table rows 2022-02-27 16:36:23 +01:00
Michael Kaufmann
d9f909150d more work on settings
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-27 16:03:24 +01:00
Michael Kaufmann
a73f6ffef5 forgot to save
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-27 14:37:32 +01:00
Michael Kaufmann
ab5ffc7545 beginning of rework/redesign of settings
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-27 14:34:05 +01:00
envoyr
c48a22a58e fix pagination and collections 2022-02-25 21:56:12 +01:00
envoyr
fb6660b78a add editorconfig 2022-02-25 21:25:15 +01:00
envoyr
d48baf0cb5 Merge branch '0.11-dev' of github.com:Froxlor/Froxlor into 0.11-dev 2022-02-25 21:17:45 +01:00
envoyr
7cfdf80a14 update listing and add pagination 2022-02-25 20:52:09 +01:00
Michael Kaufmann
6b5cabb125 more overview/actions-links
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-25 20:41:48 +01:00
Michael Kaufmann
fc4725cd61 more action-menu and info-box testing for overviews
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-25 20:13:13 +01:00
Michael Kaufmann
cdc4eccdd9 action-menu and info-box testing for overviews
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-25 19:36:22 +01:00
Michael Kaufmann
8c6452bb05 customer-extras overviews
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-25 17:17:29 +01:00
Michael Kaufmann
01798650fe fix unittests for FroxlorRPC-class round #3 (maybe)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-25 15:51:26 +01:00
Michael Kaufmann
5d7649a274 fix unittests for FroxlorRPC-class again (maybe)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-25 15:42:25 +01:00
Michael Kaufmann
bbc3644e23 fix unittests for FroxlorRPC-class (maybe)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-25 15:32:05 +01:00
Michael Kaufmann
d933549646 don't send header() on CLI environment
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-25 15:16:59 +01:00
Michael Kaufmann
1faa9f17ab minor icon tweaks
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-25 14:30:38 +01:00
Michael Kaufmann
038b6f9510 customer ftp/mysql listing
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-25 14:25:58 +01:00
Michael Kaufmann
c7cc2d4357 email listing
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-25 11:22:00 +01:00
Michael Kaufmann
5b675c25a3 don't show SU link for yourself
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-25 10:10:47 +01:00
Michael Kaufmann
c2ec309a01 more work on tablelisting
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-25 09:52:35 +01:00
envoyr
5964c3b685 update listing, collections and callbacks 2022-02-24 21:39:31 +01:00
envoyr
703e436b32 Merge branch '0.11-dev' of github.com:Froxlor/Froxlor into 0.11-dev 2022-02-24 15:39:04 +01:00
envoyr
9b184a758e format href to link if it is a linker array 2022-02-24 15:38:10 +01:00
Michael Kaufmann
6c71bbbcb0 Merge remote-tracking branch 'origin/master' into 0.11-dev 2022-02-24 08:51:56 +01:00
Michael Kaufmann
84f5de42a9 move php-sessionclean script to scripts-dir instead of install/scripts/; add cronjob calling php-sessionclean if php-fpm is enabled; remove testing-note for let's encrypt in german language file
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-24 08:49:36 +01:00
Michael Kaufmann
dcdc63679c fix language for options in tables
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-24 08:32:58 +01:00
envoyr
92ba16aa7f Merge branch '0.11-dev' of github.com:Froxlor/Froxlor into 0.11-dev 2022-02-23 18:28:13 +01:00
envoyr
c4940897a3 add actions to the listing 2022-02-23 18:24:51 +01:00
Michael Kaufmann
af50eb5462 small enhancements to Collection
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-23 17:57:10 +01:00
Michael Kaufmann
511c219d19 forgot a line of old code
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-23 17:41:31 +01:00
Michael Kaufmann
8c2a4aeec4 add tablisting.ipsandports
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-23 17:40:36 +01:00
envoyr
04263cb69f update tabellisting and callbacks, make columns invisible 2022-02-23 17:33:54 +01:00
envoyr
4e4e4eca94 move html from callbacks to twig 2022-02-23 16:27:13 +01:00
Michael Kaufmann
9177273484 more progressbar stuff
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-23 09:55:23 +01:00
Michael Kaufmann
b11f466a0a progressbar callback to behave like 0.10.x
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-23 09:27:52 +01:00
Michael Kaufmann
fca96864c6 Merge branch '0.11-dev' of github.com:Froxlor/Froxlor into 0.11-dev 2022-02-22 19:31:32 +01:00
Michael Kaufmann
56519b4072 more work on add/edit forms
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-22 19:31:28 +01:00
envoyr
2317930263 add decimal places to numbers 2022-02-22 19:18:36 +01:00
envoyr
4af1dff6fd fix titles 2022-02-22 19:10:53 +01:00
envoyr
8f7876b850 update table listing and add callbacks 2022-02-22 19:07:04 +01:00
envoyr
855e220d14 update table and add listing and collection class 2022-02-22 17:09:36 +01:00
Michael Kaufmann
5f2550e19c Merge branch '0.11-dev' of github.com:Froxlor/Froxlor into 0.11-dev 2022-02-22 11:37:38 +01:00
Michael Kaufmann
1974cb5217 do updatecheck
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-22 11:37:30 +01:00
envoyr
51d441b4e9 update admins and customers page 2022-02-21 20:34:58 +01:00
envoyr
60029ba1c3 Merge branch '0.11-dev' of github.com:Froxlor/Froxlor into 0.11-dev 2022-02-21 19:29:48 +01:00
envoyr
ffe536a57f make tables more customizable 2022-02-21 19:29:34 +01:00
Michael Kaufmann
322719fec8 lot of formfield corrections; form-adjustments; implementing of add/edit for most customer_* pages
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-21 17:42:04 +01:00
envoyr
1e4da4850e hardening requests 2022-02-20 18:30:57 +01:00
envoyr
e057314795 update templates introduce request helper 2022-02-20 18:00:59 +01:00
Michael Kaufmann
e0540ceb7c more work on formfields and display
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-20 16:53:47 +01:00
Michael Kaufmann
e6d12be7b3 update some more formfields; improved formfields with wrapper fieldrow()-macro to reduce duplicate markup; enable next_to functionality for some fields
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-20 12:50:29 +01:00
envoyr
23ecc40b1a fix standard error response 2022-02-20 11:45:45 +01:00
envoyr
ddc53e87fa fix response 2022-02-20 11:42:52 +01:00
envoyr
424a00b39e update api and ajax handling and response 2022-02-20 11:38:08 +01:00
Michael Kaufmann
d5e53cc7db check session in lib/ajax if we're going to do more than just reading the newsfeed
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-19 13:58:12 +01:00
Michael Kaufmann
90d2333eef change port field in ipsandports to type-number
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-19 11:15:03 +01:00
Michael Kaufmann
0b61bd9a79 migrate ipsandports.add/edit
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-18 22:33:59 +01:00
Michael Kaufmann
ef4feb07e6 migrate admin.add/edit
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-18 22:19:36 +01:00
Michael Kaufmann
357e97e1ca fix padding-top of heading
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-18 21:54:54 +01:00
Michael Kaufmann
06f77b41fd fix install-requirement messages for php
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-18 21:14:06 +01:00
envoyr
36dbb3bdcc set minimum php version to 7.4 and fix templates 2022-02-18 18:50:45 +01:00
envoyr
e1b09e49fd add missing froxlor-details 2022-02-18 17:42:47 +01:00
envoyr
36b87971fb fix row cols 2022-02-18 17:28:26 +01:00
envoyr
8b2ba97823 update templates and base structure 2022-02-18 17:06:23 +01:00
Michael Kaufmann
14008d1432 dashboard-resource-items
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-18 14:44:26 +01:00
Michael Kaufmann
c1c09da18d more cleanup in admin_customers for add/edit form
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-18 12:41:49 +01:00
Michael Kaufmann
0fd7b9a551 forgot to add a file
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-18 10:46:39 +01:00
Michael Kaufmann
829b99bc06 first form-migrate tests with customer-add-form
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-18 10:42:02 +01:00
Michael Kaufmann
28526b4544 add change pwd|lang|theme; twig-ify standard_error()
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-17 22:03:09 +01:00
Michael Kaufmann
9dce16e5c7 kinda fix error-handlers; more work on admin-dashboard
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-17 17:23:04 +01:00
envoyr
b4d9b1037d add dark mode 2022-02-17 15:30:05 +01:00
Michael Kaufmann
5d80c40b25 a bit more dashboard work
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-17 14:57:08 +01:00
Michael Kaufmann
f836342ff2 newsfeed + more admin dashboard info
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-17 13:58:29 +01:00
Michael Kaufmann
402a91c841 minor adjustments for mobile in dashboard; color-adjustments
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-17 12:15:47 +01:00
Michael Kaufmann
181fa96431 first work on dashboard template (admin and customer)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-17 12:01:54 +01:00
envoyr
96b2b2e065 add missing css 2022-02-17 08:13:32 +01:00
Michael Kaufmann
f930565d45 forgot-password function on login
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-16 21:08:25 +01:00
envoyr
14111583f1 merge changes into branch 2022-02-16 20:37:10 +01:00
envoyr
a4d6d183ff update base structure 2022-02-16 20:29:42 +01:00
Michael Kaufmann
0be8b9c313 beautification and mobile-fixes
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-16 16:47:18 +01:00
Michael Kaufmann
91197bcff2 update composer.json and fix dependencies for php <8.0 to stay 7.4 compatible
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-16 15:32:48 +01:00
Michael Kaufmann
2a3262ef45 actually show admin-dashboard
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-16 15:00:27 +01:00
Michael Kaufmann
759d11d1a0 add userarea-layout + sidebar and topmenu
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-16 14:54:06 +01:00
envoyr
4fd6ebf5b7 fix jquery 2022-02-16 12:37:28 +01:00
envoyr
f8a00a5f1e fix javascript and images, update css 2022-02-16 11:59:52 +01:00
Maurice Preuß
f7db5497af 0.11 dev (#1010)
* update layout and bootstrap package

* update templates

Co-authored-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-16 09:57:17 +01:00
Michael Kaufmann
3ba196fec6 add dberrornice template for database-errors
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-16 09:25:27 +01:00
Michael Kaufmann
2ced9cdc2d add missing query-field
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-16 08:36:32 +01:00
Michael Kaufmann
407a1daebf first non-install template (login); mostly testing
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-15 20:37:27 +01:00
Michael Kaufmann
f37d9d000c make selecting the used OS actually do something (load default-setting-adjustments required/needed; TBD)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-15 15:43:18 +01:00
Michael Kaufmann
96cdb34d71 first tiny fixes to get the installation running
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-15 11:31:49 +01:00
Michael Kaufmann
56a9a71248 preparing for re-design using new template-engine for future 0.11.x releases
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-15 11:18:19 +01:00
Michael Kaufmann
1d7d32130a setting version to 0.10.33 for upcoming release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-04 13:24:41 +01:00
Michael Kaufmann
9babcde3e5 additional mkdir/chmod parameter fixes and cron-lock file adjustments
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-02-04 10:52:12 +01:00
Kris
9ec76c9fd6 Improve composer.json syntax (#1008)
* Improve composer.json syntax

* Run composer upgrade with PHP 7.4
2022-01-26 14:10:08 +01:00
Michael Kaufmann
61dfeb947f fix incorrect parameter type for mkdir() and chmod()
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-01-25 15:47:37 +01:00
Michael Kaufmann
6fdf2636fc update docs url for api-documentation
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-01-25 14:54:52 +01:00
Michael Kaufmann
0a38d1ab5f add workflow to automatically trigger api-docs generation in Froxlor/Documentation
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-01-21 17:02:35 +01:00
Michael Kaufmann
7c80dc3d1d add script for php-session cleanup
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-01-21 16:02:21 +01:00
Manuel
5ab49e3f50 Call PHP-FPM only when file exists (#1006)
Added `<If "-f %{SCRIPT_FILENAME}">` to load only PHP files that exists. This is to prevent `File not found` error from PHP-FPM and let Apache handle the error output. It removes also unnecessary PHP-FPM calls and `AH01071: Got error ‘Primary script unknown` in PHP error log.

Usually you can find the error whenever someone goes fishing for paths like wp-login.php.

The `<If>` directive is only available in Apache 2.4+ and not 2.2 or earlier.
2022-01-21 12:25:14 +01:00
Michael Kaufmann
06849133a8 modernize parameters of Cronjob::inserttask()
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-01-21 10:39:32 +01:00
Oskar Eisemuth
4a912e3902 Feature/crontaskid (#1005)
* Add \Froxlor\Cron\TaskId for fixed task id naming

* Replace Cronjob::inserttask numbers with \Froxlor\Cron\TaskId constants

* Use TaskId in Froxlor\Cron\System\TasksCron

* Use TaskId in Froxlor\System\Cronjob,
simplify getOutstandingTasks.
Rename lng['tasks'] cronjob task description.
WARNING: DELETE_DOMAIN_PDNS, DELETE_DOMAIN_SSL now use %domain%

* Remove Froxlor\System\Cronjob type 3 check
2022-01-21 10:03:45 +01:00
Michael Kaufmann
bcb95e9b7d check resource-usage for Mysql.add(), thx again to zerody
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-01-18 23:18:54 +01:00
Michael Kaufmann
c97f5f1e29 updated README; sanitize script parameter in index.php; sanitize description fields of entities (thx to zerody for pointing these out)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-01-18 09:29:13 +01:00
timdeluxe
4d289e2a7f Improves text for global open basedir setting (#1004) 2022-01-13 19:50:39 +01:00
Michael Kaufmann
c491f2c03e put commands for cronjob setup at the end of the list (should be the last thing to execute)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-01-13 18:42:40 +01:00
Michael Kaufmann
5832346f75 set version to 0.10.32 for upcoming release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-01-07 15:38:12 +01:00
Michael Kaufmann
4b4770ab36 add missing change-check when ssl-specialsettings are changed
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2022-01-03 20:27:19 +01:00
Michael Kaufmann
8c998dd6f2 Update README.md 2022-01-02 14:53:59 +01:00
Michael Kaufmann
965359ec79 Update README.md 2022-01-02 14:35:36 +01:00
Michael Kaufmann
d1d42f2055 allow setting path to acme.sh installation; fixes #1002
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-12-31 10:38:49 +01:00
Michael Kaufmann
5f41b37770 test dns entry string without any whitespaces/tabs/etc.
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-12-27 16:08:46 +01:00
Michael Kaufmann
61265778a5 fix unit-test
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-12-27 16:01:45 +01:00
Michael Kaufmann
8f0f890145 fix too strict comparison for isemaildomain check in Dns-Zone generation; fixes #1003
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-12-27 15:38:59 +01:00
Michael Kaufmann
5ccae3f9bb do not check for allowed-phpconfigs if fpm/fcgid is not activated (no possibility to select a config anyway)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-12-14 11:23:36 +01:00
Michael Kaufmann
f4d9e64804 set version to 0.10.31 for upcoming release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-12-03 15:30:09 +01:00
Michael Kaufmann
149c0935fa fix Domains.update() with correct path and change_serversettings=0; refs #1001
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-11-27 22:06:29 +01:00
Michael Kaufmann
cb0b537f6c allow settings/updating documentroot (only relative to customer homedirectory) when change_serversettings permission is not granted; fixes #1000
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-11-27 18:04:36 +01:00
Michael Kaufmann
b54c012579 respect deactivated flag when createstdsubdomain's default falls back to 'true' if the customer has one (prior to deactivating); refs #998
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-11-15 20:24:55 +01:00
Michael Kaufmann
389d83f5a3 fix behaviour in Customers.update() in case 'createstdsubdomain' is not set when called via API (wrong default); fixes #998
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-11-15 20:04:01 +01:00
Michael Kaufmann
00771381e8 set correct php-version numbers for installation dependencies-check; fixes #997
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-11-13 20:20:05 +01:00
Michael Kaufmann
46df429909 set version to 0.10.30 for upcoming release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-11-05 09:27:58 +01:00
Michael Kaufmann
eb841da007 avoid possible DivisionByZeroError in APCu info page, fixes #995
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-11-04 07:44:03 +01:00
Michael Kaufmann
c4a2db03be enable bind for testing-scenarios explicitly
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-11-03 14:16:21 +01:00
Michael Kaufmann
e5838f00cf add quota-plugin parameters to dovecot-config-templates; update standardcustomer index.html; set nameserver disabled by default
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-11-03 14:08:57 +01:00
Michael Kaufmann
bcde7e93df check whether the domain to clean from pdns actually still exists there; fixes #992
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-10-21 12:00:36 +02:00
Michael Kaufmann
bd8327afbe soften/correct permissions on pdns configs; fixes #991
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-10-21 11:56:34 +02:00
Michael Kaufmann
b961eba382 fix api documentation for Domains.add() and Domains.update(); fixes #987
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-10-20 16:51:16 +02:00
Michael Kaufmann
a552ea878e avoid undefined index of 'wwwserveralias' field if issueing/renewing lets encrypt certificate for froxlor-hostname
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-10-17 11:48:40 +02:00
Michael Kaufmann
4ad2a1da1c add complete list of nameserver-ips and given axfr-servers to allow-axfr-ips list for PowerDNS; fixes #985
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-10-14 19:07:05 +02:00
Michael Kaufmann
37ae69f07a correct language strings in phpconfig formfield for new setting; refs #980
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-10-14 17:13:55 +02:00
Michael Kaufmann
9870db2560 add possibility to assign new/edited php-config to all customer accounts; fixes #980
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-10-14 17:09:29 +02:00
Michael Kaufmann
724a5e172a don't remove 0-value parameter values from bulk-actions
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-10-12 16:29:04 +02:00
Michael Kaufmann
8e166cb842 adjust debian 11 config templates, fixes #982
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-10-12 14:25:42 +02:00
Michael Kaufmann
5e281cf486 fix allowed-phpconfigs check in SubDomains.add() and SubDomains.update()
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-10-11 19:26:13 +02:00
Michael Kaufmann
5d2f44ecd8 only validate custom database name if used at all
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-10-11 18:59:26 +02:00
Michael Kaufmann
5009c625d8 prep.statement cannot be used for create database query; regex-validate database_name
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-10-11 18:55:15 +02:00
Michael Kaufmann
eb592340b0 use prepared statement for creating databases to avoid sql injections in custom db-names
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-10-11 18:33:48 +02:00
Michael Kaufmann
c6f556c8d9 set version to 0.10.29.1 for bugfix release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-10-10 14:45:17 +02:00
Michael Kaufmann
db1df84ef1 correct db-exists check in installation-process
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-10-10 14:32:02 +02:00
Michael Kaufmann
52135a1d3a set version to 0.10.29 for upcoming release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-10-08 08:46:58 +02:00
Michael Kaufmann
7f13bd09da add optional ssl parameters to powerdns-config-template
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-10-08 08:39:22 +02:00
Nick Ufer
7ccbb37c4e feat: adds mysql tls support (#979) 2021-10-08 08:28:32 +02:00
Michael Kaufmann
7feddf0aec generate unpredictable unique session ids
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-10-02 12:38:17 +02:00
Michael Kaufmann
e73523531a let user decide whether an existing database should be backup'ed and removed when installing froxlor; dont rely on parse_ini_file for OS check; enhance mysqldump so there is no issues with complex passwords and bash-escaping
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-09-24 10:49:57 +02:00
Michael Kaufmann
a47b790e19 actually integrate the new czech language file; refs #976
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-09-04 09:30:44 +02:00
Michael Kaufmann
319eec6124 fix session for 2fa enabled logins
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-08-27 13:17:05 +02:00
Michael Kaufmann
21983f27b6 secure commonly used filename-variable against url manipulation
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-08-25 16:36:09 +02:00
Michael Kaufmann
5d375b784d login action always goes to index.php
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-08-25 16:30:56 +02:00
Michael Kaufmann
4b22470872 set php session security related settings (correctly in every case)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-08-25 16:21:33 +02:00
Michael Kaufmann
ec1c37aa06 set version to 0.10.28 for upcoming release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-08-20 09:23:23 +02:00
Nicolas
67351ec3c2 Adding support for PowerDNS-Replication (#974)
Adding support for powerdns-replication
2021-08-19 12:00:09 +02:00
Michael Kaufmann
f1887aaaf2 enable iterate_query in dovecot by default
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-08-13 09:28:10 +02:00
Michael Kaufmann
afd2d7b5e9 fix dns-validation in Domains.add() and Domains.update() when using Let's Encrypt DNS-check
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-08-08 11:14:57 +02:00
Michael Kaufmann
c967e585b5 avoid duplicate entries in mysql-access-host setting
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-08-06 08:11:06 +02:00
Michael Kaufmann
73e364d4ba fix compare of old/new value of aliasdomain when editing a domain as customer to avoid unnecessary regeneration of configfiles
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-08-04 14:55:22 +02:00
Michael Kaufmann
eb49331b21 remove superfluous inserttask when editing domain as it will be called when there are actually changes to the domain earlier
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-08-04 14:06:32 +02:00
Michael Kaufmann
0a1a3e023f check dns for lets encrypt when adding/editing domains and via cron; fixes #971
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-08-04 13:44:13 +02:00
Michael Kaufmann
bef5cedcd0 only add link to customername when editing domain when panel.allow_domain_change_customer is false
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-08-02 16:58:34 +02:00
Stefan Weil
f8e2bc7bff Fix some typos in code (found by codespell) (#970)
Signed-off-by: Stefan Weil <sw@weilnetz.de>
2021-08-01 19:00:33 +02:00
Stefan Weil
09038ac7aa Fix some typos (found by codespell) (#969)
Signed-off-by: Stefan Weil <sw@weilnetz.de>
2021-07-31 09:51:54 +02:00
Michael Kaufmann
4c507232c7 add setting for a custom system group for all customer-users (required libnss-extrausers); fixes #953
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-07-30 12:16:37 +02:00
Michael Kaufmann
86939a64da add buypass testing/staging ACME endpoint; create CAA entries accordingly if activated; refs #968
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-07-29 21:24:43 +02:00
Jens Meißner
926ce427fc Add Buypass to the list of ACME providers. (#968) 2021-07-29 21:15:49 +02:00
Michael Kaufmann
53401eebfb integrity check should allow utf8_* charachter sets and not only 'utf8', thx to lod
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-07-29 21:04:46 +02:00
Michael Kaufmann
bef580929e Update README.md 2021-07-27 08:14:08 +02:00
Michael Kaufmann
c7b7c67ff4 normalize ipv6 addresses to avoid possible comparison problems; fixes #965
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-07-26 17:53:44 +02:00
Michael Kaufmann
ed42d4e3df try to fix github action...
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-07-24 20:31:34 +02:00
Michael Kaufmann
69a2ebce36 create user as froxlor would create it for mysql-8.0
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-07-24 20:29:56 +02:00
Michael Kaufmann
15f08739fa add github action workflow for mysql
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-07-24 20:17:42 +02:00
nachtgeist
571690c8c5 admin_customers/edit domain: make customer login name a link (#962) 2021-07-23 16:35:31 +02:00
rex2630
b2005d7f29 [WIP] Czech language (#870)
* Update czech.lng.php
2021-07-21 20:41:07 +02:00
Michael Kaufmann
4354598c64 fix unittests
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-07-21 10:21:58 +02:00
Michael Kaufmann
05d4bdc499 restore behaviour for unittests as 'create stdsubdomain' default was yes in the settings but no for direct API usage
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-07-21 10:10:18 +02:00
Michael Kaufmann
25c6a37df2 fix wrong variable-name in Customers.delete()
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-07-21 10:03:20 +02:00
Michael Kaufmann
41a470fe36 added option to disable creation of default subdomain; fixes #960
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-07-21 09:53:54 +02:00
Michael Kaufmann
8a4aa2a721 fix lng strings
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-07-20 23:45:57 +02:00
Michael Kaufmann
1d903770fc have more power over theme logo, custom theme logo and uploaded logo; refs #958
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-07-20 20:35:54 +02:00
Nicolas
934be5a238 Fix SOA-Record (#959) 2021-07-20 19:29:06 +02:00
Michael Kaufmann
5608f0407f correct heredoc indentation in AcmeSh for php-7.1; fixes #957
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-07-20 08:11:32 +02:00
Kai
ce9d8dad7f Feature-request #672 - database name prefixes + custom name (#956)
* Fix makeoption function call

* Update formfield.mysql_add.php

Added database name

* Update formfield.mysql_add.php

* Update formfield.mysql_add.php

* Update Mysqls.php

* Update DbManager.php

* Update formfield.mysql_add.php

* Update german.lng.php

* Update formfield.mysql_add.php

* Update Mysqls.php

* Added field database_name (Feature #672)

* Added Testfunction for customer choosed database name

* Fixed test for customer choosed database name
Added docs for param $name

* Fixed mysql api command add
Removed doubled code

* Set settings for customer choosed db name

* Fixed wrong excepted for database name

* Renamed parameter database_name to custom_suffix

* Changed testCustomerMysqlsList
Added testCustomerMysqlsDBNameDelete
2021-07-19 19:10:12 +02:00
Michael Kaufmann
d6fe263e68 Update issue templates 2021-07-19 07:20:46 +02:00
Michael Kaufmann
156846a845 set version to 0.10.27 for upcoming release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-07-18 10:57:38 +02:00
Michael Kaufmann
abe00b79a7 Update README.md
add github actions build badge
2021-07-17 14:16:29 +02:00
Michael Kaufmann
26ab659c6a Ga testing (#955)
* switch from travis-ci to github actions

Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-07-17 14:14:35 +02:00
Michael Kaufmann
b0273c68d2 remove debian jessie config-templates (outdated); set debian stretch as deprecated; add debian bullseye config templates
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-07-16 12:15:03 +02:00
Michael Kaufmann
720cf9d74f Merge branch 'master' of github.com:Froxlor/Froxlor 2021-07-13 09:01:25 +02:00
Michael Kaufmann
35cd567c48 check whether there was an image upload at all
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-07-13 09:01:22 +02:00
Michael Kaufmann
2332d5be7b Merge pull request #949 from bashgeek/custom-css
Custom CSS File in default theme
2021-07-13 08:38:23 +02:00
Daniel
14cdc3801a Merge branch 'Froxlor-master' into custom-css 2021-07-13 10:31:35 +08:00
Daniel
d85efe480e conflict 2021-07-13 10:31:24 +08:00
Daniel
4f2ceaa3ab wip 2021-07-13 10:29:36 +08:00
Michael Kaufmann
3b6792d548 Merge branch 'master' of github.com:Froxlor/Froxlor 2021-07-12 17:29:25 +02:00
Michael Kaufmann
36de6e09d4 remove beta notice from let's encrypt settings
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-07-12 17:29:21 +02:00
Michael Kaufmann
300c410b18 Merge pull request #948 from bashgeek/logo-custom-login
Custom Logo(s) via Image-Upload in Panel Settings
2021-07-12 17:28:42 +02:00
Daniel Schmitz
282d7d9101 migrate old image + fix versioning 2021-07-09 17:07:50 +08:00
Daniel Schmitz
48f6601003 check mime types 2021-07-09 16:42:21 +08:00
Daniel
c4c4279171 Merge branch 'Froxlor:master' into logo-custom-login 2021-07-09 16:32:59 +08:00
Michael Kaufmann
b88f9c1f18 allow defining php_value/php_admin_value for session.save_path when using php-fpm; fixes #954
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-07-09 08:23:46 +02:00
Daniel Schmitz
0dac045dc9 wip 2021-07-07 14:11:54 +08:00
Daniel Schmitz
80b5f97367 wip 2021-07-07 14:10:21 +08:00
Daniel Schmitz
7a8b39fad0 wip 2021-07-07 14:00:55 +08:00
Daniel Schmitz
9f5978e875 german translations 2021-07-07 13:33:33 +08:00
Daniel
155fd757bf Merge branch 'Froxlor:master' into logo-custom-login 2021-07-07 13:30:22 +08:00
Daniel Schmitz
518ec202ab wip 2021-07-07 13:26:15 +08:00
Michael Kaufmann
871083d613 Merge pull request #952 from bashgeek/install-warnings
Installer Cleanup & Bug Fixes
2021-06-28 08:06:59 +02:00
Daniel Schmitz
79f0c8d28f wip 2021-06-28 11:01:22 +08:00
Daniel
dfbb4127e2 Merge branch 'Froxlor:master' into logo-custom-login 2021-06-28 10:39:02 +08:00
Daniel Schmitz
b9b2f00f30 wip 2021-06-28 10:37:23 +08:00
Daniel Schmitz
6923f9d926 Revert "wip"
This reverts commit cacbf7fec7.
2021-06-28 10:35:15 +08:00
Daniel Schmitz
cacbf7fec7 wip 2021-06-28 10:34:21 +08:00
Michael Kaufmann
73991e855c Support ZeroSSL via acme.sh (v3); refs #946
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-06-27 09:00:44 +02:00
Michael Kaufmann
0208812013 prefer custom zone entries over automatically created ones when system.dns_createmailentry is enabled, fixes #944
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-06-27 08:41:16 +02:00
Michael Kaufmann
48bd2561f7 Merge pull request #947 from Froxlor/dependabot/composer/phpmailer/phpmailer-6.5.0
Bump phpmailer/phpmailer from 6.4.1 to 6.5.0
2021-06-27 08:37:38 +02:00
Michael Kaufmann
af12c4102b Merge pull request #950 from kruegerj/patch-1
Update focal.xml
2021-06-24 07:57:00 +02:00
kruegerj
d2efa3ecc4 Update focal.xml 2021-06-24 03:16:12 +02:00
Daniel Schmitz
acb04566f5 wip 2021-06-23 11:28:07 +08:00
Daniel Schmitz
abb98ae960 wip 2021-06-23 11:21:33 +08:00
Daniel Schmitz
0d202a7e4d wip 2021-06-23 11:20:18 +08:00
Daniel Schmitz
c69ef20b17 wip 2021-06-23 10:58:52 +08:00
dependabot[bot]
5872d0682a Bump phpmailer/phpmailer from 6.4.1 to 6.5.0
Bumps [phpmailer/phpmailer](https://github.com/PHPMailer/PHPMailer) from 6.4.1 to 6.5.0.
- [Release notes](https://github.com/PHPMailer/PHPMailer/releases)
- [Changelog](https://github.com/PHPMailer/PHPMailer/blob/master/changelog.md)
- [Commits](https://github.com/PHPMailer/PHPMailer/compare/v6.4.1...v6.5.0)

---
updated-dependencies:
- dependency-name: phpmailer/phpmailer
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-06-22 15:20:44 +00:00
Michael Kaufmann
c4fa8feb8c update dev tools
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-06-17 08:25:43 +02:00
Michael Kaufmann
61a50cc657 add setting for default serveralias value for new domains, refs #944
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-06-16 15:10:52 +02:00
Michael Kaufmann
3df3261ac0 switch from freenode irc network to libera.chat irc network as freenode is dead
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-06-16 11:57:38 +02:00
Michael Kaufmann
f2636e14f0 Merge pull request #945 from MisterDuval/patch-1
Deny all robots
2021-06-01 15:06:31 +02:00
MisterDuval
a23f22f561 Deny all robots
Search engine and all Robots should be denied to the whole Froxlor directory. This file will help!
2021-06-01 14:45:47 +02:00
Michael Kaufmann
8cf3f4ee24 set version to 0.10.26 for upcoming maintenance releasae
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-05-14 08:21:53 +02:00
Michael Kaufmann
e83f7634f8 Merge pull request #938 from Froxlor/dependabot/composer/phpmailer/phpmailer-6.4.1
Bump phpmailer/phpmailer from 6.2.0 to 6.4.1
2021-05-04 19:57:10 +02:00
dependabot[bot]
6eb6595a46 Bump phpmailer/phpmailer from 6.2.0 to 6.4.1
Bumps [phpmailer/phpmailer](https://github.com/PHPMailer/PHPMailer) from 6.2.0 to 6.4.1.
- [Release notes](https://github.com/PHPMailer/PHPMailer/releases)
- [Changelog](https://github.com/PHPMailer/PHPMailer/blob/master/changelog.md)
- [Commits](https://github.com/PHPMailer/PHPMailer/compare/v6.2.0...v6.4.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-04 17:43:20 +00:00
Michael Kaufmann
bd48fb7328 catch exception of password-complexity check when changing account password; fixes #935
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-04-14 08:59:44 +02:00
Michael Kaufmann
769525bb56 do not touch/chown error/access log if log is disabled, fixes #934
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-04-12 09:42:25 +02:00
Michael Kaufmann
9195fb3c98 additionally sort by length of username for libnss-extrausers passwd file to have the main user as first in result in any case; fixes #933
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-04-12 09:37:36 +02:00
Michael Kaufmann
82922f7aea add new settings for legal-notes; terms-of-use and privacy-policy; fixes #930
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-03-24 14:36:48 +01:00
Michael Kaufmann
db1a39b6d9 match composePhpOptions() definition everywhere
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-03-24 13:49:58 +01:00
Michael Kaufmann
7fbbc2ea0b add vhost replacer {FPMSOCKET} for custom vhost configs; fixes #931
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-03-24 13:46:24 +01:00
Michael Kaufmann
91d4432108 check rr against possible existing CNAME entries, fixes #927
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-03-15 17:33:30 +01:00
Michael Kaufmann
c8914312aa Refactoring columns from large table to avoid '1118 Row size too large' error
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-03-11 09:45:52 +01:00
Michael Kaufmann
3fd89c48e8 set version to 0.10.25 for upcoming maintenance release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-03-05 20:27:55 +01:00
Michael Kaufmann
eceb144a77 also trigger removal of domain in powerdns database if used; refs #923
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-03-04 12:09:03 +01:00
Michael Kaufmann
1d9651b18a trgger acme.sh removal for domains if customers is being deleted; fixes #923
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-03-04 12:07:20 +01:00
Michael Kaufmann
49db4e60cb escape passwords for email content (new email-account, new ftp-account and new database); fixes #905
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-03-03 11:25:58 +01:00
Michael Kaufmann
53e8ccbccb added 'deactivated' parameter to EmailAccounts.update() so admins can disable individual email-accounts, will be overridden if customer is deactivatd and re-enabled; fixes #921
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-03-03 10:59:16 +01:00
Michael Kaufmann
6d8fc215f1 add description field to panel_domains and mail_virtual table, API parameter 'description' for Domains.add()/Domains.update() and Email.add()/Emails.update(); fixes #910
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-03-03 10:25:42 +01:00
Michael Kaufmann
f94c303cb3 add API parameter 'show_usages' for Customers.listing() and Customers.get() to return number of domains, and diskspaced used split into webspace_used, mailspace_used and dbspace_used; fixes #912
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-03-03 09:50:30 +01:00
Michael Kaufmann
2be1873354 fix frontend issue with displaying correct options in domain listing when using php8, thx to cscholz
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-02-24 19:56:26 +01:00
Michael Kaufmann
d1d36c32fe Merge pull request #920 from RipClaw2971/patch-1
lowercase domain names for ssl-certificate file check (fallback)
2021-02-24 13:07:26 +01:00
RipClaw2971
3b3527348f Update AcmeSh.php
Renewed certificates are not recognized if the domain is in upper/lower case.
2021-02-24 13:00:31 +01:00
Michael Kaufmann
036d5f0713 Merge pull request #919 from nachtgeist/soa
dns: make mail address of SOA records configurable
2021-02-21 18:27:57 +01:00
Daniel Reichelt
a1b8807b0f dns: make mail address of SOA records configurable 2021-02-21 13:00:30 +01:00
Michael Kaufmann
356a087b6a Merge pull request #918 from nachtgeist/pns
dns: check NS entry to be used as primary NS
2021-02-21 09:14:37 +01:00
Michael Kaufmann
0a77fd7150 Merge pull request #917 from nachtgeist/pw
system: validatePassword(): also quote the delimiter ('/')
2021-02-21 09:13:02 +01:00
Daniel Reichelt
67d67a287f system: validatePassword(): also quote the delimiter ('/')
Quoting the default regex delimiter is required for the password
complexity check to work if '/' had been specified as special character
in Froxlor's account settings.
2021-02-21 02:33:46 +01:00
Daniel Reichelt
1f792466bf dns: check NS entry to be used as primary NS
Don't just blindly use the first custom NS entry for SOA, actually check
if it pertains to the domain in question
2021-02-21 02:33:23 +01:00
Michael Kaufmann
5a6343b47c php8 compatibility, fixes #916
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-02-16 12:38:01 +01:00
Michael Kaufmann
841c529107 fix check for required firstname/name/company in Customers.update(), fixes #915
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-02-15 23:26:18 +01:00
Michael Kaufmann
41c3f21f0b list only phpenabled and http-enabled domains in php-configuration overview; fixes #911
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-02-11 16:16:04 +01:00
Michael Kaufmann
b8c0688ba0 added possibility to use 'in' sql-operation in sql_where parameter for Api-calls; php-8 compat fix in admin_traffic
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-02-11 12:09:42 +01:00
Michael Kaufmann
24e02e99fb set version to 0.10.24 for upcoming maintenance release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-02-05 15:46:08 +01:00
Michael Kaufmann
97bb7b6227 add filecontent to allowed form-fields to not be escaped
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-02-05 15:44:49 +01:00
Michael Kaufmann
5ceddc8c65 remove not (yet) used cli script
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-02-05 15:42:38 +01:00
Michael Kaufmann
3a17d03796 add option to specify (optional) fileextension/suffix for generated dkim-private keys; fixes #907
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-01-20 12:12:41 +01:00
Michael Kaufmann
57ae195930 for percentage calculation always use bytes so we don't compare KiB with GiB or similar
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-01-18 21:22:29 +01:00
Michael Kaufmann
9b86d576fa do not display usages on dashboard in fixed size-units but dynamically adjusted
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-01-18 20:49:55 +01:00
Michael Kaufmann
02a12eda13 add missing field 'include_default_vhostconf' to settings table for new installations
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-01-16 10:50:49 +01:00
Michael Kaufmann
a31da97d66 exclude some formfields from xss-cleaning as it could alter the wanted content
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-01-13 10:14:51 +01:00
Michael Kaufmann
9f13aa9a12 only pass binding variable for prepared sql statement if variable exists
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-01-13 08:52:00 +01:00
Michael Kaufmann
2841051649 correctly read in domain's ssl-ips for CAA entries if enabled, fixes #903
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-01-12 21:08:10 +01:00
Michael Kaufmann
acfbf55d15 Check return of validateFormField() just for non-falsey values and not expect boolean data-type; fixes #904
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-01-12 19:17:38 +01:00
Michael Kaufmann
5848df28fd Merge pull request #902 from bashgeek/master
Put in trailing slash to /awstats/ location in nginx config
2021-01-12 12:25:22 +01:00
Michael Kaufmann
21925f48c3 set minimum required php-version to 7.1 and recommended php-version to 7.4
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2021-01-06 13:36:35 +01:00
Daniel
17a64c58c2 Put in a trailing "/" for /awstats/ location 2020-12-31 16:01:42 +08:00
Daniel
0ca38cff31 Merge pull request #1 from Froxlor/master
up
2020-12-31 15:59:07 +08:00
Michael Kaufmann
5efc1849b4 fix hide-incompatible-settings feature
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-12-30 17:16:15 +01:00
Michael Kaufmann
f213d666e2 fix typo
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-12-30 16:46:01 +01:00
Michael Kaufmann
78495b6487 update link to perl-fastcgi wiki on nginx.com; added setting to hide incompatible settings (depending on webserver)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-12-30 16:41:26 +01:00
Michael Kaufmann
ab1c76e104 set version to 0.10.23.1 for bugfix release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-12-28 19:48:31 +01:00
Michael Kaufmann
a671223823 corrected too few arguments to function Froxlor\Cron\Traffic\TrafficCron::callAwstatsGetTraffic(); fixes #901
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-12-28 19:43:40 +01:00
Michael Kaufmann
3a99e10296 set version to 0.10.23 for upcoming maintenance release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-12-28 11:09:56 +01:00
Michael Kaufmann
38031aaff9 add missing return-code in DomainZones.add which messes up the error handling when using API
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-12-23 13:42:36 +01:00
Michael Kaufmann
65773bce57 automatically set php-fpm default config to php-version that is used for the installation to avoid confusion
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-12-21 17:15:02 +01:00
Michael Kaufmann
ee5de56a94 also validate existence of ssl-key file in vhost generation
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-12-10 09:47:58 +01:00
Michael Kaufmann
aba97df9b2 added date-range parameters for Traffic.listing(), fixes #878
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-12-10 09:44:43 +01:00
Michael Kaufmann
79e670f797 trigger rebuild of cronjobs also if customer email is changed, fixes #896
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-12-10 09:41:35 +01:00
Michael Kaufmann
8670cb6742 Merge pull request #900 from heptalium/master
Protect only private keys and leave certificates world readable.
2020-12-10 09:29:51 +01:00
Michael Kaufmann
bde87950a5 fix optional parameters of phpErrHandler
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-11-27 14:07:01 +01:00
Jens Meißner
aa1d2ab01d Set certificate files explicitly world readable. 2020-11-24 17:38:49 +01:00
Jens Meißner
2a770a93b1 Protect only private keys and leave certificates world readable. 2020-11-23 20:32:24 +01:00
Michael Kaufmann
5b85a1c183 use Validate::validateEmail() also for PHPMailer::ValidateAddress() call
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-11-17 17:31:49 +01:00
Michael Kaufmann
caf8893558 use Validate::validateEmail() instead of pure filter_var
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-11-17 17:18:23 +01:00
Michael Kaufmann
a280461cf6 add unicode flag for filter-validate-email (>=php7.1)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-11-17 10:39:11 +01:00
Michael Kaufmann
455c655580 corrected validation of idn-tld's, fixes #899
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-11-14 11:59:46 +01:00
Michael Kaufmann
ecd707424f change example of dhparams.pem folder so it does not conflict with default ssl-certificates-folder which gets purged by froxlor regulary
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-11-13 13:01:19 +01:00
Michael Kaufmann
60fe330de1 Merge pull request #875 from negrusti/patch-2
Data integrity - remove default values from some columns
2020-11-12 09:01:03 +01:00
Michael Kaufmann
cdb871b82b fix delete_userfiles flag not being passed via webinterface email-address-overview
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-11-12 08:54:52 +01:00
Michael Kaufmann
35c4e3d1b9 set version to 0.10.22 for upcoming maintenance release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-11-06 14:47:20 +01:00
Michael Kaufmann
b3f82f0981 remove duplicate AXFR records as nameserver get added automatically in case they have also been added to the axfr list
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-11-01 21:00:27 +01:00
Michael Kaufmann
b1b68364be do not allow setting www as CNAME record if domain has automatic www-Alias enabled, fixes #895
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-10-31 16:16:05 +01:00
Michael Kaufmann
ea76ce8fcc secure requests; refs #893
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-10-31 15:57:59 +01:00
Michael Kaufmann
16eca628dd add Unittest for traffic-filtering by customer-name, refs #894
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-10-31 15:53:07 +01:00
Michael Kaufmann
6bf5eccc24 update dependencies and add voku\AntiXSS
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-10-31 15:50:16 +01:00
Michael Kaufmann
63d00cd453 forgot to add the language strings to the commit for avoid deletion of (super)admin
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-10-31 15:48:01 +01:00
Michael Kaufmann
c79cba26f3 avoid deletion of (super)admin with id 1 due to fallbacks in the code using it; fixes #886
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-10-31 10:02:11 +01:00
Michael Kaufmann
36eb3cc1aa [domainbulk] remove reqiurement for customer-select in webinterface as it is an API-parameter
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-10-31 09:45:50 +01:00
Michael Kaufmann
15a13a7783 append file-extension for dkim-private-keys as external tools may require it (rspamd e.g.); thx to rseffner for finding this
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-10-20 15:28:51 +02:00
Michael Kaufmann
816874872d make given documentroot of domain relative to customerroot of no absolute path if given; fixes #892
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-10-14 16:58:19 +02:00
Michael Kaufmann
0e8449f28d Merge pull request #891 from andlinger/patch-1
Fixed typo in contribution document
2020-10-14 14:26:48 +02:00
Michael Kaufmann
3dcbbb9e7b do not set description to empty value if not passed as parameter as it is optionally; fixes #890
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-10-14 14:25:23 +02:00
David Andlinger
5ab9e6865d fixed typo 2020-10-14 14:17:37 +02:00
Michael Kaufmann
3a47b2050e fix awstats/webalizer directory protection when using nginx; fixes #888
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-10-13 20:18:44 +02:00
Michael Kaufmann
907c475361 create quotatallies entry if it not exists, fixes #885; correction in api-doc for Ftps.update ftp_password parameter, fixes #889
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-10-13 19:52:29 +02:00
Michael Kaufmann
0dfb4bdcdb list dns entries after add/delete action handling so the table of entries always shows the current state withouth reloading the page; fixes #887
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-10-12 09:50:48 +02:00
Michael Kaufmann
a5dc7b93a2 unify customerid/loginname api-parameter-descriptions; fixes #883
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-10-05 19:59:02 +02:00
Michael Kaufmann
244d2823a6 Merge pull request #882 from heavygale/patch-3
Fix for notices "Trying to access array offset on value of type bool" in ReportsCron.php
2020-10-03 13:10:40 +02:00
heavygale
2f0251bb19 Fix for "Trying to access array offset on value of type bool"
Proper check for success of query before accessing the result array. This notices occures if there's no custom mail-template for trafficmaxpercent_subject or trafficmaxpercent_mailbody for the required language.
2020-10-03 12:55:14 +02:00
Michael Kaufmann
a37d795ff3 set version to 0.10.21 for maintenance release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-10-02 18:01:53 +02:00
Michael Kaufmann
d9331cca61 check for fallback of ssl-certificate in ips/ports correctly of lets encrypt is used
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-09-18 11:49:26 +02:00
Michael Kaufmann
f169129e27 remove obsolete/unused table
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-09-07 21:53:18 +02:00
Michael Kaufmann
746548492b output traffic values correctly when not using bcmath and kind of fix wrong unit display on mouseover, fixes #425
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-09-07 21:51:24 +02:00
Michael Kaufmann
4ad8b62576 for ssl-fallback-check not only check for empty value but also for existence of certificate, thx to df8oe
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-09-06 14:12:25 +02:00
Michael Kaufmann
1eed3d1166 remove underscore from dkim-selector when creating the certificates too, refs #619
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-08-13 09:04:58 +02:00
Michael Kaufmann
6a32720c9a remove underscore from dkim-selector in the output certificate files too as (old) dkim-filter read the selector from this filename; refs #619
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-08-09 10:54:22 +02:00
Michael Kaufmann
e389ae4bf8 setting version to 0.10.20 for upcoming maintenance release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-08-07 19:43:16 +02:00
Michael Kaufmann
970ecb469e use overridden limit_extensions and idle_timeout in vhost config when using fpm and not mod_proxy
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-08-07 17:16:56 +02:00
Grigory Morozov
92b6914610 Update froxlor.sql
Data integrity - under no circumstances the empty string is a valid value for these fields
2020-08-07 21:58:06 +07:00
Michael Kaufmann
7e57352bc0 remove underscore from dkim-selector, refs #619
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-07-30 07:59:22 +02:00
Michael Kaufmann
e3d42a3f62 show current count of results besides total count in listings, fixes #869
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-07-29 08:46:50 +02:00
Michael Kaufmann
456a287621 fix missing query-parameters for IpsAndPorts.listing() when using sql_search
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-07-29 08:36:55 +02:00
Michael Kaufmann
eff630da8d unset any limit as we do not have pagination when showing search-results, refs #869
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-07-29 08:28:04 +02:00
Michael Kaufmann
aa45a0302e fix permanent rebuilding of vhost configs, refs 0af655f106
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-07-29 08:23:49 +02:00
Michael Kaufmann
aa14487995 update jquery library, fixes #872
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-07-28 13:28:47 +02:00
Michael Kaufmann
10b52486b5 ups, forgot to save the file so it's missing a critical return :P
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-07-25 17:28:46 +02:00
Michael Kaufmann
0af655f106 fix permanent rebuilding of vhost configs due to always-true renew check of let's encrypt certificates
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-07-25 17:21:52 +02:00
Michael Kaufmann
665c87cca7 fix index on longtext field which is not working due to unknown length; fixes #868
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-07-25 17:21:13 +02:00
Michael Kaufmann
1c50838d37 Merge pull request #871 from tczaude/master
issue 868 : Add new performance indexes
2020-07-24 20:37:26 +02:00
tczaude
ac5bc78e12 fix showUpdateStep 2020-07-24 19:32:04 +02:00
tczaude
a5e6ef674f issue 868 : Add new performerce indexes 2020-07-24 14:35:55 +02:00
Michael Kaufmann
03bc94e69c insert task to sync certificates for all cases (issue and renew)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-07-07 12:10:40 +02:00
Michael Kaufmann
37176c94a1 set version to 0.10.19 for upcoming release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-07-03 14:12:48 +02:00
Michael Kaufmann
a141c83ad4 do not call strtotime on the validTo_time_t key of cert_data as it already is an UNIX-timestamp, refs #865
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-06-23 20:35:50 +02:00
Michael Kaufmann
7c3ff95d22 check for possible CNAME overrides of A/AAAA record in dns-editor, fixes #864
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-06-23 09:39:00 +02:00
Michael Kaufmann
d653f6842f check for acme.sh upgrade on every run; fix not running --install-cronjob without having an issue command
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-06-21 19:50:46 +02:00
Michael Kaufmann
35a69fbfe0 add missing parmeter customerid for SubDomains.delete() which is required when called as admin; fixes #862
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-06-18 13:05:17 +02:00
Michael Kaufmann
e733701459 trigger removal cronjob of lets encrypt certificate via acme.sh also when domain update removes letsencrypt flag from domain
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-06-17 14:09:26 +02:00
Michael Kaufmann
70677fced2 fix double-adding of _ecc to certificate folder when deleting let's encrypt certificate
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-06-17 12:08:54 +02:00
Michael Kaufmann
daa223ed42 return full domain object on Domains.update() call, fixes #861
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-06-17 09:29:02 +02:00
Michael Kaufmann
0398f4cdba set version to 0.10.18 for upcoming release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-06-12 15:17:09 +02:00
Michael Kaufmann
1a0953e77e fix typo in response status message, fixes #858
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-06-08 11:42:44 +02:00
Michael Kaufmann
490704f8e1 Heredoc/nowdoc with an indented closing marker is not supported in PHP 7.2 or earlier.
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-06-06 20:57:24 +02:00
Michael Kaufmann
2748f1b633 also display error when domain does not resolv to any A or AAAA record in lets-encrypt-dns-validation
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-06-06 15:37:06 +02:00
Michael Kaufmann
8e60c6b201 update api documentation for Ftps.update(), fixes #857
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-06-05 16:23:41 +02:00
Michael Kaufmann
d4716b2376 correct documentation for Customers.add(), fixes #856
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-06-05 15:33:49 +02:00
Michael Kaufmann
2c98fc4c2d fix wrong certificate folder for fallback ceck (ecc/non-ecc)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-06-04 07:42:13 +02:00
Michael Kaufmann
65e1f633ef Merge pull request #855 from daxara/detect_distr
Auto detection in CLI & checks
2020-05-31 20:59:26 +02:00
Ante de Baas
ed4dbba278 also perform checks in Install class 2020-05-31 20:46:27 +02:00
Ante de Baas
1a6082ca91 complete if statement 2020-05-31 20:36:52 +02:00
Ante de Baas
da1d94149a saet defaults and do some checks 2020-05-31 20:34:47 +02:00
Ante de Baas
e7cfceb65d add comment 2020-05-31 20:18:37 +02:00
Ante de Baas
1f48ca4711 autodeterct distribution in CLI 2020-05-31 20:10:07 +02:00
Michael Kaufmann
fe0fb8dd5f fix non-static method called statically in \Froxlor\FileDir
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-05-31 16:38:53 +02:00
Michael Kaufmann
4a5ab7d95d Merge pull request #854 from daxara/detect_distr
fix bugs in dist detection
2020-05-31 16:36:52 +02:00
Ante de Baas
0d44adf265 fix bugs is dist detection 2020-05-31 16:00:50 +02:00
Michael Kaufmann
0b63b4e110 Merge pull request #853 from daxara/centos7
[centos7] proftp requires epel, awstats needs install and awstats cron moved
2020-05-31 15:02:57 +02:00
Michael Kaufmann
ba7e9688c5 Merge pull request #852 from daxara/centos8
Centos8 config updated
2020-05-31 15:02:31 +02:00
Ante de Baas
443ae1df68 proftp requires epel, awstats needs install and awstats cron moved 2020-05-31 14:57:07 +02:00
Ante de Baas
b59aa6f140 undo dnf -y 2020-05-31 14:28:37 +02:00
Ante de Baas
4e9df61fef awstats cron is moved to cron.hourly 2020-05-31 13:15:55 +02:00
Ante de Baas
b350815aa0 install awstats and requirements 2020-05-31 13:11:58 +02:00
Ante de Baas
b672c722b9 no user interaction on package installation 2020-05-31 13:05:52 +02:00
Ante de Baas
db60606cfa proftpd requires epel 2020-05-31 12:52:31 +02:00
Ante de Baas
2524491883 centos8 uses 'dandified yum' 2020-05-31 12:47:28 +02:00
Ante de Baas
de061e7e36 add missing apacheconf_htpasswddir dir 2020-05-31 12:46:33 +02:00
Michael Kaufmann
9ecd182a91 Merge pull request #851 from daxara/master
rename rhel7 to centos7 for consistency
2020-05-31 11:26:12 +02:00
Ante de Baas
a7934bcb7b rename rhel7 to centos7 for consistancy 2020-05-31 11:17:43 +02:00
Michael Kaufmann
9dc2c09da7 Merge pull request #850 from daxara/rhel8
Add CentOS 8 configuration-templates
2020-05-31 09:30:51 +02:00
Michael Kaufmann
b23e4a4d85 Merge pull request #849 from daxara/detect_distr
Detect distribution upon installation and set setting-defaults (if any) for that distribution
2020-05-31 09:29:42 +02:00
Michael Kaufmann
394ec4cd4a fix ecc certificate paths
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-05-31 09:13:22 +02:00
Ante de Baas
6ccfb7efbb remove old code 2020-05-30 10:10:57 +02:00
Ante de Baas
1454d8d40f get defaults from configparser 2020-05-30 10:08:05 +02:00
Ante de Baas
0fde1ce7e9 remove dev comment 2020-05-30 09:15:15 +02:00
Ante de Baas
86155f7a9c use Distribution in german language 2020-05-30 09:11:43 +02:00
Ante de Baas
60578a5d31 rename to CentOS because its most likely to be used 2020-05-29 17:46:38 +02:00
Ante de Baas
7fcacb4637 rename to centos because its most likey to be used 2020-05-29 17:45:37 +02:00
Ante de Baas
fb35fb9a3a read distribution from xml and selection via selectbox 2020-05-29 17:33:48 +02:00
Ante de Baas
6128954231 rename propery to property 2020-05-29 15:54:37 +02:00
Ante de Baas
f4d4490d08 change property tagnames 2020-05-29 15:45:04 +02:00
Ante de Baas
27f0c4eb53 remove distribution names from language files 2020-05-29 15:42:38 +02:00
Ante de Baas
cb1df3a7e0 show failue as nice red message 2020-05-29 15:29:53 +02:00
Ante de Baas
a572ac3914 add rhel8 config file 2020-05-29 15:10:06 +02:00
Ante de Baas
498ff15e98 add redhat defaults 2020-05-29 14:59:48 +02:00
Ante de Baas
022ed1a9a8 add setting defaults per distribution when given 2020-05-29 14:59:40 +02:00
Ante de Baas
814339cc73 Merge branch 'master' into detect_distr 2020-05-29 13:54:36 +02:00
Ante de Baas
0bb48a3cdf fix nginx capitalisation. 2020-05-29 13:45:46 +02:00
Ante de Baas
67d74406bd add os distribution detection 2020-05-29 13:36:31 +02:00
Michael Kaufmann
d73d8da2fd read certificate data folder from acme.sh.env file, fixes #846
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-05-28 20:08:49 +02:00
Michael Kaufmann
3c7bdcb5e0 Merge pull request #847 from Froxlor/dependabot/composer/phpmailer/phpmailer-6.1.6
Bump phpmailer/phpmailer from 6.1.4 to 6.1.6
2020-05-28 10:47:26 +02:00
dependabot[bot]
c6ac73f74f Bump phpmailer/phpmailer from 6.1.4 to 6.1.6
Bumps [phpmailer/phpmailer](https://github.com/PHPMailer/PHPMailer) from 6.1.4 to 6.1.6.
- [Release notes](https://github.com/PHPMailer/PHPMailer/releases)
- [Changelog](https://github.com/PHPMailer/PHPMailer/blob/master/changelog.md)
- [Commits](https://github.com/PHPMailer/PHPMailer/compare/v6.1.4...v6.1.6)

Signed-off-by: dependabot[bot] <support@github.com>
2020-05-27 17:01:04 +00:00
Michael Kaufmann
fdcb294244 Merge pull request #844 from daxara/dns_rhel7
Named DNS for RHEL7
2020-05-25 22:02:40 +02:00
Ante de Baas
8898c7c165 add named dns config 2020-05-25 21:38:58 +02:00
Michael Kaufmann
d4c0acb353 Merge pull request #843 from rubo77/usage
show disk-usage also on unlimited accounts
2020-05-25 09:28:37 +02:00
Ruben Barkow-Kuder
9ea32b69cb show disk-usage also on unlimited accounts
Signed-off-by: Ruben Barkow-Kuder <github@r.z11.de>
2020-05-25 03:14:38 +02:00
Michael Kaufmann
0524c70d2b add config-templates for ubuntu focal (partly tested only for now)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-05-24 12:16:17 +02:00
Michael Kaufmann
6ca7920147 fix missing language files in config-services cli script; set ubuntu xenial deprecated, remove Ubuntu trusty; fix a2dismod command in buster config-template as php7.3 is default
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-05-24 11:55:20 +02:00
Michael Kaufmann
65b2e4efa7 do not check for mariadb.sys user on mariadb-10.4 when testing with travis
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-05-23 21:17:43 +02:00
Michael Kaufmann
7000fd2c30 Merge pull request #841 from rubo77/patch-1
Don't suggest php5 during update as default
2020-05-23 21:16:39 +02:00
Ruben Barkow-Kuder
3b1ff03b33 Don't suggest php5 during update as default 2020-05-23 20:12:27 +02:00
Michael Kaufmann
ffa9205f95 fix sql query to remove duplicates before setting unique key in updater, fixes #840
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-05-18 20:48:56 +02:00
Michael Kaufmann
bc73ed0c75 adjust tls default value to tlsv1.2; refs #839
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-05-18 20:48:04 +02:00
Michael Kaufmann
17fd350d33 Merge pull request #839 from negrusti/patch-2
TLSv1 is deprecated
2020-05-18 20:07:30 +02:00
Grigory Morozov
c2e57dfd60 TLSv1 is deprecated 2020-05-18 05:18:42 +07:00
Michael Kaufmann
50f2047da3 set version to 0.10.17 for upcoming maintenance release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-05-15 20:35:25 +02:00
Michael Kaufmann
ecb9470b65 fix including of language-strings in reports-cron, fixes #836
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-05-15 15:16:24 +02:00
Michael Kaufmann
6d90b5ba80 remove leftover GROUP BY from testing
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-05-15 09:56:24 +02:00
Michael Kaufmann
eb3590dc34 add unique-key domainid to domain_ssl_settings table
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-05-15 09:49:53 +02:00
Michael Kaufmann
bddf9b496c enable internal api-call to bypass customer_hide_options check in certain situations where it is needed, fixes #803
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-05-15 09:35:20 +02:00
Michael Kaufmann
edc702dafa check for required min version of php every time (frontend and cron), fixes #833
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-05-08 10:03:01 +02:00
Michael Kaufmann
85dfc1030a Merge pull request #832 from RipClaw2971/bugfix
Certificate file cannot be read to database
2020-05-04 16:11:42 +02:00
Andreas Grundler
c0dd432916 Certificate file cannot be read to database if the domain contains capital letters. 2020-05-04 12:08:20 +02:00
Michael Kaufmann
b3db4dd887 set version to 0.10.16 for upcoming release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-05-01 16:27:23 +02:00
Michael Kaufmann
14413a3e8d try to fix travis irc notifications again
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-04-30 20:10:52 +02:00
Michael Kaufmann
a02a081c6b try to fix travis irc notifications
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-04-30 20:03:54 +02:00
Michael Kaufmann
43070e4808 remove possible trailing slash of apache DocumentRoot diretives as sugggested by the httpd-docs, thx to jonbert
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-04-30 19:49:20 +02:00
Michael Kaufmann
98c636c282 let send-to-alternative-email be optional if no address is given instead of displaying error that the email address is invalid; fixes #829
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-04-30 13:03:19 +02:00
Michael Kaufmann
8dace6eca5 remove special characters from name when generating extrausers file
add froxlor hostname to 2fa-qrcode; refs #814

Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-04-28 07:59:37 +02:00
Michael Kaufmann
78fc4f84b2 add optional dns validation for let's encrypt activated domains; fixes #817
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-04-14 10:28:33 +02:00
Michael Kaufmann
9018404faa Double check whether installation of acme.sh worked when not installed yet and do not continue if not; fixes #823
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-04-14 08:10:36 +02:00
Michael Kaufmann
8bdd843bd9 fix renew of froxlors own letsencrypt certificate; fix only variables should be passed by reference in BackupCron; fix possible notice or double inclusion of language file in ReportsCron
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-04-08 09:07:48 +02:00
Michael Kaufmann
0d35f5cb29 restructure acmesh implementation and let acme.sh take care of renewing the certificates itself; fixes #792, fixes #816
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-04-04 18:04:39 +02:00
Michael Kaufmann
6815c1c20b Merge pull request #821 from chrschn/master
Fix renewal of ECC/ECDSA certificates.
2020-03-29 23:52:34 +02:00
Christian Schneider
048e6c13ae Fix renewal of ECC/ECDSA certificates.
The ACME v2 implementation uses separate directoies for ECC and on-ECC
certificates. The renew command for a domain checks if an ECC directory
exists (having a "_ecc" suffix) and refuses the command unless the
"--ecc" flag was specified.

Confusingly, this flag is only required to *renew* an ECC certificate,
but not to issue it.

This fixes https://github.com/Froxlor/Froxlor/issues/820.
2020-03-29 22:36:26 +02:00
Michael Kaufmann
aedb829a74 Merge pull request #819 from HBerni/hberni-p0002
fixed parsing due to changes in dovecots default mail_log_prefix
2020-03-21 17:36:00 +01:00
HBerni
4745581720 fixed parsing due to changes in dovecots default mail_log_prefix
regex supports old and new default format now
(see https://wiki2.dovecot.org/Upgrading/2.3)
2020-03-21 16:39:01 +01:00
Michael Kaufmann
489ccbe07a fix removing ip address if ip is set as system-ipaddress but there are other entries of that ip with a different port
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-03-12 07:01:26 +01:00
Michael Kaufmann
a46e7a3bc4 set correct umask to create user config in installation
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-03-10 07:48:35 +01:00
Michael Kaufmann
a4431e25d3 remove ssl-certificates connected to domains that are being deleted when deleting a customer; fixes #818
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-03-10 07:36:22 +01:00
Michael Kaufmann
1fe9f1e9d6 fix language strings for cron cmdline setting and fallback to php binary if no setting is found
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-03-08 10:30:33 +01:00
Michael Kaufmann
13767df562 set version to 0.10.15 for bugfix release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-03-08 07:39:39 +01:00
Michael Kaufmann
02c5f80854 correct chmod value for userdata.inc.php file to be written on installation; fixes #815
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-03-08 07:35:19 +01:00
Michael Kaufmann
d7550ae58a fix deactivated check in api
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-03-06 22:10:01 +01:00
Michael Kaufmann
cf2c7fa31c deny api access to deactivated users with valid api-key
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-03-06 22:03:41 +01:00
Michael Kaufmann
32b6285589 set version to 0.10.14 for upcoming release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-03-06 20:47:20 +01:00
Michael Kaufmann
7e361274c5 forgot one escapeshellarg() and enhanced security on userdata.inc.php creation when installing
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-03-06 20:44:17 +01:00
Michael Kaufmann
62ce21c9ec secure shell-execution of mysqldump on installation if given database-name exists
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-03-04 19:35:57 +01:00
Michael Kaufmann
6b09720ef8 use unpredictable tmpfile-name in installation if lib/userdata.inc.php cannot be written due to permission
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-03-04 19:34:18 +01:00
Michael Kaufmann
8807ae7dad allow private ip ranges in ips-and-ports as some configurations require that; fixes #802
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-03-02 09:51:44 +01:00
Michael Kaufmann
5f3f208534 remove superfluous comma in sql query which causes invalid sql
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-03-01 09:16:47 +01:00
Michael Kaufmann
f11ceacf89 store ace-string of domain besides idn-converted string to have correct sorting in the frontend; fixes #809
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-02-29 09:50:29 +01:00
Michael Kaufmann
26e43077c2 make customer firstname,name,company and customer-no available for all templates; fixes #808
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-02-29 08:16:55 +01:00
Michael Kaufmann
d6c8b92523 add Froxlor.integrityCheck() API call to externally run integrity/consistency check, fixes #801
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-02-15 07:30:56 +01:00
Michael Kaufmann
03450dcfa2 fix listing of customer email addresses if 'domain' section is hidden via settings, fixes #803
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-02-15 07:25:23 +01:00
Michael Kaufmann
f39aab6f32 disable sslsessiontickets-option in domain-add/edit if globally disabled in the settings
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-02-15 07:11:28 +01:00
Michael Kaufmann
7f999302fa do not require enabled vhost-container for froxlor-vhost to change sslsessiontickets-setting
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-02-14 19:26:06 +01:00
Michael Kaufmann
8294985588 require set password complexity for admins too when resetting password; display correct error message if password complexity is not satisfied
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-02-08 10:03:41 +01:00
Michael Kaufmann
a7653551b2 set version to 0.10.13 for upcoming maintenance release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-02-07 16:37:06 +01:00
Michael Kaufmann
734c02e33f update php-fpm defaults; update paths for current stable php-7.3; read froxlor default php.ini from file rather then using phpconfig with id=1; fixes #796
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-01-31 13:17:49 +01:00
Michael Kaufmann
ace18cb7c9 use correct default-versions for configuration-step to disable mod_php for debian buster and ubuntu bionic
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-01-31 12:58:04 +01:00
Michael Kaufmann
1270204cd9 fix wrongly initialized resource-usage when re-calculating it; fixes #797
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-01-31 09:49:29 +01:00
Michael Kaufmann
2831923708 Merge pull request #795 from lpedretti/master
Fixed the case that the spf record is not inserted with it's quotes, and so the condition fails and 2 spf records are inserted in the domain
2020-01-24 16:58:10 +01:00
Leonardo Pedretti
6b1ae648b4 Fixed the case that the spf record is not inserted with it's quotes, and so the condition fails and 2 spf records are inserted in the domain 2020-01-23 11:59:28 -03:00
Michael Kaufmann
6c43f1bc56 fix Domains.update() if called as admin/reseller without change_serversettings privileges, thx to rseffner
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-01-22 09:14:07 +01:00
Michael Kaufmann
2e273a41b5 fix IpsAndPorts when checking for system.ipaddress in update() and delete()
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-01-19 10:45:48 +01:00
Michael Kaufmann
2004bbe38d dont access db result arrays directly without checking whether it's false due to an error (php7.4 related)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-01-19 10:13:28 +01:00
Michael Kaufmann
e44e07784f validate nameserver ip-addresses for binds allow-transfer block; fixes #791
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-01-19 10:08:06 +01:00
Michael Kaufmann
8d6275e1aa set version to 0.10.12 for upcoming maintenance release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-01-10 17:41:20 +01:00
Michael Kaufmann
f21d4f8770 when not using awstats, disable awstats-related settings; add minor tweaks to unit-tests
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-01-10 16:44:13 +01:00
Michael Kaufmann
fc97b4d4e9 Merge pull request #786 from patschi/logformat-awstats
Allow configuring awstats LogFormat
2020-01-10 16:32:33 +01:00
Patrik Kernstock
05051309c7 Merge branch 'master' into logformat-awstats 2020-01-09 23:24:26 +00:00
Patrik Kernstock
0f025a6627 Language file update
Signed-off-by: Patrik Kernstock <patrik@kernstock.net>
2020-01-09 23:21:11 +00:00
Michael Kaufmann
f6f5765b54 avoid settig more than one catchall address for one domain in Emails.update(), thx to mrairstone
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-01-09 14:45:51 +01:00
Michael Kaufmann
ac82aa80d2 correct logfiles_format migration; only needed if setting is non-empty
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-01-09 14:14:04 +01:00
Michael Kaufmann
57503d9c6e try to touch logfile from settings in order for is_writable to work correctly, thx to rubberduck
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-01-09 14:10:50 +01:00
Michael Kaufmann
f55ad16d82 Merge pull request #785 from patschi/logformat
Allow using more advanced webserver LogFormat
2020-01-09 09:16:03 +01:00
Patrik Kernstock
ea7834c1d1 Added small notice to lng for awstats LogFormat
Signed-off-by: Patrik Kernstock <patrik@kernstock.net>
2020-01-08 22:08:15 +00:00
Patrik Kernstock
b355711de9 Improvements as suggested by @d00p
Signed-off-by: Patrik Kernstock <patrik@kernstock.net>
2020-01-08 22:08:15 +00:00
Michael Kaufmann
a5287726a4 fix issue in PhpHelper::trimArray() returning an empty array, fixes #751
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-01-03 23:32:21 +01:00
Patrik Kernstock
b393c7d6e6 Merge branch 'master' into logformat 2020-01-03 22:32:45 +01:00
Michael Kaufmann
dd2782771a set version to 0.10.11 for upcoming maintenance release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-01-03 13:24:31 +01:00
Michael Kaufmann
25d0bbb766 switch from algo26-matthias/idna-covert to our own fork as we cannot update to >2.1 without having a minimum requirement for php-7.2 but we need a few fixes for php-7.4 support later on
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-01-03 12:48:01 +01:00
Michael Kaufmann
b4dedca3db Update README.md 2020-01-02 13:53:22 +01:00
Patrik Kernstock
09aed61dbf Merge branch 'master' into logformat-awstats 2020-01-02 12:44:35 +01:00
Patrik Kernstock
ca39501530 Fixed awstats_logformat field for new installs
Signed-off-by: Patrik Kernstock <patrik@kernstock.net>
2020-01-02 12:39:25 +01:00
Patrik Kernstock
28fd88e53e Merge branch 'master' into logformat 2020-01-02 12:31:51 +01:00
Michael Kaufmann
e01c2e02fb fix update query for new fpm-custom_config value, refs #783
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2020-01-02 12:28:48 +01:00
Michael Kaufmann
762bfae61a Merge pull request #783 from patschi/phpfpm-custom-settings
Ability to add custom config to PHPFPM version
2020-01-02 10:19:19 +01:00
Patrik Kernstock
a4d4e16efc Small comment added to escaping double-quote
Signed-off-by: Patrik Kernstock <patrik@kernstock.net>
2019-12-31 22:46:03 +01:00
Patrik Kernstock
7f83ad31f4 Fixed dbversion in SQL/Froxlor.php
Signed-off-by: Patrik Kernstock <patrik@kernstock.net>
2019-12-31 22:30:54 +01:00
Patrik Kernstock
e143ba4577 Allow configuring awstats LogFormat
Signed-off-by: Patrik Kernstock <patrik@kernstock.net>
2019-12-31 22:29:29 +01:00
Patrik Kernstock
6799a56ba1 Allow using more advanced LogFormat
Signed-off-by: Patrik Kernstock <patrik@kernstock.net>
2019-12-31 20:18:52 +01:00
Patrik Kernstock
484fe8acbc Fixed db_DBVERISON in Froxlor.php
Signed-off-by: Patrik Kernstock <patrik@kernstock.net>
2019-12-31 17:22:37 +01:00
Patrik Kernstock
550af5b943 Fixed german lng, fixed db_version in SQL
Signed-off-by: Patrik Kernstock <patrik@kernstock.net>
2019-12-31 17:18:17 +01:00
Patrik Kernstock
7ae59477af New update step, changed order of lang strings
Signed-off-by: Patrik Kernstock <patrik@kernstock.net>
2019-12-31 16:14:26 +01:00
Michael Kaufmann
acefa41806 Merge pull request #781 from patschi/accesslog-logtype
Use logtype for access_log for IPsAndPorts too
2019-12-31 16:01:42 +01:00
Patrik Kernstock
b39c8029cd Merge branch 'master' into phpfpm-custom-settings 2019-12-31 15:51:27 +01:00
Patrik Kernstock
69ff416361 Fixed SQL, minor comments/lng updates
Signed-off-by: Patrik Kernstock <patrik@kernstock.net>
2019-12-31 15:34:46 +01:00
Michael Kaufmann
3eb1718fe0 add option to disable SSL sessiontickets globally for older systems, fixes #784
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-12-31 12:27:35 +01:00
Michael Kaufmann
37c434d4fc testsystem does not listen on socket for mysql
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-12-31 09:29:09 +01:00
Michael Kaufmann
1eb14d7564 update composer-dependencies; add connection-test to Mysqls.update() when changing passwords; validate ssl-certificates to avoid private/public key mismatch and a failed webserver start, fixes #778
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-12-31 09:23:28 +01:00
Michael Kaufmann
1c17df69d2 Merge pull request #782 from patschi/fix-dhparams-indent
Fix dhparam indent
2019-12-31 08:11:40 +01:00
Patrik Kernstock
c61b3b73bd Ability to add custom config to PHPFPM version
Addresses #643

Signed-off-by: Patrik Kernstock <patrik@kernstock.net>
2019-12-31 05:48:36 +01:00
Patrik Kernstock
18c87baec8 Fix dhparam indent 2019-12-31 03:53:12 +01:00
Patrik Kernstock
631b2b59a5 Use logtype for access_log for IPsAndPorts too 2019-12-31 03:51:19 +01:00
Michael Kaufmann
1e0510a43d fix SysLog.delete(), SysLog.listing() and SysLog.listingCount() when called as admin/reseller withouth customers_see_all permission
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-12-21 15:12:51 +01:00
Michael Kaufmann
e62f675c4c apply 'notryfiles', 'writeaccesslog' and 'writeerrorlog' flags to subdomains when editing a domain
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-12-18 08:44:02 +01:00
Michael Kaufmann
fe389ab208 setting version to 0.10.10 for upcoming maintenance release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-12-13 16:23:43 +01:00
Michael Kaufmann
63d915804a lowercase domainnames when adding new (sub)domain to avoid issues with certificates on filesystem
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-12-11 20:12:51 +01:00
Michael Kaufmann
466c09137b add new 'ssl-enabled' flag for domains and subdomains so ssl can be deactivated (by a customer too) even if there are ssl-ip/ports assigned; introduce new honorcipherorder and sessiontickets flags for more control over ssl-related settings on a per domain base (admin only); fixes #767 and fixes #769
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-12-10 10:21:35 +01:00
Michael Kaufmann
3a738b7070 fix mysql8 issue with group by and sorting within; fixes #774
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-12-08 10:43:12 +01:00
Michael Kaufmann
5ee9d3064a add new API function Froxlor.generatePassword() to return a random password based on froxlor settings regarding min-length, included characters, etc.; fixes #768
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-12-06 11:51:40 +01:00
Michael Kaufmann
adb5c6734a set version to 0.10.9 for upcoming maintenance release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-12-06 10:20:01 +01:00
Michael Kaufmann
7dff46b63e set production Lets Encrypt endpoint as default in settings like the installation does; do nat-sorting only on username-related fields, fixes #765
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-12-05 07:52:11 +01:00
Michael Kaufmann
12883bafd6 check for valid result when reading database usage from information_schema; fixes #766
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-12-04 07:15:28 +01:00
Michael Kaufmann
c2b88200f0 Merge pull request #763 from RipClaw2971/bugfix
SQL error in lib/Froxlor/Api/Commands/Certificates.php
2019-11-29 19:52:13 +01:00
Andreas Grundler
634199780b Bugfix 2019-11-29 19:22:43 +01:00
Michael Kaufmann
e0275840ab set version to 0.10.8 for upcoming maintenance release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-29 17:14:02 +01:00
Michael Kaufmann
bae8c86901 fix removing of ssl-ip-relation to domain if no ssl-ip is selected via interface, thx to Patient Nr0
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-27 18:32:27 +01:00
Michael Kaufmann
e8be3ee643 use correct apiendpoint for lets encrypt; pass debug-flag onto acme.sh; fixes #762
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-27 07:42:23 +01:00
Michael Kaufmann
35ecdfa2f5 fix searching for alias-domains by link in customer_domains
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-24 12:52:25 +01:00
Michael Kaufmann
3e4a3ef4b0 fix duplicate domain entries in customer-domain-list when domain has aliases, thx to crazy4chrissi
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-24 11:33:10 +01:00
Michael Kaufmann
cdf02ceab6 set version to 0.10.7 for upcoming maintenance release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-22 16:14:13 +01:00
Michael Kaufmann
d24056c925 fix vhost-merging of specialsettings in nginx; fixes #757
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-22 16:12:11 +01:00
Michael Kaufmann
d2852fbd5d add new setting to set default value of domain-edit-setting 'Apply specialsettings to all subdomains' and 'Apply php-config to all subdomains'
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-22 16:10:27 +01:00
Michael Kaufmann
d76ebc7c06 fix sort-ordering parameter for pagination
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-20 13:08:36 +01:00
Michael Kaufmann
4fbaacb159 fix domain listing for admin-domains
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-20 12:20:20 +01:00
Michael Kaufmann
2d43a8714d let's try to fix the mysql-user-create/update issue, fingers crossed; refs #758
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-20 11:06:21 +01:00
Michael Kaufmann
620a22bf3e fix listing of subdomains for customers, fixes #759
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-20 09:33:28 +01:00
Michael Kaufmann
5e01018f30 fix typo in SysLog.delete(), thx to Wolfgang
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-18 14:47:56 +01:00
Michael Kaufmann
c84732a0cd fix issue when adding new database users with already-hashed passwords, refs #758
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-18 10:48:31 +01:00
Michael Kaufmann
dfce1fea3c re-add \Froxlor\UI\Paging as it's still required for api_keys.php because they are not (yet) listable via API
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-17 15:20:46 +01:00
Michael Kaufmann
e6dad6c6d0 Use authentication_string for mysql-5.7 and mysql-8 (not password-field) - let's see what happens
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-17 14:29:37 +01:00
Michael Kaufmann
605d2340d1 first unittest for mysql-users and their password, refs #758
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-17 13:42:35 +01:00
Michael Kaufmann
d5df4dd7a4 set version to 0.10.6 for upcoming maintenance release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-15 16:43:36 +01:00
Michael Kaufmann
57497bd03f if no ssl IP/port is selected when editing a domain within the webinterface, set the remove_ssl_ipandport parameter to true to not fallback to defaults
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-15 16:36:14 +01:00
Michael Kaufmann
1a3cc52188 fix parameters defaults for Domains.update() and add new parameter 'remove_ssl_ipandport' to clear ssl ip/port instead of defaulting to the current set value; fixes #756
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-15 15:11:24 +01:00
Michael Kaufmann
21f6874a61 check whether there actually is quota read for a user if newly created, thx again to J-BBB
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-15 12:58:28 +01:00
Michael Kaufmann
b34e66dfd6 fix install-dir replacement in configfiles, thx to J-BBB
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-15 08:02:46 +01:00
Michael Kaufmann
a77f890462 Merge branch 'master' of github.com:Froxlor/Froxlor 2019-11-15 07:20:38 +01:00
Michael Kaufmann
3cc5352c01 implement EmailForwarders.listing(); fixes #754
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-15 07:20:16 +01:00
Michael Kaufmann
d01d470119 Merge pull request #755 from danielrona/patch-1
enabled autofocus for 2fa_code
2019-11-14 12:58:18 +01:00
Daniel
a97ce74cc8 enabled autofocus for 2fa_code 2019-11-14 12:31:29 +01:00
Michael Kaufmann
fe7bfcc7c2 fix update of hosting plans via interface; fixes #753
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-13 15:28:08 +01:00
Michael Kaufmann
cff0ac72d0 optimize varchar fields in admin/customer table; fixes #752
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-13 08:57:53 +01:00
Michael Kaufmann
e8dcb29b69 keep searching code in ssl_certificates if something was searched and no results were returned, thx to Ithariel
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-12 12:53:38 +01:00
Michael Kaufmann
2b3b68efa3 remove testing code
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-12 08:17:54 +01:00
Michael Kaufmann
d937029bf7 implement [ApiModule].listing() in frontend-module as sorting/limiting/searching is now possible via API call (partly untested)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-10 18:35:32 +01:00
Michael Kaufmann
1955b5dd32 add task to remove certificate from acme.sh when removed in froxlor; fix issue when mode of certificate generation was not reset to 'issue' and kept trying to 'renew' instead
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-10 18:34:02 +01:00
Michael Kaufmann
c2a9880616 add new Api-Module 'SysLog' to query froxlor logs; set default value for api_allowed to the value of api.enabled setting when adding new customer via frontend to behave like Customers.add() API method
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-09 11:37:45 +01:00
Michael Kaufmann
dfedc478f7 check for given customer loginname/id before anything happens in Mysqls.add/update/delete when called as admin; fixes #749
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-07 15:53:30 +01:00
Michael Kaufmann
6efe500cee validate that the admin/reseller has customers in SubDomains.listing(); return all domain fields for admins/resellers in SubDomains.listing()
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-05 11:21:49 +01:00
Michael Kaufmann
9c3549c604 lowercase domain-names in AcmeSh implementation to avoid https://github.com/Neilpang/acme.sh/issues/2556
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-04 11:39:06 +01:00
Michael Kaufmann
50755f4399 set phpunit to fixed 8.4.1 in favor of https://github.com/sebastianbergmann/phpunit/issues/3793 to not break jenkins testing for now
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-02 13:26:38 +01:00
Michael Kaufmann
ef11ad8da7 fix broke count sql-queries
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-02 11:12:49 +01:00
Michael Kaufmann
1b2c186c07 introduce search, limit, offset and orderby possibilities for (almost) all API listing() functions; added listingCount() function in preparation to replace the old UI\Paging class later on
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-02 10:58:52 +01:00
Michael Kaufmann
b162324ff0 fix renew-check of let's encrypt implementation, set version to 0.10.5 for bugfix release; fixes #747
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-01 14:19:06 +01:00
Michael Kaufmann
6cd061d74c set version to 0.10.4 for upcoming maintenance release; minor code formatting + adjustments
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-01 11:16:13 +01:00
Michael Kaufmann
53b7420dc9 fix stripping of escape-sequences in api-endpoint; fixes #746
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-11-01 07:39:28 +01:00
Michael Kaufmann
aa85c648a3 check for renewal of certificates not only if there's a task to regenerate vhosts but everytime the letsencrypt cronjob runs (which is basically obsolete due to the integration into the tasks cron but perfect for checking renewal dates
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-31 21:37:54 +01:00
Michael Kaufmann
35e228ff09 Merge pull request #745 from pquerner/unittests/564
Add UnitTests for #679
2019-10-30 13:01:02 +01:00
Pascal
62236da496 changed method name 2019-10-30 12:50:16 +01:00
Pascal
e1cc896b6c add unit tests for Validate::is_ipv6 2019-10-30 12:39:56 +01:00
Pascal
36595baa65 Merge remote-tracking branch 'Froxlor/master' 2019-10-30 12:14:39 +01:00
Michael Kaufmann
ec3fd1d105 Create SECURITY.md 2019-10-30 11:00:08 +01:00
Michael Kaufmann
e39dcfbfe2 Update FUNDING.yml 2019-10-30 10:50:20 +01:00
Michael Kaufmann
ef6254b307 Merge pull request #679 from pquerner/#564
Allow CIDR and Netmask in mysql_host_access; fixes #564
2019-10-30 10:40:26 +01:00
Michael Kaufmann
44bf211ab5 Merge pull request #743 from kionez/fix_split_path_info
Correct fastcgi_split_path_info; fixes #744
2019-10-29 16:09:44 +01:00
kionez
b0e920104f Fix fastcgi_split_path_info as https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/ 2019-10-29 16:00:14 +01:00
kionez
299e201142 Fix fastcgi_split_path_info 2019-10-29 15:47:28 +01:00
Michael Kaufmann
46982ad2dc validate that a customer gets the default ftp account created even if the admin/reseller has no more resource for ftp accounts; fixes #741
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-29 07:52:00 +01:00
Michael Kaufmann
c0e07fd659 fix undefined variable in hosting-plans frontend, fixes #742
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-28 20:06:14 +01:00
Pascal
5c11eecbd7 remove code for checking ipv6 mapped ipv4 notation 2019-10-28 17:27:39 +01:00
Pascal
9689afc759 change method signature of \Froxlor\Validate\Validate::validate_ip2 2019-10-28 16:58:34 +01:00
Pascal
d76f4108e5 dont need $result if we're expecting an exception 2019-10-28 16:40:22 +01:00
Pascal
9c4d619840 remove inner if statement
check ipv6 when cidr>netmask flag is set
2019-10-28 16:32:52 +01:00
Pascal
7774e7606d dont check notated ips again 2019-10-28 16:29:53 +01:00
Pascal
2ed0cad27b #564:
cidr notation can only be 1 through 32
2019-10-28 16:27:54 +01:00
Pascal
686c2ae534 fix comparison 2019-10-28 16:00:43 +01:00
Pascal
faf3abe800 introduce new parameter to allow automatic convert cidr notation to netmask notation 2019-10-28 15:33:26 +01:00
Pascal
220b493a1b better readability 2019-10-28 14:16:27 +01:00
Pascal
e8d67f9711 check if ipv6 first 2019-10-28 14:07:31 +01:00
Pascal
83e932b068 switch join with implode 2019-10-28 13:26:32 +01:00
Pascal
84d1be538e block ipv6 addresses in cidr notation (mysql can't handle it) 2019-10-28 13:25:34 +01:00
Pascal
c97cdb1c0e make it more readable 2019-10-28 13:15:48 +01:00
Pascal
ffefe85fb4 Merge branch 'master' into #564 2019-10-28 12:18:55 +01:00
Pascal
27341ca490 Merge remote-tracking branch 'Froxlor/master' 2019-10-28 12:17:51 +01:00
Michael Kaufmann
822bb2bd4d fixed deletion of default-ftp-user possible via API (not through the interface though); refs #741
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-27 16:02:32 +01:00
Michael Kaufmann
88ee76e4c9 setting version to 0.10.3 for upcoming release
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2019-10-25 14:48:13 +02:00
Michael Kaufmann
90d921ebb5 preserve downward compatibility for 0.10.1 updaters regarding specialsettings for ssl-enabled domains; fixes #739
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2019-10-24 18:14:51 +02:00
Michael Kaufmann
7b162c4bd0 added tls-settings per domain for admins with change_serversettings-flag set; fixes #519
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2019-10-22 16:45:03 +02:00
Michael Kaufmann
32e2d48aed fallback to /tmp/froxlor.log if file-log is activated but no file given or not writeable; fixes #737
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2019-10-22 15:06:41 +02:00
Michael Kaufmann
1fdc524171 correct permissions
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2019-10-19 11:08:55 +02:00
Michael Kaufmann
4704798379 setting version to 0.10.2 for upcoming maintenance release
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2019-10-18 13:39:23 +02:00
Michael Kaufmann
e5c1e8350d set default_theme value in settings-array to 'Sparkle' as it is in install/froxlor.sql; improve language strings for adding php-configurations and fpm-versions
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2019-10-17 18:40:53 +02:00
Michael Kaufmann
f0b36c03ad fix registration and termination date to flip between empty-value and 0000-00-00, thx to dxd
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2019-10-17 09:35:33 +02:00
Michael Kaufmann
79056f20ee display API in the list of features the customer is allowed to use; display total diskspace used by customer (web, mail and mysql) on customers dashboard, fixes #733
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2019-10-16 12:44:23 +02:00
Michael Kaufmann
5d6aa4d2bb Merge pull request #732 from TimoStramann/patch-1
fixing typo
2019-10-16 06:32:13 +02:00
Timo Stramann
f803276ca2 fixing typo
wrong variable name
2019-10-16 00:11:30 +02:00
Michael Kaufmann
5cf2d32e8a reverse parameter for Domains.add() into so users have to explicitly pass the parameter if they do NOT want the default ssl-ip to be used if left empty, so it behaves like the non-ssl ipandport parameter - if left empty, the system default is being used, thx J-BBB
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2019-10-15 14:35:42 +02:00
Michael Kaufmann
9430f77c2e Setting system.leapiversion exists and just needs to be updated, no added
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-15 07:22:41 +02:00
Michael Kaufmann
302fe994b7 adjust ip/port settings for downward compatibility when adding new ssl-specialsettings related settings
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-14 14:26:13 +02:00
Michael Kaufmann
9b122bc003 order tasks by type descending to create bind and webserver configs at the end of the run; cleanUp configs files after creation of certificates to minimize downtime, thx to SCD for testing
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-14 13:56:55 +02:00
Michael Kaufmann
9410356bc7 fix output of acme command when upgrading
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-14 10:12:26 +02:00
Michael Kaufmann
5d5cc3dda3 fix array to string conversion
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-13 22:49:03 +02:00
Michael Kaufmann
a7ccb7007f add Unit-test for DomainZones.listing()
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-13 14:47:39 +02:00
Michael Kaufmann
5680c88da0 implement DomainZones.listing() to actually return custom stored dns entries for a given domain, fixes #731
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-13 14:40:04 +02:00
Michael Kaufmann
cf01a587c7 fix typo in updater
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-12 14:53:13 +02:00
Michael Kaufmann
b6367e1be1 forgot to add the ssl-default-vhostconf-domain fields in ipsandports
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-12 14:39:58 +02:00
Michael Kaufmann
93aa8bff1e add default-ssl-vhost settings and optionally allow including of non-ssl default-vhost settings, fixes #727
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-12 14:34:18 +02:00
Michael Kaufmann
15fa035dc4 check for minimum required php version in autoupdater
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-12 14:04:43 +02:00
Michael Kaufmann
057f4aaa10 Passing the and parameters in reverse order to implode has been deprecated since PHP 7.4
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-12 10:22:11 +02:00
Michael Kaufmann
f588927bc5 check for existence of certificate files created by acme.sh
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-12 08:17:04 +02:00
Michael Kaufmann
03d2a76dd0 clean up language and code for dropped let's encrypt ACMEv1 support
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-11 20:53:34 +02:00
Michael Kaufmann
0d0e557715 force Let's Encrypt ACMEv2 API, fixed #728
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-11 18:17:05 +02:00
Michael Kaufmann
fb54b887f2 remove unneeded apihelp-page code in admin/customer_index; set explicit version to api-doc URL; check for acme.sh cronjob and uninstall it, as froxlor manages that itself
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-10 16:42:32 +02:00
Michael Kaufmann
9167608794 set version to 0.10.1 for maintenance release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-10 14:55:45 +02:00
Michael Kaufmann
050af61082 show success in updater when there are no more old files to delete and exec() is disallowed (showed empty list)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-09 12:05:04 +02:00
Michael Kaufmann
2c23431daf show on API keys page wether api access is allowed
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-09 11:52:55 +02:00
Michael Kaufmann
4543c73b4f add possibility to enable/disable api access on a per user base
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-09 11:43:22 +02:00
Michael Kaufmann
88d85fc02e fix curly bracket array access (deprecated)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-09 07:59:38 +02:00
Michael Kaufmann
6102fabcb6 allow setting http2 flag for (sub)domains in customer view, fixes #725
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-09 07:59:11 +02:00
Michael Kaufmann
d7a7412973 Merge pull request #724 from kionez/add-ssl-expirationdate
Add expiration date to SSL certificates loaded via API request, fixes #723
2019-10-08 18:59:27 +02:00
kionez
1b3029b826 Fix typo 2019-10-08 18:50:10 +02:00
Michael Kaufmann
26cb53c8fb correctly validate that a domain has not a certificate in Certificates.add(), refs #722
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-08 18:44:42 +02:00
Michael Kaufmann
b4999fcc83 Throw exception if domain used to call Certificates.get() does not have a certificate, fixes #722
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-08 18:01:59 +02:00
kionez
05f602d457 Fix for null expiration date and coding style 2019-10-08 17:44:41 +02:00
Michael Kaufmann
89b95d61d2 return empty array in FroxlorAPI.php example class if last call was unsuccessful, fixes #722
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-08 17:36:42 +02:00
kionez
9ec03bade7 Add expiration date to SSL certificates loaded via API request 2019-10-08 17:32:03 +02:00
Michael Kaufmann
20699a15a6 update composer dependencies
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-08 12:54:15 +02:00
Michael Kaufmann
9b8a6e7e67 more php-7.4 compatibility
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-08 12:38:22 +02:00
Michael Kaufmann
3a8d5a9517 correct Mysql.add phpDoc to produce correct api-doc, fixes #721
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-08 12:11:00 +02:00
Michael Kaufmann
557b28a69d more php-7.4 compatibility
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-08 12:08:36 +02:00
Michael Kaufmann
0f1c5506e2 do not create username@domain ftp user if the default-ftp-user is being created in Ftps.add, fixes #720
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-08 12:04:10 +02:00
Michael Kaufmann
c6a93fa336 fix possible php-7.4 notice 'Trying to access array offset on value of type bool'
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-08 11:26:05 +02:00
Michael Kaufmann
466ea0fa99 show update steps for version updates (forgot that once or twice); add fallback for file deletion if exec() is not allowed; fix php7.4 warnings
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-08 10:54:08 +02:00
Michael Kaufmann
8f850ee7f3 simplify config-templates for cronjob setup
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-06 22:54:54 +02:00
Michael Kaufmann
55d21e475d set low timeout for version-check and output message if check is not possible (due to connection error, downtime of server, etc.)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-06 18:53:30 +02:00
Michael Kaufmann
fa3e3da7ac only flush privileges if anything at all happened
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-06 14:47:04 +02:00
Michael Kaufmann
05d66c034e update min-required version of php in composer.json
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-06 09:04:18 +02:00
Michael Kaufmann
98f0839664 Merge branch 'master' of github.com:Froxlor/Froxlor 2019-10-06 09:01:15 +02:00
Michael Kaufmann
4d52c6b6d0 Update README.md 2019-10-04 21:48:10 +02:00
Michael Kaufmann
eb5ea51da1 add explicit tlsv1.3 ciphersuite setting (used for apache-only as of now) 2019-10-04 17:43:11 +02:00
Michael Kaufmann
4b555b4ef2 set version to 0.10.0 for upcoming stable release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-03 12:35:42 +02:00
Michael Kaufmann
1657af8719 updating external libraries prior to release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-03 12:31:27 +02:00
Michael Kaufmann
c9d30654e0 update link to openssl-ciphers manual, thx to lod
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-10-02 09:12:06 +02:00
Michael Kaufmann
47ca350127 increase php requirement to 7.0 as 5.6 is way too old
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-09-27 12:55:14 +02:00
Michael Kaufmann
cc04e44031 add possibility to add customer using a hosting-plan instead of specifying resources
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-09-27 12:54:43 +02:00
Michael Kaufmann
eabad4917b correct try_files in NginxFcgi, fixes #717
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-09-26 09:50:13 +02:00
Michael Kaufmann
6188e5b0e3 Merge pull request #716 from Bobselp/patch-1
fix MysqlHandler user field
2019-09-25 20:18:22 +02:00
Bobselp
13ab7a598b fix MysqlHandler user field
See lib/Froxlor/FroxlorLogger.php:152
2019-09-25 20:03:16 +02:00
Michael Kaufmann
bf2584da65 Merge pull request #714 from Bobselp/patch-1
Get mailbox size with maildirsize file
2019-09-24 19:16:58 +02:00
Bobselp
31cebccd5d fix calc, add check if quota is enabled 2019-09-24 18:16:07 +02:00
Michael Kaufmann
3728e9b22c Merge pull request #715 from z3dm4n/master
lng/english.lng.php: fix typo
2019-09-24 12:55:45 +02:00
Erik Zettel
8a145eca92 lng/english.lng.php: fix typo 2019-09-24 12:44:33 +02:00
Bobselp
14914fce44 Get mailbox size with maildirsize file 2019-09-23 21:08:16 +02:00
Michael Kaufmann
6e3fdc1cf9 Merge pull request #713 from Bobselp/patch-1
fix missing namespaces in PowerDNS cron
2019-09-22 18:05:48 +02:00
Bobselp
6ca68f6a2d fix missing namespaces in PowerDNS cron
Some getDB calls were missing the `\Froxlor\Dns\` prefix
2019-09-22 17:59:21 +02:00
Michael Kaufmann
fd4d3cbcfd specify pop3_logout_format explicitly for dovecot to satisfy maillogparser
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-09-19 13:06:32 +02:00
Michael Kaufmann
75f49e2ee2 added HostingPlans ApiCommand + unit-tests
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-09-16 12:31:02 +02:00
Michael Kaufmann
aca22a9c94 only add lets encrypt certificate if cert is valid; display acme.sh output if --debug is specified
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-09-15 15:40:13 +02:00
Michael Kaufmann
5a8ae0f75f do not log multiple times due to pushing log-handlers multiple times
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-09-15 13:49:40 +02:00
Michael Kaufmann
6ef2be8c1a fixed typo
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-09-15 13:42:32 +02:00
Michael Kaufmann
1b968c885b remove old files from 0.9.x to avoid conflicts and errors; change mod_proxy-usage and ACMEv2 default values to true
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-09-15 10:28:19 +02:00
Michael Kaufmann
dc3f159c90 correctly trigger re-generation of let's encrypt certificates
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-09-15 10:22:25 +02:00
Michael Kaufmann
6ebb8dabc4 re-create certificate if SAN list or domain changes
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-09-12 12:30:47 +02:00
Michael Kaufmann
9e2dcf51d7 also remove let's encrypt certificate for froxlor-hostname when updating to acme.sh; make installation more mysql/mariadb compatible
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-09-09 17:16:41 +02:00
Michael Kaufmann
2d8b0181b3 add gitter notifications for travis-ci
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-08-22 16:20:42 +02:00
Michael Kaufmann
accd6e7416 Update README.md 2019-08-22 16:15:17 +02:00
Michael Kaufmann
f5027695dd Create FUNDING.yml 2019-08-22 15:45:00 +02:00
Michael Kaufmann
34696df700 Merge pull request #711 from TimoStramann/patch-1
Remove unnecessary slash for SSL redirect
2019-08-18 16:15:50 +02:00
Timo Stramann
8e9ddd3d50 Remove unnecessary slash for SSL redirect
Remove slash after hostname since requests directly to the hostname do not require a slash at the end and all other content goes to `$request_uri` which starts with shlash, hence no longer doubleslashes on hostname only queries.
2019-08-18 16:07:59 +02:00
Michael Kaufmann
eca941bdae Merge pull request #710 from TimoStramann/patch-1
Updating another fastcgi_param SCRIPT_FILENAME
2019-08-18 15:19:42 +02:00
Timo Stramann
bd6aba8875 Updating another fastcgi_param SCRIPT_FILENAME
Use $request_filename instead of $document_root$fastcgi_script_name as described in: https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#use-request-filename-for-script-filename
2019-08-17 13:04:18 +02:00
Michael Kaufmann
58f6b558df Merge pull request #709 from TimoStramann/patch-1
Updating fastcgi_param SCRIPT_FILENAME
2019-08-17 07:51:12 +02:00
Michael Kaufmann
7ba72269a4 add dovecot stats service and use correct permissions
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-08-11 11:12:53 +02:00
Michael Kaufmann
76c4486d26 fix subcanemaildomain parameter for Domains.update(); allow exec() in froxlor default vhost php.ini or logfiles-viewer feature
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-08-11 10:31:33 +02:00
Michael Kaufmann
69d7889f02 do not require codecoverage to pass checks
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-08-09 17:55:39 +02:00
Timo Stramann
04898c6114 Updating fastcgi_param
Use $request_filename instead of $document_root$fastcgi_script_name as described in: https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#use-request-filename-for-script-filename
2019-08-09 09:40:55 +02:00
Michael Kaufmann
7364dca53d fix homedir of automatically added ftp-user for new customers, thx Gamerboy59 for finding this
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-08-07 14:01:05 +02:00
Michael Kaufmann
90e7f7af0c correct language-array and minor formatting in serversettings.caa_entry_custom
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-07-30 10:05:26 +02:00
Michael Kaufmann
878be08563 Merge pull request #706 from makuser/master
Implement CAA DNS records
2019-07-30 09:53:46 +02:00
Michael Kaufmann
a98ae562b2 change mysql-username-test so it generates a loginname that fails depending on the mysql/mariadb version
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-07-30 08:48:44 +02:00
Michael Kaufmann
2aec6a10ed argh, mixed up the If statement for mysql-version check
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-07-30 08:31:03 +02:00
Michael Kaufmann
70ac914a86 fix drop database on mysql-5.6 as there is no 'if exists' for 'drop user' prior to mysql-5.7
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-07-30 07:34:42 +02:00
Michael Kaufmann
169353c429 Merge branch 'makuser-travis-test' 2019-07-30 07:30:56 +02:00
Marc-André Kolly
ede19946c2 Tell ant to fail the build when a php unit test fails 2019-07-29 16:29:39 +02:00
Marc-André Kolly
dd488106af Remove lib/userdata.inc.php.bak 2019-07-29 16:09:11 +02:00
Marc-André Kolly
2489658353 Extrawurst 2.0. 2019-07-29 16:03:27 +02:00
Marc-André Kolly
61b12e3f25 Extrawurst. 2019-07-29 15:47:45 +02:00
Marc-André Kolly
c2ffb6d6bd Update Travis CI to run database tests on MySQL 5.6, 5.7 and 8.0 and on MariaDB 10.3 and 10.4. 2019-07-29 15:12:35 +02:00
Marc-André Kolly
4ef78df27f Update Travis CI 2019-07-29 15:07:18 +02:00
Marc-André Kolly
84d80d695a Add Url and Domain validation for CAA records using native Froxlor function 2019-07-29 15:02:13 +02:00
Marc-André Kolly
3cba61a8d8 Simplify unit tests for CAA entry validation 2019-07-29 14:30:39 +02:00
Marc-André Kolly
16ccc273a9 Don't actually enclose CAA records in brackets 2019-07-29 14:27:44 +02:00
Marc-André Kolly
95d47eb6c9 Add unit tests for CAA entry validation 2019-07-29 11:53:00 +02:00
Marc-André Kolly
bfb3fb0a92 Add Regex to check for invalid CAA entry 2019-07-29 11:36:34 +02:00
Marc-André Kolly
78ef2a4e23 Fix serversettings field 2019-07-29 07:41:09 +02:00
Marc-André Kolly
a377c1e6c5 Split l18n string into title and description 2019-07-29 07:39:21 +02:00
Marc-André Kolly
e67e2a85de Implement test for Domain Zone CAA record 2019-07-28 20:05:55 +02:00
Marc-André Kolly
be0470aec1 Revert per-domain CAA settings 2019-07-28 19:49:56 +02:00
Marc-André Kolly
240178eba7 Implement global CAA settings 2019-07-28 19:49:32 +02:00
Marc-André Kolly
358ca61a26 Implement validators to prevent breaking DNS server when adding newly introduced RR types 2019-07-28 18:47:47 +02:00
Marc-André Kolly
b427212b00 Properly implement migrations for caa field in TABLE_DOMAIN_DNS using showUpdateStep() and lastStepStatus() 2019-07-28 18:12:00 +02:00
Marc-André Kolly
5eef98fdfd Bump DB Version to 201907270 2019-07-28 18:10:01 +02:00
Marc-André Kolly
57ac337ef7 Add a few more commonly used RR types to DNS editor 2019-07-28 16:52:05 +02:00
Marc-André Kolly
64fe300e42 Implement general CAA DNS records for all issuers 2019-07-28 16:28:29 +02:00
Marc-André Kolly
d4e5e32c14 Implement CAA DNS record for letsencrypt.org 2019-07-27 17:36:31 +02:00
Michael Kaufmann
d5e4182878 beautification and minor fixes
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-07-26 07:49:17 +02:00
Michael Kaufmann
dd87a7374e fix ftp-group not added correctly when new customer is added
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-07-26 07:45:38 +02:00
Michael Kaufmann
7bc57ed269 set password directly when adding new mysql user
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-07-26 07:34:32 +02:00
Michael Kaufmann
5658717653 fix wrong parameter for acme.sh --delete when ecc certificates are used
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-07-19 11:43:14 +02:00
Michael Kaufmann
6c0fb007e4 travis changed the default OS to xenial, set it to the previous trusty which works
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-07-19 08:43:42 +02:00
Michael Kaufmann
0b898b9936 Merge branch 'master' of github.com:Froxlor/Froxlor 2019-07-19 08:42:31 +02:00
Michael Kaufmann
a261e84830 Merge pull request #705 from MDXDave/patch-2
Disable mail redirections if customer is disabled, fixes #704
2019-07-19 08:28:40 +02:00
Dave
7e9b373a58 Update xenial.xml 2019-07-19 01:43:07 +02:00
Dave
5698f8360e Update rhel_centos.xml 2019-07-19 01:42:49 +02:00
Dave
de7c438315 Update gentoo.xml 2019-07-19 01:42:31 +02:00
Dave
0669450676 Update bionic.xml 2019-07-19 01:42:14 +02:00
Dave
507a62f52d Update trusty.xml 2019-07-19 01:41:54 +02:00
Dave
77a7037072 Update jessie.xml 2019-07-19 01:41:24 +02:00
Dave
577e9d3b70 Update buster.xml 2019-07-19 01:40:55 +02:00
Dave
2526512069 Update stretch.xml 2019-07-19 01:39:01 +02:00
Michael Kaufmann
e91debcbb1 buster dovceot has ssl enabled by default
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-07-14 09:41:46 +02:00
Michael Kaufmann
065fa0b58b do not store punycode-notation of email-account domain, fixes #703
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-07-13 09:09:39 +02:00
Michael Kaufmann
db3c95ea10 set last run of letsencrypt cron when called in webserver-cron
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-07-11 08:39:26 +02:00
Michael Kaufmann
8b417c044c let nginx auto-detect the best ecdh-curve to use, fixes #652
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-07-11 08:13:00 +02:00
Michael Kaufmann
5e3cfaf847 insert task to regenerate config files after removing old-format lets encrypt certificates
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-07-10 09:58:12 +02:00
Michael Kaufmann
0f0dd91246 combine Let's Encrypt cron with webserver-vhost-generation but allow manually execution using --debug/--force
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-07-09 07:50:11 +02:00
Michael Kaufmann
fd912dd161 combine webserver-reload command to parent class to avoid repeating code
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-07-09 07:13:02 +02:00
Michael Kaufmann
98325a0f40 don't need NSCD when using libnss-extrausers
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-07-03 18:07:02 +02:00
Michael Kaufmann
c43915c09d show task 12 in admin dashboard overview if active
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-07-03 12:00:47 +02:00
Michael Kaufmann
01bf814496 remove domain ssl information from acme.sh and filesystem on deletion to avoid trying to renew certificates
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-07-01 20:32:13 +02:00
Michael Kaufmann
2ce517e84a use Fts.add when adding new Customers to reduce duplicate code
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-06-28 15:15:17 +02:00
Michael Kaufmann
e209989f2a use EmailAccounts.delete API call in Emails.delete instead of repeating the code
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-06-28 11:07:29 +02:00
Michael Kaufmann
5dfb74701c improve error message display on missing vendor-folder
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-06-25 11:10:32 +02:00
Michael Kaufmann
bdd583d251 Merge branch 'drexlma-patch-2' 2019-06-25 10:59:06 +02:00
Michael Kaufmann
fd8a1d8dc2 Merge branch 'patch-2' of https://github.com/drexlma/Froxlor into drexlma-patch-2 2019-06-25 10:58:57 +02:00
Michael Kaufmann
d2818f8020 Merge branch 'drexlma-patch-3' 2019-06-25 10:58:20 +02:00
Michael Kaufmann
80a0a34b46 Merge branch 'patch-3' of https://github.com/drexlma/Froxlor into drexlma-patch-3 2019-06-25 10:57:45 +02:00
Michael Kaufmann
6e41c0ad2c add codecov.io to travis build for code-coverage stats - yay
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-06-17 14:11:40 +02:00
Michael Kaufmann
a07a9e6a88 more unit-testing, enhancements in Store-functions
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-06-11 12:10:56 +02:00
Michael Kaufmann
7a94a43053 started \Settings\Store unit tests
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-06-10 13:37:22 +02:00
Michael Kaufmann
028524291e test improvements and preparation for more tests later
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-06-10 11:38:47 +02:00
Michael Kaufmann
1ac304e5ac fix missing domainname parameter when manually adding ssl-certificates for a domain, fixes #700
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-06-10 11:36:05 +02:00
Michael Kaufmann
f266bb05c9 testing \Froxlor\Settings\FroxlorVhostSettings
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-06-06 13:04:43 +02:00
Michael Kaufmann
d8a8f76dc9 update dev-environment to use more recent versions, requries php-7.3 now (dev-only)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-06-06 10:18:03 +02:00
Michael Kaufmann
0afbe3d13b add validation tests
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-06-05 20:52:37 +02:00
Michael Kaufmann
4917b9c057 added first validation tests
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-06-05 09:07:21 +02:00
Michael Kaufmann
13bfd62ac5 move validateUrl function to correct file
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-06-05 06:50:06 +02:00
Michael Kaufmann
97703e7a0c add a few tests for Settings
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-06-05 06:39:44 +02:00
Michael Kaufmann
13086d91d8 only validate and process ip-list if given at all
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-06-04 15:14:51 +02:00
Michael Kaufmann
b7a10fdeda fix vhost(parts)-merging in nginx cron, fixes #669
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-06-03 11:59:56 +02:00
Michael Kaufmann
6806f896d6 fix proftp path of rhel/centos config template, fixes #636
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-05-31 08:02:03 +02:00
Michael Kaufmann
87a2f86365 do not set default ssl-ips if the frontend values are left empty; if default ssl-ips are specified, preset them in the form when adding a domain, fixes #697
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-05-30 17:44:08 +02:00
Michael Kaufmann
a647d48fbe fix up testing/production switch and challengepath for lets encrypt, fixes #696
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-05-27 17:48:33 +02:00
Daniel Drexlmaier
6ea91f55e5 Update install.php 2019-05-27 15:47:30 +02:00
Daniel Drexlmaier
fb87129e29 Update init.php 2019-05-27 15:46:39 +02:00
Daniel Drexlmaier
79e5113e12 Update init.php 2019-05-27 15:28:08 +02:00
Daniel Drexlmaier
b75c9ddff6 Update install.php 2019-05-27 15:27:28 +02:00
Michael Kaufmann
35e14fde14 set version to 0.10.0-rc2 for second release candidate
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-05-27 11:47:58 +02:00
Michael Kaufmann
68f55f9596 dont allow bootstrap.php file from tests/ to be called via browser
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-05-27 08:33:36 +02:00
Michael Kaufmann
3fec579f85 Merge pull request #683 from discordier/hotfix/pcre-maillog
Fixes #682 - mail log parsing regex character group
2019-05-13 20:03:49 +02:00
Christian Schiffler
e2d69c664a Fixes #682 - mail log parsing regex character group
The mail log parsing regex was incorrectly using a character group of `\A`
2019-05-13 19:53:55 +02:00
Pascal
836b6f2fdb Merge remote-tracking branch 'upstream/master' 2019-05-10 02:54:33 +02:00
Michael Kaufmann
72016a5735 fix integrity-check language-file entries
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-05-07 14:03:37 +02:00
Pascal
f297058461 #564
fix wording
add validation for cidr syntax
add automatic transform of cidr to netmask for mysql
2019-05-04 00:39:12 +02:00
Pascal
0f4d8d76ae #564
fix wording
2019-05-03 23:31:31 +02:00
Pascal
12884c91a6 #564
fix #564 by allowing CIDR in mysql host validation. 
fix english and german field description accordingly
2019-05-03 22:32:57 +02:00
Michael Kaufmann
eba163fc4a Merge pull request #677 from pquerner/#646
allow auth basic in URL, fixes #646
2019-04-30 07:14:48 +02:00
Michael Kaufmann
8df6654ad0 Merge pull request #676 from pquerner/#675
use correct validate-ip function in \Froxlor\Validate\Validate::validateUrl, fixes #675
2019-04-30 07:09:20 +02:00
Pascal
1a5e43b6f7 fixes #646
change regex by using well tested regex from here:
https://mathiasbynens.be/demo/url-regex

by @diegoperini
https://gist.github.com/dperini/729294
2019-04-30 00:08:32 +02:00
Pascal
c4c7f4b636 fixes #675
fix call to static method
2019-04-29 23:39:10 +02:00
Michael Kaufmann
9aa0de16be Merge branch 'foliengriller-annotationsAPI' 2019-04-26 12:24:15 +02:00
Michael Kaufmann
cb636fe2c9 Merge branch 'annotationsAPI' of https://github.com/foliengriller/Froxlor into foliengriller-annotationsAPI 2019-04-26 12:23:58 +02:00
Michael Kaufmann
f93dc5643f fix error that wildcard-domains and lets-encrypt are not possible when using ACMEv2; fixes #674
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-04-25 14:20:02 +02:00
Michael Kaufmann
974b151d02 add Debian 10 (Buster) and Ubuntu 18.04 (Bionic) config-templates for TESTING
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-04-25 14:04:15 +02:00
Michael Kaufmann
8835dd0b65 remove deprecated config-templates for Ubuntu 12.04 (Precise); mark Debian 7 (Jessie) and Ubuntu 14.04 (Trusty) as deprecated
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-04-25 14:03:39 +02:00
Michael Kaufmann
626b791c67 remove recursor options in powerdns config template for gentoo, as recursion has been removed in pdns >=4.1.0; fixes #673
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-04-25 13:56:42 +02:00
Michael Kaufmann
82508587b3 update mysql-table engines to InnoDB; fixes #671
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-04-25 13:31:18 +02:00
Michael Kaufmann
0d7fa5728c fix auto-delete of cetificates when no domain exists anylonger, thx to an error-report
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-04-14 08:13:34 +02:00
Michael Kaufmann
29365838b3 set version to 0.10.0-rc1 for upcoming release candidate
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-04-10 08:24:04 +02:00
Michael Kaufmann
13ac7ef66c Merge pull request #666 from sokai/sokai-patch-1
logrotate snipet: (more) GDPR ‚compliant‘; fixes #665
2019-03-16 18:10:19 +01:00
Michael Kaufmann
6764747fa9 use system.defaultttl setting also for SOA record; fixes #667
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-03-16 18:09:21 +01:00
sokai
91df02916c logrotate snipet: GDPR ‚compliance‘
see: https://github.com/Froxlor/Froxlor/issues/665
2019-03-16 13:08:44 +01:00
sokai
bf400fc5f8 logrotate snipet: GDPR ‚compliance‘
see: https://github.com/Froxlor/Froxlor/issues/665
2019-03-16 13:07:49 +01:00
sokai
6cd73c9ebf logrotate snipet: GDPR ‚compliance‘
see: https://github.com/Froxlor/Froxlor/issues/665
2019-03-16 13:07:14 +01:00
sokai
ed9ab39c5e logrotate snipet: GDPR ‚complieance‘
see: https://github.com/Froxlor/Froxlor/issues/665
2019-03-16 13:05:54 +01:00
sokai
678bd1bcdc logrotate snipet: GDPR ‚complieance‘
see: https://github.com/Froxlor/Froxlor/issues/665
2019-03-16 13:05:11 +01:00
sokai
90fe548901 logrotate snipet: GDPR ‚complieance‘
see: https://github.com/Froxlor/Froxlor/issues/665
2019-03-16 13:04:26 +01:00
sokai
a158d4bfb9 logrotate snipet: GDPR ‚complieance‘
see https://github.com/Froxlor/Froxlor/issues/665
2019-03-16 13:02:01 +01:00
Michael Kaufmann
4028e3ba5c testing with new IdnaConverter seems to require php-7.1
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-03-10 17:16:59 +01:00
Michael Kaufmann
f7d24e8870 IdnaConverter repository changed url
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-03-10 17:13:51 +01:00
Michael Kaufmann
b1bbb1847d put log_format directive in correct context (http-context only); refs #663
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-03-08 13:23:38 +01:00
Michael Kaufmann
fb6e231f77 avoid passing non-variable as reference
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-03-01 10:40:01 +01:00
Michael Kaufmann
5786644c76 fix installation for current development for now; fixes #661
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-25 17:13:13 +01:00
Michael Kaufmann
51efba0a8d Check for SSL enabled vhost-container for ssl-related settings in froxlor-vhost-settings; fixes #642
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-24 09:03:03 +01:00
Michael Kaufmann
2f38de90e5 use DbManager for updating the password of a mysql-db
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-24 08:52:50 +01:00
Michael Kaufmann
410bfe2c97 fix typo in phpdoc
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-22 12:59:11 +01:00
Michael Kaufmann
cfae5b7516 fix deleting of certificate when certificate is froxor-vhost-certificate
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-21 14:18:00 +01:00
Michael Kaufmann
6e81c235d9 fix SAN domains for froxlor-vhost-aliases in let's encrypt
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-21 13:51:34 +01:00
Michael Kaufmann
0257149316 fix generation of serveralias in froxlor vhost
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-21 13:41:23 +01:00
Michael Kaufmann
ef331ccc81 Add setting to specify domain aliases for the froxlor-vhost (and add them to the SAN list of let's encrypt certificates if enabled)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-21 12:54:53 +01:00
Michael Kaufmann
b187114c50 output real names in libnss-extrausers passwd file, fixes #659
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-21 10:31:05 +01:00
Michael Kaufmann
fdefd4f1fe fix re-enabling of database users after being deactivated, fixes #660
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-21 10:19:58 +01:00
Michael Kaufmann
4ec32c0972 set keysize to the former default and the default from installation
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-19 10:26:33 +01:00
Michael Kaufmann
111e9bf64b fix typo for getting Settings of lets encrypt keysize when not using ECC
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-19 09:58:28 +01:00
Michael Kaufmann
7d3577d649 fix superfluous ssl_key directive in dovoecot for stretch and xenial
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-18 19:14:48 +01:00
Michael Kaufmann
a8fb0a6d88 check for non-empty required field 'name' in hosting plans, which are still not fully migrated to API, refs #658
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-18 13:07:58 +01:00
Michael Kaufmann
8d628daf83 fix update of acmesh class in cronjobs_run
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-17 21:41:19 +01:00
Michael Kaufmann
010f30bc9e check for upgrade of acme.sh prior to issue/renew certifice, refs #657
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-17 20:48:11 +01:00
Michael Kaufmann
2273a11978 remove unneeded let's encrypt settings; self-update acme.sh only once a day
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-17 20:36:18 +01:00
Michael Kaufmann
5c36b79277 honor setting for let's encrypt key size if needed
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-17 19:47:51 +01:00
Michael Kaufmann
f5127eccd1 outsource acmesh-command to reduce duplicate code
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-17 19:43:12 +01:00
Michael Kaufmann
e962f76b32 Merge branch 'master' of github.com:Froxlor/Froxlor 2019-02-17 19:34:33 +01:00
Michael Kaufmann
6d8521d8dc Merge pull request #657 from patschi/patch-1
Run acme.sh upgrade just once when cron starts
2019-02-17 19:34:21 +01:00
Patrik Kernstock
7b231bb755 Run acme.sh upgrade just once when cron starts
Only run acme.sh upgrade command once when cronjob starts, and not everytime when there's a certificate going to be renewed.
2019-02-17 19:30:03 +01:00
Michael Kaufmann
459cbcc0dd keep re-use old-key setting for Let's Encrypt
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-17 19:25:23 +01:00
Michael Kaufmann
44433ef86e only variables can be passed by reference
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-17 18:24:31 +01:00
Michael Kaufmann
cb8e83bdfa use new AcmeSh class also in froxlor.sql
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-17 17:56:14 +01:00
Michael Kaufmann
84eec155de only empty the certificates if there's actually something to empty
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-17 16:57:03 +01:00
Michael Kaufmann
73a059b318 usinng acme.sh for issuing Let's Encrypt certificates now; please test thoroughly; fixes #651
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-17 16:17:35 +01:00
Michael Kaufmann
39d38eea8d fix missed cronlog variable usage in LetsEncrypt cron
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-15 13:58:29 +01:00
Michael Kaufmann
bfb7f28ff0 add linebreak after LogLevel
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-15 13:21:50 +01:00
Michael Kaufmann
036ec68651 fix unit-tests
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-13 21:59:01 +01:00
Michael Kaufmann
8cebcc8a5d allow DnsZone functions only if dns-editor is enabled AND the customer is allowed to use it
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-13 21:51:24 +01:00
Michael Kaufmann
fbcba3ef4e remove unnecessary if-statement in nginx when redirecting to https, thx to patschi; fixes #653
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-13 15:32:41 +01:00
Michael Kaufmann
fca7b95579 meh it's february already :P
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-12 17:42:36 +01:00
Michael Kaufmann
73c05fb231 add setting for customzing webserver error-log level, fixes #650
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-12 17:38:46 +01:00
Michael Kaufmann
d0fb77f3e9 Merge pull request #648 from princeofnaxos/Fix-english-typos
Corrections to the English texts
2019-02-11 16:18:50 +01:00
Edwin Boersma
32cf6dfaef Re-added missing line. 2019-02-11 16:17:17 +01:00
Michael Kaufmann
8ab86a05b2 disable settings in 'froxlor vhost settings' that wont have any effect if no IP/port has the 'create vHost container' option enabled; fixes #642
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-11 16:08:34 +01:00
Edwin Boersma
79b913131e Corrections to the English texts 2019-02-11 15:59:29 +01:00
Michael Kaufmann
8fd910a92e use correct settings-class
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-10 22:54:05 +01:00
Michael Kaufmann
2ce1a5abb5 ups, where did they go? :P
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-10 22:49:32 +01:00
Michael Kaufmann
8448a7141a do not add task 11 (delete domain from pdns db) if namserver is disabled and dns-server is not PowerDNS
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-09 11:56:15 +01:00
Michael Kaufmann
21f9a24780 remove 'change_date' field from pdns-records table as it is being removed in pdns >=4.2; fixes #645
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-08 07:59:02 +01:00
Michael Kaufmann
1b5e31e59d fallback to default froxlor newsfeed when no custom newsfeed (rss) is given if newsfeed is shown on customer dashboard
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-07 10:05:41 +01:00
Michael Kaufmann
03afbc902d fix static method not being declared as such
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-02 09:05:14 +01:00
Michael Kaufmann
83b760a43b add missing description for task 11
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-02-01 14:17:54 +01:00
Michael Kaufmann
c0e67dc240 fix incorrect usage of class-constant
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-01-30 12:32:06 +01:00
Michael Kaufmann
2166999fef fix logging in Nginx cron
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-01-26 10:23:56 +01:00
Michael Kaufmann
7bb7cc6a00 fix isbinddomain/zonefile field saving when editing domain, fixes #639
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-01-22 08:29:13 +01:00
Michael Kaufmann
8b96912ab4 correctly use system-setting of default-ttl, thx to K1rk
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-01-17 09:26:04 +01:00
Michael Kaufmann
de33ec509b move_to_admin is not a binary value, fixes #637
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-01-16 19:21:50 +01:00
Michael Kaufmann
5ecb43ba73 correct increasing/decreasing of admin-resources
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-01-16 15:14:22 +01:00
Michael Kaufmann
97ff3485b7 fix deletion of admins; fixes #638
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-01-16 10:59:32 +01:00
Michael Kaufmann
98daef7224 Merge pull request #635 from heavygale/patch-3
htpasswd only on configured paths
2019-01-14 06:31:42 +01:00
Max
2983aa5737 htpasswd only on given paths
Only apply htpasswd rules to (sub)domains if the rule's path begins with the domain's document root.
2019-01-14 00:18:26 +01:00
Michael Kaufmann
9a906427e7 ensure the replacing of the stdsubdomain url on update is encoded correctly
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-01-11 08:55:55 +01:00
Michael Kaufmann
7841eebf08 correct handling of storeSettingHostname when system.stdsubdomain is changed; refs #633
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-01-11 00:06:44 +01:00
Michael Kaufmann
b4597d54af create full dns zone if main-but-subdomain has dns enabled but maindomain to that domain does not, fixes #632
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-01-08 12:52:10 +01:00
Michael Kaufmann
19ffc9587a issubof Parameter in Domains.add and Domains.update is not boolean
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-01-08 11:18:53 +01:00
Michael Kaufmann
bbe0a0b3a5 Merge pull request #630 from princeofnaxos/master
Corrections to the Dutch translations
2019-01-07 11:12:37 +01:00
Edwin Boersma
0d30f71097 Corrections to the Dutch translations 2019-01-07 11:06:25 +01:00
Michael Kaufmann
0cc5693180 damn typo
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-01-06 08:54:49 +01:00
Michael Kaufmann
045a62a9db remove duplcate visible-field in admin-edit formfield; fixes #625
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-01-06 08:48:24 +01:00
Michael Kaufmann
725372b6ae add 4th parameter $step to Admins::increaseUsage(); fixes #628
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-01-06 08:45:24 +01:00
Michael Kaufmann
9e77fecc29 removed deprectated create_function statement; fixes #623
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-01-06 08:39:56 +01:00
Michael Kaufmann
44c47fa6eb Merge pull request #629 from PHPGangsta/composer_sugg
added ext-apcu and ext-readline to composer.json suggest block
2019-01-05 16:22:07 +01:00
Michael Kliewe
448de78ea5 added ext-apcu and ext-readline to composer.json suggest block 2019-01-05 13:31:26 +01:00
Michael Kaufmann
f3859052e5 fix getParamListFromDoc() for api doc
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-01-05 07:56:55 +01:00
Michael Kaufmann
2b4199e558 drop ADSP support, fixes #622
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-01-04 20:58:20 +01:00
Michael Kaufmann
b7585585dc also include table-definitions in external api.php
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-01-02 18:46:38 +01:00
Michael Kaufmann
92b133b11d fix Froxlor::listFunction() api-call after namespacing
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2019-01-02 18:36:01 +01:00
Michael Kaufmann
5dda57458a fix incorrect variable
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-28 15:18:56 +01:00
Michael Kaufmann
16efd1191a forgot to remove require of formfield-constants
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-26 21:12:58 +01:00
Michael Kaufmann
1c9d76725c get rid of last function file
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-26 20:54:00 +01:00
Michael Kaufmann
4ee735a81f Merge branch 'namespaces' 2018-12-26 20:38:05 +01:00
Michael Kaufmann
2ba8fa2785 Merge branch 'master' into namespaces 2018-12-26 20:37:47 +01:00
Michael Kaufmann
e64e8cafa6 define logger constants in logger class
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-26 15:51:26 +01:00
Michael Kaufmann
3949a6858b fixed to Cron
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-26 12:00:32 +01:00
Michael Kaufmann
792d25fdd8 add MysqlHandler for Monolog-Logger
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-25 08:48:28 +01:00
Michael Kaufmann
af5ef4b9dc Merge pull request #617 from JB1985/patch-3
Update logfiles_viewer.php
2018-12-25 07:54:10 +01:00
JB1985
bd79022475 Update logfiles_viewer.php
typo
2018-12-24 20:50:38 +01:00
Michael Kaufmann
684130871b forgot one function in Froxlor\PhpHelper
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-24 14:04:52 +01:00
Michael Kaufmann
7416a41a42 get rid of most of the checkstyle warnings
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-24 13:50:45 +01:00
Michael Kaufmann
30f5902b88 fix some more checkstyle issues
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-24 13:21:35 +01:00
Michael Kaufmann
35c631946d more and more checkstyle fixes
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-24 12:59:40 +01:00
Michael Kaufmann
585d42f1b8 more checkstyle fixes
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-24 12:02:26 +01:00
Michael Kaufmann
c3d44b4558 Minor enhancements and starting to comply with checkstyle
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-24 09:35:05 +01:00
Michael Kaufmann
04e87cce98 forgot to add a few statics... :p
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-23 19:49:10 +01:00
Michael Kaufmann
4cd005051b fixed last remaining function calls which are class-methods now
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-23 19:34:32 +01:00
Michael Kaufmann
e1987af34d [CI] add composer to build.xml; run PHPCompatibility check; run only phpunit in travis
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-23 10:39:27 +01:00
Michael Kaufmann
17c6b11a1b remove superfluous inserttask
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-22 21:11:43 +01:00
Michael Kaufmann
7170fab884 fix build-testing on jenkins
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-22 20:32:36 +01:00
Michael Kaufmann
7f82038255 fix up some cron related things
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-22 20:01:10 +01:00
Michael Kaufmann
c1cd0004bf fix saving of settings
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-22 15:52:20 +01:00
Michael Kaufmann
b43a63d665 also regenerate quota and cron.d if settings have changed
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-22 13:44:41 +01:00
Michael Kaufmann
3794003e63 minor fixes here and there
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-22 13:42:10 +01:00
Michael Kaufmann
13aa19e5f4 got rid of all global functions, I guess
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-22 13:28:51 +01:00
Michael Kaufmann
28bb614489 begin refactoring of form-stuff
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-22 11:57:54 +01:00
Michael Kaufmann
085d25346d remove unneeded include of functions.php
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-22 10:37:33 +01:00
Michael Kaufmann
685267d6fc fix CLI scripts
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-22 10:36:01 +01:00
Michael Kaufmann
0401e6971a Revert "refactor global array"
This reverts commit c5a58e3f36.
2018-12-22 08:15:31 +01:00
Michael Kaufmann
7e39a7bc60 Revert "refactor global array"
This reverts commit 370ccbdb74.
2018-12-22 08:15:31 +01:00
Michael Kaufmann
c800e89414 Revert "fix wrong usage of \Froxlor\User::getAll()"
This reverts commit 48ff2e6b6d.
2018-12-22 08:15:31 +01:00
Michael Kaufmann
e719731de0 Revert "argh..."
This reverts commit fed9efff41.
2018-12-22 08:15:30 +01:00
Michael Kaufmann
fed9efff41 argh...
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-21 21:00:35 +01:00
Michael Kaufmann
48ff2e6b6d fix wrong usage of \Froxlor\User::getAll()
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-21 20:56:47 +01:00
Michael Kaufmann
370ccbdb74 refactor global array
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-21 20:51:44 +01:00
Michael Kaufmann
c5a58e3f36 refactor global array
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-21 20:31:17 +01:00
Michael Kaufmann
5fa0f4b87e ugh, where was 2fa integration gone?
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-21 19:25:06 +01:00
Michael Kaufmann
7c68fa7bd0 fixed a few functions I've missed
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-21 19:16:49 +01:00
Michael Kaufmann
7563907df5 convert html-related functions
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-21 18:31:06 +01:00
Michael Kaufmann
def3d6d19e forgot generateDkimEntries()
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-21 17:56:23 +01:00
Michael Kaufmann
59453a47fa fix dns-related function calls
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-21 17:51:29 +01:00
Michael Kaufmann
1b090377ee even more function to class conversion
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-21 17:41:22 +01:00
Michael Kaufmann
b0e11f5708 and more and more and more
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-21 17:00:54 +01:00
Michael Kaufmann
a819d81ef2 more function reducing and fixing
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-21 16:53:04 +01:00
Michael Kaufmann
0a28ef2af6 minor changes for unit-tests
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-21 16:32:44 +01:00
Michael Kaufmann
1ba4164028 add new PHPMail Wrapper to avoid multiple setting of properties
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-21 14:49:55 +01:00
Michael Kaufmann
f9ad392e39 remove refactored functions
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-21 13:00:39 +01:00
Michael Kaufmann
97b5439c0d auto-format all files; add table-definitions to test-bootstrap file
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-21 12:24:07 +01:00
Michael Kaufmann
1ff784198c adjust paths to classes
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-21 11:31:41 +01:00
Michael Kaufmann
05402a4a1c add new namespaces branch to travis testing
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-21 11:26:25 +01:00
Michael Kaufmann
dd8fbf0900 add new namespaces branch to travis testing
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-21 11:25:48 +01:00
Michael Kaufmann
c0e89bbd05 refactor UI functions
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-21 11:22:03 +01:00
Michael Kaufmann
b0df4e46d6 convert validate/check functions
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-20 21:00:39 +01:00
Michael Kaufmann
5888927239 get rid of more functions
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-20 12:38:18 +01:00
Michael Kaufmann
f263175802 more function reduction
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-20 09:57:00 +01:00
Michael Kaufmann
bed069f269 more function moving
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-20 08:33:32 +01:00
Michael Kaufmann
8c896d60d6 get rid of some more functions
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-20 07:43:40 +01:00
Michael Kaufmann
adc627ca4e minor fixes to template engine for now
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-19 20:38:29 +01:00
Michael Kaufmann
d654b18517 get rid of storeSetting*-functions
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-19 19:58:14 +01:00
Michael Kaufmann
26510f0745 removing more ticket-stuff; update all unit-tests
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-19 19:42:50 +01:00
Michael Kaufmann
60f1db5caf LetEncrypt cronjob refactoring
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-19 17:31:03 +01:00
Michael Kaufmann
549ccda166 use safe_exec from class now
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-19 17:19:56 +01:00
Michael Kaufmann
c4024c8107 use correct makeCorrect(Dir/File) everywhere
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-19 17:13:41 +01:00
Michael Rosenberger
98f6ad183e Corrects annotations in API 2018-12-19 16:58:52 +01:00
Michael Kaufmann
8e84a4ff44 correct use of Database use
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-19 16:57:03 +01:00
Michael Kaufmann
2c893fef25 adjustments in settings-arrays
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-19 14:54:46 +01:00
Michael Kaufmann
e4a0cc73bd convert three more dns-related functions
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-19 14:38:45 +01:00
Michael Kaufmann
4c4b2a6df3 use TwoFactorAuth via composer
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-19 14:12:42 +01:00
Michael Kaufmann
28f24fda72 ported CLI stuff to namespaces-layout
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-19 13:59:11 +01:00
Michael Kaufmann
3ff20e327f removed ticketsystem; lots of work on cron stuff
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-19 13:09:14 +01:00
Michael Kaufmann
903b775f79 make cronjobs also classes and began to refactor the whole cronjob stuff
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-19 08:55:23 +01:00
Michael Kaufmann
a25150babf use correct Settings-class in templates
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-18 15:53:08 +01:00
Michael Kaufmann
a2f205bae3 Update class.SImExporter.php 2018-12-18 15:52:19 +01:00
Michael Kaufmann
a0125bb93e Update function.setCycleOfCronjob.php 2018-12-18 15:51:48 +01:00
Michael Kaufmann
6329042d40 use namespaces in modules
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-18 13:45:05 +01:00
Michael Kaufmann
9d314aaa3f use Monolog via composer instead of our own implementation, @TODO MySQL logging-handler
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-18 12:16:48 +01:00
Michael Kaufmann
fc0a495f2d use PHPMailer via composer
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-18 10:49:18 +01:00
Michael Kaufmann
c9ee2ae7e0 use IdnaConvert from composer
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-18 10:40:16 +01:00
Michael Kaufmann
4c27efa4ae put Api-Commands into namespaces
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-18 09:46:36 +01:00
Michael Kaufmann
c7e5df95e7 add psr-4 autoload to composer.json
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-18 08:40:04 +01:00
Michael Kaufmann
c3cc3d1f62 started to refactor functions to classes and use PSR-4 autoloader and namespacing
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-18 08:38:34 +01:00
Michael Kaufmann
ba93265ac6 Merge branch 'ServiusHack-write_no_log' 2018-12-17 12:22:02 +01:00
Michael Kaufmann
bf7df9a8d6 Merge branch 'write_no_log' of https://github.com/ServiusHack/Froxlor into ServiusHack-write_no_log 2018-12-17 12:21:49 +01:00
Michael Kaufmann
8b0966d332 do not generate ssl vhost with fallback ssl-certificate if file does not exist, fixes #614
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-16 20:21:53 +01:00
Michael Kaufmann
aa90747089 fix deleting of Certificates as admin with customer_see_all flag
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-16 09:27:31 +01:00
Michael Kaufmann
efe54d8b56 enhance config-services script a bit
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-15 22:22:37 +01:00
Michael Kaufmann
1e816de8cf refactor domainValidate() function; allow underscore in CNAME and SRV entries
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-14 11:51:19 +01:00
Michael Kaufmann
e3a78f0f84 Merge pull request #612 from foliengriller/install
Checks Mysql version only if no fatal error occured
2018-12-12 21:12:12 +01:00
Michael Rosenberger
d0c7706840 Checks Mysql version only if no fatal error occured
Otherwise it is not possible to install current master due to fatal error.
2018-12-12 20:54:56 +01:00
Michael Kaufmann
1a15cef76d when using --force on the cronjob it will now also re-set quotas if enabled
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-12 19:49:46 +01:00
Michael Kaufmann
dc44c67f86 do not show 'override fpmconfig' checkbox when not using php-fpm in php-configs
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-12 19:48:56 +01:00
Michael Kaufmann
ab819129dd return the subdomain-names in PhpSettings::listing() instead of only the amount
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-11 11:45:39 +01:00
Michael Kaufmann
8d966aebee Show number of subdomains that use a php-config; fixes #532
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-11 10:12:37 +01:00
Michael Kaufmann
4988600881 added new indicator whether services/system has been configured (on new installations); show alternative configuration possibility via config-services.php script
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-10 20:34:43 +01:00
Michael Kaufmann
d381528c06 reload fpm before nginx
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-09 11:51:43 +01:00
Michael Kaufmann
3d647a2c2e fix read in correct fpm-daemon config-id for nginx and lighttpd own-vhost, thx again to heavygale
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-09 11:05:36 +01:00
Michael Kaufmann
7e6180fed8 read in correct fpm-daemon config-id for nginx and lighttpd, thx to heavygale
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-09 10:45:22 +01:00
Michael Kaufmann
9e4ed645f7 use correct page title for php-fpm versions
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-09 10:29:19 +01:00
Michael Kaufmann
9522e0cfb1 fix typo and fix '"continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"' warning (as of php-7.3)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-09 08:31:21 +01:00
Michael Kaufmann
db36d57683 fix an issue where the isemaildomain flag for a main-domain can be set to false when edited by customer
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-08 12:46:17 +01:00
Michael Kaufmann
ddddbdfb18 Merge pull request #609 from foliengriller/annotations
Improves annotations in /lib/classes/api/
2018-12-04 22:03:07 +01:00
Michael Rosenberger
df3ad9ed12 Improves annotations for API 2018-12-04 21:58:46 +01:00
Michael Kaufmann
456875905d set password compatibility for mysql8
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-04 19:52:18 +01:00
Michael Kaufmann
1707b5e7fd fix create user for mysql8 for good, thx to bimmer
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-04 17:33:58 +01:00
Michael Kaufmann
034d1b1c8e correct syntax for CREATE USER when using mysql8
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-04 15:42:05 +01:00
Michael Kaufmann
5dd915736b changed all boolean parameters to getBoolParam-function
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-04 14:40:11 +01:00
Michael Kaufmann
07d7908f6e added wrapper for boolean api-parameters, Domains-Module for now, more later; fixes #597
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-04 13:27:21 +01:00
Michael Kaufmann
cf53365007 update README and CONTRIBUTING files; added PULL_REQUEST_TEMPLATE; database user-creation fix for MySQL8
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-04 10:52:49 +01:00
Michael Kaufmann
1f2c1c1d2f Merge pull request #608 from foliengriller/openssl1
Ads missing extension openssl to composer.json
2018-12-03 21:41:30 +01:00
Michael Kaufmann
51390d8add Merge pull request #607 from foliengriller/caseMissmatch1
Corrects case missmatch of function calls
2018-12-03 21:37:35 +01:00
Michael Rosenberger
98120de7e1 Ads missing extension openssl to composer.json 2018-12-03 21:37:17 +01:00
Michael Rosenberger
88a2cb37c9 Case missmatch of function calls 2018-12-03 21:30:12 +01:00
Michael Kaufmann
ec4d34d37a let's see if that works :P
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-03 17:29:42 +01:00
Michael Kaufmann
0b3d532028 ups, how did these get lost?
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-03 17:18:44 +01:00
Michael Kaufmann
4a0be40f92 require php-5.6 for 0.10.0; fixes #606 and remove invalid value NO_AUTO_CREATE_USER in mysql-attributes for mysql8
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-03 17:15:54 +01:00
Michael Kaufmann
2da59f1055 do not rely on fixed order of import-file for domains-import; first line now has to be the names of the api-parameters used for Domains.add, see https://api.froxlor.org/doc/0.10.0/#v-Domains, fixes #544
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-02 20:06:53 +01:00
Michael Kaufmann
1ca1314ac4 fix typo in updater
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-02 19:27:50 +01:00
Michael Kaufmann
426e46a2df show registration date of domain (if given) in admin and customer domain-list, fixes #553
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-02 11:50:45 +01:00
Michael Kaufmann
212cb0140d ups minor CSS typo, refs #603
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-01 15:06:16 +01:00
Michael Kaufmann
8291c7d2ab Allow access to webserver logs via weinterface, if activated for customer; todo: view more content dynamically; fixes #603
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-12-01 13:33:08 +01:00
Michael Kaufmann
1bd4c00631 forgot to replace frontend variables with replacer
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-30 13:55:08 +01:00
Michael Kaufmann
69495b94af add 2FA mechanism, fixes #547
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-30 13:45:17 +01:00
Michael Kaufmann
29c754e700 add new CUSTOMER_HOMEDIR replacer for php-configs, thx to rubberduck for the hint
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-29 09:37:18 +01:00
Michael Kaufmann
fd69fc22db format composer.json and add php-7.0 as dev-requirement (phpunit6); add unit-test for Backup.add() when customer passes / as path value
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-28 13:17:44 +01:00
Michael Kaufmann
c7bee4edf2 update 0.9.x updater according to latest bugfix-release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-27 18:53:37 +01:00
Michael Kaufmann
9756c792d7 disable sending of emails when running tests completely when run on travis
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-27 12:05:56 +01:00
Michael Kaufmann
a86f10a4b4 fix typo in function name, refs #601
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-27 11:49:32 +01:00
Michael Kaufmann
946c2507c5 last try before i branch for testing this - next time, really
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-26 22:00:50 +01:00
Michael Kaufmann
56ac4b5c26 last try before i branch for testing this :P
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-26 21:57:15 +01:00
Michael Kaufmann
e4becfb1dd add missing php-invoker stuff
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-26 21:50:35 +01:00
Michael Kaufmann
6129768711 actually use the required phpunit version pulled from composer
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-26 21:38:36 +01:00
Michael Kaufmann
72690e311f add specific phpunit version to dev-requirements
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-26 21:33:40 +01:00
Michael Kaufmann
2ef067e12d set a few settings according to the test-system
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-26 21:05:57 +01:00
Michael Kaufmann
ae71e3ad2a new try with travis-ci #last-really
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-26 20:29:27 +01:00
Michael Kaufmann
745621c416 new try with travis-ci #last
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-26 20:23:56 +01:00
Michael Kaufmann
069ccd24e6 new try with travis-ci #3
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-26 20:16:15 +01:00
Michael Kaufmann
76b5f813c5 new try with travis-ci #2
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-26 20:12:32 +01:00
Michael Kaufmann
9ad6616fa3 new try with travis-ci
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-26 20:09:27 +01:00
Michael Kaufmann
4dca2d6217 travis-ci testing...
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-26 20:00:40 +01:00
Michael Kaufmann
eab88abd54 Merge pull request #596 from foliengriller/composer-json
Adds first composer.json file
2018-11-26 20:00:08 +01:00
Michael Kaufmann
ea3c49befe Update composer.json 2018-11-26 19:56:39 +01:00
Michael Kaufmann
e1bfb2690d Update composer.json 2018-11-26 19:53:34 +01:00
Michael Kaufmann
091f92400b move integer-conversion of array to the place where the array is known
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-26 12:21:02 +01:00
Michael Kaufmann
18df961381 ensure allowed_phpconfigs parameter for Customers.add() and Customers.edit() is an integer-array, fixes #598
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-26 12:14:53 +01:00
Michael Kaufmann
18c49e4c48 Merge pull request #595 from foliengriller/gitignore
Improves gitignore and deletes unused .keep in /logs
2018-11-26 06:51:53 +01:00
Michael Rosenberger
4da9d4c7c0 Adds first composer.json file 2018-11-25 23:24:30 +01:00
Michael Rosenberger
9a528532d2 Improves gitignore and deletes unused .keep in /logs 2018-11-25 21:49:41 +01:00
Michael Kaufmann
96addebdf3 Merge pull request #594 from Broatcast/patch-1
Change formfield id for new admins
2018-11-25 17:42:06 +01:00
Michael Kaufmann
49adcb6886 Merge branch 'heavygale-master' 2018-11-25 17:38:05 +01:00
Michael Kaufmann
ed86c2a892 Merge branch 'master' of https://github.com/heavygale/Froxlor into heavygale-master 2018-11-25 17:37:52 +01:00
Robert Kuntz
7c7ef5be09 Change formfield id for new admins
little Bug, requested "new_loginname" instead of "loginname"
2018-11-25 17:30:48 +01:00
Michael Kaufmann
c269cd5c5c added unit-tests for version-check; implemented settings import/export in API; minor variable declarations
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-25 11:17:56 +01:00
Michael Kaufmann
f6e0298d25 more api-documentation and code-formatting
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-25 10:04:09 +01:00
Michael Kaufmann
983e1ce6ad add more api documenation
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-24 19:49:27 +01:00
Michael Kaufmann
a87f1c5561 trim ip-addresses for validation as they are invalid with leading/trailing spaces
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-24 07:53:08 +01:00
Michael Kaufmann
9d82f0d269 Merge pull request #593 from foliengriller/master
Improves CSS in installer
2018-11-23 14:55:14 +01:00
Michael Rosenberger
32b5bef221 Improves CSS in installer
Correct alignment of radio options
Fixes design-problem with chrome
2018-11-23 14:34:11 +01:00
Michael Kaufmann
50eec8d8a7 Merge pull request #592 from foliengriller/master
Some minor CSS improvements
2018-11-23 11:18:45 +01:00
Michael Kaufmann
fc8373f6b6 fix unit-test testCustomerEmailForwardersDelete() to comply with new testCustomerEmailForwardersAddWithSpaces()
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-23 09:06:23 +01:00
Michael Kaufmann
1d3d8d0f28 trim email address when added as forwarder, fixes #591
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-23 09:03:35 +01:00
Michael Rosenberger
b9e4adc634 Some minor CSS improvements
- Removes unit if value is 0
- Uses shorthand notation where possible

Signed-off-by: Michael Rosenberger <mr@simpelwebservice.de>
2018-11-22 23:38:54 +01:00
Michael Kaufmann
3a3b35b2eb add ipv6 support for resolving nameserver-hostnames
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-21 19:26:19 +01:00
Michael Kaufmann
8a565532b2 more api-doc
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-19 20:38:18 +01:00
Michael Kaufmann
02ba4b5f67 Merge branch 'master' of github.com:Froxlor/Froxlor 2018-11-18 20:35:47 +01:00
Michael Kaufmann
b032f5b2ba add dhparams for webserver/ssl, refs #519
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-18 20:35:27 +01:00
Michael Kaufmann
758111a7c1 Merge pull request #589 from heavygale/patch-2
Update list.tpl
2018-11-18 15:20:34 +01:00
Max
ba124c99af Update list.tpl 2018-11-18 15:09:59 +01:00
Michael Kaufmann
776bb56b24 add more phpdoc to DomainZones ApiCommand; minor fixes in DirOptions and DirProtections
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-18 15:07:06 +01:00
Michael Kaufmann
d2024e06ff more phpdoc in DirOptions and DirProtections
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-18 14:54:20 +01:00
Michael Kaufmann
8c8be45769 added more phpdoc for api-documentation
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-18 14:39:20 +01:00
Michael Kaufmann
892d259805 Also remove DNS zones of deleted Subdomains, refs #581
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-17 20:19:29 +01:00
Michael Kaufmann
13c624400e remove domain from pdns database if removed or updated so nameserver is disabled (remove) or update of db triggered when isemaildomain option is disabled, fixes #581
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-17 20:14:58 +01:00
Michael Kaufmann
e184201327 minor cosmetic changes and new create_customer api example
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-13 08:30:41 +01:00
Michael Kaufmann
059e36aa78 finish testing of Traffic ApiCommand
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-12 07:44:35 +01:00
Michael Kaufmann
18aa8eb5d2 added Traffic.listing ApiCommand; added first Unit-Tests for Traffic-Api; SQL IN-clause cannot be prepared, replaced all occurances accordingly; added --no-fork parameter to traffic-cron
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-11 21:51:39 +01:00
Michael Kaufmann
41acbc745c Merge remote-tracking branch 'origin/0.10.0' 2018-11-10 12:03:23 +01:00
Michael Kaufmann
ab81004bf2 Merge branch 'master' into 0.10.0 2018-11-10 11:58:17 +01:00
Michael Kaufmann
d80cf6525c Merge remote-tracking branch 'origin/master' into 0.10.0 2018-11-10 11:55:39 +01:00
Michael Kaufmann
247efb1c0a set version to 0.9.40 for upcoming release
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-10 11:34:50 +01:00
Michael Kaufmann
e1b62d3af4 outsource apihelp to api.froxlor.org
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-11-10 07:17:13 +01:00
Michael Kaufmann
b340221055 update Traffic Api-Command
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-10-29 08:56:23 +01:00
Michael Kaufmann
e16ea186dc add some more unit-tests for Cronjobs and PhpSettings
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-10-28 13:47:19 +01:00
Michael Kaufmann
ce2722d429 forgot to tell phpunit which files is being covered, stupid copy'n'paste
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-10-28 09:00:04 +01:00
Michael Kaufmann
e0a195e3bc forgot to add tests/Cronjobs to the unit-test directories
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-10-28 08:57:43 +01:00
Michael Kaufmann
899a7ac189 add Cronjobs API command ad unit-tests
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-10-28 08:53:25 +01:00
Michael Kaufmann
fb4d379047 Merge remote-tracking branch 'origin/master' into 0.10.0 2018-10-27 19:57:55 +02:00
Michael Kaufmann
98c55435ae Merge pull request #583 from heavygale/patch-1
Update archive.tpl
2018-10-27 17:14:28 +02:00
Max
981f5840b3 Update archive.tpl 2018-10-27 14:57:27 +02:00
Michael Kaufmann
4efdb0cd66 add example of API usage
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-10-27 10:56:42 +02:00
Max
06dcaeacb5 Update german.lng.php 2018-10-21 12:02:10 +02:00
Max
14112bf5d7 Update german.lng.php 2018-10-20 16:39:21 +02:00
Max
c55ef54937 Update german.lng.php 2018-10-20 16:37:24 +02:00
heavygale
2e65de176b Update lng/german.lng.php 2018-10-20 16:10:27 +02:00
Michael Kaufmann
3b31cd8432 Merge remote-tracking branch 'origin/master' into 0.10.0 2018-10-20 14:06:19 +02:00
Michael Kaufmann
c1809fc084 Merge pull request #579 from quthla/patch-1
Add TLSv1.3
2018-10-20 14:02:17 +02:00
quthla
090bdaaea8 Add TLSv1.3 2018-10-20 13:29:25 +02:00
Michael Kaufmann
611bec6849 Merge pull request #578 from stweil/lgtm
Fix warnings from LGTM
2018-10-17 11:55:36 +02:00
Stefan Weil
8cf797374d Add missing variable declarations
This fixes warnings from LGTM:

    Variable i is used like a local variable,
    but is missing a declaration.

Signed-off-by: Stefan Weil <sw@weilnetz.de>
2018-10-17 11:49:59 +02:00
Stefan Weil
20177e06fc Add missing semicolons
This fixes warnings from LGTM:

    Avoid automated semicolon insertion (91% of all statements
    in the enclosing function have an explicit semicolon).

Signed-off-by: Stefan Weil <sw@weilnetz.de>
2018-10-17 11:45:25 +02:00
Severin Leonhardt
d76df274f4 Make writing AccessLog and ErrorLog optional 2018-10-11 19:07:09 +02:00
Michael Kaufmann
95b305b865 Merge remote-tracking branch 'origin/master' into 0.10.0 2018-10-11 14:57:53 +02:00
Michael Kaufmann
aa6f3d33eb clearify description and enhance validation for path-field in backup-job-planning
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-10-11 14:52:45 +02:00
Michael Kaufmann
b6e4dbd70a fix saving of apikey allowed-from setting
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-10-09 10:37:27 +02:00
Michael Kaufmann
854986abcb add some more function-doc; add setting to enable/disable api in system-settings; added last three api-command classes (empty so far)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-10-08 09:35:15 +02:00
Michael Kaufmann
c35407bc94 fix undefined debug-flag if not present
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-09-30 10:18:19 +02:00
Michael Kaufmann
5752f7b64e Merge remote-tracking branch 'origin/master' into 0.10.0 2018-09-30 10:04:15 +02:00
Michael Kaufmann
23d4bee184 add override-required info to php-config edit formfields like in add formfields, refs #573
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-09-28 11:00:56 +02:00
Michael Kaufmann
37988fa645 forgot to add override_fpmconfig flag to panel_phpconfigs, refs #573
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-09-28 10:57:43 +02:00
Michael Kaufmann
6c7ee0c222 add possibility to specify pm-related settings per php-config (if override of fpm-daemon settings is set to yes), fixes #573
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-09-28 10:55:08 +02:00
Michael Kaufmann
108c4c25b3 move 'enable http/2' setting from froxlor-vhost-settings to webserver-settings, fixes #575
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-09-26 13:29:30 +02:00
Michael Kaufmann
095e54d88d fix missing update in version.inc.php
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-09-25 08:17:31 +02:00
Michael Kaufmann
70cb760862 fix missing update in version.inc.php
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-09-25 08:16:54 +02:00
Michael Kaufmann
738e629eec Merge remote-tracking branch 'origin/master' into 0.10.0 2018-09-25 08:14:16 +02:00
Michael Kaufmann
bd036a0fde remove unnecessary string-break; use standardlanguage-variable as fallback language for installer
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-09-25 08:12:21 +02:00
Michael Kaufmann
f766c6f920 Merge pull request #572 from markuspetermann/master
Fixed class.lescript_v2.php to work with ACMEv2
2018-09-25 08:09:16 +02:00
Markus Petermann
4588bc7f5c Merge branch 'master' of github.com:markuspetermann/Froxlor 2018-09-19 15:14:46 +02:00
Markus Petermann
9e289a2380 Fixed class.lescript_v2.php to work with ACMEv2
Account(kid) needs to be saved for future requests.
Install/Update part is untested.
2018-09-19 15:11:27 +02:00
Michael Kaufmann
f0edf97ac7 do not follow url location/redirect when using LE selfcheck
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-09-19 11:15:42 +02:00
Michael Kaufmann
91195fda89 check for all needed php extensions and mysqldump tool in setup process, fixes #569
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-09-19 11:15:03 +02:00
Michael Kaufmann
6161ad1bd3 make CURLOPT_FOLLOWLOCATION optional in HttpClient::urlGet
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-09-19 11:09:27 +02:00
Michael Kaufmann
f72d87228b restrict sending of emails when user is locked
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-09-19 11:07:54 +02:00
Markus Petermann
4f0acd176a Fixed class.lescript_v2.php to work with ACMEv2
Account(kid) needs to be saved for future requests.
Install/Update part is untested.
2018-09-18 02:20:17 +02:00
Markus Petermann
5f29b2cc4a Fixed class.lescript_v2.php to work with ACMEv2
When requesting a certificate for multiple Domains/SANs, the request must be done in a single order.
2018-09-18 00:53:51 +02:00
Michael Kaufmann
164f1a921e Merge pull request #570 from markuspetermann/patch-1
Fixed class.lescript_v2.php to work with ACMEv2
2018-09-15 13:25:01 +02:00
markuspetermann
94c4d52476 Fixed class.lescript_v2.php to work with ACMEv2
As GET /document never returns any Reply-Nonce Header, getLastNonce() caused an infinite loop.
The Content-Type for v2 must be application/jose+json.
2018-09-15 12:41:27 +02:00
Michael Kaufmann
174739bc0c Merge remote-tracking branch 'origin/master' into 0.10.0 2018-08-15 10:59:36 +02:00
Michael Kaufmann
b777053133 allow a higher amount of diskspace and traffic to be entered in the forms, fixes #560
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-08-15 10:59:16 +02:00
Michael Kaufmann
d0c2888508 Merge pull request #494 from xelaz/master
extend nginx letsencrypt (.well-known) redirect regex to https
2018-08-15 08:03:45 +02:00
Michael Kaufmann
ff8afef614 Merge pull request #563 from Froxlor/revert-561-patch-1
Revert "acme challenges can include hyphens (-)"
2018-08-12 18:11:45 +02:00
Michael Kaufmann
a28b2e8115 Revert "acme challenges can include hyphens (-)" 2018-08-12 18:11:36 +02:00
Michael Kaufmann
b0e348a2c5 Merge pull request #561 from oliverrahner/patch-1
acme challenges can include hyphens (-)
2018-08-12 17:09:03 +02:00
Oliver Rahner
512abda38d acme challenges can include hyphens (-)
made a small adjustment so that acme challenges like "CrgFuFZU-U7mwXxjjHZi8if851XGVjdPRtWN91LTWmM" also don't get redirected
2018-08-09 16:33:27 +02:00
Michael Kaufmann
963c7c4616 Merge remote-tracking branch 'origin/master' into 0.10.0 2018-07-10 09:47:20 +02:00
Michael Kaufmann
1690cadab9 show link to clear plaintext email account passwords if enabled; set store-plaintext-passwords default to 'off'; fixes #557
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
2018-07-10 09:47:01 +02:00
Michael Kaufmann
9e7715430b fix editing api-keys as customer
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2018-06-23 09:27:56 +02:00
Michael Kaufmann
4f69571e1c do not reload current page after apikey modification to prevent unwanted actions being executed (addKey)
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2018-06-22 10:13:48 +02:00
Michael Kaufmann
d4312fc481 update jquery/jquery-ui; fininshed api_key editing (needs a bit more validating); added PhpSettings-Unit-test
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2018-06-22 10:05:04 +02:00
Michael Kaufmann
f1d91dfef8 interface adjustments for apikey interaction
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2018-06-21 08:21:27 +02:00
Michael Kaufmann
f198833f8c Merge remote-tracking branch 'origin/master' into 0.10.0 2018-06-21 08:12:00 +02:00
Michael Kaufmann
da99398561 update jquery-ui
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2018-06-21 07:55:35 +02:00
Michael Kaufmann
436d141bd1 fix ticket access when posting answer
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2018-06-21 07:52:11 +02:00
Michael Kaufmann
aa881560cc deny access to tickets not owned by current user, thx to chbi
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2018-06-19 21:46:11 +02:00
Michael Kaufmann
06ef81cc5b adjust year in copyright in std-customer-index file, thx to demlak
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2018-06-17 09:41:31 +02:00
Michael Kaufmann
4a99e4ba57 Merge pull request #556 from nachtgeist/master
fix triggering an LE CSR when changing www on a main domain, fixes #526
2018-06-05 07:52:03 +02:00
Daniel Reichelt
2ba4137e7d fix triggering an LE CSR when changing www on a main domain
Prior to this, LE CSRs were triggered only when the wwwserveralias was
changed on alias domains, but not on main domains.

Fixes #526
2018-06-05 06:51:20 +02:00
Daniel Reichelt
72835c56ad trim trailing whitespace 2018-06-05 06:51:10 +02:00
Michael Kaufmann
d39cebc70e Merge remote-tracking branch 'origin/master' into 0.10.0 2018-06-01 08:01:09 +02:00
Michael Kaufmann
b80bdcbc4f forgot to add version file
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2018-05-29 15:54:44 +02:00
Michael Kaufmann
c1e62e6be7 get rid of serialization completely to avoid possible code execution, fixes #555
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2018-05-29 15:47:41 +02:00
Michael Kaufmann
10330f8a7a fix fallback redirect code when customredirect is enabled and default is selected
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2018-05-24 17:44:36 +02:00
Michael Kaufmann
18fb422a69 correct order of settings
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2018-05-24 14:50:52 +02:00
Michael Kaufmann
f8236dff7b fix not quite correctly webserver-log-piping
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2018-05-24 14:44:59 +02:00
Michael Kaufmann
8ccb898aa9 Merge remote-tracking branch 'origin/master' into 0.10.0 2018-05-24 13:25:24 +02:00
Michael Kaufmann
bad680cfdb enhancements for webserver-log settings
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2018-05-24 13:23:37 +02:00
Michael Kaufmann
5a070d6d91 add settings to customize webserver logs
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2018-05-24 11:36:13 +02:00
Robert Förster (Dessa)
07a3f76568 remove wheezy configs 2018-05-10 16:42:27 +02:00
Michael Kaufmann
d07d63e240 Merge remote-tracking branch 'origin/master' into 0.10.0 2018-05-07 10:57:55 +02:00
Michael Kaufmann
67b95a301b check only for existing .conf files when trying to find out whether a fpm pool config directory is empty; fixes #543
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2018-05-06 14:38:18 +02:00
Michael Kaufmann
926914788f Merge remote-tracking branch 'origin/master' into 0.10.0 2018-04-25 12:30:00 +02:00
Michael Kaufmann
6f9187d1bb Merge branch 'master' of github.com:Froxlor/Froxlor 2018-04-25 12:29:41 +02:00
Michael Kaufmann
84b8cda7ac allow usage of up to 255 characters in a txt record, fixes #548
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2018-04-25 12:29:30 +02:00
Michael Kaufmann
75616cc727 fix typo in german language file
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2018-04-25 12:27:59 +02:00
Michael Kaufmann
b3d018c506 corrected usage of default redirect code from settings; fixes #546
Signed-off-by: Michael Kaufmann <michael.kaufmann@aixit.com>
2018-04-25 12:27:40 +02:00
Robert Förster (Dessa)
2508d855e3 deprecate precise, as xenial configs are now available 2018-04-03 13:12:32 +02:00
Erik
a21f3c5a3f added xenial.xml (#533)
* added xenial.xml

* fixed touch commands as in commit 3c802038f2

* changed a2dismod php to a2dismod php7.0

* fixed overlooked a2dismod php to a2dismod php7.0
2018-04-03 12:59:14 +02:00
Michael Kaufmann (d00p)
060115c5e9 added new ApiParameterTest
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-04-01 10:35:55 +02:00
Michael Kaufmann (d00p)
697d972fba Merge remote-tracking branch 'origin/master' into 0.10.0 2018-04-01 10:35:33 +02:00
Michael Kaufmann (d00p)
3f69c97874 opzimize ApiParameter::getModFunctionString(); corrected FpmDaemons::update(); added a few more unit-tests
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-04-01 10:31:38 +02:00
Michael Kaufmann (d00p)
85407abfb4 optimize stats-folder-decision in Customers-ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-04-01 09:59:25 +02:00
Michael Kaufmann
20d9be537a Merge pull request #542 from d00p/patch-1
Update README.md
2018-03-29 13:11:11 +02:00
Michael Kaufmann
30d39d622d Update README.md 2018-03-29 13:10:33 +02:00
Michael Kaufmann (d00p)
e58192edc2 show whether curl extension is installed when trying to check for a new version in admin-dashboard
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-29 11:11:39 +02:00
Michael Kaufmann (d00p)
d15e4a8270 more unit-tests
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-27 14:43:24 +02:00
Michael Kaufmann (d00p)
45d7307a8f fix phpunit test for FpmDaemonTest
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-26 14:33:43 +02:00
Michael Kaufmann (d00p)
bf3ae3009f add tests/PhpAndFpm to phpunit-testsuite
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-26 14:28:32 +02:00
Michael Kaufmann (d00p)
cb3d5f3488 unit-test FpmDaemons-ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-26 14:26:05 +02:00
Michael Kaufmann (d00p)
efb416ae7c phpdoc for Admins-ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-26 10:13:51 +02:00
Michael Kaufmann (d00p)
c98be3c04f finished unit-tests for Mysqls-ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-26 09:53:09 +02:00
Michael Kaufmann (d00p)
6006b16c95 added first test for Mysqls-ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-25 12:38:57 +02:00
Michael Kaufmann (d00p)
c149cbacf7 more DomainZones unit-tests
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-23 13:35:50 +01:00
Michael Kaufmann (d00p)
48d7110779 add first unit tests for DomainZones ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-22 14:56:18 +01:00
Michael Kaufmann (d00p)
bd7f2c2654 add unit-tests for CustomerBackup-ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-21 20:22:43 +01:00
Michael Kaufmann (d00p)
5123b5fccd fix error-display in dns_editor.php
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-20 08:55:14 +01:00
Michael Kaufmann (d00p)
190c95baca created DomainZones ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-19 21:25:23 +01:00
Michael Kaufmann (d00p)
975d46044d added unit-tests for DirOptions
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-19 20:38:59 +01:00
Michael Kaufmann (d00p)
bf589cdec8 forgot to check for customer-id in CustomerBackups.delete()
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-19 10:52:38 +01:00
Michael Kaufmann (d00p)
715e5f7a64 fix update of domain as admin if domain is a std-subdomain; fix update of mysql-entry; add CustomerBackups-ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-19 10:45:12 +01:00
Michael Kaufmann (d00p)
dfcb7160cb fix global lng-array
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-18 08:45:20 +01:00
Michael Kaufmann (d00p)
f5654d5931 fix var-names in DirOptions-ApiCommand; fix pmd issues
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-18 08:42:22 +01:00
Michael Kaufmann (d00p)
2bf5fde0e5 Merge remote-tracking branch 'origin/master' into 0.10.0 2018-03-16 09:19:52 +01:00
Michael Kaufmann (d00p)
be0099bf01 add duplicate check to switch-server-ip script
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-16 09:18:02 +01:00
Michael Kaufmann (d00p)
7a68dfc450 DirProtections and DirOptions stuff
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-15 19:35:56 +01:00
Michael Kaufmann (d00p)
858a9ba6a4 added DirProtections.update() and various unit-tests
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-15 11:01:17 +01:00
Michael Kaufmann (d00p)
f2809c47ac finished DirProtections.add() and some basic tests
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-14 19:41:12 +01:00
Michael Kaufmann (d00p)
616fb77de5 check for installed/configured froxlor in api.php and return 404 if not
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-14 18:13:32 +01:00
Michael Kaufmann (d00p)
b03d41087a Merge remote-tracking branch 'origin/master' into 0.10.0 2018-03-14 11:41:42 +01:00
Michael Kaufmann (d00p)
724e88b94f rename handler php5-fastcgi to php-fastcgi, just cosmetics; fixes #536
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-14 11:37:45 +01:00
Michael Kaufmann (d00p)
3c802038f2 split touch-command for multiple files into single ones, fixes #535
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-14 11:35:03 +01:00
Michael Kaufmann (d00p)
fe385b7800 Merge remote-tracking branch 'origin/master' into 0.10.0 2018-03-13 10:41:01 +01:00
Michael Kaufmann (d00p)
38b57117e2 minor fixes in froxlor-sql file
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-13 10:40:45 +01:00
Michael Kaufmann (d00p)
7e47383ee3 ignore NumberOfChildren pmd warning
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-12 22:12:16 +01:00
Michael Kaufmann (d00p)
ae3d954766 started work on DirProtections-ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-12 22:07:51 +01:00
Michael Kaufmann (d00p)
52da7ad40f exclude some irritating pmd rules #2
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-12 21:47:14 +01:00
Michael Kaufmann (d00p)
309e613c83 exclude some irritating pmd rules
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-12 21:40:19 +01:00
Michael Kaufmann (d00p)
05857985f8 add more tests for Email-ApiCommands
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-12 21:29:03 +01:00
Michael Kaufmann (d00p)
a7523bbdea add domainid to result-list of Emails.get(); fix typo in EmailAccounts.add(); enhance debugging in Database-class
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-12 15:52:34 +01:00
Michael Kaufmann (d00p)
54deec87d0 add a few emails-apicommand unit-tests
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-12 15:41:08 +01:00
Michael Kaufmann (d00p)
f0e084ef0e minor fixes in EmailAccounts.update()
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-12 14:17:45 +01:00
Michael Kaufmann (d00p)
fa7bb53d58 added EmailAccounts-ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-12 14:13:35 +01:00
Michael Kaufmann (d00p)
6fc8cce8f5 add EmailAccounts.add; added wrapper function ApiCommand.getMailTemplate() to reduce code-duplication
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-12 13:44:44 +01:00
Michael Kaufmann (d00p)
2e597ef7d9 remove unused local variables
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-12 11:09:30 +01:00
Michael Kaufmann (d00p)
ff611fa8dc fix parameter for ApiCommand::getCustomerData()
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-12 10:57:31 +01:00
Michael Kaufmann (d00p)
c920bf6a63 some code-reduction
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-12 10:45:46 +01:00
Michael Kaufmann (d00p)
66ebfaf21b Merge remote-tracking branch 'origin/master' into 0.10.0 2018-03-12 10:23:53 +01:00
Michael Kaufmann (d00p)
349fa7a761 avoid possible undefined index if no issuer-organisation is set in a certificate
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-12 10:22:50 +01:00
Michael Kaufmann (d00p)
81bd9d945d fix parameter customerid for Emails.add() in unit-test
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-11 10:26:05 +01:00
Michael Kaufmann (d00p)
b205f8ea5d add EmailFowarders ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-11 10:24:17 +01:00
Michael Kaufmann (d00p)
7b52c0c78c fix default value of panel.no_robots settings; add phpdoc for Database-class-methods
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-08 17:03:17 +01:00
Michael Kaufmann (d00p)
164650adc3 added Emails.update() and Emails.delete() commands
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-08 11:49:28 +01:00
Michael Kaufmann (d00p)
9e97e82990 Merge remote-tracking branch 'origin/master' into 0.10.0 2018-03-06 21:08:02 +01:00
Michael Kaufmann (d00p)
cd5cef51e8 allow config and settings json file for config-services.php to be downloaded from a remote url
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-06 21:07:08 +01:00
Michael Kaufmann (d00p)
231159a6c6 added first methods of Emails ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-06 14:02:27 +01:00
Michael Kaufmann (d00p)
a83031504f implement generating of api-key for customer
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-06 12:43:24 +01:00
Michael Kaufmann (d00p)
893fd0774c implement deleting of api-keys via webinterface
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-06 12:26:41 +01:00
Michael Kaufmann (d00p)
704188fe27 Merge remote-tracking branch 'origin/master' into 0.10.0 2018-03-06 11:06:31 +01:00
Michael Kaufmann (d00p)
a621fd3b09 run cronjob at the end of config-services script (when using --apply), thx v3ng
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-06 11:05:26 +01:00
Michael Kaufmann (d00p)
0c43c5d2b5 backport config-services --import-settings parameter from 0.10.0
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-06 10:52:57 +01:00
Michael Kaufmann (d00p)
864331d371 code reduction; added unit-tests for Certificates-Command; minor fixes here and there
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-05 23:35:00 +01:00
Michael Kaufmann (d00p)
f5ec759d99 added Certificates-ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-05 14:21:36 +01:00
Michael Kaufmann (d00p)
b2e2590324 implemented SubDomains.update; minor fixes and enhancements in Domains-Command and validateUrl-function
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-05 12:13:01 +01:00
Michael Kaufmann (d00p)
ae4a7ff943 wrap ip-validating in Domains-ApiCommand to reduce duplicate code
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-05 08:12:08 +01:00
Michael Kaufmann (d00p)
a869bc58cd fix wrong variable-name in SubDomains.listing
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-04 19:47:48 +01:00
Michael Kaufmann (d00p)
cfa07bab47 simplified and wrapped internal api calls
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-04 18:30:16 +01:00
Michael Kaufmann (d00p)
b664917147 fix sql variable in Admins.delete
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-04 12:44:31 +01:00
Michael Kaufmann (d00p)
b12392f0a9 Merge remote-tracking branch 'origin/master' into 0.10.0 2018-03-04 12:40:55 +01:00
Michael Kaufmann (d00p)
b07d6ceeaa started UI api-key management
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-04 12:40:47 +01:00
Michael Kaufmann
aff6d82321 Merge pull request #531 from Crease29/patch-1
Link domains to HTTPS in certificate list
2018-03-04 12:11:12 +01:00
Kai Neuwerth
91cecf8c1e Link domains to HTTPS in certificate list
As an admin I want to check if the certificate of a website is working.
Therefore I click on the domain in the SSL certificate list and have to prepend "https" to the URL later.
In this case I'd link the domain to HTTPS initially.
2018-03-04 11:43:50 +01:00
Michael Kaufmann (d00p)
702b52d13e forgot to save again
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-03 21:42:34 +01:00
Michael Kaufmann (d00p)
bb3fddb08f optimize phpmd config
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-03 21:39:51 +01:00
Michael Kaufmann (d00p)
7cc17b9ca5 fix short variables
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-03 21:29:16 +01:00
Michael Kaufmann (d00p)
f30887e3c0 removed unused local variables
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-03 21:26:37 +01:00
Michael Kaufmann (d00p)
0d7afc5c24 fixes in move-domain-to-another-customer functionality in Domains.update
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-03 21:10:58 +01:00
Michael Kaufmann (d00p)
826f1378d2 minor fixes to Domains.update + another unit-test
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-03 15:55:23 +01:00
Michael Kaufmann (d00p)
6d8b22dccf Merge remote-tracking branch 'origin/master' into 0.10.0 2018-03-03 14:58:46 +01:00
Michael Kaufmann
26c3c8e6f0 Merge pull request #527 from JB1985/patch-2
Update german.lng.php
2018-03-03 14:58:38 +01:00
Michael Kaufmann (d00p)
0f6cc05089 Merge remote-tracking branch 'origin/master' into 0.10.0 2018-03-03 14:58:06 +01:00
Michael Kaufmann
08814f8c9a Merge pull request #530 from michaelzangl/fix-hostname-error-message
Fix hostname error message
2018-03-03 14:57:22 +01:00
Michael Kaufmann
632eb98df9 Merge pull request #529 from michaelzangl/fix-installer-path
Froxlor installer: Use same file path for chmod.
2018-03-03 13:05:59 +01:00
Michael Zangl
909c983aec Fix invalidhostname error message (de). 2018-03-03 11:49:58 +01:00
Michael Zangl
8642254175 Fix invalidhostname error message. 2018-03-03 11:48:26 +01:00
Michael Zangl
7e81b0bb5a Froxlor installer: Use same file path for chmod. 2018-03-03 11:18:28 +01:00
Michael Kaufmann (d00p)
22a48cac33 Merge remote-tracking branch 'origin/master' into 0.10.0 2018-03-02 19:37:32 +01:00
Michael Kaufmann (d00p)
20eaa7bc08 fix missing sql-prepared-statement parameter, fixes #528
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-02 19:36:56 +01:00
Michael Kaufmann (d00p)
1605d2af07 enhance phpdox config
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-02 18:25:06 +01:00
JB1985
abb94c9189 Update german.lng.php
Übersetzung Änderung von Lets Encrypt
2018-03-02 17:28:30 +01:00
Michael Kaufmann (d00p)
cadb6618ec list() is a reserved php keyword, changed ApiCommand::list() to ApiCommand::listing()
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-02 17:22:47 +01:00
Michael Kaufmann (d00p)
594512404f optimized CustomersTest and DomainsTest; minor fixes in SubDomains-ApiCommand; added more tests for SubDomains-Command
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-02 15:24:46 +01:00
Michael Kaufmann (d00p)
aeb8655cc3 fix sql query in Domains.get; minor fixes in Domains.update; first unit-test for Domains.update
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-01 19:59:27 +01:00
Michael Kaufmann (d00p)
601d16b17c minor fixes in Domains.add; added more tests
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-01 19:41:57 +01:00
Michael Kaufmann (d00p)
02616d3080 minor fixes and first tests for Domains-ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-03-01 16:46:47 +01:00
Michael Kaufmann (d00p)
2bf5e90a77 add testsuite parameter to phpunit to respect our required test-order; minor fixes in Domains- and SubDomains Command
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-27 18:07:43 +01:00
Michael Kaufmann (d00p)
75bc6d32ab minor fixes in SubDomains.add; first Unit-Tests for SubDomains-ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-27 17:10:52 +01:00
Michael Kaufmann (d00p)
3e0b551416 fix copy'n'paste fail
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-27 15:56:05 +01:00
Michael Kaufmann (d00p)
a038e35e45 added Subdomains.add; minor fixes and enhancements
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-27 15:54:07 +01:00
Michael Kaufmann (d00p)
6318e5514b ignore some more checkstyle rules
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-27 10:54:03 +01:00
Michael Kaufmann (d00p)
392db944a2 started work in SubDomains-ApiCommand; minor fixes
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-27 10:34:37 +01:00
Michael Kaufmann (d00p)
b097c19c0a correct phpcs config
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-27 09:30:57 +01:00
Michael Kaufmann
b46d3a3769 Update README.md
new test :)
2018-02-27 08:59:49 +01:00
Michael Kaufmann
a2172329cd Update README.md
added CI build-status
2018-02-27 08:50:54 +01:00
Michael Kaufmann (d00p)
309b70c0f8 completed Ftps-ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-27 08:23:19 +01:00
Michael Kaufmann (d00p)
4b9ed8ee39 use correct order
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-26 22:39:06 +01:00
Michael Kaufmann (d00p)
2599f61b32 add jenkins build.xml and more; added first unit-tests
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-26 22:35:04 +01:00
Michael Kaufmann (d00p)
9a4359e010 fix IpsAndPorts.delete
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-26 19:56:03 +01:00
Michael Kaufmann (d00p)
4d89f614e3 remove unnecessary checks as getParam() validates the existance already
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-26 18:08:43 +01:00
Michael Kaufmann (d00p)
4fad0def1e fix mailer variable and fix typo in Ftps.add and Ftps.delete
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-26 18:02:18 +01:00
Michael Kaufmann (d00p)
c093783904 forgot the mailobject :P
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-26 16:02:09 +01:00
Michael Kaufmann (d00p)
257855b43b fix typo in field-value for ApiCommand::getUserDetail()
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-26 16:00:54 +01:00
Michael Kaufmann (d00p)
55ec20be10 use Ftps.add in webinterface
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-26 15:55:49 +01:00
Michael Kaufmann (d00p)
b0f355ba2f fixed in Mysqls.add, added Ftps.add
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-26 15:49:41 +01:00
Michael Kaufmann (d00p)
ceb8619552 preparations for assign-multiple-ips-to-an-admin in Api, not in webinterface yet
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-26 12:15:48 +01:00
Michael Kaufmann (d00p)
6191ee6fba add Ftps.list and Ftps.delete
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-26 09:36:58 +01:00
Michael Kaufmann (d00p)
c9256c0020 add 'adminname' to result in Customers.get; fix Customers.move and return customer-data there instead of just true
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-26 09:01:13 +01:00
Michael Kaufmann (d00p)
592c9ed0b9 automatically trim() all parameters given
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-26 08:21:56 +01:00
Michael Kaufmann (d00p)
4a1decf359 do not update fields of customer a customer cannot even change; unset custom_notes when admin of customer set custom_notes_show to 0
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-26 07:51:44 +01:00
Michael Kaufmann (d00p)
ae42e87a64 fix in Admins.update; code-format Customers ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-25 21:26:51 +01:00
Michael Kaufmann (d00p)
5c330505ea correct Admins.update and Admins.delete
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-25 20:47:36 +01:00
Michael Kaufmann (d00p)
c65d95c1ef Merge remote-tracking branch 'origin/master' into 0.10.0 2018-02-25 18:29:28 +01:00
Michael Kaufmann (d00p)
2b366c8f23 add field for fullchain to be stored in ssl-certificates-table; create fullchain file if given (it's not used by froxlor); do not generate/renew certificates for disabled customers domains
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-25 18:22:15 +01:00
Michael Kaufmann (d00p)
e66dde2e64 id <> loginname, grrr
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-25 17:08:30 +01:00
Michael Kaufmann (d00p)
f32a1921c5 re-read admin/customer when adding/updating so we return the fields from the table, not the placeholders of the prepared-statement
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-25 17:03:49 +01:00
Michael Kaufmann (d00p)
0958d07f23 fixes in Admins and Customers ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-25 16:49:24 +01:00
Michael Kaufmann (d00p)
a222114d0a remove unnecessary parameter-checks as they will never happen; make Customers.update callable for customers
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-25 15:02:58 +01:00
Michael Kaufmann (d00p)
243b68cc37 minor changes for testing
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-25 11:47:28 +01:00
Michael Kaufmann (d00p)
2f30d85d32 minor changes in ApiCommand; added Ftps.get ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-24 20:52:21 +01:00
Michael Kaufmann (d00p)
ca07621de7 reduce mysql-usage counter for admins too when deleting a mysql-database
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-24 20:12:57 +01:00
Michael Kaufmann (d00p)
e5a1b504d7 consistency replace dbserver with mysql_server everywhere
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-24 16:52:14 +01:00
Michael Kaufmann (d00p)
20aac1ccd4 finish Mysqls.update, untested
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-24 16:46:56 +01:00
Michael Kaufmann (d00p)
bda652f947 tiny fixes in Domains.add and Domains.update
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-24 16:26:47 +01:00
Michael Kaufmann (d00p)
87912a9e07 refactored moveCustomerToAdmin() function to Customers.move ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-24 16:06:53 +01:00
Michael Kaufmann (d00p)
0bf430e0c1 let customers edit password, def-language and theme in Customers.edit
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-24 15:02:49 +01:00
Michael Kaufmann (d00p)
d2aaf84eff added Mysqls.add
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-24 12:13:47 +01:00
Michael Kaufmann (d00p)
b5ebe48715 forgot to save this one
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-24 11:01:29 +01:00
Michael Kaufmann (d00p)
9a61a56732 enhance phpdoc and add @access to specify which usergroup can use the ApiCommands; add --import-settings parameter to config-services.php CLI script to gain even more automatism when setting up
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-24 10:57:52 +01:00
Michael Kaufmann (d00p)
81d6a856d9 forgot to hit save :P
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-23 19:51:06 +01:00
Michael Kaufmann (d00p)
344ca827e4 beautify api-help in webinterface
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-23 19:46:57 +01:00
Michael Kaufmann (d00p)
1c4ecdffbf use correct dbserver for getting mysql-size info in Mysqls.get()
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-23 18:24:10 +01:00
Michael Kaufmann (d00p)
831ee221f6 make lng, version, dbversion and branding protected variables of ApiCommand to avoid the need of 'global' statement
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-23 18:18:31 +01:00
Michael Kaufmann (d00p)
6409fb2dbe started working on Mysqls-ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-23 15:17:22 +01:00
Michael Kaufmann (d00p)
662f537a0d fixes in Admins.update(); use ApiCommand for theme-, language- and password-change
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-23 12:48:17 +01:00
Michael Kaufmann (d00p)
8e0bfe9d09 add Admins.update()
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-23 11:57:29 +01:00
Michael Kaufmann (d00p)
8930d2a1bf check remote-ip when ip-restriction is set in api_keys table
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-23 11:08:24 +01:00
Michael Kaufmann (d00p)
d9ec214e17 secure included webinterface-modules; add settings-functions to Froxlor-ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-22 21:05:58 +01:00
Michael Kaufmann (d00p)
dfb5d33a56 add Admins.add()
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-22 16:51:56 +01:00
Michael Kaufmann (d00p)
b42a7b1b26 show basic api doc in webinterface (top-menu - options - API help)
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-22 13:41:28 +01:00
Michael Kaufmann (d00p)
a468fe50df filter deactivated users who want to use the API; fix error-output in Customers::update()
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-22 11:42:13 +01:00
Michael Kaufmann (d00p)
c1875132ef fix unchecked-checkbox value passed to API
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-22 11:34:40 +01:00
Michael Kaufmann (d00p)
332e29be24 lots of phpdoc; fix Customers::update()
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-22 11:16:55 +01:00
Michael Kaufmann (d00p)
c93e2678f7 make Customers::update() also work with loginname as an alternative to the id
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-22 10:47:14 +01:00
Michael Kaufmann (d00p)
f8fe4be3ef fix parameters for checkboxes when passed via webinterface
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-21 14:52:23 +01:00
Michael Kaufmann (d00p)
689ca853c3 minor fixes in Customers and Domains ApiCommands, added list() and get() for Admins-ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-21 14:38:27 +01:00
Michael Kaufmann (d00p)
8310e8554b enable usage of 'domainname' as an alternative to 'id' for Domains::get() and Domains::delete(); enable usage of 'loginname' as an alternative to 'id' for Customers::get() and Customers::delete()
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-21 13:14:54 +01:00
Michael Kaufmann (d00p)
b56414ed0e add sql-query of last statement to sql-debug for debugging purposes; fix default-ssl-ip setting and allow 'none' value
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-21 12:16:50 +01:00
Michael Kaufmann (d00p)
5480fcbf5d add default-ssl-ip setting
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-21 11:50:34 +01:00
Michael Kaufmann (d00p)
26b9c030b5 leave default-values for adding std-subdomain when adding customer from the parameters-array; do not require ipandports parameter when adding domain but rather default to system.defaultip if no ipandport is given
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-21 10:57:46 +01:00
Michael Kaufmann (d00p)
aef528bea1 Merge remote-tracking branch 'origin/master' into 0.10.0 2018-02-21 08:54:29 +01:00
Michael Kaufmann (d00p)
d5b9ad3452 darn, stay php-5.3 compatible, thx greppy
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-20 21:37:06 +01:00
Michael Kaufmann (d00p)
5437fcdc89 insert tasks to rebuild configs etc. after import of settings, thx to v3ng for noticing
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-20 19:15:55 +01:00
Michael Kaufmann (d00p)
b9653c5abd fix company-required check for good now :P
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-20 19:11:33 +01:00
Michael Kaufmann (d00p)
eabc78c84f enhance check for requirement of company field
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-20 14:21:40 +01:00
Michael Kaufmann (d00p)
033393880d fix typo in variable name
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-20 14:14:47 +01:00
Michael Kaufmann (d00p)
6bcfb81c6c Merge remote-tracking branch 'origin/master' into 0.10.0 2018-02-19 14:10:42 +01:00
Michael Kaufmann (d00p)
b2ac1fb593 add FpmDaemons ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-19 13:58:39 +01:00
Michael Kaufmann (d00p)
8c6ae4f3a3 add PhpSettings ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-19 13:36:15 +01:00
Michael Kaufmann (d00p)
131efc544d fix syntax error in lang file, fixes #522
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-19 12:27:00 +01:00
Michael Kaufmann (d00p)
5524ff7cae fixes in Customers::update()
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-19 11:36:01 +01:00
Michael Kaufmann (d00p)
603e14913b finished Customer::update(), untested
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-19 10:45:41 +01:00
Michael Kaufmann
160474f2b6 Merge pull request #521 from JB1985/master
Update german.lng.php
2018-02-19 09:03:32 +01:00
JB1985
168738b23a Update german.lng.php
Statt Benutze Lets Encrypt => SSL Zertifikat erstellen (Let\'s Encrypt)
2018-02-19 09:02:34 +01:00
Michael Kaufmann (d00p)
133af365bd enhance ApiCommand::getParam() to specify required and optional parameter
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-19 08:59:24 +01:00
Michael Kaufmann (d00p)
532551263d add new api-module to output list of possible modules/functions
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-18 10:19:17 +01:00
Michael Kaufmann (d00p)
bdfd601dae Merge remote-tracking branch 'origin/master' into 0.10.0 2018-02-18 10:17:38 +01:00
Michael Kaufmann (d00p)
9619abdad7 when importing settings with enabled ssl flag, validate that the target system has ssl enabled ip's to avoid unexpected behaviour, tthx v3ng for testing
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-17 16:00:50 +01:00
Michael Kaufmann (d00p)
fd287e7be4 add apache restart command after enabling modules in config-templates
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-17 14:51:04 +01:00
Michael Kaufmann (d00p)
5afdbae83a minor phpDoc fixes in Logger classes
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-16 15:50:31 +01:00
Michael Kaufmann (d00p)
7c96164770 fix lng availability; add returncode for not-found messages
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-16 15:39:59 +01:00
Michael Kaufmann (d00p)
60defd3cdf fix unlimited flags when adding customer; add debug flag to log all api-requests for testing purposes now
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-16 14:34:55 +01:00
Michael Kaufmann (d00p)
8978dd3a4b std-subdomain <> ip connection is already handled by Domains::add()
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-16 13:55:12 +01:00
Michael Kaufmann (d00p)
1e45da2410 more work on Customer-ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-16 13:27:31 +01:00
Michael Kaufmann (d00p)
2da2912c9c set update-check-urls to api-version; started working on Customers-ApiCommand
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-16 10:56:27 +01:00
Michael Kaufmann (d00p)
4d12a4f37b Merge remote-tracking branch 'origin/master' into 0.10.0 2018-02-16 09:24:14 +01:00
Michael Kaufmann (d00p)
350e3d733a do not check for options if field is disabled, unset enabled-ownvhost flags for fcgid/fpm if the corresponding other one is activated; fixes #518
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-16 09:22:34 +01:00
Michael Kaufmann (d00p)
81602f17be add Domains api module
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-15 14:44:48 +01:00
Michael Kaufmann (d00p)
df5fb963c1 make language strings the language the user uses
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-15 13:03:30 +01:00
Michael Kaufmann (d00p)
0fc2fbaf09 add language strings (english only currently)
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-15 12:59:34 +01:00
Michael Kaufmann (d00p)
a82d5cf764 minor fixes
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-15 11:37:38 +01:00
Michael Kaufmann (d00p)
2c1f76e6a4 definetly require json extension now
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-15 07:56:27 +01:00
Michael Kaufmann (d00p)
d068477a93 set version to 0.10.0
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-15 07:54:21 +01:00
Michael Kaufmann (d00p)
4663f8c6ec converted IpsAndPorts to API
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-15 07:48:03 +01:00
Michael Kaufmann (d00p)
dd371c72a2 start api implementation
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-15 07:47:35 +01:00
Michael Kaufmann (d00p)
6f91bece17 fix postfix config for postfix/courier on precise and trusty, fixes #516
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-15 07:44:54 +01:00
Michael Kaufmann (d00p)
5c30961d3c set version to 0.9.39.5 for bugfix release (imap/pop3 ticks not enabled if active in hosting plan when editing hosting plan)
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-14 13:31:39 +01:00
Michael Kaufmann (d00p)
edd5ef0ca0 fix correct display of selected checkbox imap/pop3 when editing hosting plan
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-14 07:40:39 +01:00
Michael Kaufmann (d00p)
6befe85656 fix add/edit domain due to wrong access to settings; setting version to 0.9.39.4 for bugfix release
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-13 12:23:05 +01:00
Michael Kaufmann (d00p)
27f8c8b438 show domains of disabled customers also as disabled
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-13 11:49:15 +01:00
Michael Kaufmann (d00p)
fc0c796b68 avoid undefined variables/indexes
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-13 10:58:06 +01:00
Michael Kaufmann (d00p)
482e8c9a11 set version to 0.9.39.3 for maintenance release and upcoming debian package so the new hosting-plan feature is included
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-13 09:06:49 +01:00
Michael Kaufmann (d00p)
7a664a9990 clean up panel_diskspace/panel_diskspace_admins when removing customer/admin
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-13 08:21:45 +01:00
Michael Kaufmann (d00p)
372ab5d9c8 add domain flag to avoid generation of nginx try_files directive in webroot which is not suitable for some applications; fixes #461
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-13 08:12:58 +01:00
Michael Kaufmann (d00p)
de70dbb888 fix checked-property when applying hosting-plan for allowed-phpconfigs
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-12 14:58:17 +01:00
Michael Kaufmann (d00p)
4d7ceb9efe add missing question-string
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-12 13:33:29 +01:00
Michael Kaufmann (d00p)
bb792f228f add new hosting-plans feature
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-12 13:28:13 +01:00
Michael Kaufmann (d00p)
017396197e set version to 0.9.39.2 for bugfix release
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-12 07:49:07 +01:00
Michael Kaufmann (d00p)
216f013c96 add script to automatically configure services from shell without the need of copy/paste from the interface
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-12 07:47:51 +01:00
Michael Kaufmann (d00p)
05f1bf0a1f meh, forgot to uncomment the settings storage for settings-import
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-12 07:46:38 +01:00
Michael Kaufmann (d00p)
295fbae6f5 create bash script to generate proftpd-certificates in case system does not use /bin/bash as shell
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-11 16:10:10 +01:00
Michael Kaufmann (d00p)
ca4c93ac92 set default dns server in config-templates; separate CmdLineHandler from switch-server-ip script for further usage
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-11 13:57:07 +01:00
Michael Kaufmann (d00p)
13b1503bf2 set version to 0.9.39.1 for maintenance release
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-10 16:06:57 +01:00
Michael Kaufmann (d00p)
2980397545 fix include path in lib/ajax.php
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-10 10:13:55 +01:00
Michael Kaufmann (d00p)
5612720342 only let admin select php-configs that the customer is allowed to use to avoid unwanted php-config changes when customer edits domain, refs #514
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-09 13:57:23 +01:00
Michael Kaufmann (d00p)
4d3fa6eca5 get rid of the need for allow_url_fopen
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-09 10:50:14 +01:00
Michael Kaufmann (d00p)
05b4c58aa8 fix updating wrong column when deleting a fpm configuration
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-09 09:20:46 +01:00
Michael Kaufmann (d00p)
f290497b64 fix selected phpfpm daemon when editing php-configuration, fixes #514
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-09 07:33:28 +01:00
Michael Kaufmann (d00p)
b4dd35eed2 correct description of nsswitch.conf file
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-08 07:35:06 +01:00
Michael Kaufmann (d00p)
ec21e28000 use md5() instead of base64_encode for dummy-fpm-socket name to avoid possible equal-sign in string which leads to an invalid socket, fixes #513
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-07 15:10:59 +01:00
Michael Kaufmann (d00p)
0aa707ebc9 set version to 0.9.39 for upcoming release
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-06 12:19:21 +01:00
Michael Kaufmann (d00p)
f38a0fd8b6 remove unnecessary and out-of-date info from README, fixed variable typo in lib/init.php
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-02-05 08:36:25 +01:00
Michael Kaufmann (d00p)
a6b2daa77d fix typo
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-30 14:41:56 +01:00
Michael Kaufmann (d00p)
7ae31496ac add requirement check for php-json as settings import/export uses json_decode/json_encode
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-30 07:58:24 +01:00
Michael Kaufmann (d00p)
c62dd2ecf4 fix mysql-strict-mode issue (hopefully for good), enhance error-reporting when importing froxlor.sql on installation
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-29 20:04:54 +01:00
Michael Kaufmann (d00p)
840b5ea229 add new feature: import/export of settings
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-28 14:33:00 +01:00
Michael Kaufmann (d00p)
d8a3015303 put le acme version setting right above the CA setting, less confusing
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-27 11:50:34 +01:00
Michael Kaufmann (d00p)
194b7863b8 fix invalid ipv6 value in mysql-access-host setting
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-27 11:37:06 +01:00
Michael Kaufmann (d00p)
f034695290 remove '/etc/postfix/master.cf: line x: using backwards-compatible default setting chroot=y' warning; set correct permission for dkim-public key as it should not be group or other writable
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-27 11:14:22 +01:00
Michael Kaufmann (d00p)
f896fe11a0 do not split dkim-entry content in generateDkimEntries(); re-add braces to enclose TXT record content
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-27 10:09:43 +01:00
Michael Kaufmann (d00p)
2603a9c869 add new setting to specify values for the PATH env-variable for php-fpm
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-26 17:30:20 +01:00
Michael Kaufmann (d00p)
fcd0dddfd5 Update phpMailer to 5.2.26
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-26 17:18:12 +01:00
Michael Kaufmann (d00p)
3fb92259a8 readd starting and ending quotes which got removed with the braces in #503
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-26 17:17:22 +01:00
Michael Kaufmann
54d7b01ac5 Merge pull request #506 from RipClaw2971/http2_fix
http2 could be set even if http2 is not enabled
2018-01-22 14:43:10 +01:00
Michael Kaufmann (d00p)
ca0ab1f97a add fixed dovecot/conf.d/10-ssl.conf template for debian stretch; update phpMailer to 5.2.26
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-21 23:37:09 +01:00
Michael Kaufmann (d00p)
f3733ca249 set apache-2.4 as default ON also in froxlor.sql; fix wrong DbManagerMySQL::disableUser, fixes #505
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-18 19:50:28 +01:00
Andreas Grundler
7442bf7347 http2 Konfiguration nur einfügen wenn http2 in den Einstellungen aktiviert ist 2018-01-18 18:30:38 +01:00
Andreas Grundler
6ac3cb2014 Revert "http2 Konfiguration nur einfügen wenn http2 in den Einstellungen aktiviert ist"
This reverts commit c3fb6f6a1c.
2018-01-18 18:23:08 +01:00
Andreas Grundler
ca76e572a2 http2 Option darf nur dann zu sehen sein wenn http2 in den Einstellungen aktiv ist 2018-01-18 18:18:30 +01:00
Andreas Grundler
c3fb6f6a1c http2 Konfiguration nur einfügen wenn http2 in den Einstellungen aktiviert ist 2018-01-18 18:16:53 +01:00
Michael Kaufmann
1796a8ff17 Merge pull request #503 from lonesomewalker/patch-1
Update class.DnsEntry.php
2018-01-17 07:54:57 +01:00
lonesomewalker
52c7839b9b Update class.DnsEntry.php
Klammerfehler bei Bind, PowerDNS braucht ja keinen Linesplit.
2018-01-16 14:57:42 +01:00
Michael Kaufmann (d00p)
d16a7b2089 on installation, set apache-2.4 as default if apache is detected; clearify that apache2 is 2.2; output complete folder where the userdata.inc.php file is to be put when necessary to avoid misunderstanding
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-15 07:45:50 +01:00
Michael Kaufmann (d00p)
9a00a67f71 apache2-suexec => apache2-suexec-pristine for debian stretch
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-13 11:33:20 +01:00
Michael Kaufmann (d00p)
6e651200ca Make php.ini flag/value possibilities dynamic (settings)
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-11 13:04:38 +01:00
Michael Kaufmann (d00p)
29968e6026 add stretch config-templates, testers/feedback welcome
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-11 10:44:42 +01:00
Michael Kaufmann (d00p)
8c61773280 fix usage of extensions from limit_extensions list in apache-cron
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-10 17:01:17 +01:00
Michael Kaufmann (d00p)
29433ce963 escape possible dots in extension (e.g. to allow .php.xml or similar)
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-10 15:49:07 +01:00
Michael Kaufmann (d00p)
eed3a91385 fix (not yet perfect) regex for limit_extension setting
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-10 15:45:21 +01:00
Michael Kaufmann (d00p)
62006d584e fix limit_extensions setting
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-10 15:42:11 +01:00
Michael Kaufmann (d00p)
bba872618a fix ssl-procotols in apache-cron; fix files-match regex in apache-cron
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-10 15:28:48 +01:00
Michael Kaufmann (d00p)
941dd14c72 read limit_extensions value from wrong array
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-10 15:22:22 +01:00
Michael Kaufmann (d00p)
f2a79d4d96 add new security.limit_extensions setting to fpm-daemon settings
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-10 15:20:19 +01:00
Michael Kaufmann (d00p)
281b131c62 ups, forgot to adjust version in lib/version.inc.php
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-10 10:21:02 +01:00
Michael Kaufmann (d00p)
4bcdfc0786 Added option to set the TLS protocol versions to be used in webservers
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-10 10:12:26 +01:00
Michael Kaufmann (d00p)
9312e4967e fix access to idle-timeout setting which moved from global settings to per-fpm-daemon setting, thx to gunnyst for pointing this out
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-10 08:45:20 +01:00
Michael Kaufmann (d00p)
6b44dfe9b2 well, we should also save the new settings :)
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-09 17:22:20 +01:00
Michael Kaufmann (d00p)
ba58991d11 allow per php-config setting of adding '-pass-header Authorization' / 'CGIPassAuth On' to the domains vhosts
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-09 17:14:57 +01:00
Michael Kaufmann (d00p)
84abb33e54 exclude wildcard-domains agains also vor ACMEv2 of LE2
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-09 17:12:55 +01:00
Michael Kaufmann (d00p)
07a4f045f1 do not advertise wildcard-certificates as it might never be possible in froxlor (no http-01 challenge)
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-09 16:08:13 +01:00
Michael Kaufmann (d00p)
f49cb81e49 disable wildcard-usage with Let's Encrypt as ACME-v2 only supports the dns-01 challenge for now (pity)
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-09 15:33:23 +01:00
Michael Kaufmann (d00p)
b2b9d4e31a add missing setting-strings for new acme-version setting; allow using let's encrypt with wildcard-alias when using ACME-v2
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-09 14:56:41 +01:00
Michael Kaufmann (d00p)
d40d1f30b6 make it a setting to switch between ACME v1 and v2
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-09 14:50:52 +01:00
Michael Kaufmann (d00p)
9aaadb1f8b implement lets-encrypt api-v02 (testing only currently; not activated in froxlor, test with 'php froxlor_master_cronjob.php --letsencrypt_v2 --debug' but set api endpoint to staging); no chain is returned currently, seems to be a known bug
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-09 14:40:36 +01:00
Michael Kaufmann (d00p)
3969ef63c5 do not check hide-options 'domains' in customer_tickets, fixes #502
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-09 11:18:03 +01:00
Michael Kaufmann (d00p)
d8abe30c44 create dummy pool-config whenever a fpm-daemons configdir is empty so it still restarts
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-09 09:25:56 +01:00
Michael Kaufmann (d00p)
eaa10ce6a5 add option to update php-configs for all subdomains when editing a domain as admin (default: yes)
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-08 15:31:27 +01:00
Michael Kaufmann (d00p)
c434249616 allow admin to set php-configs that can be used by customers
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-08 14:45:00 +01:00
Michael Kaufmann (d00p)
b849a5f29a preparations for php-config select for customers
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-08 13:59:30 +01:00
Michael Kaufmann (d00p)
3dc6a64252 fix pm select when editing fpmdaemon; fix saving of pm value
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-08 10:22:09 +01:00
Michael Kaufmann (d00p)
ebd636494a fix wrong table constant
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-08 10:11:38 +01:00
Michael Kaufmann (d00p)
07caf55f79 fixes to multi-fpm in cron
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-08 09:16:00 +01:00
Michael Kaufmann (d00p)
73868b7947 soften the file cleaning to reduce risk
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-07 23:31:39 +01:00
Michael Kaufmann (d00p)
af55fe5b82 add possibility to add multiple php-fpm instances
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2018-01-07 14:55:25 +01:00
Michael Kaufmann
de408347fc Merge pull request #500 from heavygale/patch-1
Update preconfig_0.9.inc.php
2018-01-05 18:26:57 +01:00
heavygale
ea96039128 Update preconfig_0.9.inc.php
fixed a typo
2018-01-05 18:11:23 +01:00
Michael Kaufmann
c49539258e Merge pull request #498 from RipClaw2971/fix
Added "nscd -i passwd" to clear user cache when using libnss-*
2018-01-01 17:45:23 +01:00
Andreas Grundler
64653a2bb1 nscd -i passwd in froxlor_master_cronjob.php eingefügt 2018-01-01 13:54:32 +01:00
Andreas Grundler
732c6e3a78 Added nscd -i passwd to clear user 2017-12-31 22:40:19 +01:00
Michael Kaufmann (d00p)
66a4309fe5 add setting to disable LE self-check; set version to 0.9.38.8 for maintenance/bugfix release
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-12-31 11:18:59 +01:00
Michael Kaufmann (d00p)
57277eb1e3 also add locked users to the passwd file for quota not to rage :P thx J-BBB
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-12-27 10:36:10 +01:00
Michael Kaufmann (d00p)
148b2fc1be validating config-template parameters; avoid URL misuse, thx to hyp3rlinx for noticing this
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-12-27 10:01:07 +01:00
Michael Kaufmann (d00p)
cf4f15a83c explicitly deactivate TLS (and auto-tls) when setting use-tls is OFF; fixes #496
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-12-19 08:00:39 +01:00
azerr
297f3f638c change sign direction 2017-12-08 17:47:09 +01:00
azerr
d2a9fa8632 extend nginx redirect regex to https 2017-12-08 15:39:05 +01:00
Michael Kaufmann (d00p)
a5251824ae try to reduce weird path-values when people are getting creative, fixes #487
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-11-27 08:14:31 +01:00
Michael Kaufmann (d00p)
cb31c5258d correct setting for php-fpm peardir, fixes #475
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-11-27 08:09:33 +01:00
Michael Kaufmann (d00p)
5540b02e35 do not remove Let's Encrypt token when self-check fails but rather give out the information as warning. The self-check fails for many users due to different local configurations and might not always be correct; fixes #480
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-11-27 07:54:41 +01:00
Michael Kaufmann (d00p)
e725b48c4c add default/global directory options in apache regardless of whether fcgid/fpm is being used or not; fixes #485
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-11-27 07:48:36 +01:00
Michael Kaufmann (d00p)
45c0915b59 fix ssl integration in lighttpd, thx to black-night for the info
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-11-17 15:15:09 +01:00
Michael Kaufmann (d00p)
1e03946df7 set sql_mode to disable STRICT_MODE usage for froxlor, thx to albech for the hint
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-11-08 07:49:40 +01:00
Michael Kaufmann (d00p)
dd3e5e9c6b fix wrong variable name typo, fixes #484
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-11-06 07:36:51 +01:00
Michael Kaufmann (d00p)
421c29c491 remove each() keyword as it is deprecated as of php-7.2, fixes #479
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-10-31 13:03:06 +01:00
Michael Kaufmann (d00p)
15b62aae04 add inserttask for config regeneration and fix aliasdomain NULL value if empty, fixes #478
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-10-06 09:29:49 +02:00
Michael Kaufmann (d00p)
181848290f move setting to enable usage of libnss-extrausers to 'system' category as mpm-itk + mod_php users might need this too
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-09-04 15:28:12 +02:00
Michael Kaufmann (d00p)
b263b211a5 generate multiline txt-record if content is too long, fixes #472
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-08-28 15:35:07 +02:00
Michael Kaufmann (d00p)
1753d2895b add simple smtp-settings test-page, fixes #464
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-08-25 10:34:59 +02:00
Michael Kaufmann (d00p)
64ebb0ca38 also add http2 flag to domain-import
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-08-24 15:27:47 +02:00
Michael Kaufmann (d00p)
bab982a0e6 add http2 support for froxlor-vhost and per-domain
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-08-24 13:21:21 +02:00
Michael Kaufmann (d00p)
c2c5178831 remove superfluous character in froxlor.sql file, fixes #471
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-08-23 14:03:39 +02:00
Michael Kaufmann (d00p)
56e8e32965 set correct permissions for extrausers files/folder, fixes #465
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-07-26 07:30:14 +02:00
Michael Kaufmann (d00p)
47cd30a45e use correct logging-level in customer_mail, thx to priority
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-07-19 12:06:36 +02:00
Michael Kaufmann
bd8f659272 Merge pull request #460 from pquerner/patch-libclass-lesscript-dontsendchallengewithouttoken
dont send uri to challenge, if no valid token could be fetched
2017-07-08 16:59:56 +02:00
Pascal Querner
82c719d786 dont send uri to challenge, if no valid token could be fetched 2017-07-07 22:50:39 +02:00
Michael Kaufmann (d00p)
dc22ff6aa3 fix rebuild of libnss-extrausers files when editing/deleting ftp account, fixes #454
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-06-20 16:48:11 +02:00
Michael Kaufmann
c68682b084 Merge pull request #450 from oliverrahner/master
nginx: add index directive to path options for secured directories
2017-06-10 11:47:53 +02:00
Oliver Rahner
aa8a7ee0a9 nginx: add index directive to path options for secured directories
`index` directives are now created for secured directory locations.
2017-06-10 10:59:41 +02:00
Michael Kaufmann (d00p)
e95a917812 allow non fqdn CNAME entries (froxlor appends zone's domain automatically if there's no trailing dot), fixes #434
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-06-04 11:29:21 +02:00
Michael Kaufmann (d00p)
332e627007 fix wildcard entries in dns editor, fixes #447; do not add extra dot at the end of SRV entries, fixes #446
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-06-04 09:31:55 +02:00
Michael Kaufmann (d00p)
a3201481f6 beatufication in generated vhost configs
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-06-04 09:30:32 +02:00
Michael Kaufmann (d00p)
dae233dd05 allow adding domains with multiple dashes, that are NOT punycode (xn--)
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-06-04 09:17:31 +02:00
Michael Kaufmann (d00p)
9aa2cc269b rename MYSQL_PASSWORD replacer to FROXLOR_MYSQL_PASSWORD in config-templates to avoid false replacement of couriers authmysqlrc, fixes #438
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-05-12 12:23:14 +02:00
Michael Kaufmann (d00p)
434f202832 minor fixes in traffic cron
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-05-12 12:22:04 +02:00
Michael Kaufmann (d00p)
552d58848c fix sql_mode=only_full_group_by in admin_admins.php; fix wrong webserver-user when using FCGID
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-05-09 13:17:50 +02:00
Michael Kaufmann (d00p)
bea1677d5d Add setting for libnss-extrausers to frontend
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-05-05 09:44:37 +02:00
Michael Kaufmann (d00p)
a2e0de23e1 add libnss-extrausers for debian/ubuntu users
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-05-05 09:35:06 +02:00
Michael Kaufmann
ebb33c9cee Merge pull request #436 from nachtgeist/master
doc: extend notes about contributing; add issue template
2017-05-01 21:26:26 +02:00
Daniel Reichelt
22414096ad doc: extend notes about contributing; add issue template 2017-05-01 21:24:48 +02:00
Michael Kaufmann (d00p)
9db7434876 add letsencrypt, HSTS settings, oscp-stapling and phpenabled-flag to Domain-import; fixes #416
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-04-18 16:55:55 +02:00
Michael Kaufmann
9fabfd539d Merge pull request #430 from mkhon/fix-apache24-ocsp-cache-path
Fix apache24_ocsp_cache_path definition
2017-04-18 12:50:40 +02:00
Michael Kaufmann
54f6c3e019 Merge pull request #431 from shyim/mysql-warning
Fixed MySQL Warning while creating a new user
2017-04-17 12:50:16 +02:00
Soner Sayakci
5930ab1c9d Fixed MySQL Warning while creating a new user 2017-04-17 12:34:20 +02:00
Max Khon
3870cc1002 Add default value for apache24_ocsp_cache_path, otherwise saving
SSL settings for !apache24 fails on apache24_ocsp_cache_path validation.
2017-04-17 15:55:49 +07:00
Michael Kaufmann
f880e1c9f1 Merge pull request #429 from mkhon/database-charset-skip-views
Skip views when altering table charsets
2017-04-15 11:28:27 +02:00
Michael Kaufmann
9285a169dd Merge pull request #428 from mkhon/fix-customer-logs
Fix customer logs
2017-04-15 11:27:15 +02:00
Max Khon
95b7b57fc6 Skip views when altering table charsets. 2017-04-15 16:12:29 +07:00
Max Khon
872928fb38 Fix customer logs:
- SQLSTATE[HY000]: General error: mode must be an integer
- customer_logger.php:78 Undefined variable $_actions
2017-04-15 15:58:50 +07:00
Michael Kaufmann
cb2f094e3d Merge pull request #426 from nachtgeist/master
readme: add section about contributing
2017-04-13 16:39:15 +02:00
Daniel Reichelt
b11b423217 readme: add section about contributing 2017-04-13 16:38:17 +02:00
Michael Kaufmann
567827e2cb Merge pull request #422 from nachtgeist/master
add OCSP stapling support for apache2 and nginx
2017-04-11 20:39:00 +02:00
Daniel Reichelt
ec1bd6e19a add OCSP stapling support for apache2 and nginx 2017-04-11 17:09:34 +02:00
Michael Kaufmann (d00p)
d4cd827284 update wiki-urls in language files
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-04-09 10:25:39 +02:00
Michael Kaufmann
50f85fb6d0 Merge pull request #417 from ianklemm/patch-1
Correct Wiki links
2017-04-03 20:32:24 +02:00
Vengance
9cc69e5b3d Update README.md 2017-04-03 20:31:50 +02:00
Vengance
d9e8f43298 Correct Wiki links
Correct the links of the no longer existing redmine to Github´s inbuild Wiki
2017-04-03 20:21:44 +02:00
Michael Kaufmann (d00p)
ad7cf52f21 Fix rowcount value for logger
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-03-17 13:05:39 +01:00
Michael Kaufmann (d00p)
398d45deae fix typo
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-03-14 13:46:07 +01:00
Michael Kaufmann (d00p)
541ab1fe6e clearify field label for domain termination date; fixes #1728
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-03-11 07:34:13 +01:00
Michael Kaufmann (d00p)
c0fddbce81 use correct pagination in admin-log/customer-log, fixes #1726
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-03-08 14:04:40 +01:00
Michael Kaufmann (d00p)
2284706e0c do not load mod_vroot in proftpd on centos
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-03-02 07:57:47 +01:00
Michael Kaufmann (d00p)
a4f72cbb40 do not show full path of file on php-error; fixes #1720
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-02-12 16:33:00 +01:00
Michael Kaufmann
d1c776b706 Merge pull request #414 from Douks08/patch-1
Update french.lng.php
2017-02-09 14:41:56 +01:00
Douks08
8ef315014c Update french.lng.php
Modification de "billets" en "tickets" qui est plus fréquemment utilisé
2017-02-09 10:19:32 +01:00
Michael Kaufmann (d00p)
2d59e569df fix phpenabled flag for new subdomains added by customers
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-01-30 22:46:53 +01:00
Michael Kaufmann (d00p)
202eb0931f fix auto-update of database in cronjob if activated
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-01-28 21:20:37 +01:00
Michael Kaufmann (d00p)
4cd1a8d656 Merge branch 'master' of github.com:Froxlor/Froxlor 2017-01-28 21:19:51 +01:00
Vengance
01a363456e Fix libnss config (#412)
* Fix libnss config
2017-01-28 15:47:19 +01:00
Michael Kaufmann (d00p)
8f4da0638e allow underscore in dns labels, fixes #1697
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-01-25 10:42:18 +01:00
Michael Kaufmann (d00p)
3e6c3d725b set version to 0.9.38.7 for upcoming bugfix release
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-01-24 09:43:20 +01:00
Michael Kaufmann (d00p)
95a18be5c5 do not use HTTP_HOST variable if mod_rewrite is not used
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-01-24 09:41:45 +01:00
Michael Kaufmann (d00p)
8030aae37a fix directory options for deactivated users, fixes #1704
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-01-23 23:53:01 +01:00
Michael Kaufmann (d00p)
0eaa81b503 use libnss-mysl deb package from froxlor repo as debians 1.5-5 package is not suitable for jessie
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-01-23 08:17:18 +01:00
Michael Kaufmann (d00p)
c2b864a20f enable/disable php for standard-subdomain when adding a new customer according to the customer-phpenabled value, fixes #1708
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-01-23 08:14:14 +01:00
Michael Kaufmann (d00p)
e00cb8926d set mail-sender to customer mail address when using mod_php, fixes #1707
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-01-23 08:12:44 +01:00
Michael Kaufmann (d00p)
afb2bce16d fix missing german language strings, refs #1705
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-01-23 08:05:48 +01:00
Michael Kaufmann (d00p)
1033f502b1 add missing language strings, fixes #1705
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-01-19 14:09:51 +01:00
Michael Kaufmann (d00p)
ab18d94053 fix PR #407 - only works for apache-2.4 and missed the entry for customer-vhosts
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-01-17 11:29:40 +01:00
Michael Kaufmann
9afbe7fb71 Merge pull request #407 from buffcode/ssl-compression
Disable SSLCompression (CRIME attack)
2017-01-17 10:40:19 +01:00
Laurens Stötzel
5e0270e6a8 Disable SSLCompression (CRIME attack)
https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.html#SSL_Compression_(CRIME_attack)
2017-01-17 10:33:22 +01:00
Michael Kaufmann (d00p)
c6962b0992 fix variable-typo to make phpenabled-flag work when adding new domains, thx to micw
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-01-16 08:43:54 +01:00
Michael Kaufmann (d00p)
9fdcd09089 fix install class, set version to 0.9.38.6
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-01-15 07:44:58 +01:00
Michael Kaufmann (d00p)
338cf161d2 fix undefined index if let's encrypt is used for the froxlor-vhost
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-01-14 18:06:04 +01:00
Michael Kaufmann (d00p)
044ce6662a set version to 0.9.38.5 for upcoming release
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-01-13 19:45:17 +01:00
Michael Kaufmann (d00p)
d574233f49 also reseller/admins who can't see all customers were able to delete arbitrary ssl certificates, refs #1699
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-01-13 19:21:34 +01:00
Michael Kaufmann (d00p)
02c6545c94 update download url for libnss-mysql for debian jessie, fixies #1700
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-01-10 19:11:01 +01:00
Michael Kaufmann (d00p)
c795cd3320 check for ownership of certificate when deleting as customer, fixes #1699
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-01-10 08:37:50 +01:00
Michael Kaufmann (d00p)
1ebde2e6a4 return correct default redirectCode when none is set, thx to J-BBB
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2017-01-05 11:58:11 +01:00
Michael Kaufmann
78ee141b26 Merge pull request #405 from lobeck/hsts_link_fix
fix hsts removal links
2017-01-02 07:32:45 +01:00
Christian Becker
d11ddd910f fix hsts removal links
without a protocol, they are treated relative which is annoying
2017-01-02 03:06:18 +01:00
Michael Kaufmann (d00p)
437446c49d update phpMailer to 5.2.21
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2016-12-29 10:54:25 +01:00
Michael Kaufmann (d00p)
7a603596c5 validate ip address on installation 2016-12-28 20:13:15 +01:00
Michael Kaufmann
c2a91ed623 Merge pull request #403 from pissbeutel/master
Changed SOA refresh intervall to be within recommended values
2016-12-17 15:16:46 +01:00
Michael Kaufmann
3dcd2b9a3e Merge pull request #402 from stweil/doc
Fix description in README.md
2016-12-17 15:16:10 +01:00
pissbeutel
75622d4737 Changed SOA refresh intervall to be compliant within recommended values
See: https://www.denic.de/fileadmin/public/documentation/DENIC-23p.pdf

The recommended values according to DENIC are:
refresh: 3600 - 86400
retry: 900 - 28800
expire: 604800 - 3600000
negTTL: 180 - 86400
2016-12-17 15:14:02 +01:00
Stefan Weil
7a617d0aa4 Fix description in README.md
The entry is called "System", not "Server".

Signed-off-by: Stefan Weil <sw@weilnetz.de>
2016-12-17 14:33:28 +01:00
Michael Kaufmann
ccca077df7 Merge pull request #401 from stweil/html
Fix HTML code (unclosed tag)
2016-12-17 13:05:56 +01:00
Stefan Weil
5c008adf16 Fix HTML code (wrong tag)
`<span>` must be terminated by `</span>`.

Signed-off-by: Stefan Weil <sw@weilnetz.de>
2016-12-17 12:34:15 +01:00
Michael Kaufmann (d00p)
4502f7ddf5 fix Settings::Flush(), thx to Ithariel
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2016-12-16 10:17:48 +01:00
Michael Kaufmann (d00p)
f9101f880b use namserver IP's for axfr/pdns-config, also add placeholder AXFRSERVERS for axfr-servers setting; fixes #1691
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2016-12-14 09:54:49 +01:00
Michael Kaufmann (d00p)
5ed0c3f2f3 code-formatting and put phpenabled flag on a better position
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2016-12-11 09:50:22 +01:00
Michael Kaufmann (d00p)
9907775c0d fix installation sql
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2016-12-11 09:43:05 +01:00
Michael Kaufmann
ed9d4a5744 Merge pull request #392 from negrusti/patch-1
Prevent duplicates in ipsandports table
2016-12-11 08:55:47 +01:00
Michael Kaufmann
c1aea2795e Merge branch 'master' into patch-1 2016-12-11 08:55:37 +01:00
Michael Kaufmann (d00p)
3a8996aee2 add missing fields that are only added via update
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2016-12-11 08:29:54 +01:00
Michael Kaufmann
e67aefe48b Merge pull request #400 from micw/feature/letsencrypt-verbesserungen
Better handling for letsencrypt errors, refs #1661
2016-12-11 08:24:10 +01:00
Michael Kaufmann
602c38dbeb Merge branch 'master' into feature/letsencrypt-verbesserungen 2016-12-11 08:23:46 +01:00
Michael Kaufmann
f1c232cef9 Merge pull request #396 from schallertd/master
Checkbox to enable/disable PHP (vhost settings + fpm pool) for an entire vhost, fixes #1671
2016-12-11 08:20:01 +01:00
Michael Kaufmann
3d4b56b233 Merge branch 'master' into master 2016-12-11 08:19:16 +01:00
Michael Kaufmann
d8994ca65b Merge pull request #399 from hypernics/alias_redirect
Change redirect host from main domain name to requested domain name, refs #1670
2016-12-11 08:05:57 +01:00
Michael Kaufmann (d00p)
18514f0180 fix undefined array when processing specialsettings, fixes #1684
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2016-12-10 21:43:28 +01:00
Michael Kaufmann (d00p)
001786dd97 fix incorrect User-Agent header in let's encrypt class, fixes #1683
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2016-12-09 13:33:57 +01:00
Michael Kaufmann (d00p)
225539d2e7 show ssl-related settings only if customer has ssl-ip assigned (not yet checked per domain); fix hsts-includeSubdomain setting for fresh installations
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2016-11-29 09:34:33 +01:00
Janos Muzsi
1b18ec45be correcting lighttpd settings 2016-11-27 23:18:23 +01:00
micw
7b6bbcec48 Fixed default LE license URL
(removed testing stuff)
2016-11-27 12:45:06 +01:00
Michael Kaufmann (d00p)
56276a19d1 set version to 0.9.38.4 for upcoming bugfix release
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2016-11-27 12:12:22 +01:00
Michael Kaufmann (d00p)
c00abc3b92 move froxlor hsts settings to 'froxlor vhost settings' to make clear it's only for froxlor anbd not a system-wide default for all domains; fix superfluous english text from german language file
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2016-11-27 11:40:33 +01:00
Michael Kaufmann (d00p)
301dadaa02 fix global hsts-includeSubdomain setting, thx to iam
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2016-11-27 10:46:50 +01:00
Michael Wyraz
559bd6d892 Better db update 2016-11-25 10:52:50 +01:00
Michael Wyraz
18b45c749d Better handling for letsencrypt errors after failed registration or changed license 2016-11-25 09:54:47 +01:00
Janos Muzsi
2c00f982d8 Change redirect host from main domain name to requested domain name 2016-11-24 22:55:57 +01:00
Michael Kaufmann (d00p)
54200427ab fix undefined variable when deleting a customer-domain as admin
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2016-11-24 10:40:28 +01:00
Michael Kaufmann (d00p)
f8996ad767 catch exception thrown by new IdnaConverter when encoding a non-valid domain, fixes #1678
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2016-11-22 15:08:42 +01:00
Michael Kaufmann (d00p)
9838ff4da5 fix hsts settings for lighttpd, fixes #1677
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2016-11-22 08:16:35 +01:00
Michael Kaufmann (d00p)
192e00c717 do not show NameVirtualHost in IP/Port overview when using apache-2.4 (as NameVirtualHost does not exist there anymore)
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2016-11-22 08:04:11 +01:00
Michael Kaufmann (d00p)
43ca4a28e4 add acme.conf alias also to froxlor vhost in case the acme-challenge path is not within the froxlor-docroot; fix empty redirect-code, fixes #1674
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2016-11-21 08:19:33 +01:00
Michael Kaufmann (d00p)
16e9fd6bd9 stay php-5.3 compatible
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2016-11-18 21:19:18 +01:00
Michael Kaufmann (d00p)
16f547bce0 last time....0.9.38.3....what a day
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2016-11-18 10:27:11 +01:00
Michael Kaufmann (d00p)
60a482dce6 damn, forgot to save the two files to handle customer-side domain-settings regarding the hsts-includeSubdomain issue; version set to 0.9.38.2
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2016-11-18 10:21:02 +01:00
Michael Kaufmann (d00p)
9540cb158c set version to 0.9.38.1 b/c of hsts includeSubdomains flag for domains not being saved; added http2-flag for nginx as setting
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2016-11-18 10:10:03 +01:00
Michael Kaufmann (d00p)
1984aced9d set db_version correctly everywhere
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2016-11-18 08:52:40 +01:00
Michael Kaufmann (d00p)
ca2949da71 Merge branch 'hypernics-nginx-http2' 2016-11-18 08:50:17 +01:00
Michael Kaufmann (d00p)
eb8449fd79 merge conflicts in update-script
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2016-11-18 08:50:03 +01:00
Michael Kaufmann (d00p)
547140bafb set version to 0.9.38 for upcoming release
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2016-11-18 08:36:35 +01:00
Janos Muzsi
d245bca445 correcting the update 2016-11-18 08:32:23 +01:00
Janos Muzsi
5f899a5510 Add support for http2 option to nginx 2016-11-17 22:50:11 +01:00
Michael Kaufmann (d00p)
432645431c allow CIDR values in AXFR setting, fixes #1672
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2016-11-15 08:03:34 +01:00
Dominic Schallert
30087548b0 Fixed the checkbox value 2016-11-13 15:33:56 +01:00
Dominic Schallert
d93cfff172 updates always at the end of the file 2016-11-13 15:18:07 +01:00
Dominic Schallert
e5053bad15 Introduced phpenabled_customer and phpenabled_vhost, updated cron scripts, updated dbversion 2016-11-13 15:15:43 +01:00
Dominic
1519db1637 Update update_0.9.inc.php 2016-11-13 14:48:50 +01:00
Dominic Schallert
b0326c640c Feature #1671 Checkbox to enable/disable PHP (vhost settings + fpm pool) for an entire vhost 2016-11-13 14:41:39 +01:00
Michael Kaufmann (d00p)
7e4164da26 do not double validate openbasedir-values, as appendOpenbasedirPath() already takes care of that; also fix /dev/urandom as openbasedir-path-value to be treated as file correctly, fixes #1669
Signed-off-by: Michael Kaufmann (d00p) <d00p@froxlor.org>
2016-11-10 10:07:00 +01:00
Grigory Morozov
3ff85e167c Update update_0.9.inc.php 2016-09-27 23:08:30 +07:00
Grigory Morozov
dc428b7de2 Adding unique key to ipsandports on upgrade
Please guide on checking the correct Froxlor version, not sure how it works
2016-09-26 23:23:11 +07:00
Grigory Morozov
06a55ef91e Prevent duplicates in ipsandports table 2016-09-26 22:52:03 +07:00
1119 changed files with 129121 additions and 87558 deletions

19
.editorconfig Normal file
View File

@@ -0,0 +1,19 @@
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

31
.github/CONTRIBUTING.md vendored Normal file
View File

@@ -0,0 +1,31 @@
# 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

4
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,4 @@
# These are supported funding model platforms
github: d00p
custom: ['https://paypal.me/Froxlor']

49
.github/ISSUE_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,49 @@
# 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
* Web server: apache2/nginx/lighttpd
* 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>

40
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,40 @@
---
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
* Web server: apache2/nginx/lighttpd
* 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.

View File

@@ -0,0 +1,20 @@
---
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.

22
.github/LICENSE_HEADER vendored Normal file
View File

@@ -0,0 +1,22 @@
/**
* 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
*/

37
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,37 @@
# 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

14
.github/workflows/build-docs.yml vendored Normal file
View File

@@ -0,0 +1,14 @@
name: build-documentation
on:
release:
types: [published]
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 -f type=tags ref=${{github.ref_name}}

81
.github/workflows/build-mariadb.yml vendored Normal file
View File

@@ -0,0 +1,81 @@
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.1']
mariadb-version: [10.5, 10.4]
steps:
- name: Checkout
uses: actions/checkout@v3
- 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: getong/mariadb-action@v1.1
with:
mariadb version: ${{ matrix.mariadb-version }}
mysql database: 'froxlor010'
mysql root 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 USER 'froxlor010'@'%' IDENTIFIED BY 'fr0xl0r.TravisCI';"
mysql -h 127.0.0.1 --protocol=TCP -u root -pfr0xl0r.TravisCI -e "GRANT ALL ON froxlor010.* TO '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
# - name: irc push
# uses: rectalogic/notify-irc@v1
# if: github.event_name == 'push'
# with:
# channel: "#froxlor"
# server: "irc.libera.chat"
# nickname: froxlor-ci
# message: |
# ${{ github.actor }} pushed ${{ github.event.ref }} ${{ github.event.compare }}
# ${{ join(github.event.commits.*.message) }}
# - name: irc pull request
# uses: rectalogic/notify-irc@v1
# if: github.event_name == 'pull_request'
# with:
# channel: "#froxlor"
# server: "irc.libera.chat"
# nickname: froxlor-ci
# message: |
# ${{ github.actor }} opened PR ${{ github.event.pull_request.html_url }}
# - name: irc tag created
# uses: rectalogic/notify-irc@v1
# if: github.event_name == 'create' && github.event.ref_type == 'tag'
# with:
# channel: "#froxlor"
# server: "irc.libera.chat"
# nickname: froxlor-ci
# message: |
# ${{ github.actor }} tagged ${{ github.repository }} ${{ github.event.ref }}

59
.github/workflows/build-mysql.yml vendored Normal file
View File

@@ -0,0 +1,59 @@
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.1']
mysql-version: [8.0, 5.7]
steps:
- name: Checkout
uses: actions/checkout@v3
- 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: samin/mysql-action@v1.3
with:
mysql version: ${{ matrix.mysql-version }}
mysql database: 'froxlor010'
mysql root password: 'fr0xl0r.TravisCI'
- name: Wait for database
run: sleep 15
- name: Setup database (8.0)
if: matrix.mysql-version == '8.0'
run: |
mysql -h 127.0.0.1 --protocol=TCP -u root -pfr0xl0r.TravisCI -e "CREATE USER 'froxlor010'@'%' IDENTIFIED WITH mysql_native_password BY 'fr0xl0r.TravisCI';"
mysql -h 127.0.0.1 --protocol=TCP -u root -pfr0xl0r.TravisCI -e "GRANT ALL ON froxlor010.* TO '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: Setup database (5.7)
if: matrix.mysql-version == '5.7'
run: |
mysql -h 127.0.0.1 --protocol=TCP -u root -pfr0xl0r.TravisCI -e "CREATE USER 'froxlor010'@'%' IDENTIFIED BY 'fr0xl0r.TravisCI';"
mysql -h 127.0.0.1 --protocol=TCP -u root -pfr0xl0r.TravisCI -e "GRANT ALL ON froxlor010.* TO '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

19
.gitignore vendored
View File

@@ -1,17 +1,28 @@
install/update.log install/update.log
templates/* install/*.json
lib/userdata.inc.php lib/userdata.inc.php
lib/userdata.inc.php.bak
lib/config.inc.php
logs/* logs/*
!logs/index.html
.buildpath .buildpath
.project .project
.settings/ .settings/
.test/
*.diff *.diff
*~ *~
.well-known .well-known
.idea .idea
*.iml *.iml
img/
vendor/
node_modules/
fonts/
templates/*
!templates/index.html
!templates/Froxlor/ !templates/Froxlor/
!templates/Sparkle/ templates/Froxlor/assets/mix-manifest.json
templates/Froxlor/assets/css/
templates/Froxlor/assets/js/
templates/Froxlor/assets/webfonts/
!templates/misc/ !templates/misc/
templates/Froxlor/assets/img/logo_custom.png

154
2fa.php Normal file
View File

@@ -0,0 +1,154 @@
<?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\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 = isset($_POST['type_2fa']) ? $_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 = isset($_POST['type_2fa']) ? $_POST['type_2fa'] : '0';
$data = isset($_POST['data_2fa']) ? $_POST['data_2fa'] : '';
$code = isset($_POST['codevalidation']) ? $_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
]);

View File

@@ -1,3 +1,7 @@
[![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 # Froxlor
The server administration software for your needs. The server administration software for your needs.
@@ -6,69 +10,73 @@ Developed by experienced server administrators, this panel simplifies the effort
## Installation ## Installation
### Fast install ### Fast install
1. Ensure that your webserver serves /var/www 1. Ensure that your webserver serves /var/www/html
2. Extract froxlor into /var/www 2. Extract froxlor into /var/www/html
3. Point your browser to http://[ip-of-webserver]/froxlor 3. Point your browser to http://[ip-of-webserver]/froxlor
4. Follow the installer 4. Follow the installer
5. Login as administrator 5. Login as administrator
6. Adjust "Server > Settings" according to your needs 6. Have fun!
7. Choose your distribution under "Server > Configuration"
8. Follow the steps for your services If you have chosen to do the configuration by hand during the installation, you have to complete some more steps:
9. Have fun!
1. Adjust "System > Settings" according to your needs
2. Choose your distribution under "System > Configuration"
3. Follow the steps for your services
### Detailed installation ### Detailed installation
http://redmine.froxlor.org/projects/froxlor/wiki/Installationtarball https://docs.froxlor.org/latest/general/installation/
## Help ## Help
You may find help in the following places: You may find help in the following places:
### Discord
The froxlor community discord server can be found here: https://discord.froxlor.org
### IRC ### IRC
froxlor may be found on freenode.net, channel #froxlor: froxlor may be found on libera.chat, channel #froxlor:
irc://chat.freenode.net/froxlor irc://irc.libera.chat/froxlor
### Forum ### Forum
The community is located on http://forum.froxlor.org The community is located on https://forum.froxlor.org/
### Wiki ### Wiki
More documentation may be found in the froxlor - wiki: More documentation may be found in the froxlor - documentation:
http://redmine.froxlor.org/projects/froxlor/wiki https://docs.froxlor.org/
## License ## License
May be found in COPYING May be found in [COPYING](COPYING)
## Downloads ## Downloads
### Tarball ### Tarball
http://files.froxlor.org/releases/froxlor-latest.tar.gz [MD5](http://files.froxlor.org/releases/froxlor-latest.tar.gz.md5) [SHA1](http://files.froxlor.org/releases/froxlor-latest.tar.gz.sha1) 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 repository ### Debian / Ubuntu repository
[HowTo](http://redmine.froxlor.org/projects/froxlor/wiki/Installationdebian) [HowTo](https://docs.froxlor.org/latest/general/installation/apt-package.html)
/etc/apt/sources.list.d/froxlor.list #### Debian
> deb http://debian.froxlor.org {wheezy|jessie} main
### Gentoo repository ```
apt-get -y install apt-transport-https lsb-release ca-certificates curl
curl -sSLo /usr/share/keyrings/deb.froxlor.org-froxlor.gpg https://deb.froxlor.org/froxlor.gpg
echo sh -c '"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'
```
[HowTo](http://redmine.froxlor.org/projects/froxlor/wiki/Installationgentoo) #### Ubuntu
http://files.froxlor.org/gentoo/repositories.xml ```
apt-get -y install apt-transport-https lsb-release ca-certificates curl
curl -sSLo /usr/share/keyrings/deb.froxlor.org-froxlor.gpg https://deb.froxlor.org/froxlor.gpg
echo sh -c '"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'
```
## Let's Encrypt support ## Contributing
This version of Froxlor contains a test implementation of support for [Let's Encrypt](https://letsencrypt.org). This is (as Let's Encrypt is in itself)
still a beta version and may break your system. The way it currently works is by creating a (sub-)domain with the default system - certificate,
after which the Let's Encrypt cronjob orders the certificate for this (sub-)domain and inserts the certificates in the database. With the next run
of the default cronjob, the certificates will be updated on the disk and the webserver reloaded.
This has 2 known side-effects at the moment:
* The basic ip/port combinations don't work with the Froxlor - integration of Let's Encrypt, since it needs a certificate for the very first creation
* After creating a domain, it will have the default certificate for a short time (by default 5 minutes until the cronjob runs the next time)
It may be possible to fix these issues, but they are not a priority at the moment
[see here](.github/CONTRIBUTING.md)

47
SECURITY.md Normal file
View File

@@ -0,0 +1,47 @@
# 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.x** (`main` git-branch)
- ❌ 0.10.x (`0.10.x` git-branch)
- ❌ 0.9.x (`0.9.x`git-branch)
## 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 reproducable 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
- Reflected file download
- Physical attacks
- Weak SSL/TLS/SSH algorithms or protocols
- Attacks involving physical access to a users device, or involving a device or network thats 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://huntr.dev/repos/froxlor/froxlor](https://huntr.dev/repos/froxlor/froxlor) and use the reporting possibilities there as we are funding the prize-pot for froxlor on this platform. Also, please give us appropriate time to fix the issue and build update-packages before publishing anything into the wild. Alternatively you can send us an email to [team@froxlor.org](team@froxlor.org).

View File

@@ -1,72 +0,0 @@
<?php
/**
* This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors).
*
* For the full copyright and license information, please view the COPYING
* file that was distributed with this source code. You can also view the
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt
*
* @copyright (c) the authors
* @author Florian Lippert <flo@syscp.org> (2003-2009)
* @author Froxlor team <team@froxlor.org> (2010-)
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt
* @package Settings
*
*/
return array(
'groups' => array(
'version' => array(
'fields' => array(
'panel_version' => array(
'settinggroup' => 'panel',
'varname' => 'version',
'type' => 'hidden',
'default' => '',
),
'panel_frontend' => array(
'settinggroup' => 'panel',
'varname' => 'frontend',
'type' => 'hidden',
'default' => '',
),
'system_last_tasks_run' => array(
'settinggroup' => 'system',
'varname' => 'last_tasks_run',
'type' => 'hidden',
'default' => '',
'save_method' => 'storeSettingField',
),
'system_last_traffic_run' => array(
'settinggroup' => 'system',
'varname' => 'last_traffic_run',
'type' => 'hidden',
'default' => '',
),
'system_lastcronrun' => array(
'settinggroup' => 'system',
'varname' => 'lastcronrun',
'type' => 'hidden',
'default' => '',
),
'system_lastguid' => array(
'settinggroup' => 'system',
'varname' => 'lastguid',
'type' => 'hidden',
'default' => 9999,
),
'system_lastaccountnumber' => array(
'settinggroup' => 'system',
'varname' => 'lastaccountnumber',
'type' => 'hidden',
'default' => 0,
),
),
),
),
);
?>

View File

@@ -2,259 +2,343 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Language
* *
* 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 array( return [
'groups' => array( 'groups' => [
'panel' => array( 'panel' => [
'title' => $lng['admin']['panelsettings'], 'title' => lng('admin.panelsettings'),
'fields' => array( 'icon' => 'fa-solid fa-chalkboard-user',
'panel_standardlanguage' => array( 'fields' => [
'label' => array('title' => $lng['login']['language'], 'description' => $lng['serversettings']['language']['description']), 'panel_standardlanguage' => [
'label' => [
'title' => lng('login.language'),
'description' => lng('serversettings.language.description')
],
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'standardlanguage', 'varname' => 'standardlanguage',
'type' => 'option', 'type' => 'select',
'default' => 'English', 'default' => 'en',
'option_mode' => 'one', 'option_options_method' => [
'option_options_method' => 'getLanguages', '\\Froxlor\\Language',
'save_method' => 'storeSettingField', 'getLanguages'
), ],
'panel_default_theme' => array( 'save_method' => 'storeSettingField'
'label' => array('title' => $lng['panel']['theme'], 'description' => $lng['serversettings']['default_theme']), ],
'panel_default_theme' => [
'label' => [
'title' => lng('panel.theme'),
'description' => lng('serversettings.default_theme')
],
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'default_theme', 'varname' => 'default_theme',
'type' => 'option', 'type' => 'select',
'default' => 'Froxlor', 'default' => 'Froxlor',
'option_mode' => 'one', 'option_options_method' => [
'option_options_method' => 'getThemes', '\\Froxlor\\UI\\Panel\\UI',
'save_method' => 'storeSettingDefaultTheme', 'getThemes'
), ],
'panel_allow_theme_change_customer' => array( 'save_method' => 'storeSettingDefaultTheme'
'label' => $lng['serversettings']['panel_allow_theme_change_customer'], ],
'panel_allow_theme_change_customer' => [
'label' => lng('serversettings.panel_allow_theme_change_customer'),
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'allow_theme_change_customer', 'varname' => 'allow_theme_change_customer',
'type' => 'bool', 'type' => 'checkbox',
'default' => true,
'save_method' => 'storeSettingField',
),
'panel_allow_theme_change_admin' => array(
'label' => $lng['serversettings']['panel_allow_theme_change_admin'],
'settinggroup' => 'panel',
'varname' => 'allow_theme_change_admin',
'type' => 'bool',
'default' => true, 'default' => true,
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField'
), ],
'panel_natsorting' => array( 'panel_allow_theme_change_admin' => [
'label' => $lng['serversettings']['natsorting'], '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', 'settinggroup' => 'panel',
'varname' => 'natsorting', 'varname' => 'natsorting',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'panel_no_robots' => array( ],
'label' => $lng['serversettings']['no_robots'], 'panel_paging' => [
'settinggroup' => 'panel', 'label' => lng('serversettings.paging'),
'varname' => 'no_robots',
'type' => 'bool',
'default' => false,
'save_method' => 'storeSettingField',
),
'panel_paging' => array(
'label' => $lng['serversettings']['paging'],
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'paging', 'varname' => 'paging',
'type' => 'int', 'type' => 'number',
'int_min' => 0, 'min' => 0,
'default' => 0, 'default' => 0,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'panel_pathedit' => array( 'panel_pathedit' => [
'label' => $lng['serversettings']['pathedit'], 'label' => lng('serversettings.pathedit'),
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'pathedit', 'varname' => 'pathedit',
'type' => 'option', 'type' => 'select',
'default' => 'Manual', 'default' => 'Manual',
'option_mode' => 'one', 'select_var' => [
'option_options' => array('Manual' => $lng['serversettings']['manual'], 'Dropdown' => $lng['serversettings']['dropdown']), 'Manual' => lng('serversettings.manual'),
'save_method' => 'storeSettingField', 'Dropdown' => lng('serversettings.dropdown')
), ],
'panel_adminmail' => array( 'save_method' => 'storeSettingField'
'label' => $lng['serversettings']['adminmail'], ],
'panel_adminmail' => [
'label' => lng('serversettings.adminmail'),
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'adminmail', 'varname' => 'adminmail',
'type' => 'string', 'type' => 'email',
'string_type' => 'mail', 'string_emptyallowed' => true,
'string_emptyallowed' => false,
'default' => '', 'default' => '',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'panel_adminmail_defname' => array( 'panel_adminmail_defname' => [
'label' => $lng['serversettings']['adminmail_defname'], 'label' => lng('serversettings.adminmail_defname'),
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'adminmail_defname', 'varname' => 'adminmail_defname',
'type' => 'string', 'type' => 'text',
'default' => 'Froxlor Administrator', 'default' => 'Froxlor Administrator',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'panel_adminmail_return' => array( 'panel_adminmail_return' => [
'label' => $lng['serversettings']['adminmail_return'], 'label' => lng('serversettings.adminmail_return'),
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'adminmail_return', 'varname' => 'adminmail_return',
'type' => 'string', 'type' => 'email',
'string_type' => 'mail',
'string_emptyallowed' => true, 'string_emptyallowed' => true,
'default' => '', 'default' => '',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'panel_decimal_places' => array( ],
'label' => $lng['serversettings']['decimal_places'], 'panel_decimal_places' => [
'label' => lng('serversettings.decimal_places'),
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'decimal_places', 'varname' => 'decimal_places',
'type' => 'int', 'type' => 'number',
'int_min' => 0, 'min' => 0,
'int_max' => 15, 'max' => 15,
'default' => 4, 'default' => 4,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'panel_phpmyadmin_url' => array( ],
'label' => $lng['serversettings']['phpmyadmin_url'], 'panel_phpmyadmin_url' => [
'label' => lng('serversettings.phpmyadmin_url'),
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'phpmyadmin_url', 'varname' => 'phpmyadmin_url',
'type' => 'string', 'type' => 'url',
'string_type' => 'url',
'string_emptyallowed' => true, 'string_emptyallowed' => true,
'default' => '', 'default' => '',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'panel_webmail_url' => array( 'panel_webmail_url' => [
'label' => $lng['serversettings']['webmail_url'], 'label' => lng('serversettings.webmail_url'),
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'webmail_url', 'varname' => 'webmail_url',
'type' => 'string', 'type' => 'url',
'string_type' => 'url',
'string_emptyallowed' => true, 'string_emptyallowed' => true,
'default' => '', 'default' => '',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'panel_webftp_url' => array( 'panel_webftp_url' => [
'label' => $lng['serversettings']['webftp_url'], 'label' => lng('serversettings.webftp_url'),
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'webftp_url', 'varname' => 'webftp_url',
'type' => 'string', 'type' => 'url',
'string_type' => 'url',
'string_emptyallowed' => true, 'string_emptyallowed' => true,
'default' => '', 'default' => '',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'admin_show_version_login' => array( 'admin_show_version_login' => [
'label' => $lng['admin']['show_version_login'], 'label' => lng('admin.show_version_login'),
'settinggroup' => 'admin', 'settinggroup' => 'admin',
'varname' => 'show_version_login', 'varname' => 'show_version_login',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'admin_show_version_footer' => array( ],
'label' => $lng['admin']['show_version_footer'], 'admin_show_version_footer' => [
'label' => lng('admin.show_version_footer'),
'settinggroup' => 'admin', 'settinggroup' => 'admin',
'varname' => 'show_version_footer', 'varname' => 'show_version_footer',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'admin_show_news_feed' => array( 'admin_show_news_feed' => [
'label' => $lng['admin']['show_news_feed'], 'label' => lng('admin.show_news_feed'),
'settinggroup' => 'admin', 'settinggroup' => 'admin',
'varname' => 'show_news_feed', 'varname' => 'show_news_feed',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'customer_show_news_feed' => array( 'customer_show_news_feed' => [
'label' => $lng['admin']['customer_show_news_feed'], 'label' => lng('admin.customer_show_news_feed'),
'settinggroup' => 'customer', 'settinggroup' => 'customer',
'varname' => 'show_news_feed', 'varname' => 'show_news_feed',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'customer_news_feed_url' => array( 'customer_news_feed_url' => [
'label' => $lng['admin']['customer_news_feed_url'], 'label' => lng('admin.customer_news_feed_url'),
'settinggroup' => 'customer', 'settinggroup' => 'customer',
'varname' => 'news_feed_url', 'varname' => 'news_feed_url',
'type' => 'string', 'type' => 'url',
'string_type' => 'url',
'string_emptyallowed' => true, 'string_emptyallowed' => true,
'default' => '', 'default' => '',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'panel_allow_domain_change_admin' => array( 'panel_allow_domain_change_admin' => [
'label' => $lng['serversettings']['panel_allow_domain_change_admin'], 'label' => lng('serversettings.panel_allow_domain_change_admin'),
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'allow_domain_change_admin', 'varname' => 'allow_domain_change_admin',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'panel_allow_domain_change_customer' => array( ],
'label' => $lng['serversettings']['panel_allow_domain_change_customer'], 'panel_allow_domain_change_customer' => [
'label' => lng('serversettings.panel_allow_domain_change_customer'),
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'allow_domain_change_customer', 'varname' => 'allow_domain_change_customer',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'panel_phpconfigs_hidestdsubdomain' => array( ],
'label' => $lng['serversettings']['panel_phpconfigs_hidestdsubdomain'], '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', 'settinggroup' => 'panel',
'varname' => 'phpconfigs_hidestdsubdomain', 'varname' => 'phpconfigs_hidestdsubdomain',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'panel_customer_hide_options' => array( ],
'label' => $lng['serversettings']['panel_customer_hide_options'], 'panel_customer_hide_options' => [
'label' => lng('serversettings.panel_customer_hide_options'),
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'customer_hide_options', 'varname' => 'customer_hide_options',
'type' => 'option', 'type' => 'select',
'default' => '', 'default' => '',
'option_mode' => 'multiple', 'select_mode' => 'multiple',
'option_emptyallowed' => true, 'option_emptyallowed' => true,
'option_options' => array( 'select_var' => [
'email' => $lng['menue']['email']['email'], 'email' => lng('menue.email.email'),
'mysql' => $lng['menue']['mysql']['mysql'], 'mysql' => lng('menue.mysql.mysql'),
'domains' => $lng['menue']['domains']['domains'], 'domains' => lng('menue.domains.domains'),
'ftp' => $lng['menue']['ftp']['ftp'], 'ftp' => lng('menue.ftp.ftp'),
'extras' => $lng['menue']['extras']['extras'], 'extras' => lng('menue.extras.extras'),
'extras.directoryprotection' => $lng['menue']['extras']['extras']." / ".$lng['menue']['extras']['directoryprotection'], 'extras.directoryprotection' => lng('menue.extras.extras') . " / " . lng('menue.extras.directoryprotection'),
'extras.pathoptions' => $lng['menue']['extras']['extras']." / ".$lng['menue']['extras']['pathoptions'], 'extras.pathoptions' => lng('menue.extras.extras') . " / " . lng('menue.extras.pathoptions'),
'extras.logger' => $lng['menue']['extras']['extras']." / ".$lng['menue']['logger']['logger'], 'extras.logger' => lng('menue.extras.extras') . " / " . lng('menue.logger.logger'),
'extras.backup' => $lng['menue']['extras']['extras']." / ".$lng['menue']['extras']['backup'], 'extras.backup' => lng('menue.extras.extras') . " / " . lng('menue.extras.backup'),
'traffic' => $lng['menue']['traffic']['traffic'], 'traffic' => lng('menue.traffic.traffic'),
'traffic.http' => $lng['menue']['traffic']['traffic']." / HTTP", 'traffic.http' => lng('menue.traffic.traffic') . " / HTTP",
'traffic.ftp' => $lng['menue']['traffic']['traffic']." / FTP", 'traffic.ftp' => lng('menue.traffic.traffic') . " / FTP",
'traffic.mail' => $lng['menue']['traffic']['traffic']." / Mail", 'traffic.mail' => lng('menue.traffic.traffic') . " / Mail",
), 'misc.documentation' => lng('admin.documentation'),
],
'save_method' => 'storeSettingField', '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'
]
]
]
]
];

View File

@@ -2,200 +2,236 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Settings
* *
* 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 array( return [
'groups' => array( 'groups' => [
'accounts' => array( 'accounts' => [
'title' => $lng['admin']['accountsettings'], 'title' => lng('admin.accountsettings'),
'fields' => array( 'icon' => 'fa-solid fa-users-gear',
'session_sessiontimeout' => array( 'fields' => [
'label' => $lng['serversettings']['session_timeout'], 'session_sessiontimeout' => [
'label' => lng('serversettings.session_timeout'),
'settinggroup' => 'session', 'settinggroup' => 'session',
'varname' => 'sessiontimeout', 'varname' => 'sessiontimeout',
'type' => 'int', 'type' => 'number',
'min' => 60,
'default' => 600, 'default' => 600,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'session_allow_multiple_login' => array( 'session_allow_multiple_login' => [
'label' => $lng['serversettings']['session_allow_multiple_login'], 'label' => lng('serversettings.session_allow_multiple_login'),
'settinggroup' => 'session', 'settinggroup' => 'session',
'varname' => 'allow_multiple_login', 'varname' => 'allow_multiple_login',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'login_domain_login' => array( 'login_domain_login' => [
'label' => $lng['serversettings']['login_domain_login'], 'label' => lng('serversettings.login_domain_login'),
'settinggroup' => 'login', 'settinggroup' => 'login',
'varname' => 'domain_login', 'varname' => 'domain_login',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'login_maxloginattempts' => array( 'login_maxloginattempts' => [
'label' => $lng['serversettings']['maxloginattempts'], 'label' => lng('serversettings.maxloginattempts'),
'settinggroup' => 'login', 'settinggroup' => 'login',
'varname' => 'maxloginattempts', 'varname' => 'maxloginattempts',
'type' => 'int', 'type' => 'number',
'min' => 1,
'default' => 3, 'default' => 3,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'login_deactivatetime' => array( 'login_deactivatetime' => [
'label' => $lng['serversettings']['deactivatetime'], 'label' => lng('serversettings.deactivatetime'),
'settinggroup' => 'login', 'settinggroup' => 'login',
'varname' => 'deactivatetime', 'varname' => 'deactivatetime',
'type' => 'int', 'type' => 'number',
'min' => 0,
'default' => 900, 'default' => 900,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'panel_password_min_length' => array( '2fa_enabled' => [
'label' => $lng['serversettings']['panel_password_min_length'], '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', 'settinggroup' => 'panel',
'varname' => 'password_min_length', 'varname' => 'password_min_length',
'type' => 'int', 'type' => 'number',
'min' => 0,
'default' => 0, 'default' => 0,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'panel_password_alpha_lower' => array( 'panel_password_alpha_lower' => [
'label' => $lng['serversettings']['panel_password_alpha_lower'], 'label' => lng('serversettings.panel_password_alpha_lower'),
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'password_alpha_lower', 'varname' => 'password_alpha_lower',
'type' => 'bool', 'type' => 'checkbox',
'default' => true, 'default' => true,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'panel_password_alpha_upper' => array( 'panel_password_alpha_upper' => [
'label' => $lng['serversettings']['panel_password_alpha_upper'], 'label' => lng('serversettings.panel_password_alpha_upper'),
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'password_alpha_upper', 'varname' => 'password_alpha_upper',
'type' => 'bool', 'type' => 'checkbox',
'default' => true, 'default' => true,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'panel_password_numeric' => array( 'panel_password_numeric' => [
'label' => $lng['serversettings']['panel_password_numeric'], 'label' => lng('serversettings.panel_password_numeric'),
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'password_numeric', 'varname' => 'password_numeric',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'panel_password_special_char_required' => array( 'panel_password_special_char_required' => [
'label' => $lng['serversettings']['panel_password_special_char_required'], 'label' => lng('serversettings.panel_password_special_char_required'),
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'password_special_char_required', 'varname' => 'password_special_char_required',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'panel_password_special_char' => array( 'panel_password_special_char' => [
'label' => $lng['serversettings']['panel_password_special_char'], 'label' => lng('serversettings.panel_password_special_char'),
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'password_special_char', 'varname' => 'password_special_char',
'type' => 'string', 'type' => 'text',
'default' => '!?<>§$%+#=@', 'default' => '!?<>§$%+#=@',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'panel_password_regex' => array( 'panel_password_regex' => [
'label' => $lng['serversettings']['panel_password_regex'], 'label' => lng('serversettings.panel_password_regex'),
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'password_regex', 'varname' => 'password_regex',
'type' => 'string', 'type' => 'text',
'default' => '', 'default' => '',
/* 'plausibility_check_method' => 'checkValidRegEx', */
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'customer_accountprefix' => array( ],
'label' => $lng['serversettings']['accountprefix'], 'customer_accountprefix' => [
'label' => lng('serversettings.accountprefix'),
'settinggroup' => 'customer', 'settinggroup' => 'customer',
'varname' => 'accountprefix', 'varname' => 'accountprefix',
'type' => 'string', 'type' => 'text',
'default' => '', 'default' => '',
'plausibility_check_method' => 'checkUsername', 'plausibility_check_method' => [
'save_method' => 'storeSettingField', '\\Froxlor\\Validate\\Check',
), 'checkUsername'
'customer_mysqlprefix' => array( ],
'label' => $lng['serversettings']['mysqlprefix'], 'save_method' => 'storeSettingField'
],
'customer_mysqlprefix' => [
'label' => lng('serversettings.mysqlprefix'),
'settinggroup' => 'customer', 'settinggroup' => 'customer',
'varname' => 'mysqlprefix', 'varname' => 'mysqlprefix',
'type' => 'string', 'type' => 'text',
'default' => '', 'default' => '',
'plausibility_check_method' => 'checkUsername', 'plausibility_check_method' => [
'save_method' => 'storeSettingField', '\\Froxlor\\Validate\\Check',
), 'checkUsername'
'customer_ftpprefix' => array( ],
'label' => $lng['serversettings']['ftpprefix'], 'save_method' => 'storeSettingField'
],
'customer_ftpprefix' => [
'label' => lng('serversettings.ftpprefix'),
'settinggroup' => 'customer', 'settinggroup' => 'customer',
'varname' => 'ftpprefix', 'varname' => 'ftpprefix',
'type' => 'string', 'type' => 'text',
'default' => '', 'default' => '',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'customer_ftpatdomain' => array( 'customer_ftpatdomain' => [
'label' => $lng['serversettings']['ftpdomain'], 'label' => lng('serversettings.ftpdomain'),
'settinggroup' => 'customer', 'settinggroup' => 'customer',
'varname' => 'ftpatdomain', 'varname' => 'ftpatdomain',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'panel_allow_preset' => array( 'panel_allow_preset' => [
'label' => $lng['serversettings']['allow_password_reset'], 'label' => lng('serversettings.allow_password_reset'),
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'allow_preset', 'varname' => 'allow_preset',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'dependency' => array( 'dependency' => [
'fieldname' => 'panel_allow_preset_admin', 'fieldname' => 'panel_allow_preset_admin',
'fielddata' => array( 'fielddata' => [
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'allow_preset_admin', 'varname' => 'allow_preset_admin'
), ],
'onlyif' => 0 'onlyif' => 0
) ]
), ],
'panel_allow_preset_admin' => array( 'panel_allow_preset_admin' => [
'label' => $lng['serversettings']['allow_password_reset_admin'], 'label' => lng('serversettings.allow_password_reset_admin'),
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'allow_preset_admin', 'varname' => 'allow_preset_admin',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'dependency' => array( 'dependency' => [
'fieldname' => 'panel_allow_preset', 'fieldname' => 'panel_allow_preset',
'fielddata' => array( 'fielddata' => [
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'allow_preset', 'varname' => 'allow_preset'
), ],
'onlyif' => 1 'onlyif' => 1
) ]
), ],
'system_backupenabled' => array( 'system_backupenabled' => [
'label' => $lng['serversettings']['backupenabled'], 'label' => lng('serversettings.backupenabled'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'backupenabled', 'varname' => 'backupenabled',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'cronmodule' => 'froxlor/backup', 'cronmodule' => 'froxlor/backup',
'save_method' => 'storeSettingField' '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'
],
]
]
]
];

View File

@@ -2,216 +2,333 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Settings
* *
* 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 array( return [
'groups' => array( 'groups' => [
'system' => array( 'system' => [
'title' => $lng['admin']['systemsettings'], 'title' => lng('admin.systemsettings'),
'fields' => array( 'icon' => 'fa-solid fa-gears',
'system_documentroot_prefix' => array( 'fields' => [
'label' => $lng['serversettings']['documentroot_prefix'], 'system_documentroot_prefix' => [
'label' => lng('serversettings.documentroot_prefix'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'documentroot_prefix', 'varname' => 'documentroot_prefix',
'type' => 'string', 'type' => 'text',
'string_type' => 'dir', 'string_type' => 'dir',
'default' => '/var/customers/webs/', 'default' => '/var/customers/webs/',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'plausibility_check_method' => 'checkPathConflicts' 'plausibility_check_method' => [
), '\\Froxlor\\Validate\\Check',
'system_documentroot_use_default_value' => array( 'checkPathConflicts'
'label' => $lng['serversettings']['documentroot_use_default_value'], ],
'requires_reconf' => ['http']
],
'system_documentroot_use_default_value' => [
'label' => lng('serversettings.documentroot_use_default_value'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'documentroot_use_default_value', 'varname' => 'documentroot_use_default_value',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'system_ipaddress' => array( 'system_ipaddress' => [
'label' => $lng['serversettings']['ipaddress'], 'label' => lng('serversettings.ipaddress'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'ipaddress', 'varname' => 'ipaddress',
'type' => 'option', 'type' => 'select',
'option_mode' => 'one', 'option_options_method' => [
'option_options_method' => 'getIpAddresses', '\\Froxlor\\Domain\\IpAddr',
'getIpAddresses'
],
'default' => '', 'default' => '',
'save_method' => 'storeSettingIpAddress', 'save_method' => 'storeSettingIpAddress'
), ],
'system_defaultip' => array( 'system_defaultip' => [
'label' => $lng['serversettings']['defaultip'], 'label' => lng('serversettings.defaultip'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'defaultip', 'varname' => 'defaultip',
'type' => 'option', 'type' => 'select',
'option_mode' => 'multiple', 'select_mode' => 'multiple',
'option_options_method' => 'getIpPortCombinations', 'option_options_method' => [
'\\Froxlor\\Domain\\IpAddr',
'getIpPortCombinations'
],
'default' => '', 'default' => '',
'save_method' => 'storeSettingDefaultIp', 'save_method' => 'storeSettingDefaultIp'
), ],
'system_hostname' => array( 'system_defaultsslip' => [
'label' => $lng['serversettings']['hostname'], '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', 'settinggroup' => 'system',
'varname' => 'hostname', 'varname' => 'hostname',
'type' => 'string', 'type' => 'text',
'default' => '', 'default' => '',
'save_method' => 'storeSettingHostname', 'save_method' => 'storeSettingHostname',
'plausibility_check_method' => 'checkHostname', 'plausibility_check_method' => [
), '\\Froxlor\\Validate\\Check',
'system_validatedomain' => array( 'checkHostname'
'label' => $lng['serversettings']['validate_domain'], ]
],
'api_enabled' => [
'label' => lng('serversettings.enable_api'),
'settinggroup' => 'api',
'varname' => 'enabled',
'type' => 'checkbox',
'default' => false,
'save_method' => 'storeSettingField'
],
'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')
],
'save_method' => 'storeSettingField',
'advanced_mode' => true
],
'system_validate_domain' => [
'label' => lng('serversettings.validate_domain'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'validate_domain', 'varname' => 'validate_domain',
'type' => 'bool', 'type' => 'checkbox',
'default' => true, 'default' => true,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'system_stdsubdomain' => array( 'system_stdsubdomain' => [
'label' => $lng['serversettings']['stdsubdomainhost'], 'label' => lng('serversettings.stdsubdomainhost'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'stdsubdomain', 'varname' => 'stdsubdomain',
'type' => 'string', 'type' => 'text',
'default' => '', 'default' => '',
'save_method' => 'storeSettingHostname', 'save_method' => 'storeSettingHostname'
), ],
'system_mysql_access_host' => array( 'system_mysql_access_host' => [
'label' => $lng['serversettings']['mysql_access_host'], 'label' => lng('serversettings.mysql_access_host'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mysql_access_host', 'varname' => 'mysql_access_host',
'type' => 'string', 'type' => 'text',
'default' => '127.0.0.1,localhost', 'default' => '127.0.0.1,localhost',
'plausibility_check_method' => 'checkMysqlAccessHost', 'plausibility_check_method' => [
'save_method' => 'storeSettingMysqlAccessHost', '\\Froxlor\\Validate\\Check',
), 'checkMysqlAccessHost'
'system_index_file_extension' => array( ],
'label' => $lng['serversettings']['index_file_extension'], 'save_method' => 'storeSettingMysqlAccessHost'
],
'system_nssextrausers' => [
'label' => lng('serversettings.nssextrausers'),
'settinggroup' => 'system',
'varname' => 'nssextrausers',
'type' => 'checkbox',
'default' => false,
'save_method' => 'storeSettingField'
],
'system_index_file_extension' => [
'label' => lng('serversettings.index_file_extension'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'index_file_extension', 'varname' => 'index_file_extension',
'type' => 'string', 'type' => 'text',
'string_regexp' => '/^[a-zA-Z0-9]{1,6}$/', 'string_regexp' => '/^[a-zA-Z0-9]{1,6}$/',
'default' => 'html', 'default' => 'html',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'system_store_index_file_subs' => array( ],
'label' => $lng['serversettings']['system_store_index_file_subs'], 'system_store_index_file_subs' => [
'label' => lng('serversettings.system_store_index_file_subs'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'store_index_file_subs', 'varname' => 'store_index_file_subs',
'type' => 'bool', 'type' => 'checkbox',
'default' => true, 'default' => true,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'system_httpuser' => array( 'system_httpuser' => [
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'httpuser', 'varname' => 'httpuser',
'type' => 'hidden', 'type' => 'hidden',
'default' => 'www-data', 'default' => 'www-data'
), ],
'system_httpgroup' => array( 'system_httpgroup' => [
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'httpgroup', 'varname' => 'httpgroup',
'type' => 'hidden', 'type' => 'hidden',
'default' => 'www-data', 'default' => 'www-data'
), ],
'system_report_enable' => array( 'system_report_enable' => [
'label' => $lng['serversettings']['report']['report'], 'label' => lng('serversettings.report.report'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'report_enable', 'varname' => 'report_enable',
'type' => 'bool', 'type' => 'checkbox',
'default' => true, 'default' => true,
'cronmodule' => 'froxlor/reports', 'cronmodule' => 'froxlor/reports',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'system_report_webmax' => array( 'system_report_webmax' => [
'label' => $lng['serversettings']['report']['webmax'], 'label' => lng('serversettings.report.webmax'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'report_webmax', 'varname' => 'report_webmax',
'type' => 'int', 'type' => 'number',
'int_min' => 0, 'min' => 0,
'int_max' => 150, 'max' => 150,
'default' => 90, 'default' => 90,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'system_report_trafficmax' => array( 'system_report_trafficmax' => [
'label' => $lng['serversettings']['report']['trafficmax'], 'label' => lng('serversettings.report.trafficmax'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'report_trafficmax', 'varname' => 'report_trafficmax',
'type' => 'int', 'type' => 'number',
'int_min' => 0, 'min' => 0,
'int_max' => 150, 'max' => 150,
'default' => 90, 'default' => 90,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'system_mail_use_smtp' => [
'system_mail_use_smtp' => array( 'label' => lng('serversettings.mail_use_smtp'),
'label' => $lng['serversettings']['mail_use_smtp'],
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mail_use_smtp', 'varname' => 'mail_use_smtp',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'system_mail_smtp_host' => array( 'system_mail_smtp_host' => [
'label' => $lng['serversettings']['mail_smtp_host'], 'label' => lng('serversettings.mail_smtp_host'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mail_smtp_host', 'varname' => 'mail_smtp_host',
'type' => 'string', 'type' => 'text',
'default' => 'localhost', 'default' => 'localhost',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'system_mail_smtp_port' => array( 'system_mail_smtp_port' => [
'label' => $lng['serversettings']['mail_smtp_port'], 'label' => lng('serversettings.mail_smtp_port'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mail_smtp_port', 'varname' => 'mail_smtp_port',
'type' => 'int', 'type' => 'number',
'int_min' => 1, 'min' => 1,
'int_max' => 65535, 'max' => 65535,
'default' => 25, 'default' => 25,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'system_mail_smtp_usetls' => array( 'system_mail_smtp_usetls' => [
'label' => $lng['serversettings']['mail_smtp_usetls'], 'label' => lng('serversettings.mail_smtp_usetls'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mail_smtp_usetls', 'varname' => 'mail_smtp_usetls',
'type' => 'bool', 'type' => 'checkbox',
'default' => true, 'default' => true,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'system_mail_smtp_auth' => array( 'system_mail_smtp_auth' => [
'label' => $lng['serversettings']['mail_smtp_auth'], 'label' => lng('serversettings.mail_smtp_auth'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mail_smtp_auth', 'varname' => 'mail_smtp_auth',
'type' => 'bool', 'type' => 'checkbox',
'default' => true, 'default' => true,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'system_mail_smtp_user' => array( 'system_mail_smtp_user' => [
'label' => $lng['serversettings']['mail_smtp_user'], 'label' => lng('serversettings.mail_smtp_user'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mail_smtp_user', 'varname' => 'mail_smtp_user',
'type' => 'string', 'type' => 'text',
'default' => '', 'default' => '',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'system_mail_smtp_passwd' => array( 'system_mail_smtp_passwd' => [
'label' => $lng['serversettings']['mail_smtp_passwd'], 'label' => lng('serversettings.mail_smtp_passwd'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mail_smtp_passwd', 'varname' => 'mail_smtp_passwd',
'type' => 'hiddenString', 'type' => 'password',
'default' => '', 'default' => '',
'save_method' => 'storeSettingField'
],
'system_apply_specialsettings_default' => [
'label' => lng('serversettings.apply_specialsettings_default'),
'settinggroup' => 'system',
'varname' => 'apply_specialsettings_default',
'type' => 'checkbox',
'default' => true,
'save_method' => 'storeSettingField', '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
],
]
]
]
];

View File

@@ -2,162 +2,296 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2016 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Froxlor team <team@froxlor.org> (2016-) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @package Settings * 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 array(
'groups' => array( use Froxlor\Settings;
'froxlorvhost' => array(
'title' => $lng['admin']['froxlorvhost'], return [
'fields' => array( '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 * Webserver-Vhost
*/ */
'system_froxlordirectlyviahostname' => array( 'system_froxlordirectlyviahostname' => [
'label' => $lng['serversettings']['froxlordirectlyviahostname'], 'label' => lng('serversettings.froxlordirectlyviahostname'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'froxlordirectlyviahostname', 'varname' => 'froxlordirectlyviahostname',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => true,
'save_method' => 'storeSettingField' '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 * SSL / Let's Encrypt
*/ */
'system_le_froxlor_enabled' => array( 'system_le_froxlor_enabled' => [
'label' => $lng['serversettings']['le_froxlor_enabled'], 'label' => lng('serversettings.le_froxlor_enabled'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'le_froxlor_enabled', 'varname' => 'le_froxlor_enabled',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingClearCertificates', 'save_method' => 'storeSettingClearCertificates',
'visible' => Settings::Get('system.leenabled') 'visible' => Settings::Get('system.leenabled') && call_user_func([
), '\Froxlor\Settings\FroxlorVhostSettings',
'system_le_froxlor_redirect' => array( 'hasVhostContainerEnabled'
'label' => $lng['serversettings']['le_froxlor_redirect'], ], true),
'requires_reconf' => ['http']
],
'system_le_froxlor_redirect' => [
'label' => lng('serversettings.le_froxlor_redirect'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'le_froxlor_redirect', 'varname' => 'le_froxlor_redirect',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'visible' => Settings::Get('system.leenabled') '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 * FCGID
*/ */
'system_mod_fcgid_enabled_ownvhost' => array( 'system_mod_fcgid_ownvhost' => [
'label' => $lng['serversettings']['mod_fcgid_ownvhost'], 'label' => lng('serversettings.mod_fcgid_ownvhost'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mod_fcgid_ownvhost', 'varname' => 'mod_fcgid_ownvhost',
'type' => 'bool', 'type' => 'checkbox',
'default' => true, 'default' => true,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'websrv_avail' => array( 'websrv_avail' => [
'apache2' 'apache2'
), ],
'visible' => Settings::Get('system.mod_fcgid') 'visible' => Settings::Get('system.mod_fcgid') && call_user_func([
), '\Froxlor\Settings\FroxlorVhostSettings',
'system_mod_fcgid_httpuser' => array( 'hasVhostContainerEnabled'
'label' => $lng['admin']['mod_fcgid_user'], ]),
'requires_reconf' => ['system:fcgid']
],
'system_mod_fcgid_httpuser' => [
'label' => lng('admin.mod_fcgid_user'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mod_fcgid_httpuser', 'varname' => 'mod_fcgid_httpuser',
'type' => 'string', 'type' => 'text',
'default' => 'froxlorlocal', 'default' => 'froxlorlocal',
'save_method' => 'storeSettingWebserverFcgidFpmUser', 'save_method' => 'storeSettingWebserverFcgidFpmUser',
'websrv_avail' => array( 'websrv_avail' => [
'apache2' 'apache2'
), ],
'visible' => Settings::Get('system.mod_fcgid') 'visible' => Settings::Get('system.mod_fcgid') && call_user_func([
), '\Froxlor\Settings\FroxlorVhostSettings',
'system_mod_fcgid_httpgroup' => array( 'hasVhostContainerEnabled'
'label' => $lng['admin']['mod_fcgid_group'], ]),
'requires_reconf' => ['system:fcgid']
],
'system_mod_fcgid_httpgroup' => [
'label' => lng('admin.mod_fcgid_group'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mod_fcgid_httpgroup', 'varname' => 'mod_fcgid_httpgroup',
'type' => 'string', 'type' => 'text',
'default' => 'froxlorlocal', 'default' => 'froxlorlocal',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'websrv_avail' => array( 'websrv_avail' => [
'apache2' 'apache2'
), ],
'visible' => Settings::Get('system.mod_fcgid') 'visible' => Settings::Get('system.mod_fcgid') && call_user_func([
), '\Froxlor\Settings\FroxlorVhostSettings',
'system_mod_fcgid_defaultini_ownvhost' => array( 'hasVhostContainerEnabled'
'label' => $lng['serversettings']['mod_fcgid']['defaultini_ownvhost'], ]),
'requires_reconf' => ['system:fcgid']
],
'system_mod_fcgid_defaultini_ownvhost' => [
'label' => lng('serversettings.mod_fcgid.defaultini_ownvhost'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mod_fcgid_defaultini_ownvhost', 'varname' => 'mod_fcgid_defaultini_ownvhost',
'type' => 'option', 'type' => 'select',
'default' => '2', 'default' => '2',
'option_mode' => 'one', 'option_options_method' => [
'option_options_method' => 'getPhpConfigs', '\\Froxlor\\Http\\PhpConfig',
'getPhpConfigs'
],
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'websrv_avail' => array( 'websrv_avail' => [
'apache2' 'apache2'
), ],
'visible' => Settings::Get('system.mod_fcgid') 'visible' => Settings::Get('system.mod_fcgid') && call_user_func([
), '\Froxlor\Settings\FroxlorVhostSettings',
'hasVhostContainerEnabled'
])
],
/** /**
* php-fpm * php-fpm
*/ */
'system_phpfpm_enabled_ownvhost' => array( 'phpfpm_enabled_ownvhost' => [
'label' => $lng['phpfpm']['ownvhost'], 'label' => lng('phpfpm.ownvhost'),
'settinggroup' => 'phpfpm', 'settinggroup' => 'phpfpm',
'varname' => 'enabled_ownvhost', 'varname' => 'enabled_ownvhost',
'type' => 'bool', 'type' => 'checkbox',
'default' => true, 'default' => true,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'visible' => Settings::Get('phpfpm.enabled') 'visible' => Settings::Get('phpfpm.enabled') && call_user_func([
), '\Froxlor\Settings\FroxlorVhostSettings',
'system_phpfpm_httpuser' => array( 'hasVhostContainerEnabled'
'label' => $lng['phpfpm']['vhost_httpuser'], ]),
'requires_reconf' => ['system:php-fpm']
],
'phpfpm_vhost_httpuser' => [
'label' => lng('phpfpm.vhost_httpuser'),
'settinggroup' => 'phpfpm', 'settinggroup' => 'phpfpm',
'varname' => 'vhost_httpuser', 'varname' => 'vhost_httpuser',
'type' => 'string', 'type' => 'text',
'default' => 'froxlorlocal', 'default' => 'froxlorlocal',
'save_method' => 'storeSettingWebserverFcgidFpmUser', 'save_method' => 'storeSettingWebserverFcgidFpmUser',
'visible' => Settings::Get('phpfpm.enabled') 'visible' => Settings::Get('phpfpm.enabled') && call_user_func([
), '\Froxlor\Settings\FroxlorVhostSettings',
'system_phpfpm_httpgroup' => array( 'hasVhostContainerEnabled'
'label' => $lng['phpfpm']['vhost_httpgroup'], ]),
'requires_reconf' => ['system:php-fpm']
],
'phpfpm_vhost_httpgroup' => [
'label' => lng('phpfpm.vhost_httpgroup'),
'settinggroup' => 'phpfpm', 'settinggroup' => 'phpfpm',
'varname' => 'vhost_httpgroup', 'varname' => 'vhost_httpgroup',
'type' => 'string', 'type' => 'text',
'default' => 'froxlorlocal', 'default' => 'froxlorlocal',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'visible' => Settings::Get('phpfpm.enabled') 'visible' => Settings::Get('phpfpm.enabled') && call_user_func([
), '\Froxlor\Settings\FroxlorVhostSettings',
'system_phpfpm_defaultini_ownvhost' => array( 'hasVhostContainerEnabled'
'label' => $lng['serversettings']['mod_fcgid']['defaultini_ownvhost'], ]),
'requires_reconf' => ['system:php-fpm']
],
'phpfpm_vhost_defaultini' => [
'label' => lng('serversettings.mod_fcgid.defaultini_ownvhost'),
'settinggroup' => 'phpfpm', 'settinggroup' => 'phpfpm',
'varname' => 'vhost_defaultini', 'varname' => 'vhost_defaultini',
'type' => 'option', 'type' => 'select',
'default' => '2', 'default' => '2',
'option_mode' => 'one', 'option_options_method' => [
'option_options_method' => 'getPhpConfigs', '\\Froxlor\\Http\\PhpConfig',
'getPhpConfigs'
],
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'visible' => Settings::Get('phpfpm.enabled') 'visible' => Settings::Get('phpfpm.enabled') && call_user_func([
), '\Froxlor\Settings\FroxlorVhostSettings',
'hasVhostContainerEnabled'
])
],
/** /**
* DNS * DNS
*/ */
'system_dns_createhostnameentry' => array( 'system_dns_createhostnameentry' => [
'label' => $lng['serversettings']['dns_createhostnameentry'], 'label' => lng('serversettings.dns_createhostnameentry'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'dns_createhostnameentry', 'varname' => 'dns_createhostnameentry',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'visible' => Settings::Get('system.bind_enable') 'visible' => Settings::Get('system.bind_enable')
) ]
) ]
) ]
) ]
); ];

View File

@@ -2,66 +2,70 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2014 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Froxlor team <team@froxlor.org> (2010-) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @package Settings * 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 array( return [
'groups' => array( 'groups' => [
'crond' => array( 'crond' => [
'title' => $lng['admin']['cronsettings'], 'title' => lng('admin.cronsettings'),
'fields' => array( 'icon' => 'fa-solid fa-clock-rotate-left',
'system_cronconfig' => array( 'advanced_mode' => true,
'label' => $lng['serversettings']['system_cronconfig'], 'fields' => [
'system_cronconfig' => [
'label' => lng('serversettings.system_cronconfig'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'cronconfig', 'varname' => 'cronconfig',
'type' => 'string', 'type' => 'text',
'string_type' => 'file', 'string_type' => 'file',
'default' => '/etc/cron.d/froxlor', 'default' => '/etc/cron.d/froxlor',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'system_croncmdline' => array( 'system_croncmdline' => [
'label' => $lng['serversettings']['system_croncmdline'], 'label' => lng('serversettings.system_croncmdline'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'croncmdline', 'varname' => 'croncmdline',
'type' => 'string', 'type' => 'text',
'string_regexp' => '/^[a-z0-9\/\._\- ]+$/i',
'default' => '/usr/bin/nice -n 5 /usr/bin/php -q', 'default' => '/usr/bin/nice -n 5 /usr/bin/php -q',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'system_crondreload' => array( 'system_crondreload' => [
'label' => $lng['serversettings']['system_crondreload'], 'label' => lng('serversettings.system_crondreload'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'crondreload', 'varname' => 'crondreload',
'type' => 'string', 'type' => 'text',
'string_regexp' => '/^[a-z0-9\/\._\- ]+$/i',
'default' => '/etc/init.d/cron reload', 'default' => '/etc/init.d/cron reload',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'system_cron_allowautoupdate' => array( 'system_cron_allowautoupdate' => [
'label' => $lng['serversettings']['system_cron_allowautoupdate'], 'label' => lng('serversettings.system_cron_allowautoupdate'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'cron_allowautoupdate', 'varname' => 'cron_allowautoupdate',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ]
'system_debug_cron' => array( ]
'label' => $lng['serversettings']['cron']['debug'], ]
'settinggroup' => 'system', ]
'varname' => 'debug_cron', ];
'type' => 'bool',
'default' => false,
'save_method' => 'storeSettingField',
)
)
)
)
);

View File

@@ -2,277 +2,423 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Settings
* *
* 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 array(
'groups' => array( use Froxlor\Settings;
'webserver' => array(
'title' => $lng['admin']['webserversettings'], return [
'fields' => array( 'groups' => [
'system_webserver' => array( 'webserver' => [
'label' => $lng['admin']['webserver'], 'title' => lng('admin.webserversettings'),
'icon' => 'fa-solid fa-server',
'fields' => [
'system_webserver' => [
'label' => lng('admin.webserver'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'webserver', 'varname' => 'webserver',
'type' => 'option', 'type' => 'select',
'default' => 'apache2', 'default' => 'apache2',
'option_mode' => 'one', 'select_var' => [
'option_options' => array(
'apache2' => 'Apache 2', 'apache2' => 'Apache 2',
'lighttpd' => 'ligHTTPd', 'lighttpd' => 'ligHTTPd',
'nginx' => 'Nginx' 'nginx' => 'Nginx'
), ],
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'plausibility_check_method' => 'checkPhpInterfaceSetting', 'plausibility_check_method' => [
'overview_option' => true '\\Froxlor\\Validate\\Check',
), 'checkPhpInterfaceSetting'
'system_apache_24' => array( ],
'label' => $lng['serversettings']['apache_24'], 'requires_reconf' => ['http']
],
'system_apache_24' => [
'label' => lng('serversettings.apache_24'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'apache24', 'varname' => 'apache24',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'websrv_avail' => array( 'websrv_avail' => [
'apache2' 'apache2'
) ]
), ],
'system_apache_itksupport' => array( 'system_apacheitksupport' => [
'label' => $lng['serversettings']['apache_itksupport'], 'label' => lng('serversettings.apache_itksupport'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'apacheitksupport', 'varname' => 'apacheitksupport',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'visible' => (Settings::Get('system.mod_fcgid') == 0 && Settings::Get('phpfpm.enabled') == 0), 'visible' => (Settings::Get('system.mod_fcgid') == 0 && Settings::Get('phpfpm.enabled') == 0),
'websrv_avail' => array( 'websrv_avail' => [
'apache2' 'apache2'
) ],
), 'advanced_mode' => true
'system_httpuser' => array( ],
'label' => $lng['admin']['webserver_user'], '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_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', 'settinggroup' => 'system',
'varname' => 'httpuser', 'varname' => 'httpuser',
'type' => 'string', 'type' => 'text',
'default' => 'www-data', 'default' => 'www-data',
'save_method' => 'storeSettingWebserverFcgidFpmUser' 'save_method' => 'storeSettingWebserverFcgidFpmUser'
), ],
'system_httpgroup' => array( 'system_httpgroup' => [
'label' => $lng['admin']['webserver_group'], 'label' => lng('admin.webserver_group'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'httpgroup', 'varname' => 'httpgroup',
'type' => 'string', 'type' => 'text',
'default' => 'www-data', 'default' => 'www-data',
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField'
), ],
'system_apacheconf_vhost' => array( 'system_apacheconf_vhost' => [
'label' => $lng['serversettings']['apacheconf_vhost'], 'label' => lng('serversettings.apacheconf_vhost'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'apacheconf_vhost', 'varname' => 'apacheconf_vhost',
'type' => 'string', 'type' => 'text',
'string_type' => 'filedir', 'string_type' => 'filedir',
'default' => '/etc/apache2/sites-enabled/', 'default' => '/etc/apache2/sites-enabled/',
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField',
), 'requires_reconf' => ['http']
'system_apacheconf_diroptions' => array( ],
'label' => $lng['serversettings']['apacheconf_diroptions'], 'system_apacheconf_diroptions' => [
'label' => lng('serversettings.apacheconf_diroptions'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'apacheconf_diroptions', 'varname' => 'apacheconf_diroptions',
'type' => 'string', 'type' => 'text',
'string_type' => 'filedir', 'string_type' => 'filedir',
'default' => '/etc/apache2/sites-enabled/', 'default' => '/etc/apache2/sites-enabled/',
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField',
), 'requires_reconf' => ['http']
'system_apacheconf_htpasswddir' => array( ],
'label' => $lng['serversettings']['apacheconf_htpasswddir'], 'system_apacheconf_htpasswddir' => [
'label' => lng('serversettings.apacheconf_htpasswddir'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'apacheconf_htpasswddir', 'varname' => 'apacheconf_htpasswddir',
'type' => 'string', 'type' => 'text',
'string_type' => 'confdir', 'string_type' => 'confdir',
'default' => '/etc/apache2/htpasswd/', 'default' => '/etc/apache2/htpasswd/',
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField'
), ],
'system_logfiles_directory' => array( 'system_logfiles_directory' => [
'label' => $lng['serversettings']['logfiles_directory'], 'label' => lng('serversettings.logfiles_directory'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'logfiles_directory', 'varname' => 'logfiles_directory',
'type' => 'string', 'type' => 'text',
'string_type' => 'dir', 'string_type' => 'dir',
'default' => '/var/customers/logs/', 'default' => '/var/customers/logs/',
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField',
), 'requires_reconf' => ['http']
'system_customersslpath' => array( ],
'label' => $lng['serversettings']['customerssl_directory'], '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' => 'text',
'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', 'settinggroup' => 'system',
'varname' => 'customer_ssl_path', 'varname' => 'customer_ssl_path',
'type' => 'string', 'type' => 'text',
'string_type' => 'confdir', 'string_type' => 'confdir',
'default' => '/etc/ssl/froxlor-custom/', 'default' => '/etc/ssl/froxlor-custom/',
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField'
), ],
'system_phpappendopenbasedir' => array( 'system_phpappendopenbasedir' => [
'label' => $lng['serversettings']['phpappendopenbasedir'], 'label' => lng('serversettings.phpappendopenbasedir'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'phpappendopenbasedir', 'varname' => 'phpappendopenbasedir',
'type' => 'string', 'type' => 'text',
'string_emptyallowed' => true, 'string_emptyallowed' => true,
'default' => '', 'default' => '',
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'system_deactivateddocroot' => array( ],
'label' => $lng['serversettings']['deactivateddocroot'], 'system_deactivateddocroot' => [
'label' => lng('serversettings.deactivateddocroot'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'deactivateddocroot', 'varname' => 'deactivateddocroot',
'type' => 'string', 'type' => 'text',
'string_type' => 'dir', 'string_type' => 'dir',
'string_emptyallowed' => true, 'string_emptyallowed' => true,
'default' => '', 'default' => '',
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField',
), 'requires_reconf' => ['http']
'system_default_vhostconf' => array( ],
'label' => $lng['serversettings']['default_vhostconf'], 'system_default_vhostconf' => [
'label' => lng('serversettings.default_vhostconf'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'default_vhostconf', 'varname' => 'default_vhostconf',
'type' => 'text', 'type' => 'textarea',
'default' => '', 'default' => '',
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'system_apache_globaldiropt' => array( ],
'label' => $lng['serversettings']['apache_globaldiropt'], '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', 'settinggroup' => 'system',
'varname' => 'apacheglobaldiropt', 'varname' => 'apacheglobaldiropt',
'type' => 'text', 'type' => 'textarea',
'default' => '', 'default' => '',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'visible' => (Settings::Get('system.mod_fcgid') == 0 && Settings::Get('phpfpm.enabled') == 0), 'visible' => (Settings::Get('system.mod_fcgid') == 0 && Settings::Get('phpfpm.enabled') == 0),
'websrv_avail' => array( 'websrv_avail' => [
'apache2' 'apache2'
) ],
), 'advanced_mode' => true
'system_apachereload_command' => array( ],
'label' => $lng['serversettings']['apachereload_command'], 'system_apachereload_command' => [
'label' => lng('serversettings.apachereload_command'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'apachereload_command', 'varname' => 'apachereload_command',
'type' => 'string', 'type' => 'text',
'string_regexp' => '/^[a-z0-9\/\._\- ]+$/i',
'default' => '/etc/init.d/apache2 reload', 'default' => '/etc/init.d/apache2 reload',
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField'
), ],
'system_phpreload_command' => array( 'system_phpreload_command' => [
'label' => $lng['serversettings']['phpreload_command'], 'label' => lng('serversettings.phpreload_command'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'phpreload_command', 'varname' => 'phpreload_command',
'type' => 'string', 'type' => 'text',
'string_regexp' => '/^[a-z0-9\/\._\- ]+$/i',
'default' => '', 'default' => '',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'websrv_avail' => array( 'websrv_avail' => [
'nginx' 'nginx'
) ]
), ],
'system_nginx_php_backend' => array( 'system_nginx_php_backend' => [
'label' => $lng['serversettings']['nginx_php_backend'], 'label' => lng('serversettings.nginx_php_backend'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'nginx_php_backend', 'varname' => 'nginx_php_backend',
'type' => 'string', 'type' => 'text',
'default' => '127.0.0.1:8888', 'default' => '127.0.0.1:8888',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'websrv_avail' => array( 'websrv_avail' => [
'nginx' 'nginx'
) ]
), ],
'nginx_fastcgiparams' => array( 'nginx_fastcgiparams' => [
'label' => $lng['serversettings']['nginx_fastcgiparams'], 'label' => lng('serversettings.nginx_fastcgiparams'),
'settinggroup' => 'nginx', 'settinggroup' => 'nginx',
'varname' => 'fastcgiparams', 'varname' => 'fastcgiparams',
'type' => 'string', 'type' => 'text',
'string_type' => 'file', 'string_type' => 'file',
'default' => '/etc/nginx/fastcgi_params', 'default' => '/etc/nginx/fastcgi_params',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'websrv_avail' => array( 'websrv_avail' => [
'nginx' 'nginx'
) ]
), ],
'defaultwebsrverrhandler_enabled' => array( 'defaultwebsrverrhandler_enabled' => [
'label' => $lng['serversettings']['defaultwebsrverrhandler_enabled'], 'label' => lng('serversettings.defaultwebsrverrhandler_enabled'),
'settinggroup' => 'defaultwebsrverrhandler', 'settinggroup' => 'defaultwebsrverrhandler',
'varname' => 'enabled', 'varname' => 'enabled',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'defaultwebsrverrhandler_err401' => array( ],
'label' => $lng['serversettings']['defaultwebsrverrhandler_err401'], 'defaultwebsrverrhandler_err401' => [
'label' => lng('serversettings.defaultwebsrverrhandler_err401'),
'settinggroup' => 'defaultwebsrverrhandler', 'settinggroup' => 'defaultwebsrverrhandler',
'varname' => 'err401', 'varname' => 'err401',
'type' => 'string', 'type' => 'text',
'default' => '', 'default' => '',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'websrv_avail' => array( 'websrv_avail' => [
'apache2', 'apache2',
'nginx' 'nginx'
) ],
), 'advanced_mode' => true
'defaultwebsrverrhandler_err403' => array( ],
'label' => $lng['serversettings']['defaultwebsrverrhandler_err403'], 'defaultwebsrverrhandler_err403' => [
'label' => lng('serversettings.defaultwebsrverrhandler_err403'),
'settinggroup' => 'defaultwebsrverrhandler', 'settinggroup' => 'defaultwebsrverrhandler',
'varname' => 'err403', 'varname' => 'err403',
'type' => 'string', 'type' => 'text',
'default' => '', 'default' => '',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'websrv_avail' => array( 'websrv_avail' => [
'apache2', 'apache2',
'nginx' 'nginx'
) ],
), 'advanced_mode' => true
'defaultwebsrverrhandler_err404' => array( ],
'label' => $lng['serversettings']['defaultwebsrverrhandler_err404'], 'defaultwebsrverrhandler_err404' => [
'label' => lng('serversettings.defaultwebsrverrhandler_err404'),
'settinggroup' => 'defaultwebsrverrhandler', 'settinggroup' => 'defaultwebsrverrhandler',
'varname' => 'err404', 'varname' => 'err404',
'type' => 'string', 'type' => 'text',
'default' => '',
'save_method' => 'storeSettingField'
),
'defaultwebsrverrhandler_err500' => array(
'label' => $lng['serversettings']['defaultwebsrverrhandler_err500'],
'settinggroup' => 'defaultwebsrverrhandler',
'varname' => 'err500',
'type' => 'string',
'default' => '', 'default' => '',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'websrv_avail' => array( 'advanced_mode' => true
],
'defaultwebsrverrhandler_err500' => [
'label' => lng('serversettings.defaultwebsrverrhandler_err500'),
'settinggroup' => 'defaultwebsrverrhandler',
'varname' => 'err500',
'type' => 'text',
'default' => '',
'save_method' => 'storeSettingField',
'websrv_avail' => [
'apache2', 'apache2',
'nginx' 'nginx'
) ],
), 'advanced_mode' => true
'customredirect_enabled' => array( ],
'label' => $lng['serversettings']['customredirect_enabled'], 'customredirect_enabled' => [
'label' => lng('serversettings.customredirect_enabled'),
'settinggroup' => 'customredirect', 'settinggroup' => 'customredirect',
'varname' => 'enabled', 'varname' => 'enabled',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField'
), ],
'customredirect_default' => array( 'customredirect_default' => [
'label' => $lng['serversettings']['customredirect_default'], 'label' => lng('serversettings.customredirect_default'),
'settinggroup' => 'customredirect', 'settinggroup' => 'customredirect',
'varname' => 'default', 'varname' => 'default',
'type' => 'option', 'type' => 'select',
'default' => '1', 'default' => '1',
'option_mode' => 'one', 'option_options_method' => ['\\Froxlor\\Domain\\Domain', 'getRedirectCodes'],
'option_options_method' => 'getRedirectCodes',
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField'
) ]
) ]
) ]
) ]
); ];

View File

@@ -2,185 +2,257 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Settings
* *
* 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 array(
'groups' => array( use Froxlor\Froxlor;
'ssl' => array( use Froxlor\Settings;
'title' => $lng['admin']['sslsettings'],
'fields' => array( return [
'system_ssl_enabled' => array( 'groups' => [
'label' => $lng['serversettings']['ssl']['use_ssl'], 'ssl' => [
'title' => lng('admin.sslsettings'),
'icon' => 'fa-solid fa-shield',
'fields' => [
'system_use_ssl' => [
'label' => lng('serversettings.ssl.use_ssl'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'use_ssl', 'varname' => 'use_ssl',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'overview_option' => true 'overview_option' => true,
), 'requires_reconf' => ['http']
'system_ssl_cipher_list' => array( ],
'label' => $lng['serversettings']['ssl']['ssl_cipher_list'], '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', 'settinggroup' => 'system',
'varname' => 'ssl_cipher_list', 'varname' => 'ssl_cipher_list',
'type' => 'string', 'type' => 'text',
'string_emptyallowed' => false, 'string_emptyallowed' => false,
'default' => 'ECDH+AESGCM:ECDH+AES256:!aNULL:!MD5:!DSS:!DH:!AES128', 'default' => 'ECDH+AESGCM:ECDH+AES256:!aNULL:!MD5:!DSS:!DH:!AES128',
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'system_ssl_cert_file' => array( ],
'label' => $lng['serversettings']['ssl']['ssl_cert_file'], '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', 'settinggroup' => 'system',
'varname' => 'ssl_cert_file', 'varname' => 'ssl_cert_file',
'type' => 'string', 'type' => 'text',
'string_type' => 'file', 'string_type' => 'file',
'string_emptyallowed' => true, 'string_emptyallowed' => true,
'default' => '/etc/apache2/apache2.pem', 'default' => '/etc/ssl/froxlor_selfsigned.pem',
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField'
), ],
'system_ssl_key_file' => array( 'system_ssl_key_file' => [
'label' => $lng['serversettings']['ssl']['ssl_key_file'], 'label' => lng('serversettings.ssl.ssl_key_file'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'ssl_key_file', 'varname' => 'ssl_key_file',
'type' => 'string', 'type' => 'text',
'string_type' => 'file', 'string_type' => 'file',
'string_emptyallowed' => true, 'string_emptyallowed' => true,
'default' => '/etc/apache2/apache2.key', 'default' => '/etc/ssl/froxlor_selfsigned.key',
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField'
), ],
'system_ssl_cert_chainfile' => array( 'system_ssl_cert_chainfile' => [
'label' => $lng['admin']['ipsandports']['ssl_cert_chainfile'], 'label' => lng('admin.ipsandports.ssl_cert_chainfile'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'ssl_cert_chainfile', 'varname' => 'ssl_cert_chainfile',
'type' => 'string', 'type' => 'text',
'string_type' => 'file', 'string_type' => 'file',
'string_emptyallowed' => true, 'string_emptyallowed' => true,
'default' => '', 'default' => '',
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField'
), ],
'system_ssl_ca_file' => array( 'system_ssl_ca_file' => [
'label' => $lng['serversettings']['ssl']['ssl_ca_file'], 'label' => lng('serversettings.ssl.ssl_ca_file'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'ssl_ca_file', 'varname' => 'ssl_ca_file',
'type' => 'string', 'type' => 'text',
'string_type' => 'file', 'string_type' => 'file',
'string_emptyallowed' => true, 'string_emptyallowed' => true,
'default' => '', 'default' => '',
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField'
), ],
'system_leenabled' => array( 'system_apache24_ocsp_cache_path' => [
'label' => $lng['serversettings']['leenabled'], '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', 'settinggroup' => 'system',
'varname' => 'leenabled', 'varname' => 'leenabled',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'cronmodule' => 'froxlor/letsencrypt', 'cronmodule' => 'froxlor/letsencrypt',
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField',
), 'requires_reconf' => ['http']
'system_letsencryptacmeconf' => array( ],
'label' => $lng['serversettings']['letsencryptacmeconf'], '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
],
'system_letsencryptacmeconf' => [
'label' => lng('serversettings.letsencryptacmeconf'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'letsencryptacmeconf', 'varname' => 'letsencryptacmeconf',
'type' => 'string', 'type' => 'text',
'string_type' => 'file', 'string_type' => 'file',
'default' => '/etc/apache2/conf-enabled/acme.conf', 'default' => '/etc/apache2/conf-enabled/acme.conf',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'requires_reconf' => ['http']
'system_letsencryptca' => array( ],
'label' => $lng['serversettings']['letsencryptca'], 'system_letsencryptca' => [
'label' => lng('serversettings.letsencryptca'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'letsencryptca', 'varname' => 'letsencryptca',
'type' => 'option', 'type' => 'select',
'default' => 'testing', 'default' => 'letsencrypt',
'option_mode' => 'one', 'select_var' => [
'option_options' => array( 'letsencrypt_test' => 'Let\'s Encrypt (Test / Staging)',
'testing' => 'https://acme-staging.api.letsencrypt.org (Test)', 'letsencrypt' => 'Let\'s Encrypt (Live)',
'production' => 'https://acme-v01.api.letsencrypt.org (Live)' 'buypass_test' => 'Buypass (Test / Staging)',
), 'buypass' => 'Buypass (Live)',
'zerossl' => 'ZeroSSL (Live)',
'google' => 'Google (Live)',
'google_test' => 'Google (Test / Staging)',
],
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField'
), ],
'system_letsencryptcountrycode' => array( 'system_letsencryptchallengepath' => [
'label' => $lng['serversettings']['letsencryptcountrycode'], 'label' => lng('serversettings.letsencryptchallengepath'),
'settinggroup' => 'system',
'varname' => 'letsencryptcountrycode',
'type' => 'string',
'string_emptyallowed' => false,
'default' => 'DE',
'save_method' => 'storeSettingField'
),
'system_letsencryptstate' => array(
'label' => $lng['serversettings']['letsencryptstate'],
'settinggroup' => 'system',
'varname' => 'letsencryptstate',
'type' => 'string',
'string_emptyallowed' => false,
'default' => 'Hessen',
'save_method' => 'storeSettingField'
),
'system_letsencryptchallengepath' => array(
'label' => $lng['serversettings']['letsencryptchallengepath'],
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'letsencryptchallengepath', 'varname' => 'letsencryptchallengepath',
'type' => 'string', 'type' => 'text',
'string_emptyallowed' => false, 'string_emptyallowed' => false,
'default' => FROXLOR_INSTALL_DIR, 'default' => Froxlor::getInstallDir(),
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField',
), 'advanced_mode' => true,
'system_letsencryptkeysize' => array( 'requires_reconf' => ['http']
'label' => $lng['serversettings']['letsencryptkeysize'], ],
'system_letsencryptkeysize' => [
'label' => lng('serversettings.letsencryptkeysize'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'letsencryptkeysize', 'varname' => 'letsencryptkeysize',
'type' => 'int', 'type' => 'select',
'int_min' => 2048, 'default' => '2048',
'default' => 4096, 'select_var' => [
'2048' => '2048',
'3072' => '3072',
'4096' => '4096',
'8192' => '8192'
],
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField'
), ],
'system_letsencryptreuseold' => array( 'system_leecc' => [
'label' => $lng['serversettings']['letsencryptreuseold'], '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', 'settinggroup' => 'system',
'varname' => 'letsencryptreuseold', 'varname' => 'letsencryptreuseold',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => true,
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'system_hsts_maxage' => array( ],
'label' => $lng['admin']['domain_hsts_maxage'], 'system_le_domain_dnscheck' => [
'label' => lng('serversettings.le_domain_dnscheck'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'hsts_maxage', 'varname' => 'le_domain_dnscheck',
'type' => 'int', 'type' => 'checkbox',
'int_min' => 0, 'default' => true,
'int_max' => 94608000, // 3-years
'default' => 0,
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField'
), ],
'system_hsts_incsub' => array( 'system_le_domain_dnscheck_resolver' => [
'label' => $lng['admin']['domain_hsts_incsub'], 'label' => lng('serversettings.le_domain_dnscheck_resolver'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'hsts_incsub', 'varname' => 'le_domain_dnscheck_resolver',
'type' => 'bool', 'type' => 'text',
'default' => false, 'string_regexp' => '/^(([0-9]+ [a-z0-9\-\._]+, ?)*[0-9]+ [a-z0-9\-\._]+)?$/i',
'string_emptyallowed' => true,
'default' => '',
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField'
), ]
'system_hsts_preload' => array( ]
'label' => $lng['admin']['domain_hsts_preload'], ]
'settinggroup' => 'system', ]
'varname' => 'hsts_preload', ];
'type' => 'bool',
'default' => false,
'save_method' => 'storeSettingField'
),
)
)
)
);

View File

@@ -4,110 +4,142 @@
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Froxlor team <team@froxlor.org> (2010-) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @package Settings * 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 array( return [
'groups' => array( 'groups' => [
'fcgid' => array( 'fcgid' => [
'title' => $lng['admin']['fcgid_settings'], 'title' => lng('admin.fcgid_settings'),
'websrv_avail' => array('apache2', 'lighttpd'), 'icon' => 'fa-brands fa-php',
'fields' => array( 'websrv_avail' => [
'system_mod_fcgid_enabled' => array( 'apache2',
'label' => $lng['serversettings']['mod_fcgid'], 'lighttpd'
],
'fields' => [
'system_mod_fcgid' => [
'label' => lng('serversettings.mod_fcgid'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mod_fcgid', 'varname' => 'mod_fcgid',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'plausibility_check_method' => 'checkFcgidPhpFpm', 'plausibility_check_method' => [
'overview_option' => true '\\Froxlor\\Validate\\Check',
), 'checkFcgidPhpFpm'
'system_mod_fcgid_configdir' => array( ],
'label' => $lng['serversettings']['mod_fcgid']['configdir'], 'overview_option' => true,
'requires_reconf' => ['http', 'system:fcgid']
],
'system_mod_fcgid_configdir' => [
'label' => lng('serversettings.mod_fcgid.configdir'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mod_fcgid_configdir', 'varname' => 'mod_fcgid_configdir',
'type' => 'string', 'type' => 'text',
'string_type' => 'confdir', 'string_type' => 'confdir',
'default' => '/var/www/php-fcgi-scripts/', 'default' => '/var/www/php-fcgi-scripts/',
'plausibility_check_method' => 'checkPathConflicts', 'plausibility_check_method' => [
'\\Froxlor\\Validate\\Check',
'checkPathConflicts'
],
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'requires_reconf' => ['system:fcgid']
'system_mod_fcgid_tmpdir' => array( ],
'label' => $lng['serversettings']['mod_fcgid']['tmpdir'], 'system_mod_fcgid_tmpdir' => [
'label' => lng('serversettings.mod_fcgid.tmpdir'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mod_fcgid_tmpdir', 'varname' => 'mod_fcgid_tmpdir',
'type' => 'string', 'type' => 'text',
'string_type' => 'dir', 'string_type' => 'dir',
'default' => '/var/customers/tmp/', 'default' => '/var/customers/tmp/',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'requires_reconf' => ['http']
'system_mod_fcgid_peardir' => array( ],
'label' => $lng['serversettings']['mod_fcgid']['peardir'], 'system_mod_fcgid_peardir' => [
'label' => lng('serversettings.mod_fcgid.peardir'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mod_fcgid_peardir', 'varname' => 'mod_fcgid_peardir',
'type' => 'string', 'type' => 'text',
'string_type' => 'dir', 'string_type' => 'dir',
'string_delimiter' => ':', 'string_delimiter' => ':',
'string_emptyallowed' => true, 'string_emptyallowed' => true,
'default' => '/usr/share/php/:/usr/share/php5/', 'default' => '/usr/share/php/:/usr/share/php5/',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'system_mod_fcgid_wrapper' => array( ],
'label' => $lng['serversettings']['mod_fcgid']['wrapper'], 'system_mod_fcgid_wrapper' => [
'label' => lng('serversettings.mod_fcgid.wrapper'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mod_fcgid_wrapper', 'varname' => 'mod_fcgid_wrapper',
'type' => 'option', 'type' => 'select',
'option_options' => array(0 => 'ScriptAlias', 1=> 'FcgidWrapper'), 'select_var' => [
0 => 'ScriptAlias',
1 => 'FcgidWrapper'
],
'default' => 1, 'default' => 1,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'websrv_avail' => array('apache2') 'websrv_avail' => [
), 'apache2'
'system_mod_fcgid_starter' => array( ],
'label' => $lng['serversettings']['mod_fcgid']['starter'], 'advanced_mode' => true
],
'system_mod_fcgid_starter' => [
'label' => lng('serversettings.mod_fcgid.starter'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mod_fcgid_starter', 'varname' => 'mod_fcgid_starter',
'type' => 'int', 'type' => 'number',
'min' => 0,
'default' => 0, 'default' => 0,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'system_mod_fcgid_maxrequests' => array( ],
'label' => $lng['serversettings']['mod_fcgid']['maxrequests'], 'system_mod_fcgid_maxrequests' => [
'label' => lng('serversettings.mod_fcgid.maxrequests'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mod_fcgid_maxrequests', 'varname' => 'mod_fcgid_maxrequests',
'type' => 'int', 'type' => 'number',
'default' => 250, 'default' => 250,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'system_mod_fcgid_defaultini' => array( ],
'label' => $lng['serversettings']['mod_fcgid']['defaultini'], 'system_mod_fcgid_defaultini' => [
'label' => lng('serversettings.mod_fcgid.defaultini'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mod_fcgid_defaultini', 'varname' => 'mod_fcgid_defaultini',
'type' => 'option', 'type' => 'select',
'default' => '1', 'default' => '1',
'option_mode' => 'one', 'option_options_method' => [
'option_options_method' => 'getPhpConfigs', '\\Froxlor\\Http\\PhpConfig',
'save_method' => 'storeSettingField', 'getPhpConfigs'
), ],
'system_mod_fcgid_idle_timeout' => array( 'save_method' => 'storeSettingField'
'label' => $lng['serversettings']['mod_fcgid']['idle_timeout'], ],
'system_mod_fcgid_idle_timeout' => [
'label' => lng('serversettings.mod_fcgid.idle_timeout'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mod_fcgid_idle_timeout', 'varname' => 'mod_fcgid_idle_timeout',
'type' => 'int', 'type' => 'number',
'default' => 30, 'default' => 30,
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
) ]
) ]
) ]
); ]
];
?>

View File

@@ -4,163 +4,158 @@
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Froxlor team <team@froxlor.org> (2010-) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @package Settings * 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 array( use Froxlor\Settings;
'groups' => array(
'phpfpm' => array( return [
'title' => $lng['admin']['phpfpm_settings'], 'groups' => [
'fields' => array( 'phpfpm' => [
'system_phpfpm_enabled' => array( 'title' => lng('admin.phpfpm_settings'),
'label' => $lng['serversettings']['phpfpm'], 'icon' => 'fa-brands fa-php',
'fields' => [
'phpfpm_enabled' => [
'label' => lng('serversettings.phpfpm'),
'settinggroup' => 'phpfpm', 'settinggroup' => 'phpfpm',
'varname' => 'enabled', 'varname' => 'enabled',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'plausibility_check_method' => 'checkFcgidPhpFpm', 'plausibility_check_method' => [
'overview_option' => true '\\Froxlor\\Validate\\Check',
), 'checkFcgidPhpFpm'
'system_phpfpm_defaultini' => array( ],
'label' => $lng['serversettings']['mod_fcgid']['defaultini'], 'overview_option' => true,
'requires_reconf' => ['http', 'system:php-fpm']
],
'phpfpm_defaultini' => [
'label' => lng('serversettings.mod_fcgid.defaultini'),
'settinggroup' => 'phpfpm', 'settinggroup' => 'phpfpm',
'varname' => 'defaultini', 'varname' => 'defaultini',
'type' => 'option', 'type' => 'select',
'default' => '1', 'default' => '1',
'option_mode' => 'one', 'option_options_method' => [
'option_options_method' => 'getPhpConfigs', '\\Froxlor\\Http\\PhpConfig',
'getPhpConfigs'
],
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField'
), ],
'system_phpfpm_configdir' => array( 'phpfpm_aliasconfigdir' => [
'label' => $lng['serversettings']['phpfpm_settings']['configdir'], 'label' => lng('serversettings.phpfpm_settings.aliasconfigdir'),
'settinggroup' => 'phpfpm',
'varname' => 'configdir',
'type' => 'string',
'string_type' => 'confdir',
'default' => '/etc/php-fpm.d/',
'save_method' => 'storeSettingField'
),
'system_phpfpm_aliasconfigdir' => array(
'label' => $lng['serversettings']['phpfpm_settings']['aliasconfigdir'],
'settinggroup' => 'phpfpm', 'settinggroup' => 'phpfpm',
'varname' => 'aliasconfigdir', 'varname' => 'aliasconfigdir',
'type' => 'string', 'type' => 'text',
'string_type' => 'confdir', 'string_type' => 'confdir',
'default' => '/var/www/php-fpm/', 'default' => '/var/www/php-fpm/',
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'system_phpfpm_tmpdir' => array( ],
'label' => $lng['serversettings']['mod_fcgid']['tmpdir'], 'phpfpm_tmpdir' => [
'label' => lng('serversettings.mod_fcgid.tmpdir'),
'settinggroup' => 'phpfpm', 'settinggroup' => 'phpfpm',
'varname' => 'tmpdir', 'varname' => 'tmpdir',
'type' => 'string', 'type' => 'text',
'string_type' => 'dir', 'string_type' => 'dir',
'default' => '/var/customers/tmp/', 'default' => '/var/customers/tmp/',
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField'
), ],
'system_phpfpm_peardir' => array( 'phpfpm_peardir' => [
'label' => $lng['serversettings']['mod_fcgid']['peardir'], 'label' => lng('serversettings.mod_fcgid.peardir'),
'settinggroup' => 'phpfpm', 'settinggroup' => 'phpfpm',
'varname' => 'peardir', 'varname' => 'peardir',
'type' => 'string', 'type' => 'text',
'string_type' => 'dir', 'string_type' => 'dir',
'string_delimiter' => ':',
'string_emptyallowed' => true,
'default' => '/usr/share/php/:/usr/share/php5/', 'default' => '/usr/share/php/:/usr/share/php5/',
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'system_phpfpm_fastcgi_ipcdir' => array( ],
'label' => $lng['serversettings']['phpfpm_settings']['ipcdir'], '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', 'settinggroup' => 'phpfpm',
'varname' => 'fastcgi_ipcdir', 'varname' => 'fastcgi_ipcdir',
'type' => 'string', 'type' => 'text',
'string_type' => 'dir', 'string_type' => 'dir',
'default' => '/var/lib/apache2/fastcgi/', 'default' => '/var/lib/apache2/fastcgi/',
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'system_phpfpm_reload' => array( ],
'label' => $lng['serversettings']['phpfpm_settings']['reload'], 'phpfpm_use_mod_proxy' => [
'settinggroup' => 'phpfpm', 'label' => lng('phpfpm.use_mod_proxy'),
'varname' => 'reload',
'type' => 'string',
'default' => '/etc/init.d/php-fpm restart',
'save_method' => 'storeSettingField'
),
'system_phpfpm_pm' => array(
'label' => $lng['serversettings']['phpfpm_settings']['pm'],
'settinggroup' => 'phpfpm',
'varname' => 'pm',
'type' => 'option',
'default' => 'static',
'option_mode' => 'one',
'option_options' => array('static' => 'static', 'dynamic' => 'dynamic', 'ondemand' => 'ondemand'),
'save_method' => 'storeSettingField'
),
'system_phpfpm_max_children' => array(
'label' => $lng['serversettings']['phpfpm_settings']['max_children'],
'settinggroup' => 'phpfpm',
'varname' => 'max_children',
'type' => 'int',
'default' => 1,
'save_method' => 'storeSettingField'
),
'system_phpfpm_start_servers' => array(
'label' => $lng['serversettings']['phpfpm_settings']['start_servers'],
'settinggroup' => 'phpfpm',
'varname' => 'start_servers',
'type' => 'int',
'default' => 20,
'save_method' => 'storeSettingField'
),
'system_phpfpm_min_spare_servers' => array(
'label' => $lng['serversettings']['phpfpm_settings']['min_spare_servers'],
'settinggroup' => 'phpfpm',
'varname' => 'min_spare_servers',
'type' => 'int',
'default' => 5,
'save_method' => 'storeSettingField'
),
'system_phpfpm_max_spare_servers' => array(
'label' => $lng['serversettings']['phpfpm_settings']['max_spare_servers'],
'settinggroup' => 'phpfpm',
'varname' => 'max_spare_servers',
'type' => 'int',
'default' => 35,
'save_method' => 'storeSettingField'
),
'system_phpfpm_max_requests' => array(
'label' => $lng['serversettings']['phpfpm_settings']['max_requests'],
'settinggroup' => 'phpfpm',
'varname' => 'max_requests',
'type' => 'int',
'default' => 0,
'save_method' => 'storeSettingField'
),
'system_phpfpm_idle_timeout' => array(
'label' => $lng['serversettings']['phpfpm_settings']['idle_timeout'],
'settinggroup' => 'phpfpm',
'varname' => 'idle_timeout',
'type' => 'int',
'default' => 30,
'save_method' => 'storeSettingField'
),
'system_phpfpm_use_mod_proxy' => array(
'label' => $lng['phpfpm']['use_mod_proxy'],
'settinggroup' => 'phpfpm', 'settinggroup' => 'phpfpm',
'varname' => 'use_mod_proxy', 'varname' => 'use_mod_proxy',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => true,
'visible' => Settings::Get('system.apache24'), 'visible' => Settings::Get('system.apache24'),
'save_method' => 'storeSettingField' '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
],
'phpfpm_ini_values' => [
'label' => lng('phpfpm.ini_values'),
'settinggroup' => 'phpfpm',
'varname' => 'ini_values',
'type' => 'textarea',
'default' => '',
'save_method' => 'storeSettingField',
'advanced_mode' => 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
],
'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
]
]
]
]
];

View File

@@ -4,62 +4,77 @@
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Froxlor team <team@froxlor.org> (2010-) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @package Settings * 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 array( return [
'groups' => array( 'groups' => [
'perl' => array( 'perl' => [
'title' => $lng['admin']['perl_settings'], 'title' => lng('admin.perl_settings'),
'fields' => array( 'icon' => 'fa-solid fa-code',
'perl_path' => array( 'fields' => [
'label' => $lng['serversettings']['perl_path'], 'system_perl_path' => [
'label' => lng('serversettings.perl_path'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'perl_path', 'varname' => 'perl_path',
'type' => 'string', 'type' => 'text',
'default' => '/usr/bin/perl', 'default' => '/usr/bin/perl',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'websrv_avail' => array('lighttpd') 'websrv_avail' => [
), 'lighttpd'
'system_perl_suexecworkaround' => array( ]
'label' => $lng['serversettings']['perl']['suexecworkaround'], ],
'perl_suexecworkaround' => [
'label' => lng('serversettings.perl.suexecworkaround'),
'settinggroup' => 'perl', 'settinggroup' => 'perl',
'varname' => 'suexecworkaround', 'varname' => 'suexecworkaround',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'websrv_avail' => array('apache2') 'websrv_avail' => [
), 'apache2'
'system_perl_suexeccgipath' => array( ]
'label' => $lng['serversettings']['perl']['suexeccgipath'], ],
'perl_suexecpath' => [
'label' => lng('serversettings.perl.suexeccgipath'),
'settinggroup' => 'perl', 'settinggroup' => 'perl',
'varname' => 'suexecpath', 'varname' => 'suexecpath',
'type' => 'string', 'type' => 'text',
'string_type' => 'dir', 'string_type' => 'dir',
'default' => '/var/www/cgi-bin/', 'default' => '/var/www/cgi-bin/',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'websrv_avail' => array('apache2') 'websrv_avail' => [
), 'apache2'
'perl_server' => array( ]
'label' => $lng['serversettings']['perl_server'], ],
'serversettings_perl_server' => [
'label' => lng('serversettings.perl_server'),
'settinggroup' => 'serversettings', 'settinggroup' => 'serversettings',
'varname' => 'perl_server', 'varname' => 'perl_server',
'type' => 'string', 'type' => 'text',
'default' => 'unix:/var/run/nginx/cgiwrap-dispatch.sock', 'default' => 'unix:/var/run/nginx/cgiwrap-dispatch.sock',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'websrv_avail' => array('nginx') 'websrv_avail' => [
), 'nginx'
), ]
), ]
), ]
); ]
]
?> ];

View File

@@ -2,83 +2,115 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Settings
* *
* 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 array( use Froxlor\Settings;
'groups' => array(
'statistics' => array( return [
'title' => $lng['admin']['statisticsettings'], 'groups' => [
'fields' => array( 'statistics' => [
'system_webalizer_quiet' => array( 'title' => lng('admin.statisticsettings'),
'label' => $lng['serversettings']['webalizer_quiet'], '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', 'settinggroup' => 'system',
'varname' => 'webalizer_quiet', 'varname' => 'webalizer_quiet',
'type' => 'option', 'type' => 'select',
'default' => 2, 'default' => 2,
'option_mode' => 'one', 'select_var' => [
'option_options' => array(0 => $lng['admin']['webalizer']['normal'], 1 => $lng['admin']['webalizer']['quiet'], 2 => $lng['admin']['webalizer']['veryquiet']), 0 => lng('admin.webalizer.normal'),
1 => lng('admin.webalizer.quiet'),
2 => lng('admin.webalizer.veryquiet')
],
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'visible' => Settings::Get('system.traffictool') == 'webalizer'
'system_awstats_enabled' => array( ],
'label' => $lng['serversettings']['awstats_enabled'], 'system_awstats_path' => [
'settinggroup' => 'system', 'label' => lng('serversettings.awstats_path'),
'varname' => 'awstats_enabled',
'type' => 'bool',
'default' => false,
'save_method' => 'storeSettingField',
),
'system_awstats_path' => array(
'label' => $lng['serversettings']['awstats_path'],
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'awstats_path', 'varname' => 'awstats_path',
'type' => 'string', 'type' => 'text',
'string_type' => 'dir', 'string_type' => 'dir',
'default' => '/usr/bin/', 'default' => '/usr/share/awstats/tools/',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'visible' => Settings::Get('system.traffictool') == 'awstats'
'system_awstats_awstatspath' => array( ],
'label' => $lng['serversettings']['awstats_awstatspath'], 'system_awstats_awstatspath' => [
'label' => lng('serversettings.awstats_awstatspath'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'awstats_awstatspath', 'varname' => 'awstats_awstatspath',
'type' => 'string', 'type' => 'text',
'string_type' => 'dir', 'string_type' => 'dir',
'default' => '/usr/bin/', 'default' => '/usr/lib/cgi-bin/',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'visible' => Settings::Get('system.traffictool') == 'awstats'
'system_awstats_conf' => array( ],
'label' => $lng['serversettings']['awstats_conf'], 'system_awstats_conf' => [
'label' => lng('serversettings.awstats_conf'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'awstats_conf', 'varname' => 'awstats_conf',
'type' => 'string', 'type' => 'text',
'string_type' => 'dir', 'string_type' => 'dir',
'default' => '/etc/awstats/', 'default' => '/etc/awstats/',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'visible' => Settings::Get('system.traffictool') == 'awstats',
'system_awstats_icons' => array( 'requires_reconf' => ['system:awstats']
'label' => $lng['serversettings']['awstats_icons'], ],
'system_awstats_icons' => [
'label' => lng('serversettings.awstats_icons'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'awstats_icons', 'varname' => 'awstats_icons',
'type' => 'string', 'type' => 'text',
'string_type' => 'dir', 'string_type' => 'dir',
'default' => '/usr/share/awstats/icon/', 'default' => '/usr/share/awstats/icon/',
'save_method' => 'storeSettingField', '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
]
]
]
]
];

View File

@@ -2,148 +2,168 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Settings
* *
* 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 array( return [
'groups' => array( 'groups' => [
'mail' => array( 'mail' => [
'title' => $lng['admin']['mailserversettings'], 'title' => lng('admin.mailserversettings'),
'fields' => array( 'icon' => 'fa-solid fa-envelope',
'system_vmail_uid' => array( 'fields' => [
'label' => $lng['serversettings']['vmail_uid'], 'system_vmail_uid' => [
'label' => lng('serversettings.vmail_uid'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'vmail_uid', 'varname' => 'vmail_uid',
'type' => 'int', 'type' => 'number',
'default' => 2000, 'default' => 2000,
'int_min' => 1, 'min' => 2,
'int_max' => 65535, 'max' => 65535,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'advanced_mode' => true,
'system_vmail_gid' => array( 'requires_reconf' => ['smtp']
'label' => $lng['serversettings']['vmail_gid'], ],
'system_vmail_gid' => [
'label' => lng('serversettings.vmail_gid'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'vmail_gid', 'varname' => 'vmail_gid',
'type' => 'int', 'type' => 'number',
'default' => 2000, 'default' => 2000,
'int_min' => 1, 'min' => 2,
'int_max' => 65535, 'max' => 65535,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'advanced_mode' => true,
'system_vmail_homedir' => array( 'requires_reconf' => ['smtp']
'label' => $lng['serversettings']['vmail_homedir'], ],
'system_vmail_homedir' => [
'label' => lng('serversettings.vmail_homedir'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'vmail_homedir', 'varname' => 'vmail_homedir',
'type' => 'string', 'type' => 'text',
'string_type' => 'dir', 'string_type' => 'dir',
'default' => '/var/customers/mail/', 'default' => '/var/customers/mail/',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'requires_reconf' => ['smtp']
'system_vmail_maildirname' => array( ],
'label' => $lng['serversettings']['vmail_maildirname'], 'system_vmail_maildirname' => [
'label' => lng('serversettings.vmail_maildirname'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'vmail_maildirname', 'varname' => 'vmail_maildirname',
'type' => 'string', 'type' => 'text',
'string_type' => 'dir', 'string_type' => 'dir',
'default' => 'Maildir', 'default' => 'Maildir',
'string_emptyallowed' => true, 'string_emptyallowed' => true,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'panel_sendalternativemail' => array( ],
'label' => $lng['serversettings']['sendalternativemail'], 'panel_sendalternativemail' => [
'label' => lng('serversettings.sendalternativemail'),
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'sendalternativemail', 'varname' => 'sendalternativemail',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'system_mail_quota_enabled' => array( 'system_mail_quota_enabled' => [
'label' => $lng['serversettings']['mail_quota_enabled'], 'label' => lng('serversettings.mail_quota_enabled'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mail_quota_enabled', 'varname' => 'mail_quota_enabled',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'system_mail_quota' => array( 'system_mail_quota' => [
'label' => $lng['serversettings']['mail_quota'], 'label' => lng('serversettings.mail_quota'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mail_quota', 'varname' => 'mail_quota',
'type' => 'int', 'type' => 'number',
'default' => 100, 'default' => 100,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'system_catchall_enabled' => array( 'catchall_catchall_enabled' => [
'label' => $lng['serversettings']['catchall_enabled'], 'label' => lng('serversettings.catchall_enabled'),
'settinggroup' => 'catchall', 'settinggroup' => 'catchall',
'varname' => 'catchall_enabled', 'varname' => 'catchall_enabled',
'type' => 'bool', 'type' => 'checkbox',
'default' => true, 'default' => true,
'save_method' => 'storeSettingResetCatchall', 'save_method' => 'storeSettingResetCatchall'
), ],
'system_mailtraffic_enabled' => array( 'system_mailtraffic_enabled' => [
'label' => $lng['serversettings']['mailtraffic_enabled'], 'label' => lng('serversettings.mailtraffic_enabled'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mailtraffic_enabled', 'varname' => 'mailtraffic_enabled',
'type' => 'bool', 'type' => 'checkbox',
'default' => true, 'default' => true,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'system_mdaserver' => array( ],
'label' => $lng['serversettings']['mdaserver'], 'system_mdaserver' => [
'label' => lng('serversettings.mdaserver'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mdaserver', 'varname' => 'mdaserver',
'type' => 'option', 'type' => 'select',
'option_mode' => 'one',
'default' => 'dovecot', 'default' => 'dovecot',
'option_options' => array('courier' => 'Courier', 'dovecot' => 'Dovecot'), 'select_var' => [
'courier' => 'Courier',
'dovecot' => 'Dovecot'
],
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'system_mdalog' => array( ],
'label' => $lng['serversettings']['mdalog'], 'system_mdalog' => [
'label' => lng('serversettings.mdalog'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mdalog', 'varname' => 'mdalog',
'type' => 'string', 'type' => 'text',
'string_type' => 'file', 'string_type' => 'file',
'default' => '/var/log/mail.log', 'default' => '/var/log/mail.log',
'string_emptyallowed' => true, 'string_emptyallowed' => true,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'system_mtaserver' => array( ],
'label' => $lng['serversettings']['mtaserver'], 'system_mtaserver' => [
'label' => lng('serversettings.mtaserver'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mtaserver', 'varname' => 'mtaserver',
'type' => 'option', 'type' => 'select',
'option_mode' => 'one',
'default' => 'postfix', 'default' => 'postfix',
'option_options' => array('exim4' => 'Exim4', 'postfix' => 'Postfix'), 'select_var' => [
'exim4' => 'Exim4',
'postfix' => 'Postfix'
],
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'system_mtalog' => array( ],
'label' => $lng['serversettings']['mtalog'], 'system_mtalog' => [
'label' => lng('serversettings.mtalog'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mtalog', 'varname' => 'mtalog',
'type' => 'string', 'type' => 'text',
'string_type' => 'file', 'string_type' => 'file',
'default' => '/var/log/mail.log', 'default' => '/var/log/mail.log',
'string_emptyallowed' => true, 'string_emptyallowed' => true,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
), ]
), ]
), ]
); ]
];
?>

View File

@@ -2,39 +2,46 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Settings
* *
* 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 array( return [
'groups' => array( 'groups' => [
'ftpserver' => array( 'ftpserver' => [
'title' => $lng['admin']['ftpserversettings'], 'title' => lng('admin.ftpserversettings'),
'fields' => array( 'icon' => 'fa-solid fa-arrow-right-arrow-left',
'ftpserver' => array( 'fields' => [
'label' => $lng['admin']['ftpserver'], 'system_ftpserver' => [
'label' => lng('admin.ftpserver'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'ftpserver', 'varname' => 'ftpserver',
'type' => 'option', 'type' => 'select',
'default' => 'proftpd', 'default' => 'proftpd',
'option_mode' => 'one', 'select_var' => [
'option_options' => array('proftpd' => 'Proftpd', 'pureftpd' => 'Pureftpd'), 'proftpd' => 'Proftpd',
'save_method' => 'storeSettingField', 'pureftpd' => 'Pureftpd'
), ],
), 'save_method' => 'storeSettingField'
), ]
) ]
); ]
]
?> ];

View File

@@ -2,120 +2,177 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Settings
* *
* 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 array( use Froxlor\Settings;
'groups' => array(
'nameserver' => array( return [
'title' => $lng['admin']['nameserversettings'], 'groups' => [
'fields' => array( 'nameserver' => [
'nameserver_enable' => array( 'title' => lng('admin.nameserversettings'),
'label' => $lng['serversettings']['bindenable'], 'icon' => 'fa-solid fa-globe',
'fields' => [
'system_bind_enable' => [
'label' => lng('serversettings.bindenable'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'bind_enable', 'varname' => 'bind_enable',
'type' => 'bool', 'type' => 'checkbox',
'default' => true, 'default' => true,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'overview_option' => true 'overview_option' => true,
), 'requires_reconf' => ['dns']
'system_dnsenabled' => array( ],
'label' => $lng['serversettings']['dnseditorenable'], 'system_dnsenabled' => [
'label' => lng('serversettings.dnseditorenable'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'dnsenabled', 'varname' => 'dnsenabled',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField'
), ],
'system_dns_server' => array( 'system_dns_server' => [
'label' => $lng['serversettings']['dns_server'], 'label' => lng('serversettings.dns_server'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'dns_server', 'varname' => 'dns_server',
'type' => 'option', 'type' => 'select',
'default' => 'bind', 'default' => 'Bind',
'option_mode' => 'one', 'select_var' => [
'option_options' => array('bind' => 'Bind9', 'pdns' => 'PowerDNS'), 'Bind' => 'Bind9',
'save_method' => 'storeSettingField' 'PowerDNS' => 'PowerDNS'
), ],
'system_bindconf_directory' => array( 'save_method' => 'storeSettingField',
'label' => $lng['serversettings']['bindconf_directory'], 'requires_reconf' => ['dns']
],
'system_bindconf_directory' => [
'label' => lng('serversettings.bindconf_directory'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'bindconf_directory', 'varname' => 'bindconf_directory',
'type' => 'string', 'type' => 'text',
'string_type' => 'dir', 'string_type' => 'dir',
'default' => '/etc/bind/', 'default' => '/etc/bind/',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'visible' => Settings::Get('system.dns_server') == 'Bind',
'system_bindreload_command' => array( 'requires_reconf' => ['dns:bind']
'label' => $lng['serversettings']['bindreload_command'], ],
'system_bindreload_command' => [
'label' => lng('serversettings.bindreload_command'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'bindreload_command', 'varname' => 'bindreload_command',
'type' => 'string', 'type' => 'text',
'string_regexp' => '/^[a-z0-9\/\._\- ]+$/i',
'default' => '/etc/init.d/bind9 reload', 'default' => '/etc/init.d/bind9 reload',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'system_nameservers' => array( 'system_nameservers' => [
'label' => $lng['serversettings']['nameservers'], 'label' => lng('serversettings.nameservers'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'nameservers', 'varname' => 'nameservers',
'type' => 'string', 'type' => 'text',
'string_regexp' => '/^(([a-z0-9\-\._]+, ?)*[a-z0-9\-\._]+)?$/i', 'string_regexp' => '/^(([a-z0-9\-\._]+, ?)*[a-z0-9\-\._]+)?$/i',
'string_emptyallowed' => true, 'string_emptyallowed' => true,
'default' => '', 'default' => '',
'save_method' => 'storeSettingFieldInsertBindTask', 'save_method' => 'storeSettingFieldInsertBindTask'
), ],
'system_mxservers' => array( 'system_mxservers' => [
'label' => $lng['serversettings']['mxservers'], 'label' => lng('serversettings.mxservers'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mxservers', 'varname' => 'mxservers',
'type' => 'string', 'type' => 'text',
'string_regexp' => '/^(([0-9]+ [a-z0-9\-\._]+, ?)*[0-9]+ [a-z0-9\-\._]+)?$/i', 'string_regexp' => '/^(([0-9]+ [a-z0-9\-\._]+, ?)*[0-9]+ [a-z0-9\-\._]+)?$/i',
'string_emptyallowed' => true, 'string_emptyallowed' => true,
'default' => '', 'default' => '',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'system_axfrservers' => array( 'system_axfrservers' => [
'label' => $lng['serversettings']['axfrservers'], 'label' => lng('serversettings.axfrservers'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'axfrservers', 'varname' => 'axfrservers',
'type' => 'string', 'type' => 'text',
'string_type' => 'validate_ip_incl_private', 'string_type' => 'validate_ip_incl_private',
'string_delimiter' => ',', 'string_delimiter' => ',',
'string_emptyallowed' => true, 'string_emptyallowed' => true,
'default' => '', 'default' => '',
'save_method' => 'storeSettingField'
],
'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', 'save_method' => 'storeSettingField',
), 'advanced_mode' => true,
'system_dns_createmailentry' => array( 'visible' => Settings::Get('system.dns_server') == 'PowerDNS',
'label' => $lng['serversettings']['mail_also_with_mxservers'], ],
'system_dns_createmailentry' => [
'label' => lng('serversettings.mail_also_with_mxservers'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'dns_createmailentry', 'varname' => 'dns_createmailentry',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField'
), ],
'system_defaultttl' => array( 'system_dns_createcaaentry' => [
'label' => $lng['serversettings']['defaultttl'], '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', 'settinggroup' => 'system',
'varname' => 'defaultttl', 'varname' => 'defaultttl',
'type' => 'int', 'type' => 'number',
'default' => 604800, /* 1 week */ 'default' => 604800, /* 1 week */
'int_min' => 3600, /* 1 hour */ 'min' => 3600, /* 1 hour */
'int_max' => 2147483647, /* integer max */ 'max' => 2147483647, /* integer max */
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
), 'system_soaemail' => [
), 'label' => lng('serversettings.soaemail'),
), 'settinggroup' => 'system',
); 'varname' => 'soaemail',
'type' => 'email',
'string_emptyallowed' => true,
'default' => '',
'save_method' => 'storeSettingField'
]
]
]
]
];

View File

@@ -2,82 +2,92 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Settings
* *
* 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 array( return [
'groups' => array( 'groups' => [
'logging' => array( 'logging' => [
'title' => $lng['admin']['loggersettings'], 'title' => lng('admin.loggersettings'),
'fields' => array( 'icon' => 'fa-solid fa-file-lines',
'logger_enabled' => array( 'fields' => [
'label' => $lng['serversettings']['logger']['enable'], 'logger_enabled' => [
'label' => lng('serversettings.logger.enable'),
'settinggroup' => 'logger', 'settinggroup' => 'logger',
'varname' => 'enabled', 'varname' => 'enabled',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'overview_option' => true 'overview_option' => true
), ],
'logger_severity' => array( 'logger_severity' => [
'label' => $lng['serversettings']['logger']['severity'], 'label' => lng('serversettings.logger.severity'),
'settinggroup' => 'logger', 'settinggroup' => 'logger',
'varname' => 'severity', 'varname' => 'severity',
'type' => 'option', 'type' => 'select',
'default' => 1, 'default' => 1,
'option_mode' => 'one', 'select_var' => [
'option_options' => array(1 => $lng['admin']['logger']['normal'], 2 => $lng['admin']['logger']['paranoid']), 1 => lng('admin.logger.normal'),
'save_method' => 'storeSettingField', 2 => lng('admin.logger.paranoid')
), ],
'logger_logtypes' => array( 'save_method' => 'storeSettingField'
'label' => $lng['serversettings']['logger']['types'], ],
'logger_logtypes' => [
'label' => lng('serversettings.logger.types'),
'settinggroup' => 'logger', 'settinggroup' => 'logger',
'varname' => 'logtypes', 'varname' => 'logtypes',
'type' => 'option', 'type' => 'select',
'default' => 'syslog,mysql', 'default' => 'syslog,mysql',
'option_mode' => 'multiple', 'select_mode' => 'multiple',
'option_options' => array('syslog' => 'syslog', 'file' => 'file', 'mysql' => 'mysql'), 'select_var' => [
'save_method' => 'storeSettingField', 'syslog' => 'syslog',
), 'file' => 'file',
'logger_logfile' => array( 'mysql' => 'mysql'
'label' => $lng['serversettings']['logger']['logfile'], ],
'save_method' => 'storeSettingField'
],
'logger_logfile' => [
'label' => lng('serversettings.logger.logfile'),
'settinggroup' => 'logger', 'settinggroup' => 'logger',
'varname' => 'logfile', 'varname' => 'logfile',
'type' => 'string', 'type' => 'text',
'string_type' => 'file', 'string_type' => 'file',
'string_emptyallowed' => true, 'string_emptyallowed' => true,
'default' => '', 'default' => '',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'logger_log_cron' => array( 'logger_log_cron' => [
'label' => $lng['serversettings']['logger']['logcron'], 'label' => lng('serversettings.logger.logcron'),
'settinggroup' => 'logger', 'settinggroup' => 'logger',
'varname' => 'log_cron', 'varname' => 'log_cron',
'type' => 'option', 'type' => 'select',
'default' => 0, 'default' => 0,
'option_mode' => 'one', 'select_var' => [
'option_options' => array( 0 => lng('serversettings.logger.logcronoption.never'),
0 => $lng['serversettings']['logger']['logcronoption']['never'], 1 => lng('serversettings.logger.logcronoption.once'),
1 => $lng['serversettings']['logger']['logcronoption']['once'], 2 => lng('serversettings.logger.logcronoption.always')
2 => $lng['serversettings']['logger']['logcronoption']['always'] ],
), 'save_method' => 'storeSettingField'
'save_method' => 'storeSettingField', ]
), ]
), ]
), ]
) ];
);
?>

View File

@@ -2,133 +2,144 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Settings
* *
* 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 array( use Froxlor\Settings;
'groups' => array(
'dkim' => array( return [
'title' => $lng['admin']['dkimsettings'], 'groups' => [
'fields' => array( 'dkim' => [
'dkim_enabled' => array( 'title' => lng('admin.dkimsettings'),
'label' => $lng['dkim']['use_dkim'], 'icon' => 'fa-solid fa-fingerprint',
'fields' => [
'dkim_use_dkim' => [
'label' => lng('dkim.use_dkim'),
'settinggroup' => 'dkim', 'settinggroup' => 'dkim',
'varname' => 'use_dkim', 'varname' => 'use_dkim',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingFieldInsertBindTask', 'save_method' => 'storeSettingFieldInsertBindTask',
'overview_option' => true 'overview_option' => true
), ],
'dkim_prefix' => array( 'dkim_dkim_prefix' => [
'label' => $lng['dkim']['dkim_prefix'], 'label' => lng('dkim.dkim_prefix'),
'settinggroup' => 'dkim', 'settinggroup' => 'dkim',
'varname' => 'dkim_prefix', 'varname' => 'dkim_prefix',
'type' => 'string', 'type' => 'text',
'string_type' => 'dir', 'string_type' => 'dir',
'default' => '/etc/postfix/dkim/', 'default' => '/etc/postfix/dkim/',
'save_method' => 'storeSettingField'
],
'dkim_privkeysuffix' => [
'label' => lng('dkim.privkeysuffix'),
'settinggroup' => 'dkim',
'varname' => 'privkeysuffix',
'type' => 'text',
'string_regexp' => '/^[a-z0-9\._]+$/i',
'default' => '.priv',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'dkim_domains' => array( ],
'label' => $lng['dkim']['dkim_domains'], 'dkim_dkim_domains' => [
'label' => lng('dkim.dkim_domains'),
'settinggroup' => 'dkim', 'settinggroup' => 'dkim',
'varname' => 'dkim_domains', 'varname' => 'dkim_domains',
'type' => 'string', 'type' => 'text',
'string_regexp' => '/^[a-z0-9\._]+$/i', 'string_regexp' => '/^[a-z0-9\._]+$/i',
'default' => 'domains', 'default' => 'domains',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'dkim_dkimkeys' => array( 'dkim_dkim_dkimkeys' => [
'label' => $lng['dkim']['dkim_dkimkeys'], 'label' => lng('dkim.dkim_dkimkeys'),
'settinggroup' => 'dkim', 'settinggroup' => 'dkim',
'varname' => 'dkim_dkimkeys', 'varname' => 'dkim_dkimkeys',
'type' => 'string', 'type' => 'text',
'string_regexp' => '/^[a-z0-9\._]+$/i', 'string_regexp' => '/^[a-z0-9\._]+$/i',
'default' => 'dkim-keys.conf', 'default' => 'dkim-keys.conf',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'dkim_algorithm' => array( 'dkim_dkim_algorithm' => [
'label' => $lng['dkim']['dkim_algorithm'], 'label' => lng('dkim.dkim_algorithm'),
'settinggroup' => 'dkim', 'settinggroup' => 'dkim',
'varname' => 'dkim_algorithm', 'varname' => 'dkim_algorithm',
'type' => 'option', 'type' => 'select',
'default' => 'all', 'default' => 'all',
'option_mode' => 'multiple', 'select_mode' => 'multiple',
'option_options' => array('all' => 'All', 'sha1' => 'SHA1', 'sha256' => 'SHA256'), 'select_var' => [
'all' => 'All',
'sha1' => 'SHA1',
'sha256' => 'SHA256'
],
'save_method' => 'storeSettingFieldInsertBindTask', 'save_method' => 'storeSettingFieldInsertBindTask',
), 'advanced_mode' => true
'dkim_servicetype' => array( ],
'label' => $lng['dkim']['dkim_servicetype'], 'dkim_dkim_servicetype' => [
'label' => lng('dkim.dkim_servicetype'),
'settinggroup' => 'dkim', 'settinggroup' => 'dkim',
'varname' => 'dkim_servicetype', 'varname' => 'dkim_servicetype',
'type' => 'option', 'type' => 'select',
'default' => '0', 'default' => '0',
'option_mode' => 'one', 'select_var' => [
'option_options' => array('0' => 'All', '1' => 'E-Mail'), '0' => 'All',
'1' => 'E-Mail'
],
'save_method' => 'storeSettingFieldInsertBindTask', 'save_method' => 'storeSettingFieldInsertBindTask',
), 'advanced_mode' => true
'dkim_keylength' => array( ],
'label' => array( 'dkim_dkim_keylength' => [
'title' => $lng['dkim']['dkim_keylength']['title'], 'label' => [
'description' => sprintf($lng['dkim']['dkim_keylength']['description'], Settings::Get('dkim.dkim_prefix')) 'title' => lng('dkim.dkim_keylength.title'),
), 'description' => lng('dkim.dkim_keylength.description', [Settings::Get('dkim.dkim_prefix')])
],
'settinggroup' => 'dkim', 'settinggroup' => 'dkim',
'varname' => 'dkim_keylength', 'varname' => 'dkim_keylength',
'type' => 'option', 'type' => 'select',
'default' => '1024', 'default' => '1024',
'option_mode' => 'one', 'select_var' => [
'option_options' => array('1024' => '1024 Bit', '2048' => '2048 Bit'), '1024' => '1024 Bit',
'save_method' => 'storeSettingFieldInsertBindTask', '2048' => '2048 Bit'
), ],
'dkim_notes' => array( 'save_method' => 'storeSettingFieldInsertBindTask'
'label' => $lng['dkim']['dkim_notes'], ],
'dkim_dkim_notes' => [
'label' => lng('dkim.dkim_notes'),
'settinggroup' => 'dkim', 'settinggroup' => 'dkim',
'varname' => 'dkim_notes', 'varname' => 'dkim_notes',
'type' => 'string', 'type' => 'text',
'string_regexp' => '/^[a-z0-9\._]+$/i', 'string_regexp' => '/^[a-z0-9\._]+$/i',
'default' => '', 'default' => '',
'save_method' => 'storeSettingFieldInsertBindTask', 'save_method' => 'storeSettingFieldInsertBindTask',
), 'advanced_mode' => true
'dkim_add_adsp' => array( ],
'label' => $lng['dkim']['dkim_add_adsp'], 'dkim_dkimrestart_command' => [
'settinggroup' => 'dkim', 'label' => lng('dkim.dkimrestart_command'),
'varname' => 'dkim_add_adsp',
'type' => 'bool',
'default' => true,
'save_method' => 'storeSettingFieldInsertBindTask',
),
'dkim_add_adsppolicy' => array(
'label' => $lng['dkim']['dkim_add_adsppolicy'],
'settinggroup' => 'dkim',
'varname' => 'dkim_add_adsppolicy',
'type' => 'option',
'default' => '1',
'option_mode' => 'one',
'option_options' => array('0' => 'Unknown', '1' => 'All', '2' => 'Discardable'),
'save_method' => 'storeSettingFieldInsertBindTask',
),
'dkimrestart_command' => array(
'label' => $lng['dkim']['dkimrestart_command'],
'settinggroup' => 'dkim', 'settinggroup' => 'dkim',
'varname' => 'dkimrestart_command', 'varname' => 'dkimrestart_command',
'type' => 'string', 'type' => 'text',
'string_regexp' => '/^[a-z0-9\/\._\- ]+$/i',
'default' => '/etc/init.d/dkim-filter restart', 'default' => '/etc/init.d/dkim-filter restart',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ]
), ]
), ]
), ]
); ];
?>

View File

@@ -4,42 +4,49 @@
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Froxlor team <team@froxlor.org> (2010-) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @package Settings * 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 array( return [
'groups' => array( 'groups' => [
'spf' => array( 'spf' => [
'title' => $lng['admin']['spfsettings'], 'title' => lng('admin.spfsettings'),
'fields' => array( 'icon' => 'fa-solid fa-clipboard-check',
'spf_enabled' => array( 'fields' => [
'label' => $lng['spf']['use_spf'], 'spf_use_spf' => [
'label' => lng('spf.use_spf'),
'settinggroup' => 'spf', 'settinggroup' => 'spf',
'varname' => 'use_spf', 'varname' => 'use_spf',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'overview_option' => true 'overview_option' => true
), ],
'spf_entry' => array( 'spf_spf_entry' => [
'label' => $lng['spf']['spf_entry'], 'label' => lng('spf.spf_entry'),
'settinggroup' => 'spf', 'settinggroup' => 'spf',
'varname' => 'spf_entry', 'varname' => 'spf_entry',
'type' => 'string', 'type' => 'text',
'default' => '"v=spf1 a mx -all"', 'default' => '"v=spf1 a mx -all"',
'save_method' => 'storeSettingField' 'save_method' => 'storeSettingField'
) ]
) ]
) ]
) ]
); ];
?>

View File

@@ -1,144 +0,0 @@
<?php
/**
* This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors).
*
* For the full copyright and license information, please view the COPYING
* file that was distributed with this source code. You can also view the
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt
*
* @copyright (c) the authors
* @author Florian Lippert <flo@syscp.org> (2003-2009)
* @author Froxlor team <team@froxlor.org> (2010-)
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt
* @package Settings
*
*/
return array(
'groups' => array(
'ticket' => array(
'title' => $lng['admin']['ticketsettings'],
'fields' => array(
'ticket_enabled' => array(
'label' => $lng['serversettings']['ticket']['enable'],
'settinggroup' => 'ticket',
'varname' => 'enabled',
'type' => 'bool',
'default' => false,
'cronmodule' => 'froxlor/ticket',
'save_method' => 'storeSettingField',
'overview_option' => true
),
'ticket_noreply_email' => array(
'label' => $lng['serversettings']['ticket']['noreply_email'],
'settinggroup' => 'ticket',
'varname' => 'noreply_email',
'type' => 'string',
'string_type' => 'mail',
'default' => '',
'save_method' => 'storeSettingField',
),
'ticket_noreply_name' => array(
'label' => $lng['serversettings']['ticket']['noreply_name'],
'settinggroup' => 'ticket',
'varname' => 'noreply_name',
'type' => 'string',
'default' => '',
'save_method' => 'storeSettingField',
),
'ticket_reset_cycle' => array(
'label' => $lng['serversettings']['ticket']['reset_cycle'],
'settinggroup' => 'ticket',
'varname' => 'reset_cycle',
'type' => 'option',
'default' => 1,
'option_mode' => 'one',
'option_options' => array(0 => html_entity_decode($lng['admin']['tickets']['daily']), 1 => html_entity_decode($lng['admin']['tickets']['weekly']), 2 => html_entity_decode($lng['admin']['tickets']['monthly']), 3 => html_entity_decode($lng['admin']['tickets']['yearly'])),
'save_method' => 'storeSettingField',
'plausibility_check_method' => 'setCycleOfCronjob',
),
'ticket_concurrently_open' => array(
'label' => $lng['serversettings']['ticket']['concurrentlyopen'],
'settinggroup' => 'ticket',
'varname' => 'concurrently_open',
'type' => 'int',
'default' => 5,
'save_method' => 'storeSettingField',
),
'ticket_archiving_days' => array(
'label' => $lng['serversettings']['ticket']['archiving_days'],
'settinggroup' => 'ticket',
'varname' => 'archiving_days',
'type' => 'int',
'int_min' => 1,
'int_max' => 99,
'default' => 5,
'save_method' => 'storeSettingField',
),
'ticket_worktime_all' => array(
'label' => $lng['serversettings']['ticket']['worktime_all'],
'settinggroup' => 'ticket',
'varname' => 'worktime_all',
'type' => 'bool',
'default' => false,
'save_method' => 'storeSettingField',
),
'ticket_worktime_begin' => array(
'label' => $lng['serversettings']['ticket']['worktime_begin'],
'settinggroup' => 'ticket',
'varname' => 'worktime_begin',
'type' => 'string',
'string_regexp' => '/^[012][0-9]:[0-6][0-9]$/',
'default' => '',
'save_method' => 'storeSettingField',
),
'ticket_worktime_end' => array(
'label' => $lng['serversettings']['ticket']['worktime_end'],
'settinggroup' => 'ticket',
'varname' => 'worktime_end',
'type' => 'string',
'string_regexp' => '/^[012][0-9]:[0-6][0-9]$/',
'default' => '',
'save_method' => 'storeSettingField',
),
'ticket_worktime_sat' => array(
'label' => $lng['serversettings']['ticket']['worktime_sat'],
'settinggroup' => 'ticket',
'varname' => 'worktime_sat',
'type' => 'bool',
'default' => false,
'save_method' => 'storeSettingField',
),
'ticket_worktime_sun' => array(
'label' => $lng['serversettings']['ticket']['worktime_sun'],
'settinggroup' => 'ticket',
'varname' => 'worktime_sun',
'type' => 'bool',
'default' => false,
'save_method' => 'storeSettingField',
),
'system_last_archive_run' => array(
'settinggroup' => 'system',
'varname' => 'last_archive_run',
'type' => 'hidden',
'default' => '',
),
'ticket_default_priority' => array(
'label' => $lng['serversettings']['ticket']['default_priority'],
'settinggroup' => 'ticket',
'varname' => 'default_priority',
'type' => 'option',
'default' => 2,
'option_mode' => 'one',
'option_options' => array(1 => $lng['ticket']['high'], 2 => $lng['ticket']['normal'], 3 => $lng['ticket']['low']),
'save_method' => 'storeSettingField',
),
),
),
)
);
?>

View File

@@ -2,86 +2,115 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Settings
* *
* 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 array( use Froxlor\Settings;
'groups' => array(
'security' => array( return [
'title' => $lng['admin']['security_settings'], 'groups' => [
'fields' => array( 'security' => [
'panel_unix_names' => array( 'title' => lng('admin.security_settings'),
'label' => $lng['serversettings']['unix_names'], 'icon' => 'fa-solid fa-user-lock',
'fields' => [
'panel_unix_names' => [
'label' => lng('serversettings.unix_names'),
'settinggroup' => 'panel', 'settinggroup' => 'panel',
'varname' => 'unix_names', 'varname' => 'unix_names',
'type' => 'bool', 'type' => 'checkbox',
'default' => true, 'default' => true,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'system_mailpwcleartext' => array( 'system_mailpwcleartext' => [
'label' => $lng['serversettings']['mailpwcleartext'], 'label' => lng('serversettings.mailpwcleartext'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'mailpwcleartext', 'varname' => 'mailpwcleartext',
'type' => 'bool', 'type' => 'checkbox',
'default' => true, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'system_passwordcryptfunc' => array( ],
'label' => $lng['serversettings']['passwordcryptfunc'], 'system_passwordcryptfunc' => [
'label' => lng('serversettings.passwordcryptfunc'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'passwordcryptfunc', 'varname' => 'passwordcryptfunc',
'type' => 'option', 'type' => 'select',
'default' => 0, 'default' => PASSWORD_DEFAULT,
'option_mode' => 'one', 'option_options_method' => [
'option_options_method' => 'getAvailablePasswordHashes', '\\Froxlor\\System\\Crypt',
'getAvailablePasswordHashes'
],
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'system_allow_error_report_admin' => array( ],
'label' => $lng['serversettings']['allow_error_report_admin'], 'system_allow_error_report_admin' => [
'label' => lng('serversettings.allow_error_report_admin'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'allow_error_report_admin', 'varname' => 'allow_error_report_admin',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'system_allow_error_report_customer' => array( 'system_allow_error_report_customer' => [
'label' => $lng['serversettings']['allow_error_report_customer'], 'label' => lng('serversettings.allow_error_report_customer'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'allow_error_report_customer', 'varname' => 'allow_error_report_customer',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'system_allow_customer_shell' => array( 'system_allow_customer_shell' => [
'label' => $lng['serversettings']['allow_allow_customer_shell'], 'label' => lng('serversettings.allow_allow_customer_shell'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'allow_customer_shell', 'varname' => 'allow_customer_shell',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
), 'advanced_mode' => true
'system_available_shells' => array( ],
'label' => $lng['serversettings']['available_shells'], 'system_available_shells' => [
'label' => lng('serversettings.available_shells'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'available_shells', 'varname' => 'available_shells',
'type' => 'string', 'type' => 'text',
'string_emptyallowed' => true, 'string_emptyallowed' => true,
'default' => '', 'default' => '',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
) 'advanced_mode' => 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
],
]
]
]
];

View File

@@ -1,60 +1,69 @@
<?php <?php
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2011- the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Froxlor team <team@froxlor.org> (2011-) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @package Settings * 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 array( return [
'groups' => array( 'groups' => [
'diskquota' => array( 'diskquota' => [
'title' => $lng['diskquota'], 'title' => lng('diskquota'),
'fields' => array( 'icon' => 'fa-solid fa-sliders',
'diskquota_enabled' => array( 'advanced_mode' => true,
'label' => $lng['serversettings']['diskquota_enabled'], 'fields' => [
'system_diskquota_enabled' => [
'label' => lng('serversettings.diskquota_enabled'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'diskquota_enabled', 'varname' => 'diskquota_enabled',
'type' => 'bool', 'type' => 'checkbox',
'default' => false, 'default' => false,
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField',
'overview_option' => true 'overview_option' => true
), ],
'diskquota_repquota_path' => array( 'system_diskquota_repquota_path' => [
'label' => $lng['serversettings']['diskquota_repquota_path']['description'], 'label' => lng('serversettings.diskquota_repquota_path.description'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'diskquota_repquota_path', 'varname' => 'diskquota_repquota_path',
'type' => 'string', 'type' => 'text',
'default' => '/usr/sbin/repquota', 'default' => '/usr/sbin/repquota',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'diskquota_quotatool_path' => array( 'system_diskquota_quotatool_path' => [
'label' => $lng['serversettings']['diskquota_quotatool_path']['description'], 'label' => lng('serversettings.diskquota_quotatool_path.description'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'diskquota_quotatool_path', 'varname' => 'diskquota_quotatool_path',
'type' => 'string', 'type' => 'text',
'default' => '/usr/bin/quotatool', 'default' => '/usr/bin/quotatool',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ],
'diskquota_customer_partition' => array( 'system_diskquota_customer_partition' => [
'label' => $lng['serversettings']['diskquota_customer_partition']['description'], 'label' => lng('serversettings.diskquota_customer_partition.description'),
'settinggroup' => 'system', 'settinggroup' => 'system',
'varname' => 'diskquota_customer_partition', 'varname' => 'diskquota_customer_partition',
'type' => 'string', 'type' => 'text',
'default' => '/dev/root', 'default' => '/dev/root',
'save_method' => 'storeSettingField', 'save_method' => 'storeSettingField'
), ]
), ]
), ]
), ]
); ];
?>

View File

0
actions/index.html Normal file
View File

View File

@@ -2,866 +2,195 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Panel
* *
* 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
*/ */
define('AREA', 'admin'); const AREA = 'admin';
require './lib/init.php'; require __DIR__ . '/lib/init.php';
if (isset($_POST['id'])) { use Froxlor\Api\Commands\Admins;
$id = intval($_POST['id']); use Froxlor\CurrentUser;
} elseif(isset($_GET['id'])) { use Froxlor\Database\Database;
$id = intval($_GET['id']); 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;
if ($page == 'admins' $id = (int)Request::any('id');
&& $userinfo['change_serversettings'] == '1'
) {
if (($page == 'admins' || $page == 'overview') && $userinfo['change_serversettings'] == '1') {
if ($action == '') { if ($action == '') {
$log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, "viewed admin_admins");
$log->logAction(ADM_ACTION, LOG_NOTICE, "viewed admin_admins"); try {
$fields = array( $admin_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/admin/tablelisting.admins.php';
'loginname' => $lng['login']['username'], $collection = (new Collection(Admins::class, $userinfo))
'name' => $lng['customer']['name'], ->withPagination($admin_list_data['admin_list']['columns'], $admin_list_data['admin_list']['default_sorting']);
'diskspace' => $lng['customer']['diskspace'], } catch (Exception $e) {
'diskspace_used' => $lng['customer']['diskspace'] . ' (' . $lng['panel']['used'] . ')', Response::dynamicError($e->getMessage());
'traffic' => $lng['customer']['traffic'],
'traffic_used' => $lng['customer']['traffic'] . ' (' . $lng['panel']['used'] . ')',
'deactivated' => $lng['admin']['deactivated']
);
$paging = new paging($userinfo, TABLE_PANEL_ADMINS, $fields);
$admins = '';
$result_stmt = Database::query("SELECT * FROM `" . TABLE_PANEL_ADMINS . "` " . $paging->getSqlWhere(false) . " " . $paging->getSqlOrderBy() . " " . $paging->getSqlLimit());
$numrows_admins = Database::num_rows();
$paging->setEntries($numrows_admins);
$sortcode = $paging->getHtmlSortCode($lng, true);
$arrowcode = $paging->getHtmlArrowCode($filename . '?page=' . $page . '&s=' . $s);
$searchcode = $paging->getHtmlSearchCode($lng);
$pagingcode = $paging->getHtmlPagingCode($filename . '?page=' . $page . '&s=' . $s);
$i = 0;
$count = 0;
$dec_places = Settings::Get('panel.decimal_places');
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
if ($paging->checkDisplay($i)) {
$row['traffic_used'] = round($row['traffic_used'] / (1024 * 1024), $dec_places);
$row['traffic'] = round($row['traffic'] / (1024 * 1024), $dec_places);
$row['diskspace_used'] = round($row['diskspace_used'] / 1024, $dec_places);
$row['diskspace'] = round($row['diskspace'] / 1024, $dec_places);
// percent-values for progressbar
// For Disk usage
if ($row['diskspace'] > 0) {
$disk_percent = round(($row['diskspace_used']*100)/$row['diskspace'], 0);
$disk_doublepercent = round($disk_percent*2, 2);
} else {
$disk_percent = 0;
$disk_doublepercent = 0;
}
// For Traffic usage
if ($row['traffic'] > 0) {
$traffic_percent = round(($row['traffic_used']*100)/$row['traffic'], 0);
$traffic_doublepercent = round($traffic_percent*2, 2);
} else {
$traffic_percent = 0;
$traffic_doublepercent = 0;
} }
// fix progress-bars if value is >100% UI::view('user/table.html.twig', [
if ($disk_percent > 100) { 'listing' => Listing::format($collection, $admin_list_data, 'admin_list'),
$disk_percent = 100; 'actions_links' => [
} [
if ($traffic_percent > 100) { 'href' => $linker->getLink(['section' => 'admins', 'page' => $page, 'action' => 'add']),
$traffic_percent = 100; 'label' => lng('admin.admin_add')
} ]
]
$row = str_replace_array('-1', 'UL', $row, 'customers domains diskspace traffic mysqls emails email_accounts email_forwarders email_quota ftps subdomains tickets'); ]);
$row = htmlentities_array($row);
$row['custom_notes'] = ($row['custom_notes'] != '') ? nl2br($row['custom_notes']) : '';
eval("\$admins.=\"" . getTemplate("admins/admins_admin") . "\";");
$count++;
}
$i++;
}
$admincount = $numrows_admins;
eval("echo \"" . getTemplate("admins/admins") . "\";");
} elseif ($action == 'su') { } elseif ($action == 'su') {
try {
$result_stmt = Database::prepare(" $json_result = Admins::getLocal($userinfo, [
SELECT * FROM `" . TABLE_PANEL_ADMINS . "` WHERE `adminid` = :adminid 'id' => $id
"); ])->get();
$result = Database::pexecute_first($result_stmt, array('adminid' => $id)); } catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
$result = json_decode($json_result, true)['data'];
$destination_admin = $result['loginname']; $destination_admin = $result['loginname'];
if ($destination_admin != '' if ($destination_admin != '' && $result['adminid'] != $userinfo['userid']) {
&& $result['adminid'] != $userinfo['userid'] $result['switched_user'] = CurrentUser::getData();
) { $result['adminsession'] = 1;
$result_stmt = Database::prepare(" $result['userid'] = $result['adminid'];
SELECT * FROM `" . TABLE_PANEL_SESSIONS . "` WHERE `userid` = :userid CurrentUser::setData($result);
");
$result = Database::pexecute_first($result_stmt, array('userid' => $userinfo['userid']));
$s = md5(uniqid(microtime(), 1)); $log->logAction(
$ins_stmt = Database::prepare(" FroxlorLogger::ADM_ACTION,
INSERT INTO `" . TABLE_PANEL_SESSIONS . "` SET LOG_INFO,
`hash` = :hash, `userid` = :userid, `ipaddress` = :ip, "switched adminuser and is now '" . $destination_admin . "'"
`useragent` = :ua, `lastactivity` = :la,
`language` = :lang, `adminsession` = '1'
");
$ins_data = array(
'hash' => $s,
'userid' => $id,
'ip' => $result['ipaddress'],
'ua' => $result['useragent'],
'la' => time(),
'lang' => $result['language']
); );
Database::pexecute($ins_stmt, $ins_data); Response::redirectTo('admin_index.php');
$log->logAction(ADM_ACTION, LOG_INFO, "switched adminuser and is now '" . $destination_admin . "'");
redirectTo('admin_index.php', array('s' => $s));
} else { } else {
redirectTo('index.php', array('action' => 'login')); Response::redirectTo('index.php', [
'action' => 'login'
]);
} }
} elseif ($action == 'delete' && $id != 0) {
} elseif ($action == 'delete' try {
&& $id != 0 $json_result = Admins::getLocal($userinfo, [
) { 'id' => $id
$result_stmt = Database::prepare(" ])->get();
SELECT * FROM `" . TABLE_PANEL_ADMINS . "` WHERE `adminid` = :adminid } catch (Exception $e) {
"); Response::dynamicError($e->getMessage());
$result = Database::pexecute_first($result_stmt, array('adminid' => $id)); }
$result = json_decode($json_result, true)['data'];
if ($result['loginname'] != '') { if ($result['loginname'] != '') {
if ($result['adminid'] == $userinfo['userid']) { if ($result['adminid'] == $userinfo['userid']) {
standard_error('youcantdeleteyourself'); Response::standardError('youcantdeleteyourself');
} }
if (isset($_POST['send']) if (isset($_POST['send']) && $_POST['send'] == 'send') {
&& $_POST['send'] == 'send' Admins::getLocal($userinfo, [
) { 'id' => $id
$del_stmt = Database::prepare(" ])->delete();
DELETE FROM `" . TABLE_PANEL_ADMINS . "` WHERE `adminid` = :adminid Response::redirectTo($filename, [
"); 'page' => $page
Database::pexecute($del_stmt, array('adminid' => $id)); ]);
$del_stmt = Database::prepare("
DELETE FROM `" . TABLE_PANEL_TRAFFIC_ADMINS . "` WHERE `adminid` = :adminid
");
Database::pexecute($del_stmt, array('adminid' => $id));
$upd_stmt = Database::prepare("
UPDATE `" . TABLE_PANEL_CUSTOMERS . "` SET
`adminid` = :userid WHERE `adminid` = :adminid
");
Database::pexecute($upd_stmt, array('userid' => $userinfo['userid'], 'adminid' => $id));
$upd_stmt = Database::prepare("
UPDATE `" . TABLE_PANEL_DOMAINS . "` SET
`adminid` = :userid WHERE `adminid` = :adminid
");
Database::pexecute($upd_stmt, array('userid' => $userinfo['userid'], 'adminid' => $id));
$log->logAction(ADM_ACTION, LOG_INFO, "deleted admin '" . $result['loginname'] . "'");
updateCounters();
redirectTo($filename, array('page' => $page, 's' => $s));
} else { } else {
ask_yesno('admin_admin_reallydelete', $filename, array('id' => $id, 'page' => $page, 'action' => $action), $result['loginname']); HTML::askYesNo('admin_admin_reallydelete', $filename, [
'id' => $id,
'page' => $page,
'action' => $action
], $result['loginname']);
} }
} }
} elseif ($action == 'add') { } elseif ($action == 'add') {
if (isset($_POST['send']) && $_POST['send'] == 'send') {
if (isset($_POST['send']) try {
&& $_POST['send'] == 'send' Admins::getLocal($userinfo, $_POST)->add();
) { } catch (Exception $e) {
Response::dynamicError($e->getMessage());
$name = validate($_POST['name'], 'name');
$email = $idna_convert->encode(validate($_POST['email'], 'email'));
$custom_notes = validate(str_replace("\r\n", "\n", $_POST['custom_notes']), 'custom_notes', '/^[^\0]*$/');
$custom_notes_show = 0;
if (isset($_POST['custom_notes_show'])) {
$custom_notes_show = intval_ressource($_POST['custom_notes_show']);
}
$loginname = validate($_POST['loginname'], 'loginname');
$password = validate($_POST['admin_password'], 'password');
$password = validatePassword($password);
$def_language = validate($_POST['def_language'], 'default language');
$customers = intval_ressource($_POST['customers']);
if (isset($_POST['customers_ul'])) {
$customers = -1;
}
$domains = intval_ressource($_POST['domains']);
if (isset($_POST['domains_ul'])) {
$domains = -1;
}
$subdomains = intval_ressource($_POST['subdomains']);
if (isset($_POST['subdomains_ul'])) {
$subdomains = -1;
}
$emails = intval_ressource($_POST['emails']);
if (isset($_POST['emails_ul'])) {
$emails = -1;
}
$email_accounts = intval_ressource($_POST['email_accounts']);
if (isset($_POST['email_accounts_ul'])) {
$email_accounts = -1;
}
$email_forwarders = intval_ressource($_POST['email_forwarders']);
if (isset($_POST['email_forwarders_ul'])) {
$email_forwarders = -1;
}
if (Settings::Get('system.mail_quota_enabled') == '1') {
$email_quota = validate($_POST['email_quota'], 'email_quota', '/^\d+$/', 'vmailquotawrong', array('0', ''));
if (isset($_POST['email_quota_ul'])) {
$email_quota = -1;
} }
Response::redirectTo($filename, [
'page' => $page
]);
} else { } else {
$email_quota = -1; $ipaddress = [];
} $ipaddress[-1] = lng('admin.allips');
$ftps = intval_ressource($_POST['ftps']);
if (isset($_POST['ftps_ul'])) {
$ftps = -1;
}
if (Settings::Get('ticket.enabled') == 1) {
$tickets = intval_ressource($_POST['tickets']);
if (isset($_POST['tickets_ul'])) {
$tickets = -1;
}
} else {
$tickets = 0;
}
$mysqls = intval_ressource($_POST['mysqls']);
if (isset($_POST['mysqls_ul'])) {
$mysqls = -1;
}
$customers_see_all = 0;
if (isset($_POST['customers_see_all'])) {
$customers_see_all = intval($_POST['customers_see_all']);
}
$domains_see_all = 0;
if (isset($_POST['domains_see_all'])) {
$domains_see_all = intval($_POST['domains_see_all']);
}
$caneditphpsettings = 0;
if (isset($_POST['caneditphpsettings'])) {
$caneditphpsettings = intval($_POST['caneditphpsettings']);
}
$change_serversettings = 0;
if (isset($_POST['change_serversettings'])) {
$change_serversettings = intval($_POST['change_serversettings']);
}
$diskspace = intval_ressource($_POST['diskspace']);
if (isset($_POST['diskspace_ul'])) {
$diskspace = -1;
}
$traffic = doubleval_ressource($_POST['traffic']);
if (isset($_POST['traffic_ul'])) {
$traffic = -1;
}
$tickets_see_all = 0;
if (isset($_POST['tickets_see_all'])) {
$tickets_see_all = intval($_POST['tickets_see_all']);
}
$diskspace = $diskspace * 1024;
$traffic = $traffic * 1024 * 1024;
$ipaddress = intval_ressource($_POST['ipaddress']);
// Check if the account already exists
$loginname_check_stmt = Database::prepare("
SELECT `loginname` FROM `" . TABLE_PANEL_CUSTOMERS . "` WHERE `loginname` = :login
");
$loginname_check = Database::pexecute_first($loginname_check_stmt, array('login' => $loginname));
$loginname_check_admin_stmt = Database::prepare("
SELECT `loginname` FROM `" . TABLE_PANEL_ADMINS . "` WHERE `loginname` = :login
");
$loginname_check_admin = Database::pexecute_first($loginname_check_admin_stmt, array('login' => $loginname));
if ($loginname == '') {
standard_error(array('stringisempty', 'myloginname'));
}
elseif (strtolower($loginname_check['loginname']) == strtolower($loginname)
|| strtolower($loginname_check_admin['loginname']) == strtolower($loginname)
) {
standard_error('loginnameexists', $loginname);
}
// Accounts which match systemaccounts are not allowed, filtering them
elseif (preg_match('/^' . preg_quote(Settings::Get('customer.accountprefix'), '/') . '([0-9]+)/', $loginname)) {
standard_error('loginnameissystemaccount', Settings::Get('customer.accountprefix'));
}
elseif (!validateUsername($loginname)) {
standard_error('loginnameiswrong', $loginname);
}
elseif ($name == '') {
standard_error(array('stringisempty', 'myname'));
}
elseif ($email == '') {
standard_error(array('stringisempty', 'emailadd'));
}
elseif ($password == '') {
standard_error(array('stringisempty', 'mypassword'));
}
elseif (!validateEmail($email)) {
standard_error('emailiswrong', $email);
} else {
if ($customers_see_all != '1') {
$customers_see_all = '0';
}
if ($domains_see_all != '1') {
$domains_see_all = '0';
}
if ($caneditphpsettings != '1') {
$caneditphpsettings = '0';
}
if ($change_serversettings != '1') {
$change_serversettings = '0';
}
if ($tickets_see_all != '1') {
$tickets_see_all = '0';
}
$_theme = Settings::Get('panel.default_theme');
$ins_data = array(
'loginname' => $loginname,
'password' => makeCryptPassword($password),
'name' => $name,
'email' => $email,
'lang' => $def_language,
'change_serversettings' => $change_serversettings,
'customers' => $customers,
'customers_see_all' => $customers_see_all,
'domains' => $domains,
'domains_see_all' => $domains_see_all,
'caneditphpsettings' => $caneditphpsettings,
'diskspace' => $diskspace,
'traffic' => $traffic,
'subdomains' => $subdomains,
'emails' => $emails,
'accounts' => $email_accounts,
'forwarders' => $email_forwarders,
'quota' => $email_quota,
'ftps' => $ftps,
'tickets' => $tickets,
'tickets_see_all' => $tickets_see_all,
'mysqls' => $mysqls,
'ip' => $ipaddress,
'theme' => $_theme,
'custom_notes' => $custom_notes,
'custom_notes_show' => $custom_notes_show
);
$ins_stmt = Database::prepare("
INSERT INTO `" . TABLE_PANEL_ADMINS . "` SET
`loginname` = :loginname,
`password` = :password,
`name` = :name,
`email` = :email,
`def_language` = :lang,
`change_serversettings` = :change_serversettings,
`customers` = :customers,
`customers_see_all` = :customers_see_all,
`domains` = :domains,
`domains_see_all` = :domains_see_all,
`caneditphpsettings` = :caneditphpsettings,
`diskspace` = :diskspace,
`traffic` = :traffic,
`subdomains` = :subdomains,
`emails` = :emails,
`email_accounts` = :accounts,
`email_forwarders` = :forwarders,
`email_quota` = :quota,
`ftps` = :ftps,
`tickets` = :tickets,
`tickets_see_all` = :tickets_see_all,
`mysqls` = :mysqls,
`ip` = :ip,
`theme` = :theme,
`custom_notes` = :custom_notes,
`custom_notes_show` = :custom_notes_show
");
Database::pexecute($ins_stmt, $ins_data);
$adminid = Database::lastInsertId();
$log->logAction(ADM_ACTION, LOG_INFO, "added admin '" . $loginname . "'");
redirectTo($filename, array('page' => $page, 's' => $s));
}
} else {
$language_options = '';
while (list($language_file, $language_name) = each($languages)) {
$language_options.= makeoption($language_name, $language_file, $userinfo['language'], true);
}
$ipaddress = makeoption($lng['admin']['allips'], "-1");
$ipsandports_stmt = Database::query(" $ipsandports_stmt = Database::query("
SELECT `id`, `ip` FROM `" . TABLE_PANEL_IPSANDPORTS . "` GROUP BY `ip` ORDER BY `ip` ASC SELECT `id`, `ip` FROM `" . TABLE_PANEL_IPSANDPORTS . "` GROUP BY `ip` ORDER BY `ip` ASC
"); ");
while ($row = $ipsandports_stmt->fetch(PDO::FETCH_ASSOC)) { while ($row = $ipsandports_stmt->fetch(PDO::FETCH_ASSOC)) {
$ipaddress.= makeoption($row['ip'], $row['id']); $ipaddress[$row['id']] = $row['ip'];
} }
$customers_ul = makecheckbox('customers_ul', $lng['customer']['unlimited'], '-1', false, '0', true, true);
$diskspace_ul = makecheckbox('diskspace_ul', $lng['customer']['unlimited'], '-1', false, '0', true, true);
$traffic_ul = makecheckbox('traffic_ul', $lng['customer']['unlimited'], '-1', false, '0', true, true);
$domains_ul = makecheckbox('domains_ul', $lng['customer']['unlimited'], '-1', false, '0', true, true);
$subdomains_ul = makecheckbox('subdomains_ul', $lng['customer']['unlimited'], '-1', false, '0', true, true);
$emails_ul = makecheckbox('emails_ul', $lng['customer']['unlimited'], '-1', false, '0', true, true);
$email_accounts_ul = makecheckbox('email_accounts_ul', $lng['customer']['unlimited'], '-1', false, '0', true, true);
$email_forwarders_ul = makecheckbox('email_forwarders_ul', $lng['customer']['unlimited'], '-1', false, '0', true, true);
$email_quota_ul = makecheckbox('email_quota_ul', $lng['customer']['unlimited'], '-1', false, '0', true, true);
$ftps_ul = makecheckbox('ftps_ul', $lng['customer']['unlimited'], '-1', false, '0', true, true);
$tickets_ul = makecheckbox('tickets_ul', $lng['customer']['unlimited'], '-1', false, '0', true, true);
$mysqls_ul = makecheckbox('mysqls_ul', $lng['customer']['unlimited'], '-1', false, '0', true, true);
$admin_add_data = include_once dirname(__FILE__) . '/lib/formfields/admin/admin/formfield.admin_add.php'; $admin_add_data = include_once dirname(__FILE__) . '/lib/formfields/admin/admin/formfield.admin_add.php';
$admin_add_form = htmlform::genHTMLForm($admin_add_data);
$title = $admin_add_data['admin_add']['title']; UI::view('user/form.html.twig', [
$image = $admin_add_data['admin_add']['image']; 'formaction' => $linker->getLink(['section' => 'admins']),
'formdata' => $admin_add_data['admin_add']
eval("echo \"" . getTemplate("admins/admins_add") . "\";"); ]);
} }
} elseif ($action == 'edit' && $id != 0) {
} elseif($action == 'edit' try {
&& $id != 0 $json_result = Admins::getLocal($userinfo, [
) { 'id' => $id
])->get();
$result_stmt = Database::prepare(" } catch (Exception $e) {
SELECT * FROM `" . TABLE_PANEL_ADMINS . "` WHERE `adminid` = :adminid Response::dynamicError($e->getMessage());
"); }
$result = Database::pexecute_first($result_stmt, array('adminid' => $id)); $result = json_decode($json_result, true)['data'];
if ($result['loginname'] != '') { if ($result['loginname'] != '') {
if (isset($_POST['send']) && $_POST['send'] == 'send') {
if (isset($_POST['send']) try {
&& $_POST['send'] == 'send' Admins::getLocal($userinfo, $_POST)->update();
) { } catch (Exception $e) {
$name = validate($_POST['name'], 'name'); Response::dynamicError($e->getMessage());
$email = $idna_convert->encode(validate($_POST['email'], 'email'));
$custom_notes = validate(str_replace("\r\n", "\n", $_POST['custom_notes']), 'custom_notes', '/^[^\0]*$/');
$custom_notes_show = $result['custom_notes_show'];
if (isset($_POST['custom_notes_show'])) {
$custom_notes_show = intval_ressource($_POST['custom_notes_show']);
} }
Response::redirectTo($filename, [
if ($result['adminid'] == $userinfo['userid']) { 'page' => $page
]);
$password = '';
$def_language = $result['def_language'];
$deactivated = $result['deactivated'];
$customers = $result['customers'];
$domains = $result['domains'];
$subdomains = $result['subdomains'];
$emails = $result['emails'];
$email_accounts = $result['email_accounts'];
$email_forwarders = $result['email_forwarders'];
$email_quota = $result['email_quota'];
$ftps = $result['ftps'];
$tickets = $result['tickets'];
$mysqls = $result['mysqls'];
$tickets_see_all = $result['tickets_see_all'];
$customers_see_all = $result['customers_see_all'];
$domains_see_all = $result['domains_see_all'];
$caneditphpsettings = $result['caneditphpsettings'];
$change_serversettings = $result['change_serversettings'];
$diskspace = $result['diskspace'];
$traffic = $result['traffic'];
$ipaddress = $result['ip'];
} else { } else {
$password = validate($_POST['admin_password'], 'new password');
$def_language = validate($_POST['def_language'], 'default language');
$deactivated = isset($_POST['deactivated']) ? 1 : 0;
$customers = intval_ressource($_POST['customers']);
if (isset($_POST['customers_ul'])) {
$customers = -1;
}
$domains = intval_ressource($_POST['domains']);
if (isset($_POST['domains_ul'])) {
$domains = -1;
}
$subdomains = intval_ressource($_POST['subdomains']);
if (isset($_POST['subdomains_ul'])) {
$subdomains = -1;
}
$emails = intval_ressource($_POST['emails']);
if (isset($_POST['emails_ul'])) {
$emails = -1;
}
$email_accounts = intval_ressource($_POST['email_accounts']);
if (isset($_POST['email_accounts_ul'])) {
$email_accounts = -1;
}
$email_forwarders = intval_ressource($_POST['email_forwarders']);
if (isset($_POST['email_forwarders_ul'])) {
$email_forwarders = -1;
}
if (Settings::Get('system.mail_quota_enabled') == '1') {
$email_quota = validate($_POST['email_quota'], 'email_quota', '/^\d+$/', 'vmailquotawrong', array('0', ''));
if (isset($_POST['email_quota_ul'])) {
$email_quota = -1;
}
} else {
$email_quota = -1;
}
$ftps = intval_ressource($_POST['ftps']);
if (isset($_POST['ftps_ul'])) {
$ftps = -1;
}
if (Settings::Get('ticket.enabled') == 1) {
$tickets = intval_ressource($_POST['tickets']);
if (isset($_POST['tickets_ul'])) {
$tickets = -1;
}
} else {
$tickets = 0;
}
$mysqls = intval_ressource($_POST['mysqls']);
if (isset($_POST['mysqls_ul'])) {
$mysqls = -1;
}
$customers_see_all = 0;
if (isset($_POST['customers_see_all'])) {
$customers_see_all = intval($_POST['customers_see_all']);
}
$domains_see_all = 0;
if (isset($_POST['domains_see_all'])) {
$domains_see_all = intval($_POST['domains_see_all']);
}
$caneditphpsettings = 0;
if (isset($_POST['caneditphpsettings'])) {
$caneditphpsettings = intval($_POST['caneditphpsettings']);
}
$change_serversettings = 0;
if (isset($_POST['change_serversettings'])) {
$change_serversettings = isset($_POST['change_serversettings']) ? 1 : 0;
}
$tickets_see_all = 0;
if (isset($_POST['tickets_see_all'])) {
$tickets_see_all = intval($_POST['tickets_see_all']);
}
$diskspace = intval($_POST['diskspace']);
if (isset($_POST['diskspace_ul'])) {
$diskspace = -1;
}
$traffic = doubleval_ressource($_POST['traffic']);
if (isset($_POST['traffic_ul'])) {
$traffic = -1;
}
$diskspace = $diskspace * 1024;
$traffic = $traffic * 1024 * 1024;
$ipaddress = intval_ressource($_POST['ipaddress']);
}
if ($name == '') {
standard_error(array('stringisempty', 'myname'));
} elseif($email == '') {
standard_error(array('stringisempty', 'emailadd'));
} elseif(!validateEmail($email)) {
standard_error('emailiswrong', $email);
} else {
if ($password != '') {
$password = validatePassword($password);
$password = makeCryptPassword($password);
} else {
$password = $result['password'];
}
if ($deactivated != '1') {
$deactivated = '0';
}
if ($customers_see_all != '1') {
$customers_see_all = '0';
}
if ($domains_see_all != '1') {
$domains_see_all = '0';
}
if ($caneditphpsettings != '1') {
$caneditphpsettings = '0';
}
if ($change_serversettings != '1') {
$change_serversettings = '0';
}
if ($tickets_see_all != '1') {
$tickets_see_all = '0';
}
// check if a resource was set to something lower
// than actually used by the admin/reseller
$res_warning = "";
if ($customers != $result['customers'] && $customers != -1 && $customers < $result['customers_used']) {
$res_warning .= sprintf($lng['error']['setlessthanalreadyused'], 'customers');
}
if ($domains != $result['domains'] && $domains != -1 && $domains < $result['domains_used']) {
$res_warning .= sprintf($lng['error']['setlessthanalreadyused'], 'domains');
}
if ($diskspace != $result['diskspace'] && ($diskspace / 1024) != -1 && $diskspace < $result['diskspace_used']) {
$res_warning .= sprintf($lng['error']['setlessthanalreadyused'], 'diskspace');
}
if ($traffic != $result['traffic'] && ($traffic / 1024 / 1024) != -1 && $traffic < $result['traffic_used']) {
$res_warning .= sprintf($lng['error']['setlessthanalreadyused'], 'traffic');
}
if ($emails != $result['emails'] && $emails != -1 && $emails < $result['emails_used']) {
$res_warning .= sprintf($lng['error']['setlessthanalreadyused'], 'emails');
}
if ($email_accounts != $result['email_accounts'] && $email_accounts != -1 && $email_accounts < $result['email_accounts_used']) {
$res_warning .= sprintf($lng['error']['setlessthanalreadyused'], 'email accounts');
}
if ($email_forwarders != $result['email_forwarders'] && $email_forwarders != -1 && $email_forwarders < $result['email_forwarders_used']) {
$res_warning .= sprintf($lng['error']['setlessthanalreadyused'], 'email forwarders');
}
if ($email_quota != $result['email_quota'] && $email_quota != -1 && $email_quota < $result['email_quota_used']) {
$res_warning .= sprintf($lng['error']['setlessthanalreadyused'], 'email quota');
}
if ($ftps != $result['ftps'] && $ftps != -1 && $ftps < $result['ftps_used']) {
$res_warning .= sprintf($lng['error']['setlessthanalreadyused'], 'ftps');
}
if ($tickets != $result['tickets'] && $tickets != -1 && $tickets < $result['tickets_used']) {
$res_warning .= sprintf($lng['error']['setlessthanalreadyused'], 'tickets');
}
if ($mysqls != $result['mysqls'] && $mysqls != -1 && $mysqls < $result['mysqls_used']) {
$res_warning .= sprintf($lng['error']['setlessthanalreadyused'], 'mysqls');
}
if ($res_warning != "") {
$link = '';
$error = $res_warning;
eval("echo \"" . getTemplate('misc/error', '1') . "\";");
exit;
}
$upd_data = array(
'password' => $password,
'name' => $name,
'email' => $email,
'lang' => $def_language,
'change_serversettings' => $change_serversettings,
'customers' => $customers,
'customers_see_all' => $customers_see_all,
'domains' => $domains,
'domains_see_all' => $domains_see_all,
'caneditphpsettings' => $caneditphpsettings,
'diskspace' => $diskspace,
'traffic' => $traffic,
'subdomains' => $subdomains,
'emails' => $emails,
'accounts' => $email_accounts,
'forwarders' => $email_forwarders,
'quota' => $email_quota,
'ftps' => $ftps,
'tickets' => $tickets,
'tickets_see_all' => $tickets_see_all,
'mysqls' => $mysqls,
'ip' => $ipaddress,
'deactivated' => $deactivated,
'custom_notes' => $custom_notes,
'custom_notes_show' => $custom_notes_show,
'adminid' => $id
);
$upd_stmt = Database::prepare("
UPDATE `" . TABLE_PANEL_ADMINS . "` SET
`password` = :password,
`name` = :name,
`email` = :email,
`def_language` = :lang,
`change_serversettings` = :change_serversettings,
`customers` = :customers,
`customers_see_all` = :customers_see_all,
`domains` = :domains,
`domains_see_all` = :domains_see_all,
`caneditphpsettings` = :caneditphpsettings,
`diskspace` = :diskspace,
`traffic` = :traffic,
`subdomains` = :subdomains,
`emails` = :emails,
`email_accounts` = :accounts,
`email_forwarders` = :forwarders,
`email_quota` = :quota,
`ftps` = :ftps,
`tickets` = :tickets,
`tickets_see_all` = :tickets_see_all,
`mysqls` = :mysqls,
`ip` = :ip,
`deactivated` = :deactivated,
`custom_notes` = :custom_notes,
`custom_notes_show` = :custom_notes_show
WHERE `adminid` = :adminid
");
Database::pexecute($upd_stmt, $upd_data);
$log->logAction(ADM_ACTION, LOG_INFO, "edited admin '#" . $id . "'");
redirectTo($filename, array('page' => $page, 's' => $s));
}
} else {
$dec_places = Settings::Get('panel.decimal_places'); $dec_places = Settings::Get('panel.decimal_places');
$result['traffic'] = round($result['traffic'] / (1024 * 1024), $dec_places); $result['traffic'] = round($result['traffic'] / (1024 * 1024), $dec_places);
$result['diskspace'] = round($result['diskspace'] / 1024, $dec_places); $result['diskspace'] = round($result['diskspace'] / 1024, $dec_places);
$result['email'] = $idna_convert->decode($result['email']); $result['email'] = $idna_convert->decode($result['email']);
$customers_ul = makecheckbox('customers_ul', $lng['customer']['unlimited'], '-1', false, $result['customers'], true, true); $ipaddress = [];
if ($result['customers'] == '-1') { $ipaddress[-1] = lng('admin.allips');
$result['customers'] = '';
}
$diskspace_ul = makecheckbox('diskspace_ul', $lng['customer']['unlimited'], '-1', false, $result['diskspace'], true, true);
if ($result['diskspace'] == '-1') {
$result['diskspace'] = '';
}
$traffic_ul = makecheckbox('traffic_ul', $lng['customer']['unlimited'], '-1', false, $result['traffic'], true, true);
if ($result['traffic'] == '-1') {
$result['traffic'] = '';
}
$domains_ul = makecheckbox('domains_ul', $lng['customer']['unlimited'], '-1', false, $result['domains'], true, true);
if ($result['domains'] == '-1') {
$result['domains'] = '';
}
$subdomains_ul = makecheckbox('subdomains_ul', $lng['customer']['unlimited'], '-1', false, $result['subdomains'], true, true);
if ($result['subdomains'] == '-1') {
$result['subdomains'] = '';
}
$emails_ul = makecheckbox('emails_ul', $lng['customer']['unlimited'], '-1', false, $result['emails'], true, true);
if ($result['emails'] == '-1') {
$result['emails'] = '';
}
$email_accounts_ul = makecheckbox('email_accounts_ul', $lng['customer']['unlimited'], '-1', false, $result['email_accounts'], true, true);
if ($result['email_accounts'] == '-1') {
$result['email_accounts'] = '';
}
$email_forwarders_ul = makecheckbox('email_forwarders_ul', $lng['customer']['unlimited'], '-1', false, $result['email_forwarders'], true, true);
if ($result['email_forwarders'] == '-1') {
$result['email_forwarders'] = '';
}
$email_quota_ul = makecheckbox('email_quota_ul', $lng['customer']['unlimited'], '-1', false, $result['email_quota'], true, true);
if ($result['email_quota'] == '-1') {
$result['email_quota'] = '';
}
$ftps_ul = makecheckbox('ftps_ul', $lng['customer']['unlimited'], '-1', false, $result['ftps'], true, true);
if ($result['ftps'] == '-1') {
$result['ftps'] = '';
}
$tickets_ul = makecheckbox('tickets_ul', $lng['customer']['unlimited'], '-1', false, $result['tickets'], true, true);
if ($result['tickets'] == '-1') {
$result['tickets'] = '';
}
$mysqls_ul = makecheckbox('mysqls_ul', $lng['customer']['unlimited'], '-1', false, $result['mysqls'], true, true);
if ($result['mysqls'] == '-1') {
$result['mysqls'] = '';
}
$language_options = '';
while (list($language_file, $language_name) = each($languages)) {
$language_options.= makeoption($language_name, $language_file, $result['def_language'], true);
}
$ipaddress = makeoption($lng['admin']['allips'], "-1", $result['ip']);
$ipsandports_stmt = Database::query(" $ipsandports_stmt = Database::query("
SELECT `id`, `ip` FROM `" . TABLE_PANEL_IPSANDPORTS . "` GROUP BY `ip` ORDER BY `ip`, `port` ASC SELECT `id`, `ip` FROM `" . TABLE_PANEL_IPSANDPORTS . "` GROUP BY `ip` ORDER BY `ip` ASC
"); ");
while ($row = $ipsandports_stmt->fetch(PDO::FETCH_ASSOC)) { while ($row = $ipsandports_stmt->fetch(PDO::FETCH_ASSOC)) {
$ipaddress.= makeoption($row['ip'], $row['id'], $result['ip']); $ipaddress[$row['id']] = $row['ip'];
} }
$result = htmlentities_array($result); $result = PhpHelper::htmlentitiesArray($result);
$admin_edit_data = include_once dirname(__FILE__) . '/lib/formfields/admin/admin/formfield.admin_edit.php'; $admin_edit_data = include_once dirname(__FILE__) . '/lib/formfields/admin/admin/formfield.admin_edit.php';
$admin_edit_form = htmlform::genHTMLForm($admin_edit_data);
$title = $admin_edit_data['admin_edit']['title']; UI::view('user/form.html.twig', [
$image = $admin_edit_data['admin_edit']['image']; 'formaction' => $linker->getLink(['section' => 'admins', 'id' => $id]),
'formdata' => $admin_edit_data['admin_edit'],
eval("echo \"" . getTemplate("admins/admins_edit") . "\";"); 'editid' => $id
]);
} }
} }
} }

View File

@@ -1,97 +1,142 @@
<?php <?php
/* /**
+----------------------------------------------------------------------+ * This file is part of the Froxlor project.
| APC | * Copyright (c) 2010 the Froxlor Team (see authors).
+----------------------------------------------------------------------+ *
| Copyright (c) 2006-2011 The PHP Group | * This program is free software; you can redistribute it and/or
+----------------------------------------------------------------------+ * modify it under the terms of the GNU General Public License
| This source file is subject to version 3.01 of the PHP license, | * as published by the Free Software Foundation; either version 2
| that is bundled with this package in the file LICENSE, and is | * of the License, or (at your option) any later version.
| available through the world-wide-web at the following url: | *
| http://www.php.net/license/3_01.txt | * This program is distributed in the hope that it will be useful,
| If you did not receive a copy of the PHP license and are unable to | * but WITHOUT ANY WARRANTY; without even the implied warranty of
| obtain it through the world-wide-web, please send a note to | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
| license@php.net so we can mail you a copy immediately. | * GNU General Public License for more details.
+----------------------------------------------------------------------+ *
| Authors: Ralf Becker <beckerr@php.net> | * You should have received a copy of the GNU General Public License
| Rasmus Lerdorf <rasmus@php.net> | * along with this program; if not, you can also view it online at
| Ilia Alshanetsky <ilia@prohost.org> | * https://files.froxlor.org/misc/COPYING.txt
+----------------------------------------------------------------------+ *
* @copyright the authors
All other licensing and usage conditions are those of the PHP Group. * @author Froxlor team <team@froxlor.org>
* @author Janos Muzsi <muzsij@hypernics.hu>
Based on https://github.com/krakjoe/apcu/blob/master/apc.php * @author Ralf Becker <beckerr@php.net>
Implemented into Froxlor: Janos Muzsi <muzsij@hypernics.hu> * @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
*/ */
define('AREA', 'admin'); use Froxlor\FroxlorLogger;
require './lib/init.php'; use Froxlor\UI\Panel\UI;
use Froxlor\UI\Response;
use Froxlor\UI\HTML;
const AREA = 'admin';
require __DIR__ . '/lib/init.php';
$horizontal_bar_size = 950; // 1280px window width $horizontal_bar_size = 950; // 1280px window width
if ($action == 'delete' && if ($action == 'delete' && function_exists('apcu_clear_cache') && $userinfo['change_serversettings'] == '1') {
function_exists('apcu_clear_cache') && if ($_POST['send'] == 'send') {
$userinfo['change_serversettings'] == '1'
) {
apcu_clear_cache(); apcu_clear_cache();
$log->logAction(ADM_ACTION, LOG_INFO, "cleared APCu cache"); $log->logAction(FroxlorLogger::ADM_ACTION, LOG_INFO, "cleared APCu cache");
header('Location: ' . $linker->getLink(array('section' => 'apcuinfo', 'page' => 'showinfo'))); header('Location: ' . $linker->getLink([
'section' => 'apcuinfo',
'page' => 'showinfo'
]));
exit(); exit();
} else {
HTML::askYesNo('cache_reallydelete', $filename, [
'page' => $page,
'action' => 'delete',
], '', [
'section' => 'apcuinfo',
'page' => 'showinfo'
]);
}
} }
if (!function_exists('apcu_cache_info') || if (!function_exists('apcu_cache_info') || !function_exists('apcu_sma_info')) {
!function_exists('apcu_sma_info') Response::standardError(lng('error.no_apcuinfo'));
) {
standard_error($lng['error']['no_apcuinfo']);
} }
if ($page == 'showinfo' if ($page == 'showinfo' && $userinfo['change_serversettings'] == '1') {
) {
$cache = apcu_cache_info(); $cache = apcu_cache_info();
$mem = apcu_sma_info(); $mem = apcu_sma_info();
$time = time(); $time = time();
$log->logAction(ADM_ACTION, LOG_NOTICE, "viewed admin_apcuinfo"); $log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, "viewed admin_apcuinfo");
$passtime = $time - $cache['start_time'] > 0 ? $time - $cache['start_time'] : 1; // zero division
$mem_size = $mem['num_seg'] * $mem['seg_size'];
$mem_avail = $mem['avail_mem'];
$mem_used = $mem_size - $mem_avail;
$seg_size = bsize($mem['seg_size']);
$sharedmem = sprintf($lng['apcuinfo']['sharedmemval'], $mem['num_seg'], $seg_size, $cache['memory_type']);
$req_rate_user = sprintf("%.2f", $cache['num_hits'] ? (($cache['num_hits'] + $cache['num_misses']) / $passtime) : 0);
$hit_rate_user = sprintf("%.2f", $cache['num_hits'] ? (($cache['num_hits']) / $passtime) : 0);
$miss_rate_user = sprintf("%.2f", $cache['num_misses'] ? (($cache['num_misses']) / $passtime) : 0);
$insert_rate_user = sprintf("%.2f", $cache['num_inserts'] ? (($cache['num_inserts']) / $passtime) : 0);
$apcversion = phpversion('apcu');
$phpversion = phpversion();
$number_vars = $cache['num_entries'];
$starttime = date('Y-m-d H:i:s', $cache['start_time']);
$uptime_duration = duration($cache['start_time']);
$size_vars = bsize($cache['mem_size']);
// check for possible empty values that are used in the templates // check for possible empty values that are used in the templates
if (!isset($cache['file_upload_progress'])) { if (!isset($cache['file_upload_progress'])) {
$cache['file_upload_progress'] = $lng['logger']['unknown']; $cache['file_upload_progress'] = lng('logger.unknown');
} }
if (!isset($cache['num_expunges'])) { if (!isset($cache['num_expunges'])) {
$cache['num_expunges'] = $lng['logger']['unknown']; $cache['num_expunges'] = lng('logger.unknown');
} }
$runtimelines = ''; $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_avail']) * 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) { foreach (ini_get_all('apcu') as $name => $v) {
$value = $v['local_value']; $value = $v['local_value'];
eval("\$runtimelines.=\"" . getTemplate("settings/apcuinfo/runtime_line") . "\";"); $overview['runtimelines'][$name] = $value;
} }
$freemem = bsize($mem_avail) . sprintf(" (%.1f%%)", $mem_avail * 100 / $mem_size);
$usedmem = bsize($mem_used) . sprintf(" (%.1f%%)", $mem_used * 100 / $mem_size);
$hits = $cache['num_hits'] . @sprintf(" (%.1f%%)", $cache['num_hits'] * 100 / ($cache['num_hits'] + $cache['num_misses']));
$misses = $cache['num_misses'] . @sprintf(" (%.1f%%)", $cache['num_misses'] * 100 / ($cache['num_hits'] + $cache['num_misses']));
// Fragementation: (freeseg - 1) / total_seg // Fragementation: (freeseg - 1) / total_seg
$nseg = $freeseg = $fragsize = $freetotal = 0; $nseg = $freeseg = $fragsize = $freetotal = 0;
for ($i = 0; $i < $mem['num_seg']; $i++) { for ($i = 0; $i < $mem['num_seg']; $i++) {
@@ -102,201 +147,52 @@ if ($page == 'showinfo'
} }
$ptr = $block['offset'] + $block['size']; $ptr = $block['offset'] + $block['size'];
/* Only consider blocks <5M for the fragmentation % */ /* Only consider blocks <5M for the fragmentation % */
if ($block['size'] < (5 * 1024 * 1024)) if ($block['size'] < (5 * 1024 * 1024)) {
$fragsize += $block['size']; $fragsize += $block['size'];
}
$freetotal += $block['size']; $freetotal += $block['size'];
} }
$freeseg += count($mem['block_lists'][$i]); $freeseg += count($mem['block_lists'][$i]);
} }
$overview['fragmentation'] = [];
if ($freeseg > 1) { if ($freeseg > 1) {
$frag = sprintf("%.2f%% (%s out of %s in %d fragments)", ($fragsize / $freetotal) * 100, bsize($fragsize), bsize($freetotal), $freeseg); $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 { } else {
$frag = "0%"; $overview['fragmentation'] = 0;
} }
foreach (ini_get_all('apcu') as $name => $v) { UI::view('settings/apcuinfo.html.twig', [
$value = $v['local_value']; 'apcuinfo' => $overview
]);
} }
$img_src1 = '';
$img_src2 = '';
$img_src3 = '';
if (graphics_avail()) {
$img_src = $linker->getLink(array('section' => 'apcuinfo', 'page' => 'img1', 'action' => mt_rand(0, 1000000)));
eval("\$img_src1=\"" . getTemplate("settings/apcuinfo/img_line") . "\";");
$img_src = $linker->getLink(array('section' => 'apcuinfo', 'page' => 'img2', 'action' => mt_rand(0, 1000000)));
eval("\$img_src2=\"" . getTemplate("settings/apcuinfo/img_line") . "\";");
$img_src = $linker->getLink(array('section' => 'apcuinfo', 'page' => 'img3', 'action' => mt_rand(0, 1000000)));
eval("\$img_src3=\"" . getTemplate("settings/apcuinfo/img_line") . "\";");
}
eval("echo \"" . getTemplate("settings/apcuinfo/showinfo") . "\";");
} elseif ($page == 'img1'
) {
$mem = apcu_sma_info();
$size = 460;
$image = imagecreate($size + 5, $size + 5);
$col_white = imagecolorallocate($image, 0xFF, 0xFF, 0xFF);
$col_red = imagecolorallocate($image, 0xD0, 0x60, 0x30);
$col_green = imagecolorallocate($image, 0x60, 0xF0, 0x60);
$col_black = imagecolorallocate($image, 0, 0, 0);
imagecolortransparent($image, $col_white);
$s = $mem['num_seg'] * $mem['seg_size'];
$a = $mem['avail_mem'];
$x = $y = $size / 2;
$fuzz = 0.000001;
// This block of code creates the pie chart. It is a lot more complex than you
// would expect because we try to visualize any memory fragmentation as well.
$angle_from = 0;
$string_placement = array();
for ($i = 0; $i < $mem['num_seg']; $i++) {
$ptr = 0;
$free = $mem['block_lists'][$i];
uasort($free, 'block_sort');
foreach ($free as $block) {
if ($block['offset'] != $ptr) { // Used block
$angle_to = $angle_from + ($block['offset'] - $ptr) / $s;
if (($angle_to + $fuzz) > 1)
$angle_to = 1;
if (($angle_to * 360) - ($angle_from * 360) >= 1) {
fill_arc($image, $x, $y, $size, $angle_from * 360, $angle_to * 360, $col_black, $col_red);
if (($angle_to - $angle_from) > 0.05) {
array_push($string_placement, array($angle_from, $angle_to));
}
}
$angle_from = $angle_to;
}
$angle_to = $angle_from + ($block['size']) / $s;
if (($angle_to + $fuzz) > 1)
$angle_to = 1;
if (($angle_to * 360) - ($angle_from * 360) >= 1) {
fill_arc($image, $x, $y, $size, $angle_from * 360, $angle_to * 360, $col_black, $col_green);
if (($angle_to - $angle_from) > 0.05) {
array_push($string_placement, array($angle_from, $angle_to));
}
}
$angle_from = $angle_to;
$ptr = $block['offset'] + $block['size'];
}
if ($ptr < $mem['seg_size']) { // memory at the end
$angle_to = $angle_from + ($mem['seg_size'] - $ptr) / $s;
if (($angle_to + $fuzz) > 1)
$angle_to = 1;
fill_arc($image, $x, $y, $size, $angle_from * 360, $angle_to * 360, $col_black, $col_red);
if (($angle_to - $angle_from) > 0.05) {
array_push($string_placement, array($angle_from, $angle_to));
}
}
}
foreach ($string_placement as $angle) {
text_arc($image, $x, $y, $size, $angle[0] * 360, $angle[1] * 360, $col_black, bsize($s * ($angle[1] - $angle[0])));
}
header("Content-type: image/png");
imagepng($image);
exit;
} elseif ($page == 'img2'
) {
$cache = apcu_cache_info();
$size = $horizontal_bar_size;
$image = imagecreate($size + 5, 140);
$col_white = imagecolorallocate($image, 0xFF, 0xFF, 0xFF);
$col_red = imagecolorallocate($image, 0xD0, 0x60, 0x30);
$col_green = imagecolorallocate($image, 0x60, 0xF0, 0x60);
$col_black = imagecolorallocate($image, 0, 0, 0);
imagecolortransparent($image, $col_white);
$s = $cache['num_hits'] + $cache['num_misses'];
$a = $cache['num_hits'];
fill_box($image, 1, 10, $s ? ($a * ($size - 21) / $s) : $size, 50, $col_black, $col_green/* , sprintf("%.1f%%", $s ? $cache['num_hits'] * 100 / $s : 0) */);
fill_box($image, 1, 80, $s ? max(4, ($s - $a) * ($size - 21) / $s) : $size, 50, $col_black, $col_red/* , sprintf("%.1f%%", $s ? $cache['num_misses'] * 100 / $s : 0) */);
header("Content-type: image/png");
imagepng($image);
exit;
} elseif ($page == 'img3'
) {
$mem = apcu_sma_info();
$size = $horizontal_bar_size;
$image = imagecreate($size, 70);
$col_white = imagecolorallocate($image, 0xFF, 0xFF, 0xFF);
$col_red = imagecolorallocate($image, 0xD0, 0x60, 0x30);
$col_green = imagecolorallocate($image, 0x60, 0xF0, 0x60);
$col_black = imagecolorallocate($image, 0, 0, 0);
imagecolortransparent($image, $col_white);
$s = $mem['num_seg'] * $mem['seg_size'];
$a = $mem['avail_mem'];
$x = 10;
$y = 0;
// This block of code creates the bar chart. It is a lot more complex than you
// would expect because we try to visualize any memory fragmentation as well.
for ($i = 0; $i < $mem['num_seg']; $i++) {
$ptr = 0;
$free = $mem['block_lists'][$i];
uasort($free, 'block_sort');
foreach ($free as $block) {
if ($block['offset'] != $ptr) { // Used block
$h = ($size - 5) * ($block['offset'] - $ptr) / $s;
if ($h > 0) {
fill_box($image, $y, $x, $h, 50, $col_black, $col_red);
}
$y+=$h;
}
$h = ($size - 5) * ($block['size']) / $s;
if ($h > 0) {
fill_box($image, $y, $x, $h, 50, $col_black, $col_green);
}
$y+=$h;
$ptr = $block['offset'] + $block['size'];
}
if ($ptr < $mem['seg_size']) { // memory at the end
$h = ($size - 5) * ($mem['seg_size'] - $ptr) / $s;
if ($h > 0) {
fill_box($image, $y, $x, $h, 50, $col_black, $col_red, bsize($mem['seg_size'] - $ptr), $j++);
}
}
}
header("Content-type: image/png");
imagepng($image);
exit;
}
function graphics_avail() {
return extension_loaded('gd');
}
// pretty printer for byte values // pretty printer for byte values
// function bsize($size)
function bsize($s) { {
foreach (array('', 'K', 'M', 'G') as $i => $k) { $i = 0;
if ($s < 1024) $val = ['b', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
break; while (($size / 1024) > 1) {
$s/=1024; $size /= 1024;
++$i;
} }
return sprintf("%5.1f %sBytes", $s, $k); return sprintf(
'%.2f%s%s',
$size,
'',
$val[$i]
);
} }
function duration($ts) { function duration($ts)
{
global $time; global $time;
$years = (int)((($time - $ts) / (7 * 86400)) / 52.177457); $years = (int)((($time - $ts) / (7 * 86400)) / 52.177457);
$rem = (int)(($time - $ts) - ($years * 52.177457 * 7 * 86400)); $rem = (int)(($time - $ts) - ($years * 52.177457 * 7 * 86400));
@@ -305,111 +201,34 @@ function duration($ts) {
$hours = (int)(($rem) / 3600) - $days * 24 - $weeks * 7 * 24; $hours = (int)(($rem) / 3600) - $days * 24 - $weeks * 7 * 24;
$mins = (int)(($rem) / 60) - $hours * 60 - $days * 24 * 60 - $weeks * 7 * 24 * 60; $mins = (int)(($rem) / 60) - $hours * 60 - $days * 24 * 60 - $weeks * 7 * 24 * 60;
$str = ''; $str = '';
if ($years == 1) if ($years == 1) {
$str .= "$years year, "; $str .= "$years year, ";
if ($years > 1) }
if ($years > 1) {
$str .= "$years years, "; $str .= "$years years, ";
if ($weeks == 1) }
if ($weeks == 1) {
$str .= "$weeks week, "; $str .= "$weeks week, ";
if ($weeks > 1) }
if ($weeks > 1) {
$str .= "$weeks weeks, "; $str .= "$weeks weeks, ";
if ($days == 1) }
if ($days == 1) {
$str .= "$days day,"; $str .= "$days day,";
if ($days > 1) }
if ($days > 1) {
$str .= "$days days,"; $str .= "$days days,";
if ($hours == 1) }
if ($hours == 1) {
$str .= " $hours hour and"; $str .= " $hours hour and";
if ($hours > 1) }
if ($hours > 1) {
$str .= " $hours hours and"; $str .= " $hours hours and";
if ($mins == 1) }
if ($mins == 1) {
$str .= " 1 minute"; $str .= " 1 minute";
else } else {
$str .= " $mins minutes"; $str .= " $mins minutes";
}
return $str; return $str;
} }
function block_sort($array1, $array2) {
if ($array1['offset'] > $array2['offset']) {
return 1;
} else {
return -1;
}
}
function fill_arc($im, $centerX, $centerY, $diameter, $start, $end, $color1, $color2, $text = '', $placeindex = 0) {
$r = $diameter / 2;
$w = deg2rad((360 + $start + ($end - $start) / 2) % 360);
if (function_exists("imagefilledarc")) {
// exists only if GD 2.0.1 is available
imagefilledarc($im, $centerX + 1, $centerY + 1, $diameter, $diameter, $start, $end, $color1, IMG_ARC_PIE);
imagefilledarc($im, $centerX, $centerY, $diameter, $diameter, $start, $end, $color2, IMG_ARC_PIE);
imagefilledarc($im, $centerX, $centerY, $diameter, $diameter, $start, $end, $color1, IMG_ARC_NOFILL | IMG_ARC_EDGED);
} else {
imagearc($im, $centerX, $centerY, $diameter, $diameter, $start, $end, $color2);
imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($start)) * $r, $centerY + sin(deg2rad($start)) * $r, $color2);
imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($start + 1)) * $r, $centerY + sin(deg2rad($start)) * $r, $color2);
imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($end - 1)) * $r, $centerY + sin(deg2rad($end)) * $r, $color2);
imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($end)) * $r, $centerY + sin(deg2rad($end)) * $r, $color2);
imagefill($im, $centerX + $r * cos($w) / 2, $centerY + $r * sin($w) / 2, $color2);
}
if ($text) {
if ($placeindex > 0) {
imageline($im, $centerX + $r * cos($w) / 2, $centerY + $r * sin($w) / 2, $diameter, $placeindex * 12, $color1);
imagestring($im, 4, $diameter, $placeindex * 12, $text, $color1);
} else {
imagestring($im, 4, $centerX + $r * cos($w) / 2, $centerY + $r * sin($w) / 2, $text, $color1);
}
}
}
function text_arc($im, $centerX, $centerY, $diameter, $start, $end, $color1, $text, $placeindex = 0) {
$r = $diameter / 2;
$w = deg2rad((360 + $start + ($end - $start) / 2) % 360);
if ($placeindex > 0) {
imageline($im, $centerX + $r * cos($w) / 2, $centerY + $r * sin($w) / 2, $diameter, $placeindex * 12, $color1);
imagestring($im, 4, $diameter, $placeindex * 12, $text, $color1);
} else {
imagestring($im, 4, $centerX + $r * cos($w) / 2, $centerY + $r * sin($w) / 2, $text, $color1);
}
}
function fill_box($im, $x, $y, $w, $h, $color1, $color2, $text = '', $placeindex = '') {
global $col_black;
$x1 = $x + $w - 1;
$y1 = $y + $h - 1;
imagerectangle($im, $x, $y1, $x1 + 1, $y + 1, $col_black);
if ($y1 > $y)
imagefilledrectangle($im, $x, $y, $x1, $y1, $color2);
else
imagefilledrectangle($im, $x, $y1, $x1, $y, $color2);
imagerectangle($im, $x, $y1, $x1, $y, $color1);
if ($text) {
if ($placeindex > 0) {
if ($placeindex < 16) {
$px = 5;
$py = $placeindex * 12 + 6;
imagefilledrectangle($im, $px + 90, $py + 3, $px + 90 - 4, $py - 3, $color2);
imageline($im, $x, $y + $h / 2, $px + 90, $py, $color2);
imagestring($im, 2, $px, $py - 6, $text, $color1);
} else {
if ($placeindex < 31) {
$px = $x + 40 * 2;
$py = ($placeindex - 15) * 12 + 6;
} else {
$px = $x + 40 * 2 + 100 * intval(($placeindex - 15) / 15);
$py = ($placeindex % 15) * 12 + 6;
}
imagefilledrectangle($im, $px, $py + 3, $px - 4, $py - 3, $color2);
imageline($im, $x + $w, $y + $h / 2, $px, $py, $color2);
imagestring($im, 2, $px + 2, $py - 6, $text, $color1);
}
} else {
imagestring($im, 4, $x + 5, $y1 - 16, $text, $color1);
}
}
}

View File

@@ -2,201 +2,198 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2016 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Michael Kaufmann <mkaufmann@nutime.de> * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Frontend
* *
* @since 0.9.35 * 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
*/ */
define('AREA', 'admin'); const AREA = 'admin';
require './lib/init.php'; require __DIR__ . '/lib/init.php';
// define update-uri use Froxlor\Froxlor;
define('UPDATE_URI', "https://version.froxlor.org/Froxlor/legacy/" . $version); use Froxlor\FroxlorLogger;
define('RELEASE_URI', "https://autoupdate.froxlor.org/froxlor-{version}.zip"); use Froxlor\Http\HttpClient;
define('CHECKSUM_URI', "https://autoupdate.froxlor.org/froxlor-{version}.zip.sha256"); use Froxlor\Install\AutoUpdate;
use Froxlor\Settings;
use Froxlor\UI\Panel\UI;
use Froxlor\UI\Response;
// check for allow_url_fopen if ($page != 'error') {
if (ini_get('allow_url_fopen') === false) { // check for webupdate to be enabled
redirectTo($filename, array('s' => $s, 'page' => 'error', 'errno' => 1)); if (Settings::Config('enable_webupdate') != true) {
Response::redirectTo($filename, [
'page' => 'error',
'errno' => 11
]);
} }
// check for archive-stuff
if (! extension_loaded('zip')) {
redirectTo($filename, array('s' => $s, 'page' => 'error', 'errno' => 2));
} }
// display initial version check // display initial version check
if ($page == 'overview') { if ($page == 'overview') {
// log our actions // log our actions
$log->logAction(ADM_ACTION, LOG_NOTICE, "checking auto-update"); $log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, "checking auto-update");
// check for new version // check for new version
$latestversion = @file(UPDATE_URI); try {
$result = AutoUpdate::checkVersion();
if (isset($latestversion[0])) { } catch (Exception $e) {
$latestversion = explode('|', $latestversion[0]); Response::dynamicError($e->getMessage());
if (is_array($latestversion)
&& count($latestversion) >= 1
) {
$_version = $latestversion[0];
$_message = isset($latestversion[1]) ? $latestversion[1] : '';
$_link = isset($latestversion[2]) ? $latestversion[2] : htmlspecialchars($filename . '?s=' . urlencode($s) . '&page=' . urlencode($page) . '&lookfornewversion=yes');
// add the branding so debian guys are not gettings confused
// about their version-number
$version_label = $_version.$branding;
$version_link = $_link;
$message_addinfo = $_message;
// not numeric -> error-message
if (!preg_match('/^((\d+\\.)(\d+\\.)(\d+\\.)?(\d+)?(\-(svn|dev|rc)(\d+))?)$/', $_version)) {
// check for customized version to not output
// "There is a newer version of froxlor" besides the error-message
redirectTo($filename, array('s' => $s, 'page' => 'error', 'errno' => 3));
} elseif (version_compare2($version, $_version) == -1) {
// there is a newer version - yay
$isnewerversion = 1;
} else {
// nothing new
$isnewerversion = 0;
} }
if ($result == 1) {
// anzeige über version-status mit ggfls. formular // anzeige über version-status mit ggfls. formular
// zum update schritt #1 -> download // zum update schritt #1 -> download
if ($isnewerversion == 1) { $text = lng('admin.newerversionavailable') . ' ' . lng('admin.newerversiondetails', [AutoUpdate::getFromResult('version'), Froxlor::VERSION]);
$text = 'There is a newer version available. Update to version <b>'.$_version.'</b> now?<br/>(Your current version is: '.$version.')';
$hiddenparams = '<input type="hidden" name="newversion" value="'.$_version.'" />';
$yesfile = $filename.'?s='.$s.'&amp;page=getdownload';
eval("echo \"" . getTemplate("misc/question_yesno", true) . "\";");
exit;
}
elseif ($isnewerversion == 0) {
// all good
standard_success ('noupdatesavail');
} else {
standard_error ('customized_version');
}
}
}
// error (something weird came from version.froxlor.org)
redirectTo($filename, array('s' => $s, 'page' => 'error', 'errno' => 5));
}
// download the new archive
elseif ($page == 'getdownload') {
$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 // retrieve the new version from the form
$newversion = isset($_POST['newversion']) ? $_POST['newversion'] : null; $newversion = isset($_POST['newversion']) ? $_POST['newversion'] : null;
$result = 6;
// valid? // valid?
if ($newversion !== null) { if ($newversion !== null) {
$result = AutoUpdate::downloadZip($newversion);
// define files to get if (!is_numeric($result)) {
$toLoad = str_replace('{version}', $newversion, RELEASE_URI);
$toCheck = str_replace('{version}', $newversion, CHECKSUM_URI);
// get archive data
$newArchive = @file_get_contents($toLoad);
// check for local destination folder
if (!is_dir(FROXLOR_INSTALL_DIR.'/updates/')) {
mkdir(FROXLOR_INSTALL_DIR.'/updates/');
}
// name archive
$localArchive = FROXLOR_INSTALL_DIR.'/updates/'.basename($toLoad);
$log->logAction(ADM_ACTION, LOG_NOTICE, "Downloading ".$toLoad." to ".$localArchive);
// remove old archive
if (file_exists($localArchive)) {
@unlink($localArchive);
}
// store archive
$fh = fopen($localArchive, 'w');
if (!fwrite($fh, $newArchive)) {
redirectTo($filename, array('s' => $s, 'page' => 'error', 'errno' => 4));
}
// close file-handle
fclose($fh);
// validate the integrity of the downloaded file
$_shouldsum = @file_get_contents($toCheck);
if (!empty($_shouldsum)) {
$_t = explode(" ", $_shouldsum);
$shouldsum = $_t[0];
} else {
$shouldsum = null;
}
$filesum = hash_file('sha256', $localArchive);
if ($filesum != $shouldsum) {
redirectTo($filename, array('s' => $s, 'page' => 'error', 'errno' => 9));
}
// to the next step // to the next step
redirectTo($filename, array('s' => $s, 'page' => 'extract', 'archive' => basename($localArchive))); Response::redirectTo($filename, [
'page' => 'extract',
'archive' => $result
]);
} }
redirectTo($filename, array('s' => $s, 'page' => 'error', 'errno' => 6));
} }
// extract and install new version Response::redirectTo($filename, [
'page' => 'error',
'errno' => $result
]);
} // extract and install new version
elseif ($page == 'extract') { elseif ($page == 'extract') {
if (isset($_POST['send']) && $_POST['send'] == 'send') {
$toExtract = isset($_GET['archive']) ? $_GET['archive'] : null; $toExtract = isset($_POST['archive']) ? $_POST['archive'] : null;
$localArchive = FROXLOR_INSTALL_DIR.'/updates/'.$toExtract; $localArchive = Froxlor::getInstallDir() . '/updates/' . $toExtract;
$log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, "Extracting " . $localArchive . " to " . Froxlor::getInstallDir());
if (isset($_POST['send']) $result = AutoUpdate::extractZip($localArchive);
&& $_POST['send'] == 'send' if ($result > 0) {
) {
// decompress from zip
$zip = new ZipArchive;
$res = $zip->open($localArchive);
if ($res === true) {
$log->logAction(ADM_ACTION, LOG_NOTICE, "Extracting ".$localArchive." to ".FROXLOR_INSTALL_DIR);
$zip->extractTo(FROXLOR_INSTALL_DIR);
$zip->close();
// success - remove unused archive
@unlink($localArchive);
} else {
// error // error
redirectTo($filename, array('s' => $s, 'page' => 'error', 'errno' => 8)); Response::redirectTo($filename, [
'page' => 'error',
'errno' => $result
]);
} }
// redirect to update-page
// redirect to update-page? Response::redirectTo('admin_updates.php');
redirectTo('admin_updates.php', array('s' => $s)); } else {
$toExtract = isset($_GET['archive']) ? $_GET['archive'] : null;
$localArchive = Froxlor::getInstallDir() . '/updates/' . $toExtract;
} }
if (!file_exists($localArchive)) { if (!file_exists($localArchive)) {
redirectTo($filename, array('s' => $s, 'page' => 'error', 'errno' => 7)); Response::redirectTo($filename, [
'page' => 'error',
'errno' => 7
]);
} }
$text = 'Extract downloaded archive "'.$toExtract.'"?'; $text = lng('admin.extractdownloadedzip', [$toExtract]);
$hiddenparams = '';
$yesfile = $filename.'?s='.$s.'&amp;page=extract&amp;archive='.$toExtract;
eval("echo \"" . getTemplate("misc/question_yesno", true) . "\";");
}
// display error $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') { elseif ($page == 'error') {
// retrieve error-number via url-parameter // retrieve error-number via url-parameter
$errno = isset($_GET['errno']) ? (int)$_GET['errno'] : 0; $errno = isset($_GET['errno']) ? (int)$_GET['errno'] : 0;
// 1 = no allow_url_fopen
// 2 = no Zlib // 2 = no Zlib
// 3 = custom version detected // 3 = custom version detected
// 4 = could not store archive to local hdd // 4 = could not store archive to local hdd
@@ -205,5 +202,11 @@ elseif ($page == 'error') {
// 7 = local archive does not exist // 7 = local archive does not exist
// 8 = could not extract archive // 8 = could not extract archive
// 9 = checksum mismatch // 9 = checksum mismatch
standard_error ('autoupdate_'.$errno); // 10 = <php-7.4
// 11 = enable_webupdate = false
$errmsg = 'autoupdate_' . $errno;
if ($errno == 3) {
$errmsg = 'customized_version';
}
Response::standardError($errmsg);
} }

View File

@@ -4,224 +4,177 @@
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Froxlor team <team@froxlor.org> (2010-) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @package Panel * GNU General Public License for more details.
* *
* @since 0.9.34 * 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
*/ */
define('AREA', 'admin');
require './lib/init.php'; 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;
if ($userinfo['change_serversettings'] == '1') { if ($userinfo['change_serversettings'] == '1') {
if ($action == 'setconfigured') {
$customer_tmpdir = '/tmp/'; Settings::Set('panel.is_configured', '1', true);
if (Settings::Get('system.mod_fcgid') == '1' && Settings::Get('system.mod_fcgid_tmpdir') != '') Response::redirectTo('admin_configfiles.php');
{
$customer_tmpdir = Settings::Get('system.mod_fcgid_tmpdir');
} }
elseif (Settings::Get('phpfpm.enabled') == '1' && Settings::Get('phpfpm.tmpdir') != '')
{
$customer_tmpdir = Settings::Get('phpfpm.tmpdir');
}
$replace_arr = Array(
'<SQL_UNPRIVILEGED_USER>' => $sql['user'],
'<SQL_UNPRIVILEGED_PASSWORD>' => 'MYSQL_PASSWORD',
'<SQL_DB>' => $sql['db'],
'<SQL_HOST>' => $sql['host'],
'<SQL_SOCKET>' => isset($sql['socket']) ? $sql['socket'] : null,
'<SERVERNAME>' => Settings::Get('system.hostname'),
'<SERVERIP>' => Settings::Get('system.ipaddress'),
'<NAMESERVERS>' => Settings::Get('system.nameservers'),
'<VIRTUAL_MAILBOX_BASE>' => Settings::Get('system.vmail_homedir'),
'<VIRTUAL_UID_MAPS>' => Settings::Get('system.vmail_uid'),
'<VIRTUAL_GID_MAPS>' => Settings::Get('system.vmail_gid'),
'<SSLPROTOCOLS>' => (Settings::Get('system.use_ssl') == '1') ? 'imaps pop3s' : '',
'<CUSTOMER_TMP>' => makeCorrectDir($customer_tmpdir),
'<BASE_PATH>' => makeCorrectDir(FROXLOR_INSTALL_DIR),
'<BIND_CONFIG_PATH>' => makeCorrectDir(Settings::Get('system.bindconf_directory')),
'<WEBSERVER_RELOAD_CMD>' => Settings::Get('system.apachereload_command'),
'<CUSTOMER_LOGS>' => makeCorrectDir(Settings::Get('system.logfiles_directory')),
'<FPM_IPCDIR>' => makeCorrectDir(Settings::Get('phpfpm.fastcgi_ipcdir')),
'<WEBSERVER_GROUP>' => Settings::Get('system.httpgroup')
);
// get distro from URL param // get distro from URL param
$distribution = (isset($_GET['distribution']) && $_GET['distribution'] != 'choose') ? $_GET['distribution'] : ""; $distribution = Request::any('distribution');
$service = (isset($_GET['service']) && $_GET['service'] != 'choose') ? $_GET['service'] : ""; $reselect = Request::any('reselect', 0);
$daemon = (isset($_GET['daemon']) && $_GET['daemon'] != 'choose') ? $_GET['daemon'] : "";
$distributions_select = "";
$services_select = "";
$daemons_select = "";
$configfiles = ""; // check for possible setting
$services = ""; if (empty($distribution)) {
$daemons = ""; $distribution = Settings::Get('system.distribution') ?? "";
}
if ($reselect == 1) {
$distribution = '';
}
$config_dir = makeCorrectDir(FROXLOR_INSTALL_DIR . '/lib/configfiles/'); $distributions_select = [];
$services = [];
$config_dir = FileDir::makeCorrectDir(Froxlor::getInstallDir() . '/lib/configfiles/');
if (!empty($distribution)) {
if (!file_exists($config_dir . '/' . $distribution . ".xml")) {
Response::dynamicError("Unknown distribution");
}
// update setting if different
if ($distribution != Settings::Get('system.distribution')) {
Settings::Set('system.distribution', $distribution);
}
if ($distribution != "") {
// create configparser object // create configparser object
$configfiles = new ConfigParser($config_dir . '/' . $distribution . ".xml"); $configfiles = new ConfigParser($config_dir . '/' . $distribution . ".xml");
// get distro-info // get distro-info
$dist_display = getCompleteDistroName($configfiles); $dist_display = $configfiles->getCompleteDistroName();
// get all the services from the distro // get all the services from the distro
$services = $configfiles->getServices(); $services = $configfiles->getServices();
if ($service != "") {
$daemons = $services[$service]->getDaemons();
if ($daemon == "") {
foreach ($daemons as $di => $dd) {
$title = $dd->title;
if ($dd->default) {
$title = $title . " (" . strtolower($lng['panel']['default']) . ")";
}
$daemons_select .= makeoption($title, $di);
}
}
} else { } else {
foreach ($services as $si => $sd) {
$services_select .= makeoption($sd->title, $si);
}
}
} else {
// show list of available distro's // show list of available distro's
$distros = glob($config_dir . '*.xml'); $distros = glob($config_dir . '*.xml');
// tmp array
$distributions_select_data = array();
// read in all the distros // read in all the distros
foreach ($distros as $_distribution) { foreach ($distros as $_distribution) {
// get configparser object // get configparser object
$dist = new ConfigParser($_distribution); $dist = new ConfigParser($_distribution);
// get distro-info
$dist_display = getCompleteDistroName($dist);
// store in tmp array // store in tmp array
$distributions_select_data[$dist_display] = str_replace(".xml", "", strtolower(basename($_distribution))); $distributions_select[str_replace(".xml", "", strtolower(basename($_distribution)))] = $dist->getCompleteDistroName();
} }
// sort by distribution name // sort by distribution name
ksort($distributions_select_data); asort($distributions_select);
foreach ($distributions_select_data as $dist_display => $dist_index) {
// create select-box-option
$distributions_select .= makeoption($dist_display, $dist_index);
}
} }
if ($distribution != "" && $service != "" && $daemon != "") { if ($distribution != "" && isset($_POST['finish'])) {
unset($_POST['finish']);
unset($_POST['csrf_token']);
$params = $_POST;
$params['distro'] = $distribution;
$params['system'] = [];
foreach ($_POST['system'] as $sysdaemon) {
$params['system'][] = $sysdaemon;
}
$params_content = json_encode($params);
$params_filename = FileDir::makeCorrectFile(Froxlor::getInstallDir() . 'install/' . Froxlor::genSessionId() . '.json');
file_put_contents($params_filename, $params_content);
$confarr = $daemons[$daemon]->getConfig(); UI::twigBuffer('settings/configuration-final.html.twig', [
'distribution' => $distribution,
$configpage = ''; // alert
'type' => 'info',
$distro_editor = $configfiles->distributionEditor; 'alert_msg' => lng('admin.configfiles.finishnote'),
'basedir' => Froxlor::getInstallDir(),
$commands_pre = ""; 'params_filename' => $params_filename
$commands_file = ""; ]);
$commands_post = "";
$lasttype = '';
$commands = '';
foreach ($confarr as $idx => $action) {
if ($lasttype != '' && $lasttype != $action['type']) {
$commands = trim($commands);
$numbrows = count(explode("\n", $commands));
eval("\$configpage.=\"" . getTemplate("configfiles/configfiles_commands") . "\";");
$lasttype = '';
$commands = '';
}
switch ($action['type']) {
case "install":
$commands .= strtr($action['content'], $replace_arr) . "\n";
$lasttype = "install";
break;
case "command":
$commands .= strtr($action['content'], $replace_arr) . "\n";
$lasttype = "command";
break;
case "file":
if (array_key_exists('content', $action)) {
$commands_file = getFileContentContainer($action['content'], $replace_arr, $action['name'], $distro_editor);
} elseif (array_key_exists('subcommands', $action)) {
foreach ($action['subcommands'] as $fileaction) {
if (array_key_exists('execute', $fileaction) && $fileaction['execute'] == "pre") {
$commands_pre .= $fileaction['content'] . "\n";
} elseif (array_key_exists('execute', $fileaction) && $fileaction['execute'] == "post") {
$commands_post .= $fileaction['content'] . "\n";
} elseif ($fileaction['type'] == 'file') {
$commands_file = getFileContentContainer($fileaction['content'], $replace_arr, $action['name'], $distro_editor);
}
}
}
$realname = $action['name'];
$commands = trim($commands_pre);
if ($commands != "") {
$numbrows = count(explode("\n", $commands));
eval("\$commands_pre=\"" . getTemplate("configfiles/configfiles_commands") . "\";");
}
$commands = trim($commands_post);
if ($commands != "") {
$numbrows = count(explode("\n", $commands));
eval("\$commands_post=\"" . getTemplate("configfiles/configfiles_commands") . "\";");
}
eval("\$configpage.=\"" . getTemplate("configfiles/configfiles_subfileblock") . "\";");
$commands = '';
$commands_pre = '';
$commands_post = '';
break;
}
}
$commands = trim($commands);
if ($commands != '') {
$numbrows = count(explode("\n", $commands));
eval("\$configpage.=\"" . getTemplate("configfiles/configfiles_commands") . "\";");
}
eval("echo \"" . getTemplate("configfiles/configfiles") . "\";");
} else { } else {
eval("echo \"" . getTemplate("configfiles/wizard") . "\";"); 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 { } else {
die('not allowed to see this page'); $cfg_formfield = [
// redirect or similar here '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') : '')
]);
}
} }
// helper functions UI::twigOutputBuffer();
function getFileContentContainer($file_content, &$replace_arr, $realname, $distro_editor) } else {
{ Response::redirectTo('admin_index.php');
$files = "";
$file_content = trim($file_content);
if ($file_content != '') {
$file_content = strtr($file_content, $replace_arr);
$file_content = htmlspecialchars($file_content);
$numbrows = count(explode("\n", $file_content));
eval("\$files=\"" . getTemplate("configfiles/configfiles_file") . "\";");
}
return $files;
}
function getCompleteDistroName($cparser)
{
// get distro-info
$dist_display = $cparser->distributionName;
if ($cparser->distributionCodename != '') {
$dist_display .= " " . $cparser->distributionCodename;
}
if ($cparser->distributionVersion != '') {
$dist_display .= " (" . $cparser->distributionVersion . ")";
}
if ($cparser->deprecated) {
$dist_display .= " [deprecated]";
}
return $dist_display;
} }

View File

@@ -4,135 +4,90 @@
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Froxlor team <team@froxlor.org> (2010-) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @package Panel * 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
*/ */
define('AREA', 'admin'); const AREA = 'admin';
require './lib/init.php'; require __DIR__ . '/lib/init.php';
if (isset($_POST['id'])) { use Froxlor\Api\Commands\Cronjobs;
$id = intval($_POST['id']); use Froxlor\FroxlorLogger;
} elseif(isset($_GET['id'])) { use Froxlor\UI\Collection;
$id = intval($_GET['id']); use Froxlor\UI\Listing;
} use Froxlor\UI\Panel\UI;
use Froxlor\UI\Request;
use Froxlor\UI\Response;
if ($page == 'cronjobs' || $page == 'overview') { $id = (int)Request::any('id');
if (($page == 'cronjobs' || $page == 'overview') && $userinfo['change_serversettings'] == '1') {
if ($action == '') { if ($action == '') {
$log->logAction(ADM_ACTION, LOG_NOTICE, 'viewed admin_cronjobs'); $log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, 'viewed admin_cronjobs');
$fields = array( try {
'c.lastrun' => $lng['cron']['lastrun'], $cron_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/admin/tablelisting.cronjobs.php';
'c.interval' => $lng['cron']['interval'], $collection = (new Collection(Cronjobs::class, $userinfo))
'c.isactive' => $lng['cron']['isactive'] ->withPagination($cron_list_data['cron_list']['columns'], $cron_list_data['cron_list']['default_sorting']);
); } catch (Exception $e) {
$paging = new paging($userinfo, TABLE_PANEL_CRONRUNS, $fields); Response::dynamicError($e->getMessage());
$crons = '';
$result_stmt = Database::prepare("SELECT `c`.* FROM `" . TABLE_PANEL_CRONRUNS . "` `c` ORDER BY `module` ASC, `cronfile` ASC");
Database::pexecute($result_stmt);
$paging->setEntries(Database::num_rows());
$sortcode = $paging->getHtmlSortCode($lng);
$arrowcode = $paging->getHtmlArrowCode($filename . '?page=' . $page . '&s=' . $s);
$searchcode = $paging->getHtmlSearchCode($lng);
$pagingcode = $paging->getHtmlPagingCode($filename . '?page=' . $page . '&s=' . $s);
$i = 0;
$count = 0;
$cmod = '';
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
if ($cmod != $row['module']) {
$_mod = explode("/", $row['module']);
$module = ucfirst($_mod[1]);
eval("\$crons.=\"" . getTemplate('cronjobs/cronjobs_cronjobmodule') . "\";");
$cmod = $row['module'];
}
if ($paging->checkDisplay($i)) {
$row = htmlentities_array($row);
$row['lastrun'] = date('d.m.Y H:i', $row['lastrun']);
$row['isactive'] = ((int)$row['isactive'] == 1) ? $lng['panel']['yes'] : $lng['panel']['no'];
$description = $lng['crondesc'][$row['desc_lng_key']];
eval("\$crons.=\"" . getTemplate('cronjobs/cronjobs_cronjob') . "\";");
$count++;
} }
$i++; UI::view('user/table-note.html.twig', [
} 'listing' => Listing::format($collection, $cron_list_data, 'cron_list'),
// alert-box
eval("echo \"" . getTemplate('cronjobs/cronjobs') . "\";"); 'type' => 'warning',
'alert_msg' => lng('cron.changewarning')
]);
} elseif ($action == 'new') { } elseif ($action == 'new') {
/* /*
* @TODO later * @TODO later
*/ */
} elseif ($action == 'edit' && $id != 0) { } elseif ($action == 'edit' && $id != 0) {
$result_stmt = Database::prepare("SELECT * FROM `" . TABLE_PANEL_CRONRUNS . "` WHERE `id`= :id"); try {
Database::pexecute($result_stmt, array('id' => $id)); $json_result = Cronjobs::getLocal($userinfo, [
$result = $result_stmt->fetch(PDO::FETCH_ASSOC); 'id' => $id
])->get();
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
$result = json_decode($json_result, true)['data'];
if ($result['cronfile'] != '') { if ($result['cronfile'] != '') {
if (isset($_POST['send']) && $_POST['send'] == 'send') { if (isset($_POST['send']) && $_POST['send'] == 'send') {
$isactive = isset($_POST['isactive']) ? 1 : 0; try {
$interval_value = validate($_POST['interval_value'], 'interval_value', '/^([0-9]+)$/Di', 'stringisempty'); Cronjobs::getLocal($userinfo, $_POST)->update();
$interval_interval = validate($_POST['interval_interval'], 'interval_interval'); } catch (Exception $e) {
Response::dynamicError($e->getMessage());
if ($isactive != 1) {
$isactive = 0;
} }
Response::redirectTo($filename, [
$interval = $interval_value . ' ' . strtoupper($interval_interval); 'page' => $page
]);
$upd = Database::prepare("
UPDATE `" . TABLE_PANEL_CRONRUNS . "`
SET `isactive` = :isactive, `interval` = :int
WHERE `id` = :id"
);
Database::pexecute($upd, array('isactive' => $isactive, 'int' => $interval, 'id' => $id));
// insert task to re-generate the cron.d-file
inserttask('99');
redirectTo($filename, array('page' => $page, 's' => $s));
} else { } else {
// interval
$interval_nfo = explode(' ', $result['interval']);
$interval_value = $interval_nfo[0];
$interval_interval = '';
$interval_interval .= makeoption($lng['cronmgmt']['minutes'], 'MINUTE', $interval_nfo[1]);
$interval_interval .= makeoption($lng['cronmgmt']['hours'], 'HOUR', $interval_nfo[1]);
$interval_interval .= makeoption($lng['cronmgmt']['days'], 'DAY', $interval_nfo[1]);
$interval_interval .= makeoption($lng['cronmgmt']['weeks'], 'WEEK', $interval_nfo[1]);
$interval_interval .= makeoption($lng['cronmgmt']['months'], 'MONTH', $interval_nfo[1]);
// end of interval
$change_cronfile = false;
if (substr($result['module'], 0, strpos($result['module'], '/')) != 'froxlor') {
$change_cronfile = true;
}
$cronjobs_edit_data = include_once dirname(__FILE__) . '/lib/formfields/admin/cronjobs/formfield.cronjobs_edit.php'; $cronjobs_edit_data = include_once dirname(__FILE__) . '/lib/formfields/admin/cronjobs/formfield.cronjobs_edit.php';
$cronjobs_edit_form = htmlform::genHTMLForm($cronjobs_edit_data);
$title = $cronjobs_edit_data['cronjobs_edit']['title']; UI::view('user/form.html.twig', [
$image = $cronjobs_edit_data['cronjobs_edit']['image']; 'formaction' => $linker->getLink(['section' => 'cronjobs', 'id' => $id]),
'formdata' => $cronjobs_edit_data['cronjobs_edit'],
eval("echo \"" . getTemplate('cronjobs/cronjob_edit') . "\";"); 'editid' => $id
]);
} }
} }
} } elseif ($action == 'delete' && $id != 0) {
elseif ($action == 'delete' && $id != 0) {
/* /*
* @TODO later * @TODO later
*/ */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -2,152 +2,142 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Panel
* *
* 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
*/ */
define('AREA', 'admin'); const AREA = 'admin';
require './lib/init.php'; require __DIR__ . '/lib/init.php';
use Froxlor\Api\Commands\Admins as Admins;
use Froxlor\Api\Commands\Froxlor as Froxlor;
use Froxlor\CurrentUser;
use Froxlor\Database\Database;
use Froxlor\FroxlorLogger;
use Froxlor\Settings;
use Froxlor\System\Cronjob;
use Froxlor\System\Crypt;
use Froxlor\UI\Panel\UI;
use Froxlor\UI\Request;
use Froxlor\UI\Response;
use Froxlor\Validate\Validate;
use Froxlor\Language;
$id = (int)Request::any('id');
if ($action == 'logout') { if ($action == 'logout') {
$log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, "logged out");
unset($_SESSION['userinfo']);
CurrentUser::setData();
session_destroy();
$log->logAction(ADM_ACTION, LOG_NOTICE, "logged out"); Response::redirectTo('index.php');
} elseif ($action == 'suback') {
$params = array('adminid' => (int)$userinfo['adminid']); if (is_array(CurrentUser::getField('switched_user'))) {
$result = CurrentUser::getData();
if (Settings::Get('session.allow_multiple_login') == '1') { $result = $result['switched_user'];
$stmt = Database::prepare("DELETE FROM `" . TABLE_PANEL_SESSIONS . "` CurrentUser::setData($result);
WHERE `userid` = :adminid $target = (isset($_GET['target']) ? $_GET['target'] : 'index');
AND `adminsession` = '1' $redirect = "admin_" . $target . ".php";
AND `hash` = :hash" if (!file_exists(\Froxlor\Froxlor::getInstallDir() . "/" . $redirect)) {
); $redirect = "admin_index.php";
$params['hash'] = $s; }
Response::redirectTo($redirect, null, true);
} else { } else {
$stmt = Database::prepare("DELETE FROM `" . TABLE_PANEL_SESSIONS . "` Response::dynamicError("Cannot change back - You've never switched to another user :-)");
WHERE `userid` = :adminid
AND `adminsession` = '1'"
);
} }
Database::pexecute($stmt, $params);
redirectTo('index.php');
}
if (isset($_POST['id'])) {
$id = intval($_POST['id']);
} elseif(isset($_GET['id'])) {
$id = intval($_GET['id']);
} }
if ($page == 'overview') { if ($page == 'overview') {
$log->logAction(ADM_ACTION, LOG_NOTICE, "viewed admin_index"); $log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, "viewed admin_index");
$params = [];
if ($userinfo['customers_see_all'] == '0') {
$params = [
'adminid' => $userinfo['adminid']
];
}
$overview_stmt = Database::prepare("SELECT COUNT(*) AS `number_customers`, $overview_stmt = Database::prepare("SELECT COUNT(*) AS `number_customers`,
SUM(case when `diskspace` > 0 then `diskspace` else 0 end) AS `diskspace_assigned`,
SUM(`diskspace_used`) AS `diskspace_used`, SUM(`diskspace_used`) AS `diskspace_used`,
SUM(case when `mysqls` > 0 then `mysqls` else 0 end) AS `mysqls_assigned`,
SUM(`mysqls_used`) AS `mysqls_used`, SUM(`mysqls_used`) AS `mysqls_used`,
SUM(case when `emails` > 0 then `emails` else 0 end) AS `emails_assigned`,
SUM(`emails_used`) AS `emails_used`, SUM(`emails_used`) AS `emails_used`,
SUM(case when `email_accounts` > 0 then `email_accounts` else 0 end) AS `email_accounts_assigned`,
SUM(`email_accounts_used`) AS `email_accounts_used`, SUM(`email_accounts_used`) AS `email_accounts_used`,
SUM(case when `email_forwarders` > 0 then `email_forwarders` else 0 end) AS `email_forwarders_assigned`,
SUM(`email_forwarders_used`) AS `email_forwarders_used`, SUM(`email_forwarders_used`) AS `email_forwarders_used`,
SUM(case when `email_quota` > 0 then `email_quota` else 0 end) AS `email_quota_assigned`,
SUM(`email_quota_used`) AS `email_quota_used`, SUM(`email_quota_used`) AS `email_quota_used`,
SUM(case when `ftps` > 0 then `ftps` else 0 end) AS `ftps_assigned`,
SUM(`ftps_used`) AS `ftps_used`, SUM(`ftps_used`) AS `ftps_used`,
SUM(`tickets_used`) AS `tickets_used`, SUM(case when `subdomains` > 0 then `subdomains` else 0 end) AS `subdomains_assigned`,
SUM(`subdomains_used`) AS `subdomains_used`, SUM(`subdomains_used`) AS `subdomains_used`,
SUM(case when `traffic` > 0 then `traffic` else 0 end) AS `traffic_assigned`,
SUM(`traffic_used`) AS `traffic_used` SUM(`traffic_used`) AS `traffic_used`
FROM `" . TABLE_PANEL_CUSTOMERS . "`" . ($userinfo['customers_see_all'] ? '' : " WHERE `adminid` = :adminid ")); FROM `" . TABLE_PANEL_CUSTOMERS . "`" . ($userinfo['customers_see_all'] ? '' : " WHERE `adminid` = :adminid "));
$overview = Database::pexecute_first($overview_stmt, array('adminid' => $userinfo['adminid'])); $overview = Database::pexecute_first($overview_stmt, $params);
$dec_places = Settings::Get('panel.decimal_places'); $userinfo['diskspace_bytes'] = ($userinfo['diskspace'] > -1) ? $userinfo['diskspace'] * 1024 : -1;
$overview['traffic_used'] = round($overview['traffic_used'] / (1024 * 1024), $dec_places); $overview['diskspace_bytes'] = $overview['diskspace_assigned'] * 1024;
$overview['diskspace_used'] = round($overview['diskspace_used'] / 1024, $dec_places); $overview['diskspace_bytes_used'] = $overview['diskspace_used'] * 1024;
$userinfo['traffic_bytes'] = ($userinfo['traffic'] > -1) ? $userinfo['traffic'] * 1024 : -1;
$overview['traffic_bytes'] = $overview['traffic_assigned'] * 1024;
$overview['traffic_bytes_used'] = $overview['traffic_used'] * 1024;
$number_domains_stmt = Database::prepare(" $number_domains_stmt = Database::prepare("
SELECT COUNT(*) AS `number_domains` FROM `" . TABLE_PANEL_DOMAINS . "` SELECT COUNT(*) AS `number_domains` FROM `" . TABLE_PANEL_DOMAINS . "`
WHERE `parentdomainid`='0'" . ($userinfo['customers_see_all'] ? '' : " AND `adminid` = :adminid") WHERE `parentdomainid`='0'" . ($userinfo['customers_see_all'] ? '' : " AND `adminid` = :adminid"));
); $number_domains = Database::pexecute_first($number_domains_stmt, $params);
$number_domains = Database::pexecute_first($number_domains_stmt, array('adminid' => $userinfo['adminid']));
$overview['number_domains'] = $number_domains['number_domains']; $overview['number_domains'] = $number_domains['number_domains'];
$phpversion = phpversion(); if ((isset($_GET['lookfornewversion']) && $_GET['lookfornewversion'] == 'yes') || (isset($lookfornewversion) && $lookfornewversion == 'yes')) {
$mysqlserverversion = Database::getAttribute(PDO::ATTR_SERVER_VERSION); try {
$webserverinterface = strtoupper(@php_sapi_name()); $json_result = Froxlor::getLocal($userinfo)->checkUpdate();
} catch (Exception $e) {
if ((isset($_GET['lookfornewversion']) && $_GET['lookfornewversion'] == 'yes') Response::dynamicError($e->getMessage());
|| (isset($lookfornewversion) && $lookfornewversion == 'yes')
) {
$update_check_uri = 'http://version.froxlor.org/Froxlor/legacy/' . $version;
if (ini_get('allow_url_fopen')) {
$latestversion = @file($update_check_uri);
if (isset($latestversion[0])) {
$latestversion = explode('|', $latestversion[0]);
if (is_array($latestversion)
&& count($latestversion) >= 1
) {
$_version = $latestversion[0];
$_message = isset($latestversion[1]) ? $latestversion[1] : '';
$_link = isset($latestversion[2]) ? $latestversion[2] : htmlspecialchars($filename . '?s=' . urlencode($s) . '&page=' . urlencode($page) . '&lookfornewversion=yes');
// add the branding so debian guys are not gettings confused
// about their version-number
$lookfornewversion_lable = $_version.$branding;
$lookfornewversion_link = $_link;
$lookfornewversion_addinfo = $_message;
// not numeric -> error-message
if (!preg_match('/^((\d+\\.)(\d+\\.)(\d+\\.)?(\d+)?(\-(svn|dev|rc)(\d+))?)$/', $_version)) {
// check for customized version to not output
// "There is a newer version of froxlor" besides the error-message
$isnewerversion = 2;
} elseif (version_compare2($version, $_version) == -1) {
$isnewerversion = 1;
} else {
$isnewerversion = 0;
} }
$result = json_decode($json_result, true)['data'];
$lookfornewversion_lable = $result['version'];
$lookfornewversion_link = $result['link'];
$lookfornewversion_message = $result['message'];
$lookfornewversion_addinfo = $result['additional_info'];
$isnewerversion = $result['isnewerversion'];
} else { } else {
redirectTo($update_check_uri.'/pretty', NULL, false); $lookfornewversion_lable = lng('admin.lookfornewversion.clickhere');
} $lookfornewversion_link = htmlspecialchars($filename . '?page=' . urlencode($page) . '&lookfornewversion=yes');
} else { $lookfornewversion_message = '';
redirectTo($update_check_uri.'/pretty', NULL, false);
}
} else {
redirectTo($update_check_uri.'/pretty', NULL, false);
}
} else {
$lookfornewversion_lable = $lng['admin']['lookfornewversion']['clickhere'];
$lookfornewversion_link = htmlspecialchars($filename . '?s=' . urlencode($s) . '&page=' . urlencode($page) . '&lookfornewversion=yes');
$lookfornewversion_addinfo = ''; $lookfornewversion_addinfo = '';
$isnewerversion = 0; $isnewerversion = 0;
} }
$dec_places = Settings::Get('panel.decimal_places'); $cron_last_runs = Cronjob::getCronjobsLastRun();
$userinfo['diskspace'] = round($userinfo['diskspace'] / 1024, $dec_places); $outstanding_tasks = Cronjob::getOutstandingTasks();
$userinfo['diskspace_used'] = round($userinfo['diskspace_used'] / 1024, $dec_places);
$userinfo['traffic'] = round($userinfo['traffic'] / (1024 * 1024), $dec_places);
$userinfo['traffic_used'] = round($userinfo['traffic_used'] / (1024 * 1024), $dec_places);
$userinfo = str_replace_array('-1', $lng['customer']['unlimited'], $userinfo, 'customers domains diskspace traffic mysqls emails email_accounts email_forwarders email_quota ftps tickets subdomains');
$userinfo['custom_notes'] = ($userinfo['custom_notes'] != '') ? nl2br($userinfo['custom_notes']) : ''; // additional sys-infos
$cron_last_runs = getCronjobsLastRun();
$outstanding_tasks = getOutstandingTasks();
$system_hostname = gethostname();
$meminfo = explode("\n", @file_get_contents("/proc/meminfo")); $meminfo = explode("\n", @file_get_contents("/proc/meminfo"));
$memory = ""; $memory = "";
for ($i = 0; $i < sizeof($meminfo); ++$i) { for ($i = 0; $i < count($meminfo); ++$i) {
if (substr($meminfo[$i], 0, 3) === "Mem") { if (substr($meminfo[$i], 0, 3) === "Mem") {
$memory .= $meminfo[$i] . PHP_EOL; $memory .= $meminfo[$i] . PHP_EOL;
} }
@@ -158,29 +148,22 @@ if ($page == 'overview') {
$load = number_format($loadArray[0], 2, '.', '') . " / " . number_format($loadArray[1], 2, '.', '') . " / " . number_format($loadArray[2], 2, '.', ''); $load = number_format($loadArray[0], 2, '.', '') . " / " . number_format($loadArray[1], 2, '.', '') . " / " . number_format($loadArray[2], 2, '.', '');
} else { } else {
$load = @file_get_contents('/proc/loadavg'); $load = @file_get_contents('/proc/loadavg');
if (!$load) { if (!$load) {
$load = $lng['admin']['noloadavailable']; $load = lng('admin.noloadavailable');
} }
} }
$kernel = '';
if (function_exists('posix_uname')) { if (function_exists('posix_uname')) {
$showkernel = 1;
$kernel_nfo = posix_uname(); $kernel_nfo = posix_uname();
$kernel = $kernel_nfo['release'] . ' (' . $kernel_nfo['machine'] . ')'; $kernel = $kernel_nfo['release'] . ' (' . $kernel_nfo['machine'] . ')';
} else {
$showkernel = 0;
$kernel = '';
} }
// Try to get the uptime // Try to get the uptime
// First: With exec (let's hope it's enabled for the Froxlor - vHost) // First: With exec (let's hope it's enabled for the Froxlor - vHost)
$uptime_array = explode(" ", @file_get_contents("/proc/uptime")); $uptime_array = explode(" ", @file_get_contents("/proc/uptime"));
$uptime = '';
if (is_array($uptime_array) if (is_array($uptime_array) && isset($uptime_array[0]) && is_numeric($uptime_array[0])) {
&& isset($uptime_array[0])
&& is_numeric($uptime_array[0])
) {
// Some calculatioon to get a nicly formatted display // Some calculatioon to get a nicly formatted display
$seconds = round($uptime_array[0], 0); $seconds = round($uptime_array[0], 0);
$minutes = $seconds / 60; $minutes = $seconds / 60;
@@ -190,227 +173,136 @@ if ($page == 'overview') {
$minutes = floor($minutes - ($days * 24 * 60) - ($hours * 60)); $minutes = floor($minutes - ($days * 24 * 60) - ($hours * 60));
$seconds = floor($seconds - ($days * 24 * 60 * 60) - ($hours * 60 * 60) - ($minutes * 60)); $seconds = floor($seconds - ($days * 24 * 60 * 60) - ($hours * 60 * 60) - ($minutes * 60));
$uptime = "{$days}d, {$hours}h, {$minutes}m, {$seconds}s"; $uptime = "{$days}d, {$hours}h, {$minutes}m, {$seconds}s";
// Just cleanup // Just cleanup
unset($uptime_array, $seconds, $minutes, $hours, $days); unset($uptime_array, $seconds, $minutes, $hours, $days);
} else {
// Nothing of the above worked, show an error :/
$uptime = '';
} }
eval("echo \"" . getTemplate("index/index") . "\";"); $sysinfo = [
'webserver' => $_SERVER['SERVER_SOFTWARE'] ?? 'unknown',
'phpversion' => phpversion(),
'mysqlserverversion' => Database::getAttribute(PDO::ATTR_SERVER_VERSION),
'phpsapi' => strtoupper(@php_sapi_name()),
'hostname' => gethostname(),
'memory' => $memory,
'load' => $load,
'kernel' => $kernel,
'uptime' => $uptime
];
UI::twig()->addGlobal('userinfo', $userinfo);
UI::view('user/index.html.twig', [
'sysinfo' => $sysinfo,
'overview' => $overview,
'outstanding_tasks' => $outstanding_tasks,
'cron_last_runs' => $cron_last_runs
]);
} elseif ($page == 'change_password') { } elseif ($page == 'change_password') {
if (isset($_POST['send']) && $_POST['send'] == 'send') {
$old_password = Validate::validate($_POST['old_password'], 'old password');
if (isset($_POST['send']) if (!Crypt::validatePasswordLogin($userinfo, $old_password, TABLE_PANEL_ADMINS, 'adminid')) {
&& $_POST['send'] == 'send' Response::standardError('oldpasswordnotcorrect');
) {
$old_password = validate($_POST['old_password'], 'old password');
if (!validatePasswordLogin($userinfo,$old_password,TABLE_PANEL_ADMINS,'adminid')) {
standard_error('oldpasswordnotcorrect');
} }
$new_password = validate($_POST['new_password'], 'new password'); try {
$new_password_confirm = validate($_POST['new_password_confirm'], 'new password confirm'); $new_password = Crypt::validatePassword($_POST['new_password'], 'new password');
$new_password_confirm = Crypt::validatePassword($_POST['new_password_confirm'], 'new password confirm');
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
if ($old_password == '') { if ($old_password == '') {
standard_error(array('stringisempty', 'oldpassword')); Response::standardError([
'stringisempty',
'changepassword.old_password'
]);
} elseif ($new_password == '') { } elseif ($new_password == '') {
standard_error(array('stringisempty', 'newpassword')); Response::standardError([
'stringisempty',
'changepassword.new_password'
]);
} elseif ($new_password_confirm == '') { } elseif ($new_password_confirm == '') {
standard_error(array('stringisempty', 'newpasswordconfirm')); Response::standardError([
'stringisempty',
'changepassword.new_password_confirm'
]);
} elseif ($new_password != $new_password_confirm) { } elseif ($new_password != $new_password_confirm) {
standard_error('newpasswordconfirmerror'); Response::standardError('newpasswordconfirmerror');
} else { } else {
$chgpwd_stmt = Database::prepare(" try {
UPDATE `" . TABLE_PANEL_ADMINS . "` Admins::getLocal($userinfo, [
SET `password`= :newpasswd 'id' => $userinfo['adminid'],
WHERE `adminid`= :adminid" 'admin_password' => $new_password
); ])->update();
Database::pexecute($chgpwd_stmt, array( } catch (Exception $e) {
'newpasswd' => makeCryptPassword($new_password), Response::dynamicError($e->getMessage());
'adminid' => (int)$userinfo['adminid'] }
)); $log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, 'changed password');
$log->logAction(ADM_ACTION, LOG_NOTICE, 'changed password'); Response::redirectTo($filename);
redirectTo($filename, Array('s' => $s));
} }
} else { } else {
eval("echo \"" . getTemplate("index/change_password") . "\";"); UI::view('user/change_password.html.twig');
} }
} elseif ($page == 'change_language') { } elseif ($page == 'change_language') {
$languages = Language::getLanguages();
if (isset($_POST['send']) if (isset($_POST['send']) && $_POST['send'] == 'send') {
&& $_POST['send'] == 'send' $def_language = Validate::validate($_POST['def_language'], 'default language');
) {
$def_language = validate($_POST['def_language'], 'default language');
if (isset($languages[$def_language])) { if (isset($languages[$def_language])) {
$lng_stmt = Database::prepare(" try {
UPDATE `" . TABLE_PANEL_ADMINS . "` Admins::getLocal($userinfo, [
SET `def_language`= :deflng 'id' => $userinfo['adminid'],
WHERE `adminid`= :adminid" 'def_language' => $def_language
); ])->update();
Database::pexecute($lng_stmt, array( CurrentUser::setField('language', $def_language);
'deflng' => $def_language, } catch (Exception $e) {
'adminid' => (int)$userinfo['adminid'] Response::dynamicError($e->getMessage());
));
$lng_stmt = Database::prepare("
UPDATE `" . TABLE_PANEL_SESSIONS . "`
SET `language`= :lng
WHERE `hash`= :hash"
);
Database::pexecute($lng_stmt, array(
'lng' => $def_language,
'hash' => $s
));
} }
}
$log->logAction(ADM_ACTION, LOG_NOTICE, "changed his/her default language to '" . $def_language . "'"); $log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, "changed his/her default language to '" . $def_language . "'");
redirectTo($filename, array('s' => $s)); Response::redirectTo($filename);
} else { } else {
$language_options = '';
$default_lang = Settings::Get('panel.standardlanguage'); $default_lang = Settings::Get('panel.standardlanguage');
if ($userinfo['def_language'] != '') { if ($userinfo['def_language'] != '') {
$default_lang = $userinfo['def_language']; $default_lang = $userinfo['def_language'];
} }
while (list($language_file, $language_name) = each($languages)) { UI::view('user/change_language.html.twig', [
$language_options.= makeoption($language_name, $language_file, $default_lang, true); 'languages' => $languages,
'default_lang' => $default_lang
]);
} }
eval("echo \"" . getTemplate("index/change_language") . "\";");
}
} elseif ($page == 'change_theme') { } elseif ($page == 'change_theme') {
if (isset($_POST['send']) && $_POST['send'] == 'send') {
$theme = Validate::validate($_POST['theme'], 'theme');
try {
Admins::getLocal($userinfo, [
'id' => $userinfo['adminid'],
'theme' => $theme
])->update();
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
if (isset($_POST['send']) $log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, "changed his/her theme to '" . $theme . "'");
&& $_POST['send'] == 'send' Response::redirectTo($filename);
) {
$theme = validate($_POST['theme'], 'theme');
$theme_stmt = Database::prepare("
UPDATE `" . TABLE_PANEL_ADMINS . "`
SET `theme`= :theme
WHERE `adminid`= :adminid"
);
Database::pexecute($theme_stmt, array(
'theme' => $theme,
'adminid' => (int)$userinfo['adminid']
));
$theme_stmt = Database::prepare("
UPDATE `" . TABLE_PANEL_SESSIONS . "`
SET `theme`= :theme
WHERE `hash`= :hash"
);
Database::pexecute($theme_stmt, array(
'theme' => $theme,
'hash' => $s
));
$log->logAction(ADM_ACTION, LOG_NOTICE, "changed his/her theme to '" . $theme . "'");
redirectTo($filename, array('s' => $s));
} else { } else {
$theme_options = '';
$default_theme = Settings::Get('panel.default_theme'); $default_theme = Settings::Get('panel.default_theme');
if ($userinfo['theme'] != '') { if ($userinfo['theme'] != '') {
$default_theme = $userinfo['theme']; $default_theme = $userinfo['theme'];
} }
$themes_avail = getThemes(); $themes_avail = UI::getThemes();
foreach ($themes_avail as $t => $d) {
$theme_options.= makeoption($d, $t, $default_theme, true); UI::view('user/change_theme.html.twig', [
} 'themes' => $themes_avail,
'default_theme' => $default_theme
eval("echo \"" . getTemplate("index/change_theme") . "\";"); ]);
}
} elseif ($page == 'send_error_report'
&& Settings::Get('system.allow_error_report_admin') == '1'
) {
// only show this if we really have an exception to report
if (isset($_GET['errorid'])
&& $_GET['errorid'] != ''
) {
$errid = $_GET['errorid'];
// read error file
$err_dir = makeCorrectDir(FROXLOR_INSTALL_DIR."/logs/");
$err_file = makeCorrectFile($err_dir."/".$errid."_sql-error.log");
if (file_exists($err_file)) {
$error_content = file_get_contents($err_file);
$error = explode("|", $error_content);
$_error = array(
'code' => str_replace("\n", "", substr($error[1], 5)),
'message' => str_replace("\n", "", substr($error[2], 4)),
'file' => str_replace("\n", "", substr($error[3], 5 + strlen(FROXLOR_INSTALL_DIR))),
'line' => str_replace("\n", "", substr($error[4], 5)),
'trace' => str_replace(FROXLOR_INSTALL_DIR, "", substr($error[5], 6))
);
// build mail-content
$mail_body = "Dear froxlor-team,\n\n";
$mail_body .= "the following error has been reported by a user:\n\n";
$mail_body .= "-------------------------------------------------------------\n";
$mail_body .= $_error['code'].' '.$_error['message']."\n\n";
$mail_body .= "File: ".$_error['file'].':'.$_error['line']."\n\n";
$mail_body .= "Trace:\n".trim($_error['trace'])."\n\n";
$mail_body .= "-------------------------------------------------------------\n\n";
$mail_body .= "Froxlor-version: ".$version."\n";
$mail_body .= "DB-version: ".$dbversion."\n\n";
$mail_body .= "End of report";
$mail_html = nl2br($mail_body);
// send actual report to dev-team
if (isset($_POST['send'])
&& $_POST['send'] == 'send'
) {
// send mail and say thanks
$_mailerror = false;
try {
$mail->Subject = '[Froxlor] Error report by user';
$mail->AltBody = $mail_body;
$mail->MsgHTML($mail_html);
$mail->AddAddress('error-reports@froxlor.org', 'Froxlor Developer Team');
$mail->Send();
} catch(phpmailerException $e) {
$mailerr_msg = $e->errorMessage();
$_mailerror = true;
} catch (Exception $e) {
$mailerr_msg = $e->getMessage();
$_mailerror = true;
}
if ($_mailerror) {
// error when reporting an error...LOLFUQ
standard_error('send_report_error', $mailerr_msg);
}
// finally remove error from fs
@unlink($err_file);
redirectTo($filename, array('s' => $s));
}
// show a nice summary of the error-report
// before actually sending anything
eval("echo \"" . getTemplate("index/send_error_report") . "\";");
} else {
redirectTo($filename, array('s' => $s));
}
} else {
redirectTo($filename, array('s' => $s));
} }
} elseif ($page == 'send_error_report' && Settings::Get('system.allow_error_report_admin') == '1') {
require_once __DIR__ . '/error_report.php';
} elseif ($page == 'apikeys' && Settings::Get('api.enabled') == 1) {
require_once __DIR__ . '/api_keys.php';
} elseif ($page == '2fa' && Settings::Get('2fa.enabled') == 1) {
require_once __DIR__ . '/2fa.php';
} }

View File

@@ -2,437 +2,152 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Panel
* *
* 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
*/ */
define('AREA', 'admin'); const AREA = 'admin';
require './lib/init.php'; require __DIR__ . '/lib/init.php';
if (isset($_POST['id'])) { use Froxlor\Api\Commands\IpsAndPorts;
$id = intval($_POST['id']); use Froxlor\FroxlorLogger;
} elseif(isset($_GET['id'])) { use Froxlor\PhpHelper;
$id = intval($_GET['id']); 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;
if ($page == 'ipsandports' $id = (int)Request::any('id');
|| $page == 'overview'
) {
// Do not display attributes that are not used by the current webserver
$websrv = Settings::Get('system.webserver');
$is_nginx = ($websrv == 'nginx');
$is_apache = ($websrv == 'apache2');
$is_apache24 = $is_apache && (Settings::Get('system.apache24') === '1');
if (($page == 'ipsandports' || $page == 'overview') && $userinfo['change_serversettings'] == '1') {
if ($action == '') { if ($action == '') {
$log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, "viewed admin_ipsandports");
$log->logAction(ADM_ACTION, LOG_NOTICE, "viewed admin_ipsandports"); try {
$fields = array( $ipsandports_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/admin/tablelisting.ipsandports.php';
'ip' => $lng['admin']['ipsandports']['ip'], $collection = (new Collection(IpsAndPorts::class, $userinfo))
'port' => $lng['admin']['ipsandports']['port'] ->withPagination($ipsandports_list_data['ipsandports_list']['columns'], $ipsandports_list_data['ipsandports_list']['default_sorting']);
); } catch (Exception $e) {
$paging = new paging($userinfo, TABLE_PANEL_IPSANDPORTS, $fields); Response::dynamicError($e->getMessage());
$ipsandports = '';
$result_stmt = Database::prepare("SELECT * FROM `" . TABLE_PANEL_IPSANDPORTS . "` " . $paging->getSqlWhere(false) . " " . $paging->getSqlOrderBy() . " " . $paging->getSqlLimit());
Database::pexecute($result_stmt);
$paging->setEntries(Database::num_rows());
$sortcode = $paging->getHtmlSortCode($lng);
$arrowcode = $paging->getHtmlArrowCode($filename . '?page=' . $page . '&s=' . $s);
$searchcode = $paging->getHtmlSearchCode($lng);
$pagingcode = $paging->getHtmlPagingCode($filename . '?page=' . $page . '&s=' . $s);
$i = 0;
$count = 0;
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
if ($paging->checkDisplay($i)) {
$row = htmlentities_array($row);
if (filter_var($row['ip'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
$row['ip'] = '[' . $row['ip'] . ']';
}
eval("\$ipsandports.=\"" . getTemplate("ipsandports/ipsandports_ipandport") . "\";");
$count++;
}
$i++;
} }
eval("echo \"" . getTemplate("ipsandports/ipsandports") . "\";"); UI::view('user/table.html.twig', [
'listing' => Listing::format($collection, $ipsandports_list_data, 'ipsandports_list'),
} elseif($action == 'delete' 'actions_links' => [
&& $id != 0 [
) { 'href' => $linker->getLink(['section' => 'ipsandports', 'page' => $page, 'action' => 'add']),
$result_stmt = Database::prepare("SELECT `id`, `ip`, `port` FROM `" . TABLE_PANEL_IPSANDPORTS . "` WHERE `id` = :id"); 'label' => lng('admin.ipsandports.add')
$result = Database::pexecute_first($result_stmt, array('id' => $id)); ]
]
if (isset($result['id']) ]);
&& $result['id'] == $id } elseif ($action == 'delete' && $id != 0) {
) { try {
$result_checkdomain_stmt = Database::prepare(" $json_result = IpsAndPorts::getLocal($userinfo, [
SELECT `id_domain` as `id` FROM `" . TABLE_DOMAINTOIP . "` WHERE `id_ipandports` = :id"
);
$result_checkdomain = Database::pexecute_first($result_checkdomain_stmt, array('id' => $id));
if ($result_checkdomain['id'] == '') {
if (!in_array($result['id'], explode(',', Settings::Get('system.defaultip')))) {
$result_sameipotherport_stmt = Database::prepare("
SELECT `id` FROM `" . TABLE_PANEL_IPSANDPORTS . "`
WHERE `ip` = :ip AND `id` <> :id"
);
$result_sameipotherport = Database::pexecute_first($result_sameipotherport_stmt, array('id' => $id, 'ip' => $result['ip']));
if (($result['ip'] != Settings::Get('system.ipaddress'))
|| ($result['ip'] == Settings::Get('system.ipaddress')
&& $result_sameipotherport['id'] != '')
) {
$result_stmt = Database::prepare("
SELECT `ip`, `port` FROM `" . TABLE_PANEL_IPSANDPORTS . "`
WHERE `id` = :id"
);
$result = Database::pexecute_first($result_stmt, array('id' => $id));
if ($result['ip'] != '') {
if (isset($_POST['send'])
&& $_POST['send'] == 'send'
) {
$del_stmt = Database::prepare("
DELETE FROM `" . TABLE_PANEL_IPSANDPORTS . "`
WHERE `id` = :id"
);
Database::pexecute($del_stmt, array('id' => $id));
// also, remove connections to domains (multi-stack)
$del_stmt = Database::prepare("
DELETE FROM `".TABLE_DOMAINTOIP."` WHERE `id_ipandports` = :id"
);
Database::pexecute($del_stmt, array('id' => $id));
$log->logAction(ADM_ACTION, LOG_WARNING, "deleted IP/port '" . $result['ip'] . ":" . $result['port'] . "'");
inserttask('1');
// Using nameserver, insert a task which rebuilds the server config
inserttask('4');
redirectTo($filename, array('page' => $page, 's' => $s));
} else {
ask_yesno('admin_ip_reallydelete', $filename, array('id' => $id, 'page' => $page, 'action' => $action), $result['ip'] . ':' . $result['port']);
}
}
} else {
standard_error('cantdeletesystemip');
}
} else {
standard_error('cantdeletedefaultip');
}
} else {
standard_error('ipstillhasdomains');
}
}
} elseif($action == 'add') {
if (isset($_POST['send'])
&& $_POST['send'] == 'send'
) {
$ip = validate_ip($_POST['ip']);
$port = validate($_POST['port'], 'port', '/^(([1-9])|([1-9][0-9])|([1-9][0-9][0-9])|([1-9][0-9][0-9][0-9])|([1-5][0-9][0-9][0-9][0-9])|(6[0-4][0-9][0-9][0-9])|(65[0-4][0-9][0-9])|(655[0-2][0-9])|(6553[0-5]))$/Di', array('stringisempty', 'myport'));
$listen_statement = isset($_POST['listen_statement']) ? 1 : 0;
$namevirtualhost_statement = isset($_POST['namevirtualhost_statement']) ? 1 : 0;
$vhostcontainer = isset($_POST['vhostcontainer']) ? 1 : 0;
$specialsettings = validate(str_replace("\r\n", "\n", $_POST['specialsettings']), 'specialsettings', '/^[^\0]*$/');
$vhostcontainer_servername_statement = isset($_POST['vhostcontainer_servername_statement']) ? 1 : 0;
$default_vhostconf_domain = validate(str_replace("\r\n", "\n", $_POST['default_vhostconf_domain']), 'default_vhostconf_domain', '/^[^\0]*$/');
$docroot = validate($_POST['docroot'], 'docroot');
if ((int)Settings::Get('system.use_ssl') == 1) {
$ssl = isset($_POST['ssl']) ? intval($_POST['ssl']) : 0;
$ssl_cert_file = validate($_POST['ssl_cert_file'], 'ssl_cert_file');
$ssl_key_file = validate($_POST['ssl_key_file'], 'ssl_key_file');
$ssl_ca_file = validate($_POST['ssl_ca_file'], 'ssl_ca_file');
$ssl_cert_chainfile = validate($_POST['ssl_cert_chainfile'], 'ssl_cert_chainfile');
} else {
$ssl = 0;
$ssl_cert_file = '';
$ssl_key_file = '';
$ssl_ca_file = '';
$ssl_cert_chainfile = '';
}
if ($listen_statement != '1') {
$listen_statement = '0';
}
if ($namevirtualhost_statement != '1') {
$namevirtualhost_statement = '0';
}
if ($vhostcontainer != '1') {
$vhostcontainer = '0';
}
if ($vhostcontainer_servername_statement != '1') {
$vhostcontainer_servername_statement = '0';
}
if ($ssl != '1') {
$ssl = '0';
}
if ($ssl_cert_file != '') {
$ssl_cert_file = makeCorrectFile($ssl_cert_file);
}
if ($ssl_key_file != '') {
$ssl_key_file = makeCorrectFile($ssl_key_file);
}
if ($ssl_ca_file != '') {
$ssl_ca_file = makeCorrectFile($ssl_ca_file);
}
if ($ssl_cert_chainfile != '') {
$ssl_cert_chainfile = makeCorrectFile($ssl_cert_chainfile);
}
if (strlen(trim($docroot)) > 0) {
$docroot = makeCorrectDir($docroot);
} else {
$docroot = '';
}
$result_checkfordouble_stmt = Database::prepare("
SELECT `id` FROM `" . TABLE_PANEL_IPSANDPORTS . "`
WHERE `ip` = :ip AND `port` = :port"
);
$result_checkfordouble = Database::pexecute_first($result_checkfordouble_stmt, array('ip' => $ip, 'port' => $port));
if ($result_checkfordouble['id'] != '') {
standard_error('myipnotdouble');
} else {
$ins_stmt = Database::prepare("
INSERT INTO `" . TABLE_PANEL_IPSANDPORTS . "`
SET
`ip` = :ip, `port` = :port, `listen_statement` = :ls,
`namevirtualhost_statement` = :nvhs, `vhostcontainer` = :vhc,
`vhostcontainer_servername_statement` = :vhcss,
`specialsettings` = :ss, `ssl` = :ssl,
`ssl_cert_file` = :ssl_cert, `ssl_key_file` = :ssl_key,
`ssl_ca_file` = :ssl_ca, `ssl_cert_chainfile` = :ssl_chain,
`default_vhostconf_domain` = :dvhd, `docroot` = :docroot;
");
$ins_data = array(
'ip' => $ip,
'port' => $port,
'ls' => $listen_statement,
'nvhs' => $namevirtualhost_statement,
'vhc' => $vhostcontainer,
'vhcss' => $vhostcontainer_servername_statement,
'ss' => $specialsettings,
'ssl' => $ssl,
'ssl_cert' => $ssl_cert_file,
'ssl_key' => $ssl_key_file,
'ssl_ca' => $ssl_ca_file,
'ssl_chain' => $ssl_cert_chainfile,
'dvhd' => $default_vhostconf_domain,
'docroot' => $docroot
);
Database::pexecute($ins_stmt, $ins_data);
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
$ip = '[' . $ip . ']';
}
$log->logAction(ADM_ACTION, LOG_WARNING, "added IP/port '" . $ip . ":" . $port . "'");
inserttask('1');
// Using nameserver, insert a task which rebuilds the server config
inserttask('4');
redirectTo($filename, Array('page' => $page, 's' => $s));
}
} else {
$ipsandports_add_data = include_once dirname(__FILE__).'/lib/formfields/admin/ipsandports/formfield.ipsandports_add.php';
$ipsandports_add_form = htmlform::genHTMLForm($ipsandports_add_data);
$title = $ipsandports_add_data['ipsandports_add']['title'];
$image = $ipsandports_add_data['ipsandports_add']['image'];
eval("echo \"" . getTemplate("ipsandports/ipsandports_add") . "\";");
}
} elseif($action == 'edit'
&& $id != 0
) {
$result_stmt = Database::prepare("
SELECT * FROM `" . TABLE_PANEL_IPSANDPORTS . "` WHERE `id` = :id"
);
$result = Database::pexecute_first($result_stmt, array('id' => $id));
if ($result['ip'] != '') {
if (isset($_POST['send'])
&& $_POST['send'] == 'send'
) {
$ip = validate_ip($_POST['ip']);
$port = validate($_POST['port'], 'port', '/^(([1-9])|([1-9][0-9])|([1-9][0-9][0-9])|([1-9][0-9][0-9][0-9])|([1-5][0-9][0-9][0-9][0-9])|(6[0-4][0-9][0-9][0-9])|(65[0-4][0-9][0-9])|(655[0-2][0-9])|(6553[0-5]))$/Di', array('stringisempty', 'myport'));
$listen_statement = isset($_POST['listen_statement']) ? 1 : 0;
$namevirtualhost_statement = isset($_POST['namevirtualhost_statement']) ? 1 : 0;
$vhostcontainer = isset($_POST['vhostcontainer']) ? 1 : 0;
$specialsettings = validate(str_replace("\r\n", "\n", $_POST['specialsettings']), 'specialsettings', '/^[^\0]*$/');
$vhostcontainer_servername_statement = isset($_POST['vhostcontainer_servername_statement']) ? 1 : 0;
$default_vhostconf_domain = validate(str_replace("\r\n", "\n", $_POST['default_vhostconf_domain']), 'default_vhostconf_domain', '/^[^\0]*$/');
$docroot = validate($_POST['docroot'], 'docroot');
$result_checkfordouble_stmt = Database::prepare("
SELECT `id` FROM `" . TABLE_PANEL_IPSANDPORTS . "`
WHERE `ip` = :ip AND `port` = :port"
);
$result_checkfordouble = Database::pexecute_first($result_checkfordouble_stmt, array('ip' => $ip, 'port' => $port));
$result_sameipotherport_stmt = Database::prepare("
SELECT `id` FROM `" . TABLE_PANEL_IPSANDPORTS . "`
WHERE `ip` = :ip AND `id` <> :id"
);
$result_sameipotherport = Database::pexecute_first($result_sameipotherport_stmt, array('ip' => $ip, 'id' => $id));
if ((int)Settings::Get('system.use_ssl') == 1
&& isset($_POST['ssl'])
&& $_POST['ssl'] != 0
) {
$ssl = 1;
$ssl_cert_file = validate($_POST['ssl_cert_file'], 'ssl_cert_file');
$ssl_key_file = validate($_POST['ssl_key_file'], 'ssl_key_file');
$ssl_ca_file = validate($_POST['ssl_ca_file'], 'ssl_ca_file');
$ssl_cert_chainfile = validate($_POST['ssl_cert_chainfile'], 'ssl_cert_chainfile');
} else {
$ssl = 0;
$ssl_cert_file = '';
$ssl_key_file = '';
$ssl_ca_file = '';
$ssl_cert_chainfile = '';
}
if ($listen_statement != '1') {
$listen_statement = '0';
}
if ($namevirtualhost_statement != '1') {
$namevirtualhost_statement = '0';
}
if ($vhostcontainer != '1') {
$vhostcontainer = '0';
}
if ($vhostcontainer_servername_statement != '1') {
$vhostcontainer_servername_statement = '0';
}
if ($ssl != '1') {
$ssl = '0';
}
if ($ssl_cert_file != '') {
$ssl_cert_file = makeCorrectFile($ssl_cert_file);
}
if ($ssl_key_file != '') {
$ssl_key_file = makeCorrectFile($ssl_key_file);
}
if ($ssl_ca_file != '') {
$ssl_ca_file = makeCorrectFile($ssl_ca_file);
}
if ($ssl_cert_chainfile != '') {
$ssl_cert_chainfile = makeCorrectFile($ssl_cert_chainfile);
}
if (strlen(trim($docroot)) > 0) {
$docroot = makeCorrectDir($docroot);
} else {
$docroot = '';
}
if ($result['ip'] != $ip
&& $result['ip'] == Settings::Get('system.ipaddress')
&& $result_sameipotherport['id'] == ''
) {
standard_error('cantchangesystemip');
} elseif($result_checkfordouble['id'] != ''
&& $result_checkfordouble['id'] != $id
) {
standard_error('myipnotdouble');
} else {
$upd_stmt = Database::prepare("
UPDATE `" . TABLE_PANEL_IPSANDPORTS . "`
SET
`ip` = :ip, `port` = :port, `listen_statement` = :ls,
`namevirtualhost_statement` = :nvhs, `vhostcontainer` = :vhc,
`vhostcontainer_servername_statement` = :vhcss,
`specialsettings` = :ss, `ssl` = :ssl,
`ssl_cert_file` = :ssl_cert, `ssl_key_file` = :ssl_key,
`ssl_ca_file` = :ssl_ca, `ssl_cert_chainfile` = :ssl_chain,
`default_vhostconf_domain` = :dvhd, `docroot` = :docroot
WHERE `id` = :id;
");
$upd_data = array(
'ip' => $ip,
'port' => $port,
'ls' => $listen_statement,
'nvhs' => $namevirtualhost_statement,
'vhc' => $vhostcontainer,
'vhcss' => $vhostcontainer_servername_statement,
'ss' => $specialsettings,
'ssl' => $ssl,
'ssl_cert' => $ssl_cert_file,
'ssl_key' => $ssl_key_file,
'ssl_ca' => $ssl_ca_file,
'ssl_chain' => $ssl_cert_chainfile,
'dvhd' => $default_vhostconf_domain,
'docroot' => $docroot,
'id' => $id 'id' => $id
); ])->get();
Database::pexecute($upd_stmt, $upd_data); } catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
$result = json_decode($json_result, true)['data'];
$log->logAction(ADM_ACTION, LOG_WARNING, "changed IP/port from '" . $result['ip'] . ":" . $result['port'] . "' to '" . $ip . ":" . $port . "'"); if (isset($result['id']) && $result['id'] == $id) {
inserttask('1'); if (isset($_POST['send']) && $_POST['send'] == 'send') {
try {
// Using nameserver, insert a task which rebuilds the server config IpsAndPorts::getLocal($userinfo, [
inserttask('4'); 'id' => $id
])->delete();
redirectTo($filename, Array('page' => $page, 's' => $s)); } catch (Exception $e) {
Response::dynamicError($e->getMessage());
} }
Response::redirectTo($filename, [
'page' => $page
]);
} else { } else {
HTML::askYesNo('admin_ip_reallydelete', $filename, [
'id' => $id,
'page' => $page,
'action' => $action
], $result['ip'] . ':' . $result['port']);
}
}
} elseif ($action == 'add') {
if (isset($_POST['send']) && $_POST['send'] == 'send') {
try {
IpsAndPorts::getLocal($userinfo, $_POST)->add();
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
Response::redirectTo($filename, [
'page' => $page
]);
} else {
$ipsandports_add_data = include_once dirname(__FILE__) . '/lib/formfields/admin/ipsandports/formfield.ipsandports_add.php';
$result = htmlentities_array($result); UI::view('user/form.html.twig', [
'formaction' => $linker->getLink(['section' => 'ipsandports']),
'formdata' => $ipsandports_add_data['ipsandports_add']
]);
}
} elseif ($action == 'edit' && $id != 0) {
try {
$json_result = IpsAndPorts::getLocal($userinfo, [
'id' => $id
])->get();
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
$result = json_decode($json_result, true)['data'];
if ($result['ip'] != '') {
if (isset($_POST['send']) && $_POST['send'] == 'send') {
try {
IpsAndPorts::getLocal($userinfo, $_POST)->update();
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
Response::redirectTo($filename, [
'page' => $page
]);
} else {
$result = PhpHelper::htmlentitiesArray($result);
$ipsandports_edit_data = include_once dirname(__FILE__) . '/lib/formfields/admin/ipsandports/formfield.ipsandports_edit.php'; $ipsandports_edit_data = include_once dirname(__FILE__) . '/lib/formfields/admin/ipsandports/formfield.ipsandports_edit.php';
$ipsandports_edit_form = htmlform::genHTMLForm($ipsandports_edit_data);
$title = $ipsandports_edit_data['ipsandports_edit']['title']; UI::view('user/form.html.twig', [
$image = $ipsandports_edit_data['ipsandports_edit']['image']; 'formaction' => $linker->getLink(['section' => 'ipsandports', 'id' => $id]),
'formdata' => $ipsandports_edit_data['ipsandports_edit'],
eval("echo \"" . getTemplate("ipsandports/ipsandports_edit") . "\";"); 'editid' => $id
]);
} }
} }
} elseif ($action == 'jqCheckIP') {
$ip = $_POST['ip'] ?? "";
if ((filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) || filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) && filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE | FILTER_FLAG_NO_PRIV_RANGE) == false) {
// returns notice if private network detected so we can display it
echo json_encode(lng('admin.ipsandports.ipnote'));
} else {
echo 0;
}
exit();
} }
} }

View File

@@ -2,131 +2,75 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Panel
* *
* 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
*/ */
define('AREA', 'admin'); const AREA = 'admin';
require './lib/init.php'; require __DIR__ . '/lib/init.php';
if ($page == 'log' use Froxlor\Api\Commands\SysLog;
&& $userinfo['change_serversettings'] == '1' use Froxlor\UI\Collection;
) { use Froxlor\UI\HTML;
use Froxlor\UI\Listing;
use Froxlor\UI\Panel\UI;
use Froxlor\UI\Response;
if ($page == 'log' && $userinfo['change_serversettings'] == '1') {
if ($action == '') { if ($action == '') {
$fields = array( try {
'date' => $lng['logger']['date'], $syslog_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/tablelisting.syslog.php';
'type' => $lng['logger']['type'], $collection = (new Collection(SysLog::class, $userinfo))
'user' => $lng['logger']['user'], ->withPagination($syslog_list_data['syslog_list']['columns'], $syslog_list_data['syslog_list']['default_sorting']);
'text' => $lng['logger']['action'] } catch (Exception $e) {
); Response::dynamicError($e->getMessage());
$paging = new paging($userinfo, TABLE_PANEL_LOG, $fields, null, null, 0, 'desc');
$result_stmt = Database::query('
SELECT * FROM `' . TABLE_PANEL_LOG . '` ' . $paging->getSqlWhere(false) . ' ' . $paging->getSqlOrderBy() . ' ' . $paging->getSqlLimit()
);
$logs_count = Database::num_rows();
$paging->setEntries($logs_count);
$sortcode = $paging->getHtmlSortCode($lng);
$arrowcode = $paging->getHtmlArrowCode($filename . '?page=' . $page . '&s=' . $s);
$searchcode = $paging->getHtmlSearchCode($lng);
$pagingcode = $paging->getHtmlPagingCode($filename . '?page=' . $page . '&s=' . $s);
$clog = array();
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
if (!isset($clog[$row['action']])
|| !is_array($clog[$row['action']])
) {
$clog[$row['action']] = array();
}
$clog[$row['action']][$row['logid']] = $row;
} }
if ($paging->sortfield == 'date' UI::view('user/table.html.twig', [
&& $paging->sortorder == 'desc' 'listing' => Listing::format($collection, $syslog_list_data, 'syslog_list'),
) { 'actions_links' => [
krsort($clog); [
} else { 'href' => $linker->getLink(['section' => 'logger', 'page' => 'log', 'action' => 'truncate']),
ksort($clog); 'label' => lng('logger.truncate'),
} 'icon' => 'fa-solid fa-recycle',
'class' => 'btn-warning'
$i = 0; ]
$count = 0; ]
$log_count = 0; ]);
$log = '';
foreach ($clog as $action => $logrows) {
$_action = 0;
foreach ($logrows as $row) {
if ($paging->checkDisplay($i)) {
$row = htmlentities_array($row);
$row['date'] = date("d.m.y H:i:s", $row['date']);
if ($_action != $action) {
switch ($action) {
case USR_ACTION:
$_action = $lng['admin']['customer'];
break;
case RES_ACTION:
$_action = $lng['logger']['reseller'];
break;
case ADM_ACTION:
$_action = $lng['logger']['admin'];
break;
case CRON_ACTION:
$_action = $lng['logger']['cron'];
break;
case LOGIN_ACTION:
$_action = $lng['logger']['login'];
break;
case LOG_ERROR:
$_action = $lng['logger']['intern'];
break;
default:
$_action = $lng['logger']['unknown'];
break;
}
$row['action'] = $_action;
eval("\$log.=\"" . getTemplate('logger/logger_action') . "\";");
}
$log_count++;
$row['type'] = getLogLevelDesc($row['type']);
eval("\$log.=\"" . getTemplate('logger/logger_log') . "\";");
$count++;
$_action = $action;
}
$i++;
}
$i++;
}
eval("echo \"" . getTemplate('logger/logger') . "\";");
} elseif ($action == 'truncate') { } elseif ($action == 'truncate') {
if (isset($_POST['send']) && $_POST['send'] == 'send') {
if (isset($_POST['send']) try {
&& $_POST['send'] == 'send' SysLog::getLocal($userinfo, [
) { 'min_to_keep' => 10
$truncatedate = time() - (60 * 10); ])->delete();
$trunc_stmt = Database::prepare(" } catch (Exception $e) {
DELETE FROM `" . TABLE_PANEL_LOG . "` WHERE `date` < :trunc" Response::dynamicError($e->getMessage());
); }
Database::pexecute($trunc_stmt, array('trunc' => $truncatedate)); Response::redirectTo($filename, [
$log->logAction(ADM_ACTION, LOG_WARNING, 'truncated the system-log (mysql)'); 'page' => $page
redirectTo($filename, array('page' => $page, 's' => $s)); ]);
} else { } else {
ask_yesno('logger_reallytruncate', $filename, array('page' => $page, 'action' => $action), TABLE_PANEL_LOG); HTML::askYesNo('logger_reallytruncate', $filename, [
'page' => $page,
'action' => $action
], TABLE_PANEL_LOG);
} }
} }
} }

View File

@@ -2,56 +2,65 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Panel
* *
* 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
*/ */
define('AREA', 'admin'); const AREA = 'admin';
require './lib/init.php'; require __DIR__ . '/lib/init.php';
if (isset($_POST['id'])) { use Froxlor\Database\Database;
$id = intval($_POST['id']); use Froxlor\FroxlorLogger;
} elseif (isset($_GET['id'])) { use Froxlor\UI\Panel\UI;
$id = intval($_GET['id']); use Froxlor\UI\Request;
} use Froxlor\UI\Response;
use Froxlor\User;
$id = (int)Request::any('id');
$note_type = null;
$note_msg = null;
if ($page == 'message') { if ($page == 'message') {
if ($action == '') { if ($action == '') {
$log->logAction(ADM_ACTION, LOG_NOTICE, 'viewed panel_message'); $log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, 'viewed panel_message');
if (isset($_POST['send']) if (isset($_POST['send']) && $_POST['send'] == 'send') {
&& $_POST['send'] == 'send' if ($_POST['recipient'] == 0 && $userinfo['customers_see_all'] == '1') {
) { $log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, 'sending messages to admins');
if ($_POST['receipient'] == 0
&& $userinfo['customers_see_all'] == '1'
) {
$log->logAction(ADM_ACTION, LOG_NOTICE, 'sending messages to admins');
$result = Database::query('SELECT `name`, `email` FROM `' . TABLE_PANEL_ADMINS . "`"); $result = Database::query('SELECT `name`, `email` FROM `' . TABLE_PANEL_ADMINS . "`");
} elseif ($_POST['receipient'] == 1) { } elseif ($_POST['recipient'] == 1) {
if ($userinfo['customers_see_all'] == '1') { if ($userinfo['customers_see_all'] == '1') {
$log->logAction(ADM_ACTION, LOG_NOTICE, 'sending messages to ALL customers'); $log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, 'sending messages to ALL customers');
$result = Database::query('SELECT `firstname`, `name`, `company`, `email` FROM `' . TABLE_PANEL_CUSTOMERS . "`"); $result = Database::query('SELECT `firstname`, `name`, `company`, `email` FROM `' . TABLE_PANEL_CUSTOMERS . "`");
} else { } else {
$log->logAction(ADM_ACTION, LOG_NOTICE, 'sending messages to customers'); $log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, 'sending messages to customers');
$result = Database::prepare(' $result = Database::prepare('
SELECT `firstname`, `name`, `company`, `email` FROM `' . TABLE_PANEL_CUSTOMERS . "` SELECT `firstname`, `name`, `company`, `email` FROM `' . TABLE_PANEL_CUSTOMERS . "`
WHERE `adminid` = :adminid" WHERE `adminid` = :adminid");
); Database::pexecute($result, [
Database::pexecute($result, array('adminid' => $userinfo['adminid'])); 'adminid' => $userinfo['adminid']
]);
} }
} else { } else {
standard_error('noreceipientsgiven'); Response::standardError('norecipientsgiven');
} }
$subject = $_POST['subject']; $subject = $_POST['subject'];
@@ -63,10 +72,13 @@ if ($page == 'message') {
$mail->Subject = $subject; $mail->Subject = $subject;
while ($row = $result->fetch(PDO::FETCH_ASSOC)) { while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
$row['firstname'] = isset($row['firstname']) ? $row['firstname'] : ''; $row['firstname'] = isset($row['firstname']) ? $row['firstname'] : '';
$row['company'] = isset($row['company']) ? $row['company'] : ''; $row['company'] = isset($row['company']) ? $row['company'] : '';
$mail->AddAddress($row['email'], getCorrectUserSalutation(array('firstname' => $row['firstname'], 'name' => $row['name'], 'company' => $row['company']))); $mail->AddAddress($row['email'], User::getCorrectUserSalutation([
'firstname' => $row['firstname'],
'name' => $row['name'],
'company' => $row['company']
]));
$mail->From = $userinfo['email']; $mail->From = $userinfo['email'];
$mail->FromName = (isset($userinfo['firstname']) ? $userinfo['firstname'] . ' ' : '') . $userinfo['name']; $mail->FromName = (isset($userinfo['firstname']) ? $userinfo['firstname'] . ' ' : '') . $userinfo['name'];
@@ -77,45 +89,62 @@ if ($page == 'message') {
$mailerr_msg = $row['email']; $mailerr_msg = $row['email'];
} }
$log->logAction(ADM_ACTION, LOG_ERR, 'Error sending mail: ' . $mailerr_msg); $log->logAction(FroxlorLogger::ADM_ACTION, LOG_ERR, 'Error sending mail: ' . $mailerr_msg);
standard_error('errorsendingmail', $row['email']); Response::standardError('errorsendingmail', $row['email']);
} }
$mailcounter++; $mailcounter++;
$mail->ClearAddresses(); $mail->ClearAddresses();
} }
redirectTo($filename, array('page' => $page, 's' => $s, 'action' => 'showsuccess', 'sentitems' => $mailcounter)); Response::redirectTo($filename, [
'page' => $page,
'action' => 'showsuccess',
'sentitems' => $mailcounter
]);
} else { } else {
standard_error('nomessagetosend'); Response::standardError('nomessagetosend');
} }
} }
} } elseif ($action == 'showsuccess') {
if ($action == 'showsuccess') {
$success = 1;
$sentitems = isset($_GET['sentitems']) ? (int)$_GET['sentitems'] : 0; $sentitems = isset($_GET['sentitems']) ? (int)$_GET['sentitems'] : 0;
if ($sentitems == 0) { if ($sentitems == 0) {
$successmessage = $lng['message']['noreceipients']; $note_type = 'info';
$note_msg = lng('message.norecipients');
} else { } else {
$successmessage = str_replace('%s', $sentitems, $lng['message']['success']); $note_type = 'success';
$note_msg = str_replace('%s', $sentitems, lng('message.success'));
}
} }
} else { $recipients = [];
$success = 0;
$sentitems = 0;
$successmessage = '';
}
$action = '';
$receipients = '';
if ($userinfo['customers_see_all'] == '1') { if ($userinfo['customers_see_all'] == '1') {
$receipients.= makeoption($lng['panel']['reseller'], 0); $recipients[0] = lng('panel.reseller');
} }
$recipients[1] = lng('panel.customer');
$receipients .= makeoption($lng['panel']['customer'], 1); $messages_add_data = include_once dirname(__FILE__) . '/lib/formfields/admin/messages/formfield.messages_add.php';
eval("echo \"" . getTemplate('message/message') . "\";");
UI::view('user/form-note.html.twig', [
'formaction' => $linker->getLink(['section' => 'message']),
'formdata' => $messages_add_data['messages_add'],
'actions_links' => [
[
'href' => $linker->getLink([
'section' => 'settings',
'page' => 'overview',
'part' => 'system',
'em' => 'system_mail_use_smtp'
]),
'label' => lng('admin.smtpsettings'),
'icon' => 'fa-solid fa-gears',
'class' => 'btn-outline-secondary'
]
],
// alert-box
'type' => $note_type,
'alert_msg' => $note_msg
]);
} }

144
admin_mysqlserver.php Normal file
View File

@@ -0,0 +1,144 @@
<?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\MysqlServer;
use Froxlor\FroxlorLogger;
use Froxlor\PhpHelper;
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 == 'mysqlserver' || $page == 'overview') && $userinfo['change_serversettings'] == '1') {
if ($action == '') {
$log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, "viewed admin_mysqlserver");
try {
$mysqlserver_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/admin/tablelisting.mysqlserver.php';
$collection = (new Collection(MysqlServer::class, $userinfo))
->withPagination($mysqlserver_list_data['mysqlserver_list']['columns'], $mysqlserver_list_data['mysqlserver_list']['default_sorting']);
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
UI::view('user/table.html.twig', [
'listing' => Listing::format($collection, $mysqlserver_list_data, 'mysqlserver_list'),
'actions_links' => [
[
'href' => $linker->getLink(['section' => 'mysqlserver', 'page' => $page, 'action' => 'add']),
'label' => lng('admin.mysqlserver.add')
]
]
]);
} elseif ($action == 'delete' && $id != 0) {
try {
$json_result = MysqlServer::getLocal($userinfo, [
'id' => $id
])->get();
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
$result = json_decode($json_result, true)['data'];
if (isset($result['id']) && $result['id'] == $id) {
if (isset($_POST['send']) && $_POST['send'] == 'send') {
try {
MysqlServer::getLocal($userinfo, [
'id' => $id
])->delete();
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
Response::redirectTo($filename, [
'page' => $page
]);
} else {
HTML::askYesNo('admin_mysqlserver_reallydelete', $filename, [
'id' => $id,
'page' => $page,
'action' => $action
], $result['caption'] . ' (' . $result['host'] . ')');
}
}
} elseif ($action == 'add') {
if (isset($_POST['send']) && $_POST['send'] == 'send') {
try {
MysqlServer::getLocal($userinfo, $_POST)->add();
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
Response::redirectTo($filename, [
'page' => $page
]);
} else {
$mysqlserver_add_data = include_once dirname(__FILE__) . '/lib/formfields/admin/mysqlserver/formfield.mysqlserver_add.php';
UI::view('user/form.html.twig', [
'formaction' => $linker->getLink(['section' => 'mysqlserver']),
'formdata' => $mysqlserver_add_data['mysqlserver_add']
]);
}
} elseif ($action == 'edit' && $id >= 0) {
try {
$json_result = MysqlServer::getLocal($userinfo, [
'id' => $id
])->get();
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
$result = json_decode($json_result, true)['data'];
if (isset($result['id']) && $result['id'] == $id) {
if (isset($_POST['send']) && $_POST['send'] == 'send') {
try {
MysqlServer::getLocal($userinfo, $_POST)->update();
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
Response::redirectTo($filename, [
'page' => $page
]);
} else {
$result = PhpHelper::htmlentitiesArray($result);
$mysqlserver_edit_data = include_once dirname(__FILE__) . '/lib/formfields/admin/mysqlserver/formfield.mysqlserver_edit.php';
UI::view('user/form.html.twig', [
'formaction' => $linker->getLink(['section' => 'mysqlserver', 'id' => $id]),
'formdata' => $mysqlserver_edit_data['mysqlserver_edit'],
'editid' => $id
]);
}
}
}
}

View File

@@ -4,155 +4,305 @@
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Janos Muzsi <muzsij@hypernics.hu> (2016) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Panel
* *
* Based on https://github.com/amnuts/opcache-gui * 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 Andrew Collington <andy@amnuts.com>
* @license https://files.froxlor.org/misc/COPYING.txt GPLv2
*
* Based on https://github.com/amnuts/opcache-gui, which is
* licensed under the MIT licence, which can be viewed
* online at https://acollington.mit-license.org/
*/ */
define('AREA', 'admin'); const AREA = 'admin';
require './lib/init.php'; require __DIR__ . '/lib/init.php';
use Froxlor\FroxlorLogger;
use Froxlor\UI\Panel\UI;
use Froxlor\UI\Response;
use Froxlor\UI\HTML;
if ($action == 'reset' && if ($action == 'reset' && function_exists('opcache_reset') && $userinfo['change_serversettings'] == '1') {
function_exists('opcache_reset') && if ($_POST['send'] == 'send') {
$userinfo['change_serversettings'] == '1'
) {
opcache_reset(); opcache_reset();
$log->logAction(ADM_ACTION, LOG_INFO, "reseted OPcache"); $log->logAction(FroxlorLogger::ADM_ACTION, LOG_INFO, "reset OPcache");
header('Location: ' . $linker->getLink(array('section' => 'opcacheinfo', 'page' => 'showinfo'))); header('Location: ' . $linker->getLink([
'section' => 'opcacheinfo',
'page' => 'showinfo'
]));
exit(); exit();
} else {
HTML::askYesNo('cache_reallydelete', $filename, [
'page' => $page,
'action' => 'reset',
], '', [
'section' => 'opcacheinfo',
'page' => 'showinfo'
]);
}
} }
if (!function_exists('opcache_get_configuration') if (!function_exists('opcache_get_configuration')) {
) { Response::standardError(lng('error.no_opcacheinfo'));
standard_error($lng['error']['no_opcacheinfo']);
} }
if ($page == 'showinfo' if ($page == 'showinfo' && $userinfo['change_serversettings'] == '1') {
) {
$opcache_info = opcache_get_configuration();
$opcache_status = opcache_get_status(false);
$time = time(); $time = time();
$log->logAction(ADM_ACTION, LOG_NOTICE, "viewed OPcache info"); $log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, "viewed OPcache info");
$runtimelines = ''; $optimizationLevels = [
if (isset($opcache_info['directives']) && is_array($opcache_info['directives'])) { 1 << 0 => 'CSE, STRING construction',
foreach ($opcache_info['directives'] as $name => $value) { 1 << 1 => 'Constant conversion and jumps',
$linkname= str_replace('_', '-', $name); 1 << 2 => '++, +=, series of jumps',
if ($name=='opcache.optimization_level' && is_integer($value)) { 1 << 3 => 'INIT_FCALL_BY_NAME -> DO_FCALL',
$value='0x'.dechex($value); 1 << 4 => 'CFG based optimization',
} 1 << 5 => 'DFA based optimization',
if ($name=='opcache.memory_consumption' && is_integer($value) && $value%(1024*1024)==0) { 1 << 6 => 'CALL GRAPH optimization',
$value=$value/(1024*1024); 1 << 7 => 'SCCP (constant propagation)',
} 1 << 8 => 'TMP VAR usage',
if ($value===null || $value==='') { 1 << 9 => 'NOP removal',
$value=$lng['opcacheinfo']['novalue']; 1 << 10 => 'Merge equal constants',
} 1 << 11 => 'Adjust used stack',
if ($value===true) { 1 << 12 => 'Remove unused variables',
$value=$lng['opcacheinfo']['true']; 1 << 13 => 'DCE (dead code elimination)',
} 1 << 14 => '(unsafe) Collect constants',
if ($value===false) { 1 << 15 => 'Inline functions'
$value=$lng['opcacheinfo']['false']; ];
}
if (is_integer($value)) { $jitModes = [
$value=number_format($value,0,'.',' '); [
} 'flag' => 'CPU-specific optimization',
$name=str_replace('_', ' ', $name); 'value' => [
eval("\$runtimelines.=\"" . getTemplate("settings/opcacheinfo/runtime_line") . "\";"); 'Disable CPU-specific optimization',
} 'Enable use of AVX, if the CPU supports it'
]
],
[
'flag' => 'Register allocation',
'value' => [
'Do not perform register allocation',
'Perform block-local register allocation',
'Perform global register allocation'
]
],
[
'flag' => 'Trigger',
'value' => [
'Compile all functions on script load',
'Compile functions on first execution',
'Profile functions on first request and compile the hottest functions afterwards',
'Profile on the fly and compile hot functions',
'Currently unused',
'Use tracing JIT. Profile on the fly and compile traces for hot code segments'
]
],
[
'flag' => 'Optimization level',
'value' => [
'No JIT',
'Minimal JIT (call standard VM handlers)',
'Inline VM handlers',
'Use type inference',
'Use call graph',
'Optimize whole script'
]
]
];
$jitModeMapping = [
'tracing' => 1254,
'on' => 1254,
'function' => 1205
];
$status = opcache_get_status(false);
$config = opcache_get_configuration();
$missingConfig = array_diff_key(ini_get_all('zend opcache', false), $config['directives']);
if (!empty($missingConfig)) {
$config['directives'] = array_merge($config['directives'], $missingConfig);
} }
$cachehits=@$opcache_status['opcache_statistics']['hits'] ?: 0; $files = [];
$cachemiss=@$opcache_status['opcache_statistics']['misses'] ?: 0; if (!empty($status['scripts'])) {
$blacklistmiss=@$opcache_status['opcache_statistics']['blacklist_misses'] ?: 0; uasort($status['scripts'], static function ($a, $b) {
$cachetotal=$cachehits+$cachemiss+$blacklistmiss; return $a['hits'] <=> $b['hits'];
});
foreach ($status['scripts'] as &$file) {
$file['full_path'] = str_replace('\\', '/', $file['full_path']);
$file['readable'] = [
'hits' => number_format($file['hits']),
'memory_consumption' => bsize($file['memory_consumption'])
];
}
$files = array_values($status['scripts']);
}
$general=array( if ($config['directives']['opcache.file_cache_only'] || !empty($status['file_cache_only'])) {
'version' => (isset($opcache_info['version']['opcache_product_name']) ? $opcache_info['version']['opcache_product_name'].' ' : '').$opcache_info['version']['version'], $overview = false;
'phpversion' => phpversion(), } else {
'start_time' => @$opcache_status['opcache_statistics']['start_time'] ? date('Y-m-d H:i:s',$opcache_status['opcache_statistics']['start_time']) : '', $status['opcache_statistics']['start_time'] = $status['opcache_statistics']['start_time'] ?? time();
'last_restart_time' => @$opcache_status['opcache_statistics']['last_restart_time'] ? date('Y-m-d H:i:s',$opcache_status['opcache_statistics']['last_restart_time']) : $lng['opcacheinfo']['never'], $status['opcache_statistics']['last_restart_time'] = $status['opcache_statistics']['last_restart_time'] ?? time();
'oom_restarts' => number_format(@$opcache_status['opcache_statistics']['oom_restarts'] ?: 0,0,'.',' '),
'hash_restarts' => number_format(@$opcache_status['opcache_statistics']['hash_restarts'] ?: 0,0,'.',' '),
'manual_restarts' => number_format(@$opcache_status['opcache_statistics']['manual_restarts'] ?: 0,0,'.',' '),
'status' => (@$opcache_status['restart_in_progress'] ? $lng['opcacheinfo']['restartinprogress'] :
(@$opcache_status['restart_pending'] ? $lng['opcacheinfo']['restartpending'] :
(@$opcache_status['cache_full'] ? $lng['opcacheinfo']['cachefull'] :
(@$opcache_status['opcache_enabled'] ? $lng['opcacheinfo']['enabled'] : $lng['opcacheinfo']['novalue'])))),
'cachedscripts' => number_format(@$opcache_status['opcache_statistics']['num_cached_scripts'] ?: 0,0,'.',' '),
'cachehits' => number_format($cachehits,0,'.',' ') . ($cachetotal>0 ? sprintf(" (%.1f %%)", $cachehits/($cachetotal)*100) : ''),
'cachemiss' => number_format($cachemiss,0,'.',' ') . ($cachetotal>0 ? sprintf(" (%.1f %%)", $cachemiss/($cachetotal)*100) : ''),
'blacklistmiss' => number_format($blacklistmiss,0,'.',' ') . ($cachetotal>0 ? sprintf(" (%.1f %%)", $blacklistmiss/($cachetotal)*100) : ''),
);
$usedmem=@$opcache_status['memory_usage']['used_memory'] ?: 0; $overview = array_merge(
$usedmemstr=bsize($usedmem); $status['memory_usage'],
$freemem=@$opcache_status['memory_usage']['free_memory'] ?: 0; $status['opcache_statistics'],
$freememstr=bsize($freemem); [
$totalmem=$usedmem+$freemem; 'total_memory' => $config['directives']['opcache.memory_consumption'],
$wastedmem=@$opcache_status['memory_usage']['wasted_memory'] ?: 0; 'used_memory_percentage' => round(100 * (
$wastedmemstr=bsize($wastedmem); ($status['memory_usage']['used_memory'] + $status['memory_usage']['wasted_memory'])
if ($totalmem) { / $config['directives']['opcache.memory_consumption']
$memory=array( )),
'total' => bsize($totalmem), 'hit_rate_percentage' => round($status['opcache_statistics']['opcache_hit_rate']),
'used' => $usedmemstr . ($totalmem>0 ? sprintf(" (%.1f %%)", $usedmem/($totalmem)*100) : ''), 'used_key_percentage' => round(100 * ($status['opcache_statistics']['num_cached_keys']
'free' => $freememstr . ($totalmem>0 ? sprintf(" (%.1f %%)", $freemem/($totalmem)*100) : ''), / $status['opcache_statistics']['max_cached_keys']
'wasted' => $wastedmemstr . ($totalmem>0 ? sprintf(" (%.1f %%)", $wastedmem/($totalmem)*100) : ''), )),
'wasted_percentage' => round($status['memory_usage']['current_wasted_percentage'], 2),
'readable' => [
'total_memory' => bsize($config['directives']['opcache.memory_consumption']),
'used_memory' => bsize($status['memory_usage']['used_memory']),
'free_memory' => bsize($status['memory_usage']['free_memory']),
'wasted_memory' => bsize($status['memory_usage']['wasted_memory']),
'num_cached_scripts' => number_format($status['opcache_statistics']['num_cached_scripts']),
'hits' => number_format($status['opcache_statistics']['hits']),
'misses' => number_format($status['opcache_statistics']['misses']),
'blacklist_miss' => number_format($status['opcache_statistics']['blacklist_misses']),
'num_cached_keys' => number_format($status['opcache_statistics']['num_cached_keys']),
'max_cached_keys' => number_format($status['opcache_statistics']['max_cached_keys']),
'interned' => null,
'start_time' => (new DateTimeImmutable("@{$status['opcache_statistics']['start_time']}"))
->setTimezone(new DateTimeZone(date_default_timezone_get()))
->format('Y-m-d H:i:s'),
'last_restart_time' => ($status['opcache_statistics']['last_restart_time'] == 0
? 'never'
: (new DateTimeImmutable("@{$status['opcache_statistics']['last_restart_time']}"))
->setTimezone(new DateTimeZone(date_default_timezone_get()))
->format('Y-m-d H:i:s')
)
]
]
); );
} }
if (isset($opcache_status['interned_strings_usage'])) { $preload = [];
$usedstring=@$opcache_status['interned_strings_usage']['used_memory'] ?: 0; if (!empty($status['preload_statistics']['scripts'])) {
$usedstringstr=bsize($usedstring); $preload = $status['preload_statistics']['scripts'];
$freestring=@$opcache_status['interned_strings_usage']['free_memory'] ?: 0; sort($preload, SORT_STRING);
$freestringstr=bsize($freestring); if ($overview) {
$totalstring=$usedstring+$freestring; $overview['preload_memory'] = $status['preload_statistics']['memory_consumption'];
$stringbuffer=array( $overview['readable']['preload_memory'] = bsize($status['preload_statistics']['memory_consumption']);
'total' => bsize($totalstring), }
'used' => $usedstringstr . ($totalstring>0 ? sprintf(" (%.1f %%)", $usedstring/$totalstring*100) : ''), }
'free' => $freestringstr . ($totalstring>0 ? sprintf(" (%.1f %%)", $freestring/$totalstring*100) : ''),
'strcount' => number_format(@$opcache_status['interned_strings_usage']['number_of_strings'] ?: 0,0,'.',' '), if (!empty($status['interned_strings_usage'])) {
$overview['readable']['interned'] = [
'buffer_size' => bsize($status['interned_strings_usage']['buffer_size']),
'strings_used_memory' => bsize($status['interned_strings_usage']['used_memory']),
'strings_free_memory' => bsize($status['interned_strings_usage']['free_memory']),
'number_of_strings' => number_format($status['interned_strings_usage']['number_of_strings'])
];
}
if ($overview && !empty($status['jit'])) {
$overview['jit_buffer_used_percentage'] = ($status['jit']['buffer_size']
? round(100 * (($status['jit']['buffer_size'] - $status['jit']['buffer_free']) / $status['jit']['buffer_size']))
: 0
);
$overview['readable'] = array_merge($overview['readable'], [
'jit_buffer_size' => bsize($status['jit']['buffer_size']),
'jit_buffer_free' => bsize($status['jit']['buffer_free'])
]);
}
$directives = [];
ksort($config['directives']);
foreach ($config['directives'] as $k => $v) {
if (in_array($k, ['opcache.max_file_size', 'opcache.memory_consumption', 'opcache.jit_buffer_size']) && $v) {
$v = bsize($v) . " ({$v})";
} elseif ($k === 'opcache.optimization_level') {
$levels = [];
foreach ($optimizationLevels as $level => $info) {
if ($level & $v) {
$levels[] = "{$info} [{$level}]";
}
}
$v = $levels ?: 'none';
} elseif ($k === 'opcache.jit') {
if ($v === '1') {
$v = 'on';
}
if (isset($jitModeMapping[$v]) || is_numeric($v)) {
$levels = [];
foreach (str_split((string)($jitModeMapping[$v] ?? $v)) as $type => $level) {
$levels[] = "{$level}: {$jitModes[$type]['value'][$level]} ({$jitModes[$type]['flag']})";
}
$v = [$v, $levels];
} elseif (empty($v) || strtolower($v) === 'off') {
$v = 'Off';
}
}
$directives[] = [
'k' => $k,
'v' => $v
];
}
$version = array_merge(
$config['version'],
[
'php' => phpversion(),
'server' => $_SERVER['SERVER_SOFTWARE'] ?: '',
'host' => (function_exists('gethostname')
? gethostname()
: (php_uname('n')
?: (empty($_SERVER['SERVER_NAME'])
? $_SERVER['HOST_NAME']
: $_SERVER['SERVER_NAME']
)
)
)
]
);
UI::view('settings/opcacheinfo.html.twig', [
'opcacheinfo' => [
'version' => $version,
'overview' => $overview,
'files' => $files,
'preload' => $preload,
'directives' => $directives,
'blacklist' => $config['blacklist'],
'functions' => get_extension_funcs('Zend OPcache')
]
]);
}
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]
); );
} }
$usedkey=@$opcache_status['opcache_statistics']['num_cached_keys'] ?: 0;
$usedkeystr=number_format($usedkey,0,'.',' ');
$totalkey=@$opcache_status['opcache_statistics']['max_cached_keys'] ?: 0;
$wastedkey=$usedkey - (@$opcache_status['opcache_statistics']['num_cached_scripts'] ?: 0);
if (isset($opcache_status['opcache_statistics'])) {
$keystat=array(
'total' => number_format($totalkey,0,'.',' '),
'used' => $usedkeystr . ($totalkey>0 ? sprintf(" (%.1f %%)", $usedkey/($totalkey)*100) : ''),
'wasted' => number_format($wastedkey,0,'.',' ') . ($totalkey>0 ? sprintf(" (%.1f %%)", $wastedkey/($totalkey)*100) : ''),
);
}
$blacklistlines = '';
if (isset($opcache_info['blacklist']) && is_array($opcache_info['blacklist'])) {
foreach ($opcache_info['blacklist'] as $value) {
eval("\$blacklistlines.=\"" . getTemplate("settings/opcacheinfo/blacklist_line") . "\";");
}
}
eval("echo \"" . getTemplate("settings/opcacheinfo/showinfo") . "\";");
}
function bsize($s) {
foreach (array('', 'K', 'M', 'G') as $i => $k) {
if ($s < 1024)
break;
$s/=1024;
}
return sprintf("%5.1f %sBytes", $s, $k);
}

View File

@@ -2,343 +2,296 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Panel
* *
* 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
*/ */
define('AREA', 'admin'); const AREA = 'admin';
require './lib/init.php'; require __DIR__ . '/lib/init.php';
if (isset($_POST['id'])) { use Froxlor\Api\Commands\FpmDaemons;
$id = intval($_POST['id']); use Froxlor\Api\Commands\PhpSettings;
} elseif (isset($_GET['id'])) { use Froxlor\Database\Database;
$id = intval($_GET['id']); use Froxlor\Froxlor;
} 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 == 'overview') { if ($page == 'overview') {
if ($action == '') { if ($action == '') {
try {
$tablecontent = ''; $phpconf_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/admin/tablelisting.phpconfigs.php';
$count = 0; $collection = (new Collection(PhpSettings::class, $userinfo, ['with_subdomains' => true]))
$result = Database::query("SELECT * FROM `" . TABLE_PANEL_PHPCONFIGS . "`"); ->withPagination($phpconf_list_data['phpconf_list']['columns'], $phpconf_list_data['phpconf_list']['default_sorting']);
} catch (Exception $e) {
while ($row = $result->fetch(PDO::FETCH_ASSOC)) { Response::dynamicError($e->getMessage());
$domainresult = false;
$query_params = array('id' => $row['id']);
$query = "SELECT * FROM `".TABLE_PANEL_DOMAINS."`
WHERE `phpsettingid` = :id
AND `parentdomainid` = '0'";
if ((int)$userinfo['domains_see_all'] == 0) {
$query .= " AND `adminid` = :adminid";
$query_params['adminid'] = $userinfo['adminid'];
} }
if ((int)Settings::Get('panel.phpconfigs_hidestdsubdomain') == 1) { UI::view('user/table.html.twig', [
$ssdids_res = Database::query(" 'listing' => Listing::format($collection, $phpconf_list_data, 'phpconf_list'),
SELECT DISTINCT `standardsubdomain` FROM `".TABLE_PANEL_CUSTOMERS."` 'actions_links' => (bool)$userinfo['change_serversettings'] ? [
WHERE `standardsubdomain` > 0 ORDER BY `standardsubdomain` ASC;" [
); 'href' => $linker->getLink(['section' => 'phpsettings', 'page' => $page, 'action' => 'add']),
$ssdids = array(); 'label' => lng('admin.phpsettings.addnew')
while ($ssd = $ssdids_res->fetch(PDO::FETCH_ASSOC)) { ]
$ssdids[] = $ssd['standardsubdomain']; ] : []
} ]);
if (count($ssdids) > 0) {
$query .= " AND `id` NOT IN (".implode(', ', $ssdids).")";
}
}
$domainresult_stmt = Database::prepare($query);
Database::pexecute($domainresult_stmt, $query_params);
$domains = '';
if (Database::num_rows() > 0) {
while ($row2 = $domainresult_stmt->fetch(PDO::FETCH_ASSOC)) {
$domains.= $row2['domain'] . '<br/>';
}
}
// check whether we use that config as froxor-vhost config
if (Settings::Get('system.mod_fcgid_defaultini_ownvhost') == $row['id']
|| Settings::Get('phpfpm.vhost_defaultini') == $row['id']
) {
$domains .= Settings::Get('system.hostname');
}
if ($domains == '') {
$domains = $lng['admin']['phpsettings']['notused'];
}
// check whether this is our default config
if ((Settings::Get('system.mod_fcgid') == '1'
&& Settings::Get('system.mod_fcgid_defaultini') == $row['id'])
|| (Settings::Get('phpfpm.enabled') == '1'
&& Settings::Get('phpfpm.defaultini') == $row['id'])
) {
$row['description'] = '<b>'.$row['description'].'</b>';
}
$count ++;
eval("\$tablecontent.=\"" . getTemplate("phpconfig/overview_overview") . "\";");
}
$log->logAction(ADM_ACTION, LOG_INFO, "php.ini setting overview has been viewed by '" . $userinfo['loginname'] . "'");
eval("echo \"" . getTemplate("phpconfig/overview") . "\";");
} }
if ($action == 'add') { if ($action == 'add') {
if ((int)$userinfo['change_serversettings'] == 1) { if ((int)$userinfo['change_serversettings'] == 1) {
if (isset($_POST['send']) && $_POST['send'] == 'send') {
if (isset($_POST['send']) try {
&& $_POST['send'] == 'send' PhpSettings::getLocal($userinfo, $_POST)->add();
) { } catch (Exception $e) {
$description = validate($_POST['description'], 'description'); Response::dynamicError($e->getMessage());
$phpsettings = validate(str_replace("\r\n", "\n", $_POST['phpsettings']), 'phpsettings', '/^[^\0]*$/');
if (Settings::Get('system.mod_fcgid') == 1) {
$binary = makeCorrectFile(validate($_POST['binary'], 'binary'));
$file_extensions = validate($_POST['file_extensions'], 'file_extensions', '/^[a-zA-Z0-9\s]*$/');
$mod_fcgid_starter = validate($_POST['mod_fcgid_starter'], 'mod_fcgid_starter', '/^[0-9]*$/', '', array('-1', ''));
$mod_fcgid_maxrequests = validate($_POST['mod_fcgid_maxrequests'], 'mod_fcgid_maxrequests', '/^[0-9]*$/', '', array('-1', ''));
$mod_fcgid_umask = validate($_POST['mod_fcgid_umask'], 'mod_fcgid_umask', '/^[0-9]*$/');
// disable fpm stuff
$fpm_enableslowlog = 0;
$fpm_reqtermtimeout = 0;
$fpm_reqslowtimeout = 0;
} }
elseif (Settings::Get('phpfpm.enabled') == 1) { Response::redirectTo($filename, [
$fpm_enableslowlog = isset($_POST['phpfpm_enable_slowlog']) ? (int)$_POST['phpfpm_enable_slowlog'] : 0; 'page' => $page
$fpm_reqtermtimeout = validate($_POST['phpfpm_reqtermtimeout'], 'phpfpm_reqtermtimeout', '/^([0-9]+)(|s|m|h|d)$/'); ]);
$fpm_reqslowtimeout = validate($_POST['phpfpm_reqslowtimeout'], 'phpfpm_reqslowtimeout', '/^([0-9]+)(|s|m|h|d)$/');
// disable fcgid stuff
$binary = '/usr/bin/php-cgi';
$file_extensions = 'php';
$mod_fcgid_starter = 0;
$mod_fcgid_maxrequests = 0;
$mod_fcgid_umask = "022";
}
if (strlen($description) == 0
|| strlen($description) > 50
) {
standard_error('descriptioninvalid');
}
$ins_stmt = Database::prepare("
INSERT INTO `" . TABLE_PANEL_PHPCONFIGS . "` SET
`description` = :desc,
`binary` = :binary,
`file_extensions` = :fext,
`mod_fcgid_starter` = :starter,
`mod_fcgid_maxrequests` = :mreq,
`mod_fcgid_umask` = :umask,
`fpm_slowlog` = :fpmslow,
`fpm_reqterm` = :fpmreqterm,
`fpm_reqslow` = :fpmreqslow,
`phpsettings` = :phpsettings"
);
$ins_data = array(
'desc' => $description,
'binary' => $binary,
'fext' => $file_extensions,
'starter' => $mod_fcgid_starter,
'mreq' => $mod_fcgid_maxrequests,
'umask' => $mod_fcgid_umask,
'fpmslow' => $fpm_enableslowlog,
'fpmreqterm' => $fpm_reqtermtimeout,
'fpmreqslow' => $fpm_reqslowtimeout,
'phpsettings' => $phpsettings
);
Database::pexecute($ins_stmt, $ins_data);
inserttask('1');
$log->logAction(ADM_ACTION, LOG_INFO, "php.ini setting with description '" . $description . "' has been created by '" . $userinfo['loginname'] . "'");
redirectTo($filename, array('page' => $page, 's' => $s));
} else { } else {
if (file_exists(Froxlor::getInstallDir() . '/templates/misc/php/default.ini.php')) {
include Froxlor::getInstallDir() . '/templates/misc/php/default.ini.php';
$result = [
'phpsettings' => $phpini
];
} else {
// use first php-config as fallback
$result_stmt = Database::query("SELECT * FROM `" . TABLE_PANEL_PHPCONFIGS . "` WHERE `id` = 1"); $result_stmt = Database::query("SELECT * FROM `" . TABLE_PANEL_PHPCONFIGS . "` WHERE `id` = 1");
$result = $result_stmt->fetch(PDO::FETCH_ASSOC); $result = $result_stmt->fetch(PDO::FETCH_ASSOC);
$phpconfig_add_data = include_once dirname(__FILE__).'/lib/formfields/admin/phpconfig/formfield.phpconfig_add.php';
$phpconfig_add_form = htmlform::genHTMLForm($phpconfig_add_data);
$title = $phpconfig_add_data['phpconfig_add']['title'];
$image = $phpconfig_add_data['phpconfig_add']['image'];
eval("echo \"" . getTemplate("phpconfig/overview_add") . "\";");
} }
$fpmconfigs = [];
$configs = Database::query("SELECT * FROM `" . TABLE_PANEL_FPMDAEMONS . "` ORDER BY `description` ASC");
while ($row = $configs->fetch(PDO::FETCH_ASSOC)) {
$fpmconfigs[$row['id']] = $row['description'];
}
$phpconfig_add_data = include_once dirname(__FILE__) . '/lib/formfields/admin/phpconfig/formfield.phpconfig_add.php';
UI::view('user/form-replacers.html.twig', [
'formaction' => $linker->getLink(['section' => 'phpsettings']),
'formdata' => $phpconfig_add_data['phpconfig_add'],
'replacers' => $phpconfig_add_data['phpconfig_replacers']
]);
}
} else { } else {
standard_error('nopermissionsorinvalidid'); Response::standardError('nopermissionsorinvalidid');
} }
} }
if ($action == 'delete') { if ($action == 'delete') {
try {
$result_stmt = Database::prepare(" $json_result = PhpSettings::getLocal($userinfo, [
SELECT * FROM `" . TABLE_PANEL_PHPCONFIGS . "` WHERE `id` = :id" 'id' => $id
); ])->get();
$result = Database::pexecute_first($result_stmt, array('id' => $id)); } catch (Exception $e) {
Response::dynamicError($e->getMessage());
if ((Settings::Get('system.mod_fcgid') == '1'
&& Settings::Get('system.mod_fcgid_defaultini_ownvhost') == $id)
|| (Settings::Get('phpfpm.enabled') == '1'
&& Settings::Get('phpfpm.vhost_defaultini') == $id)
) {
standard_error('cannotdeletehostnamephpconfig');
} }
$result = json_decode($json_result, true)['data'];
if ((Settings::Get('system.mod_fcgid') == '1' if ($result['id'] != 0 && $result['id'] == $id && (int)$userinfo['change_serversettings'] == 1 && $id != 1) // cannot delete the default php.config
&& Settings::Get('system.mod_fcgid_defaultini') == $id) {
|| (Settings::Get('phpfpm.enabled') == '1' if (isset($_POST['send']) && $_POST['send'] == 'send') {
&& Settings::Get('phpfpm.defaultini') == $id) try {
) { PhpSettings::getLocal($userinfo, [
standard_error('cannotdeletedefaultphpconfig'); 'id' => $id
])->delete();
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
} }
Response::redirectTo($filename, [
if ($result['id'] != 0 'page' => $page
&& $result['id'] == $id ]);
&& (int)$userinfo['change_serversettings'] == 1
&& $id != 1 // cannot delete the default php.config
) {
if (isset($_POST['send'])
&& $_POST['send'] == 'send'
) {
// set php-config to default for all domains using the
// config that is to be deleted
$upd_stmt = Database::prepare("
UPDATE `" . TABLE_PANEL_DOMAINS . "` SET
`phpsettingid` = '1' WHERE `phpsettingid` = :id"
);
Database::pexecute($upd_stmt, array('id' => $id));
$del_stmt = Database::prepare("
DELETE FROM `" . TABLE_PANEL_PHPCONFIGS . "` WHERE `id` = :id"
);
Database::pexecute($del_stmt, array('id' => $id));
inserttask('1');
$log->logAction(ADM_ACTION, LOG_INFO, "php.ini setting with id #" . (int)$id . " has been deleted by '" . $userinfo['loginname'] . "'");
redirectTo($filename, array('page' => $page, 's' => $s));
} else { } else {
ask_yesno('phpsetting_reallydelete', $filename, array('id' => $id, 'page' => $page, 'action' => $action), $result['description']); HTML::askYesNo('phpsetting_reallydelete', $filename, [
'id' => $id,
'page' => $page,
'action' => $action
], $result['description']);
} }
} else { } else {
standard_error('nopermissionsorinvalidid'); Response::standardError('nopermissionsorinvalidid');
} }
} }
if ($action == 'edit') { if ($action == 'edit') {
try {
$result_stmt = Database::prepare(" $json_result = PhpSettings::getLocal($userinfo, [
SELECT * FROM `" . TABLE_PANEL_PHPCONFIGS . "` WHERE `id` = :id"
);
$result = Database::pexecute_first($result_stmt, array('id' => $id));
if ($result['id'] != 0
&& $result['id'] == $id
&& (int)$userinfo['change_serversettings'] == 1
) {
if (isset($_POST['send'])
&& $_POST['send'] == 'send'
) {
$description = validate($_POST['description'], 'description');
$phpsettings = validate(str_replace("\r\n", "\n", $_POST['phpsettings']), 'phpsettings', '/^[^\0]*$/');
if (Settings::Get('system.mod_fcgid') == 1) {
$binary = makeCorrectFile(validate($_POST['binary'], 'binary'));
$file_extensions = validate($_POST['file_extensions'], 'file_extensions', '/^[a-zA-Z0-9\s]*$/');
$mod_fcgid_starter = validate($_POST['mod_fcgid_starter'], 'mod_fcgid_starter', '/^[0-9]*$/', '', array('-1', ''));
$mod_fcgid_maxrequests = validate($_POST['mod_fcgid_maxrequests'], 'mod_fcgid_maxrequests', '/^[0-9]*$/', '', array('-1', ''));
$mod_fcgid_umask = validate($_POST['mod_fcgid_umask'], 'mod_fcgid_umask', '/^[0-9]*$/');
// disable fpm stuff
$fpm_enableslowlog = 0;
$fpm_reqtermtimeout = 0;
$fpm_reqslowtimeout = 0;
}
elseif (Settings::Get('phpfpm.enabled') == 1) {
$fpm_enableslowlog = isset($_POST['phpfpm_enable_slowlog']) ? (int)$_POST['phpfpm_enable_slowlog'] : 0;
$fpm_reqtermtimeout = validate($_POST['phpfpm_reqtermtimeout'], 'phpfpm_reqtermtimeout', '/^([0-9]+)(|s|m|h|d)$/');
$fpm_reqslowtimeout = validate($_POST['phpfpm_reqslowtimeout'], 'phpfpm_reqslowtimeout', '/^([0-9]+)(|s|m|h|d)$/');
// disable fcgid stuff
$binary = '/usr/bin/php-cgi';
$file_extensions = 'php';
$mod_fcgid_starter = 0;
$mod_fcgid_maxrequests = 0;
$mod_fcgid_umask = "022";
}
if (strlen($description) == 0
|| strlen($description) > 50
) {
standard_error('descriptioninvalid');
}
$upd_stmt = Database::prepare("
UPDATE `" . TABLE_PANEL_PHPCONFIGS . "` SET
`description` = :desc,
`binary` = :binary,
`file_extensions` = :fext,
`mod_fcgid_starter` = :starter,
`mod_fcgid_maxrequests` = :mreq,
`mod_fcgid_umask` = :umask,
`fpm_slowlog` = :fpmslow,
`fpm_reqterm` = :fpmreqterm,
`fpm_reqslow` = :fpmreqslow,
`phpsettings` = :phpsettings
WHERE `id` = :id"
);
$upd_data = array(
'desc' => $description,
'binary' => $binary,
'fext' => $file_extensions,
'starter' => $mod_fcgid_starter,
'mreq' => $mod_fcgid_maxrequests,
'umask' => $mod_fcgid_umask,
'fpmslow' => $fpm_enableslowlog,
'fpmreqterm' => $fpm_reqtermtimeout,
'fpmreqslow' => $fpm_reqslowtimeout,
'phpsettings' => $phpsettings,
'id' => $id 'id' => $id
); ])->get();
Database::pexecute($upd_stmt, $upd_data); } catch (Exception $e) {
Response::dynamicError($e->getMessage());
inserttask('1'); }
$log->logAction(ADM_ACTION, LOG_INFO, "php.ini setting with description '" . $description . "' has been changed by '" . $userinfo['loginname'] . "'"); $result = json_decode($json_result, true)['data'];
redirectTo($filename, array('page' => $page, 's' => $s));
if ($result['id'] != 0 && $result['id'] == $id && (int)$userinfo['change_serversettings'] == 1) {
if (isset($_POST['send']) && $_POST['send'] == 'send') {
try {
PhpSettings::getLocal($userinfo, $_POST)->update();
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
Response::redirectTo($filename, [
'page' => $page
]);
} else { } else {
$fpmconfigs = [];
$configs = Database::query("SELECT * FROM `" . TABLE_PANEL_FPMDAEMONS . "` ORDER BY `description` ASC");
while ($row = $configs->fetch(PDO::FETCH_ASSOC)) {
$fpmconfigs[$row['id']] = $row['description'];
}
$phpconfig_edit_data = include_once dirname(__FILE__) . '/lib/formfields/admin/phpconfig/formfield.phpconfig_edit.php'; $phpconfig_edit_data = include_once dirname(__FILE__) . '/lib/formfields/admin/phpconfig/formfield.phpconfig_edit.php';
$phpconfig_edit_form = htmlform::genHTMLForm($phpconfig_edit_data);
$title = $phpconfig_edit_data['phpconfig_edit']['title']; UI::view('user/form-replacers.html.twig', [
$image = $phpconfig_edit_data['phpconfig_edit']['image']; 'formaction' => $linker->getLink(['section' => 'phpsettings', 'id' => $id]),
'formdata' => $phpconfig_edit_data['phpconfig_edit'],
eval("echo \"" . getTemplate("phpconfig/overview_edit") . "\";"); 'replacers' => $phpconfig_edit_data['phpconfig_replacers'],
'editid' => $id
]);
} }
} else { } else {
standard_error('nopermissionsorinvalidid'); Response::standardError('nopermissionsorinvalidid');
}
}
} elseif ($page == 'fpmdaemons') {
if ($action == '') {
try {
$fpmconf_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/admin/tablelisting.fpmconfigs.php';
$collection = (new Collection(FpmDaemons::class, $userinfo))
->withPagination($fpmconf_list_data['fpmconf_list']['columns'], $fpmconf_list_data['fpmconf_list']['default_sorting']);
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
UI::view('user/table.html.twig', [
'listing' => Listing::format($collection, $fpmconf_list_data, 'fpmconf_list'),
'actions_links' => (bool)$userinfo['change_serversettings'] ? [
[
'href' => $linker->getLink(['section' => 'phpsettings', 'page' => $page, 'action' => 'add']),
'label' => lng('admin.fpmsettings.addnew')
]
] : []
]);
}
if ($action == 'add') {
if ((int)$userinfo['change_serversettings'] == 1) {
if (isset($_POST['send']) && $_POST['send'] == 'send') {
try {
FpmDaemons::getLocal($userinfo, $_POST)->add();
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
Response::redirectTo($filename, [
'page' => $page
]);
} else {
$fpmconfig_add_data = include_once dirname(__FILE__) . '/lib/formfields/admin/phpconfig/formfield.fpmconfig_add.php';
UI::view('user/form-replacers.html.twig', [
'formaction' => $linker->getLink(['section' => 'phpsettings', 'page' => 'fpmdaemons']),
'formdata' => $fpmconfig_add_data['fpmconfig_add'],
'replacers' => $fpmconfig_add_data['fpmconfig_replacers']
]);
}
} else {
Response::standardError('nopermissionsorinvalidid');
}
}
if ($action == 'delete') {
try {
$json_result = FpmDaemons::getLocal($userinfo, [
'id' => $id
])->get();
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
$result = json_decode($json_result, true)['data'];
if ($id == 1) {
Response::standardError('cannotdeletedefaultphpconfig');
}
if ($result['id'] != 0 && $result['id'] == $id && (int)$userinfo['change_serversettings'] == 1 && $id != 1) // cannot delete the default php.config
{
if (isset($_POST['send']) && $_POST['send'] == 'send') {
try {
FpmDaemons::getLocal($userinfo, $_POST)->delete();
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
Response::redirectTo($filename, [
'page' => $page
]);
} else {
HTML::askYesNo('fpmsetting_reallydelete', $filename, [
'id' => $id,
'page' => $page,
'action' => $action
], $result['description']);
}
} else {
Response::standardError('nopermissionsorinvalidid');
}
}
if ($action == 'edit') {
try {
$json_result = FpmDaemons::getLocal($userinfo, [
'id' => $id
])->get();
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
$result = json_decode($json_result, true)['data'];
if ($result['id'] != 0 && $result['id'] == $id && (int)$userinfo['change_serversettings'] == 1) {
if (isset($_POST['send']) && $_POST['send'] == 'send') {
try {
FpmDaemons::getLocal($userinfo, $_POST)->update();
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
Response::redirectTo($filename, [
'page' => $page
]);
} else {
$fpmconfig_edit_data = include_once dirname(__FILE__) . '/lib/formfields/admin/phpconfig/formfield.fpmconfig_edit.php';
UI::view('user/form-replacers.html.twig', [
'formaction' => $linker->getLink(['section' => 'phpsettings', 'page' => 'fpmdaemons', 'id' => $id]),
'formdata' => $fpmconfig_edit_data['fpmconfig_edit'],
'replacers' => $fpmconfig_edit_data['fpmconfig_replacers'],
'editid' => $id
]);
}
} else {
Response::standardError('nopermissionsorinvalidid');
} }
} }
} }

278
admin_plans.php Normal file
View File

@@ -0,0 +1,278 @@
<?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\HostingPlans;
use Froxlor\Api\Commands\MysqlServer;
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 == '' || $page == 'overview') {
if ($action == '') {
$log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, "viewed admin_plans");
try {
$plan_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/admin/tablelisting.plans.php';
$collection = (new Collection(HostingPlans::class, $userinfo))
->withPagination($plan_list_data['plan_list']['columns'], $plan_list_data['plan_list']['default_sorting']);
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
UI::view('user/table.html.twig', [
'listing' => Listing::format($collection, $plan_list_data, 'plan_list'),
'actions_links' => [
[
'href' => $linker->getLink(['section' => 'plans', 'page' => $page, 'action' => 'add']),
'label' => lng('admin.plans.add')
]
]
]);
} elseif ($action == 'delete' && $id != 0) {
try {
$json_result = HostingPlans::getLocal($userinfo, [
'id' => $id
])->get();
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
$result = json_decode($json_result, true)['data'];
if ($result['id'] != 0 && $result['id'] == $id && (int)$userinfo['adminid'] == $result['adminid']) {
if (isset($_POST['send']) && $_POST['send'] == 'send') {
try {
HostingPlans::getLocal($userinfo, [
'id' => $id
])->delete();
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
Response::redirectTo($filename, [
'page' => $page
]);
} else {
HTML::askYesNo('plan_reallydelete', $filename, [
'id' => $id,
'page' => $page,
'action' => $action
], $result['name']);
}
} else {
Response::standardError('nopermissionsorinvalidid');
}
} elseif ($action == 'add') {
if (isset($_POST['send']) && $_POST['send'] == 'send') {
try {
HostingPlans::getLocal($userinfo, $_POST)->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']
];
}
}
// dummy to avoid unknown variables
$hosting_plans = null;
$plans_add_data = include_once __DIR__ . '/lib/formfields/admin/plans/formfield.plans_add.php';
$cust_add_data = include_once __DIR__ . '/lib/formfields/admin/customer/formfield.customer_add.php';
// unset unneeded stuff
unset($cust_add_data['customer_add']['sections']['section_a']);
unset($cust_add_data['customer_add']['sections']['section_b']);
unset($cust_add_data['customer_add']['sections']['section_cpre']);
// merge
$plans_add_data['plans_add']['sections'] = array_merge($plans_add_data['plans_add']['sections'], $cust_add_data['customer_add']['sections']);
UI::view('user/form.html.twig', [
'formaction' => $linker->getLink(['section' => 'plans']),
'formdata' => $plans_add_data['plans_add']
]);
}
} elseif ($action == 'edit' && $id != 0) {
try {
$json_result = HostingPlans::getLocal($userinfo, [
'id' => $id
])->get();
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
$result = json_decode($json_result, true)['data'];
if ($result['name'] != '') {
$result['value'] = json_decode($result['value'], true);
$result = PhpHelper::htmlentitiesArray($result);
foreach ($result['value'] as $index => $value) {
$result[$index] = $value;
}
$result['allowed_phpconfigs'] = json_encode($result['allowed_phpconfigs']);
if (isset($_POST['send']) && $_POST['send'] == 'send') {
try {
HostingPlans::getLocal($userinfo, $_POST)->update();
} 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']
];
}
}
$result['imap'] = $result['email_imap'];
$result['pop3'] = $result['email_pop3'];
// dummy to avoid unknown variables
$result['loginname'] = null;
$result['documentroot'] = null;
$result['standardsubdomain'] = null;
$result['deactivated'] = null;
$result['def_language'] = null;
$result['firstname'] = null;
$result['gender'] = null;
$result['company'] = null;
$result['street'] = null;
$result['zipcode'] = null;
$result['city'] = null;
$result['phone'] = null;
$result['fax'] = null;
$result['email'] = null;
$result['customernumber'] = null;
$result['custom_notes'] = null;
$result['custom_notes_show'] = null;
$result['api_allowed'] = null;
$hosting_plans = null;
$admin_select = [];
$plans_edit_data = include_once __DIR__ . '/lib/formfields/admin/plans/formfield.plans_edit.php';
$cust_edit_data = include_once __DIR__ . '/lib/formfields/admin/customer/formfield.customer_edit.php';
// unset unneeded stuff
unset($cust_edit_data['customer_edit']['sections']['section_a']);
unset($cust_edit_data['customer_edit']['sections']['section_b']);
unset($cust_edit_data['customer_edit']['sections']['section_cpre']);
unset($cust_edit_data['customer_edit']['sections']['section_d']);
// merge
$plans_edit_data['plans_edit']['sections'] = array_merge($plans_edit_data['plans_edit']['sections'], $cust_edit_data['customer_edit']['sections']);
UI::view('user/form.html.twig', [
'formaction' => $linker->getLink(['section' => 'plans', 'id' => $id]),
'formdata' => $plans_edit_data['plans_edit'],
'editid' => $id
]);
}
}
} elseif ($action == 'jqGetPlanValues') {
$planid = (int)Request::any('planid', 0);
try {
$json_result = HostingPlans::getLocal($userinfo, [
'id' => $planid
])->get();
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
$result = json_decode($json_result, true)['data'];
echo $result['value'];
exit();
}
}

View File

@@ -2,38 +2,52 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Panel
* *
* 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
*/ */
define('AREA', 'admin'); use Froxlor\Api\Commands\Froxlor;
require './lib/init.php'; use Froxlor\Cron\TaskId;
use Froxlor\Database\Database;
use Froxlor\Database\IntegrityCheck;
use Froxlor\FroxlorLogger;
use Froxlor\PhpHelper;
use Froxlor\Settings;
use Froxlor\System\Cronjob;
use Froxlor\UI\Form;
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 PHPMailer\PHPMailer\PHPMailer;
// get sql-root access data const AREA = 'admin';
Database::needRoot(true); require __DIR__ . '/lib/init.php';
Database::needSqlData();
$sql_root = Database::getSqlData();
Database::needRoot(false);
if ($page == 'overview' && $userinfo['change_serversettings'] == '1') { if ($page == 'overview' && $userinfo['change_serversettings'] == '1') {
$settings_data = loadConfigArrayDir('./actions/admin/settings/'); $settings_data = PhpHelper::loadConfigArrayDir('./actions/admin/settings/');
$settings = loadSettings($settings_data); Settings::loadSettingsInto($settings_data);
if (isset($_POST['send'])
&& $_POST['send'] == 'send'
) {
if (isset($_POST['send']) && $_POST['send'] == 'send') {
$_part = isset($_GET['part']) ? $_GET['part'] : ''; $_part = isset($_GET['part']) ? $_GET['part'] : '';
if ($_part == '') { if ($_part == '') {
$_part = isset($_POST['part']) ? $_POST['part'] : ''; $_part = isset($_POST['part']) ? $_POST['part'] : '';
@@ -48,7 +62,6 @@ if ($page == 'overview' && $userinfo['change_serversettings'] == '1') {
$settings_part = true; $settings_part = true;
} }
$only_enabledisable = false; $only_enabledisable = false;
} else { } else {
$settings_all = false; $settings_all = false;
$settings_part = false; $settings_part = false;
@@ -56,192 +69,135 @@ if ($page == 'overview' && $userinfo['change_serversettings'] == '1') {
} }
// check if the session timeout is too low #815 // check if the session timeout is too low #815
if (isset($_POST['session_sessiontimeout']) if (isset($_POST['session_sessiontimeout']) && $_POST['session_sessiontimeout'] < 60) {
&& $_POST['session_sessiontimeout'] < 60 Response::standardError(lng('error.session_timeout'), lng('error.session_timeout_desc'));
) {
standard_error($lng['error']['session_timeout'], $lng['error']['session_timeout_desc']);
} }
if (processFormEx( try {
$settings_data, if (Form::processForm($settings_data, $_POST, [
$_POST, 'filename' => $filename,
array('filename' => $filename, 'action' => $action, 'page' => $page), 'action' => $action,
$_part, 'page' => $page
$settings_all, ], $_part, $settings_all, $settings_part, $only_enabledisable)) {
$settings_part, $log->logAction(FroxlorLogger::ADM_ACTION, LOG_INFO, "rebuild configfiles due to changed setting");
$only_enabledisable Cronjob::inserttask(TaskId::REBUILD_VHOST);
)
) {
$log->logAction(ADM_ACTION, LOG_INFO, "rebuild configfiles due to changed setting");
inserttask('1');
// Using nameserver, insert a task which rebuilds the server config // Using nameserver, insert a task which rebuilds the server config
inserttask('4'); Cronjob::inserttask(TaskId::REBUILD_DNS);
// cron.d file
Cronjob::inserttask(TaskId::REBUILD_CRON);
standard_success('settingssaved', '', array('filename' => $filename, 'action' => $action, 'page' => $page)); Response::standardSuccess('settingssaved', '', [
'filename' => $filename,
'action' => $action,
'page' => $page
]);
}
} catch (Exception $e) {
Response::dynamicError($e->getMessage(), $e->getCode());
} }
} else { } else {
$_part = isset($_GET['part']) ? $_GET['part'] : ''; $_part = isset($_GET['part']) ? $_GET['part'] : '';
if ($_part == '') { if ($_part == '') {
$_part = isset($_POST['part']) ? $_POST['part'] : ''; $_part = isset($_POST['part']) ? $_POST['part'] : '';
} }
$fields = buildFormEx($settings_data, $_part); $fields = Form::buildForm($settings_data, $_part);
$settings_page = ''; if ($_part == '' || $_part == 'all') {
if ($_part == '') { UI::view('settings/index.html.twig', ['fields' => $fields]);
eval("\$settings_page .= \"" . getTemplate("settings/settings_overview") . "\";");
} else { } else {
eval("\$settings_page .= \"" . getTemplate("settings/settings") . "\";"); $em = Request::any('em', '');
UI::view('settings/detailpart.html.twig', ['fields' => $fields, 'em' => $em]);
} }
eval("echo \"" . getTemplate("settings/settings_form_begin") . "\";");
eval("echo \$settings_page;");
eval("echo \"" . getTemplate("settings/settings_form_end") . "\";");
} }
} elseif ($page == 'phpinfo' && $userinfo['change_serversettings'] == '1') {
} elseif($page == 'phpinfo'
&& $userinfo['change_serversettings'] == '1'
) {
ob_start(); ob_start();
phpinfo(); phpinfo();
$phpinfo = array('phpinfo' => array()); $phpinfo = [
if (preg_match_all( 'phpinfo' => []
'#(?:<h2>(?:<a name=".*?">)?(.*?)(?:</a>)?</h2>)|(?:<tr(?: class=".*?")?><t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>(?:<t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>(?:<t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>)?)?</tr>)#s', ];
ob_get_clean(), $matches, PREG_SET_ORDER if (preg_match_all('#(?:<h2>(?:<a name=".*?">)?(.*?)(?:</a>)?</h2>)|(?:<tr(?: class=".*?")?><t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>(?:<t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>(?:<t[hd](?: class=".*?")?>(.*?)\s*</t[hd]>)?)?</tr>)#s', ob_get_clean(), $matches, PREG_SET_ORDER)) {
)
) {
foreach ($matches as $match) { foreach ($matches as $match) {
$end = array_keys($phpinfo); $end = array_keys($phpinfo);
$end = end($end); $end = end($end);
if (strlen($match[1])) { if (strlen($match[1])) {
$phpinfo[$match[1]] = array(); $phpinfo[$match[1]] = [];
} elseif (isset($match[3])) { } elseif (isset($match[3])) {
$phpinfo[$end][$match[2]] = isset($match[4]) ? array($match[3], $match[4]) : $match[3]; $phpinfo[$end][$match[2]] = isset($match[4]) ? [
$match[3],
$match[4]
] : $match[3];
} else { } else {
$phpinfo[$end][] = $match[2]; $phpinfo[$end][] = $match[2];
} }
} }
$phpinfohtml = '';
foreach ($phpinfo as $name => $section) {
$phpinfoentries = "";
foreach ($section as $key => $val) {
if (is_array($val)) {
eval("\$phpinfoentries .= \"" . getTemplate("settings/phpinfo/phpinfo_3") . "\";");
} elseif (is_string($key)) {
eval("\$phpinfoentries .= \"" . getTemplate("settings/phpinfo/phpinfo_2") . "\";");
} else { } else {
eval("\$phpinfoentries .= \"" . getTemplate("settings/phpinfo/phpinfo_1") . "\";"); Response::standardError(lng('error.no_phpinfo'));
} }
} UI::view('settings/phpinfo.html.twig', [
// first header -> show actual php version 'phpversion' => PHP_VERSION,
if (strtolower($name) == "phpinfo") { 'phpinfo' => $phpinfo
$name = "PHP ".PHP_VERSION; ]);
} } elseif ($page == 'rebuildconfigs' && $userinfo['change_serversettings'] == '1') {
eval("\$phpinfohtml .= \"" . getTemplate("settings/phpinfo/phpinfo_table") . "\";"); if (isset($_POST['send']) && $_POST['send'] == 'send') {
} $log->logAction(FroxlorLogger::ADM_ACTION, LOG_INFO, "rebuild configfiles");
$phpinfo = $phpinfohtml; Cronjob::inserttask(TaskId::REBUILD_VHOST);
} else { Cronjob::inserttask(TaskId::CREATE_QUOTA);
standard_error($lng['error']['no_phpinfo']);
}
eval("echo \"" . getTemplate("settings/phpinfo") . "\";");
} elseif($page == 'rebuildconfigs'
&& $userinfo['change_serversettings'] == '1'
) {
if (isset($_POST['send'])
&& $_POST['send'] == 'send'
) {
$log->logAction(ADM_ACTION, LOG_INFO, "rebuild configfiles");
inserttask('1');
inserttask('10');
// Using nameserver, insert a task which rebuilds the server config // Using nameserver, insert a task which rebuilds the server config
inserttask('4'); Cronjob::inserttask(TaskId::REBUILD_DNS);
// cron.d file // cron.d file
inserttask('99'); Cronjob::inserttask(TaskId::REBUILD_CRON);
standard_success('rebuildingconfigs', '', array('filename' => 'admin_index.php'));
Response::standardSuccess('rebuildingconfigs', '', [
'filename' => 'admin_index.php'
]);
} else { } else {
ask_yesno('admin_configs_reallyrebuild', $filename, array('page' => $page)); HTML::askYesNo('admin_configs_reallyrebuild', $filename, [
'page' => $page
]);
} }
} elseif ($page == 'updatecounters' && $userinfo['change_serversettings'] == '1') {
} elseif($page == 'updatecounters' if (isset($_POST['send']) && $_POST['send'] == 'send') {
&& $userinfo['change_serversettings'] == '1' $log->logAction(FroxlorLogger::ADM_ACTION, LOG_INFO, "updated resource-counters");
) { $updatecounters = User::updateCounters(true);
UI::view('user/resource-counter.html.twig', [
if (isset($_POST['send']) 'counters' => $updatecounters
&& $_POST['send'] == 'send' ]);
) {
$log->logAction(ADM_ACTION, LOG_INFO, "updated resource-counters");
$updatecounters = updateCounters(true);
$customers = '';
foreach ($updatecounters['customers'] as $customerid => $customer) {
eval("\$customers.=\"" . getTemplate("settings/updatecounters_row_customer") . "\";");
}
$admins = '';
foreach ($updatecounters['admins'] as $adminid => $admin) {
eval("\$admins.=\"" . getTemplate("settings/updatecounters_row_admin") . "\";");
}
eval("echo \"" . getTemplate("settings/updatecounters") . "\";");
} else { } else {
ask_yesno('admin_counters_reallyupdate', $filename, array('page' => $page)); HTML::askYesNo('admin_counters_reallyupdate', $filename, [
'page' => $page
]);
} }
} elseif ($page == 'wipecleartextmailpws' && $userinfo['change_serversettings'] == '1') {
} elseif ($page == 'wipecleartextmailpws' if (isset($_POST['send']) && $_POST['send'] == 'send') {
&& $userinfo['change_serversettings'] == '1' $log->logAction(FroxlorLogger::ADM_ACTION, LOG_WARNING, "wiped all cleartext mail passwords");
) {
if (isset($_POST['send'])
&& $_POST['send'] == 'send'
) {
$log->logAction(ADM_ACTION, LOG_WARNING, "wiped all cleartext mail passwords");
Database::query("UPDATE `" . TABLE_MAIL_USERS . "` SET `password` = '';"); Database::query("UPDATE `" . TABLE_MAIL_USERS . "` SET `password` = '';");
Database::query("UPDATE `" . TABLE_PANEL_SETTINGS . "` SET `value` = '0' WHERE `settinggroup` = 'system' AND `varname` = 'mailpwcleartext'"); Database::query("UPDATE `" . TABLE_PANEL_SETTINGS . "` SET `value` = '0' WHERE `settinggroup` = 'system' AND `varname` = 'mailpwcleartext'");
redirectTo($filename, array('s' => $s)); Response::redirectTo($filename);
} else { } else {
ask_yesno('admin_cleartextmailpws_reallywipe', $filename, array('page' => $page)); HTML::askYesNo('admin_cleartextmailpws_reallywipe', $filename, [
'page' => $page
]);
} }
} elseif ($page == 'wipequotas' && $userinfo['change_serversettings'] == '1') {
} elseif($page == 'wipequotas' if (isset($_POST['send']) && $_POST['send'] == 'send') {
&& $userinfo['change_serversettings'] == '1' $log->logAction(FroxlorLogger::ADM_ACTION, LOG_WARNING, "wiped all mailquotas");
) {
if (isset($_POST['send'])
&& $_POST['send'] == 'send'
) {
$log->logAction(ADM_ACTION, LOG_WARNING, "wiped all mailquotas");
// Set the quota to 0 which means unlimited // Set the quota to 0 which means unlimited
Database::query("UPDATE `" . TABLE_MAIL_USERS . "` SET `quota` = '0';"); Database::query("UPDATE `" . TABLE_MAIL_USERS . "` SET `quota` = '0';");
Database::query("UPDATE `" . TABLE_PANEL_CUSTOMERS . "` SET `email_quota_used` = '0'"); Database::query("UPDATE `" . TABLE_PANEL_CUSTOMERS . "` SET `email_quota_used` = '0'");
redirectTo($filename, array('s' => $s)); Response::redirectTo($filename);
} else { } else {
ask_yesno('admin_quotas_reallywipe', $filename, array('page' => $page)); HTML::askYesNo('admin_quotas_reallywipe', $filename, [
'page' => $page
]);
} }
} elseif ($page == 'enforcequotas' && $userinfo['change_serversettings'] == '1') {
} elseif ($page == 'enforcequotas' if (isset($_POST['send']) && $_POST['send'] == 'send') {
&& $userinfo['change_serversettings'] == '1'
) {
if (isset($_POST['send'])
&& $_POST['send'] == 'send'
) {
// Fetch all accounts // Fetch all accounts
$result_stmt = Database::query("SELECT `quota`, `customerid` FROM `" . TABLE_MAIL_USERS . "`"); $result_stmt = Database::query("SELECT `quota`, `customerid` FROM `" . TABLE_MAIL_USERS . "`");
if (Database::num_rows() > 0) { if (Database::num_rows() > 0) {
$upd_stmt = Database::prepare(" $upd_stmt = Database::prepare("
UPDATE `" . TABLE_PANEL_CUSTOMERS . "` SET UPDATE `" . TABLE_PANEL_CUSTOMERS . "` SET
`email_quota_used` = `email_quota_used` + :diff `email_quota_used` = `email_quota_used` + :diff
@@ -250,7 +206,10 @@ if ($page == 'overview' && $userinfo['change_serversettings'] == '1') {
while ($array = $result_stmt->fetch(PDO::FETCH_ASSOC)) { while ($array = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
$difference = Settings::Get('system.mail_quota') - $array['quota']; $difference = Settings::Get('system.mail_quota') - $array['quota'];
Database::pexecute($upd_stmt, array('diff' => $difference, 'customerid' => $customerid)); Database::pexecute($upd_stmt, [
'diff' => $difference,
'customerid' => $customerid
]);
} }
} }
@@ -258,35 +217,205 @@ if ($page == 'overview' && $userinfo['change_serversettings'] == '1') {
$upd_stmt = Database::prepare(" $upd_stmt = Database::prepare("
UPDATE `" . TABLE_MAIL_USERS . "` SET `quota` = :quota UPDATE `" . TABLE_MAIL_USERS . "` SET `quota` = :quota
"); ");
Database::pexecute($upd_stmt, array('quota' => Settings::Get('system.mail_quota'))); Database::pexecute($upd_stmt, [
'quota' => Settings::Get('system.mail_quota')
]);
// Update the Customer, if the used quota is bigger than the allowed quota // Update the Customer, if the used quota is bigger than the allowed quota
Database::query("UPDATE `" . TABLE_PANEL_CUSTOMERS . "` SET `email_quota` = `email_quota_used` WHERE `email_quota` < `email_quota_used`"); Database::query("UPDATE `" . TABLE_PANEL_CUSTOMERS . "` SET `email_quota` = `email_quota_used` WHERE `email_quota` < `email_quota_used`");
$log->logAction(ADM_ACTION, LOG_WARNING, 'enforcing mailquota to all customers: ' . Settings::Get('system.mail_quota') . ' MB'); $log->logAction(FroxlorLogger::ADM_ACTION, LOG_WARNING, 'enforcing mailquota to all customers: ' . Settings::Get('system.mail_quota') . ' MB');
redirectTo($filename, array('s' => $s)); Response::redirectTo($filename);
} else { } else {
ask_yesno('admin_quotas_reallyenforce', $filename, array('page' => $page)); HTML::askYesNo('admin_quotas_reallyenforce', $filename, [
'page' => $page
]);
} }
} elseif ($page == 'integritycheck' } elseif ($page == 'integritycheck' && $userinfo['change_serversettings'] == '1') {
&& $userinfo['change_serversettings'] == '1'
) {
$integrity = new IntegrityCheck(); $integrity = new IntegrityCheck();
if (isset($_POST['send']) if (isset($_POST['send']) && $_POST['send'] == 'send') {
&& $_POST['send'] == 'send'
) {
$integrity->fixAll(); $integrity->fixAll();
} elseif(isset($_GET['action']) } elseif (isset($_GET['action']) && $_GET['action'] == "fix") {
&& $_GET['action'] == "fix") { HTML::askYesNo('admin_integritycheck_reallyfix', $filename, [
ask_yesno('admin_integritycheck_reallyfix', $filename, array('page' => $page)); 'page' => $page
]);
} }
$integritycheck = ''; $integritycheck = [];
foreach ($integrity->available as $id => $check) { foreach ($integrity->available as $id => $check) {
$displayid = $id + 1; $integritycheck[] = [
$result = $integrity->$check(); 'displayid' => $id + 1,
$checkdesc = $lng['integrity_check'][$check]; 'result' => $integrity->$check(),
eval("\$integritycheck.=\"" . getTemplate("settings/integritycheck_row") . "\";"); 'checkdesc' => lng('integrity_check.' . $check)
];
} }
eval("echo \"" . getTemplate("settings/integritycheck") . "\";");
$integrity_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/admin/tablelisting.integrity.php';
$collection = [
'data' => $integritycheck,
'pagination' => []
];
UI::view('user/table.html.twig', [
'listing' => Listing::formatFromArray($collection, $integrity_list_data['integrity_list'], 'integrity_list'),
'actions_links' => [
[
'href' => $linker->getLink(['section' => 'settings', 'page' => $page, 'action' => 'fix']),
'label' => lng('admin.integrityfix'),
'icon' => 'fa-solid fa-screwdriver-wrench',
'class' => 'btn-warning'
]
]
]);
} elseif ($page == 'importexport' && $userinfo['change_serversettings'] == '1') {
// check for json-stuff
if (!extension_loaded('json')) {
Response::standardError('jsonextensionnotfound');
}
if (isset($_GET['action']) && $_GET['action'] == "export") {
// export
try {
$json_result = Froxlor::getLocal($userinfo)->exportSettings();
$json_export = json_decode($json_result, true)['data'];
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
header('Content-disposition: attachment; filename=Froxlor_settings-' . \Froxlor\Froxlor::VERSION . '-' . \Froxlor\Froxlor::DBVERSION . '_' . date('d.m.Y') . '.json');
header('Content-type: application/json');
echo $json_export;
exit();
} elseif (isset($_GET['action']) && $_GET['action'] == "import") {
// import
if (isset($_POST['send']) && $_POST['send'] == 'send') {
// get uploaded file
if (isset($_FILES["import_file"]["tmp_name"])) {
$imp_content = file_get_contents($_FILES["import_file"]["tmp_name"]);
try {
Froxlor::getLocal($userinfo, [
'json_str' => $imp_content
])->importSettings();
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
Response::standardSuccess('settingsimported', '', [
'filename' => 'admin_settings.php'
]);
}
Response::dynamicError("Upload failed");
}
} else {
$settings_data = include_once dirname(__FILE__) . '/lib/formfields/admin/settings/formfield.settings_import.php';
UI::view('user/form.html.twig', [
'formaction' => $linker->getLink(['section' => 'settings', 'page' => $page, 'action' => 'import']),
'formdata' => $settings_data['settings_import'],
'actions_links' => [
[
'class' => 'btn-outline-primary',
'href' => $linker->getLink(['section' => 'settings', 'page' => 'overview']),
'label' => lng('admin.configfiles.overview'),
'icon' => 'fa-solid fa-grip'
],
[
'class' => 'btn-outline-secondary',
'href' => $linker->getLink(['section' => 'settings', 'page' => $page, 'action' => 'export']),
'label' => 'Download/export ' . lng('admin.serversettings'),
'icon' => 'fa-solid fa-file-import'
]
]
]);
}
} elseif ($page == 'testmail') {
$note_type = 'info';
$note_msg = lng('admin.smtptestnote');
if (isset($_POST['send']) && $_POST['send'] == 'send') {
$test_addr = isset($_POST['test_addr']) ? $_POST['test_addr'] : null;
// Initialize the mailingsystem
$testmail = new PHPMailer(true);
$testmail->CharSet = "UTF-8";
if (Settings::Get('system.mail_use_smtp')) {
$testmail->isSMTP();
$testmail->Host = Settings::Get('system.mail_smtp_host');
$testmail->SMTPAuth = Settings::Get('system.mail_smtp_auth') == '1';
$testmail->Username = Settings::Get('system.mail_smtp_user');
$testmail->Password = Settings::Get('system.mail_smtp_passwd');
if (Settings::Get('system.mail_smtp_usetls')) {
$testmail->SMTPSecure = 'tls';
} else {
$testmail->SMTPAutoTLS = false;
}
$testmail->Port = Settings::Get('system.mail_smtp_port');
}
$_mailerror = false;
if (PHPMailer::ValidateAddress(Settings::Get('panel.adminmail')) !== false) {
// set return-to address and custom sender-name, see #76
$testmail->SetFrom(Settings::Get('panel.adminmail'), Settings::Get('panel.adminmail_defname'));
if (Settings::Get('panel.adminmail_return') != '') {
$testmail->AddReplyTo(Settings::Get('panel.adminmail_return'), Settings::Get('panel.adminmail_defname'));
}
try {
$testmail->Subject = "Froxlor Test-Mail";
$mail_body = "Yay, this worked :)";
$testmail->AltBody = $mail_body;
$testmail->MsgHTML(str_replace("\n", "<br />", $mail_body));
$testmail->AddAddress($test_addr);
$testmail->Send();
} catch (\PHPMailer\PHPMailer\Exception $e) {
$note_type = 'danger';
$note_msg = $e->getMessage();
$_mailerror = true;
} catch (Exception $e) {
$note_type = 'danger';
$note_msg = $e->getMessage();
$_mailerror = true;
}
if (!$_mailerror) {
// success
$mail->ClearAddresses();
Response::standardSuccess('testmailsent', '', [
'filename' => 'admin_settings.php',
'page' => 'testmail'
]);
}
} else {
// invalid sender e-mail
$note_type = 'warning';
$note_msg = "Invalid sender e-mail address: " . Settings::Get('panel.adminmail');
}
}
$mailtest_add_data = include_once dirname(__FILE__) . '/lib/formfields/admin/settings/formfield.settings_mailtest.php';
UI::view('user/form-note.html.twig', [
'formaction' => $linker->getLink(['section' => 'settings']),
'formdata' => $mailtest_add_data['mailtest'],
'actions_links' => [
[
'href' => $linker->getLink([
'section' => 'settings',
'page' => 'overview',
'part' => 'system',
'em' => 'system_mail_use_smtp'
]),
'label' => lng('admin.smtpsettings'),
'icon' => 'fa-solid fa-gears',
'class' => 'btn-outline-secondary'
]
],
// alert-box
'type' => $note_type,
'alert_msg' => $note_msg
]);
} elseif ($page == 'toggleSettingsMode') {
if ($userinfo['change_serversettings'] == '1') {
$cmode = Settings::Get('panel.settings_mode');
Settings::Set('panel.settings_mode', (int)(!(bool)$cmode));
}
Response::redirectTo($filename);
} }

View File

@@ -2,267 +2,318 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Panel
* *
* 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
*/ */
define('AREA', 'admin'); const AREA = 'admin';
require './lib/init.php'; require __DIR__ . '/lib/init.php';
if (isset($_POST['subjectid'])) { use Froxlor\Database\Database;
$subjectid = intval($_POST['subjectid']); use Froxlor\FroxlorLogger;
$mailbodyid = intval($_POST['mailbodyid']); use Froxlor\Language;
use Froxlor\PhpHelper;
use Froxlor\Settings;
use Froxlor\UI\HTML;
use Froxlor\UI\Listing;
use Froxlor\UI\Panel\UI;
use Froxlor\UI\Request;
use Froxlor\UI\Response;
use Froxlor\Validate\Validate;
use Froxlor\CurrentUser;
} elseif(isset($_GET['subjectid'])) { $id = (int)Request::any('id');
$subjectid = intval($_GET['subjectid']); $subjectid = intval(Request::any('subjectid'));
$mailbodyid = intval($_GET['mailbodyid']); $mailbodyid = intval(Request::any('mailbodyid'));
}
if (isset($_POST['id'])) { $available_templates = [
$id = intval($_POST['id']);
} elseif(isset($_GET['id'])) {
$id = intval($_GET['id']);
}
$available_templates = array(
'createcustomer', 'createcustomer',
'pop_success', 'pop_success',
'new_database_by_customer', 'new_database_by_customer',
'new_ftpaccount_by_customer', 'new_ftpaccount_by_customer',
'password_reset' 'password_reset'
); ];
// only show templates of features that are enabled #1191 // only show templates of features that are enabled #1191
if ((int)Settings::Get('system.report_enable') == 1) { if ((int)Settings::Get('system.report_enable') == 1) {
array_push($available_templates, array_push($available_templates, 'trafficmaxpercent', 'diskmaxpercent');
'trafficmaxpercent', }
'diskmaxpercent' if (Settings::Get('panel.sendalternativemail') == 1) {
); array_push($available_templates, 'pop_success_alternative');
} }
if ((int)Settings::Get('ticket.enabled') == 1) { $file_templates = [
array_push($available_templates,
'new_ticket_by_customer',
'new_ticket_for_customer',
'new_ticket_by_staff',
'new_reply_ticket_by_customer',
'new_reply_ticket_by_staff'
);
}
$file_templates = array(
'index_html' 'index_html'
); ];
$languages = Language::getLanguages();
if ($action == '') { if ($action == '') {
// email templates // email templates
$log->logAction(ADM_ACTION, LOG_NOTICE, "viewed admin_templates"); $log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, "viewed admin_templates");
if (Settings::Get('panel.sendalternativemail') == 1) { $templates_array = [];
$available_templates[] = 'pop_success_alternative';
}
$templates_array = array();
$result_stmt = Database::prepare(" $result_stmt = Database::prepare("
SELECT `id`, `language`, `varname` FROM `" . TABLE_PANEL_TEMPLATES . "` SELECT `id`, `language`, `varname` FROM `" . TABLE_PANEL_TEMPLATES . "`
WHERE `adminid` = :adminid AND `templategroup`='mails' WHERE `adminid` = :adminid AND `templategroup`='mails'
ORDER BY `language`, `varname`" ORDER BY `language`, `varname`
); ");
Database::pexecute($result_stmt, array('adminid' => $userinfo['adminid'])); Database::pexecute($result_stmt, [
'adminid' => $userinfo['adminid']
]);
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) { while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
$parts = array(); $parts = [];
preg_match('/^([a-z]([a-z_]+[a-z])*)_(mailbody|subject)$/', $row['varname'], $parts); preg_match('/^([a-z]([a-z_]+[a-z])*)_(mailbody|subject)$/', $row['varname'], $parts);
$templates_array[$row['language']][$parts[1]][$parts[3]] = $row['id']; $templates_array[$row['language']][$parts[1]][$parts[3]] = $row['id'];
} }
$templates = ''; $templates = [];
foreach ($templates_array as $language => $template_defs) { foreach ($templates_array as $language => $template_defs) {
foreach ($template_defs as $action => $email) { foreach ($template_defs as $action => $email) {
$subjectid = $email['subject']; $templates[] = [
$mailbodyid = $email['mailbody']; 'subjectid' => $email['subject'],
$template = $lng['admin']['templates'][$action]; 'mailbodyid' => $email['mailbody'],
eval("\$templates.=\"" . getTemplate("templates/templates_template") . "\";"); 'template' => lng('admin.templates.' . $action),
'language' => $language
];
} }
} }
$add = false; $mail_actions_links = false;
while (list($language_file, $language_name) = each($languages)) { foreach ($languages as $language_file => $language_name) {
$templates_done = [];
$templates_done = array();
$result_stmt = Database::prepare(" $result_stmt = Database::prepare("
SELECT `varname` FROM `" . TABLE_PANEL_TEMPLATES . "` SELECT `varname` FROM `" . TABLE_PANEL_TEMPLATES . "`
WHERE `adminid` = :adminid AND `language`= :lang WHERE `adminid` = :adminid AND `language`= :lang
AND `templategroup` = 'mails' AND `varname` LIKE '%_subject'" AND `templategroup` = 'mails' AND `varname` LIKE '%_subject'
); ");
Database::pexecute($result_stmt, array('adminid' => $userinfo['adminid'], 'lang' => $language_name)); Database::pexecute($result_stmt, [
'adminid' => $userinfo['adminid'],
'lang' => $language_name
]);
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) { while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
$templates_done[] = str_replace('_subject', '', $row['varname']); $templates_done[] = str_replace('_subject', '', $row['varname']);
} }
if (count(array_diff($available_templates, $templates_done)) > 0) { if (count(array_diff($available_templates, $templates_done)) > 0) {
$add = true; $mail_actions_links = [
[
'href' => $linker->getLink(['section' => 'templates', 'page' => $page, 'action' => 'add']),
'label' => lng('admin.templates.template_add')
]
];
} }
} }
$mailtpl_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/admin/tablelisting.mailtemplates.php';
$collection_mail = [
'data' => $templates,
'pagination' => []
];
// filetemplates // filetemplates
$filetemplates = '';
$filetemplateadd = false;
$result_stmt = Database::prepare(" $result_stmt = Database::prepare("
SELECT `id`, `varname` FROM `" . TABLE_PANEL_TEMPLATES . "` SELECT `id`, `varname` FROM `" . TABLE_PANEL_TEMPLATES . "`
WHERE `adminid` = :adminid AND `templategroup`='files'" WHERE `adminid` = :adminid AND `templategroup`='files'");
); Database::pexecute($result_stmt, [
Database::pexecute($result_stmt, array('adminid' => $userinfo['adminid'])); 'adminid' => $userinfo['adminid']
]);
if (Database::num_rows() != count($file_templates)) {
$filetemplateadd = true;
}
$filetemplates = [];
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) { while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
eval("\$filetemplates.=\"" . getTemplate("templates/templates_filetemplate") . "\";"); $filetemplates[] = [
'id' => $row['id'],
'template' => lng('admin.templates.' . $row['varname'])
];
} }
eval("echo \"" . getTemplate("templates/templates") . "\";");
} elseif($action == 'delete' $file_actions_links = false;
&& $subjectid != 0 if (Database::num_rows() != count($file_templates)) {
&& $mailbodyid != 0 $file_actions_links = [
) { [
'href' => $linker->getLink([
'section' => 'templates',
'page' => $page,
'action' => 'add',
'files' => 'files'
]),
'label' => lng('admin.templates.template_fileadd')
]
];
}
$filetpl_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/admin/tablelisting.filetemplates.php';
$collection_file = [
'data' => $filetemplates,
'pagination' => []
];
if ($mail_actions_links === false) {
$mail_actions_links = [];
}
if ($file_actions_links === false) {
$file_actions_links = [];
}
UI::view('user/table-tpl.html.twig', [
'maillisting' => Listing::formatFromArray($collection_mail, $mailtpl_list_data['mailtpl_list'], 'mailtpl_list'),
'filelisting' => Listing::formatFromArray($collection_file, $filetpl_list_data['filetpl_list'], 'filetpl_list'),
'actions_links' => array_merge($mail_actions_links, $file_actions_links)
]);
} elseif ($action == 'delete' && $subjectid != 0 && $mailbodyid != 0) {
// email templates // email templates
$result_stmt = Database::prepare(" $result_stmt = Database::prepare("
SELECT `language`, `varname` FROM `" . TABLE_PANEL_TEMPLATES . "` SELECT `language`, `varname` FROM `" . TABLE_PANEL_TEMPLATES . "`
WHERE `adminid` = :adminid AND `id` = :id" WHERE `adminid` = :adminid AND `id` = :id");
); Database::pexecute($result_stmt, [
Database::pexecute($result_stmt, array('adminid' => $userinfo['adminid'], 'id' => $subjectid)); 'adminid' => $userinfo['adminid'],
'id' => $subjectid
]);
$result = $result_stmt->fetch(PDO::FETCH_ASSOC); $result = $result_stmt->fetch(PDO::FETCH_ASSOC);
if ($result['varname'] != '') { if ($result['varname'] != '') {
if (isset($_POST['send']) if (isset($_POST['send']) && $_POST['send'] == 'send') {
&& $_POST['send'] == 'send'
) {
$del_stmt = Database::prepare(" $del_stmt = Database::prepare("
DELETE FROM `" . TABLE_PANEL_TEMPLATES . "` DELETE FROM `" . TABLE_PANEL_TEMPLATES . "`
WHERE `adminid` = :adminid WHERE `adminid` = :adminid
AND (`id` = :ida OR `id` = :idb)" AND (`id` = :ida OR `id` = :idb)");
); Database::pexecute($del_stmt, [
Database::pexecute($del_stmt, array(
'adminid' => $userinfo['adminid'], 'adminid' => $userinfo['adminid'],
'ida' => $subjectid, 'ida' => $subjectid,
'idb' => $mailbodyid 'idb' => $mailbodyid
)); ]);
$log->logAction(ADM_ACTION, LOG_INFO, "deleted template '" . $result['language'] . ' - ' . $lng['admin']['templates'][str_replace('_subject', '', $result['varname'])] . "'"); $log->logAction(FroxlorLogger::ADM_ACTION, LOG_INFO, "deleted template '" . $result['language'] . ' - ' . lng('admin.templates.' . str_replace('_subject', '', $result['varname'])) . "'");
redirectTo($filename, array('page' => $page, 's' => $s)); Response::redirectTo($filename, [
'page' => $page
]);
} else { } else {
ask_yesno('admin_template_reallydelete', $filename, array('subjectid' => $subjectid, 'mailbodyid' => $mailbodyid, 'page' => $page, 'action' => $action), $result['language'] . ' - ' . $lng['admin']['templates'][str_replace('_subject', '', $result['varname'])]); HTML::askYesNo('admin_template_reallydelete', $filename, [
'subjectid' => $subjectid,
'mailbodyid' => $mailbodyid,
'page' => $page,
'action' => $action
], $result['language'] . ' - ' . lng('admin.templates.' . str_replace('_subject', '', $result['varname'])));
} }
} }
} elseif ($action == 'deletef' && $id != 0) {
} elseif($action == 'deletef'
&& $id != 0
) {
// file templates // file templates
$result_stmt = Database::prepare(" $result_stmt = Database::prepare("
SELECT * FROM `" . TABLE_PANEL_TEMPLATES . "` SELECT * FROM `" . TABLE_PANEL_TEMPLATES . "`
WHERE `adminid` = :adminid AND `id` = :id" WHERE `adminid` = :adminid AND `id` = :id");
); Database::pexecute($result_stmt, [
Database::pexecute($result_stmt, array('adminid' => $userinfo['adminid'], 'id' => $id)); 'adminid' => $userinfo['adminid'],
'id' => $id
]);
if (Database::num_rows() > 0) { if (Database::num_rows() > 0) {
$row = $result_stmt->fetch(PDO::FETCH_ASSOC); $row = $result_stmt->fetch(PDO::FETCH_ASSOC);
if (isset($_POST['send']) if (isset($_POST['send']) && $_POST['send'] == 'send') {
&& $_POST['send'] == 'send'
) {
$del_stmt = Database::prepare(" $del_stmt = Database::prepare("
DELETE FROM `" . TABLE_PANEL_TEMPLATES . "` DELETE FROM `" . TABLE_PANEL_TEMPLATES . "`
WHERE `adminid` = :adminid AND `id` = :id" WHERE `adminid` = :adminid AND `id` = :id");
); Database::pexecute($del_stmt, [
Database::pexecute($del_stmt, array('adminid' => $userinfo['adminid'], 'id' => $id)); 'adminid' => $userinfo['adminid'],
$log->logAction(ADM_ACTION, LOG_INFO, "deleted template '" . $lng['admin']['templates'][$row['varname']] . "'"); 'id' => $id
redirectTo($filename, array('page' => $page, 's' => $s)); ]);
$log->logAction(FroxlorLogger::ADM_ACTION, LOG_INFO, "deleted template '" . lng('admin.templates.' . $row['varname']) . "'");
Response::redirectTo($filename, [
'page' => $page
]);
} else { } else {
ask_yesno('admin_template_reallydelete', $filename, array('id' => $id, 'page' => $page, 'action' => $action), $lng['admin']['templates'][$row['varname']]); HTML::askYesNo('admin_template_reallydelete', $filename, [
'id' => $id,
'page' => $page,
'action' => $action
], lng('admin.templates.' . $row['varname']));
} }
} else { } else {
standard_error('templatenotfound'); Response::standardError('templatenotfound');
} }
} elseif ($action == 'add') { } elseif ($action == 'add') {
if (isset($_POST['prepare']) && $_POST['prepare'] == 'prepare') {
if (Settings::Get('panel.sendalternativemail') == 1) {
$available_templates[] = 'pop_success_alternative';
}
if (isset($_POST['prepare'])
&& $_POST['prepare'] == 'prepare'
) {
// email templates // email templates
$language = htmlentities(validate($_POST['language'], 'language', '/^[^\r\n\0"\']+$/', 'nolanguageselect')); $language = htmlentities(Validate::validate($_POST['language'], 'language', '/^[^\r\n\0"\']+$/', 'nolanguageselect'));
$template = validate($_POST['template'], 'template'); if (!array_key_exists($language, $languages)) {
Response::standardError('templatelanguageinvalid');
}
$template = Validate::validate($_POST['template'], 'template');
$lng_bak = $lng; $result_stmt = Database::prepare("
foreach ($langs['English'] as $key => $value) { SELECT COUNT(*) as def FROM `" . TABLE_PANEL_TEMPLATES . "`
include_once makeSecurePath($value['file']); WHERE `adminid` = :adminid AND `language` = :lang
} AND `templategroup` = 'mails' AND `varname` LIKE :template
if ($language != 'English') { ");
foreach ($langs[$language] as $key => $value) { $result = Database::pexecute_first($result_stmt, [
include makeSecurePath($value['file']); 'adminid' => $userinfo['adminid'],
} 'lang' => $language,
'template' => $template . '%'
]);
if ($result && $result['def'] > 0) {
Response::standardError('templatelanguagecombodefined');
} }
$subject = $lng['mails'][$template]['subject']; // set target language
$body = str_replace('\n', "\n", $lng['mails'][$template]['mailbody']); Language::setLanguage($language);
$lng = $lng_bak; $subject = lng('mails.' . $template . '.subject');
$body = str_replace('\n', "\n", lng('mails.' . $template . '.mailbody'));
// re set language to user
Language::setLanguage(CurrentUser::getField('def_language'));
$template_add_data = include_once dirname(__FILE__) . '/lib/formfields/admin/templates/formfield.template_add.php'; $template_add_data = include_once dirname(__FILE__) . '/lib/formfields/admin/templates/formfield.template_add.php';
$template_add_form = htmlform::genHTMLForm($template_add_data);
$title = $template_add_data['template_add']['title']; UI::view('user/form-replacers.html.twig', [
$image = $template_add_data['template_add']['image']; 'formaction' => $linker->getLink(['section' => 'templates']),
'formdata' => $template_add_data['template_add'],
eval("echo \"" . getTemplate("templates/templates_add_2") . "\";"); 'replacers' => $template_add_data['template_replacers']
]);
} elseif(isset($_POST['send']) } elseif (isset($_POST['send']) && $_POST['send'] == 'send' && !isset($_POST['filesend'])) {
&& $_POST['send'] == 'send'
) {
// email templates // email templates
$language = htmlentities(validate($_POST['language'], 'language', '/^[^\r\n\0"\']+$/', 'nolanguageselect')); $language = htmlentities(Validate::validate($_POST['language'], 'language', '/^[^\r\n\0"\']+$/', 'nolanguageselect'));
$template = validate($_POST['template'], 'template'); if (!array_key_exists($language, $languages)) {
$subject = validate($_POST['subject'], 'subject', '/^[^\r\n\0]+$/', 'nosubjectcreate'); Response::standardError('templatelanguageinvalid');
$mailbody = validate($_POST['mailbody'], 'mailbody', '/^[^\0]+$/', 'nomailbodycreate'); }
$templates = array(); $template = Validate::validate($_POST['template'], 'template');
$subject = Validate::validate($_POST['subject'], 'subject', '/^[^\r\n\0]+$/', 'nosubjectcreate');
$mailbody = Validate::validate($_POST['mailbody'], 'mailbody', '/^[^\0]+$/', 'nomailbodycreate');
$templates = [];
$result_stmt = Database::prepare(" $result_stmt = Database::prepare("
SELECT `varname` FROM `" . TABLE_PANEL_TEMPLATES . "` SELECT `varname` FROM `" . TABLE_PANEL_TEMPLATES . "`
WHERE `adminid` = :adminid AND `language` = :lang WHERE `adminid` = :adminid AND `language` = :lang
AND `templategroup` = 'mails' AND `varname` LIKE '%_subject'" AND `templategroup` = 'mails' AND `varname` LIKE '%_subject'");
); Database::pexecute($result_stmt, [
Database::pexecute($result_stmt, array('adminid' => $userinfo['adminid'], 'lang' => $language)); 'adminid' => $userinfo['adminid'],
'lang' => $language
]);
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) { while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
$templates[] = str_replace('_subject', '', $row['varname']); $templates[] = str_replace('_subject', '', $row['varname']);
} }
$templates = array_diff($available_templates, $templates); $templates = array_diff($available_templates, $templates);
if (array_search($template, $templates) === false) { if (!in_array($template, $templates)) {
standard_error('templatenotfound'); Response::standardError('templatenotfound');
} else { } else {
$ins_stmt = Database::prepare(" $ins_stmt = Database::prepare("
INSERT INTO `" . TABLE_PANEL_TEMPLATES . "` SET INSERT INTO `" . TABLE_PANEL_TEMPLATES . "` SET
@@ -270,37 +321,35 @@ if ($action == '') {
`language` = :lang, `language` = :lang,
`templategroup` = 'mails', `templategroup` = 'mails',
`varname` = :var, `varname` = :var,
`value` = :value" `value` = :value");
);
// mail-subject // mail-subject
$ins_data = array( $ins_data = [
'adminid' => $userinfo['adminid'], 'adminid' => $userinfo['adminid'],
'lang' => $language, 'lang' => $language,
'var' => $template . '_subject', 'var' => $template . '_subject',
'value' => $subject 'value' => $subject
); ];
Database::pexecute($ins_stmt, $ins_data); Database::pexecute($ins_stmt, $ins_data);
// mail-body // mail-body
$ins_data = array( $ins_data = [
'adminid' => $userinfo['adminid'], 'adminid' => $userinfo['adminid'],
'lang' => $language, 'lang' => $language,
'var' => $template . '_mailbody', 'var' => $template . '_mailbody',
'value' => $mailbody 'value' => $mailbody
); ];
Database::pexecute($ins_stmt, $ins_data); Database::pexecute($ins_stmt, $ins_data);
$log->logAction(ADM_ACTION, LOG_INFO, "added template '" . $language . ' - ' . $template . "'"); $log->logAction(FroxlorLogger::ADM_ACTION, LOG_INFO, "added template '" . $language . ' - ' . $template . "'");
redirectTo($filename, array('page' => $page, 's' => $s)); Response::redirectTo($filename, [
'page' => $page
]);
} }
} elseif (isset($_POST['filesend']) && $_POST['filesend'] == 'filesend') {
} elseif(isset($_POST['filesend'])
&& $_POST['filesend'] == 'filesend'
) {
// file templates // file templates
$template = validate($_POST['template'], 'template'); $template = Validate::validate($_POST['template'], 'template');
$filecontent = validate($_POST['filecontent'], 'filecontent', '/^[^\0]+$/', 'filecontentnotset'); $filecontent = Validate::validate($_POST['filecontent'], 'filecontent', '/^[^\0]+$/', 'filecontentnotset');
$ins_stmt = Database::prepare(" $ins_stmt = Database::prepare("
INSERT INTO `" . TABLE_PANEL_TEMPLATES . "` SET INSERT INTO `" . TABLE_PANEL_TEMPLATES . "` SET
@@ -308,34 +357,35 @@ if ($action == '') {
`language` = '', `language` = '',
`templategroup` = 'files', `templategroup` = 'files',
`varname` = :var, `varname` = :var,
`value` = :value" `value` = :value");
);
$ins_data = array( $ins_data = [
'adminid' => $userinfo['adminid'], 'adminid' => $userinfo['adminid'],
'var' => $template, 'var' => $template,
'value' => $filecontent 'value' => $filecontent
); ];
Database::pexecute($ins_stmt, $ins_data); Database::pexecute($ins_stmt, $ins_data);
$log->logAction(ADM_ACTION, LOG_INFO, "added template '" . $template . "'"); $log->logAction(FroxlorLogger::ADM_ACTION, LOG_INFO, "added template '" . $template . "'");
redirectTo($filename, array('page' => $page, 's' => $s)); Response::redirectTo($filename, [
'page' => $page
]);
} elseif (!isset($_GET['files'])) { } elseif (!isset($_GET['files'])) {
// email templates // email templates
$add = false; $add = false;
$language_options = ''; $language_options = [];
$template_options = ''; $template_options = [];
while (list($language_file, $language_name) = each($languages)) { foreach ($languages as $language_file => $language_name) {
$templates = array(); $templates = [];
$result_stmt = Database::prepare(" $result_stmt = Database::prepare("
SELECT `varname` FROM `" . TABLE_PANEL_TEMPLATES . "` SELECT `varname` FROM `" . TABLE_PANEL_TEMPLATES . "`
WHERE `adminid` = :adminid AND `language` = :lang WHERE `adminid` = :adminid AND `language` = :lang
AND `templategroup` = 'mails' AND `varname` LIKE '%_subject'" AND `templategroup` = 'mails' AND `varname` LIKE '%_subject'");
); Database::pexecute($result_stmt, [
Database::pexecute($result_stmt, array('adminid' => $userinfo['adminid'], 'lang' => $language_name)); 'adminid' => $userinfo['adminid'],
'lang' => $language_name
]);
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) { while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
$templates[] = str_replace('_subject', '', $row['varname']); $templates[] = str_replace('_subject', '', $row['varname']);
@@ -343,173 +393,192 @@ if ($action == '') {
if (count(array_diff($available_templates, $templates)) > 0) { if (count(array_diff($available_templates, $templates)) > 0) {
$add = true; $add = true;
$language_options.= makeoption($language_name, $language_file, $userinfo['language'], true, true); $language_options[$language_file] = $language_name;
$templates = array_diff($available_templates, $templates); $templates = array_diff($available_templates, $templates);
foreach ($templates as $template) { foreach ($templates as $template) {
$template_options.= makeoption($lng['admin']['templates'][$template], $template, NULL, true, true, $language_file) . "\n"; $template_options[$template] = lng('admin.templates.' . $template);
} }
} }
} }
if ($add) { if ($add) {
eval("echo \"" . getTemplate("templates/templates_add_1") . "\";"); UI::view('user/form.html.twig', [
'formaction' => $linker->getLink(['section' => 'templates']),
'formdata' => [
'title' => lng('admin.templates.template_add'),
'image' => 'fa-solid fa-plus',
'self_overview' => ['section' => 'templates', 'page' => 'email'],
'sections' => [
'section_a' => [
'title' => lng('admin.templates.template_add'),
'fields' => [
'language' => [
'label' => lng('login.language'),
'type' => 'select',
'select_var' => $language_options,
'selected' => $userinfo['language']
],
'template' => [
'label' => lng('admin.templates.action'),
'type' => 'select',
'select_var' => $template_options
],
'prepare' => [
'type' => 'hidden',
'value' => 'prepare'
]
]
]
]
],
'editid' => $id
]);
} else { } else {
standard_error('alltemplatesdefined'); Response::standardError('alltemplatesdefined');
} }
} else { } else {
// filetemplates // filetemplates
$result_stmt = Database::prepare(" $result_stmt = Database::prepare("
SELECT `id`, `varname` FROM `" . TABLE_PANEL_TEMPLATES . "` SELECT `id`, `varname` FROM `" . TABLE_PANEL_TEMPLATES . "`
WHERE `adminid` = :adminid AND `templategroup`='files'" WHERE `adminid` = :adminid AND `templategroup`='files'");
); Database::pexecute($result_stmt, [
Database::pexecute($result_stmt, array('adminid' => $userinfo['adminid'])); 'adminid' => $userinfo['adminid']
]);
if (Database::num_rows() == count($file_templates)) { if (Database::num_rows() == count($file_templates)) {
standard_error('alltemplatesdefined'); Response::standardError('alltemplatesdefined');
} else { } else {
$templatesdefined = [];
$templatesdefined = array(); $free_templates = [];
$free_templates = '';
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) { while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
$templatesdefined[] = $row['varname']; $templatesdefined[] = $row['varname'];
} }
foreach (array_diff($file_templates, $templatesdefined) as $template) { foreach (array_diff($file_templates, $templatesdefined) as $template) {
$free_templates.= makeoption($lng['admin']['templates'][$template], $template, '', true); $free_templates[$template] = lng('admin.templates.' . $template);
} }
$filetemplate_add_data = include_once dirname(__FILE__) . '/lib/formfields/admin/templates/formfield.filetemplate_add.php'; $filetemplate_add_data = include_once dirname(__FILE__) . '/lib/formfields/admin/templates/formfield.filetemplate_add.php';
$filetemplate_add_form = htmlform::genHTMLForm($filetemplate_add_data);
$title = $filetemplate_add_data['filetemplate_add']['title']; UI::view('user/form-replacers.html.twig', [
$image = $filetemplate_add_data['filetemplate_add']['image']; 'formaction' => $linker->getLink(['section' => 'templates']),
'formdata' => $filetemplate_add_data['filetemplate_add'],
eval("echo \"" . getTemplate("templates/filetemplates_add") . "\";"); 'replacers' => $filetemplate_add_data['filetemplate_replacers']
]);
} }
} }
} elseif ($action == 'edit' && $subjectid != 0 && $mailbodyid != 0) {
} elseif($action == 'edit'
&& $subjectid != 0
&& $mailbodyid != 0
) {
// email templates // email templates
$result_stmt = Database::prepare(" $result_stmt = Database::prepare("
SELECT `language`, `varname`, `value` FROM `" . TABLE_PANEL_TEMPLATES . "` SELECT `language`, `varname`, `value` FROM `" . TABLE_PANEL_TEMPLATES . "`
WHERE `adminid` = :adminid AND `id` = :subjectid" WHERE `adminid` = :adminid AND `id` = :subjectid");
); Database::pexecute($result_stmt, [
Database::pexecute($result_stmt, array('adminid' => $userinfo['adminid'], 'subjectid' => $subjectid)); 'adminid' => $userinfo['adminid'],
'subjectid' => $subjectid
]);
$result = $result_stmt->fetch(PDO::FETCH_ASSOC); $result = $result_stmt->fetch(PDO::FETCH_ASSOC);
if ($result['varname'] != '') { if ($result['varname'] != '') {
if (isset($_POST['send']) && $_POST['send'] == 'send') {
if (isset($_POST['send']) $subject = Validate::validate($_POST['subject'], 'subject', '/^[^\r\n\0]+$/', 'nosubjectcreate');
&& $_POST['send'] == 'send' $mailbody = Validate::validate($_POST['mailbody'], 'mailbody', '/^[^\0]+$/', 'nomailbodycreate');
) {
$subject = validate($_POST['subject'], 'subject', '/^[^\r\n\0]+$/', 'nosubjectcreate');
$mailbody = validate($_POST['mailbody'], 'mailbody', '/^[^\0]+$/', 'nomailbodycreate');
$upd_stmt = Database::prepare(" $upd_stmt = Database::prepare("
UPDATE `" . TABLE_PANEL_TEMPLATES . "` SET UPDATE `" . TABLE_PANEL_TEMPLATES . "` SET
`value` = :value `value` = :value
WHERE `adminid` = :adminid AND `id` = :id" WHERE `adminid` = :adminid AND `id` = :id");
);
// subject // subject
Database::pexecute($upd_stmt, array( Database::pexecute($upd_stmt, [
'value' => $subject, 'value' => $subject,
'adminid' => $userinfo['adminid'], 'adminid' => $userinfo['adminid'],
'id' => $subjectid 'id' => $subjectid
)); ]);
// same query but mailbody // same query but mailbody
Database::pexecute($upd_stmt, array( Database::pexecute($upd_stmt, [
'value' => $mailbody, 'value' => $mailbody,
'adminid' => $userinfo['adminid'], 'adminid' => $userinfo['adminid'],
'id' => $mailbodyid 'id' => $mailbodyid
)); ]);
$log->logAction(ADM_ACTION, LOG_INFO, "edited template '" . $result['varname'] . "'");
redirectTo($filename, array('page' => $page, 's' => $s));
$log->logAction(FroxlorLogger::ADM_ACTION, LOG_INFO, "edited template '" . $result['varname'] . "'");
Response::redirectTo($filename, [
'page' => $page
]);
} else { } else {
$result = PhpHelper::htmlentitiesArray($result);
$result = htmlentities_array($result); $template_name = lng('admin.templates.' . str_replace('_subject', '', $result['varname']));
$template = $lng['admin']['templates'][str_replace('_subject', '', $result['varname'])];
$subject = $result['value']; $subject = $result['value'];
$result_stmt = Database::prepare(" $result_stmt = Database::prepare("
SELECT `language`, `varname`, `value` SELECT `language`, `varname`, `value`
FROM `" . TABLE_PANEL_TEMPLATES . "` FROM `" . TABLE_PANEL_TEMPLATES . "`
WHERE `id` = :id" WHERE `id` = :id");
); Database::pexecute($result_stmt, [
Database::pexecute($result_stmt, array('id' => $mailbodyid)); 'id' => $mailbodyid
]);
$result = $result_stmt->fetch(PDO::FETCH_ASSOC); $result = $result_stmt->fetch(PDO::FETCH_ASSOC);
$template_name = str_replace('_mailbody', '', $result['varname']); $template = str_replace('_mailbody', '', $result['varname']);
// don't escape the already escaped language-string so save up before htmlentities() // don't escape the already escaped language-string so save up before htmlentities()
$language = $result['language']; $language = $result['language'];
$result = htmlentities_array($result); $result = PhpHelper::htmlentitiesArray($result);
$mailbody = $result['value']; $mailbody = $result['value'];
$template_edit_data = include_once dirname(__FILE__) . '/lib/formfields/admin/templates/formfield.template_edit.php'; $template_edit_data = include_once dirname(__FILE__) . '/lib/formfields/admin/templates/formfield.template_edit.php';
$template_edit_form = htmlform::genHTMLForm($template_edit_data);
$title = $template_edit_data['template_edit']['title']; UI::view('user/form-replacers.html.twig', [
$image = $template_edit_data['template_edit']['image']; 'formaction' => $linker->getLink(['section' => 'templates']),
'formdata' => $template_edit_data['template_edit'],
eval("echo \"" . getTemplate("templates/templates_edit") . "\";"); 'replacers' => $template_edit_data['template_replacers']
]);
} }
} }
} elseif ($action == 'editf' && $id != 0) {
} elseif($action == 'editf'
&& $id != 0
) {
// file templates // file templates
$result_stmt = Database::prepare(" $result_stmt = Database::prepare("
SELECT * FROM `" . TABLE_PANEL_TEMPLATES . "` SELECT * FROM `" . TABLE_PANEL_TEMPLATES . "`
WHERE `adminid` = :adminid AND `id` = :id" WHERE `adminid` = :adminid AND `id` = :id");
); Database::pexecute($result_stmt, [
Database::pexecute($result_stmt, array('adminid' => $userinfo['adminid'], 'id' => $id)); 'adminid' => $userinfo['adminid'],
'id' => $id
]);
if (Database::num_rows() > 0) { if (Database::num_rows() > 0) {
$row = $result_stmt->fetch(PDO::FETCH_ASSOC); $row = $result_stmt->fetch(PDO::FETCH_ASSOC);
// filetemplates // filetemplates
if (isset($_POST['filesend']) if (isset($_POST['filesend']) && $_POST['filesend'] == 'filesend') {
&& $_POST['filesend'] == 'filesend' $filecontent = Validate::validate($_POST['filecontent'], 'filecontent', '/^[^\0]+$/', 'filecontentnotset');
) {
$filecontent = validate($_POST['filecontent'], 'filecontent', '/^[^\0]+$/', 'filecontentnotset');
$upd_stmt = Database::prepare(" $upd_stmt = Database::prepare("
UPDATE `" . TABLE_PANEL_TEMPLATES . "` SET UPDATE `" . TABLE_PANEL_TEMPLATES . "` SET
`value` = :value `value` = :value
WHERE `adminid` = :adminid AND `id` = :id" WHERE `adminid` = :adminid AND `id` = :id");
); Database::pexecute($upd_stmt, [
Database::pexecute($upd_stmt, array(
'value' => $filecontent, 'value' => $filecontent,
'adminid' => $userinfo['adminid'], 'adminid' => $userinfo['adminid'],
'id' => $id 'id' => $id
)); ]);
$log->logAction(ADM_ACTION, LOG_INFO, "edited template '" . $row['varname'] . "'");
redirectTo($filename, array('page' => $page, 's' => $s));
$log->logAction(FroxlorLogger::ADM_ACTION, LOG_INFO, "edited template '" . $row['varname'] . "'");
Response::redirectTo($filename, [
'page' => $page
]);
} else { } else {
$row = htmlentities_array($row); $row = PhpHelper::htmlentitiesArray($row);
$filetemplate_edit_data = include_once dirname(__FILE__) . '/lib/formfields/admin/templates/formfield.filetemplate_edit.php'; $filetemplate_edit_data = include_once dirname(__FILE__) . '/lib/formfields/admin/templates/formfield.filetemplate_edit.php';
$filetemplate_edit_form = htmlform::genHTMLForm($filetemplate_edit_data);
$title = $filetemplate_edit_data['filetemplate_edit']['title']; UI::view('user/form-replacers.html.twig', [
$image = $filetemplate_edit_data['filetemplate_edit']['image']; 'formaction' => $linker->getLink(['section' => 'templates']),
'formdata' => $filetemplate_edit_data['filetemplate_edit'],
eval("echo \"" . getTemplate("templates/filetemplates_edit") . "\";"); 'replacers' => $filetemplate_edit_data['filetemplate_replacers'],
'editid' => $id
]);
} }
} else { } else {
standard_error('templatenotfound'); Response::standardError('templatenotfound');
} }
} }

View File

@@ -1,909 +0,0 @@
<?php
/**
* This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors).
*
* For the full copyright and license information, please view the COPYING
* file that was distributed with this source code. You can also view the
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt
*
* @copyright (c) the authors
* @author Florian Lippert <flo@syscp.org> (2003-2009)
* @author Froxlor team <team@froxlor.org> (2010-)
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt
* @package Panel
*
*/
define('AREA', 'admin');
require './lib/init.php';
if (isset($_POST['id'])) {
$id = intval($_POST['id']);
} elseif(isset($_GET['id'])) {
$id = intval($_GET['id']);
// only check if this is not a category-id
if (!isset($_GET['page']) || (isset($_GET['page']) && $_GET['page'] != 'categories')) {
if (!$userinfo['customers_see_all']) {
/*
* Check if the current user is allowed to see the current ticket.
*/
$stmt = Database::prepare("
SELECT `id` FROM `panel_tickets`
WHERE `id` = :id AND `adminid` = :adminid
");
$result = Database::pexecute_first($stmt, array('id' => $id, 'adminid' => $userinfo['adminid']));
if ($result == null) {
// no rights to see the requested ticket
standard_error(array('ticketnotaccessible'));
}
}
}
}
if ($page == 'tickets'
&& $userinfo['customers'] != '0'
) {
// Let's see how many customers we have
$countcustomers_stmt = Database::prepare("
SELECT COUNT(`customerid`) as `countcustomers`
FROM `" . TABLE_PANEL_CUSTOMERS . "` " .
($userinfo['customers_see_all'] ? '' : "WHERE `adminid` = :adminid")
);
$countcustomers = Database::pexecute_first($countcustomers_stmt, array('adminid' => $userinfo['adminid']));
$countcustomers = (int)$countcustomers['countcustomers'];
if ($action == '') {
$log->logAction(ADM_ACTION, LOG_NOTICE, "viewed admin_tickets");
$fields = array(
'status' => $lng['ticket']['status'],
'lastchange' => $lng['ticket']['lastchange'],
'subject' => $lng['ticket']['subject'],
'lastreplier' => $lng['ticket']['lastreplier']
);
$paging = new paging($userinfo, TABLE_PANEL_TICKETS, $fields, null, null, 1, 'desc');
$result_stmt = Database::prepare("
SELECT `main`.`id`, `main`.`customerid`, (
SELECT COUNT(`sub`.`id`)
FROM `" . TABLE_PANEL_TICKETS . "` `sub`
WHERE `sub`.`answerto` = `main`.`id`) as `ticket_answers`,
`main`.`lastchange`, `main`.`subject`, `main`.`status`, `main`.`lastreplier`, `main`.`priority`
FROM `" . TABLE_PANEL_TICKETS . "` as `main`
WHERE `main`.`answerto` = '0' AND `archived` = '0' " .
($userinfo['customers_see_all'] ? '' : " AND `adminid` = :adminid") .
$paging->getSqlWhere(true) . " " . $paging->getSqlOrderBy() . " " . $paging->getSqlLimit()
);
Database::pexecute($result_stmt, array('adminid' => $userinfo['adminid']));
$num_rows = Database::num_rows();
$paging->setEntries($num_rows);
$sortcode = $paging->getHtmlSortCode($lng);
$arrowcode = $paging->getHtmlArrowCode($filename . '?page=' . $page . '&s=' . $s);
$searchcode = $paging->getHtmlSearchCode($lng);
$pagingcode = $paging->getHtmlPagingCode($filename . '?page=' . $page . '&s=' . $s);
$ctickets = array();
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
if (!isset($ctickets[$row['customerid']])
|| !is_array($ctickets[$row['customerid']])
) {
$ctickets[$row['customerid']] = array();
}
$ctickets[$row['customerid']][$row['id']] = $row;
}
if ($paging->sortfield == 'customerid'
&& $paging->sortorder == 'desc'
) {
krsort($ctickets);
} else {
ksort($ctickets);
}
$i = 0;
$count = 0;
$tickets_count = 0;
$tickets = '';
foreach ($ctickets as $cid => $ticketrows) {
$_cid = 0;
foreach ($ticketrows as $row) {
if ($paging->checkDisplay($i)) {
$row = htmlentities_array($row);
$row['lastchange'] = date("d.m.y H:i", $row['lastchange']);
if ($_cid != $row['customerid']) {
$cid = $row['customerid'];
$usr_stmt = Database::prepare('
SELECT `customerid`, `firstname`, `name`, `company`, `loginname`
FROM `' . TABLE_PANEL_CUSTOMERS . '`
WHERE `customerid` = :cid'
);
$usr = Database::pexecute_first($usr_stmt, array('cid' => $cid));
if (isset($usr['loginname'])) {
$customer = getCorrectFullUserDetails($usr);
$customerloginname = $usr['loginname'];
$customerid = $usr['customerid'];
} else {
$customer = $lng['ticket']['nonexistingcustomer'];
}
eval("\$tickets.=\"" . getTemplate("tickets/tickets_customer") . "\";");
}
$tickets_count++;
if ($row['status'] >= 0
&& $row['status'] <= 2
) {
$reopen = 0;
} else {
$reopen = 1;
}
$row['status'] = ticket::getStatusText($lng, $row['status']);
$row['priority'] = ticket::getPriorityText($lng, $row['priority']);
if ($row['lastreplier'] == '1') {
$row['lastreplier'] = $lng['ticket']['staff'];
$cananswer = 0;
} else {
$row['lastreplier'] = $lng['ticket']['customer'];
$cananswer = 1;
}
$row['subject'] = html_entity_decode($row['subject']);
if (strlen($row['subject']) > 30) {
$ts = wordwrap($row['subject'], 30, "|");
$ts = explode("|", $ts);
$row['subject'] = $ts[0]. '...';
}
eval("\$tickets.=\"" . getTemplate("tickets/tickets_tickets") . "\";");
$count++;
$_cid = $row['customerid'];
}
$i++;
}
}
eval("echo \"" . getTemplate("tickets/tickets") . "\";");
} elseif($action == 'new') {
if ($userinfo['tickets_used'] < $userinfo['tickets']
|| $userinfo['tickets'] == '-1'
) {
if (isset($_POST['send'])
&& $_POST['send'] == 'send'
) {
$newticket = ticket::getInstanceOf($userinfo, -1);
$newticket->Set('subject', validate($_POST['subject'], 'subject'), true, false);
$newticket->Set('priority', validate($_POST['priority'], 'priority'), true, false);
$newticket->Set('category', validate($_POST['category'], 'category'), true, false);
$newticket->Set('customer', (int)$_POST['customer'], true, false);
$newticket->Set('message', validate(htmlentities(str_replace("\r\n", "\n", $_POST['message'])), 'message', '/^[^\0]*$/'), true, false);
if ($newticket->Get('subject') == null) {
standard_error(array('stringisempty', 'mysubject'));
} elseif($newticket->Get('message') == null) {
standard_error(array('stringisempty', 'mymessage'));
} else {
$now = time();
$newticket->Set('admin', $userinfo['adminid'], true, true);
$newticket->Set('dt', $now, true, true);
$newticket->Set('lastchange', $now, true, true);
$newticket->Set('ip', $_SERVER['REMOTE_ADDR'], true, true);
$newticket->Set('status', '0', true, true);
$newticket->Set('lastreplier', '1', true, true);
$newticket->Set('by', '1', true, true);
$newticket->Insert();
$newticket->sendMail((int)$newticket->Get('customer'), 'new_ticket_by_staff_subject', $lng['mails']['new_ticket_by_staff']['subject'], 'new_ticket_by_staff_mailbody', $lng['mails']['new_ticket_by_staff']['mailbody']);
$log->logAction(ADM_ACTION, LOG_NOTICE, "opened a new ticket for customer #" . $newticket->Get('customer') . " - '" . $newticket->Get('subject') . "'");
redirectTo($filename, Array('page' => $page, 's' => $s));
}
} else {
$categories = '';
$where = '';
if ($userinfo['tickets_see_all'] != '1') {
$where = 'WHERE `adminid` = :adminid';
}
$result_stmt = Database::prepare('
SELECT `id`, `name` FROM `' . TABLE_PANEL_TICKET_CATS . '`
'.$where.' ORDER BY `logicalorder`, `name` ASC'
);
$result = Database::pexecute_first($result_stmt, array('adminid' => $userinfo['adminid']));
if (isset($result['name'])
&& $result['name'] != ''
) {
$result2_stmt = Database::prepare('
SELECT `id`, `name` FROM `' . TABLE_PANEL_TICKET_CATS . '`
'.$where.' ORDER BY `logicalorder`, `name` ASC'
);
Database::pexecute($result2_stmt, array('adminid' => $userinfo['adminid']));
while ($row = $result2_stmt->fetch(PDO::FETCH_ASSOC)) {
$categories.= makeoption($row['name'], $row['id']);
}
} else {
$categories = makeoption($lng['ticket']['no_cat'], '0');
}
$customers = '';
$result_customers_stmt = Database::prepare("
SELECT `customerid`, `loginname`, `name`, `firstname`, `company`
FROM `" . TABLE_PANEL_CUSTOMERS . "` " .
($userinfo['customers_see_all'] ? '' : " WHERE `adminid` = :adminid")."
ORDER BY `name` ASC"
);
Database::pexecute($result_customers_stmt, array('adminid' => $userinfo['adminid']));
while ($row_customer = $result_customers_stmt->fetch(PDO::FETCH_ASSOC)) {
$customers.= makeoption(getCorrectFullUserDetails($row_customer) . ' (' . $row_customer['loginname'] . ')', $row_customer['customerid']);
}
$def_prio = Settings::Get('ticket.default_priority');
$priorities = makeoption($lng['ticket']['high'], '1', $def_prio);
$priorities.= makeoption($lng['ticket']['normal'], '2', $def_prio);
$priorities.= makeoption($lng['ticket']['low'], '3', $def_prio);
$ticket_new_data = include_once dirname(__FILE__).'/lib/formfields/admin/tickets/formfield.ticket_new.php';
$ticket_new_form = htmlform::genHTMLForm($ticket_new_data);
$title = $ticket_new_data['ticket_new']['title'];
$image = $ticket_new_data['ticket_new']['image'];
eval("echo \"" . getTemplate("tickets/tickets_new") . "\";");
}
} else {
standard_error('nomoreticketsavailable');
}
} elseif($action == 'answer'
&& $id != 0
) {
if (isset($_POST['send'])
&& $_POST['send'] == 'send'
) {
$replyticket = ticket::getInstanceOf($userinfo, -1);
$replyticket->Set('subject', validate($_POST['subject'], 'subject'), true, false);
$replyticket->Set('priority', validate($_POST['priority'], 'priority'), true, false);
$replyticket->Set('message', validate(htmlentities(str_replace("\r\n", "\n", $_POST['message'])), 'message', '/^[^\0]*$/'), true, false);
if ($replyticket->Get('message') == null) {
standard_error(array('stringisempty', 'mymessage'));
} else {
$now = time();
$mainticket = ticket::getInstanceOf($userinfo, (int)$id);
$replyticket->Set('customer', $mainticket->Get('customer'), true, true);
$replyticket->Set('lastchange', $now, true, true);
$replyticket->Set('ip', $_SERVER['REMOTE_ADDR'], true, true);
$replyticket->Set('status', '1', true, true);
$replyticket->Set('answerto', (int)$id, true, false);
$replyticket->Set('by', '1', true, true);
$replyticket->Insert();
// Update priority if changed
if ($replyticket->Get('priority') != $mainticket->Get('priority')) {
$mainticket->Set('priority', $replyticket->Get('priority'), true);
}
$mainticket->Set('lastchange', $now);
$mainticket->Set('lastreplier', '1');
$mainticket->Set('status', '2');
$mainticket->Update();
$mainticket->sendMail((int)$mainticket->Get('customer'), 'new_reply_ticket_by_staff_subject', $lng['mails']['new_reply_ticket_by_staff']['subject'], 'new_reply_ticket_by_staff_mailbody', $lng['mails']['new_reply_ticket_by_staff']['mailbody']);
$log->logAction(ADM_ACTION, LOG_NOTICE, "answered ticket '" . $mainticket->Get('subject') . "'");
redirectTo($filename, array('page' => $page, 's' => $s));
}
} else {
$ticket_replies = '';
$mainticket = ticket::getInstanceOf($userinfo, (int)$id);
$dt = date("d.m.Y H:i\h", $mainticket->Get('dt'));
$status = ticket::getStatusText($lng, $mainticket->Get('status'));
if ($mainticket->Get('status') >= 0
&& $mainticket->Get('status') <= 2
) {
$isclosed = 0;
} else {
$isclosed = 1;
}
if ($mainticket->Get('by') == '1') {
$by = $lng['ticket']['staff'];
} else {
$cid = $mainticket->Get('customer');
$usr_stmt = Database::prepare('
SELECT `customerid`, `firstname`, `name`, `company`, `loginname`
FROM `' . TABLE_PANEL_CUSTOMERS . '`
WHERE `customerid` = :cid'
);
$usr = Database::pexecute_first($usr_stmt, array('cid' => $cid));
$by = '<a href="'.$linker->getLink(array('section' => 'customers', 'page' => 'customers', 'action' => 'su', 'id' => $cid)).'" rel="external">';
$by .= getCorrectFullUserDetails($usr).'</a>';
}
$subject = $mainticket->Get('subject');
$message = $mainticket->Get('message');
eval("\$ticket_replies.=\"" . getTemplate("tickets/tickets_tickets_main") . "\";");
$result_stmt = Database::prepare('
SELECT `name` FROM `' . TABLE_PANEL_TICKET_CATS . '` WHERE `id` = :cid'
);
$row = Database::pexecute_first($result_stmt, array('cid' => $mainticket->Get('category')));
$andere_stmt = Database::prepare('
SELECT * FROM `' . TABLE_PANEL_TICKETS . '`
WHERE `answerto` = :id ORDER BY `lastchange` ASC'
);
Database::pexecute($andere_stmt, array('id' => $id));
$numrows_andere = Database::num_rows();
while ($row2 = $andere_stmt->fetch(PDO::FETCH_ASSOC)) {
$subticket = ticket::getInstanceOf($userinfo, (int)$row2['id']);
$lastchange = date("d.m.Y H:i\h", $subticket->Get('lastchange'));
if ($subticket->Get('by') == '1') {
$by = $lng['ticket']['staff'];
} else {
$cid = $subticket->Get('customer');
$usr_stmt = Database::prepare('
SELECT `customerid`, `firstname`, `name`, `company`, `loginname`
FROM `' . TABLE_PANEL_CUSTOMERS . '`
WHERE `customerid` = :cid'
);
$usr = Database::pexecute_first($usr_stmt, array('cid' => $cid));
$by = '<a href="'.$linker->getLink(array('section' => 'customers', 'page' => 'customers', 'action' => 'su', 'id' => $cid)).'" rel="external">';
$by .= getCorrectFullUserDetails($usr).'</a>';
}
$subject = $subticket->Get('subject');
$message = $subticket->Get('message');
$row2 = htmlentities_array($row2);
eval("\$ticket_replies.=\"" . getTemplate("tickets/tickets_tickets_list") . "\";");
}
$priorities = makeoption($lng['ticket']['high'], '1', $mainticket->Get('priority'), true, true);
$priorities.= makeoption($lng['ticket']['normal'], '2', $mainticket->Get('priority'), true, true);
$priorities.= makeoption($lng['ticket']['low'], '3', $mainticket->Get('priority'), true, true);
$subject = htmlentities($mainticket->Get('subject'));
$ticket_replies_count = $numrows_andere + 1;
// don't forget the main-ticket!
$ticket_reply_data = include_once dirname(__FILE__).'/lib/formfields/admin/tickets/formfield.ticket_reply.php';
$ticket_reply_form = htmlform::genHTMLForm($ticket_reply_data);
$title = $ticket_reply_data['ticket_reply']['title'];
$image = $ticket_reply_data['ticket_reply']['image'];
eval("echo \"" . getTemplate("tickets/tickets_reply") . "\";");
}
} elseif($action == 'close'
&& $id != 0
) {
if (isset($_POST['send'])
&& $_POST['send'] == 'send'
) {
$now = time();
$mainticket = ticket::getInstanceOf($userinfo, (int)$id);
$mainticket->Set('lastchange', $now, true, true);
$mainticket->Set('lastreplier', '1', true, true);
$mainticket->Set('status', '3', true, true);
$mainticket->Update();
$log->logAction(ADM_ACTION, LOG_NOTICE, "closed ticket '" . $mainticket->Get('subject') . "'");
redirectTo($filename, array('page' => $page, 's' => $s));
} else {
$mainticket = ticket::getInstanceOf($userinfo, (int)$id);
ask_yesno('ticket_reallyclose', $filename, array('id' => $id, 'page' => $page, 'action' => $action), $mainticket->Get('subject'));
}
} elseif($action == 'reopen'
&& $id != 0
) {
$now = time();
$mainticket = ticket::getInstanceOf($userinfo, (int)$id);
$mainticket->Set('lastchange', $now, true, true);
$mainticket->Set('lastreplier', '1', true, true);
$mainticket->Set('status', '0', true, true);
$mainticket->Update();
$log->logAction(ADM_ACTION, LOG_NOTICE, "reopened ticket '" . $mainticket->Get('subject') . "'");
redirectTo($filename, array('page' => $page, 's' => $s));
} elseif($action == 'archive'
&& $id != 0
) {
if (isset($_POST['send'])
&& $_POST['send'] == 'send'
) {
$now = time();
$mainticket = ticket::getInstanceOf($userinfo, (int)$id);
$mainticket->Set('lastchange', $now, true, true);
$mainticket->Set('lastreplier', '1', true, true);
$mainticket->Set('status', '3', true, true);
$mainticket->Update();
$mainticket->Archive();
$log->logAction(ADM_ACTION, LOG_NOTICE, "archived ticket '" . $mainticket->Get('subject') . "'");
redirectTo($filename, array('page' => $page, 's' => $s));
} else {
$mainticket = ticket::getInstanceOf($userinfo, (int)$id);
ask_yesno('ticket_reallyarchive', $filename, array('id' => $id, 'page' => $page, 'action' => $action), $mainticket->Get('subject'));
}
} elseif($action == 'delete'
&& $id != 0
) {
if (isset($_POST['send'])
&& $_POST['send'] == 'send'
) {
$mainticket = ticket::getInstanceOf($userinfo, (int)$id);
$log->logAction(ADM_ACTION, LOG_INFO, "deleted ticket '" . $mainticket->Get('subject') . "'");
$mainticket->Delete();
redirectTo($filename, array('page' => $page, 's' => $s));
} else {
$mainticket = ticket::getInstanceOf($userinfo, (int)$id);
ask_yesno('ticket_reallydelete', $filename, array('id' => $id, 'page' => $page, 'action' => $action), $mainticket->Get('subject'));
}
}
} elseif($page == 'categories'
&& $userinfo['customers'] != '0'
) {
if ($action == '') {
$log->logAction(ADM_ACTION, LOG_NOTICE, "viewed admin_tickets::categories");
$fields = array(
'name' => $lng['ticket']['category'],
'logicalorder' => $lng['ticket']['logicalorder']
);
$where = '1'; // WHERE 1 is like no 'where-clause'
if ($userinfo['tickets_see_all'] != '1') {
$where = " `main`.`adminid` = :adminid";
}
$paging = new paging($userinfo, TABLE_PANEL_TICKET_CATS, $fields);
$result_stmt = Database::prepare("
SELECT `main`.`id`, `main`.`name`, `main`.`logicalorder`, (
SELECT COUNT(`sub`.`id`) FROM `" . TABLE_PANEL_TICKETS . "` `sub`
WHERE `sub`.`category` = `main`.`id`
AND `sub`.`answerto` = '0'
AND `sub`.`adminid` = :adminid
) as `ticketcount`, (
SELECT COUNT(`sub2`.`id`) FROM `" . TABLE_PANEL_TICKETS . "` `sub2`
WHERE `sub2`.`category` = `main`.`id`
AND `sub2`.`answerto` = '0'
AND (`sub2`.`status` = '0' OR `sub2`.`status` = '1' OR `sub2`.`status` = '2')
AND `sub2`.`adminid` = :adminid
) as `ticketcountnotclosed`
FROM `" . TABLE_PANEL_TICKET_CATS . "` `main`
WHERE " . $where . $paging->getSqlWhere(true) . " " .
$paging->getSqlOrderBy() . " " . $paging->getSqlLimit()
);
Database::pexecute($result_stmt, array('adminid' => $userinfo['adminid']));
$numrows = Database::num_rows();
$paging->setEntries($numrows);
$sortcode = $paging->getHtmlSortCode($lng);
$arrowcode = $paging->getHtmlArrowCode($filename . '?page=' . $page . '&s=' . $s);
$searchcode = $paging->getHtmlSearchCode($lng);
$pagingcode = $paging->getHtmlPagingCode($filename . '?page=' . $page . '&s=' . $s);
$i = 0;
$count = 0;
$ticketcategories = '';
$categories_count = $numrows;
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
if ($paging->checkDisplay($i)) {
$row = htmlentities_array($row);
$closedtickets_count = ($row['ticketcount'] - $row['ticketcountnotclosed']);
eval("\$ticketcategories.=\"" . getTemplate("tickets/tickets_categories") . "\";");
$count++;
}
$i++;
}
eval("echo \"" . getTemplate("tickets/categories") . "\";");
} elseif($action == 'addcategory') {
if (isset($_POST['send'])
&& $_POST['send'] == 'send'
) {
$category = validate($_POST['category'], 'category');
$order = validate($_POST['logicalorder'], 'logicalorder');
if ($order < 1 || $order >= 1000) {
// use the latest available
$order = ticket::getHighestOrderNumber($userinfo['adminid']) + 1;
}
if ($category == '') {
standard_error(array('stringisempty', 'mycategory'));
} else {
ticket::addCategory($category, $userinfo['adminid'], $order);
$log->logAction(ADM_ACTION, LOG_INFO, "added ticket-category '" . $category . "'");
redirectTo($filename, array('page' => $page, 's' => $s));
}
} else {
$order = ticket::getHighestOrderNumber($userinfo['adminid']) + 1;
$category_new_data = include_once dirname(__FILE__).'/lib/formfields/admin/tickets/formfield.category_new.php';
$category_new_form = htmlform::genHTMLForm($category_new_data);
$title = $category_new_data['category_new']['title'];
$image = $category_new_data['category_new']['image'];
eval("echo \"" . getTemplate("tickets/tickets_newcategory") . "\";");
}
} elseif($action == 'editcategory'
&& $id != 0
) {
if (isset($_POST['send'])
&& $_POST['send'] == 'send'
) {
$category = validate($_POST['category'], 'category');
$order = validate($_POST['logicalorder'], 'logicalorder');
if ($order < 1 || $order >= 1000) {
$order = 1;
}
if ($category == '') {
standard_error(array('stringisempty', 'mycategory'));
} else {
ticket::editCategory($category, $id, $order);
$log->logAction(ADM_ACTION, LOG_INFO, "edited ticket-category '" . $category . "'");
redirectTo($filename, array('page' => $page, 's' => $s));
}
} else {
$row_stmt = Database::prepare('
SELECT * FROM `' . TABLE_PANEL_TICKET_CATS . '` WHERE `id` = :id'
);
$row = Database::pexecute_first($row_stmt, array('id' => $id));
$row = htmlentities_array($row);
$category_edit_data = include_once dirname(__FILE__).'/lib/formfields/admin/tickets/formfield.category_edit.php';
$category_edit_form = htmlform::genHTMLForm($category_edit_data);
$title = $category_edit_data['category_edit']['title'];
$image = $category_edit_data['category_edit']['image'];
eval("echo \"" . getTemplate("tickets/tickets_editcategory") . "\";");
}
} elseif($action == 'deletecategory'
&& $id != 0
) {
if (isset($_POST['send'])
&& $_POST['send'] == 'send'
) {
if (ticket::deleteCategory($id) == false) {
standard_error('categoryhastickets');
}
$log->logAction(ADM_ACTION, LOG_INFO, "deleted ticket-category #" . $id);
redirectTo($filename, array('page' => $page, 's' => $s));
} else {
$name = ticket::getCategoryName($id);
ask_yesno('ticket_reallydeletecat', $filename, array('id' => $id, 'page' => $page, 'action' => $action), $name);
}
}
} elseif($page == 'archive'
&& $userinfo['customers'] != '0'
) {
if ($action == '') {
$log->logAction(ADM_ACTION, LOG_NOTICE, "viewed admin_tickets::archive");
if (isset($_POST['send'])
&& $_POST['send'] == 'send'
) {
$priority = array();
$categories = array();
$subject = validate($_POST['subject'], 'subject');
$priority[0] = isset($_POST['priority1']) ? $_POST['priority1'] : '';
$priority[1] = isset($_POST['priority2']) ? $_POST['priority2'] : '';
$priority[2] = isset($_POST['priority3']) ? $_POST['priority3'] : '';
$fromdate = validate($_POST['fromdate'], 'fromdate');
$todate = validate($_POST['todate'], 'todate');
$message = validate($_POST['message'], 'message');
$customer = validate($_POST['customer'], 'customer');
$cat_stmt = Database::query('SELECT COUNT(`id`) as `ccount` FROM `' . TABLE_PANEL_TICKET_CATS . '`');
$cat = $cat_stmt->fetch(PDO::FETCH_ASSOC);
for ($x = 0;$x < $cat['ccount'];$x++) {
$categories[$x] = isset($_POST['category' . $x]) ? $_POST['category' . $x] : '';
}
$archive_search = ticket::getArchiveSearchStatement($subject, $priority, $fromdate, $todate, $message, $customer, $userinfo['adminid'], $categories);
$query = $archive_search[0];
$archive_params = $archive_search[1];
$fields = array(
'lastchange' => $lng['ticket']['lastchange'],
'subject' => $lng['ticket']['subject'],
'lastreplier' => $lng['ticket']['lastreplier']
);
$paging = new paging($userinfo, TABLE_PANEL_TICKETS, $fields);
$result_stmt = Database::prepare($query . $paging->getSqlWhere(true) . " " . $paging->getSqlOrderBy() . " " . $paging->getSqlLimit());
Database::pexecute($result_stmt, $archive_params);
$sortcode = $paging->getHtmlSortCode($lng);
$arrowcode = $paging->getHtmlArrowCode($filename . '?page=' . $page . '&s=' . $s);
$searchcode = $paging->getHtmlSearchCode($lng);
$pagingcode = $paging->getHtmlPagingCode($filename . '?page=' . $page . '&s=' . $s);
$ctickets = array();
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
if (!isset($ctickets[$row['customerid']])
|| !is_array($ctickets[$row['customerid']])
) {
$ctickets[$row['customerid']] = array();
}
$ctickets[$row['customerid']][$row['id']] = $row;
}
if ($paging->sortfield == 'customerid'
&& $paging->sortorder == 'desc'
) {
krsort($ctickets);
} else {
ksort($ctickets);
}
$i = 0;
$count = 0;
$tickets_count = 0;
$tickets = '';
foreach ($ctickets as $cid => $ticketrows) {
if ($paging->sortfield == 'lastchange'
&& $paging->sortorder == 'desc'
) {
krsort($ticketrows);
} else {
ksort($ticketrows);
}
$_cid = -1;
foreach ($ticketrows as $ticket) {
if ($paging->checkDisplay($i)) {
$ticket['lastchange'] = date("d.m.y H:i", $ticket['lastchange']);
if ($_cid != $ticket['customerid']) {
$cid = $ticket['customerid'];
$usr_stmt = Database::prepare('
SELECT `customerid`, `firstname`, `name`, `company`, `loginname`
FROM `' . TABLE_PANEL_CUSTOMERS . '`
WHERE `customerid` = :cid'
);
$usr = Database::pexecute_first($usr_stmt, array('cid' => $cid));
if (isset($usr['loginname'])) {
$customer = getCorrectFullUserDetails($usr);
$customerloginname = $usr['loginname'];
$customerid = $usr['customerid'];
} else {
$customer = $lng['ticket']['nonexistingcustomer'];
$customerid = 0;
$customerloginname = '';
}
eval("\$tickets.=\"" . getTemplate("tickets/tickets_customer") . "\";");
}
$tickets_count++;
switch ($ticket['priority'])
{
case 1: $ticket['display'] = 'high';
break;
case 2: $ticket['display'] = 'normal';
break;
case 3: $ticket['display'] = 'low';
break;
default: $ticket['display'] = 'unknown';
}
$ticket['priority'] = ticket::getPriorityText($lng, $ticket['priority']);
if ($ticket['lastreplier'] == '1') {
$ticket['lastreplier'] = $lng['ticket']['staff'];
} else {
$ticket['lastreplier'] = $lng['ticket']['customer'];
}
if (strlen($ticket['subject']) > 20) {
$ticket['subject'] = substr($ticket['subject'], 0, 17) . '...';
}
$ticket = htmlentities_array($ticket);
eval("\$tickets.=\"" . getTemplate("tickets/archived_tickets") . "\";");
$count++;
$_cid = $ticket['customerid'];
}
}
$i++;
}
eval("echo \"" . getTemplate("tickets/archivesearch") . "\";");
} else {
$archived = array();
$archived = ticket::getLastArchived(6, $userinfo['adminid']);
$tickets = '';
if ($archived !== false) {
foreach ($archived as $id => $ticket) {
$ticket['lastchange'] = date("d.m.y H:i", $ticket['lastchange']);
$ticket['priority'] = ticket::getPriorityText($lng, $ticket['priority']);
if ($ticket['lastreplier'] == '1') {
$ticket['lastreplier'] = $lng['ticket']['staff'];
} else {
$ticket['lastreplier'] = $lng['ticket']['customer'];
}
if (strlen($ticket['subject']) > 20) {
$ticket['subject'] = substr($ticket['subject'], 0, 17) . '...';
}
eval("\$tickets.=\"" . getTemplate("tickets/archived_tickets") . "\";");
}
}
$priorities_options = makecheckbox('priority1', $lng['ticket']['high'], '1');
$priorities_options.= makecheckbox('priority2', $lng['ticket']['normal'], '2');
$priorities_options.= makecheckbox('priority3', $lng['ticket']['low'], '3');
$category_options = '';
$ccount = 0;
$result = Database::query('SELECT * FROM `' . TABLE_PANEL_TICKET_CATS . '` ORDER BY `name` ASC');
while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
$category_options.= makecheckbox('category' . $ccount, $row['name'], $row['id'], true);
$ccount++;
}
$customers = makeoption($lng['ticket']['nocustomer'], '-1', '-1');
$result_customers_stmt = Database::prepare("
SELECT `customerid`, `loginname`, `name`, `firstname`, `company`
FROM `" . TABLE_PANEL_CUSTOMERS . "` " .
($userinfo['customers_see_all'] ? '' : " WHERE `adminid` = :adminid")."
ORDER BY `name` ASC"
);
Database::pexecute($result_customers_stmt, array('adminid' => $userinfo['adminid']));
while ($row_customer = $result_customers_stmt->fetch(PDO::FETCH_ASSOC)) {
$customers.= makeoption(getCorrectFullUserDetails($row_customer) . ' (' . $row_customer['loginname'] . ')', $row_customer['customerid']);
}
eval("echo \"" . getTemplate("tickets/archive") . "\";");
}
} elseif($action == 'view'
&& $id != 0
) {
$log->logAction(ADM_ACTION, LOG_NOTICE, "viewed archived-ticket #" . $id);
$ticket_replies = '';
$mainticket = ticket::getInstanceOf($userinfo, (int)$id);
$lastchange = date("d.m.Y H:i\h", $mainticket->Get('lastchange'));
$dt = date("d.m.Y H:i\h", $mainticket->Get('dt'));
$status = ticket::getStatusText($lng, $mainticket->Get('status'));
$isclosed = 1;
if ($mainticket->Get('by') == '1') {
$by = $lng['ticket']['staff'];
} else {
$cid = $mainticket->Get('customer');
$usr_stmt = Database::prepare('
SELECT `customerid`, `firstname`, `name`, `company`, `loginname`
FROM `' . TABLE_PANEL_CUSTOMERS . '`
WHERE `customerid` = :cid'
);
$usr = Database::pexecute_first($usr_stmt, array('cid' => $cid));
if (isset($usr['loginname'])) {
$customer = getCorrectFullUserDetails($usr);
$customerloginname = ' ('.$usr['loginname'].')';
$customerid = $usr['customerid'];
} else {
$customer = $lng['ticket']['nonexistingcustomer'];
$customerid = 0;
$customerloginname = '';
}
if ($customerid != 0) {
$by = '<a href="'.$linker->getLink(array('section' => 'customers', 'page' => 'customers', 'action' => 'su', 'id' => $customerid)).'" rel="external">';
$by .= $customer.$customerloginname.'</a>';
} else {
$by = $customer;
}
}
$subject = $mainticket->Get('subject');
$message = $mainticket->Get('message');
eval("\$ticket_replies.=\"" . getTemplate("tickets/tickets_tickets_main") . "\";");
$result_stmt = Database::prepare('
SELECT `name` FROM `' . TABLE_PANEL_TICKET_CATS . '` WHERE `id` = :cid'
);
$row = Database::pexecute_first($result_stmt, array('cid' => $mainticket->Get('category')));
$andere_stmt = Database::prepare('
SELECT * FROM `' . TABLE_PANEL_TICKETS . '` WHERE `answerto` = :id'
);
Database::pexecute($andere_stmt, array('id' => $id));
$numrows_andere = Database::num_rows();
while ($row2 = $andere_stmt->fetch(PDO::FETCH_ASSOC)) {
$subticket = ticket::getInstanceOf($userinfo, (int)$row2['id']);
$lastchange = date("d.m.Y H:i\h", $subticket->Get('lastchange'));
if ($subticket->Get('by') == '1') {
$by = $lng['ticket']['staff'];
} else {
$cid = $subticket->Get('customer');
$usr_stmt = Database::prepare('
SELECT `customerid`, `firstname`, `name`, `company`, `loginname`
FROM `' . TABLE_PANEL_CUSTOMERS . '`
WHERE `customerid` = :cid'
);
$usr = Database::pexecute_first($usr_stmt, array('cid' => $cid));
if (isset($usr['loginname'])) {
$customer = getCorrectFullUserDetails($usr);
$customerloginname = ' ('.$usr['loginname'].')';
$customerid = $usr['customerid'];
} else {
$customer = $lng['ticket']['nonexistingcustomer'];
$customerid = 0;
$customerloginname = '';
}
if ($customerid != 0) {
$by = '<a href="'.$linker->getLink(array('section' => 'customers', 'page' => 'customers', 'action' => 'su', 'id' => $customerid)).'" rel="external">';
$by .= $customer.$customerloginname.'</a>';
} else {
$by = $customer;
}
}
$subject = $subticket->Get('subject');
$message = $subticket->Get('message');
eval("\$ticket_replies.=\"" . getTemplate("tickets/tickets_tickets_list") . "\";");
}
$priorities = makeoption($lng['ticket']['high'], '1', htmlentities($mainticket->Get('priority')), true, true);
$priorities.= makeoption($lng['ticket']['normal'], '2', htmlentities($mainticket->Get('priority')), true, true);
$priorities.= makeoption($lng['ticket']['low'], '3', htmlentities($mainticket->Get('priority')), true, true);
$subject = $mainticket->Get('subject');
$ticket_replies_count = $numrows_andere + 1;
// don't forget the main-ticket!
eval("echo \"" . getTemplate("tickets/tickets_view") . "\";");
} elseif($action == 'delete'
&& $id != 0
) {
if (isset($_POST['send'])
&& $_POST['send'] == 'send'
) {
$mainticket = ticket::getInstanceOf($userinfo, (int)$id);
$log->logAction(ADM_ACTION, LOG_INFO, "deleted archived ticket '" . $mainticket->Get('subject') . "'");
$mainticket->Delete();
redirectTo($filename, array('page' => $page, 's' => $s));
} else {
$mainticket = ticket::getInstanceOf($userinfo, (int)$id);
ask_yesno('ticket_reallydelete', $filename, array('id' => $id, 'page' => $page, 'action' => $action), $mainticket->Get('subject'));
}
}
} else {
standard_error('nocustomerforticket');
}

View File

@@ -2,140 +2,47 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Morton Jonuschat <m.jonuschat@chrome-it.de> * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @license GPLv2 http://files.syscp.org/misc/COPYING.txt * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @package Panel * 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
*/ */
define('AREA', 'admin'); const AREA = 'admin';
require './lib/init.php'; require __DIR__ . '/lib/init.php';
if ($action == 'logout') { use Froxlor\Traffic\Traffic;
$logout_stmt = Database::prepare(" use Froxlor\UI\Panel\UI;
DELETE FROM `" . TABLE_PANEL_SESSIONS . "` use Froxlor\UI\Request;
WHERE `userid` = :adminid use Froxlor\UI\Response;
AND `adminsession` = '1'"
);
Database::pexecute($logout_stmt, array('adminid' => $userinfo['adminid']));
redirectTo('index.php');
}
if (isset($_POST['id'])) { $range = Request::any('range', 'currentmonth');
$id = intval($_POST['id']);
} elseif(isset($_GET['id'])) {
$id = intval($_GET['id']);
}
$months = array(
'0' => 'empty',
'1' => 'jan',
'2' => 'feb',
'3' => 'mar',
'4' => 'apr',
'5' => 'may',
'6' => 'jun',
'7' => 'jul',
'8' => 'aug',
'9' => 'sep',
'10' => 'oct',
'11' => 'nov',
'12' => 'dec',
);
if ($page == 'overview' || $page == 'customers') { if ($page == 'overview' || $page == 'customers') {
try {
$customerview = 1; $context = Traffic::getCustomerStats($userinfo, $range);
$stats_tables = ''; } catch (Exception $e) {
$minyear_stmt = Database::query("SELECT `year` FROM `". TABLE_PANEL_TRAFFIC . "` ORDER BY `year` ASC LIMIT 1"); if ($e->getCode() === 405) {
$minyear = $minyear_stmt->fetch(PDO::FETCH_ASSOC); Response::dynamicError(lng('traffic.nocustomers'));
}
if (!isset($minyear['year']) || $minyear['year'] == 0) { Response::dynamicError($e->getMessage());
$maxyears = 0;
} else {
$maxyears = date("Y") - $minyear['year'];
} }
for ($years = 0; $years<=$maxyears; $years++) { // pass metrics to the view
UI::view('user/traffic.html.twig', $context);
$overview['year'] = date("Y")-$years;
$overview['type'] = $lng['traffic']['customer'];
$domain_list = '';
$totals = array(
'jan' => 0,
'feb' => 0,
'mar' => 0,
'apr' => 0,
'may' => 0,
'jun' => 0,
'jul' => 0,
'aug' => 0,
'sep' => 0,
'oct' => 0,
'nov' => 0,
'dec' => 0,
);
$customer_name_list_stmt = Database::prepare("
SELECT `customerid`,`company`,`name`,`firstname`
FROM `" . TABLE_PANEL_CUSTOMERS . "`
WHERE `deactivated`='0'" .
($userinfo['customers_see_all'] ? '' : " AND `adminid` = :id") . "
ORDER BY name"
);
Database::pexecute($customer_name_list_stmt, array('id' => $userinfo['adminid']));
while($customer_name = $customer_name_list_stmt->fetch(PDO::FETCH_ASSOC)) {
$virtual_host = array(
'name' => ($customer_name['company'] == '' ? $customer_name['name'] . ", " . $customer_name['firstname'] : $customer_name['company']),
'customerid' => $customer_name['customerid'],
'jan' => '-',
'feb' => '-',
'mar' => '-',
'apr' => '-',
'may' => '-',
'jun' => '-',
'jul' => '-',
'aug' => '-',
'sep' => '-',
'oct' => '-',
'nov' => '-',
'dec' => '-',
);
$traffic_list_stmt = Database::prepare("
SELECT month, SUM(http+ftp_up+ftp_down+mail)*1024 AS traffic
FROM `" . TABLE_PANEL_TRAFFIC . "`
WHERE year = :year AND `customerid` = :id
GROUP BY month ORDER BY month"
);
Database::pexecute($traffic_list_stmt, array('year' => (date("Y")-$years), 'id' => $customer_name['customerid']));
while ($traffic_month = $traffic_list_stmt->fetch(PDO::FETCH_ASSOC)) {
$virtual_host[$months[(int)$traffic_month['month']]] = size_readable($traffic_month['traffic'], 'GiB', 'bi', '%01.'.(int)Settings::Get('panel.decimal_places').'f %s');
$totals[$months[(int)$traffic_month['month']]] += $traffic_month['traffic'];
}
eval("\$domain_list .= sprintf(\"%s\", \"" . getTemplate("traffic/index_table_row") . "\");");
}
// sum up totals
$virtual_host = array(
'name' => $lng['traffic']['months']['total'],
);
foreach ($totals as $month => $bytes) {
$virtual_host[$month] = ($bytes == 0 ? '-' : size_readable($bytes, 'GiB', 'bi', '%01.'.(int)Settings::Get('panel.decimal_places').'f %s'));
}
$customerview = 0;
eval("\$total_list = sprintf(\"%s\", \"" . getTemplate("traffic/index_table_row") . "\");");
eval("\$stats_tables .= sprintf(\"%s\", \"" . getTemplate("traffic/index_table") . "\");");
}
eval("echo \"" . getTemplate("traffic/index") . "\";");
} }

View File

@@ -4,118 +4,113 @@
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Froxlor team <team@froxlor.org> (2010-) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @package Panel * 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
*/ */
define('AREA', 'admin'); const AREA = 'admin';
require './lib/init.php'; require __DIR__ . '/lib/init.php';
use Froxlor\Cron\TaskId;
use Froxlor\Froxlor;
use Froxlor\FroxlorLogger;
use Froxlor\Install\Preconfig;
use Froxlor\Install\Update;
use Froxlor\Settings;
use Froxlor\System\Cronjob;
use Froxlor\UI\Panel\UI;
use Froxlor\UI\Response;
use Froxlor\User;
if ($page == 'overview') { if ($page == 'overview') {
$log->logAction(ADM_ACTION, LOG_NOTICE, "viewed admin_updates"); $log->logAction(FroxlorLogger::ADM_ACTION, LOG_NOTICE, "viewed admin_updates");
/** if (!Froxlor::isFroxlor()) {
* this is a dirty hack but syscp 1.4.2.1 does not throw new Exception('SysCP/customized upgrades are not supported');
* have any version/dbversion in the database (don't know why)
* so we have to set them both to run a correct upgrade
*/
if (!isFroxlor()) {
if (Settings::Get('panel.version') == null
|| Settings::Get('panel.version') == ''
) {
Settings::Set('panel.version', '1.4.2.1');
}
if (Settings::Get('system.dbversion') == null
|| Settings::Get('system.dbversion') == ''
) {
/**
* for syscp-stable (1.4.2.1) this value has to be 0
* so the required table-fields are added correctly
* and the svn-version has its value in the database
* -> bug #54
*/
$result_stmt = Database::query("
SELECT `value` FROM `" . TABLE_PANEL_SETTINGS . "` WHERE `varname` = 'dbversion'"
);
$result = $result_stmt->fetch(PDO::FETCH_ASSOC);
if (isset($result['value'])) {
Settings::Set('system.dbversion', (int)$result['value'], false);
} else {
Settings::Set('system.dbversion', 0, false);
}
}
} }
if (hasDbUpdates($dbversion) || hasUpdates($version)) { if (Froxlor::hasDbUpdates() || Froxlor::hasUpdates()) {
$successful_update = false; $successful_update = false;
$message = ''; $message = '';
if (isset($_POST['send']) if (isset($_POST['send']) && $_POST['send'] == 'send') {
&& $_POST['send'] == 'send' if ((isset($_POST['update_preconfig']) && isset($_POST['update_changesagreed']) && intval($_POST['update_changesagreed']) != 0) || !isset($_POST['update_preconfig'])) {
) { include_once Froxlor::getInstallDir() . 'install/updatesql.php';
if ((isset($_POST['update_preconfig'])
&& isset($_POST['update_changesagreed'])
&& intval($_POST['update_changesagreed']) != 0)
|| !isset($_POST['update_preconfig'])
) {
eval("echo \"" . getTemplate('update/update_start') . "\";");
include_once './install/updatesql.php'; User::updateCounters();
Cronjob::inserttask(TaskId::REBUILD_VHOST);
@chmod(Froxlor::getInstallDir() . '/lib/userdata.inc.php', 0400);
$redirect_url = 'admin_index.php?s=' . $s; UI::view('install/update.html.twig', [
eval("echo \"" . getTemplate('update/update_end') . "\";"); 'checks' => Update::getUpdateTasks()
]);
updateCounters(); exit;
inserttask('1');
@chmod('./lib/userdata.inc.php', 0440);
$successful_update = true;
} else { } else {
$message = '<br /><strong class="red">You have to agree that you have read the update notifications.</strong>'; $message = '<br><br><strong>You have to agree that you have read the update notifications.</strong>';
} }
} }
if (!$successful_update) {
$current_version = Settings::Get('panel.version'); $current_version = Settings::Get('panel.version');
$current_db_version = Settings::Get('panel.db_version'); $current_db_version = Settings::Get('panel.db_version');
if (empty($current_db_version)) { if (empty($current_db_version)) {
$current_db_version = "0"; $current_db_version = "0";
} }
$new_version = $version; $new_version = Froxlor::VERSION;
$new_db_version = $dbversion; $new_db_version = Froxlor::DBVERSION;
$ui_text = $lng['update']['update_information']['part_a']; if (Froxlor::VERSION != $current_version) {
if ($version != $current_version) { $replacer_currentversion = $current_version;
$ui_text = str_replace('%curversion', $current_version, $ui_text); $replacer_newversion = $new_version;
$ui_text = str_replace('%newversion', $new_version, $ui_text);
} else { } else {
// show db version // show db version
$ui_text = str_replace('%curversion', $current_db_version, $ui_text); $replacer_currentversion = $current_db_version;
$ui_text = str_replace('%newversion', $new_db_version, $ui_text); $replacer_newversion = $new_db_version;
} }
$update_information = $ui_text; $ui_text = lng('update.update_information.part_a', [$replacer_newversion, $replacer_currentversion]);
$ui_text .= lng('update.update_information.part_b');
include_once './install/updates/preconfig.php'; $upd_formfield = [
$preconfig = getPreConfig($current_version, $current_db_version); 'updates' => [
if ($preconfig != '') { 'title' => lng('update.update'),
$update_information .= '<br />' . $preconfig . $message; 'image' => 'fa-solid fa-download',
'description' => lng('update.description'),
'sections' => [],
'buttons' => [
[
'label' => lng('update.proceed')
]
]
]
];
$preconfig = Preconfig::getPreConfig();
if (!empty($preconfig)) {
$upd_formfield['updates']['sections'] = $preconfig;
} }
$update_information .= $lng['update']['update_information']['part_b']; UI::view('user/form-note.html.twig', [
'formaction' => $linker->getLink(['section' => 'updates']),
eval("echo \"" . getTemplate('update/index') . "\";"); 'formdata' => $upd_formfield['updates'],
} // alert
'type' => !empty($message) ? 'danger' : 'info',
'alert_msg' => $ui_text . $message
]);
} else { } else {
$success_message = $lng['update']['noupdatesavail']; Response::standardSuccess('update.noupdatesavail', Settings::Get('system.update_channel') == 'testing' ? lng('serversettings.uc_testing') . ' ' : '');
$redirect_url = 'admin_index.php?s=' . $s;
eval("echo \"" . getTemplate('update/noupdatesavail') . "\";");
} }
} }

44
api.php Normal file
View File

@@ -0,0 +1,44 @@
<?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\Api\Api;
use Froxlor\Api\Response;
require __DIR__ . '/vendor/autoload.php';
require __DIR__ . '/lib/functions.php';
require __DIR__ . '/lib/tables.inc.php';
// set error-handler
@set_error_handler([
'\\Froxlor\\Api\\Api',
'phpErrHandler'
]);
// Return response
try {
echo (new Api)->formatMiddleware(@file_get_contents('php://input'))->handle();
} catch (Exception $e) {
echo Response::jsonErrorResponse($e->getMessage(), $e->getCode());
}

186
api_keys.php Normal file
View File

@@ -0,0 +1,186 @@
<?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\UI\HTML;
use Froxlor\UI\Listing;
use Froxlor\UI\Panel\UI;
use Froxlor\UI\Request;
use Froxlor\UI\Response;
// redirect if this customer has no permission for API usage
if ($userinfo['adminsession'] == 0 && $userinfo['api_allowed'] == 0) {
Response::redirectTo('customer_index.php');
}
// redirect if this admin has no permission for API usage
if ($userinfo['adminsession'] == 1 && $userinfo['api_allowed'] == 0) {
Response::redirectTo('admin_index.php');
}
// This file is being included in admin_index and customer_index
// and therefore does not need to require lib/init.php
$del_stmt = Database::prepare("DELETE FROM `" . TABLE_API_KEYS . "` WHERE id = :id");
$id = (int)Request::any('id');
// do the delete and then just show a success-message and the apikeys list again
if ($action == 'delete' && $id > 0) {
HTML::askYesNo('apikey_reallydelete', $filename, [
'id' => $id,
'page' => $page,
'action' => 'deletesure'
], '', [
'section' => 'index',
'page' => $page
]);
} elseif (isset($_POST['send']) && $_POST['send'] == 'send' && $action == 'deletesure' && $id > 0) {
$chk = (AREA == 'admin' && $userinfo['customers_see_all'] == '1') ? true : false;
if (AREA == 'customer') {
$chk_stmt = Database::prepare("
SELECT c.customerid FROM `" . TABLE_PANEL_CUSTOMERS . "` c
LEFT JOIN `" . TABLE_API_KEYS . "` ak ON ak.customerid = c.customerid
WHERE ak.`id` = :id AND c.`customerid` = :cid
");
$chk = Database::pexecute_first($chk_stmt, [
'id' => $id,
'cid' => $userinfo['customerid']
]);
} elseif (AREA == 'admin' && $userinfo['customers_see_all'] == '0') {
$chk_stmt = Database::prepare("
SELECT a.adminid FROM `" . TABLE_PANEL_ADMINS . "` a
LEFT JOIN `" . TABLE_API_KEYS . "` ak ON ak.adminid = a.adminid
WHERE ak.`id` = :id AND a.`adminid` = :aid
");
$chk = Database::pexecute_first($chk_stmt, [
'id' => $id,
'aid' => $userinfo['adminid']
]);
}
if ($chk !== false) {
Database::pexecute($del_stmt, [
'id' => $id
]);
Response::standardSuccess('apikeys.apikey_removed', $id, [
'filename' => $filename,
'page' => $page
]);
}
} elseif ($action == 'add') {
if (isset($_POST['send']) && $_POST['send'] == 'send') {
$ins_stmt = Database::prepare("
INSERT INTO `" . TABLE_API_KEYS . "` SET
`apikey` = :key, `secret` = :secret, `adminid` = :aid, `customerid` = :cid, `valid_until` = '-1', `allowed_from` = ''
");
// customer generates for himself, admins will see a customer-select-box later
if (AREA == 'admin') {
$cid = 0;
} elseif (AREA == 'customer') {
$cid = $userinfo['customerid'];
}
$key = hash('sha256', openssl_random_pseudo_bytes(64 * 64));
$secret = hash('sha512', openssl_random_pseudo_bytes(64 * 64 * 4));
Database::pexecute($ins_stmt, [
'key' => $key,
'secret' => $secret,
'aid' => $userinfo['adminid'],
'cid' => $cid
]);
Response::standardSuccess('apikeys.apikey_added', '', [
'filename' => $filename,
'page' => $page
]);
}
HTML::askYesNo('apikey_reallyadd', $filename, [
'id' => $id,
'page' => $page,
'action' => $action
], '', [
'section' => 'index',
'page' => $page
]);
exit;
}
$log->logAction(FroxlorLogger::USR_ACTION, LOG_NOTICE, "viewed api::api_keys");
// select all my (accessible) api-keys
$keys_stmt_query = "SELECT ak.*, c.loginname, a.loginname as adminname
FROM `" . TABLE_API_KEYS . "` ak
LEFT JOIN `" . TABLE_PANEL_CUSTOMERS . "` c ON `c`.`customerid` = `ak`.`customerid`
LEFT JOIN `" . TABLE_PANEL_ADMINS . "` a ON `a`.`adminid` = `ak`.`adminid`
WHERE ";
$qry_params = [];
if (AREA == 'admin' && $userinfo['customers_see_all'] == '0') {
// admin with only customer-specific permissions
$keys_stmt_query .= "ak.adminid = :adminid ";
$qry_params['adminid'] = $userinfo['adminid'];
$fields = [
'a.loginname' => lng('login.username')
];
} elseif (AREA == 'customer') {
// customer-area
$keys_stmt_query .= "ak.customerid = :cid ";
$qry_params['cid'] = $userinfo['customerid'];
$fields = [
'c.loginname' => lng('login.username')
];
} else {
// admin who can see all customers / reseller / admins
$keys_stmt_query .= "1 ";
$fields = [
'a.loginname' => lng('login.username')
];
}
//$keys_stmt_query .= $paging->getSqlWhere(true) . " " . $paging->getSqlOrderBy() . " " . $paging->getSqlLimit();
$keys_stmt = Database::prepare($keys_stmt_query);
Database::pexecute($keys_stmt, $qry_params);
$all_keys = $keys_stmt->fetchAll(PDO::FETCH_ASSOC);
$apikeys_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/tablelisting.apikeys.php';
$collection = [
'data' => $all_keys,
'pagination' => []
];
$tpl = 'user/table.html.twig';
UI::view($tpl, [
'listing' => Listing::formatFromArray($collection, $apikeys_list_data['apikeys_list'], 'apikeys_list'),
'actions_links' => (int)$userinfo['api_allowed'] == 1 ? [
[
'href' => $linker->getLink(['section' => 'index', 'page' => $page, 'action' => 'add']),
'label' => lng('apikeys.key_add')
]
] : null,
]);

64
bin/froxlor-cli Executable file
View File

@@ -0,0 +1,64 @@
#!/usr/bin/env 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
*/
declare(strict_types=1);
use Symfony\Component\Console\Application;
use Froxlor\Cli\RunApiCommand;
use Froxlor\Cli\ConfigServices;
use Froxlor\Cli\PhpSessionclean;
use Froxlor\Cli\SwitchServerIp;
use Froxlor\Cli\UpdateCommand;
use Froxlor\Cli\InstallCommand;
use Froxlor\Cli\MasterCron;
use Froxlor\Cli\UserCommand;
use Froxlor\Cli\ValidateAcmeWebroot;
use Froxlor\Froxlor;
// validate correct php version
if (version_compare("7.4.0", PHP_VERSION, ">=")) {
die('Froxlor requires at least php-7.4. Please validate that your php-cli version is suitable.');
}
// ensure that default timezone is set
if (function_exists("date_default_timezone_set") && function_exists("date_default_timezone_get")) {
@date_default_timezone_set(@date_default_timezone_get());
}
require dirname(__DIR__) . '/vendor/autoload.php';
require dirname(__DIR__) . '/lib/tables.inc.php';
$application = new Application('froxlor-cli', Froxlor::getFullVersion());
$application->add(new RunApiCommand());
$application->add(new ConfigServices());
$application->add(new PhpSessionclean());
$application->add(new SwitchServerIp());
$application->add(new UpdateCommand());
$application->add(new InstallCommand());
$application->add(new MasterCron());
$application->add(new UserCommand());
$application->add(new ValidateAcmeWebroot());
$application->run();

278
build.xml Normal file
View File

@@ -0,0 +1,278 @@
<?xml version="1.0" encoding="UTF-8"?>
<project name="froxlor" default="build">
<!-- Use this when the tools are managed by Composer in ${basedir}/vendor/bin -->
<property name="pdepend" value="${basedir}/vendor/bin/pdepend" />
<property name="phpcpd" value="${basedir}/vendor/bin/phpcpd" />
<property name="phpcs" value="${basedir}/vendor/bin/phpcs" />
<property name="phploc" value="${basedir}/vendor/bin/phploc" />
<property name="phpmd" value="${basedir}/vendor/bin/phpmd" />
<property name="phpunit" value="${basedir}/vendor/bin/phpunit" />
<target name="full-build"
depends="prepare,composer,static-analysis,phpunit,-check-failure"
description="Performs static analysis, runs the tests, and generates project documentation" />
<target name="full-build-parallel"
depends="prepare,composer,static-analysis-parallel,phpunit,-check-failure"
description="Performs static analysis (executing the tools in parallel), runs the tests, and generates project documentation" />
<target name="quick-build"
depends="prepare,composer,lint,phpunit-no-coverage,-check-failure"
description="Performs a lint check and runs the tests (without generating code coverage reports)" />
<target name="static-analysis"
depends="composer,lint,phploc-ci,pdepend,phpmd-ci,phpcs-ci,phpcompat-ci,phpcpd-ci"
description="Performs static analysis" />
<!-- Adjust the threadCount attribute's value to the number of CPUs -->
<target name="static-analysis-parallel"
description="Performs static analysis (executing the tools in parallel)">
<parallel threadCount="2">
<sequential>
<antcall target="pdepend" />
<antcall target="phpmd-ci" />
</sequential>
<antcall target="lint" />
<antcall target="phpcpd-ci" />
<antcall target="phpcs-ci" />
<antcall target="phpcompat-ci" />
<antcall target="phploc-ci" />
</parallel>
</target>
<target name="clean" unless="clean.done"
description="Cleanup build artifacts">
<delete dir="${basedir}/build/api" />
<delete dir="${basedir}/build/coverage" />
<delete dir="${basedir}/build/logs" />
<delete dir="${basedir}/build/pdepend" />
<property name="clean.done" value="true" />
</target>
<target name="prepare" unless="prepare.done" depends="clean"
description="Prepare for build">
<mkdir dir="${basedir}/build/api" />
<mkdir dir="${basedir}/build/coverage" />
<mkdir dir="${basedir}/build/logs" />
<mkdir dir="${basedir}/build/pdepend" />
<property name="prepare.done" value="true" />
</target>
<target name="composer"
description="Installing composer dependencies" depends="prepare">
<exec executable="composer" failonerror="true">
<arg value="install" />
<arg value="--prefer-dist" />
<arg value="--no-progress" />
</exec>
</target>
<target name="lint" unless="lint.done"
description="Perform syntax check of sourcecode files">
<apply executable="php" taskname="lint">
<arg value="-l" />
<fileset dir="${basedir}/lib/Froxlor">
<include name="**/*.php" />
<modified />
</fileset>
<fileset dir="${basedir}/tests">
<include name="**/*.php" />
<modified />
</fileset>
</apply>
<property name="lint.done" value="true" />
</target>
<target name="phploc" unless="phploc.done"
description="Measure project size using PHPLOC and print human readable output. Intended for usage on the command line.">
<exec executable="${phploc}" taskname="phploc">
<arg value="--count-tests" />
<arg path="${basedir}/lib/Froxlor" />
<arg path="${basedir}/tests" />
</exec>
<property name="phploc.done" value="true" />
</target>
<target name="phploc-ci" unless="phploc.done" depends="prepare"
description="Measure project size using PHPLOC and log result in CSV and XML format. Intended for usage within a continuous integration environment.">
<exec executable="${phploc}" taskname="phploc">
<arg value="--count-tests" />
<arg value="--log-csv" />
<arg path="${basedir}/build/logs/phploc.csv" />
<arg value="--log-xml" />
<arg path="${basedir}/build/logs/phploc.xml" />
<arg path="${basedir}/lib/Froxlor" />
<arg path="${basedir}/tests" />
</exec>
<property name="phploc.done" value="true" />
</target>
<target name="pdepend" unless="pdepend.done" depends="prepare"
description="Calculate software metrics using PHP_Depend and log result in XML format. Intended for usage within a continuous integration environment.">
<exec executable="${pdepend}" taskname="pdepend">
<arg value="--jdepend-xml=${basedir}/build/logs/jdepend.xml" />
<arg
value="--jdepend-chart=${basedir}/build/pdepend/dependencies.svg" />
<arg
value="--overview-pyramid=${basedir}/build/pdepend/overview-pyramid.svg" />
<arg path="${basedir}/lib/Froxlor" />
</exec>
<property name="pdepend.done" value="true" />
</target>
<target name="phpmd" unless="phpmd.done"
description="Perform project mess detection using PHPMD and print human readable output. Intended for usage on the command line before committing.">
<exec executable="${phpmd}" taskname="phpmd">
<arg path="${basedir}/lib/Froxlor" />
<arg value="text" />
<arg path="${basedir}/phpmd.xml" />
</exec>
<property name="phpmd.done" value="true" />
</target>
<target name="phpmd-ci" unless="phpmd.done" depends="prepare"
description="Perform project mess detection using PHPMD and log result in XML format. Intended for usage within a continuous integration environment.">
<exec executable="${phpmd}" taskname="phpmd">
<arg path="${basedir}/lib/Froxlor" />
<arg value="xml" />
<arg path="${basedir}/phpmd.xml" />
<arg value="--reportfile" />
<arg path="${basedir}/build/logs/pmd.xml" />
</exec>
<property name="phpmd.done" value="true" />
</target>
<target name="phpcs" unless="phpcs.done"
description="Find coding standard violations using PHP_CodeSniffer and print human readable output. Intended for usage on the command line before committing.">
<exec executable="${phpcs}" taskname="phpcs">
<arg value="--standard=${basedir}/phpcs.xml" />
<arg value="--extensions=php" />
<arg path="${basedir}/lib/Froxlor" />
<arg path="${basedir}/tests" />
</exec>
<property name="phpcs.done" value="true" />
</target>
<target name="phpcs-ci" unless="phpcs.done" depends="prepare"
description="Find coding standard violations using PHP_CodeSniffer and log result in XML format. Intended for usage within a continuous integration environment.">
<exec executable="${phpcs}" output="/dev/null" taskname="phpcs">
<arg value="--report=checkstyle" />
<arg
value="--report-file=${basedir}/build/logs/checkstyle-standard.xml" />
<arg value="--standard=${basedir}/phpcs.xml" />
<arg value="--extensions=php" />
<arg path="${basedir}/lib/Froxlor" />
<arg path="${basedir}/tests" />
</exec>
<property name="phpcs.done" value="true" />
</target>
<target name="phpcompat" unless="phpcompat.done"
depends="composer"
description="Find php violations using PHP_CodeSniffer and print human readable output. Intended for usage on the command line before committing.">
<exec executable="${phpcs}" taskname="phpcompat">
<arg
line="--standard=PHPCompatibility --runtime-set testVersion 5.6 ${basedir}/lib/Froxlor ${basedir}/tests" />
</exec>
<property name="phpcompat.done" value="true" />
</target>
<target name="phpcompat-ci" unless="phpcompat.done"
depends="composer"
description="Find php violations using PHP_CodeSniffer and log result in XML format. Intended for usage within a continuous integration environment.">
<exec executable="${phpcs}" output="/dev/null"
taskname="phpcompat">
<arg
line="--standard=PHPCompatibility --runtime-set testVersion 5.6 --report=checkstyle --report-file=${basedir}/build/logs/checkstyle-compat.xml ${basedir}/lib/Froxlor ${basedir}/tests" />
</exec>
<property name="phpcompat.done" value="true" />
</target>
<target name="phpcpd" unless="phpcpd.done"
description="Find duplicate code using PHPCPD and print human readable output. Intended for usage on the command line before committing.">
<exec executable="${phpcpd}" taskname="phpcpd">
<arg path="${basedir}/lib/Froxlor" />
</exec>
<property name="phpcpd.done" value="true" />
</target>
<target name="phpcpd-ci" unless="phpcpd.done" depends="prepare"
description="Find duplicate code using PHPCPD and log result in XML format. Intended for usage within a continuous integration environment.">
<exec executable="${phpcpd}" taskname="phpcpd">
<arg value="--log-pmd" />
<arg path="${basedir}/build/logs/pmd-cpd.xml" />
<arg path="${basedir}/lib/Froxlor" />
</exec>
<property name="phpcpd.done" value="true" />
</target>
<target name="phpunit-prepare" unless="phpunit-prepare.done" depends="composer"
description="prepare xdebug unit tests">
<exec executable="${phpunit}" resultproperty="result.phpunit-prepare"
taskname="phpunit">
<arg value="--configuration" />
<arg path="${basedir}/phpunit.xml" />
<arg value="--dump-xdebug-filter" />
<arg path="${basedir}/tests/xdebug-filter.php" />
</exec>
<property name="phpunit-prepare.done" value="true" />
</target>
<target name="phpunit" unless="phpunit.done" depends="phpunit-prepare"
description="Run unit tests with PHPUnit">
<exec executable="${phpunit}" failonerror="true" resultproperty="result.phpunit"
taskname="phpunit">
<arg value="--configuration" />
<arg path="${basedir}/phpunit.xml" />
<arg value="--testsuite" />
<arg value="froxlor" />
<arg value="--prepend" />
<arg path="${basedir}/tests/xdebug-filter.php" />
</exec>
<property name="phpunit.done" value="true" />
</target>
<target name="phpunit-no-coverage" unless="phpunit.done"
depends="composer"
description="Run unit tests with PHPUnit (without generating code coverage reports)">
<exec executable="${phpunit}" failonerror="true" resultproperty="result.phpunit"
taskname="phpunit">
<arg value="--configuration" />
<arg path="${basedir}/phpunit.xml" />
<arg value="--testsuite" />
<arg value="froxlor" />
<arg value="--no-coverage" />
</exec>
<property name="phpunit.done" value="true" />
</target>
<target name="-check-failure">
<fail message="PHPUnit did not finish successfully">
<condition>
<not>
<equals arg1="${result.phpunit}" arg2="0" />
</not>
</condition>
</fail>
</target>
</project>

2
cache/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
!.gitignore
*

88
composer.json Normal file
View File

@@ -0,0 +1,88 @@
{
"name": "froxlor/froxlor",
"description": "The server administration software for your needs. Developed by experienced server administrators, this panel simplifies the effort of managing your hosting platform.",
"keywords": [
"server",
"administration",
"php"
],
"homepage": "https://www.froxlor.org",
"license": "GPL-2.0-or-later",
"authors": [
{
"name": "Michael Kaufmann",
"email": "team@froxlor.org",
"role": "Lead Developer"
}
],
"support": {
"email": "team@froxlor.org",
"issues": "https://github.com/Froxlor/Froxlor/issues",
"forum": "https://forum.froxlor.org/",
"source": "https://github.com/Froxlor/Froxlor",
"docs": "https://docs.froxlor.org/",
"chat": "https://discord.froxlor.org/"
},
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/d00p"
}
],
"require": {
"php": "^7.4 || ^8.0",
"ext-session": "*",
"ext-ctype": "*",
"ext-pdo": "*",
"ext-pdo_mysql": "*",
"ext-simplexml": "*",
"ext-xml": "*",
"ext-filter": "*",
"ext-posix": "*",
"ext-mbstring": "*",
"ext-curl": "*",
"ext-json": "*",
"ext-openssl": "*",
"ext-fileinfo": "*",
"ext-gmp": "*",
"ext-gd": "*",
"phpmailer/phpmailer": "~6.0",
"monolog/monolog": "^1.24",
"robthree/twofactorauth": "^1.6",
"froxlor/idna-convert-legacy": "^2.1",
"voku/anti-xss": "^4.1",
"twig/twig": "^3.3",
"erusev/parsedown": "^1.7",
"symfony/console": "^5.4",
"pear/net_dns2": "^1.5"
},
"require-dev": {
"phpunit/phpunit": "^9",
"ext-pcntl": "*",
"phpcompatibility/php-compatibility": "*",
"squizlabs/php_codesniffer": "*",
"pdepend/pdepend": "^2.9",
"sebastian/phpcpd": "^6.0",
"phploc/phploc": "^7.0",
"phpmd/phpmd": "^2.10",
"phpunit/php-timer" : "^5",
"phpstan/phpstan": "^1.8"
},
"suggest": {
"ext-bcmath": "*",
"ext-zip": "*",
"ext-apcu": "*",
"ext-readline": "*"
},
"autoload": {
"psr-4": {
"Froxlor\\": [
"lib/Froxlor"
]
}
},
"scripts": {
"post-install-cmd": "if [ -f ./vendor/bin/phpcs ]; then \"vendor/bin/phpcs\" --config-set installed_paths vendor/phpcompatibility/php-compatibility ; fi",
"post-update-cmd" : "if [ -f ./vendor/bin/phpcs ]; then \"vendor/bin/phpcs\" --config-set installed_paths vendor/phpcompatibility/php-compatibility ; fi"
}
}

4472
composer.lock generated Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 369 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 387 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 278 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 232 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 321 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 280 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 246 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 287 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -2,639 +2,343 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Panel
* *
* 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
*/ */
define('AREA', 'customer');
require './lib/init.php'; const AREA = 'customer';
require __DIR__ . '/lib/init.php';
use Froxlor\Api\Commands\CustomerBackups as CustomerBackups;
use Froxlor\Api\Commands\DirOptions as DirOptions;
use Froxlor\Api\Commands\DirProtections as DirProtections;
use Froxlor\Customer\Customer;
use Froxlor\FileDir;
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;
// redirect if this customer page is hidden via settings // redirect if this customer page is hidden via settings
if (Settings::IsInList('panel.customer_hide_options', 'extras')) { if (Settings::IsInList('panel.customer_hide_options', 'extras')) {
redirectTo('customer_index.php'); Response::redirectTo('customer_index.php');
} }
if (isset($_POST['id'])) { $id = (int)Request::any('id');
$id = intval($_POST['id']);
} elseif (isset($_GET['id'])) {
$id = intval($_GET['id']);
}
if ($page == 'overview') {
$log->logAction(USR_ACTION, LOG_NOTICE, "viewed customer_extras");
eval("echo \"" . getTemplate("extras/extras") . "\";");
} elseif ($page == 'htpasswds') {
if ($page == 'overview' || $page == 'htpasswds') {
// redirect if this customer sub-page is hidden via settings // redirect if this customer sub-page is hidden via settings
if (Settings::IsInList('panel.customer_hide_options', 'extras.directoryprotection')) { if (Settings::IsInList('panel.customer_hide_options', 'extras.directoryprotection')) {
redirectTo('customer_index.php'); Response::redirectTo('customer_index.php');
} }
if ($action == '') { if ($action == '') {
$log->logAction(USR_ACTION, LOG_NOTICE, "viewed customer_extras::htpasswds"); $log->logAction(FroxlorLogger::USR_ACTION, LOG_NOTICE, "viewed customer_extras::htpasswds");
$fields = array( $fields = [
'username' => $lng['login']['username'], 'username' => lng('login.username'),
'path' => $lng['panel']['path'] 'path' => lng('panel.path')
); ];
$paging = new paging($userinfo, TABLE_PANEL_HTPASSWDS, $fields); try {
$result_stmt = Database::prepare("SELECT * FROM `" . TABLE_PANEL_HTPASSWDS . "` $htpasswd_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/customer/tablelisting.htpasswd.php';
WHERE `customerid`= :customerid " . $paging->getSqlWhere(true) . " " . $paging->getSqlOrderBy() . " " . $paging->getSqlLimit()); $collection = (new Collection(DirProtections::class, $userinfo))
Database::pexecute($result_stmt, array( ->withPagination($htpasswd_list_data['htpasswd_list']['columns'], $htpasswd_list_data['htpasswd_list']['default_sorting']);
"customerid" => $userinfo['customerid'] } catch (Exception $e) {
)); Response::dynamicError($e->getMessage());
$paging->setEntries(Database::num_rows());
$sortcode = $paging->getHtmlSortCode($lng);
$arrowcode = $paging->getHtmlArrowCode($filename . '?page=' . $page . '&s=' . $s);
$searchcode = $paging->getHtmlSearchCode($lng);
$pagingcode = $paging->getHtmlPagingCode($filename . '?page=' . $page . '&s=' . $s);
$i = 0;
$count = 0;
$htpasswds = '';
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
if ($paging->checkDisplay($i)) {
if (strpos($row['path'], $userinfo['documentroot']) === 0) {
$row['path'] = str_replace($userinfo['documentroot'], "/", $row['path']);
}
$row['path'] = makeCorrectDir($row['path']);
$row = htmlentities_array($row);
eval("\$htpasswds.=\"" . getTemplate("extras/htpasswds_htpasswd") . "\";");
$count ++;
} }
$i ++; UI::view('user/table.html.twig', [
} 'listing' => Listing::format($collection, $htpasswd_list_data, 'htpasswd_list'),
'actions_links' => [
eval("echo \"" . getTemplate("extras/htpasswds") . "\";"); [
'href' => $linker->getLink(['section' => 'extras', 'page' => 'htpasswds', 'action' => 'add']),
'label' => lng('extras.directoryprotection_add')
]
],
'entity_info' => lng('extras.description')
]);
} elseif ($action == 'delete' && $id != 0) { } elseif ($action == 'delete' && $id != 0) {
$result_stmt = Database::prepare("SELECT * FROM `" . TABLE_PANEL_HTPASSWDS . "` try {
WHERE `customerid`= :customerid $json_result = DirProtections::getLocal($userinfo, [
AND `id`= :id"); 'id' => $id
Database::pexecute($result_stmt, array( ])->get();
"customerid" => $userinfo['customerid'], } catch (Exception $e) {
"id" => $id Response::dynamicError($e->getMessage());
)); }
$result = $result_stmt->fetch(PDO::FETCH_ASSOC); $result = json_decode($json_result, true)['data'];
if (isset($result['username']) && $result['username'] != '') { if (isset($result['username']) && $result['username'] != '') {
if (isset($_POST['send']) && $_POST['send'] == 'send') { if (isset($_POST['send']) && $_POST['send'] == 'send') {
$stmt = Database::prepare("DELETE FROM `" . TABLE_PANEL_HTPASSWDS . "` try {
WHERE `customerid`= :customerid DirProtections::getLocal($userinfo, $_POST)->delete();
AND `id`= :id"); } catch (Exception $e) {
Database::pexecute($stmt, array( Response::dynamicError($e->getMessage());
"customerid" => $userinfo['customerid'], }
"id" => $id Response::redirectTo($filename, [
)); 'page' => $page
]);
$log->logAction(USR_ACTION, LOG_INFO, "deleted htpasswd for '" . $result['username'] . " (" . $result['path'] . ")'");
inserttask('1');
redirectTo($filename, array(
'page' => $page,
's' => $s
));
} else { } else {
if (strpos($result['path'], $userinfo['documentroot']) === 0) { if (strpos($result['path'], $userinfo['documentroot']) === 0) {
$result['path'] = str_replace($userinfo['documentroot'], "/", $result['path']); $result['path'] = str_replace($userinfo['documentroot'], "/", $result['path']);
} }
ask_yesno('extras_reallydelete', $filename, array( HTML::askYesNo('extras_reallydelete', $filename, [
'id' => $id, 'id' => $id,
'page' => $page, 'page' => $page,
'action' => $action 'action' => $action
), $result['username'] . ' (' . $result['path'] . ')'); ], $result['username'] . ' (' . $result['path'] . ')');
} }
} }
} elseif ($action == 'add') { } elseif ($action == 'add') {
if (isset($_POST['send']) && $_POST['send'] == 'send') { if (isset($_POST['send']) && $_POST['send'] == 'send') {
$path = makeCorrectDir(validate($_POST['path'], 'path')); try {
$userpath = $path; DirProtections::getLocal($userinfo, $_POST)->add();
$path = makeCorrectDir($userinfo['documentroot'] . '/' . $path); } catch (Exception $e) {
$username = validate($_POST['username'], 'username', '/^[a-zA-Z0-9][a-zA-Z0-9\-_]+\$?$/'); Response::dynamicError($e->getMessage());
$authname = validate($_POST['directory_authname'], 'directory_authname', '/^[a-zA-Z0-9][a-zA-Z0-9\-_ ]+\$?$/');
validate($_POST['directory_password'], 'password');
$username_path_check_stmt = Database::prepare("SELECT `id`, `username`, `path` FROM `" . TABLE_PANEL_HTPASSWDS . "`
WHERE `username`= :username
AND `path`= :path
AND `customerid`= :customerid");
$params = array(
"username" => $username,
"path" => $path,
"customerid" => $userinfo['customerid']
);
Database::pexecute($username_path_check_stmt, $params);
$username_path_check = $username_path_check_stmt->fetch(PDO::FETCH_ASSOC);
if (CRYPT_STD_DES == 1) {
$saltfordescrypt = substr(md5(uniqid(microtime(), 1)), 4, 2);
$password = crypt($_POST['directory_password'], $saltfordescrypt);
} else {
$password = crypt($_POST['directory_password']);
} }
Response::redirectTo($filename, [
if (! $_POST['path']) { 'page' => $page
standard_error('invalidpath'); ]);
}
if ($username == '') {
standard_error(array(
'stringisempty',
'myloginname'
));
} elseif ($username_path_check['username'] == $username && $username_path_check['path'] == $path) {
standard_error('userpathcombinationdupe');
} elseif ($_POST['directory_password'] == '') {
standard_error(array(
'stringisempty',
'mypassword'
));
} elseif ($path == '') {
standard_error('patherror');
} elseif ($_POST['directory_password'] == $username) {
standard_error('passwordshouldnotbeusername');
} else { } else {
$stmt = Database::prepare("INSERT INTO `" . TABLE_PANEL_HTPASSWDS . "` SET $pathSelect = FileDir::makePathfield($userinfo['documentroot'], $userinfo['guid'], $userinfo['guid']);
`customerid` = :customerid,
`username` = :username,
`password` = :password,
`path` = :path,
`authname` = :authname");
$params = array(
"customerid" => $userinfo['customerid'],
"username" => $username,
"password" => $password,
"path" => $path,
"authname" => $authname
);
Database::pexecute($stmt, $params);
$log->logAction(USR_ACTION, LOG_INFO, "added htpasswd for '" . $username . " (" . $path . ")'");
inserttask('1');
redirectTo($filename, array(
'page' => $page,
's' => $s
));
}
} else {
$pathSelect = makePathfield($userinfo['documentroot'], $userinfo['guid'], $userinfo['guid']);
$htpasswd_add_data = include_once dirname(__FILE__) . '/lib/formfields/customer/extras/formfield.htpasswd_add.php'; $htpasswd_add_data = include_once dirname(__FILE__) . '/lib/formfields/customer/extras/formfield.htpasswd_add.php';
$htpasswd_add_form = htmlform::genHTMLForm($htpasswd_add_data);
$title = $htpasswd_add_data['htpasswd_add']['title']; UI::view('user/form.html.twig', [
$image = $htpasswd_add_data['htpasswd_add']['image']; 'formaction' => $linker->getLink(['section' => 'extras']),
'formdata' => $htpasswd_add_data['htpasswd_add']
eval("echo \"" . getTemplate("extras/htpasswds_add") . "\";"); ]);
} }
} elseif ($action == 'edit' && $id != 0) { } elseif ($action == 'edit' && $id != 0) {
$result_stmt = Database::prepare("SELECT * FROM `" . TABLE_PANEL_HTPASSWDS . "` try {
WHERE `customerid`= :customerid $json_result = DirProtections::getLocal($userinfo, [
AND `id`= :id"); 'id' => $id
Database::pexecute($result_stmt, array( ])->get();
"customerid" => $userinfo['customerid'], } catch (Exception $e) {
"id" => $id Response::dynamicError($e->getMessage());
)); }
$result = $result_stmt->fetch(PDO::FETCH_ASSOC); $result = json_decode($json_result, true)['data'];
if (isset($result['username']) && $result['username'] != '') { if (isset($result['username']) && $result['username'] != '') {
if (isset($_POST['send']) && $_POST['send'] == 'send') { if (isset($_POST['send']) && $_POST['send'] == 'send') {
validate($_POST['directory_password'], 'password'); try {
$authname = validate($_POST['directory_authname'], 'directory_authname', '/^[a-zA-Z0-9][a-zA-Z0-9\-_ ]+\$?$/'); DirProtections::getLocal($userinfo, $_POST)->update();
} catch (Exception $e) {
if (CRYPT_STD_DES == 1) { Response::dynamicError($e->getMessage());
$saltfordescrypt = substr(md5(uniqid(microtime(), 1)), 4, 2);
$password = crypt($_POST['directory_password'], $saltfordescrypt);
} else {
$password = crypt($_POST['directory_password']);
}
if ($_POST['directory_password'] == $result['username']) {
standard_error('passwordshouldnotbeusername');
}
$params = array(
"customerid" => $userinfo['customerid'],
"id" => $id
);
$pwd_sql = '';
if ($_POST['directory_password'] != '') {
$pwd_sql = "`password`= :password ";
$params["password"] = $password;
}
$auth_sql = '';
if ($authname != $result['authname']) {
$auth_sql = "`authname`= :authname ";
$params["authname"] = $authname;
}
if ($pwd_sql != '' || $auth_sql != '') {
if ($pwd_sql != '' && $auth_sql != '') {
$pwd_sql .= ', ';
}
$stmt = Database::prepare("UPDATE `" . TABLE_PANEL_HTPASSWDS . "`
SET " . $pwd_sql . $auth_sql . "
WHERE `customerid`= :customerid
AND `id`= :id");
Database::pexecute($stmt, $params);
$log->logAction(USR_ACTION, LOG_INFO, "edited htpasswd for '" . $result['username'] . " (" . $result['path'] . ")'");
inserttask('1');
redirectTo($filename, array(
'page' => $page,
's' => $s
));
} }
Response::redirectTo($filename, [
'page' => $page
]);
} else { } else {
if (strpos($result['path'], $userinfo['documentroot']) === 0) { if (strpos($result['path'], $userinfo['documentroot']) === 0) {
$result['path'] = str_replace($userinfo['documentroot'], "/", $result['path']); $result['path'] = str_replace($userinfo['documentroot'], "/", $result['path']);
} }
$result = PhpHelper::htmlentitiesArray($result);
$result = htmlentities_array($result);
$htpasswd_edit_data = include_once dirname(__FILE__) . '/lib/formfields/customer/extras/formfield.htpasswd_edit.php'; $htpasswd_edit_data = include_once dirname(__FILE__) . '/lib/formfields/customer/extras/formfield.htpasswd_edit.php';
$htpasswd_edit_form = htmlform::genHTMLForm($htpasswd_edit_data);
$title = $htpasswd_edit_data['htpasswd_edit']['title']; UI::view('user/form.html.twig', [
$image = $htpasswd_edit_data['htpasswd_edit']['image']; 'formaction' => $linker->getLink(['section' => 'extras', 'id' => $id]),
'formdata' => $htpasswd_edit_data['htpasswd_edit'],
eval("echo \"" . getTemplate("extras/htpasswds_edit") . "\";"); 'editid' => $id
]);
} }
} }
} }
} elseif ($page == 'htaccess') { } elseif ($page == 'htaccess') {
// redirect if this customer sub-page is hidden via settings // redirect if this customer sub-page is hidden via settings
if (Settings::IsInList('panel.customer_hide_options', 'extras.pathoptions')) { if (Settings::IsInList('panel.customer_hide_options', 'extras.pathoptions')) {
redirectTo('customer_index.php'); Response::redirectTo('customer_index.php');
} }
if ($action == '') { if ($action == '') {
$log->logAction(USR_ACTION, LOG_NOTICE, "viewed customer_extras::htaccess"); $log->logAction(FroxlorLogger::USR_ACTION, LOG_NOTICE, "viewed customer_extras::htaccess");
$fields = array(
'path' => $lng['panel']['path'],
'options_indexes' => $lng['extras']['view_directory'],
'error404path' => $lng['extras']['error404path'],
'error403path' => $lng['extras']['error403path'],
'error500path' => $lng['extras']['error500path'],
'options_cgi' => $lng['extras']['execute_perl']
);
$paging = new paging($userinfo, TABLE_PANEL_HTACCESS, $fields);
$result_stmt = Database::prepare("SELECT * FROM `" . TABLE_PANEL_HTACCESS . "`
WHERE `customerid`= :customerid " . $paging->getSqlWhere(true) . " " . $paging->getSqlOrderBy() . " " . $paging->getSqlLimit());
Database::pexecute($result_stmt, array(
"customerid" => $userinfo['customerid']
));
$paging->setEntries(Database::num_rows());
$sortcode = $paging->getHtmlSortCode($lng);
$arrowcode = $paging->getHtmlArrowCode($filename . '?page=' . $page . '&s=' . $s);
$searchcode = $paging->getHtmlSearchCode($lng);
$pagingcode = $paging->getHtmlPagingCode($filename . '?page=' . $page . '&s=' . $s);
$i = 0;
$count = 0;
$htaccess = '';
$cperlenabled = customerHasPerlEnabled($userinfo['customerid']); $cperlenabled = Customer::customerHasPerlEnabled($userinfo['customerid']);
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) { try {
if ($paging->checkDisplay($i)) { $htaccess_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/customer/tablelisting.htaccess.php';
if (strpos($row['path'], $userinfo['documentroot']) === 0) { $collection = (new Collection(DirOptions::class, $userinfo))
$row['path'] = str_replace($userinfo['documentroot'], "/", $row['path']); ->withPagination($htaccess_list_data['htaccess_list']['columns'], $htaccess_list_data['htaccess_list']['default_sorting']);
} } catch (Exception $e) {
$row['path'] = makeCorrectDir($row['path']); Response::dynamicError($e->getMessage());
$row['options_indexes'] = str_replace('1', $lng['panel']['yes'], $row['options_indexes']);
$row['options_indexes'] = str_replace('0', $lng['panel']['no'], $row['options_indexes']);
$row['options_cgi'] = str_replace('1', $lng['panel']['yes'], $row['options_cgi']);
$row['options_cgi'] = str_replace('0', $lng['panel']['no'], $row['options_cgi']);
$row = htmlentities_array($row);
eval("\$htaccess.=\"" . getTemplate("extras/htaccess_htaccess") . "\";");
$count ++;
} }
$i ++; UI::view('user/table.html.twig', [
} 'listing' => Listing::format($collection, $htaccess_list_data, 'htaccess_list'),
'actions_links' => [
eval("echo \"" . getTemplate("extras/htaccess") . "\";"); [
'href' => $linker->getLink(['section' => 'extras', 'page' => 'htaccess', 'action' => 'add']),
'label' => lng('extras.pathoptions_add')
]
],
'entity_info' => lng('extras.description')
]);
} elseif ($action == 'delete' && $id != 0) { } elseif ($action == 'delete' && $id != 0) {
$result_stmt = Database::prepare("SELECT * FROM `" . TABLE_PANEL_HTACCESS . "` try {
WHERE `customerid` = :customerid $json_result = DirOptions::getLocal($userinfo, [
AND `id` = :id"); 'id' => $id
Database::pexecute($result_stmt, array( ])->get();
"customerid" => $userinfo['customerid'], } catch (Exception $e) {
"id" => $id Response::dynamicError($e->getMessage());
)); }
$result = $result_stmt->fetch(PDO::FETCH_ASSOC); $result = json_decode($json_result, true)['data'];
if (isset($result['customerid']) && $result['customerid'] != '' && $result['customerid'] == $userinfo['customerid']) { if (isset($result['customerid']) && $result['customerid'] != '' && $result['customerid'] == $userinfo['customerid']) {
if (isset($_POST['send']) && $_POST['send'] == 'send') { if (isset($_POST['send']) && $_POST['send'] == 'send') {
// do we have to remove the symlink and folder in suexecpath? try {
if ((int) Settings::Get('perl.suexecworkaround') == 1) { DirOptions::getLocal($userinfo, $_POST)->delete();
$loginname = getCustomerDetail($result['customerid'], 'loginname'); } catch (Exception $e) {
$suexecpath = makeCorrectDir(Settings::Get('perl.suexecpath') . '/' . $loginname . '/' . md5($result['path']) . '/'); Response::dynamicError($e->getMessage());
$perlsymlink = makeCorrectFile($result['path'] . '/cgi-bin');
// remove symlink
if (file_exists($perlsymlink)) {
safe_exec('rm -f ' . escapeshellarg($perlsymlink));
$log->logAction(USR_ACTION, LOG_DEBUG, "deleted suexecworkaround symlink '" . $perlsymlink . "'");
} }
// remove folder in suexec-path Response::redirectTo($filename, [
if (file_exists($suexecpath)) { 'page' => $page
safe_exec('rm -rf ' . escapeshellarg($suexecpath)); ]);
$log->logAction(USR_ACTION, LOG_DEBUG, "deleted suexecworkaround path '" . $suexecpath . "'");
}
}
$stmt = Database::prepare("DELETE FROM `" . TABLE_PANEL_HTACCESS . "`
WHERE `customerid`= :customerid
AND `id`= :id");
Database::pexecute($stmt, array(
"customerid" => $userinfo['customerid'],
"id" => $id
));
$log->logAction(USR_ACTION, LOG_INFO, "deleted htaccess for '" . str_replace($userinfo['documentroot'], '/', $result['path']) . "'");
inserttask('1');
redirectTo($filename, array(
'page' => $page,
's' => $s
));
} else { } else {
ask_yesno('extras_reallydelete_pathoptions', $filename, array( HTML::askYesNo('extras_reallydelete_pathoptions', $filename, [
'id' => $id, 'id' => $id,
'page' => $page, 'page' => $page,
'action' => $action 'action' => $action
), str_replace($userinfo['documentroot'], '/', $result['path'])); ], str_replace($userinfo['documentroot'], '/', $result['path']));
} }
} }
} elseif ($action == 'add') { } elseif ($action == 'add') {
if (isset($_POST['send']) && $_POST['send'] == 'send') { if (isset($_POST['send']) && $_POST['send'] == 'send') {
$path = makeCorrectDir(validate($_POST['path'], 'path')); try {
$userpath = $path; DirOptions::getLocal($userinfo, $_POST)->add();
$path = makeCorrectDir($userinfo['documentroot'] . '/' . $path); } catch (Exception $e) {
$path_dupe_check_stmt = Database::prepare("SELECT `id`, `path` FROM `" . TABLE_PANEL_HTACCESS . "` Response::dynamicError($e->getMessage());
WHERE `path`= :path
AND `customerid`= :customerid");
Database::pexecute($path_dupe_check_stmt, array(
"path" => $path,
"customerid" => $userinfo['customerid']
));
$path_dupe_check = $path_dupe_check_stmt->fetch(PDO::FETCH_ASSOC);
if (! $_POST['path']) {
standard_error('invalidpath');
} }
Response::redirectTo($filename, [
if (isset($_POST['options_cgi']) && (int) $_POST['options_cgi'] != 0) { 'page' => $page
$options_cgi = '1'; ]);
} else { } else {
$options_cgi = '0'; $pathSelect = FileDir::makePathfield($userinfo['documentroot'], $userinfo['guid'], $userinfo['guid']);
} $cperlenabled = Customer::customerHasPerlEnabled($userinfo['customerid']);
$error404path = '';
if (isset($_POST['error404path'])) {
$error404path = correctErrorDocument($_POST['error404path']);
}
$error403path = '';
if (isset($_POST['error403path'])) {
$error403path = correctErrorDocument($_POST['error403path']);
}
$error500path = '';
if (isset($_POST['error500path'])) {
$error500path = correctErrorDocument($_POST['error500path']);
}
if ($path_dupe_check['path'] == $path) {
standard_error('errordocpathdupe', $userpath);
} elseif ($path == '') {
standard_error('patherror');
} else {
$stmt = Database::prepare('INSERT INTO `' . TABLE_PANEL_HTACCESS . '` SET
`customerid` = :customerid,
`path` = :path,
`options_indexes` = :options_indexes,
`error404path` = :error404path,
`error403path` = :error403path,
`error500path` = :error500path,
`options_cgi` = :options_cgi');
$params = array(
"customerid" => $userinfo['customerid'],
"path" => $path,
"options_indexes" => $_POST['options_indexes'] == '1' ? '1' : '0',
"error403path" => $error403path,
"error404path" => $error404path,
"error500path" => $error500path,
"options_cgi" => $options_cgi
);
Database::pexecute($stmt, $params);
$log->logAction(USR_ACTION, LOG_INFO, "added htaccess for '" . $path . "'");
inserttask('1');
redirectTo($filename, array(
'page' => $page,
's' => $s
));
}
} else {
$pathSelect = makePathfield($userinfo['documentroot'], $userinfo['guid'], $userinfo['guid']);
$cperlenabled = customerHasPerlEnabled($userinfo['customerid']);
$htaccess_add_data = include_once dirname(__FILE__) . '/lib/formfields/customer/extras/formfield.htaccess_add.php'; $htaccess_add_data = include_once dirname(__FILE__) . '/lib/formfields/customer/extras/formfield.htaccess_add.php';
$htaccess_add_form = htmlform::genHTMLForm($htaccess_add_data);
$title = $htaccess_add_data['htaccess_add']['title']; UI::view('user/form.html.twig', [
$image = $htaccess_add_data['htaccess_add']['image']; 'formaction' => $linker->getLink(['section' => 'extras']),
'formdata' => $htaccess_add_data['htaccess_add']
eval("echo \"" . getTemplate("extras/htaccess_add") . "\";"); ]);
} }
} elseif (($action == 'edit') && ($id != 0)) { } elseif (($action == 'edit') && ($id != 0)) {
$result_stmt = Database::prepare("SELECT * FROM `" . TABLE_PANEL_HTACCESS . "` try {
WHERE `customerid` = :customerid $json_result = DirOptions::getLocal($userinfo, [
AND `id` = :id"); 'id' => $id
Database::pexecute($result_stmt, array( ])->get();
"customerid" => $userinfo['customerid'], } catch (Exception $e) {
"id" => $id Response::dynamicError($e->getMessage());
)); }
$result = $result_stmt->fetch(PDO::FETCH_ASSOC); $result = json_decode($json_result, true)['data'];
if ((isset($result['customerid'])) && ($result['customerid'] != '') && ($result['customerid'] == $userinfo['customerid'])) { if ((isset($result['customerid'])) && ($result['customerid'] != '') && ($result['customerid'] == $userinfo['customerid'])) {
if (isset($_POST['send']) && $_POST['send'] == 'send') { if (isset($_POST['send']) && $_POST['send'] == 'send') {
$option_indexes = intval($_POST['options_indexes']); try {
$options_cgi = isset($_POST['options_cgi']) ? intval($_POST['options_cgi']) : 0; DirOptions::getLocal($userinfo, $_POST)->update();
} catch (Exception $e) {
if ($option_indexes != '1') { Response::dynamicError($e->getMessage());
$option_indexes = '0';
} }
Response::redirectTo($filename, [
if ($options_cgi != '1') { 'page' => $page
$options_cgi = '0'; ]);
}
$error404path = correctErrorDocument($_POST['error404path']);
$error403path = correctErrorDocument($_POST['error403path']);
$error500path = correctErrorDocument($_POST['error500path']);
if (($option_indexes != $result['options_indexes']) || ($error404path != $result['error404path']) || ($error403path != $result['error403path']) || ($error500path != $result['error500path']) || ($options_cgi != $result['options_cgi'])) {
inserttask('1');
$stmt = Database::prepare("UPDATE `" . TABLE_PANEL_HTACCESS . "`
SET `options_indexes` = :options_indexes,
`error404path` = :error404path,
`error403path` = :error403path,
`error500path` = :error500path,
`options_cgi` = :options_cgi
WHERE `customerid` = :customerid
AND `id` = :id");
$params = array(
"customerid" => $userinfo['customerid'],
"options_indexes" => $_POST['options_indexes'] == '1' ? '1' : '0',
"error403path" => $error403path,
"error404path" => $error404path,
"error500path" => $error500path,
"options_cgi" => $options_cgi,
"id" => $id
);
Database::pexecute($stmt, $params);
$log->logAction(USR_ACTION, LOG_INFO, "edited htaccess for '" . str_replace($userinfo['documentroot'], '/', $result['path']) . "'");
}
redirectTo($filename, array(
'page' => $page,
's' => $s
));
} else { } else {
if (strpos($result['path'], $userinfo['documentroot']) === 0) { if (strpos($result['path'], $userinfo['documentroot']) === 0) {
$result['path'] = str_replace($userinfo['documentroot'], "/", $result['path']); $result['path'] = str_replace($userinfo['documentroot'], "/", $result['path']);
} }
$cperlenabled = Customer::customerHasPerlEnabled($userinfo['customerid']);
$result['error404path'] = $result['error404path']; $result = PhpHelper::htmlentitiesArray($result);
$result['error403path'] = $result['error403path'];
$result['error500path'] = $result['error500path'];
$cperlenabled = customerHasPerlEnabled($userinfo['customerid']);
/*
* $options_indexes = makeyesno('options_indexes', '1', '0', $result['options_indexes']);
* $options_cgi = makeyesno('options_cgi', '1', '0', $result['options_cgi']);
*/
$result = htmlentities_array($result);
$htaccess_edit_data = include_once dirname(__FILE__) . '/lib/formfields/customer/extras/formfield.htaccess_edit.php'; $htaccess_edit_data = include_once dirname(__FILE__) . '/lib/formfields/customer/extras/formfield.htaccess_edit.php';
$htaccess_edit_form = htmlform::genHTMLForm($htaccess_edit_data);
$title = $htaccess_edit_data['htaccess_edit']['title']; UI::view('user/form.html.twig', [
$image = $htaccess_edit_data['htaccess_edit']['image']; 'formaction' => $linker->getLink(['section' => 'extras', 'id' => $id]),
'formdata' => $htaccess_edit_data['htaccess_edit'],
eval("echo \"" . getTemplate("extras/htaccess_edit") . "\";"); 'editid' => $id
]);
} }
} }
} }
} elseif ($page == 'backup') { } elseif ($page == 'backup') {
// redirect if this customer sub-page is hidden via settings // redirect if this customer sub-page is hidden via settings
if (Settings::IsInList('panel.customer_hide_options', 'extras.backup')) { if (Settings::IsInList('panel.customer_hide_options', 'extras.backup')) {
redirectTo('customer_index.php'); Response::redirectTo('customer_index.php');
} }
if (Settings::Get('system.backupenabled') == 1) if (Settings::Get('system.backupenabled') == 1) {
{ if ($action == 'abort') {
if ($action == 'abort' && isset($_POST['send']) && $_POST['send'] == 'send') { if (isset($_POST['send']) && $_POST['send'] == 'send') {
$log->logAction(USR_ACTION, LOG_NOTICE, "customer_extras::backup - aborted scheduled backupjob"); $log->logAction(FroxlorLogger::USR_ACTION, LOG_NOTICE, "customer_extras::backup - aborted scheduled backupjob");
$entry = isset($_POST['backup_job_entry']) ? (int)$_POST['backup_job_entry'] : 0; try {
if ($entry > 0) { CustomerBackups::getLocal($userinfo, $_POST)->delete();
$del_stmt = Database::prepare("DELETE FROM `".TABLE_PANEL_TASKS."` WHERE `id` = :tid"); } catch (Exception $e) {
Database::pexecute($del_stmt, array('tid' => $entry)); Response::dynamicError($e->getMessage());
standard_success('backupaborted');
} }
redirectTo($filename, array('page' => $page, 'action' => '', 's' => $s)); Response::redirectTo($filename, [
'page' => $page,
'action' => ''
]);
} else {
HTML::askYesNo('extras_reallydelete_backup', $filename, [
'backup_job_entry' => $id,
'section' => 'extras',
'page' => $page,
'action' => $action
]);
} }
if ($action == '') { } elseif ($action == '') {
$log->logAction(USR_ACTION, LOG_NOTICE, "viewed customer_extras::backup"); $log->logAction(FroxlorLogger::USR_ACTION, LOG_NOTICE, "viewed customer_extras::backup");
// check whether there is a backup-job for this customer // check whether there is a backup-job for this customer
$sel_stmt = Database::prepare("SELECT * FROM `".TABLE_PANEL_TASKS."` WHERE `type` = '20'"); try {
Database::pexecute($sel_stmt); $backup_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/customer/tablelisting.backups.php';
$existing_backupJob = null; $collection = (new Collection(CustomerBackups::class, $userinfo));
while ($entry = $sel_stmt->fetch()) } catch (Exception $e) {
{ Response::dynamicError($e->getMessage());
$data = unserialize($entry['data']);
if ($data['customerid'] == $userinfo['customerid']) {
$existing_backupJob = $entry;
break;
}
} }
if (isset($_POST['send']) && $_POST['send'] == 'send') { if (isset($_POST['send']) && $_POST['send'] == 'send') {
try {
if (! $_POST['path']) { CustomerBackups::getLocal($userinfo, $_POST)->add();
standard_error('invalidpath'); } catch (Exception $e) {
Response::dynamicError($e->getMessage());
} }
Response::standardSuccess('backupscheduled');
$path = makeCorrectDir(validate($_POST['path'], 'path'));
$path = makeCorrectDir($userinfo['documentroot'] . '/' . $path);
$backup_dbs = isset($_POST['backup_dbs']) ? intval($_POST['backup_dbs']) : 0;
$backup_mail = isset($_POST['backup_mail']) ? intval($_POST['backup_mail']) : 0;
$backup_web = isset($_POST['backup_web']) ? intval($_POST['backup_web']) : 0;
if ($backup_dbs != '1') {
$backup_dbs = '0';
}
if ($backup_mail != '1') {
$backup_mail = '0';
}
if ($backup_web != '1') {
$backup_web = '0';
}
$task_data = array(
'customerid' => $userinfo['customerid'],
'uid' => $userinfo['guid'],
'gid' => $userinfo['guid'],
'loginname' => $userinfo['loginname'],
'destdir' => $path,
'backup_dbs' => $backup_dbs,
'backup_mail' => $backup_mail,
'backup_web' => $backup_web
);
// schedule backup job
inserttask('20', $task_data);
standard_success('backupscheduled');
} else { } else {
$pathSelect = FileDir::makePathfield($userinfo['documentroot'], $userinfo['guid'], $userinfo['guid']);
if (!empty($existing_backupJob)) {
$action = "abort";
$row = unserialize($entry['data']);
$row['path'] = makeCorrectDir(str_replace($userinfo['documentroot'], "/", $row['destdir']));
$row['backup_web'] = ($row['backup_web'] == '1') ? $lng['panel']['yes'] : $lng['panel']['no'];
$row['backup_mail'] = ($row['backup_mail'] == '1') ? $lng['panel']['yes'] : $lng['panel']['no'];
$row['backup_dbs'] = ($row['backup_dbs'] == '1') ? $lng['panel']['yes'] : $lng['panel']['no'];
}
$pathSelect = makePathfield($userinfo['documentroot'], $userinfo['guid'], $userinfo['guid']);
$backup_data = include_once dirname(__FILE__) . '/lib/formfields/customer/extras/formfield.backup.php'; $backup_data = include_once dirname(__FILE__) . '/lib/formfields/customer/extras/formfield.backup.php';
$backup_form = htmlform::genHTMLForm($backup_data);
$title = $backup_data['backup']['title'];
$image = $backup_data['backup']['image'];
if (!empty($existing_backupJob)) { UI::view('user/form-datatable.html.twig', [
// overwrite backup_form after we took everything from it we needed 'formaction' => $linker->getLink(['section' => 'extras']),
eval("\$backup_form = \"" . getTemplate("extras/backup_listexisting") . "\";"); 'formdata' => $backup_data['backup'],
} 'tabledata' => Listing::format($collection, $backup_list_data, 'backup_list'),
eval("echo \"" . getTemplate("extras/backup") . "\";"); ]);
} }
} }
} } else {
else Response::standardError('backupfunctionnotenabled');
{
standard_error('backupfunctionnotenabled');
} }
} }

View File

@@ -2,486 +2,202 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Panel
* *
* 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
*/ */
define('AREA', 'customer'); const AREA = 'customer';
require './lib/init.php'; require __DIR__ . '/lib/init.php';
use Froxlor\Api\Commands\Ftps as Ftps;
use Froxlor\Database\Database;
use Froxlor\FileDir;
use Froxlor\FroxlorLogger;
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;
use Froxlor\CurrentUser;
// redirect if this customer page is hidden via settings // redirect if this customer page is hidden via settings
if (Settings::IsInList('panel.customer_hide_options', 'ftp')) { if (Settings::IsInList('panel.customer_hide_options', 'ftp')) {
redirectTo('customer_index.php'); Response::redirectTo('customer_index.php');
} }
$id = 0; $id = (int)Request::any('id', 0);
if (isset($_POST['id'])) {
$id = intval($_POST['id']);
} elseif (isset($_GET['id'])) {
$id = intval($_GET['id']);
}
if ($page == 'overview') { if ($page == 'overview' || $page == 'accounts') {
$log->logAction(USR_ACTION, LOG_NOTICE, "viewed customer_ftp");
eval("echo \"" . getTemplate('ftp/ftp') . "\";");
} elseif ($page == 'accounts') {
if ($action == '') { if ($action == '') {
$log->logAction(USR_ACTION, LOG_NOTICE, "viewed customer_ftp::accounts"); $log->logAction(FroxlorLogger::USR_ACTION, LOG_NOTICE, "viewed customer_ftp::accounts");
$fields = array( try {
'username' => $lng['login']['username'], $ftp_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/customer/tablelisting.ftps.php';
'homedir' => $lng['panel']['path'], $collection = (new Collection(Ftps::class, $userinfo))
'description' => $lng['panel']['ftpdesc'] ->withPagination($ftp_list_data['ftp_list']['columns'], $ftp_list_data['ftp_list']['default_sorting']);
); } catch (Exception $e) {
$paging = new paging($userinfo, TABLE_FTP_USERS, $fields); Response::dynamicError($e->getMessage());
$result_stmt = Database::prepare("SELECT `id`, `username`, `description`, `homedir`, `shell` FROM `" . TABLE_FTP_USERS . "`
WHERE `customerid`= :customerid " . $paging->getSqlWhere(true) . " " . $paging->getSqlOrderBy() . " " . $paging->getSqlLimit()
);
Database::pexecute($result_stmt, array("customerid" => $userinfo['customerid']));
$ftps_count = Database::num_rows();
$paging->setEntries($ftps_count);
$sortcode = $paging->getHtmlSortCode($lng);
$arrowcode = $paging->getHtmlArrowCode($filename . '?page=' . $page . '&s=' . $s);
$searchcode = $paging->getHtmlSearchCode($lng);
$pagingcode = $paging->getHtmlPagingCode($filename . '?page=' . $page . '&s=' . $s);
$i = 0;
$count = 0;
$accounts = '';
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
if ($paging->checkDisplay($i)) {
if (strpos($row['homedir'], $userinfo['documentroot']) === 0) {
$row['documentroot'] = str_replace($userinfo['documentroot'], "/", $row['homedir']);
} else {
$row['documentroot'] = $row['homedir'];
} }
$row['documentroot'] = makeCorrectDir($row['documentroot']); $actions_links = false;
if (CurrentUser::canAddResource('ftps')) {
$row = htmlentities_array($row); $actions_links = [
eval("\$accounts.=\"" . getTemplate('ftp/accounts_account') . "\";"); [
$count++; 'href' => $linker->getLink(['section' => 'ftp', 'page' => 'accounts', 'action' => 'add']),
'label' => lng('ftp.account_add')
]
];
} }
$i++; UI::view('user/table.html.twig', [
} 'listing' => Listing::format($collection, $ftp_list_data, 'ftp_list'),
'actions_links' => $actions_links,
eval("echo \"" . getTemplate('ftp/accounts') . "\";"); 'entity_info' => lng('ftp.description')
]);
} elseif ($action == 'delete' && $id != 0) { } elseif ($action == 'delete' && $id != 0) {
$result_stmt = Database::prepare("SELECT `id`, `username`, `homedir`, `up_count`, `up_bytes`, `down_count`, `down_bytes` FROM `" . TABLE_FTP_USERS . "` try {
WHERE `customerid` = :customerid $json_result = Ftps::getLocal($userinfo, [
AND `id` = :id" 'id' => $id
); ])->get();
Database::pexecute($result_stmt, array("customerid" => $userinfo['customerid'], "id" => $id)); } catch (Exception $e) {
$result = $result_stmt->fetch(PDO::FETCH_ASSOC); Response::dynamicError($e->getMessage());
}
$result = json_decode($json_result, true)['data'];
if (isset($result['username']) && $result['username'] != $userinfo['loginname']) { if (isset($result['username']) && $result['username'] != $userinfo['loginname']) {
if (isset($_POST['send']) && $_POST['send'] == 'send') { if (isset($_POST['send']) && $_POST['send'] == 'send') {
$stmt = Database::prepare("UPDATE `" . TABLE_FTP_USERS . "` try {
SET `up_count` = `up_count` + :up_count, Ftps::getLocal($userinfo, $_POST)->delete();
`up_bytes` = `up_bytes` + :up_bytes, } catch (Exception $e) {
`down_count` = `down_count` + :down_count, Response::dynamicError($e->getMessage());
`down_bytes` = `down_bytes` + :down_bytes
WHERE `username` = :username"
);
$params = array(
"up_count" => $result['up_count'],
"up_bytes" => $result['up_bytes'],
"down_count" => $result['down_count'],
"down_bytes" => $result['down_bytes'],
"username" => $userinfo['loginname']
);
Database::pexecute($stmt, $params);
$result_stmt = Database::prepare("SELECT `username`, `homedir` FROM `" . TABLE_FTP_USERS . "`
WHERE `customerid` = :customerid
AND `id` = :id"
);
Database::pexecute($result_stmt, array("customerid" => $userinfo['customerid'], "id" => $id));
$result = $result_stmt->fetch(PDO::FETCH_ASSOC);
$stmt = Database::prepare("DELETE FROM `" . TABLE_FTP_QUOTATALLIES . "` WHERE `name` = :name");
Database::pexecute($stmt, array("name" => $result['username']));
$stmt = Database::prepare("DELETE FROM `" . TABLE_FTP_USERS . "`
WHERE `customerid` = :customerid
AND `id` = :id"
);
Database::pexecute($stmt, array("customerid" => $userinfo['customerid'], "id" => $id));
$stmt = Database::prepare("
UPDATE `" . TABLE_FTP_GROUPS . "` SET
`members` = REPLACE(`members`, :username,'')
WHERE `customerid` = :customerid
");
Database::pexecute($stmt, array("username" => ",".$result['username'], "customerid" => $userinfo['customerid']));
$log->logAction(USR_ACTION, LOG_INFO, "deleted ftp-account '" . $result['username'] . "'");
$resetaccnumber = ($userinfo['ftps_used'] == '1') ? " , `ftp_lastaccountnumber`='0'" : '';
// refs #293
if (isset($_POST['delete_userfiles']) && (int)$_POST['delete_userfiles'] == 1) {
inserttask('8', $userinfo['loginname'], $result['homedir']);
} }
Response::redirectTo($filename, [
$stmt = Database::prepare("UPDATE `" . TABLE_PANEL_CUSTOMERS . "` 'page' => $page
SET `ftps_used` = `ftps_used` - 1 $resetaccnumber ]);
WHERE `customerid` = :customerid"
);
Database::pexecute($stmt, array("customerid" => $userinfo['customerid']));
redirectTo($filename, array('page' => $page, 's' => $s));
} else { } else {
ask_yesno_withcheckbox('ftp_reallydelete', 'admin_customer_alsoremoveftphomedir', $filename, array('id' => $id, 'page' => $page, 'action' => $action), $result['username']); HTML::askYesNoWithCheckbox('ftp_reallydelete', 'admin_customer_alsoremoveftphomedir', $filename, [
'id' => $id,
'page' => $page,
'action' => $action
], $result['username']);
} }
} else { } else {
standard_error('ftp_cantdeletemainaccount'); Response::standardError('ftp_cantdeletemainaccount');
} }
} elseif ($action == 'add') { } elseif ($action == 'add') {
if ($userinfo['ftps_used'] < $userinfo['ftps'] || $userinfo['ftps'] == '-1') { if ($userinfo['ftps_used'] < $userinfo['ftps'] || $userinfo['ftps'] == '-1') {
if (isset($_POST['send']) if (isset($_POST['send']) && $_POST['send'] == 'send') {
&& $_POST['send'] == 'send') {
$description = validate($_POST['ftp_description'], 'description');
// @FIXME use a good path-validating regex here (refs #1231)
$path = validate($_POST['path'], 'path');
$password = validate($_POST['ftp_password'], 'password');
$password = validatePassword($password);
$shell = "/bin/false";
if (Settings::Get('system.allow_customer_shell') == '1') {
$shell = isset($_POST['shell']) ? validate($_POST['shell'], 'shell') : '/bin/false';
}
$sendinfomail = isset($_POST['sendinfomail']) ? 1 : 0;
if ($sendinfomail != 1) {
$sendinfomail = 0;
}
if (Settings::Get('customer.ftpatdomain') == '1') {
$ftpusername = validate($_POST['ftp_username'], 'username', '/^[a-zA-Z0-9][a-zA-Z0-9\-_]+\$?$/');
if ($ftpusername == '') {
standard_error(array('stringisempty', 'username'));
}
$ftpdomain = $idna_convert->encode(validate($_POST['ftp_domain'], 'domain'));
$ftpdomain_check_stmt = Database::prepare("SELECT `id`, `domain`, `customerid` FROM `" . TABLE_PANEL_DOMAINS . "`
WHERE `domain` = :domain
AND `customerid` = :customerid"
);
Database::pexecute($ftpdomain_check_stmt, array("domain" => $ftpdomain, "customerid" => $userinfo['customerid']));
$ftpdomain_check = $ftpdomain_check_stmt->fetch(PDO::FETCH_ASSOC);
if ($ftpdomain_check['domain'] != $ftpdomain) {
standard_error('maindomainnonexist', $domain);
}
$username = $ftpusername . "@" . $ftpdomain;
} else {
$username = $userinfo['loginname'] . Settings::Get('customer.ftpprefix') . (intval($userinfo['ftp_lastaccountnumber']) + 1);
}
$username_check_stmt = Database::prepare("SELECT * FROM `" . TABLE_FTP_USERS . "`
WHERE `username` = :username"
);
Database::pexecute($username_check_stmt, array("username" => $username));
$username_check = $username_check_stmt->fetch(PDO::FETCH_ASSOC);
if (!empty($username_check) && $username_check['username'] = $username) {
standard_error('usernamealreadyexists', $username);
} elseif ($password == '') {
standard_error(array('stringisempty', 'mypassword'));
} elseif ($path == '') {
standard_error('patherror');
} elseif ($username == $password) {
standard_error('passwordshouldnotbeusername');
} else {
$path = makeCorrectDir($userinfo['documentroot'] . '/' . $path);
$cryptPassword = makeCryptPassword($password);
$stmt = Database::prepare("INSERT INTO `" . TABLE_FTP_USERS . "`
(`customerid`, `username`, `description`, `password`, `homedir`, `login_enabled`, `uid`, `gid`, `shell`)
VALUES (:customerid, :username, :description, :password, :homedir, 'y', :guid, :guid, :shell)"
);
$params = array(
"customerid" => $userinfo['customerid'],
"username" => $username,
"description" => $description,
"password" => $cryptPassword,
"homedir" => $path,
"guid" => $userinfo['guid'],
"shell" => $shell
);
Database::pexecute($stmt, $params);
$result_stmt = Database::prepare("SELECT `bytes_in_used` FROM `" . TABLE_FTP_QUOTATALLIES . "`
WHERE `name` = :name"
);
Database::pexecute($result_stmt, array("name" => $userinfo['loginname']));
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
$stmt = Database::prepare("INSERT INTO `" . TABLE_FTP_QUOTATALLIES . "`
(`name`, `quota_type`, `bytes_in_used`, `bytes_out_used`, `bytes_xfer_used`, `files_in_used`, `files_out_used`, `files_xfer_used`)
VALUES (:name, 'user', :bytes_in_used, '0', '0', '0', '0', '0')"
);
Database::pexecute($stmt, array("name" => $username, "bytes_in_used" => $row['bytes_in_used']));
}
$stmt = Database::prepare("UPDATE `" . TABLE_FTP_GROUPS . "`
SET `members` = CONCAT_WS(',',`members`, :username)
WHERE `customerid`= :customerid
AND `gid`= :guid"
);
$params = array(
"username" => $username,
"customerid" => $userinfo['customerid'],
"guid" => $userinfo['guid']
);
Database::pexecute($stmt, $params);
$stmt = Database::prepare("UPDATE `" . TABLE_PANEL_CUSTOMERS . "`
SET `ftps_used` = `ftps_used` + 1,
`ftp_lastaccountnumber` = `ftp_lastaccountnumber` + 1
WHERE `customerid` = :customerid"
);
Database::pexecute($stmt, array("customerid" => $userinfo['customerid']));
$log->logAction(USR_ACTION, LOG_INFO, "added ftp-account '" . $username . " (" . $path . ")'");
inserttask(5);
if ($sendinfomail == 1) {
$replace_arr = array(
'SALUTATION' => getCorrectUserSalutation($userinfo),
'CUST_NAME' => getCorrectUserSalutation($userinfo), // < keep this for compatibility
'USR_NAME' => $username,
'USR_PASS' => $password,
'USR_PATH' => makeCorrectDir(str_replace($userinfo['documentroot'], "/", $path))
);
$def_language = $userinfo['def_language'];
$result_stmt = Database::prepare("SELECT `value` FROM `" . TABLE_PANEL_TEMPLATES . "`
WHERE `adminid` = :adminid
AND `language` = :lang
AND `templategroup`='mails'
AND `varname`='new_ftpaccount_by_customer_subject'"
);
Database::pexecute($result_stmt, array("adminid" => $userinfo['adminid'], "lang" => $def_language));
$result = $result_stmt->fetch(PDO::FETCH_ASSOC);
$mail_subject = html_entity_decode(replace_variables((($result['value'] != '') ? $result['value'] : $lng['mails']['new_ftpaccount_by_customer']['subject']), $replace_arr));
$def_language = $userinfo['def_language'];
$result_stmt = Database::prepare("SELECT `value` FROM `" . TABLE_PANEL_TEMPLATES . "`
WHERE `adminid` = :adminid
AND `language` = :lang
AND `templategroup`='mails'
AND `varname`='new_ftpaccount_by_customer_mailbody'"
);
Database::pexecute($result_stmt, array("adminid" => $userinfo['adminid'], "lang" => $def_language));
$result = $result_stmt->fetch(PDO::FETCH_ASSOC);
$mail_body = html_entity_decode(replace_variables((($result['value'] != '') ? $result['value'] : $lng['mails']['new_ftpaccount_by_customer']['mailbody']), $replace_arr));
$_mailerror = false;
try { try {
$mail->Subject = $mail_subject; Ftps::getLocal($userinfo, $_POST)->add();
$mail->AltBody = $mail_body;
$mail->MsgHTML(str_replace("\n", "<br />", $mail_body));
$mail->AddAddress($userinfo['email'], getCorrectUserSalutation($userinfo));
$mail->Send();
} catch(phpmailerException $e) {
$mailerr_msg = $e->errorMessage();
$_mailerror = true;
} catch (Exception $e) { } catch (Exception $e) {
$mailerr_msg = $e->getMessage(); Response::dynamicError($e->getMessage());
$_mailerror = true;
}
if ($_mailerror) {
$log->logAction(USR_ACTION, LOG_ERR, "Error sending mail: " . $mailerr_msg);
standard_error('errorsendingmail', $userinfo['email']);
}
$mail->ClearAddresses();
}
redirectTo($filename, array('page' => $page, 's' => $s));
} }
Response::redirectTo($filename, [
'page' => $page
]);
} else { } else {
$pathSelect = makePathfield($userinfo['documentroot'], $userinfo['guid'], $userinfo['guid'], '/'); $pathSelect = FileDir::makePathfield($userinfo['documentroot'], $userinfo['guid'], $userinfo['guid'], '/');
if (Settings::Get('customer.ftpatdomain') == '1') { if (Settings::Get('customer.ftpatdomain') == '1') {
$domainlist = array(); $domainlist = [];
$domains = '';
$result_domains_stmt = Database::prepare("SELECT `domain` FROM `" . TABLE_PANEL_DOMAINS . "` $result_domains_stmt = Database::prepare("SELECT `domain` FROM `" . TABLE_PANEL_DOMAINS . "`
WHERE `customerid`= :customerid" WHERE `customerid`= :customerid ORDER BY `domain` ASC");
); Database::pexecute($result_domains_stmt, [
Database::pexecute($result_domains_stmt, array("customerid" => $userinfo['customerid'])); "customerid" => $userinfo['customerid']
]);
while ($row_domain = $result_domains_stmt->fetch(PDO::FETCH_ASSOC)) { while ($row_domain = $result_domains_stmt->fetch(PDO::FETCH_ASSOC)) {
$domainlist[] = $row_domain['domain']; $domainlist[$row_domain['domain']] = $idna_convert->decode($row_domain['domain']);
}
sort($domainlist);
if (isset($domainlist[0]) && $domainlist[0] != '') {
foreach ($domainlist as $dom) {
$domains .= makeoption($idna_convert->decode($dom), $dom);
}
} }
} }
if (Settings::Get('system.allow_customer_shell') == '1') { if (Settings::Get('system.allow_customer_shell') == '1') {
$shells = makeoption("/bin/false", "/bin/false", "/bin/false"); $shells['/bin/false'] = "/bin/false";
$shells_avail = Settings::Get('system.available_shells'); $shells_avail = Settings::Get('system.available_shells');
if (!empty($shells_avail)) { if (!empty($shells_avail)) {
$shells_avail = explode(",", $shells_avail); $shells_avail_arr = explode(",", $shells_avail);
$shells_avail = array_map("trim", $shells_avail); $shells_avail_arr = array_map("trim", $shells_avail_arr);
foreach ($shells_avail as $_shell) { foreach ($shells_avail_arr as $shell) {
$shells .= makeoption($_shell, $_shell, "/bin/false"); $shells[$shell] = $shell;
} }
} }
} }
//$sendinfomail = makeyesno('sendinfomail', '1', '0', '0');
$ftp_add_data = include_once dirname(__FILE__) . '/lib/formfields/customer/ftp/formfield.ftp_add.php'; $ftp_add_data = include_once dirname(__FILE__) . '/lib/formfields/customer/ftp/formfield.ftp_add.php';
$ftp_add_form = htmlform::genHTMLForm($ftp_add_data);
$title = $ftp_add_data['ftp_add']['title']; UI::view('user/form.html.twig', [
$image = $ftp_add_data['ftp_add']['image']; 'formaction' => $linker->getLink(['section' => 'ftp']),
'formdata' => $ftp_add_data['ftp_add']
eval("echo \"" . getTemplate('ftp/accounts_add') . "\";"); ]);
} }
} }
} elseif ($action == 'edit' && $id != 0) { } elseif ($action == 'edit' && $id != 0) {
$result_stmt = Database::prepare("SELECT `id`, `username`, `description`, `homedir`, `uid`, `gid`, `shell` FROM `" . TABLE_FTP_USERS . "` try {
WHERE `customerid` = :customerid $json_result = Ftps::getLocal($userinfo, [
AND `id` = :id" 'id' => $id
); ])->get();
Database::pexecute($result_stmt, array("customerid" => $userinfo['customerid'], "id" => $id)); } catch (Exception $e) {
$result = $result_stmt->fetch(PDO::FETCH_ASSOC); Response::dynamicError($e->getMessage());
}
$result = json_decode($json_result, true)['data'];
if (isset($result['username']) && $result['username'] != '') { if (isset($result['username']) && $result['username'] != '') {
if (isset($_POST['send']) && $_POST['send'] == 'send') { if (isset($_POST['send']) && $_POST['send'] == 'send') {
// @FIXME use a good path-validating regex here (refs #1231) try {
$path = validate($_POST['path'], 'path'); Ftps::getLocal($userinfo, $_POST)->update();
} catch (Exception $e) {
$shell = "/bin/false"; Response::dynamicError($e->getMessage());
if (Settings::Get('system.allow_customer_shell') == '1') {
$shell = isset($_POST['shell']) ? validate($_POST['shell'], 'shell') : '/bin/false';
} }
Response::redirectTo($filename, [
$_setnewpass = false; 'page' => $page
if (isset($_POST['ftp_password']) && $_POST['ftp_password'] != '') { ]);
$password = validate($_POST['ftp_password'], 'password');
$password = validatePassword($password);
$_setnewpass = true;
}
if ($_setnewpass) {
if ($password == '') {
standard_error(array('stringisempty', 'mypassword'));
} elseif ($result['username'] == $password) {
standard_error('passwordshouldnotbeusername');
}
$log->logAction(USR_ACTION, LOG_INFO, "updated ftp-account password for '" . $result['username'] . "'");
$cryptPassword = makeCryptPassword($password);
$stmt = Database::prepare("UPDATE `" . TABLE_FTP_USERS . "`
SET `password` = :password
WHERE `customerid` = :customerid
AND `id` = :id"
);
Database::pexecute($stmt, array("customerid" => $userinfo['customerid'], "id" => $id, "password" => $cryptPassword));
}
if ($path != '') {
$path = makeCorrectDir($userinfo['documentroot'] . '/' . $path);
if ($path != $result['homedir']) {
if (!file_exists($path)) {
// it's the task for "new ftp" but that will
// create all directories and correct their permissions
inserttask(5);
}
$log->logAction(USR_ACTION, LOG_INFO, "updated ftp-account homdir for '" . $result['username'] . "'");
$stmt = Database::prepare("UPDATE `" . TABLE_FTP_USERS . "`
SET `homedir` = :homedir
WHERE `customerid` = :customerid
AND `id` = :id"
);
$params = array(
"homedir" => $path,
"customerid" => $userinfo['customerid'],
"id" => $id
);
Database::pexecute($stmt, $params);
}
}
$log->logAction(USR_ACTION, LOG_INFO, "edited ftp-account '" . $result['username'] . "'");
$description = validate($_POST['ftp_description'], 'description');
$stmt = Database::prepare("UPDATE `" . TABLE_FTP_USERS . "`
SET `description` = :desc, `shell` = :shell
WHERE `customerid` = :customerid
AND `id` = :id"
);
Database::pexecute($stmt, array("desc" => $description, "shell" => $shell, "customerid" => $userinfo['customerid'], "id" => $id));
redirectTo($filename, array('page' => $page, 's' => $s));
} else { } else {
if (strpos($result['homedir'], $userinfo['documentroot']) === 0) { if (strpos($result['homedir'], $userinfo['documentroot']) === 0) {
$homedir = str_replace($userinfo['documentroot'], "/", $result['homedir']); $homedir = str_replace($userinfo['documentroot'], "/", $result['homedir']);
} else { } else {
$homedir = $result['homedir']; $homedir = $result['homedir'];
} }
$homedir = makeCorrectDir($homedir); $homedir = FileDir::makeCorrectDir($homedir);
$pathSelect = makePathfield($userinfo['documentroot'], $userinfo['guid'], $userinfo['guid'], $homedir); $pathSelect = FileDir::makePathfield($userinfo['documentroot'], $userinfo['guid'], $userinfo['guid'], $homedir);
if (Settings::Get('customer.ftpatdomain') == '1') {
$domains = '';
$result_domains_stmt = Database::prepare("SELECT `domain` FROM `" . TABLE_PANEL_DOMAINS . "`
WHERE `customerid` = :customerid"
);
Database::pexecute($result_domains_stmt, array("customerid" => $userinfo['customerid']));
while ($row_domain = $result_domains_stmt->fetch(PDO::FETCH_ASSOC)) {
$domains .= makeoption($idna_convert->decode($row_domain['domain']), $row_domain['domain']);
}
}
if (Settings::Get('system.allow_customer_shell') == '1') { if (Settings::Get('system.allow_customer_shell') == '1') {
$shells = makeoption("/bin/false", "/bin/false", $result['shell']); $shells['/bin/false'] = "/bin/false";
$shells_avail = Settings::Get('system.available_shells'); $shells_avail = Settings::Get('system.available_shells');
if (!empty($shells_avail)) { if (!empty($shells_avail)) {
$shells_avail = explode(",", $shells_avail); $shells_avail_arr = explode(",", $shells_avail);
$shells_avail = array_map("trim", $shells_avail); $shells_avail_arr = array_map("trim", $shells_avail_arr);
foreach ($shells_avail as $_shell) { foreach ($shells_avail_arr as $shell) {
$shells .= makeoption($_shell, $_shell, $result['shell']); $shells[$shell] = $shell;
} }
} }
} }
$ftp_edit_data = include_once dirname(__FILE__) . '/lib/formfields/customer/ftp/formfield.ftp_edit.php'; $ftp_edit_data = include_once dirname(__FILE__) . '/lib/formfields/customer/ftp/formfield.ftp_edit.php';
$ftp_edit_form = htmlform::genHTMLForm($ftp_edit_data);
$title = $ftp_edit_data['ftp_edit']['title']; UI::view('user/form.html.twig', [
$image = $ftp_edit_data['ftp_edit']['image']; 'formaction' => $linker->getLink(['section' => 'ftp', 'id' => $id]),
'formdata' => $ftp_edit_data['ftp_edit'],
eval("echo \"" . getTemplate('ftp/accounts_edit') . "\";"); 'editid' => $id
]);
} }
} }
} }

View File

@@ -2,65 +2,86 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Panel
* *
* 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
*/ */
define('AREA', 'customer'); const AREA = 'customer';
require './lib/init.php'; require __DIR__ . '/lib/init.php';
use Froxlor\Api\Commands\Customers as Customers;
use Froxlor\CurrentUser;
use Froxlor\Database\Database;
use Froxlor\Froxlor;
use Froxlor\FroxlorLogger;
use Froxlor\Settings;
use Froxlor\System\Crypt;
use Froxlor\UI\Panel\UI;
use Froxlor\UI\Response;
use Froxlor\Validate\Validate;
use Froxlor\Language;
use Froxlor\System\Cronjob;
use Froxlor\Cron\TaskId;
if ($action == 'logout') { if ($action == 'logout') {
$log->logAction(USR_ACTION, LOG_NOTICE, 'logged out'); $log->logAction(FroxlorLogger::USR_ACTION, LOG_NOTICE, 'logged out');
$params = array("customerid" => $userinfo['customerid']); unset($_SESSION['userinfo']);
if (Settings::Get('session.allow_multiple_login') == '1') { CurrentUser::setData();
$stmt = Database::prepare("DELETE FROM `" . TABLE_PANEL_SESSIONS . "` session_destroy();
WHERE `userid` = :customerid
AND `adminsession` = '0' Response::redirectTo('index.php');
AND `hash` = :hash" } elseif ($action == 'suback') {
); if (is_array(CurrentUser::getField('switched_user'))) {
$params["hash"] = $s; $result = CurrentUser::getData();
} else { $result = $result['switched_user'];
$stmt = Database::prepare("DELETE FROM `" . TABLE_PANEL_SESSIONS . "` CurrentUser::setData($result);
WHERE `userid` = :customerid $target = (isset($_GET['target']) ? $_GET['target'] : 'index');
AND `adminsession` = '0'" $redirect = "admin_" . $target . ".php";
); if (!file_exists(Froxlor::getInstallDir() . "/" . $redirect)) {
$redirect = "admin_index.php";
}
Response::redirectTo($redirect, null, true);
} else {
Response::dynamicError("Cannot change back - You've never switched to another user :-)");
} }
Database::pexecute($stmt, $params);
redirectTo('index.php');
} }
if ($page == 'overview') { if ($page == 'overview') {
$log->logAction(USR_ACTION, LOG_NOTICE, "viewed customer_index"); $log->logAction(FroxlorLogger::USR_ACTION, LOG_NOTICE, "viewed customer_index");
$domain_stmt = Database::prepare("SELECT `domain` FROM `" . TABLE_PANEL_DOMAINS . "` $domain_stmt = Database::prepare("SELECT `domain` FROM `" . TABLE_PANEL_DOMAINS . "`
WHERE `customerid` = :customerid WHERE `customerid` = :customerid
AND `parentdomainid` = '0' AND `parentdomainid` = '0'
AND `id` <> :standardsubdomain AND `id` <> :standardsubdomain
"); ");
Database::pexecute($domain_stmt, array("customerid" => $userinfo['customerid'], "standardsubdomain" => $userinfo['standardsubdomain'])); Database::pexecute($domain_stmt, [
"customerid" => $userinfo['customerid'],
$domains = ''; "standardsubdomain" => $userinfo['standardsubdomain']
$domainArray = array(); ]);
$domainArray = [];
while ($row = $domain_stmt->fetch(PDO::FETCH_ASSOC)) { while ($row = $domain_stmt->fetch(PDO::FETCH_ASSOC)) {
$domainArray[] = $idna_convert->decode($row['domain']); $domainArray[] = $idna_convert->decode($row['domain']);
} }
natsort($domainArray); natsort($domainArray);
$domains = implode(',<br />', $domainArray);
// standard-subdomain // standard-subdomain
$stdsubdomain = ''; $stdsubdomain = '';
@@ -70,7 +91,10 @@ if ($page == 'overview') {
WHERE `customerid` = :customerid WHERE `customerid` = :customerid
AND `id` = :standardsubdomain AND `id` = :standardsubdomain
"); ");
$std_domain = Database::pexecute_first($std_domain_stmt, array("customerid" => $userinfo['customerid'], "standardsubdomain" => $userinfo['standardsubdomain'])); $std_domain = Database::pexecute_first($std_domain_stmt, [
"customerid" => $userinfo['customerid'],
"standardsubdomain" => $userinfo['standardsubdomain']
]);
$stdsubdomain = $std_domain['domain']; $stdsubdomain = $std_domain['domain'];
} }
@@ -80,242 +104,173 @@ if ($page == 'overview') {
// get disk-space usages for web, mysql and mail // get disk-space usages for web, mysql and mail
$usages_stmt = Database::prepare("SELECT * FROM `" . TABLE_PANEL_DISKSPACE . "` WHERE `customerid` = :cid ORDER BY `stamp` DESC LIMIT 1"); $usages_stmt = Database::prepare("SELECT * FROM `" . TABLE_PANEL_DISKSPACE . "` WHERE `customerid` = :cid ORDER BY `stamp` DESC LIMIT 1");
$usages = Database::pexecute_first($usages_stmt, array('cid' => $userinfo['customerid'])); $usages = Database::pexecute_first($usages_stmt, [
'cid' => $userinfo['customerid']
]);
$userinfo['diskspace'] = round($userinfo['diskspace'] / 1024, Settings::Get('panel.decimal_places')); // get everything in bytes for the percentage calculation on the dashboard
$userinfo['diskspace_used'] = round($usages['webspace'] / 1024, Settings::Get('panel.decimal_places')); $userinfo['diskspace_bytes'] = ($userinfo['diskspace'] > -1) ? $userinfo['diskspace'] * 1024 : -1;
$userinfo['mailspace_used'] = round($usages['mail'] / 1024, Settings::Get('panel.decimal_places')); $userinfo['traffic_bytes'] = ($userinfo['traffic'] > -1) ? $userinfo['traffic'] * 1024 : -1;
$userinfo['dbspace_used'] = round($usages['mysql'] / 1024, Settings::Get('panel.decimal_places')); $userinfo['traffic_bytes_used'] = $userinfo['traffic_used'] * 1024;
$userinfo['traffic'] = round($userinfo['traffic'] / (1024 * 1024), Settings::Get('panel.decimal_places')); if ($usages) {
$userinfo['traffic_used'] = round($userinfo['traffic_used'] / (1024 * 1024), Settings::Get('panel.decimal_places')); $userinfo['diskspace_bytes_used'] = $usages['webspace'] * 1024;
$userinfo = str_replace_array('-1', $lng['customer']['unlimited'], $userinfo, 'diskspace traffic mysqls emails email_accounts email_forwarders email_quota ftps tickets subdomains'); $userinfo['mailspace_used'] = $usages['mail'] * 1024;
$userinfo['dbspace_used'] = $usages['mysql'] * 1024;
$userinfo['custom_notes'] = ($userinfo['custom_notes'] != '') ? nl2br($userinfo['custom_notes']) : ''; $userinfo['total_bytes_used'] = ($usages['webspace'] + $usages['mail'] + $usages['mysql']) * 1024;
} else {
$services_enabled = ""; $userinfo['diskspace_bytes_used'] = 0;
$se = array(); $userinfo['total_bytes_used'] = 0;
if ($userinfo['imap'] == '1') $se[] = "IMAP"; $userinfo['mailspace_used'] = 0;
if ($userinfo['pop3'] == '1') $se[] = "POP3"; $userinfo['dbspace_used'] = 0;
if ($userinfo['phpenabled'] == '1') $se[] = "PHP";
if ($userinfo['perlenabled'] == '1') $se[] = "Perl/CGI";
$services_enabled = implode(", ", $se);
eval("echo \"" . getTemplate('index/index') . "\";");
} elseif ($page == 'change_password') {
if (isset($_POST['send']) && $_POST['send'] == 'send') {
$old_password = validate($_POST['old_password'], 'old password');
if (!validatePasswordLogin($userinfo,$old_password,TABLE_PANEL_CUSTOMERS,'customerid')) {
standard_error('oldpasswordnotcorrect');
} }
$new_password = validatePassword($_POST['new_password'], 'new password'); UI::twig()->addGlobal('userinfo', $userinfo);
$new_password_confirm = validatePassword($_POST['new_password_confirm'], 'new password confirm'); UI::view('user/index.html.twig', [
'domains' => $domainArray,
'stdsubdomain' => $stdsubdomain
]);
} elseif ($page == 'change_password') {
if (isset($_POST['send']) && $_POST['send'] == 'send') {
$old_password = Validate::validate($_POST['old_password'], 'old password');
if (!Crypt::validatePasswordLogin($userinfo, $old_password, TABLE_PANEL_CUSTOMERS, 'customerid')) {
Response::standardError('oldpasswordnotcorrect');
}
try {
$new_password = Crypt::validatePassword($_POST['new_password'], 'new password');
$new_password_confirm = Crypt::validatePassword($_POST['new_password_confirm'], 'new password confirm');
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
if ($old_password == '') { if ($old_password == '') {
standard_error(array('stringisempty', 'oldpassword')); Response::standardError([
'stringisempty',
'changepassword.old_password'
]);
} elseif ($new_password == '') { } elseif ($new_password == '') {
standard_error(array('stringisempty', 'newpassword')); Response::standardError([
'stringisempty',
'changepassword.new_password'
]);
} elseif ($new_password_confirm == '') { } elseif ($new_password_confirm == '') {
standard_error(array('stringisempty', 'newpasswordconfirm')); Response::standardError([
'stringisempty',
'changepassword.new_password_confirm'
]);
} elseif ($new_password != $new_password_confirm) { } elseif ($new_password != $new_password_confirm) {
standard_error('newpasswordconfirmerror'); Response::standardError('newpasswordconfirmerror');
} else { } else {
// Update user password // Update user password
$stmt = Database::prepare("UPDATE `" . TABLE_PANEL_CUSTOMERS . "` try {
SET `password` = :newpassword Customers::getLocal($userinfo, [
WHERE `customerid` = :customerid" 'id' => $userinfo['customerid'],
); 'new_customer_password' => $new_password
$params = array( ])->update();
"newpassword" => makeCryptPassword($new_password), } catch (Exception $e) {
"customerid" => $userinfo['customerid'] Response::dynamicError($e->getMessage());
); }
Database::pexecute($stmt, $params); $log->logAction(FroxlorLogger::USR_ACTION, LOG_NOTICE, 'changed password');
$log->logAction(USR_ACTION, LOG_NOTICE, 'changed password');
// Update ftp password // Update ftp password
if (isset($_POST['change_main_ftp']) && $_POST['change_main_ftp'] == 'true') { if (isset($_POST['change_main_ftp']) && $_POST['change_main_ftp'] == 'true') {
$cryptPassword = makeCryptPassword($new_password); $cryptPassword = Crypt::makeCryptPassword($new_password);
$stmt = Database::prepare("UPDATE `" . TABLE_FTP_USERS . "` $stmt = Database::prepare("UPDATE `" . TABLE_FTP_USERS . "`
SET `password` = :password SET `password` = :password
WHERE `customerid` = :customerid WHERE `customerid` = :customerid
AND `username` = :username" AND `username` = :username");
); $params = [
$params = array(
"password" => $cryptPassword, "password" => $cryptPassword,
"customerid" => $userinfo['customerid'], "customerid" => $userinfo['customerid'],
"username" => $userinfo['loginname'] "username" => $userinfo['loginname']
); ];
Database::pexecute($stmt, $params); Database::pexecute($stmt, $params);
$log->logAction(USR_ACTION, LOG_NOTICE, 'changed main ftp password'); $log->logAction(FroxlorLogger::USR_ACTION, LOG_NOTICE, 'changed main ftp password');
} }
// Update webalizer password // Update statistics password
if (isset($_POST['change_webalizer']) && $_POST['change_webalizer'] == 'true') { if (isset($_POST['change_stats']) && $_POST['change_stats'] == 'true') {
if (CRYPT_STD_DES == 1) { $new_stats_password = Crypt::makeCryptPassword($new_password, true);
$saltfordescrypt = substr(md5(uniqid(microtime(), 1)), 4, 2);
$new_webalizer_password = crypt($new_password, $saltfordescrypt);
} else {
$new_webalizer_password = crypt($new_password);
}
$stmt = Database::prepare("UPDATE `" . TABLE_PANEL_HTPASSWDS . "` $stmt = Database::prepare("UPDATE `" . TABLE_PANEL_HTPASSWDS . "`
SET `password` = :password SET `password` = :password
WHERE `customerid` = :customerid WHERE `customerid` = :customerid
AND `username` = :username" AND `username` = :username");
); $params = [
$params = array( "password" => $new_stats_password,
"password" => $new_webalizer_password,
"customerid" => $userinfo['customerid'], "customerid" => $userinfo['customerid'],
"username" => $userinfo['loginname'] "username" => $userinfo['loginname']
); ];
Database::pexecute($stmt, $params); Database::pexecute($stmt, $params);
Cronjob::inserttask(TaskId::REBUILD_VHOST);
} }
redirectTo($filename, array('s' => $s)); Response::redirectTo($filename);
} }
} else { } else {
eval("echo \"" . getTemplate('index/change_password') . "\";"); UI::view('user/change_password.html.twig');
} }
} elseif ($page == 'change_language') { } elseif ($page == 'change_language') {
$languages = Language::getLanguages();
if (isset($_POST['send']) && $_POST['send'] == 'send') { if (isset($_POST['send']) && $_POST['send'] == 'send') {
$def_language = validate($_POST['def_language'], 'default language'); $def_language = Validate::validate($_POST['def_language'], 'default language');
if (isset($languages[$def_language])) { if (isset($languages[$def_language])) {
$stmt = Database::prepare("UPDATE `" . TABLE_PANEL_CUSTOMERS . "` try {
SET `def_language` = :lang Customers::getLocal($userinfo, [
WHERE `customerid` = :customerid" 'id' => $userinfo['customerid'],
); 'def_language' => $def_language
Database::pexecute($stmt, array("lang" => $def_language, "customerid" => $userinfo['customerid'])); ])->update();
CurrentUser::setField('language', $def_language);
$stmt = Database::prepare("UPDATE `" . TABLE_PANEL_SESSIONS . "` } catch (Exception $e) {
SET `language` = :lang Response::dynamicError($e->getMessage());
WHERE `hash` = :hash"
);
Database::pexecute($stmt, array("lang" => $def_language, "hash" => $s));
$log->logAction(USR_ACTION, LOG_NOTICE, "changed default language to '" . $def_language . "'");
} }
}
redirectTo($filename, array('s' => $s)); $log->logAction(FroxlorLogger::USR_ACTION, LOG_NOTICE, "changed default language to '" . $def_language . "'");
Response::redirectTo($filename);
} else { } else {
$default_lang = Settings::Get('panel.standardlanguage'); $default_lang = Settings::Get('panel.standardlanguage');
if ($userinfo['def_language'] != '') { if ($userinfo['def_language'] != '') {
$default_lang = $userinfo['def_language']; $default_lang = $userinfo['def_language'];
} }
$language_options = ''; UI::view('user/change_language.html.twig', [
while (list($language_file, $language_name) = each($languages)) { 'languages' => $languages,
$language_options .= makeoption($language_name, $language_file, $default_lang, true); 'default_lang' => $default_lang
} ]);
eval("echo \"" . getTemplate('index/change_language') . "\";");
} }
} elseif ($page == 'change_theme') { } elseif ($page == 'change_theme') {
if (isset($_POST['send']) && $_POST['send'] == 'send') { if (isset($_POST['send']) && $_POST['send'] == 'send') {
$theme = validate($_POST['theme'], 'theme'); $theme = Validate::validate($_POST['theme'], 'theme');
try {
Customers::getLocal($userinfo, [
'id' => $userinfo['customerid'],
'theme' => $theme
])->update();
} catch (Exception $e) {
Response::dynamicError($e->getMessage());
}
$stmt = Database::prepare("UPDATE `" . TABLE_PANEL_CUSTOMERS . "` $log->logAction(FroxlorLogger::USR_ACTION, LOG_NOTICE, "changed default theme to '" . $theme . "'");
SET `theme` = :theme Response::redirectTo($filename);
WHERE `customerid` = :customerid"
);
Database::pexecute($stmt, array("theme" => $theme, "customerid" => $userinfo['customerid']));
$stmt = Database::prepare("UPDATE `" . TABLE_PANEL_SESSIONS . "`
SET `theme` = :theme
WHERE `hash` = :hash"
);
Database::pexecute($stmt, array("theme" => $theme, "hash" => $s));
$log->logAction(USR_ACTION, LOG_NOTICE, "changed default theme to '" . $theme . "'");
redirectTo($filename, array('s' => $s));
} else { } else {
$default_theme = Settings::Get('panel.default_theme'); $default_theme = Settings::Get('panel.default_theme');
if ($userinfo['theme'] != '') { if ($userinfo['theme'] != '') {
$default_theme = $userinfo['theme']; $default_theme = $userinfo['theme'];
} }
$theme_options = ''; $themes_avail = UI::getThemes();
$themes_avail = getThemes();
foreach ($themes_avail as $t => $d) {
$theme_options.= makeoption($d, $t, $default_theme, true);
}
eval("echo \"" . getTemplate('index/change_theme') . "\";"); UI::view('user/change_theme.html.twig', [
'themes' => $themes_avail,
'default_theme' => $default_theme
]);
} }
} elseif ($page == 'send_error_report' && Settings::Get('system.allow_error_report_customer') == '1') { } elseif ($page == 'send_error_report' && Settings::Get('system.allow_error_report_customer') == '1') {
require_once __DIR__ . '/error_report.php';
// only show this if we really have an exception to report } elseif ($page == 'apikeys' && Settings::Get('api.enabled') == 1) {
if (isset($_GET['errorid']) && $_GET['errorid'] != '') { require_once __DIR__ . '/api_keys.php';
} elseif ($page == '2fa' && Settings::Get('2fa.enabled') == 1) {
$errid = $_GET['errorid']; require_once __DIR__ . '/2fa.php';
// read error file
$err_dir = makeCorrectDir(FROXLOR_INSTALL_DIR."/logs/");
$err_file = makeCorrectFile($err_dir."/".$errid."_sql-error.log");
if (file_exists($err_file)) {
$error_content = file_get_contents($err_file);
$error = explode("|", $error_content);
$_error = array(
'code' => str_replace("\n", "", substr($error[1], 5)),
'message' => str_replace("\n", "", substr($error[2], 4)),
'file' => str_replace("\n", "", substr($error[3], 5 + strlen(FROXLOR_INSTALL_DIR))),
'line' => str_replace("\n", "", substr($error[4], 5)),
'trace' => str_replace(FROXLOR_INSTALL_DIR, "", substr($error[5], 6))
);
// build mail-content
$mail_body = "Dear froxlor-team,\n\n";
$mail_body .= "the following error has been reported by a user:\n\n";
$mail_body .= "-------------------------------------------------------------\n";
$mail_body .= $_error['code'].' '.$_error['message']."\n\n";
$mail_body .= "File: ".$_error['file'].':'.$_error['line']."\n\n";
$mail_body .= "Trace:\n".trim($_error['trace'])."\n\n";
$mail_body .= "-------------------------------------------------------------\n\n";
$mail_body .= "Froxlor-version: ".$version."\n";
$mail_body .= "DB-version: ".$dbversion."\n\n";
$mail_body .= "End of report";
$mail_html = str_replace("\n", "<br />", $mail_body);
// send actual report to dev-team
if (isset($_POST['send'])
&& $_POST['send'] == 'send'
) {
// send mail and say thanks
$_mailerror = false;
try {
$mail->Subject = '[Froxlor] Error report by user';
$mail->AltBody = $mail_body;
$mail->MsgHTML($mail_html);
$mail->AddAddress('error-reports@froxlor.org', 'Froxlor Developer Team');
$mail->Send();
} catch(phpmailerException $e) {
$mailerr_msg = $e->errorMessage();
$_mailerror = true;
} catch (Exception $e) {
$mailerr_msg = $e->getMessage();
$_mailerror = true;
}
if ($_mailerror) {
// error when reporting an error...LOLFUQ
standard_error('send_report_error', $mailerr_msg);
}
// finally remove error from fs
@unlink($err_file);
redirectTo($filename, array('s' => $s));
}
// show a nice summary of the error-report
// before actually sending anything
eval("echo \"" . getTemplate("index/send_error_report") . "\";");
} else {
redirectTo($filename, array('s' => $s));
}
} else {
redirectTo($filename, array('s' => $s));
}
} }

View File

@@ -2,121 +2,53 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Panel
* *
* 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
*/ */
define('AREA', 'customer'); const AREA = 'customer';
require './lib/init.php'; require __DIR__ . '/lib/init.php';
use Froxlor\Api\Commands\SysLog;
use Froxlor\Settings;
use Froxlor\UI\Collection;
use Froxlor\UI\Listing;
use Froxlor\UI\Panel\UI;
use Froxlor\UI\Response;
// redirect if this customer page is hidden via settings // redirect if this customer page is hidden via settings
if (Settings::IsInList('panel.customer_hide_options', 'extras.logger')) { if (Settings::IsInList('panel.customer_hide_options', 'extras.logger')) {
redirectTo('customer_index.php'); Response::redirectTo('customer_index.php');
} }
if ($page == 'log' if ($page == 'log') {
) {
if ($action == '') { if ($action == '') {
$fields = array( try {
'date' => $lng['logger']['date'], $syslog_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/tablelisting.syslog.php';
'type' => $lng['logger']['type'], $collection = (new Collection(SysLog::class, $userinfo))
'user' => $lng['logger']['user'], ->withPagination($syslog_list_data['syslog_list']['columns'], $syslog_list_data['syslog_list']['default_sorting']);
'text' => $lng['logger']['action'] } catch (Exception $e) {
); Response::dynamicError($e->getMessage());
$paging = new paging($userinfo, TABLE_PANEL_LOG, $fields, null, null, 0, 'desc');
$result_stmt = Database::prepare('
SELECT * FROM `' . TABLE_PANEL_LOG . '` WHERE `user` = :loginname ' . $paging->getSqlWhere(true) . ' ' . $paging->getSqlOrderBy() . ' ' . $paging->getSqlLimit()
);
Database::pexecute($result_stmt, array("loginname" => $userinfo['loginname']));
$logs_count = Database::num_rows();
$paging->setEntries($logs_count);
$sortcode = $paging->getHtmlSortCode($lng);
$arrowcode = $paging->getHtmlArrowCode($filename . '?page=' . $page . '&s=' . $s);
$searchcode = $paging->getHtmlSearchCode($lng);
$pagingcode = $paging->getHtmlPagingCode($filename . '?page=' . $page . '&s=' . $s);
$clog = array();
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
if (!isset($clog[$row['action']])
|| !is_array($clog[$row['action']])
) {
$clog[$row['action']] = array();
} }
$clog[$row['action']][$row['logid']] = $row; UI::view('user/table.html.twig', [
} 'listing' => Listing::format($collection, $syslog_list_data, 'syslog_list')
]);
if ($paging->sortfield == 'date'
&& $paging->sortorder == 'desc'
) {
krsort($clog);
} else {
ksort($clog);
}
$i = 0;
$count = 0;
$log_count = 0;
$log = '';
foreach ($clog as $action => $logrows) {
$_action = 0;
foreach ($logrows as $row) {
if ($paging->checkDisplay($i)) {
$row = htmlentities_array($row);
$row['date'] = date("d.m.y H:i:s", $row['date']);
if ($_action != $action) {
switch ($action) {
case USR_ACTION:
$_action = $lng['admin']['customer'];
break;
case RES_ACTION:
$_action = $lng['logger']['reseller'];
break;
case ADM_ACTION:
$_action = $lng['logger']['admin'];
break;
case CRON_ACTION:
$_action = $lng['logger']['cron'];
break;
case LOGIN_ACTION:
$_action = $lng['logger']['login'];
break;
case LOG_ERROR:
$_action = $lng['logger']['intern'];
break;
default:
$_action = $lng['logger']['unknown'];
break;
}
$row['action'] = $_action;
eval("\$log.=\"" . getTemplate('logger/logger_action') . "\";");
}
$log_count++;
$row['type'] = getLogLevelDesc($row['type']);
eval("\$log.=\"" . getTemplate('logger/logger_log') . "\";");
$count++;
$_action = $action;
}
$i++;
}
$i++;
}
eval("echo \"" . getTemplate('logger/logger') . "\";");
} }
} }

View File

@@ -2,27 +2,46 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Panel
* *
* 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
*/ */
define('AREA', 'customer'); const AREA = 'customer';
require './lib/init.php'; require __DIR__ . '/lib/init.php';
// redirect if this customer page is hidden via settings use Froxlor\Api\Commands\Mysqls;
if (Settings::IsInList('panel.customer_hide_options','mysql')) { use Froxlor\Api\Commands\MysqlServer;
redirectTo('customer_index.php'); use Froxlor\Database\Database;
use Froxlor\FroxlorLogger;
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;
use Froxlor\CurrentUser;
// redirect if this customer page is hidden via settings or no resources given
if (Settings::IsInList('panel.customer_hide_options', 'mysql') || $userinfo['mysqls'] == 0) {
Response::redirectTo('customer_index.php');
} }
// get sql-root access data // get sql-root access data
@@ -31,78 +50,49 @@ Database::needSqlData();
$sql_root = Database::getSqlData(); $sql_root = Database::getSqlData();
Database::needRoot(false); Database::needRoot(false);
if (isset($_POST['id'])) { $id = (int)Request::any('id');
$id = intval($_POST['id']);
} elseif (isset($_GET['id'])) {
$id = intval($_GET['id']);
}
if ($page == 'overview') { if ($page == 'overview' || $page == 'mysqls') {
$log->logAction(USR_ACTION, LOG_NOTICE, "viewed customer_mysql");
Database::needSqlData();
$sql = Database::getSqlData();
$lng['mysql']['description'] = str_replace('<SQL_HOST>', $sql['host'], $lng['mysql']['description']);
eval("echo \"" . getTemplate('mysql/mysql') . "\";");
} elseif ($page == 'mysqls') {
if ($action == '') { if ($action == '') {
$log->logAction(USR_ACTION, LOG_NOTICE, "viewed customer_mysql::mysqls"); $log->logAction(FroxlorLogger::USR_ACTION, LOG_NOTICE, "viewed customer_mysql::mysqls");
$fields = array(
'databasename' => $lng['mysql']['databasename'],
'description' => $lng['mysql']['databasedescription']
);
$paging = new paging($userinfo, TABLE_PANEL_DATABASES, $fields);
$result_stmt = Database::prepare("SELECT * FROM `" . TABLE_PANEL_DATABASES . "`
WHERE `customerid`= :customerid " . $paging->getSqlWhere(true) . " " . $paging->getSqlOrderBy() . " " . $paging->getSqlLimit()
);
Database::pexecute($result_stmt, array("customerid" => $userinfo['customerid']));
$mysqls_count = Database::num_rows();
$paging->setEntries($mysqls_count);
$sortcode = $paging->getHtmlSortCode($lng); $multiple_mysqlservers = count(json_decode($userinfo['allowed_mysqlserver'] ?? '[]', true)) > 1;
$arrowcode = $paging->getHtmlArrowCode($filename . '?page=' . $page . '&s=' . $s);
$searchcode = $paging->getHtmlSearchCode($lng);
$pagingcode = $paging->getHtmlPagingCode($filename . '?page=' . $page . '&s=' . $s);
$i = 0;
$count = 0;
$mysqls = '';
$dbservers_stmt = Database::query("SELECT COUNT(DISTINCT `dbserver`) as numservers FROM `".TABLE_PANEL_DATABASES."`"); try {
$dbserver = $dbservers_stmt->fetch(PDO::FETCH_ASSOC); $mysql_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/customer/tablelisting.mysqls.php';
$count_mysqlservers = $dbserver['numservers']; $collection = (new Collection(Mysqls::class, $userinfo))
->withPagination($mysql_list_data['mysql_list']['columns'], $mysql_list_data['mysql_list']['default_sorting']);
// Begin root-session } catch (Exception $e) {
Database::needRoot(true); Response::dynamicError($e->getMessage());
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
if ($paging->checkDisplay($i)) {
$row = htmlentities_array($row);
$mbdata_stmt = Database::prepare("SELECT SUM(data_length + index_length) as MB FROM information_schema.TABLES
WHERE table_schema = :table_schema
GROUP BY table_schema"
);
Database::pexecute($mbdata_stmt, array("table_schema" => $row['databasename']));
$mbdata = $mbdata_stmt->fetch(PDO::FETCH_ASSOC);
$row['size'] = size_readable($mbdata['MB'], 'GiB', 'bi', '%01.' . (int)Settings::Get('panel.decimal_places') . 'f %s');
eval("\$mysqls.=\"" . getTemplate('mysql/mysqls_database') . "\";");
$count++;
} }
$i++;
$actions_links = false;
if (CurrentUser::canAddResource('mysqls')) {
$actions_links = [
[
'href' => $linker->getLink(['section' => 'mysql', 'page' => 'mysqls', 'action' => 'add']),
'label' => lng('mysql.database_create')
]
];
} }
Database::needRoot(false);
// End root-session
eval("echo \"" . getTemplate('mysql/mysqls') . "\";");
UI::view('user/table.html.twig', [
'listing' => Listing::format($collection, $mysql_list_data, 'mysql_list'),
'actions_links' => $actions_links,
'entity_info' => lng('mysql.description')
]);
} elseif ($action == 'delete' && $id != 0) { } elseif ($action == 'delete' && $id != 0) {
$result_stmt = Database::prepare('SELECT `id`, `databasename`, `description`, `dbserver` FROM `' . TABLE_PANEL_DATABASES . '` try {
WHERE `customerid`="' . (int)$userinfo['customerid'] . '" $json_result = Mysqls::getLocal($userinfo, [
AND `id`="' . (int)$id . '"' 'id' => $id
); ])->get();
Database::pexecute($result_stmt, array("customerid" => $userinfo['customerid'])); } catch (Exception $e) {
$result = $result_stmt->fetch(PDO::FETCH_ASSOC); Response::dynamicError($e->getMessage());
}
$result = json_decode($json_result, true)['data'];
if (isset($result['databasename']) && $result['databasename'] != '') { if (isset($result['databasename']) && $result['databasename'] != '') {
Database::needRoot(true, $result['dbserver'], false);
Database::needRoot(true, $result['dbserver']);
Database::needSqlData(); Database::needSqlData();
$sql_root = Database::getSqlData(); $sql_root = Database::getSqlData();
Database::needRoot(false); Database::needRoot(false);
@@ -112,261 +102,96 @@ if ($page == 'overview') {
} }
if (isset($_POST['send']) && $_POST['send'] == 'send') { if (isset($_POST['send']) && $_POST['send'] == 'send') {
// Begin root-session try {
Database::needRoot(true, $result['dbserver']); Mysqls::getLocal($userinfo, $_POST)->delete();
$dbm = new DbManager($log); } catch (Exception $e) {
$dbm->getManager()->deleteDatabase($result['databasename']); Response::dynamicError($e->getMessage());
$log->logAction(USR_ACTION, LOG_INFO, "deleted database '" . $result['databasename'] . "'"); }
Database::needRoot(false); Response::redirectTo($filename, [
// End root-session 'page' => $page
]);
$stmt = Database::prepare("DELETE FROM `" . TABLE_PANEL_DATABASES . "`
WHERE `customerid` = :customerid
AND `id` = :id"
);
Database::pexecute($stmt, array("customerid" => $userinfo['customerid'], "id" => $id));
$resetaccnumber = ($userinfo['mysqls_used'] == '1') ? " , `mysql_lastaccountnumber` = '0' " : '';
$stmt = Database::prepare("UPDATE `" . TABLE_PANEL_CUSTOMERS . "`
SET `mysqls_used` = `mysqls_used` - 1 " . $resetaccnumber . "
WHERE `customerid` = :customerid"
);
Database::pexecute($stmt, array("customerid" => $userinfo['customerid']));
redirectTo($filename, array('page' => $page, 's' => $s));
} else { } else {
$dbnamedesc = $result['databasename']; $dbnamedesc = $result['databasename'];
if (isset($result['description']) && $result['description'] != '') { if (isset($result['description']) && $result['description'] != '') {
$dbnamedesc .= ' (' . $result['description'] . ')'; $dbnamedesc .= ' (' . $result['description'] . ')';
} }
ask_yesno('mysql_reallydelete', $filename, array('id' => $id, 'page' => $page, 'action' => $action), $dbnamedesc); HTML::askYesNo('mysql_reallydelete', $filename, [
'id' => $id,
'page' => $page,
'action' => $action
], $dbnamedesc);
} }
} }
} elseif ($action == 'add') { } elseif ($action == 'add') {
if ($userinfo['mysqls_used'] < $userinfo['mysqls'] || $userinfo['mysqls'] == '-1') { if ($userinfo['mysqls_used'] < $userinfo['mysqls'] || $userinfo['mysqls'] == '-1') {
if (isset($_POST['send']) && $_POST['send'] == 'send') { if (isset($_POST['send']) && $_POST['send'] == 'send') {
$password = validate($_POST['mysql_password'], 'password');
$password = validatePassword($password);
$sendinfomail = isset($_POST['sendinfomail']) ? 1 : 0;
if ($sendinfomail != 1) {
$sendinfomail = 0;
}
if ($password == '') {
standard_error(array('stringisempty', 'mypassword'));
} else {
$dbserver = 0;
$dbservers_stmt = Database::query("SELECT COUNT(DISTINCT `dbserver`) as numservers FROM `".TABLE_PANEL_DATABASES."`");
$_dbserver = $dbservers_stmt->fetch(PDO::FETCH_ASSOC);
$count_mysqlservers = $_dbserver['numservers'];
if ($count_mysqlservers > 1) {
$dbserver = validate($_POST['mysql_server'], html_entity_decode($lng['mysql']['mysql_server']), '', '', 0);
Database::needRoot(true, $dbserver);
Database::needSqlData();
$sql_root = Database::getSqlData();
Database::needRoot(false);
if (!isset($sql_root) || !is_array($sql_root)) {
$dbserver = 0;
}
}
// validate description before actual adding the database, #1052
$databasedescription = validate(trim($_POST['description']), 'description');
// create database, user, set permissions, etc.pp.
$dbm = new DbManager($log);
$username = $dbm->createDatabase(
$userinfo['loginname'],
$password,
$userinfo['mysql_lastaccountnumber']
);
// we've checked against the password in dbm->createDatabase
if ($username == false) {
standard_error('passwordshouldnotbeusername');
}
// Statement modified for Database description -- PH 2004-11-29
$stmt = Database::prepare('INSERT INTO `' . TABLE_PANEL_DATABASES . '`
(`customerid`, `databasename`, `description`, `dbserver`)
VALUES (:customerid, :databasename, :description, :dbserver)'
);
$params = array(
"customerid" => $userinfo['customerid'],
"databasename" => $username,
"description" => $databasedescription,
"dbserver" => $dbserver
);
Database::pexecute($stmt, $params);
$stmt = Database::prepare('UPDATE `' . TABLE_PANEL_CUSTOMERS . '`
SET `mysqls_used` = `mysqls_used` + 1, `mysql_lastaccountnumber` = `mysql_lastaccountnumber` + 1
WHERE `customerid` = :customerid'
);
Database::pexecute($stmt, array("customerid" => $userinfo['customerid']));
if ($sendinfomail == 1) {
$pma = $lng['admin']['notgiven'];
if (Settings::Get('panel.phpmyadmin_url') != '') {
$pma = Settings::Get('panel.phpmyadmin_url');
}
Database::needRoot(true, $dbserver);
Database::needSqlData();
$sql_root = Database::getSqlData();
Database::needRoot(false);
$replace_arr = array(
'SALUTATION' => getCorrectUserSalutation($userinfo),
'CUST_NAME' => getCorrectUserSalutation($userinfo), // < keep this for compatibility
'DB_NAME' => $username,
'DB_PASS' => $password,
'DB_DESC' => $databasedescription,
'DB_SRV' => $sql_root['host'],
'PMA_URI' => $pma
);
$def_language = $userinfo['def_language'];
$result_stmt = Database::prepare("SELECT `value` FROM `" . TABLE_PANEL_TEMPLATES . "`
WHERE `adminid` = :adminid
AND `language` = :lang
AND `templategroup`='mails'
AND `varname`='new_database_by_customer_subject'"
);
Database::pexecute($result_stmt, array("adminid" => $userinfo['adminid'], "lang" => $def_language));
$result = $result_stmt->fetch(PDO::FETCH_ASSOC);
$mail_subject = html_entity_decode(replace_variables((($result['value'] != '') ? $result['value'] : $lng['mails']['new_database_by_customer']['subject']), $replace_arr));
$result_stmt = Database::prepare("SELECT `value` FROM `" . TABLE_PANEL_TEMPLATES . "`
WHERE `adminid`= :adminid
AND `language`= :lang
AND `templategroup` = 'mails'
AND `varname` = 'new_database_by_customer_mailbody'"
);
Database::pexecute($result_stmt, array("adminid" => $userinfo['adminid'], "lang" => $def_language));
$result = $result_stmt->fetch(PDO::FETCH_ASSOC);
$mail_body = html_entity_decode(replace_variables((($result['value'] != '') ? $result['value'] : $lng['mails']['new_database_by_customer']['mailbody']), $replace_arr));
$_mailerror = false;
try { try {
$mail->Subject = $mail_subject; Mysqls::getLocal($userinfo, $_POST)->add();
$mail->AltBody = $mail_body;
$mail->MsgHTML(str_replace("\n", "<br />", $mail_body));
$mail->AddAddress($userinfo['email'], getCorrectUserSalutation($userinfo));
$mail->Send();
} catch(phpmailerException $e) {
$mailerr_msg = $e->errorMessage();
$_mailerror = true;
} catch (Exception $e) { } catch (Exception $e) {
$mailerr_msg = $e->getMessage(); Response::dynamicError($e->getMessage());
$_mailerror = true;
}
if ($_mailerror) {
$log->logAction(USR_ACTION, LOG_ERR, "Error sending mail: " . $mailerr_msg);
standard_error('errorsendingmail', $userinfo['email']);
}
$mail->ClearAddresses();
}
redirectTo($filename, array('page' => $page, 's' => $s));
} }
Response::redirectTo($filename, [
'page' => $page
]);
} else { } else {
$mysql_servers = [];
$dbservers_stmt = Database::query("SELECT DISTINCT `dbserver` FROM `".TABLE_PANEL_DATABASES."`"); try {
$mysql_servers = ''; $result_json = MysqlServer::getLocal($userinfo)->listing();
$count_mysqlservers = 0; $result_decoded = json_decode($result_json, true)['data']['list'];
while ($dbserver = $dbservers_stmt->fetch(PDO::FETCH_ASSOC)) { foreach ($result_decoded as $dbserver => $dbdata) {
Database::needRoot(true, $dbserver['dbserver']); $mysql_servers[$dbserver] = $dbdata['caption'];
Database::needSqlData(); }
$sql_root = Database::getSqlData(); } catch (Exception $e) {
$mysql_servers .= makeoption($sql_root['caption'], $dbserver['dbserver']); /* just none */
$count_mysqlservers++;
} }
Database::needRoot(false);
$mysql_add_data = include_once dirname(__FILE__) . '/lib/formfields/customer/mysql/formfield.mysql_add.php'; $mysql_add_data = include_once dirname(__FILE__) . '/lib/formfields/customer/mysql/formfield.mysql_add.php';
$mysql_add_form = htmlform::genHTMLForm($mysql_add_data);
$title = $mysql_add_data['mysql_add']['title']; UI::view('user/form.html.twig', [
$image = $mysql_add_data['mysql_add']['image']; 'formaction' => $linker->getLink(['section' => 'mysql']),
'formdata' => $mysql_add_data['mysql_add']
eval("echo \"" . getTemplate('mysql/mysqls_add') . "\";"); ]);
} }
} }
} elseif ($action == 'edit' && $id != 0) { } elseif ($action == 'edit' && $id != 0) {
$result_stmt = Database::prepare("SELECT `id`, `databasename`, `description`, `dbserver` FROM `" . TABLE_PANEL_DATABASES . "` try {
WHERE `customerid` = :customerid $json_result = Mysqls::getLocal($userinfo, [
AND `id` = :id" 'id' => $id
); ])->get();
Database::pexecute($result_stmt, array("customerid" => $userinfo['customerid'], "id" => $id)); } catch (Exception $e) {
$result = $result_stmt->fetch(PDO::FETCH_ASSOC); Response::dynamicError($e->getMessage());
}
$result = json_decode($json_result, true)['data'];
if (isset($result['databasename']) && $result['databasename'] != '') { if (isset($result['databasename']) && $result['databasename'] != '') {
if (!isset($sql_root[$result['dbserver']]) || !is_array($sql_root[$result['dbserver']])) {
$result['dbserver'] = 0;
}
if (isset($_POST['send']) && $_POST['send'] == 'send') { if (isset($_POST['send']) && $_POST['send'] == 'send') {
// Only change Password if it is set, do nothing if it is empty! -- PH 2004-11-29 try {
$password = validate($_POST['mysql_password'], 'password'); $json_result = Mysqls::getLocal($userinfo, $_POST)->update();
if ($password != '') { } catch (Exception $e) {
// validate password Response::dynamicError($e->getMessage());
$password = validatePassword($password);
if ($password == $result['databasename']) {
standard_error('passwordshouldnotbeusername');
} }
Response::redirectTo($filename, [
// Begin root-session 'page' => $page
Database::needRoot(true); ]);
foreach (array_map('trim', explode(',', Settings::Get('system.mysql_access_host'))) as $mysql_access_host) {
$stmt = Database::prepare("SET PASSWORD FOR :dbname@:host = PASSWORD(:password)");
$params = array(
"dbname" => $result['databasename'],
"host" => $mysql_access_host,
"password" => $password
);
Database::pexecute($stmt, $params);
}
$stmt = Database::prepare("FLUSH PRIVILEGES");
Database::pexecute($stmt);
Database::needRoot(false);
// End root-session
}
// Update the Database description -- PH 2004-11-29
$log->logAction(USR_ACTION, LOG_INFO, "edited database '" . $result['databasename'] . "'");
$databasedescription = validate($_POST['description'], 'description');
$stmt = Database::prepare("UPDATE `" . TABLE_PANEL_DATABASES . "`
SET `description` = :desc
WHERE `customerid` = :customerid
AND `id` = :id"
);
Database::pexecute($stmt, array("desc" => $databasedescription, "customerid" => $userinfo['customerid'], "id" => $id));
redirectTo($filename, array('page' => $page, 's' => $s));
} else { } else {
$mysql_servers = [];
$dbservers_stmt = Database::query("SELECT COUNT(DISTINCT `dbserver`) as numservers FROM `".TABLE_PANEL_DATABASES."`"); try {
$dbserver = $dbservers_stmt->fetch(PDO::FETCH_ASSOC); $result_json = MysqlServer::getLocal($userinfo)->listing();
$count_mysqlservers = $dbserver['numservers']; $result_decoded = json_decode($result_json, true)['data']['list'];
foreach ($result_decoded as $dbserver => $dbdata) {
Database::needRoot(true, $result['dbserver']); $mysql_servers[$dbserver] = $dbdata['caption'] . ' (' . $dbdata['host'] . (isset($dbdata['port']) && !empty($dbdata['port']) ? ':' . $dbdata['port'] : '').')';
Database::needSqlData(); }
$sql_root = Database::getSqlData(); } catch (Exception $e) {
Database::needRoot(false); /* just none */
}
$mysql_edit_data = include_once dirname(__FILE__) . '/lib/formfields/customer/mysql/formfield.mysql_edit.php'; $mysql_edit_data = include_once dirname(__FILE__) . '/lib/formfields/customer/mysql/formfield.mysql_edit.php';
$mysql_edit_form = htmlform::genHTMLForm($mysql_edit_data);
$title = $mysql_edit_data['mysql_edit']['title']; UI::view('user/form.html.twig', [
$image = $mysql_edit_data['mysql_edit']['image']; 'formaction' => $linker->getLink(['section' => 'mysql', 'id' => $id]),
'formdata' => $mysql_edit_data['mysql_edit'],
eval("echo \"" . getTemplate('mysql/mysqls_edit') . "\";"); 'editid' => $id
]);
} }
} }
} }

View File

@@ -1,392 +0,0 @@
<?php
/**
* This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors).
*
* For the full copyright and license information, please view the COPYING
* file that was distributed with this source code. You can also view the
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt
*
* @copyright (c) the authors
* @author Florian Lippert <flo@syscp.org> (2003-2009)
* @author Froxlor team <team@froxlor.org> (2010-)
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt
* @package Panel
*
*/
define('AREA', 'customer');
require './lib/init.php';
// redirect if this customer page is hidden via settings
if (Settings::IsInList('panel.customer_hide_options','domains')) {
redirectTo('customer_index.php');
}
if (isset($_POST['id'])) {
$id = intval($_POST['id']);
//Check if the current user is allowed to see the current ticket.
$stmt = Database::prepare("SELECT `id` FROM `panel_tickets` WHERE `id` = :id AND `customerid` = :customerid");
$result = Database::pexecute_first($stmt, array("id" => $id, "customerid" => $userinfo['customerid']));
if ($result == null) {
// no rights to see the requested ticket
standard_error(array('ticketnotaccessible'));
}
} elseif (isset($_GET['id'])) {
$id = intval($_GET['id']);
}
if ($page == 'overview') {
$log->logAction(USR_ACTION, LOG_NOTICE, "viewed customer_tickets");
eval("echo \"" . getTemplate("tickets/ticket") . "\";");
} elseif ($page == 'tickets') {
if ($action == '') {
$log->logAction(USR_ACTION, LOG_NOTICE, "viewed customer_tickets::tickets");
$fields = array(
'status' => $lng['ticket']['status'],
'lastchange' => $lng['ticket']['lastchange'],
'subject' => $lng['ticket']['subject'],
'lastreplier' => $lng['ticket']['lastreplier']
);
$paging = new paging($userinfo, TABLE_PANEL_TICKETS, $fields);
$stmt = Database::prepare('SELECT `main`.`id`, (SELECT COUNT(`sub`.`id`) FROM `' . TABLE_PANEL_TICKETS . '` `sub`
WHERE `sub`.`answerto` = `main`.`id`) AS `ticket_answers`, `main`.`lastchange`, `main`.`subject`, `main`.`status`, `main`.`lastreplier`, `main`.`priority`
FROM `' . TABLE_PANEL_TICKETS . '` as `main`
WHERE `main`.`answerto` = "0"
AND `archived` = "0"
AND `customerid`= :customerid ' . $paging->getSqlWhere(true) . " " . $paging->getSqlOrderBy() . " " . $paging->getSqlLimit()
);
Database::pexecute($stmt, array("customerid" => $userinfo['customerid']));
$paging->setEntries(Database::num_rows());
$sortcode = $paging->getHtmlSortCode($lng);
$arrowcode = $paging->getHtmlArrowCode($filename . '?page=' . $page . '&s=' . $s);
$searchcode = $paging->getHtmlSearchCode($lng);
$pagingcode = $paging->getHtmlPagingCode($filename . '?page=' . $page . '&s=' . $s);
$i = 0;
$count = 0;
$tickets = '';
$tickets_count = 0;
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
if ($paging->checkDisplay($i)) {
$tickets_count++;
$row = htmlentities_array($row);
$row['lastchange'] = date("d.m.y H:i", $row['lastchange']);
if ($row['status'] >= 0 && $row['status'] <= 2) {
$reopen = 0;
} else {
$reopen = 1;
}
$row['status'] = ticket::getStatusText($lng, $row['status']);
$row['priority'] = ticket::getPriorityText($lng, $row['priority']);
if ($row['lastreplier'] == '1') {
$row['lastreplier'] = $lng['ticket']['staff'];
$cananswer = 1;
} else {
$row['lastreplier'] = $lng['ticket']['customer'];
$cananswer = 0;
}
$row['subject'] = html_entity_decode($row['subject']);
if (strlen($row['subject']) > 30) {
$ts = wordwrap($row['subject'], 30, "|");
$ts = explode("|", $ts);
$row['subject'] = $ts[0]. '...';
}
eval("\$tickets.=\"" . getTemplate("tickets/tickets_tickets") . "\";");
$count++;
}
$i++;
}
$supportavailable = 0;
$time = date("Hi", time());
$day = date("w", time());
$start = substr(Settings::Get('ticket.worktime_begin'), 0, 2) . substr(Settings::Get('ticket.worktime_begin'), 3, 2);
$end = substr(Settings::Get('ticket.worktime_end'), 0, 2) . substr(Settings::Get('ticket.worktime_end'), 3, 2);
if ($time >= $start && $time <= $end) {
$supportavailable = 1;
}
if (Settings::Get('ticket.worktime_sat') == "0" && $day == "6") {
$supportavailable = 0;
}
if (Settings::Get('ticket.worktime_sun') == "0" && $day == "0") {
$supportavailable = 0;
}
if (Settings::Get('ticket.worktime_all') == "1") {
$supportavailable = 1;
}
$ticketsopen = 0;
$stmt = Database::prepare('SELECT COUNT(`id`) as `count` FROM `' . TABLE_PANEL_TICKETS . '`
WHERE `customerid` = :customerid
AND `answerto` = "0"
AND (`status` = "0" OR `status` = "1" OR `status` = "2")'
);
$opentickets = Database::pexecute_first($stmt, array("customerid" => $userinfo['customerid']));
if (Settings::Get('ticket.concurrently_open') != - 1 && Settings::Get('ticket.concurrently_open') != '') {
$notmorethanxopentickets = strtr($lng['ticket']['notmorethanxopentickets'], array('%s' => Settings::Get('ticket.concurrently_open')));
} else {
$notmorethanxopentickets = '';
}
$ticketsopen = (int)$opentickets['count'];
eval("echo \"" . getTemplate("tickets/tickets") . "\";");
} elseif ($action == 'new') {
if ($userinfo['tickets_used'] < $userinfo['tickets'] || $userinfo['tickets'] == '-1') {
if (isset($_POST['send']) && $_POST['send'] == 'send') {
$newticket = ticket::getInstanceOf($userinfo, -1);
$newticket->Set('subject', validate($_POST['subject'], 'subject'), true, false);
$newticket->Set('priority', validate($_POST['priority'], 'priority'), true, false);
$newticket->Set('category', validate($_POST['category'], 'category'), true, false);
$newticket->Set('customer', (int)$userinfo['customerid'], true, false);
$newticket->Set('admin', (int)$userinfo['adminid'], true, false);
$newticket->Set('message', validate(str_replace("\r\n", "\n", $_POST['message']), 'message', '/^[^\0]*$/'), true, false);
if ($newticket->Get('subject') == null) {
standard_error(array('stringisempty', 'mysubject'));
} elseif ($newticket->Get('message') == null) {
standard_error(array('stringisempty', 'mymessage'));
} else {
$now = time();
$newticket->Set('dt', $now, true, true);
$newticket->Set('lastchange', $now, true, true);
$newticket->Set('ip', $_SERVER['REMOTE_ADDR'], true, true);
$newticket->Set('status', '0', true, true);
$newticket->Set('lastreplier', '0', true, true);
$newticket->Set('by', '0', true, true);
$newticket->Insert();
$log->logAction(USR_ACTION, LOG_NOTICE, "opened support-ticket '" . $newticket->Get('subject') . "'");
$stmt = Database::prepare('UPDATE `' . TABLE_PANEL_CUSTOMERS . '`
SET `tickets_used`=`tickets_used` + 1
WHERE `customerid`= :customerid'
);
Database::pexecute($stmt, array("customerid" => $userinfo['customerid']));
// Customer mail
$newticket->sendMail((int)$userinfo['customerid'], 'new_ticket_for_customer_subject', $lng['mails']['new_ticket_for_customer']['subject'], 'new_ticket_for_customer_mailbody', $lng['mails']['new_ticket_for_customer']['mailbody']);
// Admin mail
$newticket->sendMail(-1, 'new_ticket_by_customer_subject', $lng['mails']['new_ticket_by_customer']['subject'], 'new_ticket_by_customer_mailbody', $lng['mails']['new_ticket_by_customer']['mailbody']);
redirectTo($filename, array('page' => $page, 's' => $s));
}
} else {
$categories = '';
$result_stmt = Database::prepare('SELECT `id`, `name` FROM `' . TABLE_PANEL_TICKET_CATS . '`
WHERE `adminid` = :adminid
ORDER BY `logicalorder`, `name` ASC'
);
$result = Database::pexecute_first($result_stmt, array("adminid" => $userinfo['adminid']));
if (isset($result['name']) && $result['name'] != '') {
$result2_stmt = Database::prepare('SELECT `id`, `name` FROM `' . TABLE_PANEL_TICKET_CATS . '`
WHERE `adminid` = :adminid
ORDER BY `logicalorder`, `name` ASC'
);
Database::pexecute($result2_stmt, array("adminid" => $userinfo['adminid']));
while ($row = $result2_stmt->fetch(PDO::FETCH_ASSOC)) {
$categories.= makeoption($row['name'], $row['id']);
}
} else {
$categories = makeoption($lng['ticket']['no_cat'], '0');
}
$priorities = makeoption($lng['ticket']['high'], '1');
$priorities.= makeoption($lng['ticket']['normal'], '2');
$priorities.= makeoption($lng['ticket']['low'], '3');
$ticketsopen = 0;
$opentickets_stmt = Database::prepare('SELECT COUNT(`id`) as `count` FROM `' . TABLE_PANEL_TICKETS . '`
WHERE `customerid` = :customerid
AND `answerto` = "0"
AND (`status` = "0" OR `status` = "1" OR `status` = "2")'
);
$opentickets = Database::pexecute_first($opentickets_stmt, array("customerid" => $userinfo['customerid']));
if (Settings::Get('ticket.concurrently_open') != -1 && Settings::Get('ticket.concurrently_open') != '') {
$notmorethanxopentickets = strtr($lng['ticket']['notmorethanxopentickets'], array('%s' => Settings::Get('ticket.concurrently_open')));
} else {
$notmorethanxopentickets = '';
}
$ticketsopen = (int)$opentickets['count'];
$ticket_add_data = include_once dirname(__FILE__).'/lib/formfields/customer/tickets/formfield.ticket_add.php';
$ticket_add_form = htmlform::genHTMLForm($ticket_add_data);
$title = $ticket_add_data['ticket_add']['title'];
$image = $ticket_add_data['ticket_add']['image'];
eval("echo \"" . getTemplate("tickets/tickets_new") . "\";");
}
} else {
standard_error('nomoreticketsavailable');
}
} elseif ($action == 'answer' && $id != 0) {
if (isset($_POST['send']) && $_POST['send'] == 'send') {
$replyticket = ticket::getInstanceOf($userinfo, -1);
$replyticket->Set('subject', validate($_POST['subject'], 'subject'), true, false);
$replyticket->Set('priority', validate($_POST['priority'], 'priority'), true, false);
$replyticket->Set('message', validate(str_replace("\r\n", "\n", $_POST['message']), 'message', '/^[^\0]*$/'), true, false);
if ($replyticket->Get('message') == null) {
standard_error(array('stringisempty', 'mymessage'));
} else {
$now = time();
$replyticket->Set('customer', (int)$userinfo['customerid'], true, true);
$replyticket->Set('lastchange', $now, true, true);
$replyticket->Set('ip', $_SERVER['REMOTE_ADDR'], true, true);
$replyticket->Set('status', '1', true, true);
$replyticket->Set('answerto', (int)$id, true, false);
$replyticket->Set('by', '0', true, true);
$replyticket->Insert();
// Update priority if changed
$mainticket = ticket::getInstanceOf($userinfo, (int)$id);
if ($replyticket->Get('priority') != $mainticket->Get('priority')) {
$mainticket->Set('priority', $replyticket->Get('priority'), true);
}
$mainticket->Set('lastchange', $now);
$mainticket->Set('lastreplier', '0');
$mainticket->Set('status', '1');
$mainticket->Update();
$log->logAction(USR_ACTION, LOG_NOTICE, "answered support-ticket '" . $mainticket->Get('subject') . "'");
$mainticket->sendMail(-1, 'new_reply_ticket_by_customer_subject', $lng['mails']['new_reply_ticket_by_customer']['subject'], 'new_reply_ticket_by_customer_mailbody', $lng['mails']['new_reply_ticket_by_customer']['mailbody']);
redirectTo($filename, array('page' => $page, 's' => $s));
}
} else {
$ticket_replies = '';
$mainticket = ticket::getInstanceOf($userinfo, (int)$id);
$dt = date("d.m.Y H:i\h", $mainticket->Get('dt'));
$status = ticket::getStatusText($lng, $mainticket->Get('status'));
if ($mainticket->Get('status') >= 0 && $mainticket->Get('status') <= 2) {
$isclosed = 0;
} else {
$isclosed = 1;
}
if ($mainticket->Get('by') == '1') {
$by = $lng['ticket']['staff'];
} else {
$cid = $mainticket->Get('customer');
$usr_stmt = Database::prepare('SELECT `customerid`, `firstname`, `name`, `company`, `loginname`
FROM `' . TABLE_PANEL_CUSTOMERS . '`
WHERE `customerid` = :customerid '
);
$usr = Database::pexecute_first($usr_stmt, array("customerid" => $cid));
$by = getCorrectFullUserDetails($usr);
}
$subject = $mainticket->Get('subject');
$message = $mainticket->Get('message');
eval("\$ticket_replies.=\"" . getTemplate("tickets/tickets_tickets_main") . "\";");
$result_stmt = Database::prepare('SELECT `name` FROM `' . TABLE_PANEL_TICKET_CATS . '`
WHERE `id`= :id '
);
$row = Database::pexecute_first($result_stmt, array("id" => $mainticket->Get('category')));
$andere_stmt = Database::prepare('SELECT * FROM `' . TABLE_PANEL_TICKETS . '`
WHERE `answerto`= :answerto
ORDER BY `lastchange` ASC'
);
Database::pexecute($andere_stmt, array("answerto" => $id));
$numrows_andere = Database::num_rows();
while ($row2 = $andere_stmt->fetch(PDO::FETCH_ASSOC)) {
$subticket = ticket::getInstanceOf($userinfo, (int)$row2['id']);
$lastchange = date("d.m.Y H:i\h", $subticket->Get('lastchange'));
if ($subticket->Get('by') == '1') {
$by = $lng['ticket']['staff'];
} else {
$cid = $subticket->Get('customer');
$usr_stmt = Database::prepare('
SELECT `customerid`, `firstname`, `name`, `company`, `loginname`
FROM `' . TABLE_PANEL_CUSTOMERS . '`
WHERE `customerid` = :customerid '
);
$usr = Database::pexecute_first($usr_stmt, array("customerid" => $cid));
$by = getCorrectFullUserDetails($usr);
}
$subject = $subticket->Get('subject');
$message = $subticket->Get('message');
$row2 = htmlentities_array($row2);
eval("\$ticket_replies.=\"" . getTemplate("tickets/tickets_tickets_list") . "\";");
}
$priorities = makeoption($lng['ticket']['high'], '1', $mainticket->Get('priority'), true, true);
$priorities.= makeoption($lng['ticket']['normal'], '2', $mainticket->Get('priority'), true, true);
$priorities.= makeoption($lng['ticket']['low'], '3', $mainticket->Get('priority'), true, true);
$subject = htmlentities($mainticket->Get('subject'));
$ticket_replies_count = $numrows_andere + 1;
// don't forget the main-ticket!
$ticket_reply_data = include_once dirname(__FILE__).'/lib/formfields/customer/tickets/formfield.ticket_reply.php';
$ticket_reply_form = htmlform::genHTMLForm($ticket_reply_data);
$title = $ticket_reply_data['ticket_reply']['title'];
$image = $ticket_reply_data['ticket_reply']['image'];
eval("echo \"" . getTemplate("tickets/tickets_reply") . "\";");
}
} elseif ($action == 'close' && $id != 0) {
if (isset($_POST['send']) && $_POST['send'] == 'send') {
$now = time();
$mainticket = ticket::getInstanceOf($userinfo, (int)$id);
$mainticket->Set('lastchange', $now, true, true);
$mainticket->Set('lastreplier', '0', true, true);
$mainticket->Set('status', '3', true, true);
$mainticket->Update();
$log->logAction(USR_ACTION, LOG_NOTICE, "closed support-ticket '" . $mainticket->Get('subject') . "'");
redirectTo($filename, array('page' => $page, 's' => $s));
} else {
$mainticket = ticket::getInstanceOf($userinfo, (int)$id);
ask_yesno('ticket_reallyclose', $filename, array('id' => $id, 'page' => $page, 'action' => $action), $mainticket->Get('subject'));
}
} elseif ($action == 'reopen' && $id != 0) {
$ticketsopen = 0;
$opentickets_stmt = Database::prepare('SELECT COUNT(`id`) as `count` FROM `' . TABLE_PANEL_TICKETS . '`
WHERE `customerid` = :customerid
AND `answerto` = "0"
AND (`status` = "0" OR `status` = "1" OR `status` = "2")'
);
$opentickets = Database::pexecute_first($opentickets_stmt, array("customerid" => $userinfo['customerid']));
$ticketsopen = (int)$opentickets['count'];
if ($ticketsopen > Settings::Get('ticket.concurrently_open') && Settings::Get('ticket.concurrently_open') != - 1 && Settings::Get('ticket.concurrently_open') != '') {
standard_error('notmorethanxopentickets', Settings::Get('ticket.concurrently_open'));
}
$now = time();
$mainticket = ticket::getInstanceOf($userinfo, (int)$id);
$mainticket->Set('lastchange', $now, true, true);
$mainticket->Set('lastreplier', '0', true, true);
$mainticket->Set('status', '0', true, true);
$mainticket->Update();
$log->logAction(USR_ACTION, LOG_NOTICE, "reopened support-ticket '" . $mainticket->Get('subject') . "'");
redirectTo($filename, array('page' => $page, 's' => $s));
}
}

View File

@@ -2,164 +2,52 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Panel
* *
* 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
*/ */
define('AREA', 'customer'); const AREA = 'customer';
$intrafficpage = 1; require __DIR__ . '/lib/init.php';
require './lib/init.php';
use Froxlor\Traffic\Traffic;
use Froxlor\Settings;
use Froxlor\UI\Panel\UI;
use Froxlor\UI\Request;
use Froxlor\UI\Response;
// redirect if this customer page is hidden via settings // redirect if this customer page is hidden via settings
if (Settings::IsInList('panel.customer_hide_options', 'traffic')) { if (Settings::IsInList('panel.customer_hide_options', 'traffic')) {
redirectTo('customer_index.php'); Response::redirectTo('customer_index.php');
} }
$traffic = ''; $range = Request::any('range', 'currentyear');
$month = null;
$year = null;
if (isset($_POST['month']) && isset($_POST['year'])) { if ($page == 'current') {
$month = intval($_POST['month']); $range = 'currentmonth';
$year = intval($_POST['year']);
} elseif (isset($_GET['month']) && isset($_GET['year'])) {
$month = intval($_GET['month']);
$year = intval($_GET['year']);
}
//BAM! $_GET???
elseif (isset($_GET['page']) && $_GET['page'] == 'current') {
if (date('d') != '01') {
$month = date('m');
$year = date('Y');
} else {
if (date('m') == '01') {
$month = 12;
$year = date('Y') - 1;
} else {
$month = date('m') - 1;
$year = date('Y');
}
}
} }
if (!is_null($month) && !is_null($year)) { try {
$traf['byte'] = 0; $context = Traffic::getCustomerStats($userinfo, $range);
$result_stmt = Database::prepare("SELECT SUM(`http`) as 'http', SUM(`ftp_up`) AS 'ftp_up', SUM(`ftp_down`) as 'ftp_down', SUM(`mail`) as 'mail', `day`, `month`, `year` } catch (Exception $e) {
FROM `" . TABLE_PANEL_TRAFFIC . "` Response::dynamicError($e->getMessage());
WHERE `customerid`= :customerid
AND `month` = :month
AND `year` = :year
GROUP BY `day`
ORDER BY `day` DESC"
);
$params = array(
"customerid" => $userinfo['customerid'],
"month" => $month,
"year" => $year
);
Database::pexecute($result_stmt, $params);
$traffic_complete['http'] = 0;
$traffic_complete['ftp'] = 0;
$traffic_complete['mail'] = 0;
$show = '';
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
$http = $row['http'];
$ftp = $row['ftp_up'] + $row['ftp_down'];
$mail = $row['mail'];
$traf['byte'] = $http + $ftp + $mail;
$traffic_complete['http'] += $http;
$traffic_complete['ftp'] += $ftp;
$traffic_complete['mail'] += $mail;
$traf['day'] = $row['day'] . '.';
if (extension_loaded('bcmath')) {
$traf['ftptext'] = bcdiv($row['ftp_up'], 1024, Settings::Get('panel.decimal_places')) . " MiB up/ " . bcdiv($row['ftp_down'], 1024, Settings::Get('panel.decimal_places')) . " MiB down (FTP)";
$traf['httptext'] = bcdiv($http, 1024, Settings::Get('panel.decimal_places')) . " MiB (HTTP)";
$traf['mailtext'] = bcdiv($mail, 1024, Settings::Get('panel.decimal_places')) . " MiB (Mail)";
$traf['ftp'] = bcdiv($ftp, 1024, Settings::Get('panel.decimal_places'));
$traf['http'] = bcdiv($http, 1024, Settings::Get('panel.decimal_places'));
$traf['mail'] = bcdiv($mail, 1024, Settings::Get('panel.decimal_places'));
$traf['byte'] = bcdiv($traf['byte'], 1024, Settings::Get('panel.decimal_places'));
} else {
$traf['ftptext'] = round($row['ftp_up'] / 1024, Settings::Get('panel.decimal_places')) . " MiB up/ " . round($row['ftp_down'] / 1024, Settings::Get('panel.decimal_places')) . " MiB down (FTP)";
$traf['httptext'] = round($http / 1024, Settings::Get('panel.decimal_places')) . " MiB (HTTP)";
$traf['mailtext'] = round($mail / 1024, Settings::Get('panel.decimal_places')) . " MiB (Mail)";
$traf['http'] = round($http, Settings::Get('panel.decimal_places'));
$traf['ftp'] = round($ftp, Settings::Get('panel.decimal_places'));
$traf['mail'] = round($mail, Settings::Get('panel.decimal_places'));
$traf['byte'] = round($traf['byte'] / 1024, Settings::Get('panel.decimal_places'));
} }
eval("\$traffic.=\"" . getTemplate('traffic/traffic_month') . "\";"); // pass metrics to the view
$show = $lng['traffic']['months'][intval($row['month'])] . ' ' . $row['year']; UI::view('user/traffic.html.twig', $context);
}
$traffic_complete['http'] = size_readable($traffic_complete['http'] * 1024, 'GiB', 'bi', '%01.'.(int)Settings::Get('panel.decimal_places').'f %s');
$traffic_complete['ftp'] = size_readable($traffic_complete['ftp'] * 1024, 'GiB', 'bi', '%01.'.(int)Settings::Get('panel.decimal_places').'f %s');
$traffic_complete['mail'] = size_readable($traffic_complete['mail'] * 1024, 'GiB', 'bi', '%01.'.(int)Settings::Get('panel.decimal_places').'f %s');
eval("echo \"" . getTemplate('traffic/traffic_details') . "\";");
} else {
$result_stmt = Database::prepare("SELECT `month`, `year`, SUM(`http`) AS http, SUM(`ftp_up`) AS ftp_up, SUM(`ftp_down`) AS ftp_down, SUM(`mail`) AS mail
FROM `" . TABLE_PANEL_TRAFFIC . "`
WHERE `customerid` = :customerid
GROUP BY `year` DESC, `month` DESC
LIMIT 12"
);
Database::pexecute($result_stmt, array("customerid" => $userinfo['customerid']));
$traffic_complete['http'] = 0;
$traffic_complete['ftp'] = 0;
$traffic_complete['mail'] = 0;
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
$http = $row['http'];
$ftp_up = $row['ftp_up'];
$ftp_down = $row['ftp_down'];
$mail = $row['mail'];
$traffic_complete['http'] += $http;
$traffic_complete['ftp'] += $ftp_up + $ftp_down;
$traffic_complete['mail'] += $mail;
$traf['month'] = $row['month'];
$traf['year'] = $row['year'];
$traf['monthname'] = $lng['traffic']['months'][intval($row['month'])] . " " . $row['year'];
$traf['byte'] = $http + $ftp_up + $ftp_down + $mail;
if (extension_loaded('bcmath')) {
$traf['ftptext'] = bcdiv($ftp_up, 1024, Settings::Get('panel.decimal_places')) . " MiB up/ " . bcdiv($ftp_down, 1024, Settings::Get('panel.decimal_places')) . " MiB down (FTP)";
$traf['httptext'] = bcdiv($http, 1024, Settings::Get('panel.decimal_places')) . " MiB (HTTP)";
$traf['mailtext'] = bcdiv($mail, 1024, Settings::Get('panel.decimal_places')) . " MiB (Mail)";
$traf['ftp'] = bcdiv(($ftp_up + $ftp_down), 1024, Settings::Get('panel.decimal_places'));
$traf['http'] = bcdiv($http, 1024, Settings::Get('panel.decimal_places'));
$traf['mail'] = bcdiv($mail, 1024, Settings::Get('panel.decimal_places'));
$traf['byte'] = bcdiv($traf['byte'], 1024 * 1024, Settings::Get('panel.decimal_places'));
} else {
$traf['ftptext'] = round($ftp_up / 1024, Settings::Get('panel.decimal_places')) . " MiB up/ " . round($ftp_down / 1024, Settings::Get('panel.decimal_places')) . " MiB down (FTP)";
$traf['httptext'] = round($http / 1024, Settings::Get('panel.decimal_places')) . " MiB (HTTP)";
$traf['mailtext'] = round($mail / 1024, Settings::Get('panel.decimal_places')) . " MiB (Mail)";
$traf['ftp'] = round(($ftp_up + $ftp_down) / 1024, Settings::Get('panel.decimal_places'));
$traf['http'] = round($http / 1024, Settings::Get('panel.decimal_places'));
$traf['mail'] = round($mail / 1024, Settings::Get('panel.decimal_places'));
$traf['byte'] = round($traf['byte'] / (1024 * 1024), Settings::Get('panel.decimal_places'));
}
eval("\$traffic.=\"" . getTemplate('traffic/traffic_traffic') . "\";");
}
$traffic_complete['http'] = size_readable($traffic_complete['http'] * 1024, 'GiB', 'bi', '%01.'.(int)Settings::Get('panel.decimal_places').'f %s');
$traffic_complete['ftp'] = size_readable($traffic_complete['ftp'] * 1024, 'GiB', 'bi', '%01.'.(int)Settings::Get('panel.decimal_places').'f %s');
$traffic_complete['mail'] = size_readable($traffic_complete['mail'] * 1024, 'GiB', 'bi', '%01.'.(int)Settings::Get('panel.decimal_places').'f %s');
eval("echo \"" . getTemplate('traffic/traffic') . "\";");
}

View File

@@ -1,306 +1,149 @@
<?php <?php
if (! defined('AREA'))
die('You cannot access this file directly!');
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2016 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Froxlor team <team@froxlor.org> (2016-) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @package Panel * 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\Api\Commands\DomainZones;
use Froxlor\Dns\Dns;
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;
// This file is being included in admin_domains and customer_domains // This file is being included in admin_domains and customer_domains
// and therefore does not need to require lib/init.php // and therefore does not need to require lib/init.php
$domain_id = isset($_GET['domain_id']) ? (int) $_GET['domain_id'] : null; $domain_id = (int)Request::any('domain_id');
$record = isset($_POST['record']['record']) ? trim($_POST['record']['record']) : null; $record = isset($_POST['dns_record']) ? trim($_POST['dns_record']) : null;
$type = isset($_POST['record']['type']) ? $_POST['record']['type'] : 'A'; $type = isset($_POST['dns_type']) ? $_POST['dns_type'] : 'A';
$prio = isset($_POST['record']['prio']) ? (int) $_POST['record']['prio'] : null; $prio = isset($_POST['dns_mxp']) ? (int)$_POST['dns_mxp'] : null;
$content = isset($_POST['record']['content']) ? trim($_POST['record']['content']) : null; $content = isset($_POST['dns_content']) ? trim($_POST['dns_content']) : null;
$ttl = isset($_POST['record']['ttl']) ? (int) $_POST['record']['ttl'] : 18000; $ttl = isset($_POST['dns_ttl']) ? (int)$_POST['dns_ttl'] : 18000;
// get domain-name // get domain-name
$domain = getAllowedDomainEntry($domain_id, AREA, $userinfo, $idna_convert); $domain = Dns::getAllowedDomainEntry($domain_id, AREA, $userinfo);
// select all entries $errors = "";
$sel_stmt = Database::prepare("SELECT * FROM `" . TABLE_DOMAIN_DNS . "` WHERE domain_id = :did");
Database::pexecute($sel_stmt, array(
'did' => $domain_id
));
$dom_entries = $sel_stmt->fetchAll(PDO::FETCH_ASSOC);
$errors = array();
$success_message = ""; $success_message = "";
// action for adding a new entry // action for adding a new entry
if ($action == 'add_record' && !empty($_POST)) { if ($action == 'add_record' && !empty($_POST)) {
try {
// validation DomainZones::getLocal($userinfo, [
if (empty($record)) { 'id' => $domain_id,
$record = "@";
}
$record = strtolower($record);
if ($record != '@' && $record != '*') {
// validate record
if (strpos($record, '--') !== false) {
$errors[] = $lng['error']['domain_nopunycode'];
} else {
$record = $idna_convert->encode($record);
if ($type != 'SRV' && $type != 'TXT') {
$check_dom = $record . '.example.com';
if (! validateDomain($check_dom)) {
$errors[] = sprintf($lng['error']['subdomainiswrong'], $idna_convert->decode($record));
}
}
if (strlen($record) > 63) {
$errors[] = $lng['error']['dns_record_toolong'];
}
}
}
// TODO regex validate content for invalid characters
if ($ttl <= 0) {
$ttl = 18000;
}
if (empty($content)) {
$errors[] = $lng['error']['dns_content_empty'];
}
// types
if ($type == 'A' && filter_var($content, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) === false) {
$errors[] = $lng['error']['dns_arec_noipv4'];
} elseif ($type == 'AAAA' && filter_var($content, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false) {
$errors[] = $lng['error']['dns_aaaarec_noipv6'];
} elseif ($type == 'MX') {
if ($prio === null || $prio < 0) {
$errors[] = $lng['error']['dns_mx_prioempty'];
}
// check for trailing dot
if (substr($content, - 1) == '.') {
// remove it for checks
$content = substr($content, 0, - 1);
}
if (! validateDomain($content)) {
$errors[] = $lng['error']['dns_mx_needdom'];
} else {
// check whether there is a CNAME-record for the same resource
foreach ($dom_entries as $existing_entries) {
$fqdn = $existing_entries['record'] . '.' . $domain;
if ($existing_entries['type'] == 'CNAME' && $fqdn == $content) {
$errors[] = $lng['error']['dns_mx_noalias'];
break;
}
}
}
// append trailing dot (again)
$content .= '.';
} elseif ($type == 'CNAME') {
// check for trailing dot
if (substr($content, - 1) == '.') {
// remove it for checks
$content = substr($content, 0, - 1);
}
if (! validateDomain($content)) {
$errors[] = $lng['error']['dns_cname_invaliddom'];
} else {
// check whether there are RR-records for the same resource
foreach ($dom_entries as $existing_entries) {
if (($existing_entries['type'] == 'A' || $existing_entries['type'] == 'AAAA' || $existing_entries['type'] == 'MX' || $existing_entries['type'] == 'NS') && $existing_entries['record'] == $record) {
$errors[] = $lng['error']['dns_cname_nomorerr'];
break;
}
}
}
// append trailing dot (again)
$content .= '.';
} elseif ($type == 'NS') {
// check for trailing dot
if (substr($content, - 1) == '.') {
// remove it for checks
$content = substr($content, 0, - 1);
}
if (! validateDomain($content)) {
$errors[] = $lng['error']['dns_ns_invaliddom'];
}
// append trailing dot (again)
$content .= '.';
} elseif ($type == 'TXT' && ! empty($content)) {
// check that TXT content is enclosed in " "
$content = encloseTXTContent($content);
} elseif ($type == 'SRV') {
if ($prio === null || $prio < 0) {
$errors[] = $lng['error']['dns_srv_prioempty'];
}
// check only last part of content, as it can look like:
// _service._proto.name. TTL class SRV priority weight port target.
$_split_content = explode(" ", $content);
// SRV content must be [weight] [port] [target]
if (count($_split_content) != 3) {
$errors[] = $lng['error']['dns_srv_invalidcontent'];
}
$target = trim($_split_content[count($_split_content) - 1]);
if ($target != '.') {
// check for trailing dot
if (substr($target, - 1) == '.') {
// remove it for checks
$target = substr($target, 0, - 1);
}
}
if ($target != '.' && ! validateDomain($target)) {
$errors[] = $lng['error']['dns_srv_needdom'];
} else {
// check whether there is a CNAME-record for the same resource
foreach ($dom_entries as $existing_entries) {
$fqdn = $existing_entries['record'] . '.' . $domain;
if ($existing_entries['type'] == 'CNAME' && $fqdn == $target) {
$errors[] = $lng['error']['dns_srv_noalias'];
break;
}
}
}
// append trailing dot (again)
if ($target != '.') {
$content .= '.';
}
}
$new_entry = array(
'record' => $record, 'record' => $record,
'type' => $type, 'type' => $type,
'prio' => $prio, 'prio' => $prio,
'content' => $content, 'content' => $content,
'ttl' => $ttl, 'ttl' => $ttl
'domain_id' => $domain_id ])->add();
); $success_message = lng('success.dns_record_added');
ksort($new_entry); $record = $prio = $content = "";
} catch (Exception $e) {
// check for duplicate $errors = str_replace("\n", "<br>", $e->getMessage());
foreach ($dom_entries as $existing_entry) {
// compare serialized string of array
$check_entry = $existing_entry;
// new entry has no ID yet
unset($check_entry['id']);
// sort by key
ksort($check_entry);
// format integer fields to real integer (as they are read as string from the DB)
$check_entry['prio'] = (int) $check_entry['prio'];
$check_entry['ttl'] = (int) $check_entry['ttl'];
$check_entry['domain_id'] = (int) $check_entry['domain_id'];
// serialize both
$check_entry = serialize($check_entry);
$new = serialize($new_entry);
// compare
if ($check_entry === $new) {
$errors[] = $lng['error']['dns_duplicate_entry'];
unset($check_entry);
break;
}
}
if (empty($errors)) {
$ins_stmt = Database::prepare("
INSERT INTO `" . TABLE_DOMAIN_DNS . "` SET
`record` = :record,
`type` = :type,
`prio` = :prio,
`content` = :content,
`ttl` = :ttl,
`domain_id` = :domain_id
");
Database::pexecute($ins_stmt, $new_entry);
$new_entry_id = Database::lastInsertId();
// add temporary to the entries-array (no reread of DB necessary)
$new_entry['id'] = $new_entry_id;
$dom_entries[] = $new_entry;
// success message (inline)
$success_message = $lng['success']['dns_record_added'];
$record = "";
$type = 'A';
$prio = "";
$content = "";
$ttl = "";
// re-generate bind configs
inserttask('4');
} else {
// show $errors
$errors = implode("<br>", $errors);
} }
} elseif ($action == 'delete') { } elseif ($action == 'delete') {
// remove entry
$entry_id = isset($_GET['id']) ? (int)$_GET['id'] : 0; $entry_id = isset($_GET['id']) ? (int)$_GET['id'] : 0;
if ($entry_id > 0) { HTML::askYesNo('dnsentry_reallydelete', $filename, [
$del_stmt = Database::prepare("DELETE FROM `" . TABLE_DOMAIN_DNS . "` WHERE `id` = :id"); 'id' => $entry_id,
Database::pexecute($del_stmt, array( 'domain_id' => $domain_id,
'id' => $entry_id 'page' => $page,
)); 'action' => 'deletesure'
], '', [
// remove deleted entry from internal data array (no reread of DB necessary) 'section' => 'domains',
$_t = $dom_entries; 'page' => $page,
foreach ($_t as $idx => $entry) { 'domain_id' => $domain_id
if ($entry['id'] == $entry_id) { ]);
unset($dom_entries[$idx]); } elseif (isset($_POST['send']) && $_POST['send'] == 'send' && $action == 'deletesure' && !empty($_POST)) {
break; $entry_id = isset($_POST['id']) ? (int)$_POST['id'] : 0;
} $domain_id = isset($_POST['domain_id']) ? (int)$_POST['domain_id'] : 0;
} // remove entry
unset($_t); if ($entry_id > 0 && $domain_id > 0) {
try {
DomainZones::getLocal($userinfo, [
'entry_id' => $entry_id,
'id' => $domain_id
])->delete();
// success message (inline) // success message (inline)
$success_message = $lng['success']['dns_record_deleted']; $success_message = lng('success.dns_record_deleted');
} catch (Exception $e) {
// re-generate bind configs $errors = str_replace("\n", "<br>", $e->getMessage());
inserttask('4'); }
} }
} }
// show editor // select all entries
$record_list = ""; try {
$existing_entries = ""; $dns_list_data = include_once dirname(__FILE__) . '/lib/tablelisting/tablelisting.dns.php';
$type_select = ""; $collection = (new Collection(DomainZones::class, $userinfo, ['id' => $domain_id]))
$entriescount = 0; ->withPagination($dns_list_data['dns_list']['columns'], $dns_list_data['dns_list']['default_sorting'], ['domain_id='.$domain_id]);
} catch (Exception $e) {
if (! empty($dom_entries)) { Response::dynamicError($e->getMessage());
$entriescount = count($dom_entries);
foreach ($dom_entries as $entry) {
$entry['content'] = wordwrap($entry['content'], 100, '<br>', true);
eval("\$existing_entries.=\"" . getTemplate("dns_editor/entry_bit", true) . "\";");
}
} }
// available types try {
$type_select_values = array( $json_result = DomainZones::getLocal($userinfo, [
'A', 'id' => $domain_id
'AAAA', ])->get();
'NS', } catch (Exception $e) {
'MX', Response::dynamicError($e->getMessage());
'SRV',
'TXT',
'CNAME'
);
asort($type_select_values);
foreach ($type_select_values as $_type) {
$type_select .= makeoption($_type, $_type, $type);
} }
$result = json_decode($json_result, true)['data'];
$zonefile = implode("\n", $result);
eval("\$record_list=\"" . getTemplate("dns_editor/list", true) . "\";"); $dns_add_data = include_once dirname(__FILE__) . '/lib/formfields/formfield.dns_add.php';
$zone = createDomainZone($domain_id); UI::view('user/dns-editor.html.twig', [
$zonefile = (string) $zone; 'listing' => Listing::format($collection, $dns_list_data, 'dns_list', ['domain_id' => $domain_id]),
eval("echo \"" . getTemplate("dns_editor/index", true) . "\";"); 'actions_links' => [
[
'href' => $linker->getLink([
'section' => 'domains',
'page' => 'domains',
'action' => 'edit',
'id' => $domain_id
]),
'label' => lng('admin.domain_edit'),
'icon' => 'fa-solid fa-pen'
],
[
'href' => $linker->getLink(['section' => 'domains', 'page' => 'domains']),
'label' => lng('panel.backtooverview'),
'icon' => 'fa-solid fa-reply'
]
],
'formaction' => $linker->getLink(['section' => 'domains', 'action' => 'add_record', 'domain_id' => $domain_id]),
'formdata' => $dns_add_data['dns_add'],
// alert-box
'type' => (!empty($errors) ? 'danger' : (!empty($success_message) ? 'success' : 'warning')),
'alert_msg' => (!empty($errors) ? $errors : (!empty($success_message) ? $success_message : lng('dns.howitworks'))),
'zonefile' => $zonefile,
]);

View File

@@ -0,0 +1,67 @@
<?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
*/
class FroxlorAPI
{
private string $url;
private string $key;
private string $secret;
private ?array $lastError = null;
private ?string $lastStatusCode = null;
public function __construct($url, $key, $secret)
{
$this->url = $url;
$this->key = $key;
$this->secret = $secret;
}
public function request($command, array $data = [])
{
$payload = [
'command' => $command,
'params' => $data
];
$ch = curl_init($this->url);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_USERPWD, $this->key . ":" . $this->secret);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
$this->lastStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
return json_decode($result ?? curl_error($ch), true);
}
public function getLastStatusCode(): ?string
{
return $this->lastStatusCode;
}
}

View File

@@ -0,0 +1,46 @@
<?php
// include FroxlorAPI helper class
require __DIR__ . '/FroxlorAPI.php';
// create object of FroxlorAPI with URL, apikey and apisecret
$fapi = new FroxlorAPI('http://127.0.0.1/api.php', 'your-api-key', 'your-api-secret');
// customer data
$data = [
'new_loginname' => 'test',
'email' => 'test@froxlor.org',
'firstname' => 'Test',
'name' => 'Testman',
'customernumber' => 1337,
'new_customer_password' => 's0mEcRypt1cpassword' . uniqid()
];
// send request
$response = $fapi->request('Customers.add', $data);
// check for error
if ($fapi->getLastStatusCode() != 200) {
echo "HTTP-STATUS: " . $fapi->getLastStatusCode() . PHP_EOL;
echo "Description: " . $response['message'] . PHP_EOL;
exit();
}
// view response data
var_dump($response);
/*
array(60) {
["customerid"]=>
string(1) "1"
["loginname"]=>
string(4) "test"
["password"]=>
string(63) "$5$asdasdasd.asdasd"
["adminid"]=>
string(1) "1"
["name"]=>
string(7) "Testman"
["firstname"]=>
string(4) "Test"
[...]
*/

0
doc/example/index.html Normal file
View File

View File

@@ -0,0 +1,20 @@
<?php
// include FroxlorAPI helper class
require __DIR__ . '/FroxlorAPI.php';
// create object of FroxlorAPI with URL, apikey and apisecret
$fapi = new FroxlorAPI('http://localhost/api.php', 'your-api-key', 'your-api-secret');
// send request
$response = $fapi->request('Froxlor.listFunctions');
// check for error
if ($fapi->getLastStatusCode() != 200) {
echo "HTTP-STATUS: " . $fapi->getLastStatusCode() . PHP_EOL;
echo "Description: " . $response['message'] . PHP_EOL;
exit();
}
// view response data
var_dump($response);

0
doc/index.html Normal file
View File

117
error_report.php Normal file
View File

@@ -0,0 +1,117 @@
<?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\FileDir;
use Froxlor\Froxlor;
use Froxlor\UI\Panel\UI;
use Froxlor\UI\Request;
use Froxlor\UI\Response;
use Froxlor\Database\Database;
// This file is being included in admin_domains and customer_domains
// and therefore does not need to require lib/init.php
$errid = Request::any('errorid');
if (!empty($errid)) {
// read error file
$err_dir = FileDir::makeCorrectDir(Froxlor::getInstallDir() . "/logs/");
$err_file = FileDir::makeCorrectFile($err_dir . "/" . $errid . "_sql-error.log");
if (file_exists($err_file)) {
$error_content = file_get_contents($err_file);
$error = explode("|", $error_content);
$_error = [
'code' => str_replace("\n", "", substr($error[1], 5)),
'message' => str_replace("\n", "", substr($error[2], 4)),
'file' => str_replace("\n", "", substr($error[3], 5 + strlen(Froxlor::getInstallDir()))),
'line' => str_replace("\n", "", substr($error[4], 5)),
'trace' => str_replace(Froxlor::getInstallDir(), "", substr($error[5], 6))
];
// build mail-content
$mail_body = "Dear froxlor-team,\n\n";
$mail_body .= "the following error has been reported by a user:\n\n";
$mail_body .= "-------------------------------------------------------------\n";
$mail_body .= $_error['code'] . ' ' . $_error['message'] . "\n\n";
$mail_body .= "File: " . $_error['file'] . ':' . $_error['line'] . "\n\n";
$mail_body .= "Trace:\n" . trim($_error['trace']) . "\n\n";
$mail_body .= "-------------------------------------------------------------\n\n";
$mail_body .= "User-Area: " . AREA . "\n";
$mail_body .= "Froxlor-version: " . Froxlor::VERSION . "\n";
$mail_body .= "DB-version: " . Froxlor::DBVERSION . "\n\n";
try {
$mail_body .= "Database: " . Database::getAttribute(PDO::ATTR_SERVER_VERSION);
} catch (\Exception $e) {
/* ignore */
}
$mail_body .= "End of report";
$mail_html = nl2br($mail_body);
// send actual report to dev-team
if (isset($_POST['send']) && $_POST['send'] == 'send') {
// send mail and say thanks
$_mailerror = false;
try {
$mail->Subject = '[Froxlor] Error report by user';
$mail->AltBody = $mail_body;
$mail->MsgHTML($mail_html);
$mail->AddAddress('error-reports@froxlor.org', 'Froxlor Developer Team');
$mail->Send();
} catch (\PHPMailer\PHPMailer\Exception $e) {
$mailerr_msg = $e->errorMessage();
$_mailerror = true;
} catch (Exception $e) {
$mailerr_msg = $e->getMessage();
$_mailerror = true;
}
if ($_mailerror) {
// error when reporting an error...LOLFUQ
Response::standardError('send_report_error', $mailerr_msg);
}
// finally remove error from fs
@unlink($err_file);
Response::standardSuccess('sent_error_report', '', ['filename' => 'index.php']);
}
// show a nice summary of the error-report
// before actually sending anything
UI::view('user/error_report.html.twig', [
'mail_html' => $mail_body,
'errorid' => $errid
]);
} else {
Response::redirectTo($filename);
}
} else {
Response::redirectTo($filename);
}

719
index.php
View File

@@ -2,40 +2,136 @@
/** /**
* This file is part of the Froxlor project. * This file is part of the Froxlor project.
* Copyright (c) 2003-2009 the SysCP Team (see authors).
* Copyright (c) 2010 the Froxlor Team (see authors). * Copyright (c) 2010 the Froxlor Team (see authors).
* *
* For the full copyright and license information, please view the COPYING * This program is free software; you can redistribute it and/or
* file that was distributed with this source code. You can also view the * modify it under the terms of the GNU General Public License
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* *
* @copyright (c) the authors * This program is distributed in the hope that it will be useful,
* @author Florian Lippert <flo@syscp.org> (2003-2009) * but WITHOUT ANY WARRANTY; without even the implied warranty of
* @author Froxlor team <team@froxlor.org> (2010-) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt * GNU General Public License for more details.
* @package Panel
* *
* 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
*/ */
define('AREA', 'login'); const AREA = 'login';
require './lib/init.php'; require __DIR__ . '/lib/init.php';
use Froxlor\CurrentUser;
use Froxlor\Customer\Customer;
use Froxlor\Database\Database;
use Froxlor\FileDir;
use Froxlor\Froxlor;
use Froxlor\FroxlorLogger;
use Froxlor\FroxlorTwoFactorAuth;
use Froxlor\PhpHelper;
use Froxlor\Settings;
use Froxlor\System\Crypt;
use Froxlor\UI\Panel\UI;
use Froxlor\UI\Response;
use Froxlor\User;
use Froxlor\Validate\Validate;
use Froxlor\Language;
if ($action == '') { if ($action == '') {
$action = 'login'; $action = 'login';
} }
if ($action == 'login') { if ($action == '2fa_entercode') {
// page for entering the 2FA code after successful login
if (!isset($_SESSION) || !isset($_SESSION['secret_2fa'])) {
// no session - redirect to index
Response::redirectTo('index.php');
exit();
}
// show template to enter code
UI::view('login/enter2fa.html.twig', [
'pagetitle' => lng('login.2fa')
]);
} elseif ($action == '2fa_verify') {
// verify code from 2fa code-enter form
if (!isset($_SESSION) || !isset($_SESSION['secret_2fa'])) {
// no session - redirect to index
Response::redirectTo('index.php');
exit();
}
$code = isset($_POST['2fa_code']) ? $_POST['2fa_code'] : null;
// verify entered code
$tfa = new FroxlorTwoFactorAuth('Froxlor ' . Settings::Get('system.hostname'));
$result = ($_SESSION['secret_2fa'] == 'email' ? true : $tfa->verifyCode($_SESSION['secret_2fa'], $code, 3));
// either the code is valid when using authenticator-app, or we will select userdata by id and entered code
// which is temporarily stored for the customer when using email-2fa
if ($result) {
// get user-data
$table = $_SESSION['uidtable_2fa'];
$field = $_SESSION['uidfield_2fa'];
$uid = $_SESSION['uid_2fa'];
$isadmin = $_SESSION['unfo_2fa'];
$sel_param = [
'uid' => $uid
];
if ($_SESSION['secret_2fa'] == 'email') {
// verify code by selecting user by id and the temp. stored code,
// so only if it's the correct code, we get the user-data
$sel_stmt = Database::prepare("SELECT * FROM $table WHERE `" . $field . "` = :uid AND `data_2fa` = :code");
$sel_param['code'] = $code;
} else {
// Authenticator-verification has already happened at this point, so just get the user-data
$sel_stmt = Database::prepare("SELECT * FROM $table WHERE `" . $field . "` = :uid");
}
$userinfo = Database::pexecute_first($sel_stmt, $sel_param);
// whoops, no (valid) user? Start again
if (empty($userinfo)) {
Response::redirectTo('index.php', [
'showmessage' => '2'
]);
}
// set fields in $userinfo required for finishLogin()
$userinfo['adminsession'] = $isadmin;
$userinfo['userid'] = $uid;
// if not successful somehow - start again
if (!finishLogin($userinfo)) {
Response::redirectTo('index.php', [
'showmessage' => '2'
]);
}
// when using email-2fa, remove the one-time-code
if ($userinfo['type_2fa'] == '1') {
$del_stmt = Database::prepare("UPDATE $table SET `data_2fa` = '' WHERE `" . $field . "` = :uid");
$userinfo = Database::pexecute_first($del_stmt, [
'uid' => $uid
]);
}
exit();
}
Response::redirectTo('index.php', [
'showmessage' => '2'
]);
exit();
} elseif ($action == 'login') {
if (isset($_POST['send']) && $_POST['send'] == 'send') { if (isset($_POST['send']) && $_POST['send'] == 'send') {
$loginname = validate($_POST['loginname'], 'loginname'); $loginname = Validate::validate($_POST['loginname'], 'loginname');
$password = validate($_POST['password'], 'password'); $password = Validate::validate($_POST['password'], 'password');
$stmt = Database::prepare("SELECT `loginname` AS `customer` FROM `" . TABLE_PANEL_CUSTOMERS . "` $stmt = Database::prepare("SELECT `loginname` AS `customer` FROM `" . TABLE_PANEL_CUSTOMERS . "`
WHERE `loginname`= :loginname" WHERE `loginname`= :loginname");
); Database::pexecute($stmt, [
Database::pexecute($stmt, array("loginname" => $loginname)); "loginname" => $loginname
]);
$row = $stmt->fetch(PDO::FETCH_ASSOC); $row = $stmt->fetch(PDO::FETCH_ASSOC);
if ($row['customer'] == $loginname) { if ($row && $row['customer'] == $loginname) {
$table = "`" . TABLE_PANEL_CUSTOMERS . "`"; $table = "`" . TABLE_PANEL_CUSTOMERS . "`";
$uid = 'customerid'; $uid = 'customerid';
$adminsession = '0'; $adminsession = '0';
@@ -43,22 +139,27 @@ if ($action == 'login') {
} else { } else {
$is_admin = true; $is_admin = true;
if ((int)Settings::Get('login.domain_login') == 1) { if ((int)Settings::Get('login.domain_login') == 1) {
$domainname = $idna_convert->encode(preg_replace(array('/\:(\d)+$/', '/^https?\:\/\//'), '', $loginname)); $domainname = $idna_convert->encode(preg_replace([
'/\:(\d)+$/',
'/^https?\:\/\//'
], '', $loginname));
$stmt = Database::prepare("SELECT `customerid` FROM `" . TABLE_PANEL_DOMAINS . "` $stmt = Database::prepare("SELECT `customerid` FROM `" . TABLE_PANEL_DOMAINS . "`
WHERE `domain` = :domain" WHERE `domain` = :domain");
); Database::pexecute($stmt, [
Database::pexecute($stmt, array("domain" => $domainname)); "domain" => $domainname
]);
$row2 = $stmt->fetch(PDO::FETCH_ASSOC); $row2 = $stmt->fetch(PDO::FETCH_ASSOC);
if (isset($row2['customerid']) && $row2['customerid'] > 0) { if (isset($row2['customerid']) && $row2['customerid'] > 0) {
$loginname = getCustomerDetail($row2['customerid'], 'loginname'); $loginname = Customer::getCustomerDetail($row2['customerid'], 'loginname');
if ($loginname !== false) { if ($loginname !== false) {
$stmt = Database::prepare("SELECT `loginname` AS `customer` FROM `" . TABLE_PANEL_CUSTOMERS . "` $stmt = Database::prepare("SELECT `loginname` AS `customer` FROM `" . TABLE_PANEL_CUSTOMERS . "`
WHERE `loginname`= :loginname" WHERE `loginname`= :loginname");
); Database::pexecute($stmt, [
Database::pexecute($stmt, array("loginname" => $loginname)); "loginname" => $loginname
]);
$row3 = $stmt->fetch(PDO::FETCH_ASSOC); $row3 = $stmt->fetch(PDO::FETCH_ASSOC);
if ($row3['customer'] == $loginname) { if ($row3 && $row3['customer'] == $loginname) {
$table = "`" . TABLE_PANEL_CUSTOMERS . "`"; $table = "`" . TABLE_PANEL_CUSTOMERS . "`";
$uid = 'customerid'; $uid = 'customerid';
$adminsession = '0'; $adminsession = '0';
@@ -69,70 +170,83 @@ if ($action == 'login') {
} }
} }
if ((hasUpdates($version) || hasDbUpdates($dbversion)) && $is_admin == false) { if ((Froxlor::hasUpdates() || Froxlor::hasDbUpdates()) && $is_admin == false) {
redirectTo('index.php'); Response::redirectTo('index.php');
exit; exit();
} }
if ($is_admin) { if ($is_admin) {
if (hasUpdates($version) || hasDbUpdates($dbversion)) { if (Froxlor::hasUpdates() || Froxlor::hasDbUpdates()) {
$stmt = Database::prepare("SELECT `loginname` AS `admin` FROM `" . TABLE_PANEL_ADMINS . "` $stmt = Database::prepare("SELECT `loginname` AS `admin` FROM `" . TABLE_PANEL_ADMINS . "`
WHERE `loginname`= :loginname WHERE `loginname`= :loginname
AND `change_serversettings` = '1'" AND `change_serversettings` = '1'");
); Database::pexecute($stmt, [
Database::pexecute($stmt, array("loginname" => $loginname)); "loginname" => $loginname
]);
$row = $stmt->fetch(PDO::FETCH_ASSOC); $row = $stmt->fetch(PDO::FETCH_ASSOC);
if (!isset($row['admin'])) { if (!isset($row['admin'])) {
// not an admin who can see updates // not an admin who can see updates
redirectTo('index.php'); Response::redirectTo('index.php');
exit; exit();
} }
} else { } else {
$stmt = Database::prepare("SELECT `loginname` AS `admin` FROM `" . TABLE_PANEL_ADMINS . "` $stmt = Database::prepare("SELECT `loginname` AS `admin` FROM `" . TABLE_PANEL_ADMINS . "`
WHERE `loginname`= :loginname" WHERE `loginname`= :loginname");
); Database::pexecute($stmt, [
Database::pexecute($stmt, array("loginname" => $loginname)); "loginname" => $loginname
]);
$row = $stmt->fetch(PDO::FETCH_ASSOC); $row = $stmt->fetch(PDO::FETCH_ASSOC);
} }
if ($row['admin'] == $loginname) { if ($row && $row['admin'] == $loginname) {
$table = "`" . TABLE_PANEL_ADMINS . "`"; $table = "`" . TABLE_PANEL_ADMINS . "`";
$uid = 'adminid'; $uid = 'adminid';
$adminsession = '1'; $adminsession = '1';
} else { } else {
// Log failed login // Log failed login
$rstlog = FroxlorLogger::getInstanceOf(array('loginname' => $_SERVER['REMOTE_ADDR'])); $rstlog = FroxlorLogger::getInstanceOf([
$rstlog->logAction(LOGIN_ACTION, LOG_WARNING, "Unknown user '" . $loginname . "' tried to login."); 'loginname' => $_SERVER['REMOTE_ADDR']
]);
$rstlog->logAction(FroxlorLogger::LOGIN_ACTION, LOG_WARNING, "Unknown user '" . $loginname . "' tried to login.");
redirectTo('index.php', array('showmessage' => '2')); Response::redirectTo('index.php', [
exit; 'showmessage' => '2'
]);
exit();
} }
} }
$userinfo_stmt = Database::prepare("SELECT * FROM $table $userinfo_stmt = Database::prepare("SELECT * FROM $table
WHERE `loginname`= :loginname" WHERE `loginname`= :loginname");
); Database::pexecute($userinfo_stmt, [
Database::pexecute($userinfo_stmt, array("loginname" => $loginname)); "loginname" => $loginname
]);
$userinfo = $userinfo_stmt->fetch(PDO::FETCH_ASSOC); $userinfo = $userinfo_stmt->fetch(PDO::FETCH_ASSOC);
if ($userinfo['loginfail_count'] >= Settings::Get('login.maxloginattempts') && $userinfo['lastlogin_fail'] > (time() - Settings::Get('login.deactivatetime'))) { if ($userinfo['loginfail_count'] >= Settings::Get('login.maxloginattempts') && $userinfo['lastlogin_fail'] > (time() - Settings::Get('login.deactivatetime'))) {
redirectTo('index.php', array('showmessage' => '3')); Response::redirectTo('index.php', [
exit; 'showmessage' => '3'
} elseif (validatePasswordLogin($userinfo, $password, $table, $uid)) { ]);
exit();
} elseif (Crypt::validatePasswordLogin($userinfo, $password, $table, $uid)) {
// only show "you're banned" if the login was successful // only show "you're banned" if the login was successful
// because we don't want to publish that the user does exist // because we don't want to publish that the user does exist
if ($userinfo['deactivated']) { if ($userinfo['deactivated']) {
unset($userinfo); unset($userinfo);
redirectTo('index.php', array('showmessage' => '5')); Response::redirectTo('index.php', [
exit; 'showmessage' => '5'
]);
exit();
} else { } else {
// login correct // login correct
// reset loginfail_counter, set lastlogin_succ // reset loginfail_counter, set lastlogin_succ
$stmt = Database::prepare("UPDATE $table $stmt = Database::prepare("UPDATE $table
SET `lastlogin_succ`= :lastlogin_succ, `loginfail_count`='0' SET `lastlogin_succ`= :lastlogin_succ, `loginfail_count`='0'
WHERE `$uid`= :uid" WHERE `$uid`= :uid");
); Database::pexecute($stmt, [
Database::pexecute($stmt, array("lastlogin_succ" => time(), "uid" => $userinfo[$uid])); "lastlogin_succ" => time(),
"uid" => $userinfo[$uid]
]);
$userinfo['userid'] = $userinfo[$uid]; $userinfo['userid'] = $userinfo[$uid];
$userinfo['adminsession'] = $adminsession; $userinfo['adminsession'] = $adminsession;
} }
@@ -140,161 +254,135 @@ if ($action == 'login') {
// login incorrect // login incorrect
$stmt = Database::prepare("UPDATE $table $stmt = Database::prepare("UPDATE $table
SET `lastlogin_fail`= :lastlogin_fail, `loginfail_count`=`loginfail_count`+1 SET `lastlogin_fail`= :lastlogin_fail, `loginfail_count`=`loginfail_count`+1
WHERE `$uid`= :uid" WHERE `$uid`= :uid");
); Database::pexecute($stmt, [
Database::pexecute($stmt, array("lastlogin_fail" => time(), "uid" => $userinfo[$uid])); "lastlogin_fail" => time(),
"uid" => $userinfo[$uid]
]);
// Log failed login // Log failed login
$rstlog = FroxlorLogger::getInstanceOf(array('loginname' => $_SERVER['REMOTE_ADDR'])); $rstlog = FroxlorLogger::getInstanceOf([
$rstlog->logAction(LOGIN_ACTION, LOG_WARNING, "User '" . $loginname . "' tried to login with wrong password."); 'loginname' => $_SERVER['REMOTE_ADDR']
]);
$rstlog->logAction(FroxlorLogger::LOGIN_ACTION, LOG_WARNING, "User '" . $loginname . "' tried to login with wrong password.");
unset($userinfo); unset($userinfo);
redirectTo('index.php', array('showmessage' => '2')); Response::redirectTo('index.php', [
exit; 'showmessage' => '2'
]);
exit();
} }
if (isset($userinfo['userid']) && $userinfo['userid'] != '') { // 2FA activated
$s = md5(uniqid(microtime(), 1)); if (Settings::Get('2fa.enabled') == '1' && $userinfo['type_2fa'] > 0) {
// redirect to code-enter-page
$_SESSION['secret_2fa'] = ($userinfo['type_2fa'] == 2 ? $userinfo['data_2fa'] : 'email');
$_SESSION['uid_2fa'] = $userinfo[$uid];
$_SESSION['uidfield_2fa'] = $uid;
$_SESSION['uidtable_2fa'] = $table;
$_SESSION['unfo_2fa'] = $is_admin;
// send mail if type_2fa = 1 (email)
if ($userinfo['type_2fa'] == 1) {
// generate code
$tfa = new FroxlorTwoFactorAuth('Froxlor ' . Settings::Get('system.hostname'));
$code = $tfa->getCode($tfa->createSecret());
// set code for user
$stmt = Database::prepare("UPDATE $table SET `data_2fa` = :d2fa WHERE `$uid` = :uid");
Database::pexecute($stmt, [
"d2fa" => $code,
"uid" => $userinfo[$uid]
]);
// build up & send email
$_mailerror = false;
$mailerr_msg = "";
$replace_arr = [
'CODE' => $code
];
$mail_body = html_entity_decode(PhpHelper::replaceVariables(lng('mails.2fa.mailbody'), $replace_arr));
if (isset($_POST['language'])) { try {
$language = validate($_POST['language'], 'language'); $mail->Subject = lng('mails.2fa.subject');
if ($language == 'profile') { $mail->AltBody = $mail_body;
$language = $userinfo['def_language']; $mail->MsgHTML(str_replace("\n", "<br />", $mail_body));
} elseif (!isset($languages[$language])) { $mail->AddAddress($userinfo['email'], User::getCorrectUserSalutation($userinfo));
$language = Settings::Get('panel.standardlanguage'); $mail->Send();
} catch (\PHPMailer\PHPMailer\Exception $e) {
$mailerr_msg = $e->errorMessage();
$_mailerror = true;
} catch (Exception $e) {
$mailerr_msg = $e->getMessage();
$_mailerror = true;
} }
if ($_mailerror) {
$rstlog = FroxlorLogger::getInstanceOf([
'loginname' => '2fa code-sending'
]);
$rstlog->logAction(FroxlorLogger::ADM_ACTION, LOG_ERR, "Error sending mail: " . $mailerr_msg);
Response::redirectTo('index.php', [
'showmessage' => '4',
'customermail' => $userinfo['email']
]);
exit();
}
$mail->ClearAddresses();
}
Response::redirectTo('index.php', [
'action' => '2fa_entercode'
]);
exit();
}
if (!finishLogin($userinfo)) {
Response::redirectTo('index.php', [
'showmessage' => '2'
]);
}
exit();
} else { } else {
$language = Settings::Get('panel.standardlanguage');
}
if (isset($userinfo['theme']) && $userinfo['theme'] != '') {
$theme = $userinfo['theme'];
} else {
$theme = Settings::Get('panel.default_theme');
}
if (Settings::Get('session.allow_multiple_login') != '1') {
$stmt = Database::prepare("DELETE FROM `" . TABLE_PANEL_SESSIONS . "`
WHERE `userid` = :uid
AND `adminsession` = :adminsession"
);
Database::pexecute($stmt, array("uid" => $userinfo['userid'], "adminsession" => $userinfo['adminsession']));
}
// check for field 'theme' in session-table, refs #607
// Changed with #1287 to new method
$theme_field = false;
$stmt = Database::query("SHOW COLUMNS FROM panel_sessions LIKE 'theme'");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
if ($row['Field'] == "theme") {
$has_theme = true;
}
}
$params = array(
"hash" => $s,
"userid" => $userinfo['userid'],
"ipaddress" => $remote_addr,
"useragent" => $http_user_agent,
"lastactivity" => time(),
"language" => $language,
"adminsession" => $userinfo['adminsession']
);
if ($has_theme) {
$params["theme"] = $theme;
$stmt = Database::prepare("INSERT INTO `" . TABLE_PANEL_SESSIONS . "`
(`hash`, `userid`, `ipaddress`, `useragent`, `lastactivity`, `language`, `adminsession`, `theme`)
VALUES (:hash, :userid, :ipaddress, :useragent, :lastactivity, :language, :adminsession, :theme)"
);
} else {
$stmt = Database::prepare("INSERT INTO `" . TABLE_PANEL_SESSIONS . "`
(`hash`, `userid`, `ipaddress`, `useragent`, `lastactivity`, `language`, `adminsession`)
VALUES (:hash, :userid, :ipaddress, :useragent, :lastactivity, :language, :adminsession)"
);
}
Database::pexecute($stmt, $params);
$qryparams = array();
if (isset($_POST['qrystr']) && $_POST['qrystr'] != "") {
parse_str(urldecode($_POST['qrystr']), $qryparams);
}
$qryparams['s'] = $s;
if ($userinfo['adminsession'] == '1') {
if (hasUpdates($version) || hasDbUpdates($dbversion)) {
redirectTo('admin_updates.php', array('s' => $s));
} else {
if (isset($_POST['script']) && $_POST['script'] != "") {
if (preg_match("/customer\_/", $_POST['script']) === 1) {
redirectTo('admin_customers.php', array("page" => "customers"));
} else {
redirectTo($_POST['script'], $qryparams);
}
} else {
redirectTo('admin_index.php', $qryparams);
}
}
} else {
if (isset($_POST['script']) && $_POST['script'] != "") {
redirectTo($_POST['script'], $qryparams);
} else {
redirectTo('customer_index.php', $qryparams);
}
}
} else {
redirectTo('index.php', array('showmessage' => '2'));
}
exit;
} else {
$language_options = '';
$language_options .= makeoption($lng['login']['profile_lng'], 'profile', 'profile', true, true);
while (list($language_file, $language_name) = each($languages)) {
$language_options .= makeoption($language_name, $language_file, 'profile', true);
}
$smessage = isset($_GET['showmessage']) ? (int)$_GET['showmessage'] : 0; $smessage = isset($_GET['showmessage']) ? (int)$_GET['showmessage'] : 0;
$message = ''; $message = '';
$successmessage = ''; $successmessage = '';
switch ($smessage) { switch ($smessage) {
case 1: case 1:
$successmessage = $lng['pwdreminder']['success']; $successmessage = lng('pwdreminder.success');
break; break;
case 2: case 2:
$message = $lng['error']['login']; $message = lng('error.login');
break; break;
case 3: case 3:
$message = sprintf($lng['error']['login_blocked'], Settings::Get('login.deactivatetime')); $message = lng('error.login_blocked', [Settings::Get('login.deactivatetime')]);
break; break;
case 4: case 4:
$cmail = isset($_GET['customermail']) ? $_GET['customermail'] : 'unknown'; $message = lng('error.errorsendingmailpub');
$message = str_replace('%s', $cmail, $lng['error']['errorsendingmail']);
break; break;
case 5: case 5:
$message = $lng['error']['user_banned']; $message = lng('error.user_banned');
break; break;
case 6: case 6:
$successmessage = $lng['pwdreminder']['changed']; $successmessage = lng('pwdreminder.changed');
break; break;
case 7: case 7:
$message = $lng['pwdreminder']['wrongcode']; $message = lng('pwdreminder.wrongcode');
break; break;
case 8: case 8:
$message = $lng['pwdreminder']['notallowed']; $message = lng('pwdreminder.notallowed');
break; break;
} }
$update_in_progress = ''; $update_in_progress = false;
if (hasUpdates($version) || hasDbUpdates($dbversion)) { if (Froxlor::hasUpdates() || Froxlor::hasDbUpdates()) {
$update_in_progress = $lng['update']['updateinprogress_onlyadmincanlogin']; $update_in_progress = true;
} }
// Pass the last used page if needed // Pass the last used page if needed
$lastscript = ""; $lastscript = "";
if (isset($_REQUEST['script']) && $_REQUEST['script'] != "") { if (isset($_REQUEST['script']) && $_REQUEST['script'] != "") {
$lastscript = $_REQUEST['script']; $lastscript = $_REQUEST['script'];
$lastscript = str_replace("..", "", $lastscript);
$lastscript = htmlspecialchars($lastscript, ENT_QUOTES);
if (!file_exists(__DIR__ . "/" . $lastscript)) { if (!file_exists(__DIR__ . "/" . $lastscript)) {
$lastscript = ""; $lastscript = "";
@@ -305,7 +393,14 @@ if ($action == 'login') {
$lastqrystr = htmlspecialchars($_REQUEST['qrystr'], ENT_QUOTES); $lastqrystr = htmlspecialchars($_REQUEST['qrystr'], ENT_QUOTES);
} }
eval("echo \"" . getTemplate('login') . "\";"); UI::view('login/login.html.twig', [
'pagetitle' => 'Login',
'lastscript' => $lastscript,
'lastqrystr' => $lastqrystr,
'upd_in_progress' => $update_in_progress,
'message' => $message,
'successmsg' => $successmessage
]);
} }
} }
@@ -314,20 +409,24 @@ if ($action == 'forgotpwd') {
$message = ''; $message = '';
if (isset($_POST['send']) && $_POST['send'] == 'send') { if (isset($_POST['send']) && $_POST['send'] == 'send') {
$loginname = validate($_POST['loginname'], 'loginname'); $loginname = Validate::validate($_POST['loginname'], 'loginname');
$email = validateEmail($_POST['loginemail'], 'email'); $email = Validate::validateEmail($_POST['loginemail']);
$result_stmt = Database::prepare("SELECT `adminid`, `customerid`, `firstname`, `name`, `company`, `email`, `loginname`, `def_language`, `deactivated` FROM `" . TABLE_PANEL_CUSTOMERS . "` $result_stmt = Database::prepare("SELECT `adminid`, `customerid`, `customernumber`, `firstname`, `name`, `company`, `email`, `loginname`, `def_language`, `deactivated` FROM `" . TABLE_PANEL_CUSTOMERS . "`
WHERE `loginname`= :loginname WHERE `loginname`= :loginname
AND `email`= :email" AND `email`= :email");
); Database::pexecute($result_stmt, [
Database::pexecute($result_stmt, array("loginname" => $loginname, "email" => $email)); "loginname" => $loginname,
"email" => $email
]);
if (Database::num_rows() == 0) { if (Database::num_rows() == 0) {
$result_stmt = Database::prepare("SELECT `adminid`, `name`, `email`, `loginname`, `def_language`, `deactivated` FROM `" . TABLE_PANEL_ADMINS . "` $result_stmt = Database::prepare("SELECT `adminid`, `name`, `email`, `loginname`, `def_language`, `deactivated` FROM `" . TABLE_PANEL_ADMINS . "`
WHERE `loginname`= :loginname WHERE `loginname`= :loginname
AND `email`= :email" AND `email`= :email");
); Database::pexecute($result_stmt, [
Database::pexecute($result_stmt, array("loginname" => $loginname, "email" => $email)); "loginname" => $loginname,
"email" => $email
]);
if (Database::num_rows() > 0) { if (Database::num_rows() > 0) {
$adminchecked = true; $adminchecked = true;
@@ -336,49 +435,59 @@ if ($action == 'forgotpwd') {
} }
} }
if ($adminchecked) {
if (Settings::Get('panel.allow_preset_admin') != '1') {
$message = lng('pwdreminder.notallowed');
unset($adminchecked);
}
} else {
if (Settings::Get('panel.allow_preset') != '1') {
$message = lng('pwdreminder.notallowed');
}
}
if (empty($message)) {
if ($result_stmt !== null) { if ($result_stmt !== null) {
$user = $result_stmt->fetch(PDO::FETCH_ASSOC); $user = $result_stmt->fetch(PDO::FETCH_ASSOC);
/* Check whether user is banned */ /* Check whether user is banned */
if ($user['deactivated']) { if ($user['deactivated']) {
redirectTo('index.php', array('showmessage' => '8')); $message = lng('pwdreminder.notallowed');
exit; } else {
}
if (($adminchecked && Settings::Get('panel.allow_preset_admin') == '1') || $adminchecked == false) { if (($adminchecked && Settings::Get('panel.allow_preset_admin') == '1') || $adminchecked == false) {
if ($user !== false) { if ($user !== false) {
// build a activation code // build a activation code
$timestamp = time(); $timestamp = time();
$first = substr(md5($user['loginname'] . $timestamp . randomStr(16)), 0, 15); $first = substr(md5($user['loginname'] . $timestamp . PhpHelper::randomStr(16)), 0, 15);
$third = substr(md5($user['email'] . $timestamp . randomStr(16)), -15); $third = substr(md5($user['email'] . $timestamp . PhpHelper::randomStr(16)), -15);
$activationcode = $first . $timestamp . $third . substr(md5($third . $timestamp), 0, 10); $activationcode = $first . $timestamp . $third . substr(md5($third . $timestamp), 0, 10);
// Drop all existing activation codes for this user // Drop all existing activation codes for this user
$stmt = Database::prepare("DELETE FROM `" . TABLE_PANEL_ACTIVATION . "` $stmt = Database::prepare("DELETE FROM `" . TABLE_PANEL_ACTIVATION . "`
WHERE `userid` = :userid WHERE `userid` = :userid
AND `admin` = :admin" AND `admin` = :admin");
); $params = [
$params = array(
"userid" => $adminchecked ? $user['adminid'] : $user['customerid'], "userid" => $adminchecked ? $user['adminid'] : $user['customerid'],
"admin" => $adminchecked ? 1 : 0 "admin" => $adminchecked ? 1 : 0
); ];
Database::pexecute($stmt, $params); Database::pexecute($stmt, $params);
// Add new activation code to database // Add new activation code to database
$stmt = Database::prepare("INSERT INTO `" . TABLE_PANEL_ACTIVATION . "` $stmt = Database::prepare("INSERT INTO `" . TABLE_PANEL_ACTIVATION . "`
(userid, admin, creation, activationcode) (userid, admin, creation, activationcode)
VALUES (:userid, :admin, :creation, :activationcode)" VALUES (:userid, :admin, :creation, :activationcode)");
); $params = [
$params = array(
"userid" => $adminchecked ? $user['adminid'] : $user['customerid'], "userid" => $adminchecked ? $user['adminid'] : $user['customerid'],
"admin" => $adminchecked ? 1 : 0, "admin" => $adminchecked ? 1 : 0,
"creation" => $timestamp, "creation" => $timestamp,
"activationcode" => $activationcode "activationcode" => $activationcode
); ];
Database::pexecute($stmt, $params); Database::pexecute($stmt, $params);
$rstlog = FroxlorLogger::getInstanceOf(array('loginname' => 'password_reset')); $rstlog = FroxlorLogger::getInstanceOf([
$rstlog->logAction(USR_ACTION, LOG_WARNING, "User '" . $user['loginname'] . "' requested a link for setting a new password."); 'loginname' => 'password_reset'
]);
$rstlog->logAction(FroxlorLogger::USR_ACTION, LOG_WARNING, "User '" . $user['loginname'] . "' requested a link for setting a new password.");
// Set together our activation link // Set together our activation link
$protocol = empty($_SERVER['HTTPS']) ? 'http' : 'https'; $protocol = empty($_SERVER['HTTPS']) ? 'http' : 'https';
@@ -392,45 +501,54 @@ if ($action == 'forgotpwd') {
// there can be only one script to handle this so we can use a fixed value here // there can be only one script to handle this so we can use a fixed value here
$script = "/index.php"; // $_SERVER['SCRIPT_NAME']; $script = "/index.php"; // $_SERVER['SCRIPT_NAME'];
if (Settings::Get('system.froxlordirectlyviahostname') == 0) { if (Settings::Get('system.froxlordirectlyviahostname') == 0) {
$script = makeCorrectFile("/".basename(__DIR__)."/".$script); $script = FileDir::makeCorrectFile("/" . basename(__DIR__) . "/" . $script);
} }
$activationlink = $protocol . '://' . $host . $port . $script . '?action=resetpwd&resetcode=' . $activationcode; $activationlink = $protocol . '://' . $host . $port . $script . '?action=resetpwd&resetcode=' . $activationcode;
$replace_arr = array( $replace_arr = [
'SALUTATION' => getCorrectUserSalutation($user), 'SALUTATION' => User::getCorrectUserSalutation($user),
'NAME' => $user['name'],
'FIRSTNAME' => $user['firstname'] ?? "",
'COMPANY' => $user['company'] ?? "",
'CUSTOMER_NO' => $user['customernumber'] ?? 0,
'USERNAME' => $loginname, 'USERNAME' => $loginname,
'LINK' => $activationlink 'LINK' => $activationlink
); ];
$def_language = ($user['def_language'] != '') ? $user['def_language'] : Settings::Get('panel.standardlanguage'); $def_language = ($user['def_language'] != '') ? $user['def_language'] : Settings::Get('panel.standardlanguage');
$result_stmt = Database::prepare('SELECT `value` FROM `' . TABLE_PANEL_TEMPLATES . '` $result_stmt = Database::prepare('SELECT `value` FROM `' . TABLE_PANEL_TEMPLATES . '`
WHERE `adminid`= :adminid WHERE `adminid`= :adminid
AND `language`= :lang AND `language`= :lang
AND `templategroup`=\'mails\' AND `templategroup`=\'mails\'
AND `varname`=\'password_reset_subject\'' AND `varname`=\'password_reset_subject\'');
); Database::pexecute($result_stmt, [
Database::pexecute($result_stmt, array("adminid" => $user['adminid'], "lang" => $def_language)); "adminid" => $user['adminid'],
"lang" => $def_language
]);
$result = $result_stmt->fetch(PDO::FETCH_ASSOC); $result = $result_stmt->fetch(PDO::FETCH_ASSOC);
$mail_subject = html_entity_decode(replace_variables((($result['value'] != '') ? $result['value'] : $lng['mails']['password_reset']['subject']), $replace_arr)); $mail_subject = html_entity_decode(PhpHelper::replaceVariables((($result['value'] != '') ? $result['value'] : lng('mails.password_reset.subject')), $replace_arr));
$result_stmt = Database::prepare('SELECT `value` FROM `' . TABLE_PANEL_TEMPLATES . '` $result_stmt = Database::prepare('SELECT `value` FROM `' . TABLE_PANEL_TEMPLATES . '`
WHERE `adminid`= :adminid WHERE `adminid`= :adminid
AND `language`= :lang AND `language`= :lang
AND `templategroup`=\'mails\' AND `templategroup`=\'mails\'
AND `varname`=\'password_reset_mailbody\'' AND `varname`=\'password_reset_mailbody\'');
); Database::pexecute($result_stmt, [
Database::pexecute($result_stmt, array("adminid" => $user['adminid'], "lang" => $def_language)); "adminid" => $user['adminid'],
"lang" => $def_language
]);
$result = $result_stmt->fetch(PDO::FETCH_ASSOC); $result = $result_stmt->fetch(PDO::FETCH_ASSOC);
$mail_body = html_entity_decode(replace_variables((($result['value'] != '') ? $result['value'] : $lng['mails']['password_reset']['mailbody']), $replace_arr)); $mail_body = html_entity_decode(PhpHelper::replaceVariables((($result['value'] != '') ? $result['value'] : lng('mails.password_reset.mailbody')), $replace_arr));
$_mailerror = false; $_mailerror = false;
$mailerr_msg = "";
try { try {
$mail->Subject = $mail_subject; $mail->Subject = $mail_subject;
$mail->AltBody = $mail_body; $mail->AltBody = $mail_body;
$mail->MsgHTML(str_replace("\n", "<br />", $mail_body)); $mail->MsgHTML(str_replace("\n", "<br />", $mail_body));
$mail->AddAddress($user['email'], getCorrectUserSalutation($user)); $mail->AddAddress($user['email'], User::getCorrectUserSalutation($user));
$mail->Send(); $mail->Send();
} catch(phpmailerException $e) { } catch (\PHPMailer\PHPMailer\Exception $e) {
$mailerr_msg = $e->errorMessage(); $mailerr_msg = $e->errorMessage();
$_mailerror = true; $_mailerror = true;
} catch (Exception $e) { } catch (Exception $e) {
@@ -439,40 +557,44 @@ if ($action == 'forgotpwd') {
} }
if ($_mailerror) { if ($_mailerror) {
$rstlog = FroxlorLogger::getInstanceOf(array('loginname' => 'password_reset')); $rstlog = FroxlorLogger::getInstanceOf([
$rstlog->logAction(ADM_ACTION, LOG_ERR, "Error sending mail: " . $mailerr_msg); 'loginname' => 'password_reset'
redirectTo('index.php', array('showmessage' => '4', 'customermail' => $user['email'])); ]);
exit; $rstlog->logAction(FroxlorLogger::ADM_ACTION, LOG_ERR, "Error sending mail: " . $mailerr_msg);
Response::redirectTo('index.php', [
'showmessage' => '4',
'customermail' => $user['email']
]);
exit();
} }
$mail->ClearAddresses(); $mail->ClearAddresses();
redirectTo('index.php', array('showmessage' => '1')); Response::redirectTo('index.php', [
exit; 'showmessage' => '1'
]);
exit();
} else { } else {
$rstlog = FroxlorLogger::getInstanceOf(array('loginname' => 'password_reset')); $rstlog = FroxlorLogger::getInstanceOf([
$rstlog->logAction(USR_ACTION, LOG_WARNING, "User '" . $loginname . "' requested to set a new password, but was not found in database!"); 'loginname' => 'password_reset'
$message = $lng['login']['combination_not_found']; ]);
$rstlog->logAction(FroxlorLogger::USR_ACTION, LOG_WARNING, "User '" . $loginname . "' requested to set a new password, but was not found in database!");
$message = lng('login.usernotfound');
} }
unset($user); unset($user);
} }
}
} else { } else {
$message = $lng['login']['usernotfound']; $message = lng('pwdreminder.notallowed');
}
} }
} }
if ($adminchecked) { UI::view('login/fpwd.html.twig', [
if (Settings::Get('panel.allow_preset_admin') != '1') { 'pagetitle' => lng('login.presend'),
$message = $lng['pwdreminder']['notallowed']; 'action' => $action,
unset ($adminchecked); 'message' => $message,
} ]);
} else {
if (Settings::Get('panel.allow_preset') != '1') {
$message = $lng['pwdreminder']['notallowed'];
}
}
eval("echo \"" . getTemplate('fpwd') . "\";");
} }
if ($action == 'resetpwd') { if ($action == 'resetpwd') {
@@ -480,9 +602,10 @@ if ($action == 'resetpwd') {
// Remove old activation codes // Remove old activation codes
$stmt = Database::prepare("DELETE FROM `" . TABLE_PANEL_ACTIVATION . "` $stmt = Database::prepare("DELETE FROM `" . TABLE_PANEL_ACTIVATION . "`
WHERE creation < :oldest" WHERE creation < :oldest");
); Database::pexecute($stmt, [
Database::pexecute($stmt, array("oldest" => time() - 86400)); "oldest" => time() - 86400
]);
if (isset($_GET['resetcode']) && strlen($_GET['resetcode']) == 50) { if (isset($_GET['resetcode']) && strlen($_GET['resetcode']) == 50) {
// Check if activation code is valid // Check if activation code is valid
@@ -494,63 +617,121 @@ if ($action == 'resetpwd') {
if (substr(md5($third . $timestamp), 0, 10) == $check && $timestamp >= time() - 86400) { if (substr(md5($third . $timestamp), 0, 10) == $check && $timestamp >= time() - 86400) {
if (isset($_POST['send']) && $_POST['send'] == 'send') { if (isset($_POST['send']) && $_POST['send'] == 'send') {
$stmt = Database::prepare("SELECT `userid`, `admin` FROM `" . TABLE_PANEL_ACTIVATION . "` $stmt = Database::prepare("SELECT `userid`, `admin` FROM `" . TABLE_PANEL_ACTIVATION . "`
WHERE `activationcode` = :activationcode" WHERE `activationcode` = :activationcode");
); $result = Database::pexecute_first($stmt, [
$result = Database::pexecute_first($stmt, array("activationcode" => $activationcode)); "activationcode" => $activationcode
]);
if ($result !== false) { if ($result !== false) {
if ($result['admin'] == 1) { try {
$new_password = validate($_POST['new_password'], 'new password'); $new_password = Crypt::validatePassword($_POST['new_password'], true);
$new_password_confirm = validate($_POST['new_password_confirm'], 'new password confirm'); $new_password_confirm = Crypt::validatePassword($_POST['new_password_confirm'], true);
} else { } catch (Exception $e) {
$new_password = validatePassword($_POST['new_password'], 'new password'); $message = $e->getMessage();
$new_password_confirm = validatePassword($_POST['new_password_confirm'], 'new password confirm');
} }
if ($new_password == '') { if (empty($message) && (empty($new_password) || $new_password != $new_password_confirm)) {
$message = $new_password; $message = lng('error.newpasswordconfirmerror');
} elseif ($new_password_confirm == '') { }
$message = $new_password_confirm;
} elseif ($new_password != $new_password_confirm) { if (empty($message)) {
$message = $new_password . " != " . $new_password_confirm;
} else {
// Update user password // Update user password
if ($result['admin'] == 1) { if ($result['admin'] == 1) {
$stmt = Database::prepare("UPDATE `" . TABLE_PANEL_ADMINS . "` $stmt = Database::prepare("UPDATE `" . TABLE_PANEL_ADMINS . "`
SET `password` = :newpassword SET `password` = :newpassword
WHERE `adminid` = :userid" WHERE `adminid` = :userid");
);
} else { } else {
$stmt = Database::prepare("UPDATE `" . TABLE_PANEL_CUSTOMERS . "` $stmt = Database::prepare("UPDATE `" . TABLE_PANEL_CUSTOMERS . "`
SET `password` = :newpassword SET `password` = :newpassword
WHERE `customerid` = :userid" WHERE `customerid` = :userid");
);
} }
Database::pexecute($stmt, array("newpassword" => makeCryptPassword($new_password), "userid" => $result['userid'])); Database::pexecute($stmt, [
"newpassword" => Crypt::makeCryptPassword($new_password),
"userid" => $result['userid']
]);
$rstlog = FroxlorLogger::getInstanceOf(array('loginname' => 'password_reset')); $rstlog = FroxlorLogger::getInstanceOf([
$rstlog->logAction(USR_ACTION, LOG_NOTICE, "changed password using password reset."); 'loginname' => 'password_reset'
]);
$rstlog->logAction(FroxlorLogger::USR_ACTION, LOG_NOTICE, "changed password using password reset.");
// Remove activation code from DB // Remove activation code from DB
$stmt = Database::prepare("DELETE FROM `" . TABLE_PANEL_ACTIVATION . "` $stmt = Database::prepare("DELETE FROM `" . TABLE_PANEL_ACTIVATION . "`
WHERE `activationcode` = :activationcode WHERE `activationcode` = :activationcode
AND `userid` = :userid" AND `userid` = :userid");
); Database::pexecute($stmt, [
Database::pexecute($stmt, array("activationcode" => $activationcode, "userid" => $result['userid'])); "activationcode" => $activationcode,
redirectTo('index.php', array("showmessage" => '6')); "userid" => $result['userid']
]);
Response::redirectTo('index.php', [
"showmessage" => '6'
]);
} }
} else { } else {
redirectTo('index.php', array("showmessage" => '7')); Response::redirectTo('index.php', [
"showmessage" => '7'
]);
} }
} }
eval("echo \"" . getTemplate('rpwd') . "\";"); UI::view('login/rpwd.html.twig', [
'pagetitle' => lng('pwdreminder.choosenew'),
'formaction' => 'index.php?action=resetpwd&resetcode=' . $activationcode,
'message' => $message,
]);
} else { } else {
redirectTo('index.php', array("showmessage" => '7')); Response::redirectTo('index.php', [
"showmessage" => '7'
]);
}
} else {
Response::redirectTo('index.php');
}
} }
function finishLogin($userinfo)
{
if (isset($userinfo['userid']) && $userinfo['userid'] != '') {
CurrentUser::setData($userinfo);
$language = $userinfo['def_language'] ?? Settings::Get('panel.standardlanguage');
CurrentUser::setField('language', $language);
if (isset($userinfo['theme']) && $userinfo['theme'] != '') {
$theme = $userinfo['theme'];
} else { } else {
redirectTo('index.php'); $theme = Settings::Get('panel.default_theme');
CurrentUser::setField('theme', $theme);
}
$qryparams = [];
if (isset($_POST['qrystr']) && $_POST['qrystr'] != "") {
parse_str(urldecode($_POST['qrystr']), $qryparams);
}
if ($userinfo['adminsession'] == '1') {
if (Froxlor::hasUpdates() || Froxlor::hasDbUpdates()) {
Response::redirectTo('admin_updates.php?page=overview');
} else {
if (isset($_POST['script']) && $_POST['script'] != "") {
if (preg_match("/customer\_/", $_POST['script']) === 1) {
Response::redirectTo('admin_customers.php', [
"page" => "customers"
]);
} else {
Response::redirectTo($_POST['script'], $qryparams);
}
} else {
Response::redirectTo('admin_index.php', $qryparams);
} }
} }
} else {
if (isset($_POST['script']) && $_POST['script'] != "") {
Response::redirectTo($_POST['script'], $qryparams);
} else {
Response::redirectTo('customer_index.php', $qryparams);
}
}
}
return false;
}

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More