This commit is contained in:
Ouidade Soussi Chiadmi 2023-01-03 19:00:16 +01:00
parent c7262233b2
commit faaab9c4d3
473 changed files with 3719 additions and 1292 deletions

View File

@ -1,3 +1,94 @@
# 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 # v1.7.31
## 03/14/2022 ## 03/14/2022

View File

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

Binary file not shown.

View File

@ -2,7 +2,7 @@
<?php <?php
/** /**
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -2,7 +2,7 @@
<?php <?php
/** /**
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -2,7 +2,7 @@
<?php <?php
/** /**
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -19,6 +19,7 @@
"ext-zip": "*", "ext-zip": "*",
"ext-dom": "*", "ext-dom": "*",
"ext-libxml": "*", "ext-libxml": "*",
"ext-gd": "*",
"symfony/polyfill-mbstring": "~1.23", "symfony/polyfill-mbstring": "~1.23",
"symfony/polyfill-iconv": "^1.23", "symfony/polyfill-iconv": "^1.23",
"symfony/polyfill-php74": "^1.23", "symfony/polyfill-php74": "^1.23",
@ -64,7 +65,7 @@
}, },
"require-dev": { "require-dev": {
"codeception/codeception": "^4.1", "codeception/codeception": "^4.1",
"phpstan/phpstan": "^1.2", "phpstan/phpstan": "^1.8",
"phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-deprecation-rules": "^1.0",
"phpunit/php-code-coverage": "~9.2", "phpunit/php-code-coverage": "~9.2",
"getgrav/markdowndocs": "^2.0", "getgrav/markdowndocs": "^2.0",

1032
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav.Core * @package Grav.Core
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -1156,6 +1156,13 @@ form:
local6: local6 local6: local6
local7: local7 local7: local7
log.syslog.tag:
type: text
size: small
label: PLUGIN_ADMIN.SYSLOG_TAG
help: PLUGIN_ADMIN.SYSLOG_TAG_HELP
placeholder: "grav"
debugger: debugger:
type: tab type: tab
title: PLUGIN_ADMIN.DEBUGGER title: PLUGIN_ADMIN.DEBUGGER

View File

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

View File

@ -35,6 +35,7 @@ home:
pages: pages:
type: regular # EXPERIMENTAL: Page type: regular or flex 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) theme: quark # Default theme (defaults to "quark" theme)
order: order:
by: default # Order pages by "default", "alpha" or "date" by: default # Order pages by "default", "alpha" or "date"
@ -144,6 +145,7 @@ log:
handler: file # Log handler. Currently supported: file | syslog handler: file # Log handler. Currently supported: file | syslog
syslog: syslog:
facility: local6 # Syslog facilities output facility: local6 # Syslog facilities output
tag: grav # Syslog tag. Default: "grav".
debugger: debugger:
enabled: false # Enable Grav debugger and following settings enabled: false # Enable Grav debugger and following settings

View File

@ -3,13 +3,13 @@
/** /**
* @package Grav\Core * @package Grav\Core
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */
// Some standard defines // Some standard defines
define('GRAV', true); define('GRAV', true);
define('GRAV_VERSION', '1.7.31'); define('GRAV_VERSION', '1.7.38');
define('GRAV_SCHEMA', '1.7.0_2020-11-20_1'); define('GRAV_SCHEMA', '1.7.0_2020-11-20_1');
define('GRAV_TESTING', false); define('GRAV_TESTING', false);

View File

@ -2,7 +2,7 @@
/** /**
* @package Grav\Core * @package Grav\Core
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Core * @package Grav\Core
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common * @package Grav\Common
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Assets * @package Grav\Common\Assets
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Assets * @package Grav\Common\Assets
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Assets * @package Grav\Common\Assets
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Assets * @package Grav\Common\Assets
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Assets * @package Grav\Common\Assets
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Assets * @package Grav\Common\Assets
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Assets * @package Grav\Common\Assets
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Assets * @package Grav\Common\Assets
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Assets * @package Grav\Common\Assets
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Assets * @package Grav\Common\Assets
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Assets\Traits * @package Grav\Common\Assets\Traits
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Assets\Traits * @package Grav\Common\Assets\Traits
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Assets\Traits * @package Grav\Common\Assets\Traits
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Backup * @package Grav\Common\Backup
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common * @package Grav\Common
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common * @package Grav\Common
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common * @package Grav\Common
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Config * @package Grav\Common\Config
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Config * @package Grav\Common\Config
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Config * @package Grav\Common\Config
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Config * @package Grav\Common\Config
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Config * @package Grav\Common\Config
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Config * @package Grav\Common\Config
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Config * @package Grav\Common\Config
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Config * @package Grav\Common\Config
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */
@ -182,13 +182,14 @@ class Setup extends Data
// If no environment is set, make sure we get one (CLI or hostname). // If no environment is set, make sure we get one (CLI or hostname).
if (null === $environment) { if (null === $environment) {
if (defined('GRAV_CLI')) { if (defined('GRAV_CLI')) {
$request = null;
$uri = null;
$environment = 'cli'; $environment = 'cli';
} else { } else {
/** @var ServerRequestInterface $request */ /** @var ServerRequestInterface $request */
$request = $container['request']; $request = $container['request'];
$host = $request->getUri()->getHost(); $uri = $request->getUri();
$environment = $uri->getHost();
$environment = Utils::substrToString($host, ':');
} }
} }

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Data * @package Grav\Common\Data
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */
@ -515,7 +515,7 @@ class Blueprint extends BlueprintForm
$success = $this->resolveActions($user, $actions); $success = $this->resolveActions($user, $actions);
} }
if (!$success) { if (!$success) {
$this->addPropertyRecursive($field, 'validate', ['ignore' => true]); static::addPropertyRecursive($field, 'validate', ['ignore' => true]);
} }
} }
@ -566,7 +566,7 @@ class Blueprint extends BlueprintForm
} }
if ($matches) { if ($matches) {
$this->addPropertyRecursive($field, 'validate', ['ignore' => true]); static::addPropertyRecursive($field, 'validate', ['ignore' => true]);
return; return;
} }
} }
@ -577,7 +577,7 @@ class Blueprint extends BlueprintForm
* @param mixed $value * @param mixed $value
* @return void * @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])) { if (is_array($value) && isset($field[$property]) && is_array($field[$property])) {
$field[$property] = array_merge_recursive($field[$property], $value); $field[$property] = array_merge_recursive($field[$property], $value);
@ -587,7 +587,7 @@ class Blueprint extends BlueprintForm
if (!empty($field['fields'])) { if (!empty($field['fields'])) {
foreach ($field['fields'] as $key => &$child) { 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 * @package Grav\Common\Data
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Data * @package Grav\Common\Data
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Data * @package Grav\Common\Data
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Data * @package Grav\Common\Data
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Data * @package Grav\Common\Data
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */
@ -246,7 +246,9 @@ class Validation
return false; return false;
} }
$max = (int)($params['max'] ?? 0); $multiline = isset($params['multiline']) && $params['multiline'];
$max = (int)($params['max'] ?? ($multiline ? 65536 : 2048));
if ($max && $len > $max) { if ($max && $len > $max) {
return false; return false;
} }
@ -256,7 +258,7 @@ class Validation
return false; return false;
} }
if ((!isset($params['multiline']) || !$params['multiline']) && preg_match('/\R/um', $value)) { if (!$multiline && preg_match('/\R/um', $value)) {
return false; return false;
} }
@ -317,6 +319,10 @@ class Validation
*/ */
public static function typeCommaList($value, array $params, array $field) 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); return is_array($value) ? true : self::typeText($value, $params, $field);
} }
@ -379,6 +385,10 @@ class Validation
*/ */
public static function typePassword($value, array $params, array $field) public static function typePassword($value, array $params, array $field)
{ {
if (!isset($params['max'])) {
$params['max'] = 256;
}
return self::typeText($value, $params, $field); return self::typeText($value, $params, $field);
} }
@ -621,6 +631,10 @@ class Validation
*/ */
public static function typeEmail($value, array $params, array $field) public static function typeEmail($value, array $params, array $field)
{ {
if (!isset($params['max'])) {
$params['max'] = 320;
}
$values = !is_array($value) ? explode(',', preg_replace('/\s+/', '', $value)) : $value; $values = !is_array($value) ? explode(',', preg_replace('/\s+/', '', $value)) : $value;
foreach ($values as $val) { foreach ($values as $val) {
@ -642,6 +656,10 @@ class Validation
*/ */
public static function typeUrl($value, array $params, array $field) 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); return self::typeText($value, $params, $field) && filter_var($value, FILTER_VALIDATE_URL);
} }

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Data * @package Grav\Common\Data
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common * @package Grav\Common
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Errors * @package Grav\Common\Errors
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Errors * @package Grav\Common\Errors
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Errors * @package Grav\Common\Errors
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Errors * @package Grav\Common\Errors
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */
@ -43,4 +43,25 @@ class SystemFacade extends \Whoops\Util\SystemFacade
$handler(); $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,15 @@
/** /**
* @package Grav\Common\File * @package Grav\Common\File
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */
namespace Grav\Common\File; namespace Grav\Common\File;
use Exception; use Exception;
use Grav\Common\Debugger;
use Grav\Common\Grav;
use Grav\Common\Utils; use Grav\Common\Utils;
use RocketTheme\Toolbox\File\PhpFile; use RocketTheme\Toolbox\File\PhpFile;
use RuntimeException; use RuntimeException;
@ -32,9 +34,10 @@ trait CompiledFile
public function content($var = null) public function content($var = null)
{ {
try { try {
$filename = $this->filename;
// If nothing has been loaded, attempt to get pre-compiled version of the file first. // If nothing has been loaded, attempt to get pre-compiled version of the file first.
if ($var === null && $this->raw === null && $this->content === null) { 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"); $file = PhpFile::instance(CACHE_DIR . "compiled/files/{$key}{$this->extension}.php");
$modified = $this->modified(); $modified = $this->modified();
@ -48,39 +51,49 @@ trait CompiledFile
$class = get_class($this); $class = get_class($this);
$size = filesize($filename);
$cache = $file->exists() ? $file->content() : null; $cache = $file->exists() ? $file->content() : null;
// Load real file if cache isn't up to date (or is invalid). // Load real file if cache isn't up to date (or is invalid).
if (!isset($cache['@class']) if (!isset($cache['@class'])
|| $cache['@class'] !== $class || $cache['@class'] !== $class
|| $cache['modified'] !== $modified || $cache['modified'] !== $modified
|| $cache['filename'] !== $this->filename || ($cache['size'] ?? null) !== $size
|| $cache['filename'] !== $filename
) { ) {
// Attempt to lock the file for writing. // Attempt to lock the file for writing.
try { try {
$file->lock(false); $locked = $file->lock(false);
} catch (Exception $e) { } 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. // Decode RAW file into compiled array.
$data = (array)$this->decode($this->raw()); $data = (array)$this->decode($this->raw());
$cache = [ $cache = [
'@class' => $class, '@class' => $class,
'filename' => $this->filename, 'filename' => $filename,
'modified' => $modified, 'modified' => $modified,
'size' => $size,
'data' => $data 'data' => $data
]; ];
// If compiled file wasn't already locked by another process, save it. // If compiled file wasn't already locked by another process, save it.
if ($file->locked() !== false) { if ($locked) {
$file->save($cache); $file->save($cache);
$file->unlock(); $file->unlock();
// Compile cached file into bytecode cache // 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. // Silence error if function exists, but is restricted.
@opcache_invalidate($file->filename(), true); @opcache_invalidate($lockName, true);
@opcache_compile_file($lockName);
} }
} }
} }
@ -89,12 +102,71 @@ trait CompiledFile
$this->content = $cache['data']; $this->content = $cache['data'];
} }
} catch (Exception $e) { } catch (Exception $e) {
throw new RuntimeException(sprintf('Failed to read %s: %s', Utils::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); 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. * Serialize file.
* *

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\File * @package Grav\Common\File
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\File * @package Grav\Common\File
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\File * @package Grav\Common\File
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Filesystem * @package Grav\Common\Filesystem
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Filesystem * @package Grav\Common\Filesystem
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */
@ -31,32 +31,34 @@ abstract class Folder
/** /**
* Recursively find the last modified time under given path. * Recursively find the last modified time under given path.
* *
* @param string $path * @param array $paths
* @return int * @return int
*/ */
public static function lastModifiedFolder($path) public static function lastModifiedFolder(array $paths): int
{ {
if (!file_exists($path)) {
return 0;
}
$last_modified = 0; $last_modified = 0;
/** @var UniformResourceLocator $locator */ /** @var UniformResourceLocator $locator */
$locator = Grav::instance()['locator']; $locator = Grav::instance()['locator'];
$flags = RecursiveDirectoryIterator::SKIP_DOTS; $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) { foreach ($paths as $path) {
$dir_modified = $dir->getMTime(); if (!file_exists($path)) {
if ($dir_modified > $last_modified) { return 0;
$last_modified = $dir_modified; }
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. * 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 * @param string $extensions which files to search for specifically
* @return int * @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; $last_modified = 0;
/** @var UniformResourceLocator $locator */ /** @var UniformResourceLocator $locator */
$locator = Grav::instance()['locator']; $locator = Grav::instance()['locator'];
$flags = RecursiveDirectoryIterator::SKIP_DOTS; $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($paths as $path) {
foreach ($iterator as $filepath => $file) { if (!file_exists($path)) {
try { return 0;
$file_modified = $file->getMTime(); }
if ($file_modified > $last_modified) { if ($locator->isStream($path)) {
$last_modified = $file_modified; $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 * Recursively md5 hash all files in a path
* *
* @param string $path * @param array $paths
* @return string * @return string
*/ */
public static function hashAllFiles($path) public static function hashAllFiles(array $paths): string
{ {
$files = []; $files = [];
if (file_exists($path)) { foreach ($paths as $path) {
$flags = RecursiveDirectoryIterator::SKIP_DOTS; if (file_exists($path)) {
$flags = RecursiveDirectoryIterator::SKIP_DOTS;
/** @var UniformResourceLocator $locator */ /** @var UniformResourceLocator $locator */
$locator = Grav::instance()['locator']; $locator = Grav::instance()['locator'];
if ($locator->isStream($path)) { if ($locator->isStream($path)) {
$directory = $locator->getRecursiveIterator($path, $flags); $directory = $locator->getRecursiveIterator($path, $flags);
} else { } else {
$directory = new RecursiveDirectoryIterator($path, $flags); $directory = new RecursiveDirectoryIterator($path, $flags);
} }
$iterator = new RecursiveIteratorIterator($directory, RecursiveIteratorIterator::SELF_FIRST); $iterator = new RecursiveIteratorIterator($directory, RecursiveIteratorIterator::SELF_FIRST);
foreach ($iterator as $file) { foreach ($iterator as $file) {
$files[] = $file->getPathname() . '?'. $file->getMTime(); $files[] = $file->getPathname() . '?'. $file->getMTime();
}
} }
} }

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Filesystem * @package Grav\Common\Filesystem
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Filesystem * @package Grav\Common\Filesystem
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Filesystem * @package Grav\Common\Filesystem
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */
@ -454,7 +454,7 @@ class PageIndex extends FlexPageIndex implements PageCollectionInterface
continue; continue;
} }
// Get the main key without template and langauge. // Get the main key without template and language.
[$main_key,] = explode('|', $entry['storage_key'] . '|', 2); [$main_key,] = explode('|', $entry['storage_key'] . '|', 2);
// Update storage key and language. // Update storage key and language.
@ -527,10 +527,7 @@ class PageIndex extends FlexPageIndex implements PageCollectionInterface
$language = $options['lang']; $language = $options['lang'];
$status = 'error'; $status = 'error';
$msg = null;
$response = []; $response = [];
$children = null;
$sub_route = null;
$extra = null; $extra = null;
// Handle leaf_route // Handle leaf_route
@ -610,12 +607,12 @@ class PageIndex extends FlexPageIndex implements PageCollectionInterface
$children = $page->children(); $children = $page->children();
/** @var PageIndex $children */ /** @var PageIndex $children */
$children = $children->getIndex(); $children = $children->getIndex();
$selectedChildren = $children->filterBy($filters, true); $selectedChildren = $children->filterBy($filters + ['language' => $language], true);
/** @var Header $header */ /** @var Header $header */
$header = $page->header(); $header = $page->header();
if (!$field && $header->get('admin.children_display_order') === 'collection' && ($orderby = $header->get('content.order.by'))) { if (!$field && $header->get('admin.children_display_order', 'collection') === 'collection' && ($orderby = $header->get('content.order.by'))) {
// Use custom sorting by page header. // Use custom sorting by page header.
$sortby = $orderby; $sortby = $orderby;
$order = $header->get('content.order.dir', $order); $order = $header->get('content.order.dir', $order);

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */
@ -242,6 +242,7 @@ class PageObject extends FlexPageObject
{ {
/** @var PageCollection $siblings */ /** @var PageCollection $siblings */
$siblings = $variables['siblings']; $siblings = $variables['siblings'];
/** @var PageObject $sibling */
foreach ($siblings as $sibling) { foreach ($siblings as $sibling) {
$sibling->save(false); $sibling->save(false);
} }
@ -585,38 +586,46 @@ class PageObject extends FlexPageObject
*/ */
public function filterBy(array $filters, bool $recursive = false): bool public function filterBy(array $filters, bool $recursive = false): bool
{ {
$language = $filters['language'] ?? null;
if (null !== $language) {
/** @var PageObject $test */
$test = $this->getTranslation($language) ?? $this;
} else {
$test = $this;
}
foreach ($filters as $key => $value) { foreach ($filters as $key => $value) {
switch ($key) { switch ($key) {
case 'search': case 'search':
$matches = $this->search((string)$value) > 0.0; $matches = $test->search((string)$value) > 0.0;
break; break;
case 'page_type': case 'page_type':
$types = $value ? explode(',', $value) : []; $types = $value ? explode(',', $value) : [];
$matches = in_array($this->template(), $types, true); $matches = in_array($test->template(), $types, true);
break; break;
case 'extension': case 'extension':
$matches = Utils::contains((string)$value, $this->extension()); $matches = Utils::contains((string)$value, $test->extension());
break; break;
case 'routable': case 'routable':
$matches = $this->isRoutable() === (bool)$value; $matches = $test->isRoutable() === (bool)$value;
break; break;
case 'published': case 'published':
$matches = $this->isPublished() === (bool)$value; $matches = $test->isPublished() === (bool)$value;
break; break;
case 'visible': case 'visible':
$matches = $this->isVisible() === (bool)$value; $matches = $test->isVisible() === (bool)$value;
break; break;
case 'module': case 'module':
$matches = $this->isModule() === (bool)$value; $matches = $test->isModule() === (bool)$value;
break; break;
case 'page': case 'page':
$matches = $this->isPage() === (bool)$value; $matches = $test->isPage() === (bool)$value;
break; break;
case 'folder': case 'folder':
$matches = $this->isPage() === !$value; $matches = $test->isPage() === !$value;
break; break;
case 'translated': case 'translated':
$matches = $this->hasTranslation() === (bool)$value; $matches = $test->hasTranslation() === (bool)$value;
break; break;
default: default:
$matches = true; $matches = true;

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */
@ -30,7 +30,7 @@ use function is_string;
*/ */
class UserIndex extends FlexIndex implements UserCollectionInterface class UserIndex extends FlexIndex implements UserCollectionInterface
{ {
public const VERSION = parent::VERSION . '.1'; public const VERSION = parent::VERSION . '.2';
/** /**
* @param FlexStorageInterface $storage * @param FlexStorageInterface $storage
@ -50,7 +50,7 @@ class UserIndex extends FlexIndex implements UserCollectionInterface
// return $index['index']; // return $index['index'];
//} //}
// Load up to date index. // Load up-to-date index.
$entries = parent::loadEntriesFromStorage($storage); $entries = parent::loadEntriesFromStorage($storage);
return static::updateIndexFile($storage, $index['index'], $entries, ['force_update' => $force]); return static::updateIndexFile($storage, $index['index'], $entries, ['force_update' => $force]);
@ -142,9 +142,11 @@ class UserIndex extends FlexIndex implements UserCollectionInterface
} elseif ($field === 'flex_key') { } elseif ($field === 'flex_key') {
$user = $this->withKeyField('flex_key')->get($query); $user = $this->withKeyField('flex_key')->get($query);
} elseif ($field === 'email') { } elseif ($field === 'email') {
$user = $this->withKeyField('email')->get($query); $email = mb_strtolower($query);
$user = $this->withKeyField('email')->get($email);
} elseif ($field === 'username') { } elseif ($field === 'username') {
$user = $this->get(static::filterUsername($query, $this->getFlexDirectory()->getStorage())); $username = static::filterUsername($query, $this->getFlexDirectory()->getStorage());
$user = $this->get($username);
} else { } else {
$user = $this->__call('find', [$query, $field]); $user = $this->__call('find', [$query, $field]);
} }

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
/** /**
* @package Grav\Common\Flex * @package Grav\Common\Flex
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */
@ -31,6 +31,7 @@ use Grav\Common\Flex\Types\UserGroups\UserGroupIndex;
use Grav\Common\User\Interfaces\UserInterface; use Grav\Common\User\Interfaces\UserInterface;
use Grav\Common\User\Traits\UserTrait; use Grav\Common\User\Traits\UserTrait;
use Grav\Common\Utils; use Grav\Common\Utils;
use Grav\Framework\Contracts\Relationships\ToOneRelationshipInterface;
use Grav\Framework\File\Formatter\JsonFormatter; use Grav\Framework\File\Formatter\JsonFormatter;
use Grav\Framework\File\Formatter\YamlFormatter; use Grav\Framework\File\Formatter\YamlFormatter;
use Grav\Framework\Filesystem\Filesystem; use Grav\Framework\Filesystem\Filesystem;
@ -38,7 +39,10 @@ use Grav\Framework\Flex\Flex;
use Grav\Framework\Flex\FlexDirectory; use Grav\Framework\Flex\FlexDirectory;
use Grav\Framework\Flex\Storage\FileStorage; use Grav\Framework\Flex\Storage\FileStorage;
use Grav\Framework\Flex\Traits\FlexMediaTrait; use Grav\Framework\Flex\Traits\FlexMediaTrait;
use Grav\Framework\Flex\Traits\FlexRelationshipsTrait;
use Grav\Framework\Form\FormFlashFile; use Grav\Framework\Form\FormFlashFile;
use Grav\Framework\Media\MediaIdentifier;
use Grav\Framework\Media\UploadedMediaObject;
use Psr\Http\Message\UploadedFileInterface; use Psr\Http\Message\UploadedFileInterface;
use RocketTheme\Toolbox\Event\Event; use RocketTheme\Toolbox\Event\Event;
use RocketTheme\Toolbox\File\FileInterface; use RocketTheme\Toolbox\File\FileInterface;
@ -77,6 +81,7 @@ class UserObject extends FlexObject implements UserInterface, Countable
} }
use UserTrait; use UserTrait;
use UserObjectLegacyTrait; use UserObjectLegacyTrait;
use FlexRelationshipsTrait;
/** @var Closure|null */ /** @var Closure|null */
static public $authorizeCallable; static public $authorizeCallable;
@ -672,6 +677,81 @@ class UserObject extends FlexObject implements UserInterface, Countable
return $folder; return $folder;
} }
/**
* @param string $name
* @return array|object|null
* @internal
*/
public function initRelationship(string $name)
{
switch ($name) {
case 'media':
$list = [];
foreach ($this->getMedia()->all() as $filename => $object) {
$list[] = $this->buildMediaObject(null, $filename, $object);
}
return $list;
case 'avatar':
return $this->buildMediaObject('avatar', basename($this->getAvatarUrl()), $this->getAvatarImage());
}
throw new \InvalidArgumentException(sprintf('%s: Relationship %s does not exist', $this->getFlexType(), $name));
}
/**
* @return bool Return true if relationships were updated.
*/
protected function updateRelationships(): bool
{
$modified = $this->getRelationships()->getModified();
if ($modified) {
foreach ($modified as $relationship) {
$name = $relationship->getName();
switch ($name) {
case 'avatar':
\assert($relationship instanceof ToOneRelationshipInterface);
$this->updateAvatarRelationship($relationship);
break;
default:
throw new \InvalidArgumentException(sprintf('%s: Relationship %s cannot be modified', $this->getFlexType(), $name), 400);
}
}
$this->resetRelationships();
return true;
}
return false;
}
/**
* @param ToOneRelationshipInterface $relationship
*/
protected function updateAvatarRelationship(ToOneRelationshipInterface $relationship): void
{
$files = [];
$avatar = $this->getAvatarImage();
if ($avatar) {
$files['avatar'][$avatar->filename] = null;
}
$identifier = $relationship->getIdentifier();
if ($identifier) {
\assert($identifier instanceof MediaIdentifier);
$object = $identifier->getObject();
if ($object instanceof UploadedMediaObject) {
$uploadedFile = $object->getUploadedFile();
if ($uploadedFile) {
$files['avatar'][$uploadedFile->getClientFilename()] = $uploadedFile;
}
}
}
$this->update([], $files);
}
/** /**
* @param string $name * @param string $name
* @return Blueprint * @return Blueprint

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\Form * @package Grav\Common\Form
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\GPM * @package Grav\Common\GPM
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\GPM * @package Grav\Common\GPM
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\GPM * @package Grav\Common\GPM
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\GPM * @package Grav\Common\GPM
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\GPM * @package Grav\Common\GPM
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */
@ -12,6 +12,7 @@ namespace Grav\Common\GPM;
use Exception; use Exception;
use Grav\Common\Grav; use Grav\Common\Grav;
use Grav\Common\Filesystem\Folder; use Grav\Common\Filesystem\Folder;
use Grav\Common\HTTP\Response;
use Grav\Common\Inflector; use Grav\Common\Inflector;
use Grav\Common\Iterator; use Grav\Common\Iterator;
use Grav\Common\Utils; use Grav\Common\Utils;

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\GPM * @package Grav\Common\GPM
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\GPM * @package Grav\Common\GPM
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\GPM * @package Grav\Common\GPM
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

View File

@ -3,7 +3,7 @@
/** /**
* @package Grav\Common\GPM * @package Grav\Common\GPM
* *
* @copyright Copyright (c) 2015 - 2022 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. * @license MIT License; see LICENSE file for details.
*/ */

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