Compare commits

...

765 Commits

Author SHA1 Message Date
Andy Miller
1f21d259ea Merge branch 'release/1.7.43' 2023-10-02 10:41:36 -06:00
Andy Miller
21b218e464 prepare for release 2023-10-02 10:41:26 -06:00
Andy Miller
3b2fb023b8 change version number 2023-10-02 10:36:33 -06:00
Andy Miller
92babda742 updated changelog 2023-10-02 10:30:31 -06:00
pamtbaau
3cdbc5890a Fix url of @import not being rewritten (#3750)
Looks good.  thanks.
2023-10-02 10:04:29 -06:00
Andy Miller
a8042a666c updated composer - fixes #3748 2023-10-02 09:52:50 -06:00
Andy Miller
79f9640b12 move language debug to debugger - fixes #3752 2023-10-02 09:51:22 -06:00
Andy Miller
65aeb82e21 add ability to override modified date via frontmatter 2023-10-02 09:36:22 -06:00
Andy Miller
e3b0aa0c50 inlcude phar in dangerous extensions 2023-08-22 11:57:13 +01:00
Andy Miller
7e617a632e updated security.md 2023-08-22 09:24:41 +01:00
Andy Miller
fb5dd14875 Merge branch 'release/1.7.42.3' 2023-07-18 12:41:08 -06:00
Andy Miller
490bdd6ce7 Merge tag '1.7.42.3' into develop
Release v1.7.42.3
2023-07-18 12:41:08 -06:00
Andy Miller
893b1dd1db prepare for release 2023-07-18 12:40:57 -06:00
Andy Miller
1146959806 fixed a typo 2023-07-18 12:40:27 -06:00
Andy Miller
45103f81b4 Merge branch 'release/1.7.42.2' 2023-07-18 10:50:51 -06:00
Andy Miller
c426f4a9cc Merge tag '1.7.42.2' into develop
Release v1.7.42.2
2023-07-18 10:50:51 -06:00
Andy Miller
0d27f2d77e prepare for release 2023-07-18 10:50:36 -06:00
Andy Miller
b4c62101a4 SSTI attack mitigation - GHSA-9436-3gmp-4f53 2023-07-18 10:49:47 -06:00
Andy Miller
950cd0854f updated vendor libs 2023-06-15 15:32:06 -06:00
Andy Miller
4cd137830b Merge branch 'release/1.7.42.1' 2023-06-15 12:57:56 -06:00
Andy Miller
aa19bcdcbe Merge tag '1.7.42.1' into develop
Release v1.7.42.1
2023-06-15 12:57:56 -06:00
Andy Miller
cf6bf7d1ec prepare for release 2023-06-15 12:57:46 -06:00
Andy Miller
47665dbddb Fixes #3727 - filter field being a closure 2023-06-15 09:03:12 -06:00
Andy Miller
dc209453d0 Merge branch 'release/1.7.42' 2023-06-14 14:19:10 -06:00
Andy Miller
5b89091f13 Merge tag '1.7.42' into develop
Release 1.7.42
2023-06-14 14:19:10 -06:00
Andy Miller
50ee844759 prepare for release 2023-06-14 14:19:00 -06:00
Andy Miller
244758d438 also handle SSTI in reduce twig filter + function 2023-06-14 11:08:17 -06:00
Andy Miller
71bbed12f9 more SSTI fixes in Utils::isDangerousFunction() 2023-06-13 17:57:11 -06:00
Andy Miller
8c2c1cb726 better SSTI in |map and |filter 2023-06-13 17:45:40 -06:00
Andy Miller
9d01140a63 Fix for dangerous tags in |map filter 2023-06-13 17:07:39 -06:00
Andy Miller
259e775db8 Added languages debug option 2023-06-08 14:50:52 -06:00
Andy Miller
d4c617ff19 Merge branch 'release/1.7.41.2' 2023-06-01 15:19:12 -06:00
Andy Miller
c7680bb50a Merge tag '1.7.41.2' into develop
Release v1.7.41.2
2023-06-01 15:19:12 -06:00
Andy Miller
722ce55ccb prepare for release 2023-06-01 15:18:53 -06:00
Andy Miller
5b950ce73f update changelog 2023-06-01 15:17:47 -06:00
Andy Miller
8dfa2110bf fix for special chars in slugs causing redirect loops 2023-06-01 15:16:56 -06:00
Andy Miller
31aeaf6309 improved the Twig Cache Tag with customizable key (lang specific if needed) 2023-05-23 15:54:48 -06:00
Andy Miller
d96b023d72 Merge branch 'release/1.7.41.1' 2023-05-10 08:34:58 -06:00
Andy Miller
4de3cab522 Merge tag '1.7.41.1' into develop
Release v1.7.41.1
2023-05-10 08:34:58 -06:00
Andy Miller
b34f70f91d prepare for release 2023-05-10 08:34:45 -06:00
Andy Miller
9da8cad7fe truncator fix 2023-05-10 08:34:09 -06:00
Andy Miller
e4a30f5966 Merge branch 'release/1.7.41' 2023-05-09 12:44:53 -06:00
Andy Miller
814a050858 Merge tag '1.7.41' into develop
Release v1.7.41
2023-05-09 12:44:53 -06:00
Andy Miller
b6179bd2de prepare for release 2023-05-09 12:44:44 -06:00
Andy Miller
e5ac37e3cf FILTER_SANITIZE_STRING + Toolbox 1.6.5 2023-05-09 12:13:46 -06:00
Andy Miller
66463ddff3 more FILTER_SANITIZE_STRING fixes 2023-05-09 12:13:32 -06:00
Andy Miller
956c2993ae more filter fixes 2023-05-09 11:22:28 -06:00
Andy Miller
3cf67cb2fd deprecation fix 2023-05-09 11:18:36 -06:00
Andy Miller
36afa9d848 won’t work internally in Parsedown 2023-05-08 19:31:37 -06:00
Andy Miller
694ab76d1e added parse_url to the list of Grav Twig functions 2023-05-08 19:03:29 -06:00
Andy Miller
369c2e9ffa remove filter_input in favor of htmlspecialchars + strip_tags 2023-05-08 18:42:52 -06:00
Andy Miller
95ae35216a various cast fixes 2023-05-08 18:41:19 -06:00
Andy Miller
9c0477fa52 fix dynamic class value 2023-05-08 18:41:04 -06:00
Andy Miller
e1ab15e323 another cast fix 2023-05-08 17:44:52 -06:00
Andy Miller
ff77d58acb more casting fixes 2023-05-08 17:37:42 -06:00
Andy Miller
adfbd5730b changelog updated 2023-05-08 17:31:26 -06:00
Andy Miller
bf175983ec various deprecated fixes 2023-05-08 17:31:15 -06:00
Andy Miller
470b69c775 Use new groupNames method 2023-05-08 17:27:54 -06:00
Andy Miller
60648c43db Update to latest getgrav/image package 2023-05-08 17:27:43 -06:00
Andy Miller
75cd4f4306 Various casting fixes for deprecated messages 2023-05-08 17:27:03 -06:00
Andy Miller
2412115f41 TwigDeferredExtension updates 2023-05-08 17:26:22 -06:00
Andy Miller
598836d656 fix parsedown dynamic properties 2023-05-08 12:39:35 -06:00
Andy Miller
e1019c4420 remove FILTER_SANITIZE_STRING as deprecated 2023-05-08 12:21:09 -06:00
Djamil Legato
a8a6c0c520 Better and generic ignore pattern for security.yaml (fixes #3706) 2023-04-06 10:29:35 -07:00
Andy Miller
685d76231a Merge branch 'release/1.7.40' 2023-03-22 11:30:00 -06:00
Andy Miller
0f9b9f780f Merge tag '1.7.40' into develop
Release 1.7.40
2023-03-22 11:30:00 -06:00
Andy Miller
1e2792874d prepare for release 2023-03-22 11:29:52 -06:00
Andy Miller
0a061ce95e bugfix for timestamp logic 2023-03-22 10:18:07 -06:00
Andy Miller
d82ee029e1 updated changelog 2023-03-22 10:09:06 -06:00
Andy Miller
3b83c8204d Merge branch 'develop' of github.com:getgrav/grav into develop 2023-03-22 10:07:18 -06:00
Andy Miller
9ab7a4759a Added timestamp: true|false option for assets 2023-03-22 10:07:14 -06:00
Vilius Šumskas
c261d0d3f7 Fix force_ssl redirect in case of undefined hostname (#3702) 2023-03-17 08:53:45 -06:00
Andy Miller
940415dddb updated changelog 2023-03-07 10:47:55 -07:00
Andy Miller
60506e6f34 fixed duplicate page paths 2023-03-07 10:45:01 -07:00
Djamil Legato
bd7a74d79e Coerce ignore validation to array to cover both array/non-array values 2023-03-06 11:01:15 -08:00
Djamil Legato
5fcf690918 Fixed BlueprintSchema:flattenData to properly handle ignored fields 2023-03-06 10:40:36 -08:00
Anael Mobilia
904ec46a9f Update robots.txt reflecting actual folders (#3625)
* Update robots.txt

"grav" folder no longer exists

* Add folders now existing
2023-03-06 10:21:03 -07:00
Vilius Šumskas
259c148edb Fix whoami command usage (#3695)
Passing process as a string is deprecated since Symfony 4.2.
2023-03-06 10:19:23 -07:00
Rotzbua
0ae980062f Remove outdated setting xcache (#3615)
Already removed in commit ba2c37c216
2023-03-06 10:18:57 -07:00
Ari Cooper Davis
a888f19ad1 Fix LogViewer regex to reduce greediness (#3684) 2023-03-06 09:25:12 -07:00
Andy Miller
479b89134d Update composer.json 2023-02-23 18:46:44 -07:00
Andy Miller
d0d083d985 not just 7.3! 2023-02-23 18:01:01 -07:00
Andy Miller
396b412dda Merge tag '1.7.39.4' into develop
Release v1.7.39.4
2023-02-22 09:20:28 -07:00
Andy Miller
8be02e44c6 Merge branch 'release/1.7.39.4' 2023-02-22 09:20:27 -07:00
Andy Miller
ec115a6a64 prepare for release 2023-02-22 09:20:07 -07:00
Andy Miller
3b92c1aca4 updated changelog 2023-02-22 09:19:24 -07:00
Andy Miller
2d9df03766 Revert "move account info under account section"
This reverts commit 1fae4504a2.
2023-02-22 09:16:54 -07:00
Andy Miller
f086f84ff2 Merge branch 'release/1.7.39.3' 2023-02-21 15:12:34 -07:00
Andy Miller
a2b23ad80e Merge tag '1.7.39.3' into develop
Release 1.7.39.3
2023-02-21 15:12:34 -07:00
Andy Miller
88350d9090 prepare for release 2023-02-21 15:12:24 -07:00
Andy Miller
b2f27fbdf2 cleaner fix for template bug 2023-02-21 12:55:50 -07:00
Andy Miller
72b769aa63 fix for rendering specific templates fixes #3698 2023-02-21 09:39:14 -07:00
Andy Miller
8a7e38751a Merge branch 'release/1.7.39.2' 2023-02-20 14:31:42 -07:00
Andy Miller
3e6c719441 Merge tag '1.7.39.2' into develop
Release v1.7.39.2
2023-02-20 14:31:42 -07:00
Andy Miller
8efb000801 prepare for release 2023-02-20 14:31:30 -07:00
Andy Miller
6d6e92048e flex accounts session fix 2023-02-20 14:02:13 -07:00
Andy Miller
8c365d45a4 Merge branch 'release/1.7.39.1'
# Conflicts:
#	CHANGELOG.md
2023-02-20 11:52:11 -07:00
Andy Miller
ee6448c307 prepare for release 2023-02-20 11:51:36 -07:00
Andy Miller
f8c9e9ada4 css fix for phpdebugbar 2023-02-20 11:49:47 -07:00
Andy Miller
87ab3ae4a7 Fix for debugbar rendering 2023-02-20 10:01:30 -07:00
Andy Miller
68dc461bc0 Merge tag '1.7.39' into develop
Release v1.7.39
2023-02-19 14:52:00 -07:00
Andy Miller
4dd98610a4 Merge branch 'release/1.7.39' 2023-02-19 14:51:59 -07:00
Andy Miller
0358e55aed Merge branch 'master' into develop 2023-02-19 14:51:07 -07:00
Andy Miller
9e5ed10925 typo in types 2023-02-19 14:50:16 -07:00
Andy Miller
3b7eb198cf Merge tag '1.7.39' into develop
Release v1.7.39
2023-02-19 14:44:21 -07:00
Andy Miller
81ed7379a9 Merge branch 'release/1.7.39' 2023-02-19 14:44:21 -07:00
Andy Miller
e1950e985b prepare for release 2023-02-19 14:44:10 -07:00
Andy Miller
84c61af807 updated changelog 2023-02-19 14:43:34 -07:00
Andy Miller
93755c7329 fix UtilsTest for PHPUnit 10 2023-02-19 13:48:13 -07:00
Andy Miller
5329918e2f Merge branch 'develop' of github.com:getgrav/grav into develop 2023-02-19 13:27:58 -07:00
Andy Miller
efd7726646 update packages 2023-02-19 13:27:52 -07:00
Rotzbua
4c762c0ac3 add php 8.2 to test (#3662)
now released https://www.php.net/releases/8.2/en.php
2023-02-19 13:27:19 -07:00
Andy Miller
81a911572c more PHP 8.2 fixes 2023-02-19 13:26:17 -07:00
Andy Miller
c56bb86b61 php 8.2 fixes 2023-02-19 12:07:58 -07:00
Andy Miller
ea010f19f0 Fix for bad rendering of modules 2023-02-17 16:00:46 -07:00
Andy Miller
1fae4504a2 move account info under account section 2023-02-15 15:24:03 -07:00
Andy Miller
d99c84d9f8 empty date to avoid confusion 2023-02-10 15:26:15 -07:00
Andy Miller
c732bfaeef Merge branch 'develop' of github.com:getgrav/grav into develop 2023-01-11 16:16:57 -07:00
Andy Miller
4f0fee684a fix for email validation 2023-01-11 16:16:52 -07:00
Daniel Mason
884faa91bb Update php-fpm socket file to use generic socket file instead of pinning to version (#3669) 2023-01-02 16:19:05 -07:00
Andy Miller
8c261a05cc Merge tag '1.7.38' into develop
Release v1.7.38
2023-01-02 11:24:06 -07:00
Andy Miller
95aa57ca50 Merge branch 'release/1.7.38' 2023-01-02 11:24:05 -07:00
Andy Miller
0bc0e58707 prepare for release 2023-01-02 11:23:56 -07:00
Andy Miller
a86e0d4b96 Update copyright date 2023-01-02 11:09:32 -07:00
Andy Miller
44c819b021 Added new onBeforeSessionStart() Event 2023-01-02 10:46:32 -07:00
Andy Miller
3f13d81c6f Get around a bug where messages were not always being set on session during redirect 2023-01-01 13:10:58 -07:00
Andy Miller
720a965c7e update changelog 2022-12-02 12:23:04 -07:00
Alex
f0e263a404 GitHub Workflows security hardening (#3624)
* build: harden build.yaml permissions

Signed-off-by: Alex <aleksandrosansan@gmail.com>

* build: harden trigger-skeletons.yml permissions

Signed-off-by: Alex <aleksandrosansan@gmail.com>

* build: harden tests.yaml permissions

Signed-off-by: Alex <aleksandrosansan@gmail.com>

Signed-off-by: Alex <aleksandrosansan@gmail.com>
2022-11-30 17:13:49 -08:00
Andy Miller
ad33a63ad2 Revert "dont’ fail hard if pages recurse with same path"
This reverts commit 9c5b8b6496.

# Conflicts:
#	system/src/Grav/Common/Page/Pages.php
2022-10-25 18:20:08 -06:00
Andy Miller
f7b7f3337d fix 2022-10-25 18:01:42 -06:00
Andy Miller
983fcc5e40 Merge branch 'develop' of github.com:getgrav/grav into develop 2022-10-25 17:47:08 -06:00
Andy Miller
9c5b8b6496 dont’ fail hard if pages recurse with same path 2022-10-25 17:47:03 -06:00
Djamil Legato
71fc4eb16b Added .env and .gravenv to gitignore, most likely you don't want them pushed 2022-10-10 14:32:25 -07:00
Andy Miller
ea2858ea2b Merge branch 'develop' of github.com:getgrav/grav into develop 2022-10-05 15:10:37 -06:00
Andy Miller
d080578e83 Upgrade composer to 2.4.2 - fixes #3627 2022-10-05 15:10:32 -06:00
Andy Miller
8427eb6d3e Upgrade composer to 2.4.2 - fixes #3637 2022-10-05 15:09:58 -06:00
Andy Miller
e3a342dabd Merge tag '1.7.37.1' into develop
Release v1.7.37.1
2022-10-05 15:06:23 -06:00
Andy Miller
00b13d1093 Merge branch 'release/1.7.37.1' 2022-10-05 15:06:22 -06:00
Andy Miller
7e5ff71623 prepare for release 2022-10-05 15:06:11 -06:00
Andy Miller
72ba7ccab6 Merge tag '1.7.37' into develop
Release v1.7.37
2022-10-05 11:31:48 -06:00
Andy Miller
ea9c9fdca8 Merge branch 'release/1.7.37' 2022-10-05 11:31:48 -06:00
Andy Miller
5e379bfa39 prepare for release 2022-10-05 11:31:38 -06:00
Matias Griese
fb1e31d0e4 Force user index file to be updated to fix email addresses [getgrav/grav-plugin-login#229] 2022-10-05 19:16:18 +03:00
Andy Miller
8e6b823833 massive change! 2022-10-05 06:38:32 -06:00
Andy Miller
6fcc4ec5d0 Added Pages:: getSimplePagesHash() method 2022-10-05 06:34:16 -06:00
Andy Miller
3e9866920b updated changelog 2022-10-04 17:59:01 -06:00
Andy Miller
3a00ca0457 temp workaround for windows issue - Fixes #2299 2022-10-04 17:55:21 -06:00
Andy Miller
2f6e4b1ad8 Merge branch 'feature/multiple-page-paths' into develop 2022-10-04 11:46:08 -06:00
Andy Miller
01d627e8f7 composer update 2022-10-04 11:45:41 -06:00
Andy Miller
51a386e252 Fix bad default page stream 2022-09-22 17:40:35 -06:00
Andy Miller
30502e8042 fixed composer.json 2022-09-22 12:38:27 -06:00
Andy Miller
01264ef70d initial commit 2022-09-22 12:36:36 -06:00
Andy Miller
de642df06e Added new onPageHeaders() event 2022-09-13 14:28:58 -06:00
Andy Miller
dd8945124e Merge branch 'release/1.7.36' 2022-09-08 11:59:58 -06:00
Andy Miller
0b6428ec29 Merge tag '1.7.36' into develop
Release v1.7.36
2022-09-08 11:59:58 -06:00
Andy Miller
840862c26d prepare for release 2022-09-08 11:59:44 -06:00
Matias Griese
f799a71001 Fixed loggin with a capitalised email address when using old users [getgrav/grav-plugin-login#229] 2022-09-05 21:14:37 +03:00
Matias Griese
3f10c05840 Added support for flex-ignore@ to hide all the nested fields in the blueprint 2022-09-02 19:36:22 +03:00
Matias Griese
dbca0b451c Typo 2022-09-02 19:02:32 +03:00
Matias Griese
6882037b85 Added authorize-*@: support for Flex blueprints 2022-09-02 13:16:19 +03:00
Matias Griese
5d2dc6c329 Composer update 2022-08-18 13:24:34 +03:00
Andy Miller
e9f28ab824 Merge tag '1.7.35' into develop
Release v1.7.35
2022-08-04 15:29:36 -06:00
Andy Miller
186eb8ae6c Merge branch 'release/1.7.35' 2022-08-04 15:29:35 -06:00
Andy Miller
2258adcb05 prepare for release 2022-08-04 15:29:22 -06:00
Andy Miller
20c4cdefe8 minor vendor updates 2022-07-26 12:16:23 -06:00
Matias Griese
aba6382f2e Added variables $environment (string), $request (PSR-7 ServerRequestInterface|null) and $uri (PSR-7 Uri|null) to be used in setup.php 2022-06-30 12:56:31 +03:00
Matias Griese
32dd550178 Fixed FlexDirectory::reloadIndex() to actually get the items from the filesystem 2022-06-29 21:32:50 +03:00
Matias Griese
ec3175fc89 Changelog update 2022-06-29 13:11:14 +03:00
Matias Griese
dac1614306 Composer update 2022-06-29 13:10:26 +03:00
Matias Griese
37e92e4f55 Merge branch 'feature/api' of github.com:getgrav/grav into develop 2022-06-29 13:07:19 +03:00
Matias Griese
1b0c3d1fce Fix phpstan error 2022-06-29 13:06:43 +03:00
Matias Griese
00cb9c3540 Make the new relationships code to work in PHP 7.3 2022-06-29 12:45:16 +03:00
Paweł Bogusławski
b9800b7c35 Allow to configure syslog tag (#3596)
* Allow to configure syslog tag

Author-Change-Id: IB#1120629

* Update InitializeProcessor.php
2022-06-15 10:38:59 -06:00
Matias Griese
b5ab00639b Merge branch 'develop' of github.com:getgrav/grav into feature/api 2022-06-15 14:38:39 +03:00
Andy Miller
cf38cccda1 Merge branch 'release/1.7.34' 2022-06-14 11:09:32 -06:00
Andy Miller
024964eafb Merge tag '1.7.34' into develop
Release v1.7.34
2022-06-14 11:09:32 -06:00
Andy Miller
f8d736b24a prepare for release 2022-06-14 11:09:20 -06:00
Matias Griese
62c4f3c768 Ignore phpstan error 2022-06-14 20:08:04 +03:00
Matias Griese
31920bb153 Composer update 2022-06-14 19:57:42 +03:00
Matias Griese
b18b49a239 Fixed login and user search by email not being case-insensitive when using Flex Users 2022-06-14 10:43:46 +03:00
Matias Griese
9d6a2dba09 Fixed Twig |filter() allowing code execution 2022-06-13 21:11:33 +03:00
Matias Griese
de4af5dbcc Fixed bin/grav install command with arbitrary destination folder name 2022-06-13 20:38:16 +03:00
Matias Griese
f31541250f Fixed broken phpstan tests 2022-06-13 19:29:42 +03:00
Matias Griese
f570cea3bd Fixed alias class references 2022-06-13 19:19:00 +03:00
Matias Griese
0b54a7b4bc Ignore upcoming media.json file in media 2022-06-13 18:22:03 +03:00
Matias Griese
f464492582 Composer update 2022-06-10 11:51:28 +03:00
Matias Griese
81aa4601e4 Changelog update 2022-06-06 11:37:10 +03:00
Yankl-Peretz Blum
6b57f29511 Add Eastern Yiddish
'yi' actually refers to a macrolanguage. The only language in current use in this category is Eastern Yiddish, with language code 'ydd'
2022-06-06 11:14:17 +03:00
yankl
74296a80d0 Add back Yiddish to Language Codes 2022-06-06 11:14:17 +03:00
Matias Griese
8dbc394ae7 Composer update 2022-05-20 16:42:06 +03:00
Matias Griese
89709a7190 Merge branch 'develop' of github.com:getgrav/grav into feature/api
 Conflicts:
	CHANGELOG.md
	composer.lock
2022-05-20 16:41:30 +03:00
Matias Griese
e6320fa327 Changelog update (typo) 2022-05-20 16:40:54 +03:00
Matias Griese
3bf979bd0f Changelog update 2022-05-20 15:57:03 +03:00
Matias Griese
6fa96ca554 Regression: Fixed saving page with a new language causing cache corruption [#2282] 2022-05-20 15:55:38 +03:00
Matias Griese
60ce105fa5 Improved flash media handling in MediaIdentifier 2022-05-20 11:58:09 +03:00
Matias Griese
ec16b5184e Fixed creating empty uploaded file 2022-05-20 10:59:53 +03:00
Matias Griese
a7a9b5d132 Fixed a potential fatal error when using watermark in images 2022-05-13 17:04:56 +03:00
Matias Griese
460ca49f9b Composer update 2022-05-06 17:34:00 +03:00
Matias Griese
32a486f1d4 Added ToManyRelationship::getNthIdentifier() 2022-05-05 11:03:06 +03:00
Matias Griese
1237f0a6d6 Added support for multipart/form-data content type in PUT and PATCH requests 2022-05-04 14:45:59 +03:00
Matias Griese
9ec3e7d731 Minor fix on account relationships 2022-05-03 16:28:02 +03:00
Matias Griese
d6dcd96301 Added relationships support for user accounts 2022-05-03 13:18:57 +03:00
Matias Griese
2957077935 Added relationship logic for flex 2022-05-03 10:27:50 +03:00
Matias Griese
6ba1cff114 Added classes for defining relationships 2022-04-28 13:55:25 +03:00
Matias Griese
6218a4b366 Revert accidental PHP requirement update 2022-04-26 12:30:34 +03:00
Matias Griese
28c4305d46 Composer update 2022-04-26 09:09:14 +03:00
Andy Miller
a2413718f3 Merge branch 'release/1.7.33' 2022-04-25 14:52:04 -06:00
Andy Miller
767a17bf50 Merge tag '1.7.33' into develop
Release v1.7.33
2022-04-25 14:52:04 -06:00
Andy Miller
d75c87ca5e prepare for release 2022-04-25 14:51:51 -06:00
Andy Miller
c2a8145f2c prepare for release 2022-04-25 14:50:34 -06:00
Matias Griese
26e4768bc5 Fixed default collection ordering in pages admin 2022-04-25 18:27:21 +03:00
Matias Griese
4464f29169 Composer update 2022-04-19 10:56:41 +03:00
Matias Griese
2ea39309b6 Composer update 2022-03-31 11:30:35 +03:00
Matias Griese
1c0ed43afa Fixed XSS check not detecting onX events without quotes 2022-03-30 13:26:11 +03:00
Matias Griese
a092aed4ed When saving yaml and markdown, create also a cached version of the file and recompile it in opcache 2022-03-30 12:00:59 +03:00
Matias Griese
7c2b21fb60 Fixed missing changes in yaml & markdown files if saved multiple times during the same second because of a caching issue 2022-03-29 21:35:02 +03:00
Andy Miller
e1ca3c2f70 Merge tag '1.7.32' into develop
Release v1.7.32
2022-03-28 11:36:58 -06:00
Andy Miller
0da5ccb3e1 Merge branch 'release/1.7.32' 2022-03-28 11:36:57 -06:00
Andy Miller
2830ba9120 prepare for release 2022-03-28 11:36:48 -06:00
Matias Griese
5a355fb94e Fixed page search not working with selected language [#3316] 2022-03-25 10:33:05 +02:00
Matias Griese
b0add67cdd Flex search() optimizations 2022-03-25 10:32:34 +02:00
Matias Griese
236c38e65d Changelog update 2022-03-23 15:49:12 +02:00
Matias Griese
c9c23c6c4f Better fix for system.cache.gzip: true 2022-03-23 15:47:45 +02:00
Matias Griese
8f0443a73d Fixed phpstan issues, composer update 2022-03-23 13:05:54 +02:00
Matias Griese
c9271c80a7 Create method cleanOutputBuffers() and use it 2022-03-23 10:49:19 +02:00
Andy Miller
62d9db7650 gzip fixes for downloading 2022-03-22 17:30:55 -06:00
Matias Griese
4f7dad2872 Changelog update 2022-03-21 12:21:12 +02:00
Andy Miller
57d6be0f78 Expose parse_url via parseurl() Twig function 2022-03-20 19:02:36 -06:00
Andy Miller
ae55b4794f Fix for multi-lang issues with Security report 2022-03-20 18:22:12 -06:00
Andy Miller
d82851af10 changelog updated 2022-03-18 13:18:54 -06:00
Andy Miller
730231b8b7 Merge branch 'develop' of github.com:getgrav/grav into develop 2022-03-18 13:15:44 -06:00
Andy Miller
82015d4ae7 gzip enabled breaking in close() 2022-03-18 13:15:37 -06:00
Matias Griese
4376c8ce57 Better multi-byte support for replace_last() filter 2022-03-18 20:39:10 +02:00
Matias Griese
aa1e1bc0ad Optimization for Utils::url() 2022-03-18 20:38:33 +02:00
Matias Griese
35d4d00429 Better fix for multilang URLs in Utils::url() 2022-03-17 16:55:34 +02:00
Matias Griese
3e7f67f589 Set default maximum length for text fields 2022-03-17 13:04:06 +02:00
Matias Griese
c08341046b Added |replace_last(search, replace) filter 2022-03-17 12:15:05 +02:00
Andy Miller
010753bdd6 typo 2022-03-16 14:29:05 -06:00
Andy Miller
d36bc4b8a2 Fix for multilang URLs in Utils::url() 2022-03-16 14:28:07 -06:00
Andy Miller
847f09a2ac Merge branch 'release/1.7.31' 2022-03-14 11:34:43 -06:00
Andy Miller
28469a6bf6 Merge tag '1.7.31' into develop
Release v1.7.31
2022-03-14 11:34:43 -06:00
Andy Miller
0d19bc6e97 prepare for release 2022-03-14 11:34:33 -06:00
Matias Griese
492cc1d2f1 Added XSS check for uploaded SVG files before they get stored (in Form plugin) 2022-03-14 18:55:56 +02:00
Matias Griese
4d4efb31e3 Escape root url pattern in Utils::url() 2022-03-09 12:25:46 +02:00
Andy Miller
c7bc5f5b59 hash for multiavatar only 2022-03-08 14:00:06 -07:00
Andy Miller
41b8fbb0e0 Update changelog + Accounts in sidebar 2022-03-08 10:45:44 -07:00
Djamil Legato
e60ba13d75 Fixed issue with URL method not escaping subpaths slashes 2022-03-08 09:32:28 -08:00
Matias Griese
e0deeeb551 Make new avatar logic more robust 2022-03-08 19:15:46 +02:00
Matias Griese
499b25aad8 Composer update 2022-03-08 19:07:55 +02:00
Andy Miller
9fd580c49b Alternative Multiavatar Approach (#3551)
* Support multiavatar by default

* Support custom hash string
2022-03-08 09:45:41 -07:00
Andy Miller
e09bae918c fix for empty $root 2022-03-05 11:20:54 -07:00
Andy Miller
0abde01442 better fix 2022-03-05 09:22:12 -07:00
Andy Miller
03f71fa49d rolled back but fixed the Utils::url() functionality 2022-03-04 15:37:03 -07:00
Andy Miller
4f92568171 Added system config option legacy_url_root_behavior 2022-03-03 13:16:48 -07:00
Andy Miller
b80fcca0cf fixes for Utils::url() 2022-03-03 12:35:17 -07:00
Andy Miller
879eb27540 updated changelog 2022-03-03 11:21:36 -07:00
Andy Miller
7b7235297e Merge branch 'develop' of github.com:getgrav/grav into develop 2022-03-03 11:21:06 -07:00
Andy Miller
34ab8408fa fix for url() function breaking when path contains root 2022-03-03 11:21:03 -07:00
Matias Griese
f19297d5f7 Added XSS check for uploaded SVG files before they get stored 2022-03-02 13:37:51 +02:00
Matias Griese
78b8051627 Fixed avatar save location when account:// stream points to custom directory 2022-03-02 12:24:27 +02:00
Djamil Legato
3dd0cabeac Fixed entity sanitization for XSS detection 2022-02-23 14:57:36 -08:00
Matias Griese
b992d7f185 Composer update 2022-02-22 11:33:27 +02:00
Matias Griese
a7e82f279a Fixed non-standard video html atributes generated by {{ media.html() }} [#3540] 2022-02-22 11:30:33 +02:00
Matias Griese
6d0d6c22d3 Fixed new Utils::pathinfo() and Utils::basename() being too strict for legacy use [#3542] 2022-02-22 09:46:29 +02:00
Matias Griese
7e52112b21 Fixed phpstan issues (All level 2, Framework level 5) 2022-02-19 12:01:50 +02:00
xaver
a900b89795 Remove variable duplicate (#3539) 2022-02-18 08:39:20 -07:00
Xaver Maierhofer
cad8510dae Merge index exceptions with same handling 2022-02-16 15:52:26 +02:00
Matias Griese
7cafeb2870 Composer update 2022-02-16 09:53:11 +02:00
Matias Griese
b3b5fca16c Fixed 'mbstring' extension is not loaded error, use Polyfill instead [#3504] 2022-02-14 09:38:22 +02:00
Matias Griese
ec884997ef Improve vector image code [#3533] 2022-02-12 10:49:52 +02:00
Matias Griese
3a45748ce6 Added auto_sizes support for SVG vector images [#3533] 2022-02-12 10:41:34 +02:00
Xaver Maierhofer
c4e10cf59f Add Vector image auto_sizes support 2022-02-12 10:26:18 +02:00
Matias Griese
2c252c43b4 Composer update 2022-02-08 12:15:17 +02:00
Matias Griese
382756f79b Fixed pimple link #3527 2022-02-08 08:40:59 +02:00
Andy Miller
11013cbb57 Merge branch 'release/1.7.30' 2022-02-07 12:12:11 -07:00
Andy Miller
2377be9a2b Merge tag '1.7.30' into develop
Release v1.7.30
2022-02-07 12:12:11 -07:00
Andy Miller
b1938c9790 prepare for release 2022-02-07 12:12:03 -07:00
Rotzbua
5d842349e5 add composer suggestion for exif extension 2022-02-07 13:43:23 +02:00
Rotzbua
0323a898cb Normalize variable names 2022-02-07 11:20:16 +02:00
Rotzbua
d275532cf8 Fix documentation of return type 2022-02-07 11:20:16 +02:00
Matias Griese
7306f164e9 Fixed groups filter not matching against readableName [getgrav/grav-plugin-admin#2224] 2022-02-07 10:30:25 +02:00
Matias Griese
3ca58e9ae1 Composer update 2022-02-07 10:11:45 +02:00
Matias Griese
88219fbf0e Fixed accounts filter only matches against email address [getgrav/grav-plugin-admin#2224] 2022-02-07 10:07:00 +02:00
Djamil Legato
5eefc91781 Fixed "Page Authors" field in Security tab, wrongly loading and saving the value (fixes #3525) 2022-02-04 11:23:09 -08:00
Matias Griese
67ef9b221a Fixed error while deleting retina image in admin 2022-02-04 19:58:23 +02:00
Matias Griese
c82a35cea0 Added twig filter |field_parent to get parent field name 2022-02-03 19:51:46 +02:00
Matias Griese
840441bc9b Composer update 2022-02-03 19:50:02 +02:00
Andy Miller
9556e47874 Merge branch 'release/1.7.29.1' 2022-01-31 11:52:21 -07:00
Andy Miller
45fd533186 Merge tag '1.7.29.1' into develop
Release v1.7.29.1
2022-01-31 11:52:21 -07:00
Andy Miller
5248519c37 prepare for release 2022-01-31 11:52:12 -07:00
Matias Griese
5b9a0fb237 Fixed Call to undefined method error when upgrading from Grav 1.6 [#3523] 2022-01-31 11:26:35 +02:00
Matias Griese
389ffe1c7a Composer update 2022-01-31 11:20:09 +02:00
Andy Miller
7b39a1bd8f Merge branch 'release/1.7.29' 2022-01-28 13:08:43 -07:00
Andy Miller
4c5c5925b2 Merge tag '1.7.29' into develop
Release v1.7.29
2022-01-28 13:08:43 -07:00
Andy Miller
96df7deaf4 prepare for release 2022-01-28 13:08:36 -07:00
Matias Griese
7666651324 Fixed error on thumbnail image creation 2022-01-28 19:13:26 +02:00
Djamil Legato
b9db2f3322 Fixed MimeType for gzip (application/x-gzip) 2022-01-27 16:24:50 -08:00
Matias Griese
84a1ab6ca5 Added unicode-safe Utils::basename() and Utils::pathinfo() methods and use them everywhere 2022-01-26 13:54:33 +02:00
Matias Griese
3b89377570 Improved Filesystem::basename() and Filesystem::pathinfo() to be UTF-8 safe 2022-01-26 13:16:35 +02:00
Matias Griese
c3c31880b0 Added support for registering assets from HtmlBlock 2022-01-26 11:06:05 +02:00
Andy Miller
52449246e5 Merge branch 'release/1.7.28' 2022-01-24 11:40:47 -07:00
Andy Miller
b03de18304 Merge tag '1.7.28' into develop
Release v1.7.28
2022-01-24 11:40:47 -07:00
Andy Miller
9bb6f5366e prepare for release 2022-01-24 11:40:25 -07:00
Matias Griese
d126d1b656 Composer update 2022-01-21 11:32:29 +02:00
Matias Griese
6f2fa9311a Fixed XSS check not detecting escaped &#58 2022-01-18 12:34:52 +02:00
Matias Griese
61061220d7 Compoer update, fixed phpstan errors 2022-01-17 09:37:59 +02:00
Matias Griese
aa7e64f2b7 Merge remote-tracking branch 'origin/develop' into develop
# Conflicts:
#	CHANGELOG.md
2022-01-14 11:25:40 +02:00
Matias Griese
b58210de1a Added HtmlBlock support for {% style %}, {% script %} and {% link %} tags 2022-01-14 11:25:21 +02:00
Andy Miller
0bb52c75ce page-level override for redirect_default_route 2022-01-13 06:20:38 -07:00
Matias Griese
da6b41f8a6 Added twig tag for links: {% link icon 'theme://images/favicon.png' priority: 20 with { type: 'image/png' } %} 2022-01-13 13:06:19 +02:00
Matias Griese
1ab2f7083c Added module support for twig script tag: {% script module 'theme://js/module.mjs' %} 2022-01-13 12:52:23 +02:00
Matias Griese
707710d679 Added links and modules support to HtmlBlock class 2022-01-13 12:24:05 +02:00
Andy Miller
bab83ed977 Merge branch 'release/1.7.27.1' 2022-01-12 15:26:38 -07:00
Andy Miller
c103efea22 Merge tag '1.7.27.1' into develop
Release v1.7.27.1
2022-01-12 15:26:38 -07:00
Andy Miller
3e784a2f15 prepare for release 2022-01-12 15:26:29 -07:00
Andy Miller
21f76a1e34 Fixed typo causing ; to join files in CSS 2022-01-12 15:23:28 -07:00
Andy Miller
a8c4e730f6 Merge branch 'release/1.7.27' 2022-01-12 12:31:42 -07:00
Andy Miller
c1a9a7d648 Merge tag '1.7.27' into develop
Release v1.7.27
2022-01-12 12:31:42 -07:00
Andy Miller
d329df2bb0 prepare for release 2022-01-12 12:31:34 -07:00
Andy Miller
f90232e511 typo 2022-01-12 12:29:43 -07:00
Andy Miller
57bd3c9cb5 fixed js module import when pipelined 2022-01-12 12:21:18 -07:00
Andy Miller
419692b9e4 Merge branch 'develop' of github.com:getgrav/grav into develop 2022-01-12 11:10:16 -07:00
Andy Miller
b422d9585c small size for field 2022-01-12 11:10:12 -07:00
Matias Griese
67b9623d6c Numeric sort for sizes: MediaObjectTrait::getAlternatives() 2022-01-12 13:29:18 +02:00
Matias Griese
bda6b26896 Added Medium::getAlternatives() to be able to list all the retina sizes 2022-01-12 12:00:41 +02:00
Andy Miller
9b2af98b0b Merge branch 'develop' of github.com:getgrav/grav into develop 2022-01-11 12:03:22 -07:00
Andy Miller
b07bf96ad9 Support for YubiKey OTP 2-Factor authenticator 2022-01-11 12:03:13 -07:00
Rotzbua
fb2c4f48f7 add php 8.1 to test (#3504)
now released https://www.php.net/releases/8.1/en.php
2022-01-11 09:55:45 -07:00
pmoreno.rodriguez
308383b093 Update README.md (#3517)
Changed the Twig Templating address to https://twig.symfony.com/.
2022-01-11 09:55:24 -07:00
Matias Griese
f8f5502c40 Added Media::getRoute() and Media::getRawRoute() methods to get page route if available 2022-01-11 14:34:35 +02:00
Matias Griese
55b45fcf2f Fixed scaled image medium filename when using non-existing retina file 2022-01-10 22:12:09 +02:00
Matias Griese
bd471cb61b Added Utils::getExtensionsByMime() method to get all the registered extensions for the specific mime type 2022-01-10 19:40:00 +02:00
Andy Miller
2ac38d39ea updated changelog 2022-01-09 21:24:45 -07:00
Andy Miller
7bb8d10b22 Asset blueprint refactor 2022-01-09 21:23:19 -07:00
Andy Miller
f9fcdd6c51 Revert "simplify asset collections in a single array"
This reverts commit 756b088ada.

# Conflicts:
#	system/src/Grav/Common/Assets.php
2022-01-09 21:12:39 -07:00
Andy Miller
3febaaa802 minor method typo 2022-01-09 17:03:03 -07:00
Andy Miller
178cc9c5ea Merge branch 'feature/js-module-assets' into develop 2022-01-09 16:23:37 -07:00
Andy Miller
8d51911873 updated changelog 2022-01-09 16:22:35 -07:00
Andy Miller
99ceb40c5f improvements 2022-01-09 16:14:20 -07:00
Andy Miller
8767bfb9b0 refactoring and generic link support 2022-01-09 15:51:00 -07:00
Andy Miller
756b088ada simplify asset collections in a single array 2022-01-09 14:35:16 -07:00
Andy Miller
c962201bae initial js module support in assets 2022-01-09 13:29:40 -07:00
Matias Griese
2335271472 Second attempt to fix CLI --env, now works with bin/plugins 2022-01-07 21:42:25 +02:00
Matias Griese
47d7927bac Improved onPageFallBackUrl event 2022-01-06 18:10:24 +02:00
Matias Griese
d15542e553 SVG files do not have higher quality alternative 2022-01-06 16:01:53 +02:00
Matias Griese
e6447f7203 Improved Utils::download() method to allow overrides on download name, mime and expires header 2022-01-06 15:36:29 +02:00
Djamil Legato
fbcaf991aa cleanup 2022-01-05 12:00:12 -08:00
Matias Griese
cc8ec10098 Fixed CLI --env and --lang options having no effect if they aren't added before all the other options 2022-01-05 19:52:57 +02:00
Andy Miller
92824f44e6 Merge branch 'release/1.7.26.1' 2022-01-04 11:01:33 -07:00
Andy Miller
c4eefc13a7 Merge tag '1.7.26.1' into develop
Release v1.7.26.1
2022-01-04 11:01:33 -07:00
Andy Miller
d541808604 prepare for release 2022-01-04 11:01:21 -07:00
Matias Griese
231c8a0f4c Fixed UserObject::getAccess() after cloning the object 2022-01-04 18:47:45 +02:00
Andy Miller
ea39587329 Merge branch 'release/1.7.26' 2022-01-03 09:50:49 -07:00
Andy Miller
8f3ac75afd Merge tag '1.7.26' into develop
Release v1.7.26
2022-01-03 09:50:49 -07:00
Andy Miller
b40b543790 prepare for release 2022-01-03 09:50:34 -07:00
Andy Miller
3b7921b698 updated copyright year 2022-01-03 09:14:00 -07:00
Matias Griese
6af1ee48a5 Fixed PHP 8.1 issue in Media, minor optimization 2022-01-03 16:38:11 +02:00
Matias Griese
4519971a76 Fixed Flex directory configuration creating environment configuration when it should not 2021-12-22 21:28:26 +02:00
Matias Griese
26295d5cf2 Fixed FlexIndex::call() to return null instead of failing to call undefined method 2021-12-20 14:46:20 +02:00
Andy Miller
bfc9e26f26 renamed method 2021-12-18 17:53:19 -07:00
Andy Miller
d939b1e563 Merge branch 'develop' of github.com:getgrav/grav into develop 2021-12-18 17:46:59 -07:00
Andy Miller
8343cfb278 new Plugin::upstreamConfigVar 2021-12-18 17:46:55 -07:00
Matias Griese
290a28109e When symlinking Grav install, include also tests 2021-12-17 19:42:02 +02:00
Matias Griese
5bec5db5e1 Fixed Plugin::config() returning null in some cases 2021-12-16 14:25:51 +02:00
Matias Griese
a6fb0a14f0 Fix bad docblocks 2021-12-16 13:59:13 +02:00
Matias Griese
7cb62ddc75 Merge remote-tracking branch 'origin/develop' into develop 2021-12-16 13:55:43 +02:00
Matias Griese
0f85b831b5 Minor fixes 2021-12-16 13:55:36 +02:00
dani
530e6a4399 Update pages.yaml
i believe this is a mistake, the unclosed `<small>` tag is rendering the entire form this way.
2021-12-16 11:16:58 +02:00
dani
c7700c2e16 Update es.yaml
missing accents
2021-12-16 11:16:58 +02:00
Matias Griese
89acc59ac3 Improved UserObject cloning 2021-12-16 10:57:10 +02:00
Matias Griese
9a25c88471 Merge remote-tracking branch 'origin/develop' into develop 2021-12-16 08:49:57 +02:00
Matias Griese
4ccbdafe8a Update Toolbox library for PHP 8.1 support 2021-12-16 08:49:45 +02:00
Djamil Legato
74096e836f Updated OpenCollective tiers 2021-12-15 12:19:01 -08:00
Matias Griese
1c51bf8a66 Added UserObject::$isAuthorizedCallable to allow $user->isAuthorized() customization 2021-12-15 18:00:50 +02:00
Matias Griese
a4beb9b8bd Fixed UserObject::$authorizeCallable binding to the user object 2021-12-15 18:00:27 +02:00
Matias Griese
484a41e42a Added second parameter to UserObject::isMyself() method 2021-12-15 13:28:03 +02:00
Matias Griese
def62ec2a2 Fixed message about user groups not being cached 2021-12-15 12:48:02 +02:00
Matias Griese
fae431bc39 Composer update 2021-12-14 17:13:55 +02:00
Matias Griese
25bc1edf31 Update Twig optimization to reflect upstream code 2021-12-10 16:20:19 +02:00
Matias Griese
945b90fa46 Changelog update 2021-12-10 12:46:55 +02:00
Matias Griese
420a4e3566 Add comment into TwigEnvironment 2021-12-09 21:18:10 +02:00
Matias Griese
f2a7833933 Restore debug info for flex 2021-12-09 21:12:47 +02:00
Matias Griese
491252476d Fixed Twig being very slow when templates do not exist 2021-12-09 21:09:23 +02:00
Matias Griese
6ed453890d Disabled pretty debug info for Flex as it slows down Twig rendering 2021-12-09 15:45:25 +02:00
Matias Griese
432f0eb9e5 Fixed some deprecation notices in flex 2021-12-09 15:07:37 +02:00
Matias Griese
236c068d70 Improve typehints 2021-12-09 14:06:58 +02:00
dani
3f3503e0f3 Update external.yaml (#3493) 2021-12-08 22:27:38 -07:00
Matias Griese
bc70c9b93c Added session.secure_https to system blueprint 2021-12-08 17:40:30 +02:00
Matias Griese
90f5ff7c74 Use secure session cookies in HTTPS by default (system.session.secure_https: true) 2021-12-08 17:38:16 +02:00
Matias Griese
3bfbb1a4ef Composer 2 checks for minimum PHP version, remove duplicated checks 2021-12-08 15:17:28 +02:00
Matias Griese
1f3f1828c2 Block .json files in web server configs 2021-12-08 15:07:42 +02:00
Matias Griese
6c7064db93 Fix phpstan issues 2021-12-08 14:34:38 +02:00
Matias Griese
9df7b35c65 DomIterator keys were off-by-one 2021-12-08 12:49:13 +02:00
Matias Griese
5552ea2d70 Replace unmaintained DOMIterators by our own versions (fixes PHP 8.1 warnings) 2021-12-08 12:34:54 +02:00
Matias Griese
6079562c90 More minor fixes for PHP 8.1 2021-12-08 10:58:38 +02:00
Matias Griese
a56453cf0a Update clockwork 2021-12-08 10:15:26 +02:00
Matias Griese
c2f394de17 Minor fix 2021-12-07 16:46:42 +02:00
Matias Griese
878de339e5 Improved FileSystem::pathinfoInternal() 2021-12-07 13:56:19 +02:00
Matias Griese
86cfba3bc9 Minor fix 2021-12-07 13:47:35 +02:00
Matias Griese
ad1e20abb7 Fixed phpstan level 4 issues in Framework 2021-12-07 13:34:36 +02:00
Matias Griese
2165743810 Fixed phpstan level 2 issues in Framework 2021-12-07 13:20:57 +02:00
Matias Griese
f3789bb17e Changelog update 2021-12-07 13:14:07 +02:00
Matias Griese
8f2f5e3373 Fixed RequestHandlers NotFoundException having empty request 2021-12-07 13:13:35 +02:00
Matias Griese
70c0dc6419 Improve Framework code 2021-12-07 13:10:19 +02:00
Matias Griese
5b84213fce Improved Framework File classes 2021-12-07 13:08:05 +02:00
Matias Griese
3ad68d6d5a Improve flex classes 2021-12-07 13:03:09 +02:00
Matias Griese
627a1510dc Simplify exception handling for Framework Cache classses 2021-12-07 12:52:42 +02:00
Matias Griese
042d4a4603 Improved ACL classes 2021-12-07 12:50:59 +02:00
Matias Griese
b2cfc4ef5f Fixed bad key lookup in FlexRelatedDirectoryTrait::getCollectionByProperty() 2021-12-07 12:47:09 +02:00
Matias Griese
1c148ab6fb Composer update 2021-12-07 12:43:54 +02:00
Matias Griese
cf6159ffe3 Fixed PHP 8.1 deprecated warning 2021-12-07 12:43:40 +02:00
Matias Griese
f04f13723d Silence PHP 8.1 deprecation notices for Twig 1 2021-12-03 14:52:52 +02:00
Matias Griese
5fd4f5f3eb Composer update 2021-12-03 13:12:25 +02:00
Matias Griese
512c2e5d9d Better typehints for Framework classes 2021-12-02 21:22:10 +02:00
Matias Griese
da3e32f945 PHP 8.1: Use strict parameters in Session class 2021-12-02 15:05:29 +02:00
Matias Griese
ae74f29b69 Minor fixes for Grav updater 2021-12-02 14:32:06 +02:00
Matias Griese
ecb2d31df0 PHP 8.1 2021-12-02 13:52:51 +02:00
Matias Griese
2355d799f2 PHP 8.1 fixes 2021-12-02 12:05:41 +02:00
Matias Griese
589f75b60d Phpstan test updates 2021-12-01 17:03:41 +02:00
Matias Griese
6aebbc2be4 Also Grav::exit() and Grav::redirect() never returns (typehint) 2021-12-01 16:45:45 +02:00
Matias Griese
fb4bce36cb Grav::close() never returns (typehint) 2021-12-01 16:25:39 +02:00
Matias Griese
3321f49253 Interface fixes 2021-12-01 15:46:36 +02:00
Matias Griese
5c6fd0453b Changelog update 2021-12-01 15:02:27 +02:00
Matias Griese
179dec4c3b More phpstan fixes 2021-12-01 14:59:22 +02:00
Matias Griese
d59a4c63db Added translated() method to PageTranslateInterface 2021-12-01 14:57:27 +02:00
Matias Griese
4c3daf6e6f PHP 8.1 return type fixes 2021-11-30 21:20:17 +02:00
Matias Griese
c220b6e0c2 ControllerResponseTrait: Redirect response should be json if the extension is .json 2021-11-30 19:08:49 +02:00
Matias Griese
e4f79dbfce Minor fixes 2021-11-30 19:02:42 +02:00
Matias Griese
d220812f5e Minor code improvements 2021-11-30 18:59:44 +02:00
Matias Griese
d4a23c1fbe Fixed assert 2021-11-30 18:54:03 +02:00
Matias Griese
a57c18f63f Fixed some phpstan errors 2021-11-30 15:26:21 +02:00
Matias Griese
8256af5cfa Fix some phpstan level 2 errors 2021-11-30 14:49:50 +02:00
Matias Griese
eae3668aee Fixed phpstan issue 2021-11-30 14:09:14 +02:00
Matias Griese
8d04330dc5 Upgraded 2021-11-30 13:56:36 +02:00
Matias Griese
b7ab1df4e3 Toolbox update 2021-11-25 21:57:04 +02:00
Matias Griese
664c95e95a Composer update 2021-11-25 11:28:25 +02:00
Matias Griese
a8d292a0d9 Added third $name parameter to Blueprint::flattenData() method, useful for flattening repeating data 2021-11-25 11:07:20 +02:00
Andy Miller
6e9f6e8f7a php 8.1 compatibility 2021-11-17 10:40:38 -07:00
Andy Miller
d0604a055f Merge branch 'feature/php-81' into develop 2021-11-17 10:40:03 -07:00
Matias Griese
193475a0b6 Made Grav::redirect() to accept Route class 2021-11-17 10:49:39 +02:00
Andy Miller
47b444a742 pimple fix 2021-11-16 19:57:34 -07:00
Andy Miller
3c3b44d6de Merge branch 'release/1.7.25' 2021-11-16 10:34:56 -07:00
Andy Miller
88c2b40ec7 Merge tag '1.7.25' into develop
Release v1.7.25
2021-11-16 10:34:56 -07:00
Andy Miller
88ffa163c4 prepare for release 2021-11-16 10:34:46 -07:00
Matias Griese
956ed013cf Improved redirects: send redirect response in JSON if the request was in JSON 2021-11-12 12:08:13 +02:00
Matias Griese
061ebf06c6 Composer update 2021-11-12 11:02:24 +02:00
Matias Griese
e6911ce24a Improved form validation JSON responses to contain list of failed fields with their error messages 2021-11-12 09:36:54 +02:00
Matias Griese
d9c9f6a5eb Fixed form validation exceptions to use 400 Bad Request instead of 500 Internal Server Error 2021-11-12 09:35:26 +02:00
Matias Griese
2a04628459 Added FlexObject::getDiff() to see difference to the saved object 2021-11-11 20:06:24 +02:00
Matias Griese
33b473c290 Fixed FlexObject::getChanges() always returning empty array 2021-11-11 15:48:18 +02:00
Matias Griese
58b48c2f26 Do not escape ValidationException 2021-11-09 19:12:39 +02:00
Matias Griese
ad003a0fc4 Updated phpstan to v1.0 2021-11-04 08:55:53 +02:00
Matias Griese
8f9c417c04 Fixed path traversal vulnerability when using bin/grav server 2021-11-03 14:06:42 +02:00
Matias Griese
8bbf7a849b Fixed |t(variable) twig filter in admin 2021-11-03 13:10:10 +02:00
Matias Griese
a723bcdb46 Fixed unescaped error messages in JSON error responses 2021-11-03 11:50:23 +02:00
Matias Griese
3d0d836d92 Composer update 2021-11-02 15:27:53 +02:00
Andy Miller
67ea6c8066 Merge branch 'develop' of github.com:getgrav/grav into develop
# Conflicts:
#	CHANGELOG.md
2021-10-29 10:53:40 -06:00
Andy Miller
cd1dc5b43d better vardump variable 2021-10-29 10:53:01 -06:00
Matias Griese
1d1c10f0a6 Added method Page::initialize() 2021-10-27 14:59:23 +03:00
Matias Griese
125f2a8662 Improved page cloning 2021-10-27 14:24:16 +03:00
Matias Griese
4046fed60f Changelog update 2021-10-27 14:23:39 +03:00
Andy Miller
78ca2f68cc Merge tag '1.7.24' into develop
Release v1.7.24
2021-10-26 13:45:45 -06:00
Andy Miller
18fcf80b4f Merge branch 'release/1.7.24' 2021-10-26 13:45:44 -06:00
Andy Miller
4db28bf47e prepare for release 2021-10-26 13:45:30 -06:00
Andy Miller
917aa9407d updated vendor libs 2021-10-26 13:44:43 -06:00
Andy Miller
6fc2bc4f91 Merge branch 'develop' of github.com:getgrav/grav into develop 2021-10-26 11:39:19 -06:00
Andy Miller
7dc6b71252 whitespace 2021-10-26 11:39:15 -06:00
Matias Griese
53c7f4c119 Changelog update 2021-10-26 19:25:41 +03:00
Matias Griese
af4243aff2 User authorize() now checks user groups before superuser, allowing deny rules to work 2021-10-26 19:22:56 +03:00
Matias Griese
afc69a3229 Fixed XSS detection with &colon; 2021-10-25 20:37:59 +03:00
Matias Griese
17dfd130b6 Changelog update 2021-10-22 15:08:28 +03:00
Matias Griese
05101650ce Merge remote-tracking branch 'origin/develop' into develop 2021-10-22 15:07:51 +03:00
Matias Griese
715477586c Added support to disable a form, making it readonly 2021-10-22 15:07:42 +03:00
Ricardo Verdugo
fd61f82f5a Watermark Media Action (#3308)
* added gregwar merge media action and watermark media function

* remove the dump left by accident

* added scaling to the watermark

Co-authored-by: Ricardo <ricardo@urbansquid.london>
Co-authored-by: Andy Miller <1084697+rhukster@users.noreply.github.com>
2021-10-21 06:31:33 -06:00
Matias Griese
8b0a6906c7 Composer update 2021-10-20 20:27:11 +03:00
Matias Griese
be44bf0b55 Fixed deprecated warnings on ArrayAccess in PHP 8.1 2021-10-20 18:56:21 +03:00
Matias Griese
d2536379e5 Changelog update (#3464) 2021-10-20 12:31:27 +03:00
Nicolas Busseneau
08d7ad80df fix session_store_active functionality
At the moment and since 1.7.19, the `system.languages.session_store_active`
setting has no effect.

Session must be initialized before URI for `$language->setActiveFromUri($uri)`
(called from `$this->initializeUri($config) -> $uri->init()`) to
properly retrieve / store `active_language` in Session.

This was previously detected in #3269 as per the code comment, but got
reversed in 2e9fe80e33.
2021-10-20 12:24:10 +03:00
Matias Griese
33a5709903 Fixed a bug in PermissionsReader in PHP 7.3 2021-10-20 10:24:00 +03:00
Andreas Becker
280cbc2330 Update LanguageCodes.php (#3469)
Adding 
my - Myanmar Burmese
sw - Swahili
lo - Lao
km - Khmer
2021-10-18 20:59:21 -06:00
Andy Miller
746e75b9e4 Merge branch 'develop' of github.com:getgrav/grav into develop 2021-10-07 08:16:38 -06:00
Andy Miller
11decd5889 Use client now 2021-10-07 08:16:14 -06:00
Matias Griese
be136d3ce4 Added support for custom form field options validation with validate: options: key|ignore 2021-10-07 14:00:17 +03:00
Matias Griese
60fd4ec516 Added UserObject::isMyself() method to check if flex user is currently logged in 2021-10-07 12:49:14 +03:00
Matias Griese
b136480669 Composer update 2021-10-06 10:40:31 +03:00
Andy Miller
07bd1e03d0 Better backwards compatibility 2021-10-01 11:42:41 -06:00
Andy Miller
75ef1341eb Added new HTTP\Client class for more general use 2021-09-30 17:39:49 -06:00
Andy Miller
ed6b60429c Merge branch 'release/1.7.23' 2021-09-29 14:22:22 -06:00
Andy Miller
2edb12bc18 Merge tag '1.7.23' into develop
Release v1.7.23
2021-09-29 14:22:22 -06:00
Andy Miller
5843e226c3 prepare for release 2021-09-29 14:22:03 -06:00
Andy Miller
4fc73fdc35 update to latest dom-sanitizer 2021-09-29 14:20:42 -06:00
Andy Miller
78fbc787a4 Updated vendor libs + changelog 2021-09-29 10:59:20 -06:00
Andy Miller
8af71742a0 Merge branch 'develop' of github.com:getgrav/grav into develop 2021-09-29 10:58:20 -06:00
Andy Miller
22e550820d updated language strings 2021-09-29 10:57:42 -06:00
Matias Griese
372f81a09e Added BlueprintSchema::getNestedRules() method 2021-09-29 08:38:42 +03:00
Matias Griese
22f5ba4bb1 Changelog update 2021-09-24 15:14:34 +03:00
Matias Griese
028e247df8 Fixed form reset causing image uploads to fail when using Flex 2021-09-24 15:09:27 +03:00
Matias Griese
4038c0649c Fixed some phpstan issues (all code level 1, Framework level 3) 2021-09-24 13:28:32 +03:00
Matias Griese
8aee574069 Phpstan fixes 2021-09-24 13:18:26 +03:00
Matias Griese
c220aa746a Phpstan fix for Deferred Twig extension compat mode 2021-09-24 12:26:05 +03:00
Matias Griese
da00dd9eec Further attempt to fix :0 port [#3439] 2021-09-24 12:24:14 +03:00
Matias Griese
30b55ae150 Phpstan fixes 2021-09-24 12:19:41 +03:00
Matias Griese
6b70826961 Add variable-length argument list to GravExtension::translate() 2021-09-24 10:58:05 +03:00
Djamil Legato
ae8dfde69d Added true unique Utils::uniqueId() / {{ unique_id() }}utilities with length, prefix, and suffix support. 2021-09-23 21:40:21 -07:00
Andy Miller
63661a40e3 updated clean command 2021-09-23 19:24:57 -06:00
Andy Miller
b76ee25d49 replaced svg-sanitizer with dom-sanitizer 2021-09-23 19:22:24 -06:00
Andy Miller
3f7c7692ab Merge branch 'develop' of github.com:getgrav/grav into develop 2021-09-23 19:19:08 -06:00
Andy Miller
e34d896278 remove svg-sanitizer 2021-09-23 19:19:02 -06:00
Andy Miller
3e90baef02 only require PHP 7.3 2021-09-23 19:10:15 -06:00
Matias Griese
7ed87f87e0 Use composer 2 in Github workflows 2021-09-23 14:06:26 +03:00
Matias Griese
35af0aa4b0 Changelog update 2021-09-21 13:44:15 +03:00
Matias Griese
370b0674bd Fixed Folder::move() throwing an error when target folder is changed by only appending characters to the end [#3445] 2021-09-21 13:42:18 +03:00
Matias Griese
e0c3e28809 Added method Pages::referrerRoute() to get the referrer route and language 2021-09-20 17:09:32 +03:00
Matias Griese
53302ac082 Changelog update #3411 2021-09-20 15:55:35 +03:00
Matias Griese
9ff605e08b Uri::referrer() docblock update 2021-09-20 15:52:27 +03:00
Matias Griese
5593327dbc Uri::referrer() now accepts third parameter, if set to true, it returns route without base or language code 2021-09-20 15:39:09 +03:00
Matias Griese
31b0510bbd Composer update 2021-09-20 10:18:50 +03:00
Matias Griese
beba9c029d Better Twig 3 support 2021-09-17 15:46:10 +03:00
Matias Griese
243053659c Update to customized version of Twig DeferredExtension, improve Twig 2 compatibility 2021-09-17 15:39:16 +03:00
Andy Miller
f2d30e3680 Merge branch 'release/1.7.22' 2021-09-16 13:49:46 -06:00
Andy Miller
76d881bac1 Merge tag '1.7.22' into develop
Release v1.7.22
2021-09-16 13:49:46 -06:00
Andy Miller
c5fd282653 prepare for release 2021-09-16 13:49:38 -06:00
Matias Griese
d276af6fa9 Register plugin autoloaders into plugin objects 2021-09-16 18:22:09 +03:00
Matias Griese
ba19ce4919 Fixed conflicting $_original variable in Flex Pages 2021-09-15 12:40:06 +03:00
Andy Miller
d86a7a1653 Merge tag '1.7.21' into develop
Release v1.7.21
2021-09-14 12:59:37 -06:00
Andy Miller
f3c82f85c8 Merge branch 'release/1.7.21' 2021-09-14 12:59:36 -06:00
Andy Miller
b17eaba8bf prepare for release 2021-09-14 12:59:29 -06:00
Matias Griese
0600d6a4d8 Merge remote-tracking branch 'origin/develop' into develop 2021-09-14 18:28:16 +03:00
Matias Griese
c51fb1779b Fixed Session::setFlashCookieObject() to use the same options as the main session cookie 2021-09-14 18:28:07 +03:00
Andy Miller
34b7a28fbe update changelog 2021-09-13 17:42:30 -06:00
Andy Miller
a446152631 Merge branch 'develop' of github.com:getgrav/grav into develop 2021-09-13 17:41:08 -06:00
Andy Miller
61c2abee35 use a simple cron text field as custom one was confusing 2021-09-13 17:40:55 -06:00
Andy Miller
c1d520f1cf Add date/time to text file output of scheduler 2021-09-13 17:40:39 -06:00
Matias Griese
3bd9e44155 Remove extra space #3432 2021-09-13 16:51:06 +03:00
Matias Griese
7311517d65 Fixed incorrect port :0 with nginx unix socket setup [#3439] 2021-09-13 12:34:42 +03:00
Matias Griese
4568a197e7 Fixed excessive security.yaml file creation [#3432] 2021-09-13 11:53:12 +03:00
Matias Griese
350134b256 Renamed conflicting $object->getOriginal() to $object->getOriginalData() 2021-09-10 19:09:56 +03:00
Matias Griese
1350cf5675 Added $object->getOriginal() to get flex objects data before it was modified with update() 2021-09-09 14:14:42 +03:00
Matias Griese
21db2e7d4a Added support for flex-required@: not exists and flex-required@: '!exists' in blueprints 2021-09-09 14:14:16 +03:00
Matias Griese
cda08242f1 Added file upload/remove support for Flex Forms 2021-09-08 14:34:15 +03:00
Matias Griese
fc8936986f Cast data.search.options to array 2021-09-07 18:28:36 +03:00
Matias Griese
ec37fd065f Throwing exceptions from Twig templates fires onDisplayErrorPage.[code] event allowing better error pages 2021-09-03 18:39:41 +03:00
Matias Griese
47875a4525 Added route and request to onPageNotFound event 2021-09-03 12:23:48 +03:00
Matias Griese
61adb1e6cf More robust way to check number step [#3433] 2021-09-02 20:34:17 +03:00
Matias Griese
907e46631c Added |yaml filter to convert input to YAML 2021-09-02 20:02:07 +03:00
Matias Griese
aedf8cda47 Changelog update [#3433] 2021-09-02 10:57:10 +03:00
Matias Griese
7a1f5539ed Fixed validation of number type 2021-09-02 10:55:27 +03:00
Matias Griese
49087e9a53 Fixed escaping in PageIndex::getLevelListing() 2021-09-02 10:20:26 +03:00
Andy Miller
a128c7f18d Merge branch 'release/1.7.20' 2021-09-01 10:39:40 -06:00
Andy Miller
c6704d8129 Merge tag '1.7.20' into develop
Release v1.7.20
2021-09-01 10:39:40 -06:00
Andy Miller
c43b375d3b prepare for release 2021-09-01 10:39:23 -06:00
Matias Griese
9523bab910 Merge remote-tracking branch 'origin/develop' into develop 2021-08-31 22:25:15 +03:00
Matias Griese
a8fe62a829 Added support for task and action inside JSON request body 2021-08-31 22:25:02 +03:00
Andy Miller
4708a46ec9 Merge branch 'release/1.7.19' 2021-08-31 13:08:46 -06:00
Andy Miller
7a99aaa53f Merge tag '1.7.19' into develop
Release v1.7.19
2021-08-31 13:08:46 -06:00
Andy Miller
e54e488f80 Merge tag '1.7.19' into develop
Release v1.7.19
2021-08-31 12:21:42 -06:00
Andy Miller
bf471cc3fa Merge branch 'release/1.7.19' 2021-08-31 12:21:42 -06:00
Andy Miller
fd8c44ba90 prepare for release 2021-08-31 12:21:31 -06:00
Matias Griese
f9e7f1c08e Flex: Use str_replace() and not strtr() 2021-08-30 09:55:21 +03:00
Andy Miller
8042caee57 fixed svgImageFunction() 2021-08-27 10:26:00 -06:00
Matias Griese
3f3f63f411 Fixed Flex object types not implementing MediaInterface 2021-08-25 18:50:08 +03:00
Matias Griese
292687ea00 Fixed wrong form issue with flex objects after cache clear 2021-08-25 18:31:58 +03:00
Andy Miller
aa47cb7b97 ignore cli/security.yaml 2021-08-18 14:04:21 -06:00
Djamil Legato
794237bf30 Minor indentation config tweaks 2021-08-18 09:31:15 -07:00
Rotzbua
de3aa16aca add mime for .avif image format
new image format developed by google

references:
https://codelabs.developers.google.com/codelabs/avif#0
https://caniuse.com/avif
2021-08-18 11:19:38 +03:00
Rotzbua
34d001cbef fix typo mime type of .aif (#3423)
mime type should be `audio/aiff`
reference: https://en.wikipedia.org/wiki/Audio_Interchange_File_Format
2021-08-13 10:58:35 -04:00
Andy Miller
21bd51aef9 remove sensio 2021-08-13 09:59:03 -04:00
Matias Griese
f45afd1f54 Added support for multiple mime-types per file extension [#3422] 2021-08-13 13:05:32 +03:00
Matias Griese
c975f894ae Composer update 2021-08-11 09:07:57 +03:00
Matias Griese
a9b59596d8 Fixed flex-options@ in blueprints duplicating items in array 2021-08-10 12:38:07 +03:00
Matias Griese
9333fcc1d6 Generalize FolderStorage templating 2021-08-09 21:38:01 +03:00
Matias Griese
b3426f86a3 Merge remote-tracking branch 'origin/develop' into develop 2021-08-09 19:36:23 +03:00
Matias Griese
b3e9682511 Generalize FolderStorage templating 2021-08-09 19:36:14 +03:00
Rotzbua
b3af6c9920 Change mime-type to text/javascript (#3415)
Recommended by whatwg and draft-ietf-dispatch-javascript-mjs-09 (obsoletes RFC4329)
2021-07-31 14:29:22 -06:00
Matias Griese
2e9fe80e33 Initialize $grav['uri] before session 2021-07-30 09:31:33 +03:00
Matias Griese
def389356e Added UserObject::$authorizeCallable to allow $user->authorize() customization 2021-07-29 23:09:25 +03:00
Matias Griese
c5dfa65994 Fixed FlexDirectoryForm serialization 2021-07-29 22:14:45 +03:00
Matias Griese
c9159695aa Fixed FlexForm serialization 2021-07-29 19:59:42 +03:00
Matias Griese
17d1786e5c Fixed broken Twig try tag when catch has not been defined or is empty 2021-07-29 16:12:14 +03:00
Matias Griese
5437d2db1a Fixed Flex Object missing key field value when using FolderStorage 2021-07-28 14:31:55 +03:00
Matias Griese
e390e9901e Allow customization of security.yaml 2021-07-28 14:29:10 +03:00
Matias Griese
7c946c59f8 Include request in onPageTask and onPageAction events (defaults to null) 2021-07-26 17:27:30 +03:00
Matias Griese
506c74de55 Include active form in onPageTask and onPageAction events (defaults to null) 2021-07-26 14:39:40 +03:00
Matias Griese
ab9783102e Fixed broken environment:// stream when it doesn't have configuration 2021-07-23 21:51:17 +03:00
Matias Griese
a8a8cce25f Fixed GPM not using non-standard cache path [#3410] 2021-07-23 09:39:21 +03:00
Matias Griese
d62e869044 Add changelog [#3398] 2021-07-22 17:17:15 +03:00
Karmalakas
6dd5e0fd20 Change key setting in a loop
#531
2021-07-22 17:13:42 +03:00
Karmalakas
c57a29c23f Add setCurrent() method to Page Collection
#531
2021-07-22 17:13:42 +03:00
Matias Griese
2866a51326 Added meta support for UploadedFile class 2021-07-22 17:01:55 +03:00
Matias Griese
21f5488d3b Make MediaUploadTrait::getUploadSettings() public 2021-07-22 17:00:16 +03:00
Matias Griese
7b1a188cfe Fixed error in loadDirectoryConfig() if configuration hasn't been saved [#3409] 2021-07-22 16:59:42 +03:00
Matias Griese
fdcf7026d2 Changelog for #3408 2021-07-20 10:48:22 +03:00
Andy Miller
b8ada23e2b fixes #3408 2021-07-19 22:35:57 -06:00
Andy Miller
5def813a2e Merge branch 'release/1.7.18' 2021-07-19 12:16:38 -06:00
Andy Miller
551a8251f9 Merge tag '1.7.18' into develop
Release v1.7.18
2021-07-19 12:16:38 -06:00
Andy Miller
951ce6f9f8 prepare for release 2021-07-19 12:15:54 -06:00
Matias Griese
c9448870fa Fixed open_basedir() error with some forms 2021-07-08 14:00:53 +03:00
Andy Miller
1d552ab603 updated changelog 2021-07-06 17:46:08 -06:00
Andy Miller
e39d01e139 Support cloudflare + better x-forwarded-for 2021-07-06 17:44:49 -06:00
Robert Bak
d4805bc709 Fixes issue with Symfony local server detection (#3400)
I was just doing the same thing!
2021-07-06 14:40:12 -06:00
Matias Griese
35db2f61f7 Added method FlexObject::resetBlueprints() 2021-07-06 21:39:14 +03:00
Andy Miller
8af1229f65 qurantine bad SVGs 2021-07-01 15:36:26 -06:00
Matias Griese
9aa6f5b1f7 Fixed Failed to save entry: Forbidden when moving a page to a visible page [#3389] 2021-07-01 14:45:24 +03:00
Matias Griese
da8e374443 Fixed Admin becoming unusable when GPM cannot be reached [#3383] 2021-06-24 17:04:04 +03:00
Matias Griese
95851e8f52 Improve page search to include slug [#3316] 2021-06-24 15:34:14 +03:00
Matias Griese
d2350b6786 Fixed error when using Flex SimpleStorage with no entries 2021-06-23 14:45:56 +03:00
Matias Griese
08a2abb713 Added support for loading Flex Directory configuration from main configuration 2021-06-16 21:35:43 +03:00
Andy Miller
ac62f54aa5 Merge branch 'release/1.7.17' 2021-06-15 13:11:35 -06:00
Andy Miller
fb189a3ce4 Merge tag '1.7.17' into develop
Release v1.7.17
2021-06-15 13:11:35 -06:00
Andy Miller
7e41938317 prepare for release 2021-06-15 13:11:26 -06:00
Andy Miller
d90b28a399 fix jquery in tests 2021-06-15 10:20:57 -06:00
Andy Miller
90f5635478 Switch to JQuery 3.x rather than 2.x 2021-06-15 10:15:12 -06:00
Djamil Legato
acf8724402 Added tests for new params support in collections (#3358) 2021-06-14 16:03:22 -07:00
Djamil Legato
f1c623c14b Fixed mutability issue when adding multiple assets with different params (#3358) 2021-06-14 11:55:14 -07:00
Djamil Legato
ee40ad59f2 Ensure simple second argument for priority is also supported in multi-collections with params (fixes #3358) 2021-06-14 10:25:16 -07:00
Matias Griese
845fac8adf Fixed permission check when moving a page [#3382] 2021-06-10 16:27:30 +03:00
Matias Griese
896695b30f Interface FlexDirectoryInterface now extends FlexAuthorizeInterface 2021-06-10 13:55:12 +03:00
Matias Griese
fbfa88739d Changelog update 2021-06-10 13:19:47 +03:00
Matias Griese
ea191602da Fixed missing styles when CSS/JS Pipeline is used and assets/ folder is missing 2021-06-10 13:16:20 +03:00
Matias Griese
564287eb21 Composer update 2021-06-10 09:23:41 +03:00
Matias Griese
28790197aa File frontmatter.yaml isn't part of media, ignore it 2021-06-08 09:28:30 +03:00
Djamil Legato
1db66fd43d Ported support for multi-parameter assignment in asset collection to method add (fixes #3358) 2021-06-04 11:21:17 -07:00
Djamil Legato
8d506db73c Added support specifying custom attributes to assets in a collection (fixes #3358) 2021-06-03 15:59:01 -07:00
Djamil Legato
c288d4bd0b Allow to unset an asset attribute by specifying null (ie, ’defer’ => null) 2021-06-03 15:51:24 -07:00
Djamil Legato
39247ac7ef Updated blueprints inline-docs for clear_images_by_default 2021-06-02 23:35:04 -07:00
Andy Miller
47b5b10bf4 Merge tag '1.7.16' into develop
Release v1.7.16
2021-06-02 12:23:38 -06:00
Andy Miller
ad1cf15d7c Merge branch 'release/1.7.16' 2021-06-02 12:23:37 -06:00
Andy Miller
6339d9f3cd prepare for release 2021-06-02 12:23:27 -06:00
Andy Miller
fc36a76fc0 updated changelog 2021-06-02 12:22:42 -06:00
phmg701
18d7fd4c7d Adding the addFrame method to ImageMedium (#3323)
* Update ImageMediaTrait.php

Add needed magic actions to enable image frame creation.

* Update ImageMedium.php

Adds addFrame method that can be (recursively) called from Twig.
2021-06-01 16:38:40 -06:00
Djamil Legato
76e44a1043 More regex fixes for URI 2021-06-01 15:16:39 -07:00
Andy Miller
4c0d107562 stupid fix for homebrew PHP 7.4.18+ 2021-06-01 14:25:52 -06:00
Djamil Legato
d359120d81 Fixed SRI trying to calculate remote assets, only ever set integrity for local files. Use the SRI provided by the remote source and manually add it in the addJs/addCss call for remote support. (fixes #3358)
Also Fixed wrong SRI paths invoked when Grav instance as a sub folder
2021-05-27 12:26:25 -07:00
Matias Griese
278671deec Fixed flex pages using wrong type in onBlueprintCreated event [#3157] 2021-05-27 14:18:12 +03:00
Matias Griese
e28360f86a Fixed flex pages search using only folder name [#3316] 2021-05-27 13:17:24 +03:00
Matias Griese
75cef03644 Improve error on bad nested form data [#3364] 2021-05-26 11:43:20 +03:00
Matias Griese
33be6946f7 Fixed the first visible child page getting ordering number 999999. [#3365] 2021-05-26 11:16:31 +03:00
Andy Miller
7f23b088a4 set clear_images_by_default to false by default 2021-05-25 11:27:13 -06:00
Matias Griese
c56f9f3277 Fixed pathinfo() twig filter in PHP 7 2021-05-24 10:01:24 +03:00
Matias Griese
6198d5abf3 Improve Plugin and Theme initialization to fix PHP8 bug [#3368] 2021-05-22 12:28:15 +03:00
Andy Miller
3f8c51cc01 Merge tag '1.7.15' into develop
Release v1.7.15
2021-05-19 13:22:30 -06:00
Andy Miller
b693ed4071 Merge branch 'release/1.7.15' 2021-05-19 13:22:29 -06:00
Andy Miller
5621f5cdb0 prepare for release 2021-05-19 13:22:18 -06:00
Andy Miller
83f2097f40 trim extra line breaks 2021-05-18 21:58:37 -06:00
Matias Griese
879de1d95e Rename property for onOutputGenerated and onOutputRendered events 2021-05-12 14:52:41 +03:00
Matias Griese
ec018f40aa Minor update for onOutputGenerated and onOutputRendered events 2021-05-12 14:51:11 +03:00
Matias Griese
0866753617 Added page and content properties to onOutputGenerated and onOutputRendered events 2021-05-12 14:49:34 +03:00
Matias Griese
5f66f2c4a9 Fixed uploading images into Flex Object if field destination is not set 2021-05-12 10:36:25 +03:00
Matias Griese
40f08a7f8b Flex: Mark uploaded media as uploaded 2021-05-10 20:08:18 +03:00
Matias Griese
c274337fed Minor fix on user avatar upload 2021-05-10 18:03:56 +03:00
Matias Griese
7d01977a89 Fixed missing and commonly used methods when using system.twig.undefined_functions = false 2021-05-10 12:27:11 +03:00
Matias Griese
d058c1d4fc Fixed copying page without changing the slug 2021-05-10 11:43:16 +03:00
Matias Griese
1a28155f1c Update docblocks to return the actual type [#3350] 2021-05-07 13:26:24 +03:00
Matias Griese
7ca7d8e045 Allow optional start date in page collections [#3350] 2021-05-07 13:23:38 +03:00
Thibaut HENIN
ec98ddc2df Improve PageCollectionInterface::dateRange signature and documentation. Report changes into implementations. 2021-05-07 13:19:09 +03:00
Thibaut HENIN
72b520745a Simplify Collection::dateRange (same structure as PageCollection::dateRange) 2021-05-07 13:19:09 +03:00
Thibaut HENIN
9b4f0ca951 Fix dateRange when startDate is not provided (value of 0) 2021-05-07 13:19:09 +03:00
Matias Griese
a761df80db Fixed markdown media operations not working when using image:// stream [#3333] [#3349] 2021-05-07 13:09:34 +03:00
Matias Griese
9059904c1a Fixed fatal error with some markdown links 2021-05-07 11:53:32 +03:00
Matias Griese
568e728d20 Fixed twig deprecated TwigFilter messages [#3348] 2021-05-06 15:02:54 +03:00
Andy Miller
e56d414357 better uploader to allow rebuilds 2021-05-05 15:14:45 -06:00
Andy Miller
668f8ccdbf Merge branch 'release/1.7.14' 2021-04-29 10:22:27 -06:00
Andy Miller
9281be57fc Merge tag '1.7.14' into develop
Release v1.7.14
2021-04-29 10:22:27 -06:00
Andy Miller
d1e58eb95e prepare for release 2021-04-29 10:22:16 -06:00
Matias Griese
9f5a15f00a Updating a theme should always keep the custom files 2021-04-29 15:37:44 +03:00
Matias Griese
3aa47043c9 Added option to set flash folder in FlexForm 2021-04-28 13:58:08 +03:00
Matias Griese
8532db70d2 Merge remote-tracking branch 'origin/develop' into develop 2021-04-28 12:44:33 +03:00
Matias Griese
f8106a48ae Added MediaUploadTrait::checkFileMetadata() method 2021-04-28 12:44:21 +03:00
Ricardo
2813934d21 fix for when no valid link attributes are present 2021-04-26 21:20:19 +01:00
Matias Griese
defb793b0b Hide phpstan deprecation errors on Doctrine Cache 2021-04-26 10:54:39 +03:00
Matias Griese
1fd2162d4f Fixed broken exif_imagetype() twig function, composer update 2021-04-26 10:50:35 +03:00
Matias Griese
094a1bd5ee Changelog update 2021-04-26 09:56:39 +03:00
Matias Griese
2cf7a5f281 Fixed broken numeric language codes in Flex Pages [#2131] 2021-04-26 09:53:21 +03:00
Andy Miller
2ed451130c Merge branch 'release/1.7.13' 2021-04-23 12:55:38 -06:00
Andy Miller
4d1f88627a Merge tag '1.7.13' into develop
Release v1.7.13
2021-04-23 12:55:38 -06:00
Andy Miller
ed7e51480b prepare for release 2021-04-23 12:55:28 -06:00
Matias Griese
3e91be9a4d Added support for getting translated collection of Flex Pages using $collection->withTranslated('de') 2021-04-23 15:14:02 +03:00
Matias Griese
3e9bfad78f Added support for user provided folder in Flex $page->copy() 2021-04-23 15:10:43 +03:00
Matias Griese
fd34fce3c1 Fixed a bug in Flex Object refresh() method 2021-04-22 13:49:11 +03:00
Matias Griese
0cf684300d Fixed text field maxlength validation newline issue [#3324] 2021-04-22 11:44:11 +03:00
Djamil Legato
fe1c808dfd Have folder field for pages blueprints use the new folder-slug filed type 2021-04-20 15:53:51 -07:00
Andy Miller
aa8c67061c typo 2021-04-20 14:47:12 -06:00
Andy Miller
8e8de1eeec minor improvement in XSS invalid_protocol regex - #3298 2021-04-20 14:36:53 -06:00
Djamil Legato
b9fb284a52 Moved gregwar/Image and gregwar/Cache in-house to official getgrav/Image and getgrav/Cache packagist packages. This will help environments with very strict proxy setups that don't allow VCS setup. (fixes #3289) 2021-04-19 23:15:22 -07:00
Matias Griese
5efe447861 Fixed The "Grav/Common/Twig/TwigExtension" extension is not enabled when using markdown twig tag [#3317] 2021-04-19 10:20:26 +03:00
Andy Miller
b9ab491cbb Merge branch 'release/1.7.12' 2021-04-15 12:03:43 -06:00
Andy Miller
fb8d76922a Merge tag '1.7.12' into develop
Release v1.7.12
2021-04-15 12:03:43 -06:00
Andy Miller
1a97986bd2 prepare for release 2021-04-15 12:03:32 -06:00
Matias Griese
a2bb650518 Improve JSON support for the request 2021-04-15 15:28:22 +03:00
Matias Griese
f4398a0867 Fixed adding tags in admin after upgrading Grav [#3315] 2021-04-14 23:13:45 +03:00
Matias Griese
b44a1ce939 Fixed absolute path support for Windows [#3297] 2021-04-14 17:04:40 +03:00
Andy Miller
59fb9b2202 fixed changelog link 2021-04-13 12:44:54 -06:00
Andy Miller
86ba7333ad Merge branch 'release/1.7.11' 2021-04-13 12:27:56 -06:00
Andy Miller
7e7eac0c75 Merge tag '1.7.11' into develop
Release v1.7.11
2021-04-13 12:27:56 -06:00
Andy Miller
ad50017235 prepare for release 2021-04-13 12:27:42 -06:00
Matias Griese
aeb2e3a715 Add back alias for moved class 2021-04-13 21:11:05 +03:00
Matias Griese
3d10282567 Merge remote-tracking branch 'security/advisory-fix-1' into develop 2021-04-13 20:51:21 +03:00
Matias Griese
9e89666a24 Composer update, rename clearcache 2021-04-13 20:41:35 +03:00
Matias Griese
953cf65223 Added some documentation #3297 2021-04-13 12:40:08 +03:00
Matias Griese
371eb76b2b Typo #3297 2021-04-13 12:12:05 +03:00
Matias Griese
75c63704f6 Further improve defined paths #3297 2021-04-13 12:05:01 +03:00
Matias Griese
16dab2c9f1 Redirect /admin/groups to /admin/accounts/groups and blacklist it for admin controller 2021-04-12 18:38:12 +03:00
Matias Griese
7fdaf62684 Restrict filesystem Twig functions to accept only local filesystem and grav streams 2021-04-12 16:07:36 +03:00
Matias Griese
312c11b8da Allow GRAV_WEBROOT to be devined in env, USER_DIR is always under webroot 2021-04-10 11:14:11 +03:00
Matias Griese
2ef4c28401 Added configuration options to allow PHP methods to be used in Twig functions 2021-04-09 21:31:45 +03:00
Matias Griese
27dc8ffb45 Fixed fatal error if system.pages.types is not an array [#2984](https://github.com/getgrav/grav/issues/2984) 2021-04-09 14:45:05 +03:00
Matias Griese
c5296cd7e0 Fixed system.languages.session_store_active not having any effect [#3269] 2021-04-09 13:11:08 +03:00
Matias Griese
029b408915 Fixed fatal error when using markdown links with image:// stream [#3285] 2021-04-09 12:53:05 +03:00
Matias Griese
4fdff81762 Changelog update 2021-04-09 11:40:37 +03:00
Matias Griese
f3e4f9d311 Fixed deleting page with language code not removing the folder if it was the last language [#3305] 2021-04-09 11:13:51 +03:00
Matias Griese
74a667bbef Merge remote-tracking branch 'origin/develop' into develop
# Conflicts:
#	CHANGELOG.md
2021-04-09 10:34:18 +03:00
Matias Griese
7f8263318e Minor code cleanup in Utils 2021-04-09 10:33:32 +03:00
Djamil Legato
e0fc832621 Better GPM detection of unauthorized installations 2021-04-08 21:21:27 -07:00
Matias Griese
34aea14ff9 Fixed nxinx appending repeating ?url= in some redirects 2021-04-08 10:24:55 +03:00
Andy Miller
284d9ea22b Merge branch 'release/1.7.10' 2021-04-06 11:16:10 -06:00
Andy Miller
1e2d86f054 Merge tag '1.7.10' into develop
Releaese 1.7.10
2021-04-06 11:16:10 -06:00
Andy Miller
aa81350b6f prepare for release 2021-04-06 11:16:02 -06:00
pamtbaau
e02d298ff4 Add option images.defaults.size to set default height/width (#3272)
* Add option images.defaults.size to set default height/width

- Add option to config/system.yaml
- Add option to blueprints/config/system.yaml
- Add ImageSizeTrait.php
- Add ImageSizeTrait to ImageMedium.php
- Add Unit tests

* moved width/height to rendering phase

* Add test: height/width should be of resized image.

* Added optional apsect-ratio variable

* more improvements

* Added aspectRatio and retinaScale image functions

* remove use for old trait

* reset the CLS variables after calling reset on the image

Co-authored-by: Andy Miller <rhuk@mac.com>
2021-04-05 11:21:03 -06:00
Matias Griese
67f172b741 Phpstan fixes 2021-03-31 22:11:55 +03:00
Matias Griese
e97fe9de86 Fixed phpstan generics 2021-03-31 22:11:11 +03:00
Matias Griese
770bf15342 Composer update 2021-03-31 22:09:19 +03:00
Matias Griese
38b1556ee0 Fix unit test #2184 2021-03-31 21:29:59 +03:00
Matias Griese
0af33850a6 Fixed incorrect routing if url path looks like a domain name [#2184] 2021-03-31 20:08:39 +03:00
Matias Griese
edafa68414 Revert "Plugin class phpstan fix"
This reverts commit f78debe7
2021-03-31 14:29:50 +03:00
Matias Griese
f78debe768 Plugin class phpstan fix 2021-03-31 14:02:57 +03:00
Matias Griese
4f0f7876a8 Better support absolute GRAV_SYSTEM_PATH [#3297] 2021-03-31 10:26:46 +03:00
Matias Griese
2a4376b7cb Fixed undefined variable (regression) 2021-03-31 08:55:19 +03:00
Andy Miller
1d3d2a0bf9 Merge branch 'develop' of github.com:getgrav/grav into develop
# Conflicts:
#	CHANGELOG.md
2021-03-30 11:53:44 -06:00
Andy Miller
bbddb0a036 system blueprints not getting scanned. Fixes #3296 2021-03-30 11:53:27 -06:00
Matias Griese
a8e6aedd04 Fixed missing onAdminAfterDelete event call in Flex Pages 2021-03-30 19:14:49 +03:00
Matias Griese
1b9fd6276e Added initial support for running Grav library from outside the webroot [#3297] 2021-03-30 16:58:19 +03:00
Matias Griese
e229ab191f Improved password handling when saving a user 2021-03-26 10:53:14 +02:00
Matias Griese
42084ea0cb Fixed UserIndex not implementing UserCollectionInterface 2021-03-23 12:58:11 +02:00
Matias Griese
35468bb417 Minor docblock fix 2021-03-23 10:31:10 +02:00
Matias Griese
9eb20e37c8 Fixed Folder::move() deleting the folder if you move folder into itself, created empty file instead 2021-03-23 10:16:26 +02:00
Matias Griese
fa819064ef Improve move page into itself check 2021-03-23 09:45:31 +02:00
Matias Griese
eb89c00bd5 Fixed PageStorage detecting files as pages 2021-03-23 09:20:21 +02:00
Matias Griese
0491bd1a76 Fixed moving page to itself causing the page folder to be lost (converted to an empty file) 2021-03-23 09:18:43 +02:00
Matias Griese
802ae5b712 Ignore errors when using set_time_limit also in GPM\Response classes [#3023] 2021-03-20 08:48:30 +02:00
Andy Miller
38a393d605 ignore error during set_time_limit in Archiver - fixes #3023 2021-03-19 17:22:50 -06:00
Andy Miller
ba8b91ad29 Merge branch 'release/1.7.9' 2021-03-19 14:14:58 -06:00
Andy Miller
4b88122ab2 Merge tag '1.7.9' into develop
Release 1.7.9
2021-03-19 14:14:58 -06:00
Andy Miller
0a9b0c107f prepare for release 2021-03-19 14:14:50 -06:00
Matias Griese
ff1bc03361 Merge remote-tracking branch 'origin/develop' into develop 2021-03-19 21:56:28 +02:00
Matias Griese
3967862f10 Found the cause of #3280 in Windows 2021-03-19 21:55:56 +02:00
Andy Miller
70ab9b4b1b updated the security email 2021-03-19 11:53:10 -06:00
Matias Griese
50682d73dc Fixed redirects using wrong redirect code 2021-03-19 17:35:55 +02:00
Matias Griese
3926a61528 Fixed the list of pages not showing up in admin [#3280] 2021-03-19 10:31:21 +02:00
Matias Griese
9082cd5b17 Fixed the list of pages not showing up in admin [#3280] 2021-03-19 09:59:15 +02:00
Matias Griese
1c24f9f473 Fixed Flex Page CRUD ACL when creating a new page (needs Flex Objects plugin update) 2021-03-18 16:24:24 +02:00
Matias Griese
0d1c63f0fd Fixed Page::activeChild() throwing an error [#3276] 2021-03-18 11:17:11 +02:00
Matias Griese
29a4c66364 Changelog update for #3266 2021-03-17 22:31:21 +02:00
Matias Griese
73bb1f3046 Merge branch 'develop' of github.com:getgrav/grav into bugfix/redirects-2435
 Conflicts:
	CHANGELOG.md
2021-03-17 22:23:36 +02:00
Matias Griese
86169bbf7c Changelog update 2021-03-17 22:20:35 +02:00
Matias Griese
bde65bf056 Merge remote-tracking branch 'origin/develop' into develop 2021-03-17 22:07:59 +02:00
Matias Griese
0ab7d3ca63 Fixed broken media upload in Flex with @self/path, @page and @theme destinations [#3275] 2021-03-17 22:07:48 +02:00
Matias Griese
644a54e441 Added Utils::getPathFromToken() method which works also with Flex Objects 2021-03-17 21:54:26 +02:00
Matias Griese
62ff25f96d Fixed onAdminSave original page having empty header [#3259] 2021-03-17 21:33:57 +02:00
Djamil Legato
dabb4402a7 Handle skeletons rebuild manually only 2021-03-17 12:27:19 -07:00
Matias Griese
4ae9c42cc6 Composer update 2021-03-17 21:12:15 +02:00
Andy Miller
0cf39a07f5 Merge tag '1.7.8' into develop
Release v1.7.8
2021-03-17 11:44:48 -06:00
Matias Griese
fad681430e Composer update 2021-03-15 19:05:33 +02:00
Matias Griese
4f1af3709e Fixed Path cannot be empty when viewing non-existent log file [#3270] 2021-03-15 18:50:28 +02:00
Matias Griese
2681a8196b Fixed Uncaught ValueError: Path cannot be empty when failing to upload a file [#3265] 2021-03-12 12:45:41 +02:00
Matias Griese
25e7f6c5e8 Method $pages->find() should never redirect 2021-03-12 11:45:00 +02:00
544 changed files with 16833 additions and 5468 deletions

View File

@@ -13,5 +13,5 @@ indent_size = 4
trim_trailing_whitespace = true
# 2 space indentation
[*.{yaml,yml}]
[*.{yaml,yml,vue,js,css}]
indent_size = 2

View File

@@ -4,19 +4,28 @@ on:
release:
types: [published]
permissions: {}
jobs:
build:
permissions:
contents: write # for release creation (svenstaro/upload-release-action)
if: "!github.event.release.prerelease"
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Extract Tag
run: echo "PACKAGE_VERSION=${{ github.ref }}" >> $GITHUB_ENV
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: 7.3
extensions: opcache, gd
tools: composer:v2
coverage: none
env:
COMPOSER_TOKEN: ${{ secrets.GLOBAL_TOKEN }}
@@ -38,15 +47,19 @@ jobs:
run: |
bash ./build-grav.sh
- name: Upload Grav Release Assets
id: upload-release-asset
uses: alexellis/upload-assets@0.2.3
env:
GITHUB_TOKEN: ${{ secrets.GLOBAL_TOKEN }}
- name: Upload packages to release
uses: svenstaro/upload-release-action@v2
with:
asset_paths: '["./grav-dist/*.zip"]'
repo_token: ${{ secrets.GITHUB_TOKEN }}
tag: ${{ env.PACKAGE_VERSION }}
file: ./grav-dist/*.zip
overwrite: true
file_glob: true
slack:
permissions:
actions: read # to list jobs for workflow run (technote-space/workflow-conclusion-action)
name: Slack
needs: build
runs-on: ubuntu-latest

View File

@@ -6,6 +6,9 @@ on:
pull_request:
branches: [ develop ]
permissions:
contents: read # to fetch code (actions/checkout)
jobs:
unit-tests:
@@ -14,7 +17,7 @@ jobs:
strategy:
matrix:
php: [ 8.0, 7.4, 7.3]
php: [8.2, 8.1, 8.0, 7.4, 7.3]
os: [ubuntu-latest]
steps:
@@ -25,6 +28,7 @@ jobs:
with:
php-version: ${{ matrix.php }}
extensions: opcache, gd
tools: composer:v2
coverage: none
env:
COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -1,8 +1,6 @@
name: Trigger Skeletons Build
on:
release:
types: [ published ]
workflow_dispatch:
inputs:
version:
@@ -14,6 +12,9 @@ on:
required: true
default: true
permissions:
contents: read # to fetch code (actions/checkout)
jobs:
build:
runs-on: ubuntu-latest

7
.gitignore vendored
View File

@@ -25,8 +25,11 @@ user/plugins/*
!user/plugins/.*
user/themes/*
!user/themes/.*
user/localhost/config/security.yaml
user/config/security.yaml
user/**/config/security.yaml
# Environments
.env
.gravenv
# OS Generated
.DS_Store*

View File

@@ -59,9 +59,9 @@ RewriteRule .* index.php [L]
# Block all direct access for these folders
RewriteRule ^(\.git|cache|bin|logs|backup|webserver-configs|tests)/(.*) error [F]
# Block access to specific file types for these system folders
RewriteRule ^(system|vendor)/(.*)\.(txt|xml|md|html|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ error [F]
RewriteRule ^(system|vendor)/(.*)\.(txt|xml|md|html|json|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ error [F]
# Block access to specific file types for these user folders
RewriteRule ^(user)/(.*)\.(txt|md|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ error [F]
RewriteRule ^(user)/(.*)\.(txt|md|json|yaml|yml|php|pl|py|cgi|twig|sh|bat)$ error [F]
# Block all direct access to .md files:
RewriteRule \.md$ error [F]
# Block all direct access to files and folders beginning with a dot

View File

@@ -1,3 +1,599 @@
# v1.7.43
## 10/02/2023
1. [](#new)
* Add the ability to programtically set a page's `modified` timestamp via a `modified:` frontmatter entry
2. [](#improved)
* Update vendor libraries
* Include `phar` in the list of `security.uploads_dangerous_extensions`
* When enabled `system.languages.debug` now dumps **Key -> Value** to debugger [#3752](https://github.com/getgrav/grav/issues/3752)
* Updated built-in composer to latest `2.6.4` [#3748](https://github.com/getgrav/grav/issues/3748)
* Added support for `@import` to ensure paths are rewritten correctly in CSS pipeline [#3750](https://github.com/getgrav/grav/pull/3750)
# v1.7.42.3
## 07/18/2023
2. [](#improved)
* Fixed a typo in `Utils::isDangerousFunction`
# v1.7.42.2
## 07/18/2023
2. [](#improved)
* In `Utils::isDangerousFunction`, handle double `\\` in `|map` twig filter to mitigate SSTI attack
* Better handle empty email in `Validatoin::typeEmail()`
# v1.7.42.1
## 06/15/2023
2. [](#improved)
* Quick fix for `isDangerousFunction` when `$name` was a closure [#3727](https://github.com/getgrav/grav/issues/3727)
# v1.7.42
## 06/14/2023
1. [](#new)
* Added a new `system.languages.debug` option that adds a `<span class="translate-debug"></span>` around strings translated with `|t`. This can be styled by the theme as needed.
1. [](#improved)
* More robust SSTI handling in `filter`, `map`, and `reduce` Twig filters and functions
* Various SSTI improvements `Utils::isDangerousFunction()`
1. [](#bugfix)
* Fixed Twig `|map()` allowing code execution
* Fixed Twig `|reduce()` allowing code execution
# v1.7.41.2
## 06/01/2023
1. [](#improved)
* Added the ability to set a configurable 'key' for the Twig Cache Tag: `{% cache 'my-key' 600 %}`
1. [](#bugfix)
* Fixed an issue with special characters in slug's would cause redirect loops
# v1.7.41.1
## 05/10/2023
1. [](#bugfix)
* Fixed certain UTF-8 characters breaking `Truncator` class [#3716](https://github.com/getgrav/grav/issues/3716)
# v1.7.41
## 05/09/2023
1. [](#improved)
* Removed `FILTER_SANITIZE_STRING` input filter in favor of `htmlspecialchars(strip_tags())` for PHP 8.2+
* Added `GRAV_SANITIZE_STRING` constant to replace `FILTER_SANITIZE_STRING` for PHP 8.2+
* Support non-deprecated style dynamic properties in `Parsedown` class via `ParseDownGravTrait` for PHP 8.2+
* Modified `Truncator` to not use deprecated `mb_convert_encoding()` for PHP 8.2+
* Fixed passing null into `mb_strpos()` deprecated for PHP 8.2+
* Updated internal `TwigDeferredExtension` to be PHP 8.2+ compatible
* Upgraded `getgrav/image` fork to take advantage of various PHP 8.2+ fixes
* Use `UserGroupObject::groupNames` method in blueprints for PHP 8.2+
* Comment out `files-upload` deprecated message as this is not going to be removed
* Added various public `Twig` class variables used by admin to address deprecated messages for PHP 8.2+
* Added `parse_url` to list of PHP functions supported in Twig Extension
* Added support for dynamic functions in `Parsedown` to stop deprecation messages in PHP 8.2+
# v1.7.40
## 03/22/2023
1. [](#new)
* Added a new `timestamp: true|false` option for individual assets
1. [](#improved)
* Removed outdated `xcache` setting [#3615](https://github.com/getgrav/grav/pull/3615)
* Updated `robots.txt` [#3625](https://github.com/getgrav/grav/pull/3625)
1. [](#bugfix)
* Fixed `force_ssl` redirect in case of undefined hostname [#3702](https://github.com/getgrav/grav/pull/3702)
* Fixed an issue with duplicate identical page paths
* Fixed `BlueprintSchema:flattenData` to properly handle ignored fields
* Fixed LogViewer regex greediness [#3684](https://github.com/getgrav/grav/pull/3684)
* Fixed `whoami` command [#3695](https://github.com/getgrav/grav/pull/3695)
# v1.7.39.4
## 02/22/2023
1. [](#bugfix)
* Reverted a reorganization of `account.yaml` that caused username to be disabled [admin#2344](https://github.com/getgrav/grav-plugin-admin/issues/2344)
# v1.7.39.3
## 02/21/2023
1. [](#bugfix)
* Fix for overzealous modular page template rendering fix in 1.7.39 causing Feed plugin to break [#3689](https://github.com/getgrav/grav/issues/3689)
# v1.7.39.2
## 02/20/2023
1. [](#bugfix)
* Fix for invalid session breaking Flex Accounts (when switching from Regular to Flex)
# v1.7.39.1
## 02/20/2023
1. [](#bugfix)
* Fix for broken image CSS with the latest version of DebugBar
# v1.7.39
## 02/19/2023
1. [](#improved)
* Vendor library updates to latest versions
1. [](#bugfix)
* Various PHP 8.2 fixes
* Fixed an issue with modular pages rendering thew wrong template when dynamically changing the page
* Fixed an issue with `email` validation that was failing on UTF-8 characters. Following best practices and now only check for `@` and length.
* Fixed PHPUnit tests to remove deprecation warnings
# v1.7.38
## 01/02/2023
1. [](#new)
* New `onBeforeSessionStart()` event to be used to store data lost during session regeneration (e.g. login)
1. [](#improved)
* Vendor library updates to latest versions
* Updated `bin/composer.phar` to latest `2.4.4` version [#3627](https://github.com/getgrav/grav/issues/3627)
1. [](#bugfix)
* Don't fail hard if pages recurse with same path
* Github workflows security hardening [#3624](https://github.com/getgrav/grav/pull/3624)
# v1.7.37.1
## 10/05/2022
1. [](#bugfix)
* Fixed a bad return type [#3630](https://github.com/getgrav/grav/issues/3630)
# v1.7.37
## 10/05/2022
1. [](#new)
* Added new `onPageHeaders()` event to allow for header modification as needed
* Added a `system.pages.dirs` configuration option to allow for configurable paths, and multiple page paths
* Added new `Pages::getSimplePagesHash` which is useful for caching pages specific data
* Updated to latest vendor libraries
1. [](#bugfix)
* An attempt to workaround windows reading locked file issue [getgrav/grav-plugin-admin#2299](https://github.com/getgrav/grav-plugin-admin/issues/2299)
* Force user index file to be updated to fix email addresses [getgrav/grav-plugin-login#229](https://github.com/getgrav/grav-plugin-login/issues/229)
# v1.7.36
## 09/08/2022
1. [](#new)
* Added `authorize-*@:` support for Flex blueprints, e.g. `authorize-disabled@: not delete` disables the field if user does not have access to delete object
* Added support for `flex-ignore@` to hide all the nested fields in the blueprint
1. [](#bugfix)
* Fixed login with a capitalised email address when using old users [getgrav/grav-plugin-login#229](https://github.com/getgrav/grav-plugin-login/issues/229)
# v1.7.35
## 08/04/2022
1. [](#new)
* Added support for `multipart/form-data` content type in PUT and PATCH requests
* Added support for object relationships
* Added variables `$environment` (string), `$request` (PSR-7 ServerRequestInterface|null) and `$uri` (PSR-7 Uri|null) to be used in `setup.php`
1. [](#improved)
* Minor vendor updates
# v1.7.34
## 06/14/2022
1. [](#new)
* Added back Yiddish to Language Codes [#3336](https://github.com/getgrav/grav/pull/3336)
* Ignore upcoming `media.json` file in media
1. [](#bugfix)
* Regression: Fixed saving page with a new language causing cache corruption [getgrav/grav-plugin-admin#2282](https://github.com/getgrav/grav-plugin-admin/issues/2282)
* Fixed a potential fatal error when using watermark in images
* Fixed `bin/grav install` command with arbitrary destination folder name
* Fixed Twig `|filter()` allowing code execution
* Fixed login and user search by email not being case-insensitive when using Flex Users
# v1.7.33
## 04/25/2022
1. [](#improved)
* When saving yaml and markdown, create also a cached version of the file and recompile it in opcache
2. [](#bugfix)
* Fixed missing changes in **yaml** & **markdown** files if saved multiple times during the same second because of a caching issue
* Fixed XSS check not detecting onX events without quotes
* Fixed default collection ordering in pages admin
# v1.7.32
## 03/28/2022
1. [](#new)
* Added `|replace_last(search, replace)` filter
* Added `parseurl` Twig function to expose PHP's `parse_url` function
2. [](#improved)
* Added multi-language support for page routes in `Utils::url()`
* Set default maximum length for text fields
- `password`: 256
- `email`: 320
- `text`, `url`, `hidden`, `commalist`: 2048
- `text` (multiline), `textarea`: 65536
3. [](#bugfix)
* Fixed issue with `system.cache.gzip: true` resulted in "Fetch Failed" for PHP 8.0.17 and PHP 8.1.4 [PHP issue #8218](https://github.com/php/php-src/issues/8218)
* Fix for multi-lang issues with Security Report
* Fixed page search not working with selected language [#3316](https://github.com/getgrav/grav/issues/3316)
# v1.7.31
## 03/14/2022
1. [](#new)
* Added new local Multiavatar (local generation). **This will be default in Grav 1.8**
* Added support to get image size for SVG vector images [#3533](https://github.com/getgrav/grav/pull/3533)
* Added XSS check for uploaded SVG files before they get stored
* Fixed phpstan issues (All level 2, Framework level 5)
2. [](#improved)
* Moved Accounts out of Experimental section of System configuration to new "Accounts" tab
3. [](#bugfix)
* Fixed `'mbstring' extension is not loaded` error, use Polyfill instead [#3504](https://github.com/getgrav/grav/pull/3504)
* Fixed new `Utils::pathinfo()` and `Utils::basename()` being too strict for legacy use [#3542](https://github.com/getgrav/grav/issues/3542)
* Fixed non-standard video html atributes generated by `{{ media.html() }}` [#3540](https://github.com/getgrav/grav/issues/3540)
* Fixed entity sanitization for XSS detection
* Fixed avatar save location when `account://` stream points to custom directory
* Fixed bug in `Utils::url()` when path contains part of root
# v1.7.30
## 02/07/2022
1. [](#new)
* Added twig filter `|field_parent` to get parent field name
2. [](#bugfix)
* Fixed error while deleting retina image in admin
* Fixed "Page Authors" field in Security tab, wrongly loading and saving the value [#3525](https://github.com/getgrav/grav/issues/3525)
* Fixed accounts filter only matches against email address [getgrav/grav-plugin-admin#2224](https://github.com/getgrav/grav-plugin-admin/issues/2224)
# v1.7.29.1
## 01/31/2022
1. [](#bugfix)
* Fixed `Call to undefined method` error when upgrading from Grav 1.6 [#3523](https://github.com/getgrav/grav/issues/3523)
# v1.7.29
## 01/28/2022
1. [](#new)
* Added support for registering assets from `HtmlBlock`
* Added unicode-safe `Utils::basename()` and `Utils::pathinfo()` methods
2. [](#improved)
* Improved `Filesystem::basename()` and `Filesystem::pathinfo()` to be unicode-safe
* Made path handling unicode-safe, use new `Utils::basename()` and `Utils::pathinfo()` everywhere
3. [](#bugfix)
* Fixed error on thumbnail image creation
* Fixed MimeType for `gzip` (`application/x-gzip`)
# v1.7.28
## 01/24/2022
1. [](#new)
* Added links and modules support to `HtmlBlock` class
* Added module support for twig script tag: `{% script module 'theme://js/module.mjs' %}`
* Added twig tag for links: `{% link icon 'theme://images/favicon.png' priority: 20 with { type: 'image/png' } %}`
* Added `HtmlBlock` support for `{% style %}`, `{% script %}` and `{% link %}` tags
* Support for page-level `redirect_default_route` frontmatter header override
3. [](#bugfix)
* Fixed XSS check not detecting escaped `&#58`
# v1.7.27.1
## 01/12/2022
3. [](#bugfix)
* Fixed a typo in CSS Asset pipeline that was erroneously joining files with `;`
# v1.7.27
## 01/12/2022
1. [](#new)
* Support for `YubiKey OTP` 2-Factor authenticator
* Added support for generic `assets.link()` for external references. No pipeline support
* Added support for `assets.addJsModule()` with full pipeline support
* Added `Utils::getExtensionsByMime()` method to get all the registered extensions for the specific mime type
* Added `Media::getRoute()` and `Media::getRawRoute()` methods to get page route if available
* Added `Medium::getAlternatives()` to be able to list all the retina sizes
2. [](#improved)
* Improved `Utils::download()` method to allow overrides on download name, mime and expires header
* Improved `onPageFallBackUrl` event
* Reorganized the Asset system configuration blueprint for clarity
3. [](#bugfix)
* Fixed CLI `--env` and `--lang` options having no effect if they aren't added before all the other options
* Fixed scaled image medium filename when using non-existing retina file
* Fixed an issue with JS `imports` and pipelining Assets
# v1.7.26.1
## 01/04/2022
3. [](#bugfix)
* Fixed `UserObject::getAccess()` after cloning the object
# v1.7.26
## 01/03/2022
1. [](#new)
* Made `Grav::redirect()` to accept `Route` class
* Added `translated()` method to `PageTranslateInterface`
* Added second parameter to `UserObject::isMyself()` method
* Added `UserObject::$isAuthorizedCallable` to allow `$user->isAuthorized()` customization
* Use secure session cookies in HTTPS by default (`system.session.secure_https: true`)
* Added new `Plugin::inheritedConfigOption()` function to access plugin specific functions for page overrides
2. [](#improved)
* Upgraded vendor libs for PHP 8.1 compatibility
* Upgraded to **composer v2.1.14** for PHP 8.1 compatibility
* Added third `$name` parameter to `Blueprint::flattenData()` method, useful for flattening repeating data
* `ControllerResponseTrait`: Redirect response should be json if the extension is .json
* When symlinking Grav install, include also tests
* Updated copyright year to `2022`
3. [](#bugfix)
* Fixed bad key lookup in `FlexRelatedDirectoryTrait::getCollectionByProperty()`
* Fixed RequestHandlers `NotFoundException` having empty request
* Block `.json` files in web server configs
* Disabled pretty debug info for Flex as it slows down Twig rendering
* Fixed Twig being very slow when template overrides do not exist
* Fixed `UserObject::$authorizeCallable` binding to the user object
* Fixed `FlexIndex::call()` to return null instead of failing to call undefined method
* Fixed Flex directory configuration creating environment configuration when it should not
# v1.7.25
## 11/16/2021
1. [](#new)
* Updated phpstan to v1.0
* Added `FlexObject::getDiff()` to see difference to the saved object
2. [](#improved)
* Use Symfony `dump` instead of PHP's `vardump` in side the `{{ vardump(x) }}` Twig vardump function
* Added `route` and `request` to `onPagesInitialized` event
* Improved page cloning, added method `Page::initialize()`
* Improved `FlexObject::getChanges()`: return changed lists and arrays as whole instead of just changed keys/values
* Improved form validation JSON responses to contain list of failed fields with their error messages
* Improved redirects: send redirect response in JSON if the request was in JSON
3. [](#bugfix)
* Fixed path traversal vulnerability when using `bin/grav server`
* Fixed unescaped error messages in JSON error responses
* Fixed `|t(variable)` twig filter in admin
* Fixed `FlexObject::getChanges()` always returning empty array
* Fixed form validation exceptions to use `400 Bad Request` instead of `500 Internal Server Error`
# v1.7.24
## 10/26/2021
1. [](#new)
* Added support for image watermarks
* Added support to disable a form, making it readonly
2. [](#improved)
* Flex `$user->authorize()` now checks user groups before `admin.super`, allowing deny rules to work properly
3. [](#bugfix)
* Fixed a bug in `PermissionsReader` in PHP 7.3
* Fixed `session_store_active` language option (#3464)
* Fixed deprecated warnings on `ArrayAccess` in PHP 8.1
* Fixed XSS detection with `&colon;`
# v1.7.23
## 09/29/2021
1. [](#new)
* Added method `Pages::referrerRoute()` to get the referrer route and language
* Added true unique `Utils::uniqueId()` / `{{ unique_id() }}` utilities with length, prefix, and suffix support
* Added `UserObject::isMyself()` method to check if flex user is currently logged in
* Added support for custom form field options validation with `validate: options: key|ignore`
2. [](#improved)
* Replaced GPL `SVG-Sanitizer` with MIT licensed `DOM-Sanitizer`
* `Uri::referrer()` now accepts third parameter, if set to `true`, it returns route without base or language code [#3411](https://github.com/getgrav/grav/issues/3411)
* Updated vendor libs with latest
* Updated with latest language strings via Crowdin.com
3. [](#bugfix)
* Fixed `Folder::move()` throwing an error when target folder is changed by only appending characters to the end [#3445](https://github.com/getgrav/grav/issues/3445)
* Fixed some phpstan issues (all code back to level 1, Framework level 3)
* Fixed form reset causing image uploads to fail when using Flex
# v1.7.22
## 09/16/2021
1. [](#new)
* Register plugin autoloaders into plugin objects
2. [](#improved)
* Improve Twig 2 compatibility
* Update to customized version of Twig DeferredExtension (Twig 1/2 compatible)
3. [](#bugfix)
* Fixed conflicting `$_original` variable in `Flex Pages`
# v1.7.21
## 09/14/2021
1. [](#new)
* Added `|yaml` filter to convert input to YAML
* Added `route` and `request` to `onPageNotFound` event
* Added file upload/remove support for `Flex Forms`
* Added support for `flex-required@: not exists` and `flex-required@: '!exists'` in blueprints
* Added `$object->getOriginalData()` to get flex objects data before it was modified with `update()`
* Throwing exceptions from Twig templates fires `onDisplayErrorPage.[code]` event allowing better error pages
2. [](#improved)
* Use a simplified text-based `cron` field for scheduler
* Add timestamp to logging output of scheduler jobs to see when they ran
3. [](#bugfix)
* Fixed escaping in PageIndex::getLevelListing()
* Fixed validation of `number` type [#3433](https://github.com/getgrav/grav/issues/3433)
* Fixed excessive `security.yaml` file creation [#3432](https://github.com/getgrav/grav/issues/3432)
* Fixed incorrect port :0 with nginx unix socket setup [#3439](https://github.com/getgrav/grav/issues/3439)
* Fixed `Session::setFlashCookieObject()` to use the same options as the main session cookie
# v1.7.20
## 09/01/2021
2. [](#improved)
* Added support for `task` and `action` inside JSON request body
# v1.7.19
## 08/31/2021
1. [](#new)
* Include active form and request in `onPageTask` and `onPageAction` events (defaults to `null`)
* Added `UserObject::$authorizeCallable` to allow `$user->authorize()` customization
2. [](#improved)
* Added meta support for `UploadedFile` class
* Added support for multiple mime-types per file extension [#3422](https://github.com/getgrav/grav/issues/3422)
* Added `setCurrent()` method to Page Collection [#3398](https://github.com/getgrav/grav/pull/3398)
* Initialize `$grav['uri']` before session
3. [](#bugfix)
* Fixed `Warning: Undefined array key "SERVER_SOFTWARE" in index.php` [#3408](https://github.com/getgrav/grav/issues/3408)
* Fixed error in `loadDirectoryConfig()` if configuration hasn't been saved [#3409](https://github.com/getgrav/grav/issues/3409)
* Fixed GPM not using non-standard cache path [#3410](https://github.com/getgrav/grav/issues/3410)
* Fixed broken `environment://` stream when it doesn't have configuration
* Fixed `Flex Object` missing key field value when using `FolderStorage`
* Fixed broken Twig try tag when catch has not been defined or is empty
* Fixed `FlexForm` serialization
* Fixed form validation for numeric values in PHP 8
* Fixed `flex-options@` in blueprints duplicating items in array
* Fixed wrong form issue with flex objects after cache clear
* Fixed Flex object types not implementing `MediaInterface`
* Fixed issue with `svgImageFunction()` that was causing broken output
# v1.7.18
## 07/19/2021
1. [](#improved)
* Added support for loading Flex Directory configuration from main configuration
* Move SVGs that cannot be sanitized to quarantine folder under `log://quarantine`
* Added support for CloudFlare-forwarded client IP in the `URI::ip()` method
1. [](#bugfix)
* Fixed error when using Flex `SimpleStorage` with no entries
* Fixed page search to include slug field [#3316](https://github.com/getgrav/grav/issues/3316)
* Fixed Admin becoming unusable when GPM cannot be reached [#3383](https://github.com/getgrav/grav/issues/3383)
* Fixed `Failed to save entry: Forbidden` when moving a page to a visible page [#3389](https://github.com/getgrav/grav/issues/3389)
* Better support for Symfony local server on linux [#3400](https://github.com/getgrav/grav/pull/3400)
* Fixed `open_basedir()` error with some forms
# v1.7.17
## 06/15/2021
1. [](#new)
* Interface `FlexDirectoryInterface` now extends `FlexAuthorizeInterface`
1. [](#improved)
* Allow to unset an asset attribute by specifying null (ie, `'defer': null`)
* Support specifying custom attributes to assets in a collection [Read more](https://learn.getgrav.org/17/themes/asset-manager#collections-with-attributes?target=_blank) [#3358](https://github.com/getgrav/grav/issues/3358)
* File `frontmatter.yaml` isn't part of media, ignore it
* Switched default `JQuery` collection to use 3.x rather than 2.x
1. [](#bugfix)
* Fixed missing styles when CSS/JS Pipeline is used and `asset://` folder is missing
* Fixed permission check when moving a page [#3382](https://github.com/getgrav/grav/issues/3382)
# v1.7.16
## 06/02/2021
1. [](#new)
* Added 'addFrame()' method to ImageMedium [#3323](https://github.com/getgrav/grav/pull/3323)
1. [](#improved)
* Set `cache.clear_images_by_default` to `false` by default
* Improve error on bad nested form data [#3364](https://github.com/getgrav/grav/issues/3364)
1. [](#bugfix)
* Improve Plugin and Theme initialization to fix PHP8 bug [#3368](https://github.com/getgrav/grav/issues/3368)
* Fixed `pathinfo()` twig filter in PHP7
* Fixed the first visible child page getting ordering number `999999.` [#3365](https://github.com/getgrav/grav/issues/3365)
* Fixed flex pages search using only folder name [#3316](https://github.com/getgrav/grav/issues/3316)
* Fixed flex pages using wrong type in `onBlueprintCreated` event [#3157](https://github.com/getgrav/grav/issues/3157)
* Fixed wrong SRI paths invoked when Grav instance as a sub folder [#3358](https://github.com/getgrav/grav/issues/3358)
* Fixed SRI trying to calculate remote assets, only ever set integrity for local files. Use the SRI provided by the remote source and manually add it in the `addJs/addCss` call for remote support. [#3358](https://github.com/getgrav/grav/issues/3358)
* Fix for weird regex issue with latest PHP versions on Intel Macs causing params to not parse properly in URI object
# v1.7.15
## 05/19/2021
1. [](#improved)
* Allow optional start date in page collections [#3350](https://github.com/getgrav/grav/pull/3350)
* Added `page` and `output` properties to `onOutputGenerated` and `onOutputRendered` events
1. [](#bugfix)
* Fixed twig deprecated TwigFilter messages [#3348](https://github.com/getgrav/grav/issues/3348)
* Fixed fatal error with some markdown links [getgrav/grav-premium-issues#95](https://github.com/getgrav/grav-premium-issues/issues/95)
* Fixed markdown media operations not working when using `image://` stream [#3333](https://github.com/getgrav/grav/issues/3333) [#3349](https://github.com/getgrav/grav/issues/3349)
* Fixed copying page without changing the slug [getgrav/grav-plugin-admin#2135](https://github.com/getgrav/grav-plugin-admin/issues/2139)
* Fixed missing and commonly used methods when using `system.twig.undefined_functions = false` [getgrav/grav-plugin-admin#2138](https://github.com/getgrav/grav-plugin-admin/issues/2138)
* Fixed uploading images into Flex Object if field destination is not set
# v1.7.14
## 04/29/2021
1. [](#new)
* Added `MediaUploadTrait::checkFileMetadata()` method
1. [](#improved)
* Updating a theme should always keep the custom files [getgrav/grav-plugin-admin#2135](https://github.com/getgrav/grav-plugin-admin/issues/2135)
1. [](#bugfix)
* Fixed broken numeric language codes in Flex Pages [#3332](https://github.com/getgrav/grav/issues/3332)
* Fixed broken `exif_imagetype()` twig function
# v1.7.13
## 04/23/2021
1. [](#new)
* Added support for getting translated collection of Flex Pages using `$collection->withTranslated('de')`
1. [](#improved)
* Moved `gregwar/Image` and `gregwar/Cache` in-house to official `getgrav/Image` and `getgrav/Cache` packagist packages. This will help environments with very strict proxy setups that don't allow VCS setup. [#3289](https://github.com/getgrav/grav/issues/3289)
* Improved XSS Invalid Protocol detection regex [#3298](https://github.com/getgrav/grav/issues/3298)
* Added support for user provided folder in Flex `$page->copy()`
1. [](#bugfix)
* Fixed `The "Grav/Common/Twig/TwigExtension" extension is not enabled` when using markdown twig tag [#3317](https://github.com/getgrav/grav/issues/3317)
* Fixed text field maxlength validation newline issue [#3324](https://github.com/getgrav/grav/issues/3324)
* Fixed a bug in Flex Object `refresh()` method
# v1.7.12
## 04/15/2021
1. [](#improved)
* Improve JSON support for the request
1. [](#bugfix)
* Fixed absolute path support for Windows [#3297](https://github.com/getgrav/grav/issues/3297)
* Fixed adding tags in admin after upgrading Grav [#3315](https://github.com/getgrav/grav/issues/3315)
# v1.7.11
## 04/13/2021
1. [](#new)
* Added configuration options to allow PHP methods to be used in Twig functions (`system.twig.safe_functions`) and filters (`system.twig.safe_filters`)
* Deprecated using PHP methods in Twig without them being in the safe lists
* Prevent dangerous PHP methods from being used as Twig functions and filters
* Restrict filesystem Twig functions to accept only local filesystem and grav streams
1. [](#improved)
* Better GPM detection of unauthorized installations
1. [](#bugfix)
* **IMPORTANT** Fixed security vulnerability with Twig allowing dangerous PHP functions by default [GHSA-g8r4-p96j-xfxc](https://github.com/getgrav/grav/security/advisories/GHSA-g8r4-p96j-xfxc)
* Fixed nxinx appending repeating `?_url=` in some redirects
* Fixed deleting page with language code not removing the folder if it was the last language [#3305](https://github.com/getgrav/grav/issues/3305)
* Fixed fatal error when using markdown links with `image://` stream [#3285](https://github.com/getgrav/grav/issues/3285)
* Fixed `system.languages.session_store_active` not having any effect [#3269](https://github.com/getgrav/grav/issues/3269)
* Fixed fatal error if `system.pages.types` is not an array [#2984](https://github.com/getgrav/grav/issues/2984)
# v1.7.10
## 04/06/2021
1. [](#new)
* Added initial support for running Grav library from outside the webroot [#3297](https://github.com/getgrav/grav/issues/3297)
1. [](#improved)
* Improved password handling when saving a user
1. [](#bugfix)
* Ignore errors when using `set_time_limit` in `Archiver` and `GPM\Response` classes [#3023](https://github.com/getgrav/grav/issues/3023)
* Fixed `Folder::move()` deleting the folder if you move folder into itself, created empty file instead
* Fixed moving `Flex Page` to itself causing the page to be lost [#3227](https://github.com/getgrav/grav/issues/3227)
* Fixed `PageStorage` from detecting files as pages
* Fixed `UserIndex` not implementing `UserCollectionInterface`
* Fixed missing `onAdminAfterDelete` event call in `Flex Pages`
* Fixed system templates not getting scanned [#3296](https://github.com/getgrav/grav/issues/3296)
* Fixed incorrect routing if url path looks like a domain name [#2184](https://github.com/getgrav/grav/issues/2184)
# v1.7.9
## 03/19/2021
1. [](#new)
* Added `Media::hide()` method to hide files from media
* Added `Utils::getPathFromToken()` method which works also with `Flex Objects`
* Added `FlexMediaTrait::getMediaField()`, which can be used to access custom media set in the blueprint fields
* Added `FlexMediaTrait::getFieldSettings()`, which can be used to get media field settings
1. [](#improved)
* Method `Utils::getPagePathFromToken()` now calls the more generic `Utils::getPathFromToken()`
* Updated `SECURITY.md` to use security@getgrav.org
1. [](#bugfix)
* Fixed broken media upload in `Flex` with `@self/path`, `@page` and `@theme` destinations [#3275](https://github.com/getgrav/grav/issues/3275)
* Fixed media fields excluding newly deleted files before saving the object
* Fixed method `$pages->find()` should never redirect [#3266](https://github.com/getgrav/grav/pull/3266)
* Fixed `Page::activeChild()` throwing an error [#3276](https://github.com/getgrav/grav/issues/3276)
* Fixed `Flex Page` CRUD ACL when creating a new page (needs Flex Objects plugin update) [grav-plugin-flex-objects#115](https://github.com/trilbymedia/grav-plugin-flex-objects/issues/115)
* Fixed the list of pages not showing up in admin [#3280](https://github.com/getgrav/grav/issues/3280)
* Fixed text field min/max validation for UTF8 characters [#3281](https://github.com/getgrav/grav/issues/3281)
* Fixed redirects using wrong redirect code
# v1.7.8
## 03/17/2021

View File

@@ -1,20 +1,19 @@
# ![](https://avatars1.githubusercontent.com/u/8237355?v=2&s=50) Grav
[![PHPStan](https://img.shields.io/badge/PHPStan-enabled-brightgreen.svg?style=flat)](https://github.com/phpstan/phpstan)
[![SensioLabsInsight](https://insight.sensiolabs.com/projects/cfd20465-d0f8-4a0a-8444-467f5b5f16ad/mini.png)](https://insight.sensiolabs.com/projects/cfd20465-d0f8-4a0a-8444-467f5b5f16ad)
[![Discord](https://img.shields.io/discord/501836936584101899.svg?logo=discord&colorB=728ADA&label=Discord%20Chat)](https://chat.getgrav.org)
[![PHP Tests](https://github.com/getgrav/grav/workflows/PHP%20Tests/badge.svg?branch=develop)](https://github.com/getgrav/grav/actions?query=workflow%3A%22PHP+Tests%22) [![OpenCollective](https://opencollective.com/grav/backers/badge.svg)](#backers) [![OpenCollective](https://opencollective.com/grav/sponsors/badge.svg)](#sponsors)
[![PHP Tests](https://github.com/getgrav/grav/workflows/PHP%20Tests/badge.svg?branch=develop)](https://github.com/getgrav/grav/actions?query=workflow%3A%22PHP+Tests%22) [![OpenCollective](https://opencollective.com/grav/tiers/backers/badge.svg?label=Backers&color=brightgreen)](#backers) [![OpenCollective](https://opencollective.com/grav/tiers/supporters/badge.svg?label=Supporters&color=brightgreen)](#supporters) [![OpenCollective](https://opencollective.com/grav/tiers/sponsors/badge.svg?label=Sponsors&color=brightgreen)](#sponsors)
Grav is a **Fast**, **Simple**, and **Flexible**, file-based Web-platform. There is **Zero** installation required. Just extract the ZIP archive, and you are already up and running. It follows similar principles to other flat-file CMS platforms, but has a different design philosophy than most. Grav comes with a powerful **Package Management System** to allow for simple installation and upgrading of plugins and themes, as well as simple updating of Grav itself.
The underlying architecture of Grav is designed to use well-established and _best-in-class_ technologies to ensure that Grav is simple to use and easy to extend. Some of these key technologies include:
* [Twig Templating](https://twig.sensiolabs.org/): for powerful control of the user interface
* [Twig Templating](https://twig.symfony.com/): for powerful control of the user interface
* [Markdown](https://en.wikipedia.org/wiki/Markdown): for easy content creation
* [YAML](https://yaml.org): for simple configuration
* [Parsedown](https://parsedown.org/): for fast Markdown and Markdown Extra support
* [Doctrine Cache](https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html): layer for performance
* [Pimple Dependency Injection Container](https://pimple.sensiolabs.org/): for extensibility and maintainability
* [Pimple Dependency Injection Container](https://github.com/silexphp/Pimple): for extensibility and maintainability
* [Symfony Event Dispatcher](https://symfony.com/doc/current/components/event_dispatcher/introduction.html): for plugin event handling
* [Symfony Console](https://symfony.com/doc/current/components/console/introduction.html): for CLI interface
* [Gregwar Image Library](https://github.com/Gregwar/Image): for dynamic image manipulation
@@ -118,12 +117,19 @@ If you discover a possible security issue related to Grav or one of its plugins,
* More [Awesome Grav Stuff](https://github.com/getgrav/awesome-grav)
# Backers
Support Grav with a monthly donation to help us continue development. [[Become a backer](https://opencollective.com/grav#backer)]
Support Grav with a monthly donation to help us continue development. [[Become a backer](https://opencollective.com/grav/contribute)]
<img src="https://opencollective.com/grav/tiers/backers.svg?avatarHeight=36&width=600" />
# Supporters
Support Grav with a monthly donation to help us continue development. [[Become a supporter](https://opencollective.com/grav/contribute)]
<img src="https://opencollective.com/grav/tiers/supporters.svg?avatarHeight=36&width=600" />
# Sponsors
Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/grav#sponsor)]
Support Grav with a yearly donation to help us continue development. [[Become a sponsor](https://opencollective.com/grav/contribute)]
<img src="https://opencollective.com/grav/tiers/sponsors.svg?avatarHeight=36&width=600" />

View File

@@ -18,4 +18,12 @@ If you cannot update to the latest stable version available because, for example
## Reporting a Vulnerability
Please contact contact@getgrav.org with a detailed explaination of the security issue found and we will work with you to get it resolved as fast as possible.
Please contact security@getgrav.org with a detailed explanation of the security issue found. If it appears to be a legitimate issues, please submit an **advisory via GitHub Security**: https://github.com/getgrav/grav/security/advisories
>> NOTE: Please do not use 3rd party security issue reporting services, we like to keep everything in the GitHub ecosystem for easier manageability.
## Bug Bounties
We do greatly appreciate your efforts to improve Grav, but unfortunately because we are a small open source project, we **do not have the resources to offer bounties** for security issues found.

View File

@@ -1 +1 @@
/* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. */
/* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved. */

View File

@@ -1 +1 @@
/* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. */
/* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved. */

Binary file not shown.

14
bin/gpm
View File

@@ -2,7 +2,7 @@
<?php
/**
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -25,18 +25,10 @@ if (!file_exists(__DIR__ . '/../vendor/autoload.php')){
$autoload = require __DIR__ . '/../vendor/autoload.php';
if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) {
exit(sprintf("You are running PHP %s, but Grav needs at least PHP %s to run.\n", $ver, $req));
}
if (!ini_get('date.timezone')) {
date_default_timezone_set('UTC');
}
// Set timezone to default, falls back to system if php.ini not set
date_default_timezone_set(@date_default_timezone_get());
// Set internal encoding.
if (!\extension_loaded('mbstring')) {
die("'mbstring' extension is not loaded. This is required for Grav to run correctly");
}
@ini_set('default_charset', 'UTF-8');
mb_internal_encoding('UTF-8');

View File

@@ -2,7 +2,7 @@
<?php
/**
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -25,18 +25,10 @@ if (!file_exists(__DIR__ . '/../vendor/autoload.php')){
$autoload = require __DIR__ . '/../vendor/autoload.php';
if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) {
exit(sprintf("You are running PHP %s, but Grav needs at least PHP %s to run.\n", $ver, $req));
}
if (!ini_get('date.timezone')) {
date_default_timezone_set('UTC');
}
// Set timezone to default, falls back to system if php.ini not set
date_default_timezone_set(@date_default_timezone_get());
// Set internal encoding.
if (!\extension_loaded('mbstring')) {
die("'mbstring' extension is not loaded. This is required for Grav to run correctly");
}
@ini_set('default_charset', 'UTF-8');
mb_internal_encoding('UTF-8');

View File

@@ -2,7 +2,7 @@
<?php
/**
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -25,18 +25,10 @@ if (!file_exists(__DIR__ . '/../vendor/autoload.php')){
$autoload = require __DIR__ . '/../vendor/autoload.php';
if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) {
exit(sprintf("You are running PHP %s, but Grav needs at least PHP %s to run.\n", $ver, $req));
}
if (!ini_get('date.timezone')) {
date_default_timezone_set('UTC');
}
// Set timezone to default, falls back to system if php.ini not set
date_default_timezone_set(@date_default_timezone_get());
// Set internal encoding.
if (!\extension_loaded('mbstring')) {
die("'mbstring' extension is not loaded. This is required for Grav to run correctly");
}
@ini_set('default_charset', 'UTF-8');
mb_internal_encoding('UTF-8');

2
cache/.gitkeep vendored
View File

@@ -1 +1 @@
/* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. */
/* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved. */

View File

@@ -19,17 +19,19 @@
"ext-zip": "*",
"ext-dom": "*",
"ext-libxml": "*",
"symfony/polyfill-mbstring": "~1.20",
"symfony/polyfill-iconv": "^1.20",
"symfony/polyfill-php74": "^1.20",
"symfony/polyfill-php80": "^1.20",
"ext-gd": "*",
"symfony/polyfill-mbstring": "~1.23",
"symfony/polyfill-iconv": "^1.23",
"symfony/polyfill-php74": "^1.23",
"symfony/polyfill-php80": "^1.23",
"symfony/polyfill-php81": "^1.23",
"psr/simple-cache": "^1.0",
"psr/http-message": "^1.0",
"psr/http-server-middleware": "^1.0",
"psr/container": "~1.0.0",
"psr/container": "~1.1.0",
"nyholm/psr7-server": "^1.0",
"nyholm/psr7": "^1.3",
"twig/twig": "~1.44",
"twig/twig": "~v1.44",
"erusev/parsedown": "^1.7",
"erusev/parsedown-extra": "~0.8",
"symfony/contracts": "~1.1",
@@ -44,30 +46,29 @@
"filp/whoops": "~2.9",
"matthiasmullie/minify": "^1.3",
"monolog/monolog": "~1.25",
"gregwar/image": "dev-php8",
"gregwar/cache": "dev-php8",
"getgrav/image": "^3.0",
"getgrav/cache": "^2.0",
"donatj/phpuseragentparser": "~1.1",
"pimple/pimple": "~3.3.0",
"pimple/pimple": "~3.5.0",
"rockettheme/toolbox": "~1.5",
"maximebf/debugbar": "~1.16",
"league/climate": "^3.6",
"antoligy/dom-string-iterators": "^1.0",
"miljar/php-exif": "^0.6",
"composer/ca-bundle": "^1.2",
"dragonmantank/cron-expression": "^1.2",
"phive/twig-extensions-deferred": "^1.0",
"willdurand/negotiation": "^3.0",
"itsgoingd/clockwork": "^5.0",
"enshrined/svg-sanitize": "~0.13",
"symfony/http-client": "^4.4",
"composer/semver": "^1.4"
"composer/semver": "^1.4",
"rhukster/dom-sanitizer": "^1.0",
"multiavatar/multiavatar-php": "^1.0"
},
"require-dev": {
"codeception/codeception": "^4.1",
"phpstan/phpstan": "^0.12",
"phpstan/phpstan-deprecation-rules": "^0.12",
"phpstan/phpstan": "^1.8",
"phpstan/phpstan-deprecation-rules": "^1.0",
"phpunit/php-code-coverage": "~9.2",
"victorjonsson/markdowndocs": "dev-master",
"getgrav/markdowndocs": "^2.0",
"codeception/module-asserts": "^1.3",
"codeception/module-phpbrowser": "^1.0",
"symfony/service-contracts": "*"
@@ -83,7 +84,8 @@
"ext-intl": "Recommended for multi-language sites",
"ext-memcache": "Needed to support Memcache servers",
"ext-memcached": "Needed to support Memcached servers",
"ext-redis": "Needed to support Redis servers"
"ext-redis": "Needed to support Redis servers",
"ext-exif": "Needed to use exif data from images."
},
"config": {
"apcu-autoloader": true,
@@ -91,28 +93,22 @@
"php": "7.3.6"
}
},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/trilbymedia/PHP-Markdown-Documentation-Generator"
},
{
"type": "vcs",
"url": "https://github.com/getgrav/Cache"
},
{
"type": "vcs",
"url": "https://github.com/getgrav/Image"
}
],
"autoload": {
"psr-4": {
"Grav\\": "system/src/Grav"
"Grav\\": "system/src/Grav",
"Twig\\": "system/src/Twig"
},
"files": [
"system/defines.php"
"system/defines.php",
"system/src/DOMLettersIterator.php",
"system/src/DOMWordsIterator.php"
]
},
"autoload-dev": {
"psr-4": {
"PHPStan\\": "tests/phpstan/classes"
}
},
"archive": {
"exclude": [
"VERSION"
@@ -121,8 +117,8 @@
"scripts": {
"api-17": "vendor/bin/phpdoc-md generate system/src > user/pages/14.api/default.17.md",
"post-create-project-cmd": "bin/grav install",
"phpstan": "vendor/bin/phpstan analyse -l 1 -c ./tests/phpstan/phpstan.neon --memory-limit=480M system/src",
"phpstan-framework": "vendor/bin/phpstan analyse -l 1 -c ./tests/phpstan/phpstan.neon --memory-limit=480M system/src/Grav/Framework system/src/Grav/Events system/src/Grav/Installer",
"phpstan": "vendor/bin/phpstan analyse -l 2 -c ./tests/phpstan/phpstan.neon --memory-limit=720M system/src",
"phpstan-framework": "vendor/bin/phpstan analyse -l 5 -c ./tests/phpstan/phpstan.neon --memory-limit=480M system/src/Grav/Framework system/src/Grav/Events system/src/Grav/Installer",
"phpstan-plugins": "vendor/bin/phpstan analyse -l 1 -c ./tests/phpstan/plugins.neon --memory-limit=400M user/plugins",
"test": "vendor/bin/codecept run unit",
"test-windows": "vendor\\bin\\codecept run unit"

2279
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1 +1 @@
/* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. */
/* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved. */

View File

@@ -3,7 +3,7 @@
/**
* @package Grav.Core
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -12,28 +12,14 @@ namespace Grav;
\define('GRAV_REQUEST_TIME', microtime(true));
\define('GRAV_PHP_MIN', '7.3.6');
if (version_compare($ver = PHP_VERSION, $req = GRAV_PHP_MIN, '<')) {
die(sprintf('You are running PHP %s, but Grav needs at least <strong>PHP %s</strong> to run.', $ver, $req));
}
if (PHP_SAPI === 'cli-server') {
$symfony_server = stripos(getenv('_'), 'symfony') !== false || stripos($_SERVER['SERVER_SOFTWARE'], 'symfony
') !== false;
$symfony_server = stripos(getenv('_'), 'symfony') !== false || stripos($_SERVER['SERVER_SOFTWARE'] ?? '', 'symfony') !== false || stripos($_ENV['SERVER_SOFTWARE'] ?? '', 'symfony') !== false;
if (!isset($_SERVER['PHP_CLI_ROUTER']) && !$symfony_server) {
die("PHP webserver requires a router to run Grav, please use: <pre>php -S {$_SERVER['SERVER_NAME']}:{$_SERVER['SERVER_PORT']} system/router.php</pre>");
}
}
// Set timezone to default, falls back to system if php.ini not set
date_default_timezone_set(@date_default_timezone_get());
// Set internal encoding.
if (!\extension_loaded('mbstring')) {
die("'mbstring' extension is not loaded. This is required for Grav to run correctly");
}
@ini_set('default_charset', 'UTF-8');
mb_internal_encoding('UTF-8');
// Ensure vendor libraries exist
$autoload = __DIR__ . '/vendor/autoload.php';
if (!is_file($autoload)) {
@@ -43,23 +29,23 @@ if (!is_file($autoload)) {
// Register the auto-loader.
$loader = require $autoload;
// Set timezone to default, falls back to system if php.ini not set
date_default_timezone_set(@date_default_timezone_get());
// Set internal encoding.
@ini_set('default_charset', 'UTF-8');
mb_internal_encoding('UTF-8');
use Grav\Common\Grav;
use RocketTheme\Toolbox\Event\Event;
// Get the Grav instance
$grav = Grav::instance(
array(
'loader' => $loader
)
);
$grav = Grav::instance(array('loader' => $loader));
// Process the page
try {
$grav->process();
} catch (\Error $e) {
$grav->fireEvent('onFatalException', new Event(array('exception' => $e)));
throw $e;
} catch (\Exception $e) {
} catch (\Error|\Exception $e) {
$grav->fireEvent('onFatalException', new Event(array('exception' => $e)));
throw $e;
}

View File

@@ -1 +1 @@
/* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved. */
/* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved. */

View File

@@ -1,16 +1,21 @@
User-agent: *
Disallow: /.github/
Disallow: /.phan/
Disallow: /assets/
Disallow: /backup/
Disallow: /bin/
Disallow: /cache/
Disallow: /grav/
Disallow: /logs/
Disallow: /system/
Disallow: /vendor/
Disallow: /tests/
Disallow: /tmp/
Disallow: /user/
Disallow: /vendor/
Disallow: /webserver-configs/
Allow: /user/pages/
Allow: /user/themes/
Allow: /user/images/
Allow: /
Allow: *.css$
Allow: *.js$
Allow: /system/*.js$
Allow: /system/*.js$

View File

@@ -14,11 +14,8 @@ div.phpdebugbar {
padding: 5px 8px;
}
.phpdebugbar div.phpdebugbar-header, .phpdebugbar a.phpdebugbar-restore-btn {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAA/1BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeHh4AAAD///8EBAT7+/sLCwv29vYVFRUvLy/t7e3m5ubCwsKxsbE/Pz+mpqZMTEwcHBzy8vLp6emfn5+AgIA2Njbi4uLf39+rq6tzc3NWVlYhISHa2trW1tbS0tLMzMy7u7uZmZmUlJSMjIxvb29kZGRHR0c7Ozt5eXkqKiq1tbWQkJBqampbW1tSUlLHx8eHh4ckJCRDQ0M3wD42AAAAI3RSTlMA/PibTbQ0x76TVAlw4LhZLOuEYCAN9Hjx0a2ppGZEGYw97djhXHwAAATZSURBVFjDlVcHW+MwDO1eFCjj2McNOzvdpXTTXVbL/P+/5SQ7QSSX5Di1X1onfi/Sk+Q4sTDbKqWK+YuznZ2zi3wxVdqK/Zf92M1nT9gnO8rmd398GX6Z3xaoOFoiAQcx3E5efgmeSuN8F6Xg1x3G06l/wjNpMR1B0uif4EhnIuFb+0diIoFXk3IVfokisR+h52GO4JKgyjmfaMhAFNlSaPR7DpwI+lzn/E4QKIqmKIJirxCMP4izBPPZPXhgXwMBYgULw0nfg/BF5scDbslb7QeJ08yqqTEmGYoB95d4H8ETL8+n9wBqrLu6ao3bBsMwAnxISf/9BHcqxNB8Y7cWl3Zz7TAUfPrvAT6AoNEFFXvsjutL01yOuMrtBxnFXsmT/1wQHmdWAFNnI3uI48Yj0FUcHbKf62GfUfr8eeQt7Uk3mQZpZNoVRPEui5vtEz5zFEpgWnyqVBZMc6oaGNriH2hGVZ0OxEvInPeMaZWJBA7vmPbCr5jjws5HBnAUxvDMH40aCIf4G5BjRQSs8E8HFFYf8bGxgDvD55bzGhwWkoBcuIyHR/AMdaCagxXDhtL6tSqoWpd4BMnlIR+Or+rYTK/a3EAGcc6e4AWHISnWv20iCCojsHoVlQdjrMexFF2C7UMg2A2WEGWbQhXN6l3eXC6XGp4b9qxbuEB2EBGBwtocrK90cVG5mbRXm6vmx/0phq1sIAGKDgLOBiN1MrO5a9aDl+D0W6x0Ar9BCTRuIIANa90Y7LrLVRXzwVtDInCqMRWcf2bUOEAsa4wJqFowQALL9EiAtVRk8QC4OW+1pOM9jIaVASwYagyNXDj+W0NcfuZNzjtXOiL0Zzg30Llj+ptfxQs4+vBPNiL5PawFCBkgXpUaVtqGl+A8dgZHL34BcBUQrwPptToW+o37Ku+UH9eYByJIx3YkAeFnMFuGO7S5gEp7YhXxa5OOAM39RXDPXb0qmpROsswZe+twXdU55oUIZAiEv3bD1UFwIYKkmGqytPCDCwKFQCKK0yL7qtSAPX54UAbtsLuBHkb9zyLmPQSNjsSgmQwKUOIfEY8F8t4B34DvndJY9BA8tNBJq1Nev9axmaStFcQLhgYoCTo0salkIaW8OUDdWjMTR2sHPhrAFZqx6cqcKE4pl2BJJ4K6hfwvqNgAnXfKX/HU6X3Zrhnu0k7tLNZtTBRv1hkwTDBY1NzFU6doDYjJbWdQkQhWwuU7/LvhTh3SDoco4ECL4i5dwURbc8NdDZz2IwKicE8d0KIqWetLE3+lL4hvUuGSeRfVWNLfj/gpOw4smBJBkKQHCzlHGwvAj4woB1gq5NGGLSXtORBPnUQPV5/MPVkDMxbpwG7w4x0xL6Ltxka0A/4NBvV09UVk4DoSn/jl2+JQS9q9KYawisAD4CfhsZ4TH3htylsdEHARIQBusqCKyUpymycgbbkkXEXjT3z7/oKQFTFVuZD2FMJHZIDsO5x2d4aAr2jR+GLwZhtAb028/0yJ9J8dE87jQyKObcjtTXT8dH+fDuKF4/eiPwzH44wTf/yUi6wrpRIOZ9lM1EtXAifFI+CJn9+iX/t2xMQwOMth/UZbASi8btAwR9FHWSpJr75g9Oqbin3VDg+SpwlP6k6TB4ex/7JvmcJx8jydy6XPk8eFTKhyfwCgX71MSvaBHgAAAABJRU5ErkJggg==);
}
.phpdebugbar a.phpdebugbar-restore-btn {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAA/1BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeHh4AAAD///8EBAT7+/sLCwv29vYVFRUvLy/t7e3m5ubCwsKxsbE/Pz+mpqZMTEwcHBzy8vLp6emfn5+AgIA2Njbi4uLf39+rq6tzc3NWVlYhISHa2trW1tbS0tLMzMy7u7uZmZmUlJSMjIxvb29kZGRHR0c7Ozt5eXkqKiq1tbWQkJBqampbW1tSUlLHx8eHh4ckJCRDQ0M3wD42AAAAI3RSTlMA/PibTbQ0x76TVAlw4LhZLOuEYCAN9Hjx0a2ppGZEGYw97djhXHwAAATZSURBVFjDlVcHW+MwDO1eFCjj2McNOzvdpXTTXVbL/P+/5SQ7QSSX5Di1X1onfi/Sk+Q4sTDbKqWK+YuznZ2zi3wxVdqK/Zf92M1nT9gnO8rmd398GX6Z3xaoOFoiAQcx3E5efgmeSuN8F6Xg1x3G06l/wjNpMR1B0uif4EhnIuFb+0diIoFXk3IVfokisR+h52GO4JKgyjmfaMhAFNlSaPR7DpwI+lzn/E4QKIqmKIJirxCMP4izBPPZPXhgXwMBYgULw0nfg/BF5scDbslb7QeJ08yqqTEmGYoB95d4H8ETL8+n9wBqrLu6ao3bBsMwAnxISf/9BHcqxNB8Y7cWl3Zz7TAUfPrvAT6AoNEFFXvsjutL01yOuMrtBxnFXsmT/1wQHmdWAFNnI3uI48Yj0FUcHbKf62GfUfr8eeQt7Uk3mQZpZNoVRPEui5vtEz5zFEpgWnyqVBZMc6oaGNriH2hGVZ0OxEvInPeMaZWJBA7vmPbCr5jjws5HBnAUxvDMH40aCIf4G5BjRQSs8E8HFFYf8bGxgDvD55bzGhwWkoBcuIyHR/AMdaCagxXDhtL6tSqoWpd4BMnlIR+Or+rYTK/a3EAGcc6e4AWHISnWv20iCCojsHoVlQdjrMexFF2C7UMg2A2WEGWbQhXN6l3eXC6XGp4b9qxbuEB2EBGBwtocrK90cVG5mbRXm6vmx/0phq1sIAGKDgLOBiN1MrO5a9aDl+D0W6x0Ar9BCTRuIIANa90Y7LrLVRXzwVtDInCqMRWcf2bUOEAsa4wJqFowQALL9EiAtVRk8QC4OW+1pOM9jIaVASwYagyNXDj+W0NcfuZNzjtXOiL0Zzg30Llj+ptfxQs4+vBPNiL5PawFCBkgXpUaVtqGl+A8dgZHL34BcBUQrwPptToW+o37Ku+UH9eYByJIx3YkAeFnMFuGO7S5gEp7YhXxa5OOAM39RXDPXb0qmpROsswZe+twXdU55oUIZAiEv3bD1UFwIYKkmGqytPCDCwKFQCKK0yL7qtSAPX54UAbtsLuBHkb9zyLmPQSNjsSgmQwKUOIfEY8F8t4B34DvndJY9BA8tNBJq1Nev9axmaStFcQLhgYoCTo0salkIaW8OUDdWjMTR2sHPhrAFZqx6cqcKE4pl2BJJ4K6hfwvqNgAnXfKX/HU6X3Zrhnu0k7tLNZtTBRv1hkwTDBY1NzFU6doDYjJbWdQkQhWwuU7/LvhTh3SDoco4ECL4i5dwURbc8NdDZz2IwKicE8d0KIqWetLE3+lL4hvUuGSeRfVWNLfj/gpOw4smBJBkKQHCzlHGwvAj4woB1gq5NGGLSXtORBPnUQPV5/MPVkDMxbpwG7w4x0xL6Ltxka0A/4NBvV09UVk4DoSn/jl2+JQS9q9KYawisAD4CfhsZ4TH3htylsdEHARIQBusqCKyUpymycgbbkkXEXjT3z7/oKQFTFVuZD2FMJHZIDsO5x2d4aAr2jR+GLwZhtAb028/0yJ9J8dE87jQyKObcjtTXT8dH+fDuKF4/eiPwzH44wTf/yUi6wrpRIOZ9lM1EtXAifFI+CJn9+iX/t2xMQwOMth/UZbASi8btAwR9FHWSpJr75g9Oqbin3VDg+SpwlP6k6TB4ex/7JvmcJx8jydy6XPk8eFTKhyfwCgX71MSvaBHgAAAABJRU5ErkJggg==);
width: 13px;
}

View File

@@ -47,7 +47,8 @@ form:
label: PLUGIN_ADMIN.EXTRA_ARGUMENTS
placeholder: '-lah'
.at:
type: cron
type: text
wrapper_classes: cron-selector
label: PLUGIN_ADMIN.SCHEDULER_RUNAT
help: PLUGIN_ADMIN.SCHEDULER_RUNAT_HELP
placeholder: '* * * * *'

View File

@@ -448,6 +448,17 @@ form:
validate:
type: bool
languages.debug:
type: toggle
label: PLUGIN_ADMIN.LANGUAGE_DEBUG
help: PLUGIN_ADMIN.LANGUAGE_DEBUG_HELP
highlight: 0
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
validate:
type: bool
http_headers:
type: tab
title: PLUGIN_ADMIN.HTTP_HEADERS
@@ -608,7 +619,6 @@ form:
file: File
apc: APC
apcu: APCu
xcache: Xcache
memcache: Memcache
memcached: Memcached
wincache: WinCache
@@ -646,7 +656,7 @@ form:
type: toggle
label: PLUGIN_ADMIN.CLEAR_IMAGES_BY_DEFAULT
help: PLUGIN_ADMIN.CLEAR_IMAGES_BY_DEFAULT_HELP
highlight: 1
highlight: 0
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
@@ -888,9 +898,45 @@ form:
title: PLUGIN_ADMIN.ASSETS
fields:
assets_section:
general_config_section:
type: section
title: PLUGIN_ADMIN.ASSETS
title: PLUGIN_ADMIN.GENERAL_CONFIG
underline: true
assets.enable_asset_timestamp:
type: toggle
label: PLUGIN_ADMIN.ENABLED_TIMESTAMPS_ON_ASSETS
help: PLUGIN_ADMIN.ENABLED_TIMESTAMPS_ON_ASSETS_HELP
highlight: 0
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
validate:
type: bool
assets.enable_asset_sri:
type: toggle
label: PLUGIN_ADMIN.ENABLED_SRI_ON_ASSETS
help: PLUGIN_ADMIN.ENABLED_SRI_ON_ASSETS_HELP
highlight: 0
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
validate:
type: bool
assets.collections:
type: multilevel
label: PLUGIN_ADMIN.COLLECTIONS
placeholder_key: collection_name
placeholder_value: collection_path
validate:
type: array
css_assets_section:
type: section
title: PLUGIN_ADMIN.CSS_ASSETS
underline: true
assets.css_pipeline:
@@ -959,6 +1005,11 @@ form:
validate:
type: bool
js_assets_section:
type: section
title: PLUGIN_ADMIN.JS_ASSETS
underline: true
assets.js_pipeline:
type: toggle
label: PLUGIN_ADMIN.JAVASCRIPT_PIPELINE
@@ -1003,10 +1054,15 @@ form:
validate:
type: bool
assets.enable_asset_timestamp:
js_module_assets_section:
type: section
title: PLUGIN_ADMIN.JS_MODULE_ASSETS
underline: true
assets.js_module_pipeline:
type: toggle
label: PLUGIN_ADMIN.ENABLED_TIMESTAMPS_ON_ASSETS
help: PLUGIN_ADMIN.ENABLED_TIMESTAMPS_ON_ASSETS_HELP
label: PLUGIN_ADMIN.JAVASCRIPT_MODULE_PIPELINE
help: PLUGIN_ADMIN.JAVASCRIPT_MODULE_PIPELINE_HELP
highlight: 0
options:
1: PLUGIN_ADMIN.YES
@@ -1014,24 +1070,29 @@ form:
validate:
type: bool
assets.enable_asset_sri:
assets.js_module_pipeline_include_externals:
type: toggle
label: PLUGIN_ADMIN.ENABLED_SRI_ON_ASSETS
help: PLUGIN_ADMIN.ENABLED_SRI_ON_ASSETS_HELP
highlight: 0
label: PLUGIN_ADMIN.JAVASCRIPT_MODULE_PIPELINE_INCLUDE_EXTERNALS
help: PLUGIN_ADMIN.JAVASCRIPT_MODULE_PIPELINE_INCLUDE_EXTERNALS_HELP
highlight: 1
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
validate:
type: bool
assets.collections:
type: multilevel
label: PLUGIN_ADMIN.COLLECTIONS
placeholder_key: collection_name
placeholder_value: collection_path
assets.js_module_pipeline_before_excludes:
type: toggle
label: PLUGIN_ADMIN.JAVASCRIPT_MODULE_PIPELINE_BEFORE_EXCLUDES
help: PLUGIN_ADMIN.JAVASCRIPT_MODULE_PIPELINE_BEFORE_EXCLUDES_HELP
highlight: 1
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
validate:
type: array
type: bool
errors:
type: tab
@@ -1105,6 +1166,13 @@ form:
local6: local6
local7: local7
log.syslog.tag:
type: text
size: small
label: PLUGIN_ADMIN.SYSLOG_TAG
help: PLUGIN_ADMIN.SYSLOG_TAG_HELP
placeholder: "grav"
debugger:
type: tab
title: PLUGIN_ADMIN.DEBUGGER
@@ -1282,6 +1350,45 @@ form:
validate:
type: commalist
section_images_cls:
type: section
title: PLUGIN_ADMIN.IMAGES_CLS_TITLE
underline: true
images.cls.auto_sizes:
type: toggle
label: PLUGIN_ADMIN.IMAGES_CLS_AUTO_SIZES
help: PLUGIN_ADMIN.IMAGES_CLS_AUTO_SIZES_HELP
highlight: 0
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
validate:
type: bool
images.cls.aspect_ratio:
type: toggle
label: PLUGIN_ADMIN.IMAGES_CLS_ASPECT_RATIO
help: PLUGIN_ADMIN.IMAGES_CLS_ASPECT_RATIO_HELP
highlight: 0
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
validate:
type: bool
images.cls.retina_scale:
type: select
label: PLUGIN_ADMIN.IMAGES_CLS_RETINA_SCALE
help: PLUGIN_ADMIN.IMAGES_CLS_RETINA_SCALE_HELP
size: small
highlight: 1
options:
1: 1X
2: 2X
3: 3X
4: 4X
session:
type: tab
title: PLUGIN_ADMIN.SESSION
@@ -1355,6 +1462,18 @@ form:
validate:
type: bool
session.secure_https:
type: toggle
label: PLUGIN_ADMIN.SESSION_SECURE_HTTPS
help: PLUGIN_ADMIN.SESSION_SECURE_HTTPS_HELP
highlight: 1
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
default: true
validate:
type: bool
session.httponly:
type: toggle
label: PLUGIN_ADMIN.SESSION_HTTPONLY
@@ -1407,6 +1526,10 @@ form:
title: PLUGIN_ADMIN.ADVANCED
underline: true
gpm_section:
type: section
title: PLUGIN_ADMIN.GPM_SECTION
gpm.releases:
type: toggle
label: PLUGIN_ADMIN.GPM_RELEASES
@@ -1416,23 +1539,6 @@ form:
stable: PLUGIN_ADMIN.STABLE
testing: PLUGIN_ADMIN.TESTING
gpm.proxy_url:
type: text
size: medium
placeholder: "e.g. 127.0.0.1:3128"
label: PLUGIN_ADMIN.PROXY_URL
help: PLUGIN_ADMIN.PROXY_URL_HELP
gpm.method:
type: toggle
label: PLUGIN_ADMIN.GPM_METHOD
highlight: auto
help: PLUGIN_ADMIN.GPM_METHOD_HELP
options:
auto: PLUGIN_ADMIN.AUTO
fopen: PLUGIN_ADMIN.FOPEN
curl: PLUGIN_ADMIN.CURL
gpm.official_gpm_only:
type: toggle
label: PLUGIN_ADMIN.GPM_OFFICIAL_ONLY
@@ -1445,17 +1551,80 @@ form:
validate:
type: bool
gpm.verify_peer:
http_section:
type: section
title: PLUGIN_ADMIN.HTTP_SECTION
http.method:
type: toggle
label: PLUGIN_ADMIN.GPM_VERIFY_PEER
label: PLUGIN_ADMIN.GPM_METHOD
highlight: auto
help: PLUGIN_ADMIN.GPM_METHOD_HELP
options:
auto: PLUGIN_ADMIN.AUTO
fopen: PLUGIN_ADMIN.FOPEN
curl: PLUGIN_ADMIN.CURL
http.enable_proxy:
type: toggle
label: PLUGIN_ADMIN.SSL_ENABLE_PROXY
highlight: 1
help: PLUGIN_ADMIN.GPM_VERIFY_PEER_HELP
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
default: false
validate:
type: bool
http.proxy_url:
type: text
size: medium
placeholder: "e.g. 127.0.0.1:3128"
label: PLUGIN_ADMIN.PROXY_URL
help: PLUGIN_ADMIN.PROXY_URL_HELP
http.proxy_cert_path:
type: text
size: medium
placeholder: "e.g. /Users/bob/certs/"
label: PLUGIN_ADMIN.PROXY_CERT
help: PLUGIN_ADMIN.PROXY_CERT_HELP
http.verify_peer:
type: toggle
label: PLUGIN_ADMIN.SSL_VERIFY_PEER
highlight: 1
help: PLUGIN_ADMIN.SSL_VERIFY_PEER_HELP
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
validate:
type: bool
http.verify_host:
type: toggle
label: PLUGIN_ADMIN.SSL_VERIFY_HOST
highlight: 1
help: PLUGIN_ADMIN.SSL_VERIFY_HOST_HELP
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
validate:
type: bool
http.concurrent_connections:
type: number
size: x-small
label: PLUGIN_ADMIN.HTTP_CONNECTIONS
help: PLUGIN_ADMIN.HTTP_CONNECTIONS_HELP
validate:
min: 1
max: 20
misc_section:
type: section
title: PLUGIN_ADMIN.MISC_SECTION
reverse_proxy_setup:
type: toggle
label: PLUGIN_ADMIN.REVERSE_PROXY
@@ -1634,35 +1803,15 @@ form:
validate:
type: bool
experimental:
accounts:
type: tab
title: PLUGIN_ADMIN.EXPERIMENTAL
title: PLUGIN_ADMIN.ACCOUNTS
fields:
experimental_section:
type: section
title: PLUGIN_ADMIN.EXPERIMENTAL
underline: true
# flex_pages:
# type: section
# title: Flex Pages
#
# pages.type:
# type: select
# label: PLUGIN_ADMIN.PAGES_TYPE
# highlight: regular
# help: PLUGIN_ADMIN.PAGES_TYPE_HELP
# options:
# regular: PLUGIN_ADMIN.REGULAR
# flex: PLUGIN_ADMIN.FLEX
pages.type:
type: hidden
flex_accounts:
type: section
title: Flex Accounts
title: User Accounts
accounts.type:
type: select
@@ -1681,3 +1830,41 @@ form:
options:
file: PLUGIN_ADMIN.FILE
folder: PLUGIN_ADMIN.FOLDER
accounts.avatar:
type: select
label: PLUGIN_ADMIN.AVATAR
default: gravatar
help: PLUGIN_ADMIN.AVATAR_HELP
options:
multiavatar: Multiavatar [local]
gravatar: Gravatar [external]
# experimental:
# type: tab
# title: PLUGIN_ADMIN.EXPERIMENTAL
#
# fields:
# experimental_section:
# type: section
# title: PLUGIN_ADMIN.EXPERIMENTAL
# underline: true
#
# flex_pages:
# type: section
# title: Flex Pages
#
# pages.type:
# type: select
# label: PLUGIN_ADMIN.PAGES_TYPE
# highlight: regular
# help: PLUGIN_ADMIN.PAGES_TYPE_HELP
# options:
# regular: PLUGIN_ADMIN.REGULAR
# flex: PLUGIN_ADMIN.FLEX
#
# pages.type:
# type: hidden

View File

@@ -104,7 +104,7 @@ config:
edit:
title:
template: "{% if object.root %}Root <small>( &lt;root&gt; ){% else %}{{ (form.value('header.title') ?? form.value('folder'))|e }} <small>( {{ (object.getRoute().toString(false) ?: '/')|e }} )</small>{% endif %}"
template: "{% if object.root %}Root <small>( &lt;root&gt; )</small>{% else %}{{ (form.value('header.title') ?? form.value('folder'))|e }} <small>( {{ (object.getRoute().toString(false) ?: '/')|e }} )</small>{% endif %}"
# TODO: not used yet
buttons:
@@ -184,9 +184,9 @@ config:
# Fields to be searched
fields:
- key
- slug
- menu
- title
- name
blueprints:
configure:

View File

@@ -122,6 +122,19 @@ config:
fields:
- key
- email
- username
- fullname
relationships:
media:
type: media
cardinality: to-many
avatar:
type: media
cardinality: to-one
# roles:
# type: user-groups
# cardinality: to-many
blueprints:
configure:

View File

@@ -18,6 +18,7 @@ config:
configure:
path: '/accounts/configure'
redirects:
'/groups': '/accounts/groups'
'/accounts': '/accounts/groups'
# Permissions
@@ -112,6 +113,7 @@ config:
fields:
- key
- groupname
- readableName
- description
blueprints:

View File

@@ -121,7 +121,7 @@ form:
underline: true
folder:
type: text
type: folder-slug
label: PLUGIN_ADMIN.FOLDER_NAME
validate:
rule: slug
@@ -320,6 +320,18 @@ form:
fields:
header.redirect_default_route:
type: toggle
toggleable: true
label: PLUGIN_ADMIN.REDIRECT_DEFAULT_ROUTE
help: PLUGIN_ADMIN.REDIRECT_DEFAULT_ROUTE_HELP
config-highlight@: system.pages.redirect_default_route
options:
1: PLUGIN_ADMIN.YES
0: PLUGIN_ADMIN.NO
validate:
type: bool
header.routes.default:
type: text
toggleable: true

View File

@@ -1,7 +1,7 @@
title: PLUGIN_ADMIN:EXTERNAL
title: PLUGIN_ADMIN.EXTERNAL
extends@:
type: default
context: blueprints://pages
type: default
context: blueprints://pages
form:
validation: loose
@@ -29,16 +29,16 @@ form:
unset@: true
header.external_url:
type: text
label: PLUGIN_ADMIN.EXTERNAL_URL
placeholder: https://getgrav.org
validate:
required: true
type: text
label: PLUGIN_ADMIN.EXTERNAL_URL
placeholder: https://getgrav.org
validate:
required: true
options:
fields:
publishing:
fields:
header.date:

View File

@@ -51,17 +51,13 @@ form:
type: bool
header.permissions.authors:
type: list
type: array
toggleable: true
value_only: true
placeholder_value: PLUGIN_ADMIN.USERNAME
label: PLUGIN_ADMIN.PAGE_AUTHORS
help: PLUGIN_ADMIN.PAGE_AUTHORS_HELP
fields:
value:
type: text
placeholder: PLUGIN_ADMIN.USERNAME
style: vertical
header.permissions.groups:
ignore@: true
type: acl_picker

View File

@@ -11,10 +11,21 @@ form:
avatar:
type: file
size: large
destination: 'user://accounts/avatars'
destination: 'account://avatars'
multiple: false
random_name: true
multiavatar_only:
type: conditional
condition: config.system.accounts.avatar == 'multiavatar'
fields:
avatar_hash:
type: text
label: ''
placeholder: 'e.g. dceaadcfda491f4e45'
description: PLUGIN_ADMIN.AVATAR_HASH
size: large
content:
type: section
title: PLUGIN_ADMIN.ACCOUNT
@@ -107,6 +118,12 @@ form:
label: PLUGIN_ADMIN.2FA_SECRET
sublabel: PLUGIN_ADMIN.2FA_SECRET_HELP
yubikey_id:
type: text
label: PLUGIN_ADMIN.YUBIKEY_ID
description: PLUGIN_ADMIN.YUBIKEY_HELP
size: small
maxlength: 12
@@ -123,7 +140,7 @@ form:
multiple: true
size: large
label: PLUGIN_ADMIN.GROUPS
data-options@: '\Grav\Common\User\Group::groupNames'
data-options@: 'Grav\Common\Flex\Types\UserGroups\UserGroupObject::groupNames'
classes: fancy
help: PLUGIN_ADMIN.GROUPS_HELP
validate:

View File

@@ -28,6 +28,10 @@ types:
type: image
thumb: media/thumb-webp.png
mime: image/webp
avif:
type: image
thumb: media/thumb.png
mime: image/avif
gif:
type: animated
thumb: media/thumb-gif.png
@@ -91,7 +95,7 @@ types:
aif:
type: audio
thumb: media/thumb-aif.png
mime: audio/aif
mime: audio/aiff
txt:
type: file
thumb: media/thumb-txt.png
@@ -195,7 +199,7 @@ types:
gz:
type: file
thumb: media/thumb-gz.png
mime: application/gzip
mime: application/x-gzip
tar:
type: file
thumb: media/thumb-tar.png
@@ -207,7 +211,7 @@ types:
js:
type: file
thumb: media/thumb-js.png
mime: application/javascript
mime: text/javascript
json:
type: file
thumb: media/thumb-json.png

1986
system/config/mime.yaml Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -32,6 +32,7 @@ xss_dangerous_tags:
- base
uploads_dangerous_extensions:
- php
- phar
- html
- htm
- js

View File

@@ -28,6 +28,7 @@ languages:
override_locale: false # Override the default or system locale with language specific one
content_fallback: {} # Custom language fallbacks. eg: {fr: ['fr', 'en']}
pages_fallback_only: false # DEPRECATED: Use `content_fallback` instead
debug: false # Debug language detection
home:
alias: '/home' # Default path for home, ie /
@@ -35,6 +36,7 @@ home:
pages:
type: regular # EXPERIMENTAL: Page type: regular or flex
dirs: ['page://'] # Advanced functionality, allows for multiple page paths
theme: quark # Default theme (defaults to "quark" theme)
order:
by: default # Order pages by "default", "alpha" or "date"
@@ -96,7 +98,7 @@ cache:
purge_at: '0 4 * * *' # How often to purge old file cache (using new scheduler)
clear_at: '0 3 * * *' # How often to clear cache (using new scheduler)
clear_job_type: 'standard' # Type to clear when processing the scheduled clear job `standard`|`all`
clear_images_by_default: true # By default grav will include processed images in cache clear, this can be disabled
clear_images_by_default: false # By default grav does not include processed images in cache clear, this can be enabled
cli_compatibility: false # Ensures only non-volatile drivers are used (file, redis, memcache, etc.)
lifetime: 604800 # Lifetime of cached data in seconds (0 = infinite)
gzip: false # GZip compress the page output
@@ -113,6 +115,8 @@ twig:
autoescape: true # Autoescape Twig vars (DEPRECATED, always enabled in strict mode)
undefined_functions: true # Allow undefined functions
undefined_filters: true # Allow undefined filters
safe_functions: [] # List of PHP functions which are allowed to be used as Twig functions
safe_filters: [] # List of PHP functions which are allowed to be used as Twig filters
umask_fix: false # By default Twig creates cached files as 755, fix switches this to 775
assets: # Configuration for Assets Manager (JS, CSS)
@@ -125,11 +129,14 @@ assets: # Configuration for Assets Mana
js_pipeline: false # The JS pipeline is the unification of multiple JS resources into one file
js_pipeline_include_externals: true # Include external URLs in the pipeline by default
js_pipeline_before_excludes: true # Render the pipeline before any excluded files
js_module_pipeline: false # The JS Module pipeline is the unification of multiple JS Module resources into one file
js_module_pipeline_include_externals: true # Include external URLs in the pipeline by default
js_module_pipeline_before_excludes: true # Render the pipeline before any excluded files
js_minify: true # Minify the JS during pipelining
enable_asset_timestamp: false # Enable asset timestamps
enable_asset_sri: false # Enable asset SRI
collections:
jquery: system://assets/jquery/jquery-2.x.min.js
jquery: system://assets/jquery/jquery-3.x.min.js
errors:
display: 0 # Display either (1) Full backtrace | (0) Simple Error | (-1) System Error
@@ -139,6 +146,7 @@ log:
handler: file # Log handler. Currently supported: file | syslog
syslog:
facility: local6 # Syslog facilities output
tag: grav # Syslog tag. Default: "grav".
debugger:
enabled: false # Enable Grav debugger and following settings
@@ -154,8 +162,18 @@ images:
debug: false # Show an overlay over images indicating the pixel depth of the image when working with retina for example
auto_fix_orientation: true # Automatically fix the image orientation based on the Exif data
seofriendly: false # SEO-friendly processed image names
cls: # Cumulative Layout Shift: See https://web.dev/optimize-cls/
auto_sizes: false # Automatically add height/width to image
aspect_ratio: false # Reserve space with aspect ratio style
retina_scale: 1 # scale to adjust auto-sizes for better handling of HiDPI resolutions
defaults:
loading: auto # Let browser pick [auto|lazy|eager]
watermark:
image: 'system://images/watermark.png' # Path to a watermark image
position_y: 'center' # top|center|bottom
position_x: 'center' # left|center|right
scale: 33 # percentage of watermark scale
watermark_all: false # automatically watermark all images
media:
enable_media_timestamp: false # Enable media timestamps
@@ -170,6 +188,7 @@ session:
name: grav-site # Name prefix of the session cookie. Use alphanumeric, dashes or underscores only. Do not use dots in the session name
uniqueness: path # Should sessions be `path` based or `security.salt` based
secure: false # Set session secure. If true, indicates that communication for this cookie must be over an encrypted transmission. Enable this only on sites that run exclusively on HTTPS
secure_https: true # Set session secure on HTTPS but not on HTTP. Has no effect if you have `session.secure: true`. Set to false if your site jumps between HTTP and HTTPS.
httponly: true # Set session HTTP only. If true, indicates that cookies should be used only over HTTP, and JavaScript modification is not allowed.
samesite: Lax # Set session SameSite. Possible values are Lax, Strict and None. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
split: true # Sessions should be independent between site and plugins (such as admin)
@@ -178,14 +197,21 @@ session:
gpm:
releases: stable # Set to either 'stable' or 'testing'
proxy_url: # Configure a manual proxy URL for GPM (eg 127.0.0.1:3128)
method: 'auto' # Either 'curl', 'fopen' or 'auto'. 'auto' will try fopen first and if not available cURL
verify_peer: true # Sometimes on some systems (Windows most commonly) GPM is unable to connect because the SSL certificate cannot be verified. Disabling this setting might help.
official_gpm_only: true # By default GPM direct-install will only allow URLs via the official GPM proxy to ensure security
http:
method: auto # Either 'curl', 'fopen' or 'auto'. 'auto' will try fopen first and if not available cURL
enable_proxy: true # Enable proxy server configuration
proxy_url: # Configure a manual proxy URL for GPM (eg 127.0.0.1:3128)
proxy_cert_path: # Local path to proxy certificate folder containing pem files
concurrent_connections: 5 # Concurrent HTTP connections when multiplexing
verify_peer: true # Enable/Disable SSL verification of peer certificates
verify_host: true # Enable/Disable SSL verification of host certificates
accounts:
type: regular # EXPERIMENTAL: Account type: regular or flex
storage: file # EXPERIMENTAL: Flex storage type: file or folder
avatar: gravatar # Avatar generator [multiavatar|gravatar]
flex:
cache:

View File

@@ -1,14 +1,15 @@
<?php
/**
* @package Grav\Core
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
// Some standard defines
define('GRAV', true);
define('GRAV_VERSION', '1.7.8');
define('GRAV_VERSION', '1.7.43');
define('GRAV_SCHEMA', '1.7.0_2020-11-20_1');
define('GRAV_TESTING', false);
@@ -22,51 +23,68 @@ if (!defined('DS')) {
define('DS', '/');
}
// Directories and Paths
// Absolute path to Grav root. This is where Grav is installed into.
if (!defined('GRAV_ROOT')) {
$path = rtrim(str_replace(DIRECTORY_SEPARATOR, DS, getenv('GRAV_ROOT') ?: getcwd()), DS);
define('GRAV_ROOT', $path);
}
// Absolute path to Grav webroot. This is the path where your site is located in.
if (!defined('GRAV_WEBROOT')) {
$path = rtrim(getenv('GRAV_WEBROOT') ?: GRAV_ROOT, DS);
define('GRAV_WEBROOT', $path);
}
// Relative path to user folder. This path needs to be located under GRAV_WEBROOT.
if (!defined('GRAV_USER_PATH')) {
$path = rtrim(getenv('GRAV_USER_PATH') ?: 'user', DS);
define('GRAV_USER_PATH', $path);
}
// Absolute or relative path to system folder. Defaults to GRAV_ROOT/system
// If system folder is outside of webroot, see https://github.com/getgrav/grav/issues/3297#issuecomment-810294972
if (!defined('GRAV_SYSTEM_PATH')) {
$path = rtrim(getenv('GRAV_SYSTEM_PATH') ?: 'system', DS);
define('GRAV_SYSTEM_PATH', $path);
}
// Absolute or relative path to cache folder. Defaults to GRAV_ROOT/cache
if (!defined('GRAV_CACHE_PATH')) {
$path = rtrim(getenv('GRAV_CACHE_PATH') ?: 'cache', DS);
define('GRAV_CACHE_PATH', $path);
}
// Absolute or relative path to logs folder. Defaults to GRAV_ROOT/logs
if (!defined('GRAV_LOG_PATH')) {
$path = rtrim(getenv('GRAV_LOG_PATH') ?: 'logs', DS);
define('GRAV_LOG_PATH', $path);
}
// Absolute or relative path to tmp folder. Defaults to GRAV_ROOT/tmp
if (!defined('GRAV_TMP_PATH')) {
$path = rtrim(getenv('GRAV_TMP_PATH') ?: 'tmp', DS);
define('GRAV_TMP_PATH', $path);
}
// Absolute or relative path to backup folder. Defaults to GRAV_ROOT/backup
if (!defined('GRAV_BACKUP_PATH')) {
$path = rtrim(getenv('GRAV_BACKUP_PATH') ?: 'backup', DS);
define('GRAV_BACKUP_PATH', $path);
}
unset($path);
define('USER_PATH', GRAV_USER_PATH . DS);
define('CACHE_PATH', GRAV_CACHE_PATH . DS);
define('ROOT_DIR', GRAV_ROOT . DS);
define('USER_DIR', ROOT_DIR . USER_PATH);
define('CACHE_DIR', ROOT_DIR . CACHE_PATH);
// INTERNAL: Do not use!
define('USER_DIR', GRAV_WEBROOT . '/' . GRAV_USER_PATH . '/');
define('CACHE_DIR', (!preg_match('`^(/|[a-z]:[\\\/])`ui', GRAV_CACHE_PATH) ? GRAV_ROOT . '/' : '') . GRAV_CACHE_PATH . '/');
// DEPRECATED: Do not use!
define('ASSETS_DIR', ROOT_DIR . 'assets/');
define('IMAGES_DIR', ROOT_DIR . 'images/');
define('ACCOUNTS_DIR', USER_DIR .'accounts/');
define('PAGES_DIR', USER_DIR .'pages/');
define('DATA_DIR', USER_DIR .'data/');
define('SYSTEM_DIR', ROOT_DIR .'system/');
define('LIB_DIR', SYSTEM_DIR .'src/');
define('PLUGINS_DIR', USER_DIR .'plugins/');
define('THEMES_DIR', USER_DIR .'themes/');
define('VENDOR_DIR', ROOT_DIR .'vendor/');
define('LOG_DIR', ROOT_DIR . GRAV_LOG_PATH . DS);
define('CACHE_PATH', GRAV_CACHE_PATH . DS);
define('USER_PATH', GRAV_USER_PATH . DS);
define('ROOT_DIR', GRAV_ROOT . DS);
define('ASSETS_DIR', GRAV_WEBROOT . '/assets/');
define('IMAGES_DIR', GRAV_WEBROOT . '/images/');
define('ACCOUNTS_DIR', USER_DIR . 'accounts/');
define('PAGES_DIR', USER_DIR . 'pages/');
define('DATA_DIR', USER_DIR . 'data/');
define('PLUGINS_DIR', USER_DIR . 'plugins/');
define('THEMES_DIR', USER_DIR . 'themes/');
define('SYSTEM_DIR', (!preg_match('`^(/|[a-z]:[\\\/])`ui', GRAV_SYSTEM_PATH) ? GRAV_ROOT . '/' : '') . GRAV_SYSTEM_PATH . '/');
define('LIB_DIR', SYSTEM_DIR . 'src/');
define('VENDOR_DIR', GRAV_ROOT . '/vendor/');
define('LOG_DIR', (!preg_match('`^(/|[a-z]:[\\\/])`ui', GRAV_LOG_PATH) ? GRAV_ROOT . '/' : '') . GRAV_LOG_PATH . '/');
// END DEPRECATED
// Some extensions
@@ -81,3 +99,6 @@ define('RAW_CONTENT', 1);
define('TWIG_CONTENT', 2);
define('TWIG_CONTENT_LIST', 3);
define('TWIG_TEMPLATES', 4);
// Filters
define('GRAV_SANITIZE_STRING', 5001);

BIN
system/images/watermark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

View File

@@ -2,7 +2,7 @@
/**
* @package Grav\Core
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/

View File

@@ -51,6 +51,7 @@ GRAV:
VALIDATION_FAIL: '<b>فشل التحقق من صحة:</b>'
INVALID_INPUT: 'إدخال غير صحيح في'
MISSING_REQUIRED_FIELD: 'حقل مطلوب مفقود:'
XSS_ISSUES: "مشاكل XSS محتملة تم اكتشافها في حقل '%s' '"
MONTHS_OF_THE_YEAR:
- 'كانون الثاني'
- 'شباط'
@@ -72,6 +73,8 @@ GRAV:
- 'الجمعة'
- 'السبت'
- 'الأحد'
YES: "نعم"
NO: "لا"
CRON:
EVERY: كل
EVERY_HOUR: كل ساعة
@@ -80,3 +83,11 @@ GRAV:
EVERY_DAY_OF_MONTH: كل يوم في الشهر
EVERY_MONTH: ' كل شهر'
TEXT_PERIOD: كل <b />
TEXT_MINS: ' في <b /> دقيقة(دقائق) بعد الساعة'
TEXT_TIME: ' في <b />:<b />'
TEXT_DOW: ' في <b />'
TEXT_MONTH: ' من <b />'
TEXT_DOM: ' في <b />'
ERROR1: الوسم %s غير مدعوم!
ERROR2: عدد عناصر غير صالح.
ERROR4: تعبير غير معروف

View File

@@ -15,6 +15,7 @@ GRAV:
BAD_DATE: Data invàlida
AGO: abans
FROM_NOW: des d'ara
JUST_NOW: Ara mateix
SECOND: segon
MINUTE: minut
HOUR: hora
@@ -48,6 +49,7 @@ GRAV:
VALIDATION_FAIL: '<b>Ha fallat la validació:</b>'
INVALID_INPUT: 'Entrada no vàlida a'
MISSING_REQUIRED_FIELD: 'Falta camp obligatori:'
XSS_ISSUES: "Detectats potencials problemes XSS al camp '%s'"
MONTHS_OF_THE_YEAR:
- 'Gener'
- 'Febrer'
@@ -69,3 +71,17 @@ GRAV:
- 'Divendres'
- 'Dissabte'
- 'Diumenge'
YES: "Sí"
NO: "No"
CRON:
EVERY: cada
EVERY_HOUR: cada hora
EVERY_MINUTE: cada minut
EVERY_DAY_OF_WEEK: cada dia de la setmana
EVERY_DAY_OF_MONTH: cada dia del mes
EVERY_MONTH: cada mes
TEXT_PERIOD: Cada <b />
ERROR1: L'etiqueta %s no està suportada!
ERROR2: Nombre d'elements incorrecte
ERROR3: El jquery_element s'ha d'establir a la configuració de jqCron
ERROR4: Expressió no reconeguda

View File

@@ -44,7 +44,7 @@ GRAV:
WK: sem
MO: mes
YR: año
DEC: dic
DEC: déc
SECOND_PLURAL: segundos
MINUTE_PLURAL: minutos
HOUR_PLURAL: horas
@@ -64,7 +64,7 @@ GRAV:
VALIDATION_FAIL: '<b>Falló la validación: </b>'
INVALID_INPUT: 'Dato inválido en: '
MISSING_REQUIRED_FIELD: 'Falta el campo requerido: '
XSS_ISSUES: "Se detectaron problemas XSS potenciales en el campo '%s'"
XSS_ISSUES: "Se detectaron potenciales problemas XSS en el campo '%s'"
MONTHS_OF_THE_YEAR:
- 'Enero'
- 'Febrero'
@@ -86,7 +86,7 @@ GRAV:
- 'Viernes'
- 'Sábado'
- 'Domingo'
YES: "Si"
YES: "Sí"
NO: "No"
CRON:
EVERY: cada
@@ -96,12 +96,12 @@ GRAV:
EVERY_DAY_OF_MONTH: cada día del mes
EVERY_MONTH: cada mes
TEXT_PERIOD: Cada <b />
TEXT_MINS: ' a <b /> minuto(s) despues de la hora'
TEXT_MINS: ' a <b /> minuto(s) después de la hora'
TEXT_TIME: ' a <b />:<b />'
TEXT_DOW: ' en <b />'
TEXT_MONTH: ' de<b />'
TEXT_DOM: ' en<b />'
ERROR1: La etiqueta %s no está soportada!
ERROR2: El número de elementos es erroneo
ERROR1: La etiqueta %s no está soportada!'
ERROR2: El número de elementos es erróneo
ERROR3: El jquery_element debería establecerse en la configuración del jqCron
ERROR4: Expresión no reconocida

View File

@@ -24,6 +24,7 @@ GRAV:
'/(quiz)zes$/i': '\1'
'/(alias|status)es$/i': '\1'
'/([octop|vir])i$/i': '\1us'
'/(n)ews$/i': '\1ouvelles'
INFLECTOR_UNCOUNTABLE:
- 'équipement'
- 'information'
@@ -58,10 +59,10 @@ GRAV:
MONTH: mois
YEAR: année
DECADE: décennie
SEC: s
MIN: m
HR: h
WK: sem
SEC: sec.
MIN: min.
HR: hr.
WK: sem.
MO: m
YR: an
DEC: déc
@@ -84,6 +85,7 @@ GRAV:
VALIDATION_FAIL: '<b>La validation a échoué :</b>'
INVALID_INPUT: 'Saisie non valide'
MISSING_REQUIRED_FIELD: 'Champ obligatoire manquant :'
XSS_ISSUES: "Erreurs XSS probablement détectées dans le champ '%s'"
MONTHS_OF_THE_YEAR:
- 'janvier'
- 'février'
@@ -105,6 +107,8 @@ GRAV:
- 'vendredi'
- 'samedi'
- 'dimanche'
YES: "Oui"
NO: "Non"
CRON:
EVERY: chaque
EVERY_HOUR: toutes les heures
@@ -118,7 +122,7 @@ GRAV:
TEXT_DOW: ' sur <b/>'
TEXT_MONTH: ' de <b />'
TEXT_DOM: ' sur <b/>'
ERROR1: La balise %s n'est pas supportée!
ERROR1: La balise %s n'est pas prise en charge !
ERROR2: Nombre invalide d'éléments
ERROR3: L'élément jquery_element doit être défini dans les paramètres jqCron
ERROR4: Expression non reconnue

View File

@@ -104,6 +104,7 @@ GRAV:
VALIDATION_FAIL: '<b>Fallou a validación:</b>'
INVALID_INPUT: 'Entrada incorrecta en'
MISSING_REQUIRED_FIELD: 'Falta un campo requirido:'
XSS_ISSUES: "Detectáronse posibles problemas XSS no campo '% s'"
MONTHS_OF_THE_YEAR:
- 'xaneiro'
- 'febreiro'
@@ -125,6 +126,8 @@ GRAV:
- 'venres'
- 'sábado'
- 'domingo'
YES: "Si"
NO: "Non"
CRON:
EVERY: cada
EVERY_HOUR: Cada hora

View File

@@ -3,26 +3,72 @@ GRAV:
FRONTMATTER_ERROR_PAGE: "---\ntitle: %1$s\n---\n\n# Error: Frontmatter tidak valid\n\nLokasi: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_PLURALS:
'/(quiz)$/i': '\1zes'
'/^(ox)$/i': '\1en'
'/([m|l])ouse$/i': '\1ice'
'/(matr|vert|ind)ix|ex$/i': '\1ices'
'/(x|ch|ss|sh)$/i': '\1es'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([^aeiouy]|qu)y$/i': '\1ies'
'/(hive)$/i': '\1s'
'/(?:([^f])fe|([lr])f)$/i': '\1\2ves'
'/sis$/i': 'ses'
'/([ti])um$/i': '\1a'
'/(buffal|tomat)o$/i': '\1oes'
'/(bu)s$/i': '\1ses'
'/(alias|status)/i': '\1es'
'/(octop|vir)us$/i': '\1i'
'/(ax|test)is$/i': '\1es'
'/s$/i': 's'
'/$/': 's'
INFLECTOR_SINGULAR:
'/(quiz)zes$/i': '\1'
'/(matr)ices$/i': '\1ix'
'/(vert|ind)ices$/i': '\1ex'
'/^(ox)en/i': '\1'
'/(alias|status)es$/i': '\1'
'/([octop|vir])i$/i': '\1us'
'/(cris|ax|test)es$/i': '\1is'
'/(shoe)s$/i': '\1'
'/(o)es$/i': '\1'
'/(bus)es$/i': '\1'
'/([m|l])ice$/i': '\1ouse'
'/(x|ch|ss|sh)es$/i': '\1'
'/(m)ovies$/i': '\1ovie'
'/(s)eries$/i': '\1eries'
'/([^aeiouy]|qu)ies$/i': '\1y'
'/([lr])ves$/i': '\1f'
'/(tive)s$/i': '\1'
'/(hive)s$/i': '\1'
'/([^f])ves$/i': '\1fe'
'/(^analy)ses$/i': '\1sis'
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i': '\1\2sis'
'/([ti])a$/i': '\1um'
'/(n)ews$/i': '\1ews'
INFLECTOR_UNCOUNTABLE:
- 'peralatan'
- 'informasi'
- 'nasi'
- 'uang'
- 'spesies'
- 'rangkaian'
- 'ikan'
- 'domba'
- 'Peralatan'
- 'Informasi '
- 'Nasi'
- 'Uang'
- 'Jenis'
- 'Seri'
- 'Ikan'
- 'Domba'
INFLECTOR_IRREGULAR:
'person': 'orang-orang'
'man': 'laki-laki'
'child': 'anak-anak'
'sex': 'jenis kelamin'
'person': 'Orang-orang'
'man': 'Pria'
'child': 'Balita'
'sex': 'Jenis Kelamin'
'move': 'pindahkan'
INFLECTOR_ORDINALS:
'default': 'ke'
'first': 'pertama'
'second': 'nd'
'third': 'rd'
NICETIME:
NO_DATE_PROVIDED: Tanggal tidak tersedia
NO_DATE_PROVIDED: Tidak ada tanggal yang disediakan
BAD_DATE: Format tanggal salah
AGO: yang lalu
FROM_NOW: dari saat ini
FROM_NOW: dari sekarang
JUST_NOW: baru saja
SECOND: detik
MINUTE: menit
@@ -32,12 +78,12 @@ GRAV:
MONTH: bulan
YEAR: tahun
DECADE: dekade
SEC: dtk
MIN: mnt
HR: j
WK: mng
MO: bln
YR: thn
SEC: detik
MIN: menit
HR: ' jam'
WK: minggu
MO: bulan
YR: tahun
DEC: desimal
SECOND_PLURAL: detik
MINUTE_PLURAL: menit
@@ -47,17 +93,18 @@ GRAV:
MONTH_PLURAL: bulan
YEAR_PLURAL: tahun
DECADE_PLURAL: dekade
SEC_PLURAL: dtk
MIN_PLURAL: mnt
HR_PLURAL: j
WK_PLURAL: mgg
MO_PLURAL: bln
YR_PLURAL: thn
SEC_PLURAL: detik
MIN_PLURAL: menit
HR_PLURAL: jam
WK_PLURAL: minggu
MO_PLURAL: bulan
YR_PLURAL: tahun
DEC_PLURAL: dekade
FORM:
VALIDATION_FAIL: '<b>Validasi gagal:</b>'
INVALID_INPUT: 'Input tidak valid di'
MISSING_REQUIRED_FIELD: 'Data yang diperlukan belum terisi:'
XSS_ISSUES: "Isu berpotensial XSS terdeteksi dalam baris %s"
MONTHS_OF_THE_YEAR:
- 'Januari'
- 'Februari'
@@ -76,22 +123,25 @@ GRAV:
- 'Selasa'
- 'Rabu'
- 'Kamis'
- 'Jumat'
- 'Jum''at'
- 'Sabtu'
- 'Minggu'
YES: "Ya"
NO: "Tidak"
CRON:
EVERY: Setiap
EVERY_HOUR: Setiap jam
EVERY_MINUTE: Setiap menit
EVERY_DAY_OF_WEEK: Setiap hari selama seminggu
EVERY_DAY_OF_MONTH: pada tanggal setiap bulannya
EVERY_DAY_OF_MONTH: Setiap hari dalam sebulan
EVERY_MONTH: setiap bulan
TEXT_PERIOD: Setiap <b />
TEXT_MINS: 'dalam <b /> menit setelah jam yang lalu'
TEXT_TIME: ' pada <b />:<b />'
TEXT_DOW: ' pada <b />'
TEXT_MONTH: ' pada <b />'
TEXT_DOM: ' pada <b />'
ERROR1: Tag %s tidak didukung!
ERROR2: Jumlah elemen tidak valid
ERROR3: jquery_element harus ditetapkan ke pengaturan jqCron
ERROR4: Ekspresi tidak dikenali
ERROR2: Jumlah elemen yang buruk
ERROR3: jquery_element harus diatur ke dalam pengaturan jqCron
ERROR4: Ekspresi tidak dikenal

147
system/languages/mn.yaml Normal file
View File

@@ -0,0 +1,147 @@
---
GRAV:
FRONTMATTER_ERROR_PAGE: "---\nГарчиг: %1$s\n---\n\n# Алдаа: Буруу Формат\n\nЗам: `%2$s`\n\n**%3$s**\n\n```\n%4$s\n```"
INFLECTOR_PLURALS:
'/(quiz)$/i': '\1зүүд'
'/^(ox)$/i': '\1ууд'
'/([m|l])ouse$/i': '\1ууд'
'/(matr|vert|ind)ix|ex$/i': '\1иксүүд'
'/(x|ch|ss|sh)$/i': '\1үүд'
'/([^aeiouy]|qu)ies$/i': '\1үүд'
'/([^aeiouy]|qu)y$/i': '\1үүд'
'/(hive)$/i': '\1үүд'
'/(?:([^f])fe|([lr])f)$/i': '\1\2үүд'
'/sis$/i': 'үүд'
'/([ti])um$/i': '\1үүд'
'/(buffal|tomat)o$/i': '\1үүд'
'/(bu)s$/i': '\1үүд'
'/(alias|status)/i': '\1үүд'
'/(octop|vir)us$/i': '\1үүд'
'/(ax|test)is$/i': '\1үүд'
'/s$/i': 'үүд'
'/$/': 'үүд'
INFLECTOR_SINGULAR:
'/(quiz)zes$/i': '\1'
'/(matr)ices$/i': '\1икс'
'/(vert|ind)ices$/i': '\1икс'
'/^(ox)en/i': '\1'
'/(alias|status)es$/i': '\1'
'/([octop|vir])i$/i': '\1'
'/(cris|ax|test)es$/i': '\1'
'/(shoe)s$/i': '\1'
'/(o)es$/i': '\1'
'/(bus)es$/i': '\1'
'/([m|l])ice$/i': '\1'
'/(x|ch|ss|sh)es$/i': '\1'
'/(m)ovies$/i': '\1'
'/(s)eries$/i': '\1'
'/([^aeiouy]|qu)ies$/i': '\1үүд'
'/([lr])ves$/i': '\1'
'/(tive)s$/i': '\1'
'/(hive)s$/i': '\1'
'/([^f])ves$/i': '\1'
'/(^analy)ses$/i': '\1'
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i': '\1\2үүд'
'/([ti])a$/i': '\1'
'/(n)ews$/i': '\1'
INFLECTOR_UNCOUNTABLE:
- 'тоног төхөөрөмж'
- 'Мэдээлэл'
- 'будаа'
- 'мөнгө'
- 'төрөл зүйл'
- 'цуврал'
- 'загас'
- 'хонь'
INFLECTOR_IRREGULAR:
'person': 'хүмүүс'
'man': 'эрчүүд'
'child': 'хүүхэд'
'sex': 'хүйс'
'move': 'хөдөлгөөн'
INFLECTOR_ORDINALS:
'default': 'th'
'first': 'st'
'second': 'nd'
'third': 'rd'
NICETIME:
NO_DATE_PROVIDED: Огноо алга
BAD_DATE: Буруу огноо
AGO: өмнө
FROM_NOW: одооноос
JUST_NOW: дөнгөж сая
SECOND: секунд
MINUTE: минут
HOUR: цаг
DAY: өдөр
WEEK: долоо хоног
MONTH: сар
YEAR: он
DECADE: арван жил
SEC: сек
MIN: мин
HR: цаг
WK: д.х.
MO: сар
YR: он
DEC: арван жил
SECOND_PLURAL: секунд
MINUTE_PLURAL: минут
HOUR_PLURAL: цаг
DAY_PLURAL: өдрүүд
WEEK_PLURAL: долоо хоногууд
MONTH_PLURAL: сарууд
YEAR_PLURAL: онууд
DECADE_PLURAL: арван жилүүд
SEC_PLURAL: сек.-үүд
MIN_PLURAL: мин.-ууд
HR_PLURAL: цагууд
WK_PLURAL: д.х.-ууд
MO_PLURAL: сарууд
YR_PLURAL: жилүүд
DEC_PLURAL: арван жилүүд
FORM:
VALIDATION_FAIL: '<b>Баталгаажуулалт амжилтгүй боллоо:</b>'
INVALID_INPUT: 'Буруу өгөгдөл дараахид'
MISSING_REQUIRED_FIELD: 'Шаардлагатай талбар дутуу байна:'
XSS_ISSUES: "'%s' талбарт XSS -ийн болзошгүй асуудлууд илэрсэн"
MONTHS_OF_THE_YEAR:
- '1-р сар'
- '2-р сар'
- '3-р сар'
- '4-р сар'
- '5 сар'
- '6 сар'
- '7 сар'
- '8 сар'
- '9 сар'
- '10 сар'
- '11 сар'
- '12 сар'
DAYS_OF_THE_WEEK:
- 'Даваа гараг'
- 'Мягмар гараг'
- 'Лхагва гараг'
- 'Пүрэв гараг'
- 'Баасан гараг'
- 'Бямба гараг'
- 'Ням гараг'
YES: "Тийм"
NO: "Үгүй"
CRON:
EVERY: бүрийн
EVERY_HOUR: цаг бүрийн
EVERY_MINUTE: минут бүрийн
EVERY_DAY_OF_WEEK: долоо хоногийн өдөр болгонд
EVERY_DAY_OF_MONTH: сарын өдөр болгонд
EVERY_MONTH: сар болгон
TEXT_PERIOD: Бүрийн <b />
TEXT_MINS: ' <b /> энэ сүүлийн цагийн минутад'
TEXT_TIME: ' <b />:<b /> -д'
TEXT_DOW: ' <b /> -д'
TEXT_MONTH: ' <b /> -ын'
TEXT_DOM: ' <b /> -т'
ERROR1: '%s -н утга нь дэмжигддэггүй!'
ERROR2: Элементүүдийн тоо хэмжээ буруу
ERROR3: jquery_element нь jqCron тохиргоонд хийгдсэн байх ёстой
ERROR4: Танигдаагүй илэрхийлэл

View File

@@ -104,6 +104,7 @@ GRAV:
VALIDATION_FAIL: '<b>Falha na validação:</b>'
INVALID_INPUT: 'Dados inseridos são inválidos em'
MISSING_REQUIRED_FIELD: 'Campo obrigatório em falta:'
XSS_ISSUES: "Potenciais problemas de XSS detectados no campo '%s'"
MONTHS_OF_THE_YEAR:
- 'Janeiro'
- 'Fevereiro'
@@ -125,6 +126,8 @@ GRAV:
- 'Sexta-feira'
- 'Sábado'
- 'Domingo'
YES: "Sim"
NO: "Não"
CRON:
EVERY: cada
EVERY_HOUR: cada hora

9
system/languages/si.yaml Normal file
View File

@@ -0,0 +1,9 @@
---
GRAV:
INFLECTOR_SINGULAR:
'/(quiz)zes$/i': '\1'
'/^(ox)en/i': '\1'
'/(alias|status)es$/i': '\1'
'/(o)es$/i': '\1'
'/(bus)es$/i': '\1'
'/(x|ch|ss|sh)es$/i': '\1'

View File

@@ -82,6 +82,8 @@ GRAV:
- 'Cuma'
- 'Cumartesi'
- 'Pazar'
YES: "Evet"
NO: "Hayır"
CRON:
EVERY: her
EVERY_HOUR: saatte bir

View File

@@ -38,7 +38,9 @@ GRAV:
YR_PLURAL:
DEC_PLURAL: 十年
FORM:
MISSING_REQUIRED_FIELD: 遺漏必填欄位:
VALIDATION_FAIL: '<b>確驗證失敗:</b>'
INVALID_INPUT: '無效輸入:'
MISSING_REQUIRED_FIELD: '遺漏必填欄位:'
MONTHS_OF_THE_YEAR:
- '一月'
- '二月'
@@ -60,3 +62,16 @@ GRAV:
- '星期五'
- '星期六'
- '星期日'
CRON:
EVERY:
EVERY_HOUR: 每小時
EVERY_MINUTE: 每分鐘
EVERY_DAY_OF_WEEK: 每一天
EVERY_DAY_OF_MONTH: 每一天
EVERY_MONTH: 每個月
TEXT_PERIOD: 每 <b />
TEXT_MINS: ' 的 <b /> 分'
TEXT_TIME: ' <b />:<b />'
TEXT_DOW: ' 的 <b />'
TEXT_MONTH: ' 的 <b />'
TEXT_DOM: ' 的 <b />'

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Core
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -13,8 +13,25 @@ if (PHP_SAPI !== 'cli-server') {
$_SERVER['PHP_CLI_ROUTER'] = true;
if (is_file($_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . $_SERVER['SCRIPT_NAME'])) {
return false;
$root = $_SERVER['DOCUMENT_ROOT'];
$path = $_SERVER['SCRIPT_NAME'];
if ($path !== '/index.php' && is_file($root . $path)) {
if (!(
// Block all direct access to files and folders beginning with a dot
strpos($path, '/.') !== false
// Block all direct access for these folders
|| preg_match('`^/(\.git|cache|bin|logs|backup|webserver-configs|tests)/`ui', $path)
// Block access to specific file types for these system folders
|| preg_match('`^/(system|vendor)/(.*)\.(txt|xml|md|html|json|yaml|yml|php|pl|py|cgi|twig|sh|bat)$`ui', $path)
// Block access to specific file types for these user folders
|| preg_match('`^/(user)/(.*)\.(txt|md|json|yaml|yml|php|pl|py|cgi|twig|sh|bat)$`ui', $path)
// Block all direct access to .md files
|| preg_match('`\.md$`ui', $path)
// Block access to specific files in the root folder
|| preg_match('`^/(LICENSE\.txt|composer\.lock|composer\.json|\.htaccess)$`ui', $path)
)) {
return false;
}
}
$grav_index = 'index.php';

View File

@@ -0,0 +1,165 @@
<?php
/**
* Iterates individual characters (Unicode codepoints) of DOM text and CDATA nodes
* while keeping track of their position in the document.
*
* Example:
*
* $doc = new DOMDocument();
* $doc->load('example.xml');
* foreach(new DOMLettersIterator($doc) as $letter) echo $letter;
*
* NB: If you only need characters without their position
* in the document, use DOMNode->textContent instead.
*
* @author porneL http://pornel.net
* @license Public Domain
* @url https://github.com/antoligy/dom-string-iterators
*
* @implements Iterator<int,string>
*/
final class DOMLettersIterator implements Iterator
{
/** @var DOMElement */
private $start;
/** @var DOMElement|null */
private $current;
/** @var int */
private $offset = -1;
/** @var int|null */
private $key;
/** @var array<int,string>|null */
private $letters;
/**
* expects DOMElement or DOMDocument (see DOMDocument::load and DOMDocument::loadHTML)
*
* @param DOMNode $el
*/
public function __construct(DOMNode $el)
{
if ($el instanceof DOMDocument) {
$el = $el->documentElement;
}
if (!$el instanceof DOMElement) {
throw new InvalidArgumentException('Invalid arguments, expected DOMElement or DOMDocument');
}
$this->start = $el;
}
/**
* Returns position in text as DOMText node and character offset.
* (it's NOT a byte offset, you must use mb_substr() or similar to use this offset properly).
* node may be NULL if iterator has finished.
*
* @return array
*/
public function currentTextPosition(): array
{
return [$this->current, $this->offset];
}
/**
* Returns DOMElement that is currently being iterated or NULL if iterator has finished.
*
* @return DOMElement|null
*/
public function currentElement(): ?DOMElement
{
return $this->current ? $this->current->parentNode : null;
}
// Implementation of Iterator interface
/**
* @return int|null
*/
public function key(): ?int
{
return $this->key;
}
/**
* @return void
*/
public function next(): void
{
if (null === $this->current) {
return;
}
if ($this->current->nodeType === XML_TEXT_NODE || $this->current->nodeType === XML_CDATA_SECTION_NODE) {
if ($this->offset === -1) {
preg_match_all('/./us', $this->current->textContent, $m);
$this->letters = $m[0];
}
$this->offset++;
$this->key++;
if ($this->letters && $this->offset < count($this->letters)) {
return;
}
$this->offset = -1;
}
while ($this->current->nodeType === XML_ELEMENT_NODE && $this->current->firstChild) {
$this->current = $this->current->firstChild;
if ($this->current->nodeType === XML_TEXT_NODE || $this->current->nodeType === XML_CDATA_SECTION_NODE) {
$this->next();
return;
}
}
while (!$this->current->nextSibling && $this->current->parentNode) {
$this->current = $this->current->parentNode;
if ($this->current === $this->start) {
$this->current = null;
return;
}
}
$this->current = $this->current->nextSibling;
$this->next();
}
/**
* Return the current element
* @link https://php.net/manual/en/iterator.current.php
*
* @return string|null
*/
public function current(): ?string
{
return $this->letters ? $this->letters[$this->offset] : null;
}
/**
* Checks if current position is valid
* @link https://php.net/manual/en/iterator.valid.php
*
* @return bool
*/
public function valid(): bool
{
return (bool)$this->current;
}
/**
* @return void
*/
public function rewind(): void
{
$this->current = $this->start;
$this->offset = -1;
$this->key = 0;
$this->letters = [];
$this->next();
}
}

View File

@@ -0,0 +1,158 @@
<?php
/**
* Iterates individual words of DOM text and CDATA nodes
* while keeping track of their position in the document.
*
* Example:
*
* $doc = new DOMDocument();
* $doc->load('example.xml');
* foreach(new DOMWordsIterator($doc) as $word) echo $word;
*
* @author pjgalbraith http://www.pjgalbraith.com
* @author porneL http://pornel.net (based on DOMLettersIterator available at http://pornel.net/source/domlettersiterator.php)
* @license Public Domain
* @url https://github.com/antoligy/dom-string-iterators
*
* @implements Iterator<int,string>
*/
final class DOMWordsIterator implements Iterator
{
/** @var DOMElement */
private $start;
/** @var DOMElement|null */
private $current;
/** @var int */
private $offset = -1;
/** @var int|null */
private $key;
/** @var array<int,array<int,int|string>>|null */
private $words;
/**
* expects DOMElement or DOMDocument (see DOMDocument::load and DOMDocument::loadHTML)
*
* @param DOMNode $el
*/
public function __construct(DOMNode $el)
{
if ($el instanceof DOMDocument) {
$el = $el->documentElement;
}
if (!$el instanceof DOMElement) {
throw new InvalidArgumentException('Invalid arguments, expected DOMElement or DOMDocument');
}
$this->start = $el;
}
/**
* Returns position in text as DOMText node and character offset.
* (it's NOT a byte offset, you must use mb_substr() or similar to use this offset properly).
* node may be NULL if iterator has finished.
*
* @return array
*/
public function currentWordPosition(): array
{
return [$this->current, $this->offset, $this->words];
}
/**
* Returns DOMElement that is currently being iterated or NULL if iterator has finished.
*
* @return DOMElement|null
*/
public function currentElement(): ?DOMElement
{
return $this->current ? $this->current->parentNode : null;
}
// Implementation of Iterator interface
/**
* Return the key of the current element
* @link https://php.net/manual/en/iterator.key.php
* @return int|null
*/
public function key(): ?int
{
return $this->key;
}
/**
* @return void
*/
public function next(): void
{
if (null === $this->current) {
return;
}
if ($this->current->nodeType === XML_TEXT_NODE || $this->current->nodeType === XML_CDATA_SECTION_NODE) {
if ($this->offset === -1) {
$this->words = preg_split("/[\n\r\t ]+/", $this->current->textContent, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_OFFSET_CAPTURE) ?: [];
}
$this->offset++;
if ($this->words && $this->offset < count($this->words)) {
$this->key++;
return;
}
$this->offset = -1;
}
while ($this->current->nodeType === XML_ELEMENT_NODE && $this->current->firstChild) {
$this->current = $this->current->firstChild;
if ($this->current->nodeType === XML_TEXT_NODE || $this->current->nodeType === XML_CDATA_SECTION_NODE) {
$this->next();
return;
}
}
while (!$this->current->nextSibling && $this->current->parentNode) {
$this->current = $this->current->parentNode;
if ($this->current === $this->start) {
$this->current = null;
return;
}
}
$this->current = $this->current->nextSibling;
$this->next();
}
/**
* Return the current element
* @link https://php.net/manual/en/iterator.current.php
* @return string|null
*/
public function current(): ?string
{
return $this->words ? (string)$this->words[$this->offset][0] : null;
}
/**
* Checks if current position is valid
* @link https://php.net/manual/en/iterator.valid.php
* @return bool
*/
public function valid(): bool
{
return (bool)$this->current;
}
public function rewind(): void
{
$this->current = $this->start;
$this->offset = -1;
$this->key = 0;
$this->words = [];
$this->next();
}
}

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -16,8 +16,8 @@ use Grav\Common\Assets\Traits\TestingAssetsTrait;
use Grav\Common\Config\Config;
use Grav\Framework\Object\PropertyObject;
use RocketTheme\Toolbox\ResourceLocator\UniformResourceLocator;
use function array_slice;
use function call_user_func_array;
use function count;
use function func_get_args;
use function is_array;
@@ -30,14 +30,21 @@ class Assets extends PropertyObject
use TestingAssetsTrait;
use LegacyAssetsTrait;
const LINK = 'link';
const CSS = 'css';
const JS = 'js';
const JS_MODULE = 'js_module';
const LINK_COLLECTION = 'assets_link';
const CSS_COLLECTION = 'assets_css';
const JS_COLLECTION = 'assets_js';
const JS_MODULE_COLLECTION = 'assets_js_module';
const LINK_TYPE = Assets\Link::class;
const CSS_TYPE = Assets\Css::class;
const JS_TYPE = Assets\Js::class;
const JS_MODULE_TYPE = Assets\JsModule::class;
const INLINE_CSS_TYPE = Assets\InlineCss::class;
const INLINE_JS_TYPE = Assets\InlineJs::class;
const INLINE_JS_MODULE_TYPE = Assets\InlineJsModule::class;
/** @const Regex to match CSS and JavaScript files */
const DEFAULT_REGEX = '/.\.(css|js)$/i';
@@ -48,15 +55,24 @@ class Assets extends PropertyObject
/** @const Regex to match JavaScript files */
const JS_REGEX = '/.\.js$/i';
/** @const Regex to match JavaScriptModyle files */
const JS_MODULE_REGEX = '/.\.mjs$/i';
/** @var string */
protected $assets_dir;
/** @var string */
protected $assets_url;
/** @var array */
protected $assets_link = [];
/** @var array */
protected $assets_css = [];
/** @var array */
protected $assets_js = [];
/** @var array */
protected $assets_js_module = [];
// Following variables come from the configuration:
/** @var bool */
@@ -66,19 +82,17 @@ class Assets extends PropertyObject
/** @var bool */
protected $css_pipeline_before_excludes;
/** @var bool */
protected $inlinecss_pipeline_include_externals;
/** @var bool */
protected $inlinecss_pipeline_before_excludes;
/** @var bool */
protected $js_pipeline;
/** @var bool */
protected $js_pipeline_include_externals;
/** @var bool */
protected $js_pipeline_before_excludes;
/** @var bool */
protected $inlinejs_pipeline_include_externals;
protected $js_module_pipeline;
/** @var bool */
protected $inlinejs_pipeline_before_excludes;
protected $js_module_pipeline_include_externals;
/** @var bool */
protected $js_module_pipeline_before_excludes;
/** @var array */
protected $pipeline_options = [];
@@ -110,7 +124,7 @@ class Assets extends PropertyObject
/** @var UniformResourceLocator $locator */
$locator = $grav['locator'];
$this->assets_dir = $locator->findResource('asset://') . DS;
$this->assets_dir = $locator->findResource('asset://');
$this->assets_url = $locator->findResource('asset://', false);
$this->config($asset_config);
@@ -160,14 +174,27 @@ class Assets extends PropertyObject
*/
public function add($asset)
{
if (!$asset) {
return $this;
}
$args = func_get_args();
// More than one asset
if (is_array($asset)) {
foreach ($asset as $a) {
array_shift($args);
$args = array_merge([$a], $args);
call_user_func_array([$this, 'add'], $args);
foreach ($asset as $index => $location) {
$params = array_slice($args, 1);
if (is_array($location)) {
$params = array_shift($params);
if (is_numeric($params)) {
$params = [ 'priority' => $params ];
}
$params = [array_replace_recursive([], $location, $params)];
$location = $index;
}
$params = array_merge([$location], $params);
call_user_func_array([$this, 'add'], $params);
}
} elseif (isset($this->collections[$asset])) {
array_shift($args);
@@ -175,7 +202,8 @@ class Assets extends PropertyObject
call_user_func_array([$this, 'add'], $args);
} else {
// Get extension
$extension = pathinfo(parse_url($asset, PHP_URL_PATH), PATHINFO_EXTENSION);
$path = parse_url($asset, PHP_URL_PATH);
$extension = $path ? Utils::pathinfo($path, PATHINFO_EXTENSION) : '';
// JavaScript or CSS
if ($extension !== '') {
@@ -184,6 +212,8 @@ class Assets extends PropertyObject
call_user_func_array([$this, 'addCss'], $args);
} elseif ($extension === 'js') {
call_user_func_array([$this, 'addJs'], $args);
} elseif ($extension === 'mjs') {
call_user_func_array([$this, 'addJsModule'], $args);
}
}
}
@@ -201,14 +231,19 @@ class Assets extends PropertyObject
protected function addType($collection, $type, $asset, $options)
{
if (is_array($asset)) {
foreach ($asset as $a) {
$this->addType($collection, $type, $a, $options);
foreach ($asset as $index => $location) {
$assetOptions = $options;
if (is_array($location)) {
$assetOptions = array_replace_recursive([], $options, $location);
$location = $index;
}
$this->addType($collection, $type, $location, $assetOptions);
}
return $this;
}
if (($type === $this::CSS_TYPE || $type === $this::JS_TYPE) && isset($this->collections[$asset])) {
if ($this->isValidType($type) && isset($this->collections[$asset])) {
$this->addType($collection, $type, $this->collections[$asset], $options);
return $this;
}
@@ -216,7 +251,9 @@ class Assets extends PropertyObject
// If pipeline disabled, set to position if provided, else after
if (isset($options['pipeline'])) {
if ($options['pipeline'] === false) {
$exclude_type = ($type === $this::JS_TYPE || $type === $this::INLINE_JS_TYPE) ? $this::JS : $this::CSS;
$exclude_type = $this->getBaseType($type);
$excludes = strtolower($exclude_type . '_pipeline_before_excludes');
if ($this->{$excludes}) {
$default = 'after';
@@ -231,7 +268,13 @@ class Assets extends PropertyObject
}
// Add timestamp
$options['timestamp'] = $this->timestamp;
$timestamp_override = $options['timestamp'] ?? true;
if (filter_var($timestamp_override, FILTER_VALIDATE_BOOLEAN)) {
$options['timestamp'] = $this->timestamp;
} else {
$options['timestamp'] = null;
}
// Set order
$group = $options['group'] ?? 'head';
@@ -255,6 +298,16 @@ class Assets extends PropertyObject
return $this;
}
/**
* Add a CSS asset or a collection of assets.
*
* @return $this
*/
public function addLink($asset)
{
return $this->addType($this::LINK_COLLECTION, $this::LINK_TYPE, $asset, $this->unifyLegacyArguments(func_get_args(), $this::LINK_TYPE));
}
/**
* Add a CSS asset or a collection of assets.
*
@@ -295,6 +348,25 @@ class Assets extends PropertyObject
return $this->addType($this::JS_COLLECTION, $this::INLINE_JS_TYPE, $asset, $this->unifyLegacyArguments(func_get_args(), $this::INLINE_JS_TYPE));
}
/**
* Add a JS asset or a collection of assets.
*
* @return $this
*/
public function addJsModule($asset)
{
return $this->addType($this::JS_MODULE_COLLECTION, $this::JS_MODULE_TYPE, $asset, $this->unifyLegacyArguments(func_get_args(), $this::JS_MODULE_TYPE));
}
/**
* Add an Inline JS asset or a collection of assets.
*
* @return $this
*/
public function addInlineJsModule($asset)
{
return $this->addType($this::JS_MODULE_COLLECTION, $this::INLINE_JS_MODULE_TYPE, $asset, $this->unifyLegacyArguments(func_get_args(), $this::INLINE_JS_MODULE_TYPE));
}
/**
* Add/replace collection.
@@ -386,7 +458,7 @@ class Assets extends PropertyObject
$after_assets = $this->filterAssets($group_assets, 'position', 'after', true);
// Pipeline
if ($this->{$pipeline_enabled}) {
if ($this->{$pipeline_enabled} ?? false) {
$options = array_merge($this->pipeline_options, ['timestamp' => $this->timestamp]);
$pipeline = new Pipeline($options);
@@ -418,9 +490,29 @@ class Assets extends PropertyObject
* @param array $attributes
* @return string
*/
public function css($group = 'head', $attributes = [])
public function css($group = 'head', $attributes = [], $include_link = true)
{
return $this->render('css', $group, $attributes);
$output = '';
if ($include_link) {
$output = $this->link($group, $attributes);
}
$output .= $this->render(self::CSS, $group, $attributes);
return $output;
}
/**
* Build the CSS link tags.
*
* @param string $group name of the group
* @param array $attributes
* @return string
*/
public function link($group = 'head', $attributes = [])
{
return $this->render(self::LINK, $group, $attributes);
}
/**
@@ -430,8 +522,71 @@ class Assets extends PropertyObject
* @param array $attributes
* @return string
*/
public function js($group = 'head', $attributes = [])
public function js($group = 'head', $attributes = [], $include_js_module = true)
{
return $this->render('js', $group, $attributes);
$output = $this->render(self::JS, $group, $attributes);
if ($include_js_module) {
$output .= $this->jsModule($group, $attributes);
}
return $output;
}
/**
* Build the Javascript Modules tags
*
* @param string $group
* @param array $attributes
* @return string
*/
public function jsModule($group = 'head', $attributes = [])
{
return $this->render(self::JS_MODULE, $group, $attributes);
}
/**
* @param string $group
* @param array $attributes
* @return string
*/
public function all($group = 'head', $attributes = [])
{
$output = $this->css($group, $attributes, false);
$output .= $this->link($group, $attributes);
$output .= $this->js($group, $attributes, false);
$output .= $this->jsModule($group, $attributes);
return $output;
}
/**
* @param class-string $type
* @return bool
*/
protected function isValidType($type)
{
return in_array($type, [self::CSS_TYPE, self::JS_TYPE, self::JS_MODULE_TYPE]);
}
/**
* @param class-string $type
* @return string
*/
protected function getBaseType($type)
{
switch ($type) {
case $this::JS_TYPE:
case $this::INLINE_JS_TYPE:
$base_type = $this::JS;
break;
case $this::JS_MODULE_TYPE:
case $this::INLINE_JS_MODULE_TYPE:
$base_type = $this::JS_MODULE;
break;
default:
$base_type = $this::CSS;
}
return $base_type;
}
}

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Assets
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -15,6 +15,7 @@ use Grav\Common\Grav;
use Grav\Common\Uri;
use Grav\Common\Utils;
use Grav\Framework\Object\PropertyObject;
use RocketTheme\Toolbox\File\File;
use SplFileInfo;
/**
@@ -25,8 +26,9 @@ abstract class BaseAsset extends PropertyObject
{
use AssetUtilsTrait;
protected const CSS_ASSET = true;
protected const JS_ASSET = false;
protected const CSS_ASSET = 1;
protected const JS_ASSET = 2;
protected const JS_MODULE_ASSET = 3;
/** @var string|false */
protected $asset;
@@ -68,7 +70,7 @@ abstract class BaseAsset extends PropertyObject
* @param array $elements
* @param string|null $key
*/
public function __construct(array $elements = [], $key = null)
public function __construct(array $elements = [], ?string $key = null)
{
$base_config = [
'group' => 'head',
@@ -91,6 +93,10 @@ abstract class BaseAsset extends PropertyObject
*/
public function init($asset, $options)
{
if (!$asset) {
return false;
}
$config = Grav::instance()['config'];
$uri = Grav::instance()['uri'];
@@ -125,7 +131,7 @@ abstract class BaseAsset extends PropertyObject
if ($locator->isStream($asset)) {
$path = $locator->findResource($asset, true);
} else {
$path = GRAV_ROOT . $asset;
$path = GRAV_WEBROOT . $asset;
}
// If local file is missing return
@@ -172,27 +178,31 @@ abstract class BaseAsset extends PropertyObject
return $this;
}
/**
* Receive asset location and return the SRI integrity hash
*
* @param $input
*
* @param string $input
* @return string
*/
public static function integrityHash( $input )
public static function integrityHash($input)
{
$grav = Grav::instance();
$uri = $grav['uri'];
$assetsConfig = $grav['config']->get('system.assets');
if ( !empty($assetsConfig['enable_asset_sri']) && $assetsConfig['enable_asset_sri'] )
{
$dataToHash = file_get_contents( GRAV_ROOT . $input);
if (!self::isRemoteLink($input) && !empty($assetsConfig['enable_asset_sri']) && $assetsConfig['enable_asset_sri']) {
$input = preg_replace('#^' . $uri->rootUrl() . '#', '', $input);
$asset = File::instance(GRAV_WEBROOT . $input);
$hash = hash('sha256', $dataToHash, true);
$hash_base64 = base64_encode($hash);
return ' integrity="sha256-' . $hash_base64 . '"';
if ($asset->exists()) {
$dataToHash = $asset->content();
$hash = hash('sha256', $dataToHash, true);
$hash_base64 = base64_encode($hash);
return ' integrity="sha256-' . $hash_base64 . '"';
}
}
return '';
@@ -209,7 +219,7 @@ abstract class BaseAsset extends PropertyObject
*/
// protected function getLastModificationTime($asset)
// {
// $file = GRAV_ROOT . $asset;
// $file = GRAV_WEBROOT . $asset;
// if (Grav::instance()['locator']->isStream($asset)) {
// $file = $this->buildLocalLink($asset, true);
// }
@@ -228,7 +238,7 @@ abstract class BaseAsset extends PropertyObject
protected function buildLocalLink($asset)
{
if ($asset) {
return $this->base_url . ltrim(Utils::replaceFirstOccurrence(GRAV_ROOT, '', $asset), '/');
return $this->base_url . ltrim(Utils::replaceFirstOccurrence(GRAV_WEBROOT, '', $asset), '/');
}
return false;
}
@@ -239,6 +249,7 @@ abstract class BaseAsset extends PropertyObject
*
* @return array
*/
#[\ReturnTypeWillChange]
public function jsonSerialize()
{
return ['type' => $this->getType(), 'elements' => $this->getElements()];
@@ -254,6 +265,19 @@ abstract class BaseAsset extends PropertyObject
*/
protected function cssRewrite($file, $dir, $local)
{
return;
return '';
}
/**
* Finds relative JS urls() and rewrites the URL with an absolute one
*
* @param string $file the css source file
* @param string $dir local relative path to the css file
* @param bool $local is this a local or remote asset
* @return string
*/
protected function jsRewrite($file, $dir, $local)
{
return '';
}
}

View File

@@ -0,0 +1,207 @@
<?php
/**
* @package Grav\Common\Assets
*
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Assets;
use Grav\Common\Assets;
use Grav\Common\Config\Config;
use Grav\Common\Grav;
use Grav\Framework\ContentBlock\HtmlBlock;
use function strlen;
/**
* Register block assets into Grav.
*/
class BlockAssets
{
/**
* @param HtmlBlock $block
* @return void
*/
public static function registerAssets(HtmlBlock $block): void
{
$grav = Grav::instance();
/** @var Assets $assets */
$assets = $grav['assets'];
$types = $block->getAssets();
foreach ($types as $type => $groups) {
switch ($type) {
case 'frameworks':
static::registerFrameworks($assets, $groups);
break;
case 'styles':
static::registerStyles($assets, $groups);
break;
case 'scripts':
static::registerScripts($assets, $groups);
break;
case 'links':
static::registerLinks($assets, $groups);
break;
case 'html':
static::registerHtml($assets, $groups);
break;
}
}
}
/**
* @param Assets $assets
* @param array $list
* @return void
*/
protected static function registerFrameworks(Assets $assets, array $list): void
{
if ($list) {
throw new \RuntimeException('Not Implemented');
}
}
/**
* @param Assets $assets
* @param array $groups
* @return void
*/
protected static function registerStyles(Assets $assets, array $groups): void
{
$grav = Grav::instance();
/** @var Config $config */
$config = $grav['config'];
foreach ($groups as $group => $styles) {
foreach ($styles as $style) {
switch ($style[':type']) {
case 'file':
$options = [
'priority' => $style[':priority'],
'group' => $group,
'type' => $style['type'],
'media' => $style['media']
] + $style['element'];
$assets->addCss(static::getRelativeUrl($style['href'], $config->get('system.assets.css_pipeline')), $options);
break;
case 'inline':
$options = [
'priority' => $style[':priority'],
'group' => $group,
'type' => $style['type'],
] + $style['element'];
$assets->addInlineCss($style['content'], $options);
break;
}
}
}
}
/**
* @param Assets $assets
* @param array $groups
* @return void
*/
protected static function registerScripts(Assets $assets, array $groups): void
{
$grav = Grav::instance();
/** @var Config $config */
$config = $grav['config'];
foreach ($groups as $group => $scripts) {
$group = $group === 'footer' ? 'bottom' : $group;
foreach ($scripts as $script) {
switch ($script[':type']) {
case 'file':
$options = [
'group' => $group,
'priority' => $script[':priority'],
'src' => $script['src'],
'type' => $script['type'],
'loading' => $script['loading'],
'defer' => $script['defer'],
'async' => $script['async'],
'handle' => $script['handle']
] + $script['element'];
$assets->addJs(static::getRelativeUrl($script['src'], $config->get('system.assets.js_pipeline')), $options);
break;
case 'inline':
$options = [
'priority' => $script[':priority'],
'group' => $group,
'type' => $script['type'],
'loading' => $script['loading']
] + $script['element'];
$assets->addInlineJs($script['content'], $options);
break;
}
}
}
}
/**
* @param Assets $assets
* @param array $groups
* @return void
*/
protected static function registerLinks(Assets $assets, array $groups): void
{
foreach ($groups as $group => $links) {
foreach ($links as $link) {
$href = $link['href'];
$options = [
'group' => $group,
'priority' => $link[':priority'],
'rel' => $link['rel'],
] + $link['element'];
$assets->addLink($href, $options);
}
}
}
/**
* @param Assets $assets
* @param array $groups
* @return void
*/
protected static function registerHtml(Assets $assets, array $groups): void
{
if ($groups) {
throw new \RuntimeException('Not Implemented');
}
}
/**
* @param string $url
* @param bool $pipeline
* @return string
*/
protected static function getRelativeUrl($url, $pipeline)
{
$grav = Grav::instance();
$base = rtrim($grav['base_url'], '/') ?: '/';
if (strpos($url, $base) === 0) {
if ($pipeline) {
// Remove file timestamp if CSS pipeline has been enabled.
$url = preg_replace('|[?#].*|', '', $url);
}
return substr($url, strlen($base) - 1);
}
return $url;
}
}

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Assets
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -22,7 +22,7 @@ class Css extends BaseAsset
* @param array $elements
* @param string|null $key
*/
public function __construct(array $elements = [], $key = null)
public function __construct(array $elements = [], ?string $key = null)
{
$base_options = [
'asset_type' => 'css',

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Assets
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -22,7 +22,7 @@ class InlineCss extends BaseAsset
* @param array $elements
* @param string|null $key
*/
public function __construct(array $elements = [], $key = null)
public function __construct(array $elements = [], ?string $key = null)
{
$base_options = [
'asset_type' => 'css',

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Assets
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -22,7 +22,7 @@ class InlineJs extends BaseAsset
* @param array $elements
* @param string|null $key
*/
public function __construct(array $elements = [], $key = null)
public function __construct(array $elements = [], ?string $key = null)
{
$base_options = [
'asset_type' => 'js',

View File

@@ -0,0 +1,46 @@
<?php
/**
* @package Grav\Common\Assets
*
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Assets;
use Grav\Common\Utils;
/**
* Class InlineJs
* @package Grav\Common\Assets
*/
class InlineJsModule extends BaseAsset
{
/**
* InlineJs constructor.
* @param array $elements
* @param string|null $key
*/
public function __construct(array $elements = [], ?string $key = null)
{
$base_options = [
'asset_type' => 'js_module',
'attributes' => ['type' => 'module'],
'position' => 'after'
];
$merged_attributes = Utils::arrayMergeRecursiveUnique($base_options, $elements);
parent::__construct($merged_attributes, $key);
}
/**
* @return string
*/
public function render()
{
return '<script' . $this->renderAttributes(). ">\n" . trim($this->asset) . "\n</script>\n";
}
}

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Assets
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -22,7 +22,7 @@ class Js extends BaseAsset
* @param array $elements
* @param string|null $key
*/
public function __construct(array $elements = [], $key = null)
public function __construct(array $elements = [], ?string $key = null)
{
$base_options = [
'asset_type' => 'js',

View File

@@ -0,0 +1,49 @@
<?php
/**
* @package Grav\Common\Assets
*
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Assets;
use Grav\Common\Utils;
/**
* Class Js
* @package Grav\Common\Assets
*/
class JsModule extends BaseAsset
{
/**
* Js constructor.
* @param array $elements
* @param string|null $key
*/
public function __construct(array $elements = [], ?string $key = null)
{
$base_options = [
'asset_type' => 'js_module',
'attributes' => ['type' => 'module']
];
$merged_attributes = Utils::arrayMergeRecursiveUnique($base_options, $elements);
parent::__construct($merged_attributes, $key);
}
/**
* @return string
*/
public function render()
{
if (isset($this->attributes['loading']) && $this->attributes['loading'] === 'inline') {
$buffer = $this->gatherLinks([$this], self::JS_MODULE_ASSET);
return '<script' . $this->renderAttributes() . ">\n" . trim($buffer) . "\n</script>\n";
}
return '<script src="' . trim($this->asset) . $this->renderQueryString() . '"' . $this->renderAttributes() . $this->integrityHash($this->asset) . "></script>\n";
}
}

View File

@@ -0,0 +1,43 @@
<?php
/**
* @package Grav\Common\Assets
*
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Assets;
use Grav\Common\Utils;
/**
* Class Link
* @package Grav\Common\Assets
*/
class Link extends BaseAsset
{
/**
* Css constructor.
* @param array $elements
* @param string|null $key
*/
public function __construct(array $elements = [], ?string $key = null)
{
$base_options = [
'asset_type' => 'link',
];
$merged_attributes = Utils::arrayMergeRecursiveUnique($base_options, $elements);
parent::__construct($merged_attributes, $key);
}
/**
* @return string
*/
public function render()
{
return '<link href="' . trim($this->asset) . $this->renderQueryString() . '"' . $this->renderAttributes() . $this->integrityHash($this->asset) . ">\n";
}
}

View File

@@ -3,15 +3,15 @@
/**
* @package Grav\Common\Assets
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Assets;
use Grav\Common\Assets\BaseAsset;
use Grav\Common\Assets\Traits\AssetUtilsTrait;
use Grav\Common\Config\Config;
use Grav\Common\Filesystem\Folder;
use Grav\Common\Grav;
use Grav\Common\Uri;
use Grav\Common\Utils;
@@ -29,11 +29,15 @@ class Pipeline extends PropertyObject
{
use AssetUtilsTrait;
protected const CSS_ASSET = true;
protected const JS_ASSET = false;
protected const CSS_ASSET = 1;
protected const JS_ASSET = 2;
protected const JS_MODULE_ASSET = 3;
/** @const Regex to match CSS urls */
protected const CSS_URL_REGEX = '{url\(([\'\"]?)(.*?)\1\)}';
protected const CSS_URL_REGEX = '{url\(([\'\"]?)(.*?)\1\)|(@import)\s+([\'\"])(.*?)\4}';
/** @const Regex to match JS imports */
protected const JS_IMPORT_REGEX = '{import.+from\s?[\'|\"](.+?)[\'|\"]}';
/** @const Regex to match CSS sourcemap comments */
protected const CSS_SOURCEMAP_REGEX = '{\/\*# (.*?) \*\/}';
@@ -88,7 +92,14 @@ class Pipeline extends PropertyObject
$uri = Grav::instance()['uri'];
$this->base_url = rtrim($uri->rootUrl($config->get('system.absolute_urls')), '/') . '/';
$this->assets_dir = $locator->findResource('asset://') . DS;
$this->assets_dir = $locator->findResource('asset://');
if (!$this->assets_dir) {
// Attempt to create assets folder if it doesn't exist yet.
$this->assets_dir = $locator->findResource('asset://', true, true);
Folder::mkdir($this->assets_dir);
$locator->clearCache();
}
$this->assets_url = $locator->findResource('asset://', false);
}
@@ -115,14 +126,13 @@ class Pipeline extends PropertyObject
// Compute uid based on assets and timestamp
$json_assets = json_encode($assets);
$uid = md5($json_assets . $this->css_minify . $this->css_rewrite . $group);
$uid = md5($json_assets . (int)$this->css_minify . (int)$this->css_rewrite . $group);
$file = $uid . '.css';
$relative_path = "{$this->base_url}{$this->assets_url}/{$file}";
$buffer = null;
if (file_exists($this->assets_dir . $file)) {
$buffer = file_get_contents($this->assets_dir . $file) . "\n";
$filepath = "{$this->assets_dir}/{$file}";
if (file_exists($filepath)) {
$buffer = file_get_contents($filepath) . "\n";
} else {
//if nothing found get out of here!
if (empty($assets)) {
@@ -141,7 +151,7 @@ class Pipeline extends PropertyObject
// Write file
if (trim($buffer) !== '') {
file_put_contents($this->assets_dir . $file, $buffer);
file_put_contents($filepath, $buffer);
}
}
@@ -163,7 +173,7 @@ class Pipeline extends PropertyObject
* @param array $attributes
* @return bool|string URL or generated content if available, else false
*/
public function renderJs($assets, $group, $attributes = [])
public function renderJs($assets, $group, $attributes = [], $type = self::JS_ASSET)
{
// temporary list of assets to pipeline
$inline_group = false;
@@ -182,10 +192,9 @@ class Pipeline extends PropertyObject
$file = $uid . '.js';
$relative_path = "{$this->base_url}{$this->assets_url}/{$file}";
$buffer = null;
if (file_exists($this->assets_dir . $file)) {
$buffer = file_get_contents($this->assets_dir . $file) . "\n";
$filepath = "{$this->assets_dir}/{$file}";
if (file_exists($filepath)) {
$buffer = file_get_contents($filepath) . "\n";
} else {
//if nothing found get out of here!
if (empty($assets)) {
@@ -193,7 +202,7 @@ class Pipeline extends PropertyObject
}
// Concatenate files
$buffer = $this->gatherLinks($assets, self::JS_ASSET);
$buffer = $this->gatherLinks($assets, $type);
// Minify if required
if ($this->shouldMinify('js')) {
@@ -204,7 +213,7 @@ class Pipeline extends PropertyObject
// Write file
if (trim($buffer) !== '') {
file_put_contents($this->assets_dir . $file, $buffer);
file_put_contents($filepath, $buffer);
}
}
@@ -218,6 +227,19 @@ class Pipeline extends PropertyObject
return $output;
}
/**
* Minify and concatenate JS files.
*
* @param array $assets
* @param string $group
* @param array $attributes
* @return bool|string URL or generated content if available, else false
*/
public function renderJs_Module($assets, $group, $attributes = [])
{
$attributes['type'] = 'module';
return $this->renderJs($assets, $group, $attributes, self::JS_MODULE_ASSET);
}
/**
* Finds relative CSS urls() and rewrites the URL with an absolute one
@@ -235,9 +257,14 @@ class Pipeline extends PropertyObject
// Find any css url() elements, grab the URLs and calculate an absolute path
// Then replace the old url with the new one
$file = (string)preg_replace_callback(self::CSS_URL_REGEX, function ($matches) use ($dir, $local) {
$isImport = count($matches) > 3 && $matches[3] === '@import';
$old_url = $matches[2];
if ($isImport) {
$old_url = $matches[5];
} else {
$old_url = $matches[2];
}
// Ensure link is not rooted to web server, a data URL, or to a remote host
if (preg_match(self::FIRST_FORWARDSLASH_REGEX, $old_url) || Utils::startsWith($old_url, 'data:') || $this->isRemoteLink($old_url)) {
return $matches[0];
@@ -249,9 +276,49 @@ class Pipeline extends PropertyObject
$old_url = ltrim($old_url, '/');
}
$new_url = ($local ? $this->base_url: '') . $old_url;
$new_url = ($local ? $this->base_url : '') . $old_url;
return str_replace($matches[2], $new_url, $matches[0]);
if ($isImport) {
return str_replace($matches[5], $new_url, $matches[0]);
} else {
return str_replace($matches[2], $new_url, $matches[0]);
}
}, $file);
return $file;
}
/**
* Finds relative JS urls() and rewrites the URL with an absolute one
*
* @param string $file the css source file
* @param string $dir local relative path to the css file
* @param bool $local is this a local or remote asset
* @return string
*/
protected function jsRewrite($file, $dir, $local)
{
// Find any js import elements, grab the URLs and calculate an absolute path
// Then replace the old url with the new one
$file = (string)preg_replace_callback(self::JS_IMPORT_REGEX, function ($matches) use ($dir, $local) {
$old_url = $matches[1];
// Ensure link is not rooted to web server, a data URL, or to a remote host
if (preg_match(self::FIRST_FORWARDSLASH_REGEX, $old_url) || $this->isRemoteLink($old_url)) {
return $matches[0];
}
// clean leading /
$old_url = Utils::normalizePath($dir . '/' . $old_url);
$old_url = str_replace('/./', '/', $old_url);
if (preg_match(self::FIRST_FORWARDSLASH_REGEX, $old_url)) {
$old_url = ltrim($old_url, '/');
}
$new_url = ($local ? $this->base_url : '') . $old_url;
return str_replace($matches[1], $new_url, $matches[0]);
}, $file);
return $file;

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Assets\Traits
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -62,15 +62,13 @@ trait AssetUtilsTrait
* Download and concatenate the content of several links.
*
* @param array $assets
* @param bool $css
* @param int $type
* @return string
*/
protected function gatherLinks(array $assets, $css = true)
protected function gatherLinks(array $assets, int $type = self::CSS_ASSET): string
{
$buffer = '';
foreach ($assets as $id => $asset) {
foreach ($assets as $asset) {
$local = true;
$link = $asset->getAsset();
@@ -90,7 +88,7 @@ trait AssetUtilsTrait
}
$relative_dir = dirname($relative_path);
$link = ROOT_DIR . $relative_path;
$link = GRAV_ROOT . '/' . $relative_path;
}
// TODO: looks like this is not being used.
@@ -102,21 +100,25 @@ trait AssetUtilsTrait
}
// Double check last character being
if (!$css) {
if ($type === self::JS_ASSET || $type === self::JS_MODULE_ASSET) {
$file = rtrim($file, ' ;') . ';';
}
// If this is CSS + the file is local + rewrite enabled
if ($css && $this->css_rewrite) {
if ($type === self::CSS_ASSET && $this->css_rewrite) {
$file = $this->cssRewrite($file, $relative_dir, $local);
}
if ($type === self::JS_MODULE_ASSET) {
$file = $this->jsRewrite($file, $relative_dir, $local);
}
$file = rtrim($file) . PHP_EOL;
$buffer .= $file;
}
// Pull out @imports and move to top
if ($css) {
if ($type === self::CSS_ASSET) {
$buffer = $this->moveImports($buffer);
}
@@ -135,7 +137,7 @@ trait AssetUtilsTrait
$imports = [];
$file = (string)preg_replace_callback($regex, function ($matches) use (&$imports) {
$file = (string)preg_replace_callback($regex, static function ($matches) use (&$imports) {
$imports[] = $matches[0];
return '';
@@ -156,6 +158,10 @@ trait AssetUtilsTrait
$no_key = ['loading'];
foreach ($this->attributes as $key => $value) {
if ($value === null) {
continue;
}
if (is_numeric($key)) {
$key = $value;
}
@@ -186,6 +192,7 @@ trait AssetUtilsTrait
$querystring = '';
$asset = $asset ?? $this->asset;
$attributes = $this->attributes;
if (!empty($this->query)) {
if (Utils::contains($asset, '?')) {
@@ -196,7 +203,7 @@ trait AssetUtilsTrait
}
if ($this->timestamp) {
if (Utils::contains($asset, '?') || $querystring) {
if ($querystring || Utils::contains($asset, '?')) {
$querystring .= '&' . $this->timestamp;
} else {
$querystring .= '?' . $this->timestamp;

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Assets\Traits
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Assets\Traits
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -252,7 +252,7 @@ trait TestingAssetsTrait
*/
public function addDir($directory, $pattern = self::DEFAULT_REGEX)
{
$root_dir = rtrim(ROOT_DIR, '/');
$root_dir = GRAV_ROOT;
// Check if $directory is a stream.
if (strpos($directory, '://')) {
@@ -285,6 +285,15 @@ trait TestingAssetsTrait
return $this;
}
// Add JavaScript Module files
if ($pattern === self::JS_MODULE_REGEX) {
foreach ($files as $file) {
$this->addJsModule($file);
}
return $this;
}
// Unknown pattern.
foreach ($files as $asset) {
$this->add($asset);

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Backup
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -104,8 +104,8 @@ class Backups
*/
public function getBackupDownloadUrl($backup, $base_url)
{
$param_sep = $param_sep = Grav::instance()['config']->get('system.param_sep', ':');
$download = urlencode(base64_encode(basename($backup)));
$param_sep = Grav::instance()['config']->get('system.param_sep', ':');
$download = urlencode(base64_encode(Utils::basename($backup)));
$url = rtrim(Grav::instance()['uri']->rootUrl(true), '/') . '/' . trim(
$base_url,
'/'
@@ -144,9 +144,8 @@ class Backups
public static function getTotalBackupsSize()
{
$backups = static::getAvailableBackups();
$size = array_sum(array_column($backups, 'size'));
return $size ?? 0;
return $backups ? array_sum(array_column($backups, 'size')) : 0;
}
/**
@@ -222,7 +221,7 @@ class Backups
$backup_root = rtrim(GRAV_ROOT . $backup_root, '/');
}
if (!file_exists($backup_root)) {
if (!$backup_root || !file_exists($backup_root)) {
throw new RuntimeException("Backup location: {$backup_root} does not exist...");
}

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -127,7 +127,6 @@ class Cache extends Getters
*/
public function init(Grav $grav)
{
/** @var Config $config */
$this->config = $grav['config'];
$this->now = time();
@@ -142,7 +141,7 @@ class Cache extends Getters
$uniqueness = substr(md5($uri->rootUrl(true) . $this->config->key() . GRAV_VERSION), 2, 8);
// Cache key allows us to invalidate all cache on configuration changes.
$this->key = ($prefix ? $prefix : 'g') . '-' . $uniqueness;
$this->key = ($prefix ?: 'g') . '-' . $uniqueness;
$this->cache_dir = $grav['locator']->findResource('cache://doctrine/' . $uniqueness, true, true);
$this->driver_setting = $this->config->get('system.cache.driver');
$this->driver = $this->getCacheDriver();
@@ -178,7 +177,7 @@ class Cache extends Getters
public function purgeOldCache()
{
$cache_dir = dirname($this->cache_dir);
$current = basename($this->cache_dir);
$current = Utils::basename($this->cache_dir);
$count = 0;
foreach (new DirectoryIterator($cache_dir) as $file) {
@@ -619,11 +618,7 @@ class Cache extends Getters
*/
public function isVolatileDriver($setting)
{
if (in_array($setting, ['apc', 'apcu', 'xcache', 'wincache'])) {
return true;
}
return false;
return in_array($setting, ['apc', 'apcu', 'xcache', 'wincache'], true);
}
/**

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Config
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Config
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Config
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Config
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Config
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Config
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Config
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Config
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -41,6 +41,9 @@ class Setup extends Data
*/
public static $environment;
/** @var string */
public static $securityFile = 'config://security.yaml';
/** @var array */
protected $streams = [
'user' => [
@@ -164,6 +167,8 @@ class Setup extends Data
public function __construct($container)
{
// Configure main streams.
$abs = str_starts_with(GRAV_SYSTEM_PATH, '/');
$this->streams['system']['prefixes'][''] = $abs ? ['system', GRAV_SYSTEM_PATH] : ['system'];
$this->streams['user']['prefixes'][''] = [GRAV_USER_PATH];
$this->streams['cache']['prefixes'][''] = [GRAV_CACHE_PATH];
$this->streams['log']['prefixes'][''] = [GRAV_LOG_PATH];
@@ -177,13 +182,14 @@ class Setup extends Data
// If no environment is set, make sure we get one (CLI or hostname).
if (null === $environment) {
if (defined('GRAV_CLI')) {
$request = null;
$uri = null;
$environment = 'cli';
} else {
/** @var ServerRequestInterface $request */
$request = $container['request'];
$host = $request->getUri()->getHost();
$environment = Utils::substrToString($host, ':');
$uri = $request->getUri();
$environment = $uri->getHost();
}
}
@@ -197,16 +203,16 @@ class Setup extends Data
if (null !== $setupFile) {
// Make sure that the custom setup file exists. Terminates the script if not.
if (!str_starts_with($setupFile, '/')) {
$setupFile = GRAV_ROOT . '/' . $setupFile;
$setupFile = GRAV_WEBROOT . '/' . $setupFile;
}
if (!is_file($setupFile)) {
echo 'GRAV_SETUP_PATH is defined but does not point to existing setup file.';
exit(1);
}
} else {
$setupFile = GRAV_ROOT . '/setup.php';
$setupFile = GRAV_WEBROOT . '/setup.php';
if (!is_file($setupFile)) {
$setupFile = GRAV_ROOT . '/' . GRAV_USER_PATH . '/setup.php';
$setupFile = GRAV_WEBROOT . '/' . GRAV_USER_PATH . '/setup.php';
}
if (!is_file($setupFile)) {
$setupFile = null;
@@ -234,7 +240,7 @@ class Setup extends Data
$envPath .= '/';
} else {
// Use default location. Start with Grav 1.7 default.
$envPath = GRAV_ROOT. '/' . GRAV_USER_PATH . '/env';
$envPath = GRAV_WEBROOT. '/' . GRAV_USER_PATH . '/env';
if (is_dir($envPath)) {
$envPath = 'user://env/';
} else {
@@ -257,7 +263,7 @@ class Setup extends Data
*/
public function init()
{
$locator = new UniformResourceLocator(GRAV_ROOT);
$locator = new UniformResourceLocator(GRAV_WEBROOT);
$files = [];
$guard = 5;
@@ -388,12 +394,19 @@ class Setup extends Data
if (!$locator->findResource('environment://config', true)) {
// If environment does not have its own directory, remove it from the lookup.
$this->set('streams.schemes.environment.prefixes', ['config' => []]);
$prefixes = $this->get('streams.schemes.environment.prefixes');
$prefixes['config'] = [];
$this->set('streams.schemes.environment.prefixes', $prefixes);
$this->initializeLocator($locator);
}
// Create security.yaml if it doesn't exist.
$filename = $locator->findResource('config://security.yaml', true, true);
// Create security.yaml salt if it doesn't exist into existing configuration environment if possible.
$securityFile = Utils::basename(static::$securityFile);
$securityFolder = substr(static::$securityFile, 0, -\strlen($securityFile));
$securityFolder = $locator->findResource($securityFolder, true) ?: $locator->findResource($securityFolder, true, true);
$filename = "{$securityFolder}/{$securityFile}";
$security_file = CompiledYamlFile::instance($filename);
$security_content = (array)$security_file->content();

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Data
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -37,7 +37,7 @@ class Blueprint extends BlueprintForm
/** @var string|null */
protected $scope;
/** @var BlueprintSchema */
/** @var BlueprintSchema|null */
protected $blueprintSchema;
/** @var object|null */
@@ -54,7 +54,7 @@ class Blueprint extends BlueprintForm
*/
public function __clone()
{
if ($this->blueprintSchema) {
if (null !== $this->blueprintSchema) {
$this->blueprintSchema = clone $this->blueprintSchema;
}
}
@@ -99,7 +99,7 @@ class Blueprint extends BlueprintForm
*/
public function getDefaultValue(string $name)
{
$path = explode('.', $name) ?: [];
$path = explode('.', $name);
$current = $this->getDefaults();
foreach ($path as $field) {
@@ -293,15 +293,16 @@ class Blueprint extends BlueprintForm
/**
* Flatten data by using blueprints.
*
* @param array $data
* @param bool $includeAll
* @param array $data Data to be flattened.
* @param bool $includeAll True if undefined properties should also be included.
* @param string $name Property which will be flattened, useful for flattening repeating data.
* @return array
*/
public function flattenData(array $data, bool $includeAll = false)
public function flattenData(array $data, bool $includeAll = false, string $name = '')
{
$this->initInternals();
return $this->blueprintSchema->flattenData($data, $includeAll);
return $this->blueprintSchema->flattenData($data, $includeAll, $name);
}
@@ -514,7 +515,7 @@ class Blueprint extends BlueprintForm
$success = $this->resolveActions($user, $actions);
}
if (!$success) {
$this->addPropertyRecursive($field, 'validate', ['ignore' => true]);
static::addPropertyRecursive($field, 'validate', ['ignore' => true]);
}
}
@@ -524,8 +525,12 @@ class Blueprint extends BlueprintForm
* @param string $op
* @return bool
*/
protected function resolveActions(UserInterface $user, array $actions, string $op = 'and')
protected function resolveActions(?UserInterface $user, array $actions, string $op = 'and')
{
if (null === $user) {
return false;
}
$c = $i = count($actions);
foreach ($actions as $key => $action) {
if (!is_int($key) && is_array($actions)) {
@@ -561,7 +566,7 @@ class Blueprint extends BlueprintForm
}
if ($matches) {
$this->addPropertyRecursive($field, 'validate', ['ignore' => true]);
static::addPropertyRecursive($field, 'validate', ['ignore' => true]);
return;
}
}
@@ -572,7 +577,7 @@ class Blueprint extends BlueprintForm
* @param mixed $value
* @return void
*/
protected function addPropertyRecursive(array &$field, $property, $value)
public static function addPropertyRecursive(array &$field, $property, $value)
{
if (is_array($value) && isset($field[$property]) && is_array($field[$property])) {
$field[$property] = array_merge_recursive($field[$property], $value);
@@ -582,7 +587,7 @@ class Blueprint extends BlueprintForm
if (!empty($field['fields'])) {
foreach ($field['fields'] as $key => &$child) {
$this->addPropertyRecursive($child, $property, $value);
static::addPropertyRecursive($child, $property, $value);
}
}
}

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Data
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -56,6 +56,15 @@ class BlueprintSchema extends BlueprintSchemaBase implements ExportInterface
return $this->types[$name] ?? [];
}
/**
* @param string $name
* @return array|null
*/
public function getNestedRules(string $name)
{
return $this->getNested($name);
}
/**
* Validate data against blueprints.
*
@@ -74,7 +83,7 @@ class BlueprintSchema extends BlueprintSchemaBase implements ExportInterface
}
if (!empty($messages)) {
throw (new ValidationException())->setMessages($messages);
throw (new ValidationException('', 400))->setMessages($messages);
}
}
@@ -106,23 +115,30 @@ class BlueprintSchema extends BlueprintSchemaBase implements ExportInterface
/**
* Flatten data by using blueprints.
*
* @param array $data Data to be flattened.
* @param bool $includeAll
* @param array $data Data to be flattened.
* @param bool $includeAll True if undefined properties should also be included.
* @param string $name Property which will be flattened, useful for flattening repeating data.
* @return array
*/
public function flattenData(array $data, bool $includeAll = false)
public function flattenData(array $data, bool $includeAll = false, string $name = '')
{
$prefix = $name !== '' ? $name . '.' : '';
$list = [];
if ($includeAll) {
foreach ($this->items as $key => $rules) {
$items = $name !== '' ? $this->getProperty($name)['fields'] ?? [] : $this->items;
foreach ($items as $key => $rules) {
$type = $rules['type'] ?? '';
if (!str_starts_with($type, '_') && !str_contains($key, '*')) {
$list[$key] = null;
$ignore = (bool) array_filter((array)($rules['validate']['ignore'] ?? [])) ?? false;
if (!str_starts_with($type, '_') && !str_contains($key, '*') && $ignore !== true) {
$list[$prefix . $key] = null;
}
}
}
return array_replace($list, $this->flattenArray($data, $this->nested, ''));
$nested = $this->getNestedRules($name);
return array_replace($list, $this->flattenArray($data, $nested, $prefix));
}
/**
@@ -190,7 +206,7 @@ class BlueprintSchema extends BlueprintSchemaBase implements ExportInterface
/** @var Config $config */
$config = Grav::instance()['config'];
if (!$config->get('system.strict_mode.blueprint_strict_compat', true)) {
throw new RuntimeException(sprintf('%s is not defined in blueprints', $key));
throw new RuntimeException(sprintf('%s is not defined in blueprints', $key), 400);
}
user_error(sprintf('Having extra key %s in your data is deprecated with blueprint having \'validation: strict\'', $key), E_USER_DEPRECATED);
@@ -317,6 +333,10 @@ class BlueprintSchema extends BlueprintSchemaBase implements ExportInterface
$toggle = [];
}
// Recursively fetch the items.
$childData = $data[$key] ?? null;
if (null !== $childData && !is_array($childData)) {
throw new \RuntimeException(sprintf("Bad form data for field collection '%s': %s used instead of an array", $key, gettype($childData)));
}
$data[$key] = $this->processFormRecursive($data[$key] ?? null, $toggle, $value);
} else {
$field = $this->get($value);

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Data
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Data
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -264,7 +264,7 @@ class Data implements DataInterface, ArrayAccess, \Countable, JsonSerializable,
*/
public function blueprints()
{
if (!$this->blueprints) {
if (null === $this->blueprints) {
$this->blueprints = new Blueprint();
} elseif (is_callable($this->blueprints)) {
// Lazy load blueprints.
@@ -335,6 +335,7 @@ class Data implements DataInterface, ArrayAccess, \Countable, JsonSerializable,
/**
* @return array
*/
#[\ReturnTypeWillChange]
public function jsonSerialize()
{
return $this->items;

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Data
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Data
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -27,7 +27,6 @@ use function is_bool;
use function is_float;
use function is_int;
use function is_string;
use function strlen;
/**
* Class Validation
@@ -239,20 +238,27 @@ class Validation
$value = trim($value);
}
if (isset($params['min']) && strlen($value) < $params['min']) {
$value = preg_replace("/\r\n|\r/um", "\n", $value);
$len = mb_strlen($value);
$min = (int)($params['min'] ?? 0);
if ($min && $len < $min) {
return false;
}
if (isset($params['max']) && strlen($value) > $params['max']) {
$multiline = isset($params['multiline']) && $params['multiline'];
$max = (int)($params['max'] ?? ($multiline ? 65536 : 2048));
if ($max && $len > $max) {
return false;
}
$min = $params['min'] ?? 0;
if (isset($params['step']) && (strlen($value) - $min) % $params['step'] === 0) {
$step = (int)($params['step'] ?? 0);
if ($step && ($len - $min) % $step === 0) {
return false;
}
if ((!isset($params['multiline']) || !$params['multiline']) && preg_match('/\R/um', $value)) {
if (!$multiline && preg_match('/\R/um', $value)) {
return false;
}
@@ -271,11 +277,13 @@ class Validation
return '';
}
$value = (string)$value;
if (!empty($params['trim'])) {
$value = trim($value);
}
return (string) $value;
return preg_replace("/\r\n|\r/um", "\n", $value);
}
/**
@@ -311,6 +319,10 @@ class Validation
*/
public static function typeCommaList($value, array $params, array $field)
{
if (!isset($params['max'])) {
$params['max'] = 2048;
}
return is_array($value) ? true : self::typeText($value, $params, $field);
}
@@ -332,7 +344,7 @@ class Validation
*/
protected static function filterLower($value, array $params)
{
return strtolower($value);
return mb_strtolower($value);
}
/**
@@ -342,7 +354,7 @@ class Validation
*/
protected static function filterUpper($value, array $params)
{
return strtoupper($value);
return mb_strtoupper($value);
}
@@ -373,6 +385,10 @@ class Validation
*/
public static function typePassword($value, array $params, array $field)
{
if (!isset($params['max'])) {
$params['max'] = 256;
}
return self::typeText($value, $params, $field);
}
@@ -513,17 +529,32 @@ class Validation
return false;
}
if (isset($params['min']) && $value < $params['min']) {
return false;
$value = (float)$value;
$min = 0;
if (isset($params['min'])) {
$min = (float)$params['min'];
if ($value < $min) {
return false;
}
}
if (isset($params['max']) && $value > $params['max']) {
return false;
if (isset($params['max'])) {
$max = (float)$params['max'];
if ($value > $max) {
return false;
}
}
$min = $params['min'] ?? 0;
if (isset($params['step'])) {
$step = (float)$params['step'];
// Count of how many steps we are above/below the minimum value.
$pos = ($value - $min) / $step;
return !(isset($params['step']) && fmod($value - $min, $params['step']) === 0);
return is_int(static::filterNumber($pos, $params, $field));
}
return true;
}
/**
@@ -534,7 +565,7 @@ class Validation
*/
protected static function filterNumber($value, array $params, array $field)
{
return (string)(int)$value !== (string)(float)$value ? (float) $value : (int) $value;
return (string)(int)$value !== (string)(float)$value ? (float)$value : (int)$value;
}
/**
@@ -587,7 +618,7 @@ class Validation
*/
public static function typeColor($value, array $params, array $field)
{
return preg_match('/^\#[0-9a-fA-F]{3}[0-9a-fA-F]{3}?$/u', $value);
return (bool)preg_match('/^\#[0-9a-fA-F]{3}[0-9a-fA-F]{3}?$/u', $value);
}
/**
@@ -600,10 +631,18 @@ class Validation
*/
public static function typeEmail($value, array $params, array $field)
{
if (empty($value)) {
return false;
}
if (!isset($params['max'])) {
$params['max'] = 320;
}
$values = !is_array($value) ? explode(',', preg_replace('/\s+/', '', $value)) : $value;
foreach ($values as $val) {
if (!(self::typeText($val, $params, $field) && filter_var($val, FILTER_VALIDATE_EMAIL))) {
if (!(self::typeText($val, $params, $field) && strpos($val, '@', 1))) {
return false;
}
}
@@ -621,6 +660,10 @@ class Validation
*/
public static function typeUrl($value, array $params, array $field)
{
if (!isset($params['max'])) {
$params['max'] = 2048;
}
return self::typeText($value, $params, $field) && filter_var($value, FILTER_VALIDATE_URL);
}
@@ -760,14 +803,22 @@ class Validation
}
// If creating new values is allowed, no further checks are needed.
if (!empty($field['selectize']['create'])) {
$validateOptions = $field['validate']['options'] ?? null;
if (!empty($field['selectize']['create']) || $validateOptions === 'ignore') {
return true;
}
$options = $field['options'] ?? [];
$use = $field['use'] ?? 'values';
if (empty($field['selectize']) || empty($field['multiple'])) {
if ($validateOptions) {
// Use custom options structure.
foreach ($options as &$option) {
$option = $option[$validateOptions] ?? null;
}
unset($option);
$options = array_values($options);
} elseif (empty($field['selectize']) || empty($field['multiple'])) {
$options = array_keys($options);
}
if ($use === 'keys') {
@@ -787,7 +838,7 @@ class Validation
{
$value = static::filterArray($value, $params, $field);
return Utils::arrayUnflattenDotNotation($value);
return is_array($value) ? Utils::arrayUnflattenDotNotation($value) : null;
}
/**
@@ -1168,7 +1219,7 @@ class Validation
*/
public static function filterItem_List($value, $params)
{
return array_values(array_filter($value, function ($v) {
return array_values(array_filter($value, static function ($v) {
return !empty($v);
}));
}

View File

@@ -3,23 +3,25 @@
/**
* @package Grav\Common\Data
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Data;
use Grav\Common\Grav;
use JsonSerializable;
use RuntimeException;
/**
* Class ValidationException
* @package Grav\Common\Data
*/
class ValidationException extends RuntimeException
class ValidationException extends RuntimeException implements JsonSerializable
{
/** @var array */
protected $messages = [];
protected $escape = true;
/**
* @param array $messages
@@ -32,21 +34,34 @@ class ValidationException extends RuntimeException
$language = Grav::instance()['language'];
$this->message = $language->translate('GRAV.FORM.VALIDATION_FAIL', null, true) . ' ' . $this->message;
foreach ($messages as $variable => &$list) {
foreach ($messages as $list) {
$list = array_unique($list);
foreach ($list as $message) {
$this->message .= "<br/>$message";
$this->message .= '<br/>' . htmlspecialchars($message, ENT_QUOTES | ENT_HTML5, 'UTF-8');
}
}
return $this;
}
public function setSimpleMessage(bool $escape = true): void
{
$first = reset($this->messages);
$message = reset($first);
$this->message = $escape ? htmlspecialchars($message, ENT_QUOTES | ENT_HTML5, 'UTF-8') : $message;
}
/**
* @return array
*/
public function getMessages()
public function getMessages(): array
{
return $this->messages;
}
public function jsonSerialize(): array
{
return ['validation' => $this->messages];
}
}

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -332,7 +332,7 @@ class Debugger
return new Response(404, $headers, json_encode($response));
}
$data = is_array($data) ? array_map(function ($item) {
$data = is_array($data) ? array_map(static function ($item) {
return $item->toArray();
}, $data) : $data->toArray();
@@ -856,6 +856,10 @@ class Debugger
$scope = 'grav';
} elseif (strpos($errfile, '/twig/') !== false) {
$scope = 'twig';
// TODO: remove when upgrading to Twig 2+
if (str_contains($errstr, '#[\ReturnTypeWillChange]') || str_contains($errstr, 'Passing null to parameter')) {
return true;
}
} elseif (stripos($errfile, '/yaml/') !== false) {
$scope = 'yaml';
} elseif (strpos($errfile, '/vendor/') !== false) {

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Errors
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Errors
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Errors
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -57,7 +57,7 @@ class SimplePageHandler extends Handler
$vars = array(
'stylesheet' => file_get_contents($cssFile),
'code' => $code,
'message' => filter_var(rawurldecode($message), FILTER_SANITIZE_STRING),
'message' => htmlspecialchars(strip_tags(rawurldecode($message)), ENT_QUOTES, 'UTF-8'),
);
$helper->setVariables($vars);

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Errors
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -43,4 +43,25 @@ class SystemFacade extends \Whoops\Util\SystemFacade
$handler();
}
}
/**
* @param int $httpCode
*
* @return int
*/
public function setHttpResponseCode($httpCode)
{
if (!headers_sent()) {
// Ensure that no 'location' header is present as otherwise this
// will override the HTTP code being set here, and mask the
// expected error page.
header_remove('location');
// Work around PHP bug #8218 (8.0.17 & 8.1.4).
header_remove('Content-Encoding');
}
return http_response_code($httpCode);
}
}

View File

@@ -3,13 +3,16 @@
/**
* @package Grav\Common\File
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\File;
use Exception;
use Grav\Common\Debugger;
use Grav\Common\Grav;
use Grav\Common\Utils;
use RocketTheme\Toolbox\File\PhpFile;
use RuntimeException;
use Throwable;
@@ -31,9 +34,10 @@ trait CompiledFile
public function content($var = null)
{
try {
$filename = $this->filename;
// If nothing has been loaded, attempt to get pre-compiled version of the file first.
if ($var === null && $this->raw === null && $this->content === null) {
$key = md5($this->filename);
$key = md5($filename);
$file = PhpFile::instance(CACHE_DIR . "compiled/files/{$key}{$this->extension}.php");
$modified = $this->modified();
@@ -47,39 +51,49 @@ trait CompiledFile
$class = get_class($this);
$size = filesize($filename);
$cache = $file->exists() ? $file->content() : null;
// Load real file if cache isn't up to date (or is invalid).
if (!isset($cache['@class'])
|| $cache['@class'] !== $class
|| $cache['modified'] !== $modified
|| $cache['filename'] !== $this->filename
|| ($cache['size'] ?? null) !== $size
|| $cache['filename'] !== $filename
) {
// Attempt to lock the file for writing.
try {
$file->lock(false);
$locked = $file->lock(false);
} catch (Exception $e) {
// Another process has locked the file; we will check this in a bit.
$locked = false;
/** @var Debugger $debugger */
$debugger = Grav::instance()['debugger'];
$debugger->addMessage(sprintf('%s(): Cannot obtain a lock for compiling cache file for %s: %s', __METHOD__, $this->filename, $e->getMessage()), 'warning');
}
// Decode RAW file into compiled array.
$data = (array)$this->decode($this->raw());
$cache = [
'@class' => $class,
'filename' => $this->filename,
'filename' => $filename,
'modified' => $modified,
'size' => $size,
'data' => $data
];
// If compiled file wasn't already locked by another process, save it.
if ($file->locked() !== false) {
if ($locked) {
$file->save($cache);
$file->unlock();
// Compile cached file into bytecode cache
if (function_exists('opcache_invalidate')) {
if (function_exists('opcache_invalidate') && filter_var(ini_get('opcache.enable'), \FILTER_VALIDATE_BOOLEAN)) {
$lockName = $file->filename();
// Silence error if function exists, but is restricted.
@opcache_invalidate($file->filename(), true);
@opcache_invalidate($lockName, true);
@opcache_compile_file($lockName);
}
}
}
@@ -88,12 +102,71 @@ trait CompiledFile
$this->content = $cache['data'];
}
} catch (Exception $e) {
throw new RuntimeException(sprintf('Failed to read %s: %s', basename($this->filename), $e->getMessage()), 500, $e);
throw new RuntimeException(sprintf('Failed to read %s: %s', Utils::basename($filename), $e->getMessage()), 500, $e);
}
return parent::content($var);
}
/**
* Save file.
*
* @param mixed $data Optional data to be saved, usually array.
* @return void
* @throws RuntimeException
*/
public function save($data = null)
{
// Make sure that the cache file is always up to date!
$key = md5($this->filename);
$file = PhpFile::instance(CACHE_DIR . "compiled/files/{$key}{$this->extension}.php");
try {
$locked = $file->lock();
} catch (Exception $e) {
$locked = false;
/** @var Debugger $debugger */
$debugger = Grav::instance()['debugger'];
$debugger->addMessage(sprintf('%s(): Cannot obtain a lock for compiling cache file for %s: %s', __METHOD__, $this->filename, $e->getMessage()), 'warning');
}
parent::save($data);
if ($locked) {
$modified = $this->modified();
$filename = $this->filename;
$class = get_class($this);
$size = filesize($filename);
// windows doesn't play nicely with this as it can't read when locked
if (!Utils::isWindows()) {
// Reload data from the filesystem. This ensures that we always cache the correct data (see issue #2282).
$this->raw = $this->content = null;
$data = (array)$this->decode($this->raw());
}
// Decode data into compiled array.
$cache = [
'@class' => $class,
'filename' => $filename,
'modified' => $modified,
'size' => $size,
'data' => $data
];
$file->save($cache);
$file->unlock();
// Compile cached file into bytecode cache
if (function_exists('opcache_invalidate') && filter_var(ini_get('opcache.enable'), \FILTER_VALIDATE_BOOLEAN)) {
$lockName = $file->filename();
// Silence error if function exists, but is restricted.
@opcache_invalidate($lockName, true);
@opcache_compile_file($lockName);
}
}
}
/**
* Serialize file.
*

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\File
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\File
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\File
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Filesystem
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -62,7 +62,7 @@ abstract class Archiver
{
// Set infinite PHP execution time if possible.
if (Utils::functionExists('set_time_limit')) {
set_time_limit(0);
@set_time_limit(0);
}
$this->options = $options + $this->options;

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Filesystem
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -31,32 +31,34 @@ abstract class Folder
/**
* Recursively find the last modified time under given path.
*
* @param string $path
* @param array $paths
* @return int
*/
public static function lastModifiedFolder($path)
public static function lastModifiedFolder(array $paths): int
{
if (!file_exists($path)) {
return 0;
}
$last_modified = 0;
/** @var UniformResourceLocator $locator */
$locator = Grav::instance()['locator'];
$flags = RecursiveDirectoryIterator::SKIP_DOTS;
if ($locator->isStream($path)) {
$directory = $locator->getRecursiveIterator($path, $flags);
} else {
$directory = new RecursiveDirectoryIterator($path, $flags);
}
$filter = new RecursiveFolderFilterIterator($directory);
$iterator = new RecursiveIteratorIterator($filter, RecursiveIteratorIterator::SELF_FIRST);
foreach ($iterator as $dir) {
$dir_modified = $dir->getMTime();
if ($dir_modified > $last_modified) {
$last_modified = $dir_modified;
foreach ($paths as $path) {
if (!file_exists($path)) {
return 0;
}
if ($locator->isStream($path)) {
$directory = $locator->getRecursiveIterator($path, $flags);
} else {
$directory = new RecursiveDirectoryIterator($path, $flags);
}
$filter = new RecursiveFolderFilterIterator($directory);
$iterator = new RecursiveIteratorIterator($filter, RecursiveIteratorIterator::SELF_FIRST);
foreach ($iterator as $dir) {
$dir_modified = $dir->getMTime();
if ($dir_modified > $last_modified) {
$last_modified = $dir_modified;
}
}
}
@@ -66,38 +68,40 @@ abstract class Folder
/**
* Recursively find the last modified time under given path by file.
*
* @param string $path
* @param array $paths
* @param string $extensions which files to search for specifically
* @return int
*/
public static function lastModifiedFile($path, $extensions = 'md|yaml')
public static function lastModifiedFile(array $paths, $extensions = 'md|yaml'): int
{
if (!file_exists($path)) {
return 0;
}
$last_modified = 0;
/** @var UniformResourceLocator $locator */
$locator = Grav::instance()['locator'];
$flags = RecursiveDirectoryIterator::SKIP_DOTS;
if ($locator->isStream($path)) {
$directory = $locator->getRecursiveIterator($path, $flags);
} else {
$directory = new RecursiveDirectoryIterator($path, $flags);
}
$recursive = new RecursiveIteratorIterator($directory, RecursiveIteratorIterator::SELF_FIRST);
$iterator = new RegexIterator($recursive, '/^.+\.'.$extensions.'$/i');
/** @var RecursiveDirectoryIterator $file */
foreach ($iterator as $filepath => $file) {
try {
$file_modified = $file->getMTime();
if ($file_modified > $last_modified) {
$last_modified = $file_modified;
foreach($paths as $path) {
if (!file_exists($path)) {
return 0;
}
if ($locator->isStream($path)) {
$directory = $locator->getRecursiveIterator($path, $flags);
} else {
$directory = new RecursiveDirectoryIterator($path, $flags);
}
$recursive = new RecursiveIteratorIterator($directory, RecursiveIteratorIterator::SELF_FIRST);
$iterator = new RegexIterator($recursive, '/^.+\.'.$extensions.'$/i');
/** @var RecursiveDirectoryIterator $file */
foreach ($iterator as $file) {
try {
$file_modified = $file->getMTime();
if ($file_modified > $last_modified) {
$last_modified = $file_modified;
}
} catch (Exception $e) {
Grav::instance()['log']->error('Could not process file: ' . $e->getMessage());
}
} catch (Exception $e) {
Grav::instance()['log']->error('Could not process file: ' . $e->getMessage());
}
}
@@ -107,28 +111,30 @@ abstract class Folder
/**
* Recursively md5 hash all files in a path
*
* @param string $path
* @param array $paths
* @return string
*/
public static function hashAllFiles($path)
public static function hashAllFiles(array $paths): string
{
$files = [];
if (file_exists($path)) {
$flags = RecursiveDirectoryIterator::SKIP_DOTS;
foreach ($paths as $path) {
if (file_exists($path)) {
$flags = RecursiveDirectoryIterator::SKIP_DOTS;
/** @var UniformResourceLocator $locator */
$locator = Grav::instance()['locator'];
if ($locator->isStream($path)) {
$directory = $locator->getRecursiveIterator($path, $flags);
} else {
$directory = new RecursiveDirectoryIterator($path, $flags);
}
/** @var UniformResourceLocator $locator */
$locator = Grav::instance()['locator'];
if ($locator->isStream($path)) {
$directory = $locator->getRecursiveIterator($path, $flags);
} else {
$directory = new RecursiveDirectoryIterator($path, $flags);
}
$iterator = new RecursiveIteratorIterator($directory, RecursiveIteratorIterator::SELF_FIRST);
$iterator = new RecursiveIteratorIterator($directory, RecursiveIteratorIterator::SELF_FIRST);
foreach ($iterator as $file) {
$files[] = $file->getPathname() . '?'. $file->getMTime();
foreach ($iterator as $file) {
$files[] = $file->getPathname() . '?'. $file->getMTime();
}
}
}
@@ -197,7 +203,7 @@ abstract class Folder
* Shift first directory out of the path.
*
* @param string $path
* @return string
* @return string|null
*/
public static function shift(&$path)
{
@@ -371,6 +377,10 @@ abstract class Folder
return;
}
if (strpos($target, $source . '/') === 0) {
throw new RuntimeException('Cannot move folder to itself');
}
if (file_exists($target)) {
// Rename fails if target folder exists.
throw new RuntimeException('Cannot move files to existing folder/file.');
@@ -383,11 +393,7 @@ abstract class Folder
@rename($source, $target);
// Rename function can fail while still succeeding, so let's check if the folder exists.
if (!file_exists($target) || !is_dir($target)) {
// In some rare cases rename() creates file, not a folder. Get rid of it.
if (file_exists($target)) {
@unlink($target);
}
if (is_dir($source)) {
// Rename doesn't support moving folders across filesystems. Use copy instead.
self::copy($source, $target);
self::delete($source);
@@ -417,7 +423,8 @@ abstract class Folder
if (!$success) {
$error = error_get_last();
throw new RuntimeException($error['message']);
throw new RuntimeException($error['message'] ?? 'Unknown error');
}
// Make sure that the change will be detected when caching.
@@ -512,7 +519,7 @@ abstract class Folder
}
$directories = glob($directory . '/*', GLOB_ONLYDIR);
return count($directories);
return $directories ? count($directories) : false;
}
/**
@@ -529,7 +536,8 @@ abstract class Folder
}
// Go through all items in filesystem and recursively remove everything.
$files = array_diff(scandir($folder, SCANDIR_SORT_NONE), array('.', '..'));
$files = scandir($folder, SCANDIR_SORT_NONE);
$files = $files ? array_diff($files, ['.', '..']) : [];
foreach ($files as $file) {
$path = "{$folder}/{$file}";
is_dir($path) ? self::doDelete($path) : @unlink($path);

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Filesystem
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Filesystem
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/

View File

@@ -3,7 +3,7 @@
/**
* @package Grav\Common\Filesystem
*
* @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
* @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
@@ -57,7 +57,9 @@ class ZipArchiver extends Archiver
throw new InvalidArgumentException('ZipArchiver: Zip PHP module not installed...');
}
if (!file_exists($source)) {
// Get real path for our folder
$rootPath = realpath($source);
if (!$rootPath) {
throw new InvalidArgumentException('ZipArchiver: ' . $source . ' cannot be found...');
}
@@ -66,9 +68,6 @@ class ZipArchiver extends Archiver
throw new InvalidArgumentException('ZipArchiver:' . $this->archive_file . ' cannot be created...');
}
// Get real path for our folder
$rootPath = realpath($source);
$files = $this->getArchiveFiles($rootPath);
$status && $status([

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