From 40fe496eda529fd1d933b56a1022ec32d3cd0b12 Mon Sep 17 00:00:00 2001 From: ErickSkrauch Date: Wed, 24 Jul 2024 23:54:09 +0200 Subject: [PATCH 1/7] Fix regression introduced in `GHSA-cjcc-p67m-7qxm` while attaching behavior defined by `__class` array key --- framework/CHANGELOG.md | 3 +-- framework/base/Component.php | 2 +- tests/framework/base/ComponentTest.php | 3 +++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 96f41456dcc..0185dbb7835 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,8 +4,7 @@ Yii Framework 2 Change Log 2.0.52 under development ------------------------ -- no changes in this release. - +- Bug #20232: Fix regression introduced in `GHSA-cjcc-p67m-7qxm` while attaching behavior defined by `__class` array key (erickskrauch) 2.0.51 July 18, 2024 -------------------- diff --git a/framework/base/Component.php b/framework/base/Component.php index 2ad62f3259a..7cee3b0720d 100644 --- a/framework/base/Component.php +++ b/framework/base/Component.php @@ -190,7 +190,7 @@ public function __set($name, $value) $name = trim(substr($name, 3)); if ($value instanceof Behavior) { $this->attachBehavior($name, $value); - } elseif (isset($value['class']) && is_subclass_of($value['class'], Behavior::class, true)) { + } elseif ((isset($value['class']) && is_subclass_of($value['class'], Behavior::class)) || (isset($value['__class']) && is_subclass_of($value['__class'], Behavior::class))) { $this->attachBehavior($name, Yii::createObject($value)); } elseif (is_string($value) && is_subclass_of($value, Behavior::class, true)) { $this->attachBehavior($name, Yii::createObject($value)); diff --git a/tests/framework/base/ComponentTest.php b/tests/framework/base/ComponentTest.php index f01d21476f3..dca3c37bd91 100644 --- a/tests/framework/base/ComponentTest.php +++ b/tests/framework/base/ComponentTest.php @@ -341,6 +341,9 @@ public function testAttachBehavior() $this->assertTrue($component->hasProperty('p')); $component->test(); $this->assertTrue($component->behaviorCalled); + + $component->{'as c'} = ['__class' => NewBehavior::class]; + $this->assertNotNull($component->getBehavior('c')); } public function testAttachBehaviors() From 4b75427011376ebf7de93a11c366835fe464338e Mon Sep 17 00:00:00 2001 From: ErickSkrauch Date: Wed, 14 Aug 2024 16:49:26 +0200 Subject: [PATCH 2/7] Fix regression of regression introduced in `GHSA-cjcc-p67m-7qxm` and #20232 --- framework/base/Component.php | 4 ++- tests/framework/base/ComponentTest.php | 36 ++++++++++++++++++++++---- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/framework/base/Component.php b/framework/base/Component.php index 7cee3b0720d..7838f4b1da2 100644 --- a/framework/base/Component.php +++ b/framework/base/Component.php @@ -190,7 +190,9 @@ public function __set($name, $value) $name = trim(substr($name, 3)); if ($value instanceof Behavior) { $this->attachBehavior($name, $value); - } elseif ((isset($value['class']) && is_subclass_of($value['class'], Behavior::class)) || (isset($value['__class']) && is_subclass_of($value['__class'], Behavior::class))) { + } elseif (isset($value['__class']) && is_subclass_of($value['__class'], Behavior::class)) { + $this->attachBehavior($name, Yii::createObject($value)); + } elseif (!isset($value['__class']) && isset($value['class']) && is_subclass_of($value['class'], Behavior::class)) { $this->attachBehavior($name, Yii::createObject($value)); } elseif (is_string($value) && is_subclass_of($value, Behavior::class, true)) { $this->attachBehavior($name, Yii::createObject($value)); diff --git a/tests/framework/base/ComponentTest.php b/tests/framework/base/ComponentTest.php index dca3c37bd91..d16671a5fa1 100644 --- a/tests/framework/base/ComponentTest.php +++ b/tests/framework/base/ComponentTest.php @@ -10,6 +10,8 @@ use yii\base\Behavior; use yii\base\Component; use yii\base\Event; +use yii\base\InvalidConfigException; +use yii\base\UnknownMethodException; use yiiunit\TestCase; function globalEventHandler($event) @@ -331,19 +333,39 @@ public function testAttachBehavior() $this->assertSame($behavior, $component->detachBehavior('a')); $this->assertFalse($component->hasProperty('p')); - $this->expectException('yii\base\UnknownMethodException'); - $component->test(); + try { + $component->test(); + $this->fail('Expected exception ' . UnknownMethodException::class . " wasn't thrown"); + } catch (UnknownMethodException $e) { + // Expected + } - $p = 'as b'; $component = new NewComponent(); - $component->$p = ['class' => 'NewBehavior']; - $this->assertSame($behavior, $component->getBehavior('a')); + $component->{'as b'} = ['class' => NewBehavior::class]; + $this->assertInstanceOf(NewBehavior::class, $component->getBehavior('b')); $this->assertTrue($component->hasProperty('p')); $component->test(); $this->assertTrue($component->behaviorCalled); $component->{'as c'} = ['__class' => NewBehavior::class]; $this->assertNotNull($component->getBehavior('c')); + + $component->{'as d'} = [ + '__class' => NewBehavior2::class, + 'class' => NewBehavior::class, + ]; + $this->assertInstanceOf(NewBehavior2::class, $component->getBehavior('d')); + + // CVE-2024-4990 + try { + $component->{'as e'} = [ + '__class' => 'NotExistsBehavior', + 'class' => NewBehavior::class, + ]; + $this->fail('Expected exception ' . InvalidConfigException::class . " wasn't thrown"); + } catch (InvalidConfigException $e) { + $this->assertSame('Class is not of type yii\base\Behavior or its subclasses', $e->getMessage()); + } } public function testAttachBehaviors() @@ -546,6 +568,10 @@ public function test() } } +class NewBehavior2 extends Behavior +{ +} + class NewComponent2 extends Component { public $a; From 964fe576250fa9d66db0699a81e7c3911b23ce12 Mon Sep 17 00:00:00 2001 From: Yura Date: Sat, 31 Aug 2024 17:39:14 +0600 Subject: [PATCH 3/7] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BD=D0=B0=20=D1=80?= =?UTF-8?q?=D1=83=D1=81=D1=81=D0=BA=D0=BE=D0=BC=20=D1=8F=D0=B7=D1=8B=D0=BA?= =?UTF-8?q?=D0=B5=20(#20249)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/guide-ru/concept-behaviors.md | 4 ++-- docs/guide-ru/helper-array.md | 7 ++++--- docs/guide-ru/helper-overview.md | 4 ++-- docs/guide-ru/input-file-upload.md | 2 +- docs/guide-ru/tutorial-i18n.md | 6 +++--- 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/docs/guide-ru/concept-behaviors.md b/docs/guide-ru/concept-behaviors.md index 966a871a7ca..9922c3e3f5d 100644 --- a/docs/guide-ru/concept-behaviors.md +++ b/docs/guide-ru/concept-behaviors.md @@ -327,8 +327,8 @@ $user->touch('login_time'); сторонние: - [[yii\behaviors\BlameableBehavior]] - автоматически заполняет указанные атрибуты ID текущего пользователя. -- [[yii\behaviors\SluggableBehavior]] - автоматически заполняет указанные атрибут пригодным для URL текстом, получаемым - из другого атрибута. +- [[yii\behaviors\SluggableBehavior]] - автоматически заполняет указанный атрибут пригодным для URL текстом, получаемым + из 1 или нескольких других атрибутов. - [[yii\behaviors\AttributeBehavior]] - автоматически задаёт указанное значение одному или нескольким атрибутам ActiveRecord при срабатывании определённых событий. - [yii2tech\ar\softdelete\SoftDeleteBehavior](https://github.com/yii2tech/ar-softdelete) - предоставляет методы для diff --git a/docs/guide-ru/helper-array.md b/docs/guide-ru/helper-array.md index e0219c637a2..92dcdf558b8 100644 --- a/docs/guide-ru/helper-array.md +++ b/docs/guide-ru/helper-array.md @@ -5,7 +5,7 @@ ArrayHelper ## Получение значений -Извлечение значений из массива, объекта или структуры состоящей из них обоих с помощью стандартных средств PHP является довольно скучным занятием. Сначала вам нужно проверить есть ли соответствующий ключ с помощью `isset`, и если есть – получить, если нет – подставить значение по умолчанию. +Извлечение значений из массива, объекта или структуры состоящей из них обоих с помощью стандартных средств PHP является довольно скучным занятием. Сначала вам нужно проверить, есть ли соответствующий ключ с помощью `isset`, и если есть – получить, если нет – подставить значение по умолчанию. ```php class User @@ -152,9 +152,10 @@ $result = ArrayHelper::getColumn($array, function ($element) { ## Переиндексация массивов -Чтобы проиндексировать массив в соответствии с определенным ключом, используется метод `index` . Входящий массив должен +Чтобы проиндексировать массив в соответствии с определенным ключом, используется метод `index`. Входящий массив должен быть многомерным или массивом объектов. Ключом может быть имя ключа вложенного массива, имя свойства объекта или -анонимная функция, которая будет возвращать значение ключа по переданному массиву. +анонимная функция, которая будет возвращать значение ключа по переданному элементу индексируемого массива (то есть по +вложенному массиву или объекту). Если значение ключа равно `null`, то соответствующий элемент массива будет опущен и не попадет в результат. diff --git a/docs/guide-ru/helper-overview.md b/docs/guide-ru/helper-overview.md index bb2a2894b4e..97456eab015 100644 --- a/docs/guide-ru/helper-overview.md +++ b/docs/guide-ru/helper-overview.md @@ -3,8 +3,8 @@ > Note: Этот раздел находиться в стадии разработки. -Yii предоставляет много классов, которые помогают упростить общие задачи программирования, такие как манипуляция со строками или массивами, генерация HTML-кода, и так далее. Все helper-классы организованы в рамках пространства имен `yii\helpers` и являются статическими методами - (это означает, что они содержат в себе только статические свойства и методы и объекты статического класса создать нельзя). +Yii предоставляет много классов, которые помогают упростить общие задачи программирования, такие как манипуляция со строками или массивами, генерация HTML-кода, и так далее. Все helper-классы организованы в рамках пространства имен `yii\helpers` и являются статическими классами + (это означает, что они содержат в себе только статические свойства и методы, и объекты статического класса создать нельзя). Вы можете использовать helper-класс с помощью вызова одного из статических методов, как показано ниже: diff --git a/docs/guide-ru/input-file-upload.md b/docs/guide-ru/input-file-upload.md index 5dd78ee8aad..194ca6d1be9 100644 --- a/docs/guide-ru/input-file-upload.md +++ b/docs/guide-ru/input-file-upload.md @@ -74,7 +74,7 @@ use yii\widgets\ActiveForm; ``` -Важно помнить, что для корректной загрузки файла, необходим параметр формы `enctype`. Метод `fileInput()` +Важно помнить, что для корректной загрузки файла необходим параметр формы `enctype`. Метод `fileInput()` выведет тег ``, позволяющий пользователю выбрать файл для загрузки. > Tip: начиная с версии 2.0.8, [[yii\widgets\ActiveField::fileInput|fileInput]] автоматически добавляет diff --git a/docs/guide-ru/tutorial-i18n.md b/docs/guide-ru/tutorial-i18n.md index 44f233ff19d..695a6a5ca44 100644 --- a/docs/guide-ru/tutorial-i18n.md +++ b/docs/guide-ru/tutorial-i18n.md @@ -506,9 +506,9 @@ class TranslationEventHandler Откройте созданный файл и настройте параметры в соответствии со своими потребностями. Уделите особое внимание следующим параметрам: * `languages`: массив, содержащий языки, на которые ваше приложение должно быть переведено; -* `messagePath`: путь для хранений файлов сообщений, который должен соответствовать параметру `basePath`, указанному в конфигурации компонента`i18n`. +* `messagePath`: путь для хранения файлов сообщений, который должен соответствовать параметру `basePath`, указанному в конфигурации компонента `i18n`. -Вы также можете использовать команду './yii message/config', чтобы динамически сгенерировать конфигурационный файл с указанными опциями с помощью командной строки. +Вы также можете использовать команду `./yii message/config`, чтобы динамически сгенерировать конфигурационный файл с указанными опциями с помощью командной строки. Например, вы можете установить параметры `languages` и `messagePath` следующим образом: ```bash @@ -529,7 +529,7 @@ class TranslationEventHandler Также вы можете использовать параметры, чтобы динамически менять настройки извлечения. -В результате вы найдете свой файлы (если вы выбрали перевод с помощью файлов) в своей директории `messagePath`. +В результате вы найдете свои файлы (если вы выбрали перевод с помощью файлов) в своей директории `messagePath`. Представления From 26756a7e0f6ca35e461004d2bef491fdab322931 Mon Sep 17 00:00:00 2001 From: ambrozt Date: Thu, 19 Sep 2024 22:02:05 +0200 Subject: [PATCH 4/7] Add support for dropping views in MSSQL server when running migrate/fresh --- framework/CHANGELOG.md | 1 + framework/console/controllers/MigrateController.php | 1 + 2 files changed, 2 insertions(+) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 55f9605adfc..0109780b150 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -7,6 +7,7 @@ Yii Framework 2 Change Log - Bug #20232: Fix regression introduced in `GHSA-cjcc-p67m-7qxm` while attaching behavior defined by `__class` array key (erickskrauch) - Bug #20231: Fix regression introduced in #20167 in `yii\validators\FileValidator` (bizley) - Enh #20247: Support for variadic console controller action methods (brandonkelly) +- Enh #20256: Added missing MSSQL condition in `yii\console\controllers\MigrateController` isViewRelated function (ambrozt) 2.0.51 July 18, 2024 -------------------- diff --git a/framework/console/controllers/MigrateController.php b/framework/console/controllers/MigrateController.php index 315440f3bb5..104c6865749 100644 --- a/framework/console/controllers/MigrateController.php +++ b/framework/console/controllers/MigrateController.php @@ -333,6 +333,7 @@ private function isViewRelated($errorMessage) $dropViewErrors = [ 'DROP VIEW to delete view', // SQLite 'SQLSTATE[42S02]', // MySQL + 'is a view. Use DROP VIEW', // Microsoft SQL Server ]; foreach ($dropViewErrors as $dropViewError) { From e69746b2b18bd9c7993efaeae71a362d593bc01c Mon Sep 17 00:00:00 2001 From: "Stefano D. Mtangoo" Date: Sat, 21 Sep 2024 12:05:44 +0300 Subject: [PATCH 5/7] correct CHANGELOG.md to reflect better changes in commit Co-authored-by: Alexander Makarov --- framework/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 0109780b150..80a0547e494 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -7,7 +7,7 @@ Yii Framework 2 Change Log - Bug #20232: Fix regression introduced in `GHSA-cjcc-p67m-7qxm` while attaching behavior defined by `__class` array key (erickskrauch) - Bug #20231: Fix regression introduced in #20167 in `yii\validators\FileValidator` (bizley) - Enh #20247: Support for variadic console controller action methods (brandonkelly) -- Enh #20256: Added missing MSSQL condition in `yii\console\controllers\MigrateController` isViewRelated function (ambrozt) +- Bug #20256: Add support for dropping views in MSSQL server when running migrate/fresh (ambrozt) 2.0.51 July 18, 2024 -------------------- From 64af4fd7d6a043c00a781d86b14019fc8e208914 Mon Sep 17 00:00:00 2001 From: Haru SaKura <60030937+harusakura924@users.noreply.github.com> Date: Mon, 23 Sep 2024 01:34:52 +0000 Subject: [PATCH 6/7] Translate Yii2 Unique Validation Error Message to zh-TW --- framework/messages/zh-TW/yii.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/messages/zh-TW/yii.php b/framework/messages/zh-TW/yii.php index ff206fe66e9..a4bce99f28e 100644 --- a/framework/messages/zh-TW/yii.php +++ b/framework/messages/zh-TW/yii.php @@ -24,7 +24,7 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ - ' and ' => '', + ' and ' => ' 和 ', '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(未設定)', 'Action not found.' => '', @@ -51,7 +51,7 @@ 'Please fix the following errors:' => '請修正以下錯誤:', 'Please upload a file.' => '請上傳一個檔案。', 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => '第 {begin, number}-{end, number} 項,共 {totalCount, number} 項資料.', - 'The combination {values} of {attributes} has already been taken.' => '', + 'The combination {values} of {attributes} has already been taken.' => '{attribute} 的值 "{value}" 已經被佔用了。', 'The file "{file}" is not an image.' => '檔案 "{file}" 不是一個圖片檔案。', 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => '檔案"{file}"太大了。它的大小不可以超過{formattedLimit}。', 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => '文件"{file}"太小了。它的大小不可以小於{formattedLimit}。', From dff9c269a2ab241b6073c1db3c2c95adab009bfa Mon Sep 17 00:00:00 2001 From: Haru SaKura <60030937+harusakura924@users.noreply.github.com> Date: Mon, 23 Sep 2024 02:01:05 +0000 Subject: [PATCH 7/7] =?UTF-8?q?Changing=20it=20to=20"=E8=88=87"=20is=20mor?= =?UTF-8?q?e=20formal.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- framework/messages/zh-TW/yii.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/messages/zh-TW/yii.php b/framework/messages/zh-TW/yii.php index a4bce99f28e..598b2b9de71 100644 --- a/framework/messages/zh-TW/yii.php +++ b/framework/messages/zh-TW/yii.php @@ -24,7 +24,7 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ - ' and ' => ' 和 ', + ' and ' => ' 與 ', '"{attribute}" does not support operator "{operator}".' => '', '(not set)' => '(未設定)', 'Action not found.' => '',