From cbbe8b94dba9d79ee849af2ee76123949017422b Mon Sep 17 00:00:00 2001 From: Robbie Averill Date: Tue, 5 Feb 2019 16:50:21 +0300 Subject: [PATCH 1/3] FIX Multibyte URL encoding for blog profiles, and encoded params in functional tests --- src/Model/BlogController.php | 8 ++++++-- tests/BlogFunctionalTest.php | 6 +++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/Model/BlogController.php b/src/Model/BlogController.php index 60b11ea..fbff77c 100644 --- a/src/Model/BlogController.php +++ b/src/Model/BlogController.php @@ -106,12 +106,16 @@ class BlogController extends PageController public function getCurrentProfile() { $urlSegment = $this->request->param('URLSegment'); - if ($urlSegment) { $filter = URLSegmentFilter::create(); + // url encode unless it's multibyte (already pre-encoded in the database) + // see https://github.com/silverstripe/silverstripe-cms/pull/2384 + if (!$filter->getAllowMultibyte()) { + $urlSegment = rawurlencode($urlSegment); + } return Member::get() - ->filter('URLSegment', $filter->filter($urlSegment)) + ->filter('URLSegment', $urlSegment) ->first(); } diff --git a/tests/BlogFunctionalTest.php b/tests/BlogFunctionalTest.php index 71757bf..aae2ddb 100644 --- a/tests/BlogFunctionalTest.php +++ b/tests/BlogFunctionalTest.php @@ -23,14 +23,14 @@ class BlogFunctionalTest extends FunctionalTest public function testBlogWithMultibyteUrl() { - $result = $this->get('آبید'); + $result = $this->get(rawurlencode('آبید')); $this->assertEquals(200, $result->getStatusCode()); } public function testMemberProfileWithMultibyteUrlAndName() { - $result = $this->get('آبید/profile/عبّاس-آبان'); + $result = $this->get(rawurlencode('آبید') . '/profile/' . rawurlencode('عبّاس-آبان')); $this->assertEquals(200, $result->getStatusCode()); $this->assertContains('My Blog Post', $result->getBody()); @@ -38,7 +38,7 @@ class BlogFunctionalTest extends FunctionalTest public function testMemberProfileWithMultibyteUrlAndEnglishName() { - $result = $this->get('آبید/profile/bob-jones'); + $result = $this->get(rawurlencode('آبید') . '/profile/bob-jones'); $this->assertEquals(200, $result->getStatusCode()); $this->assertContains('My Blog Post', $result->getBody()); From 21772c3f86d6ce7a979040eca2514e0d28639aa9 Mon Sep 17 00:00:00 2001 From: Robbie Averill Date: Wed, 6 Feb 2019 23:36:05 +0300 Subject: [PATCH 2/3] Add PHP 7.3 and SS 4.3 to Travis builds --- .travis.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index ba042b1..5f6d71a 100755 --- a/.travis.yml +++ b/.travis.yml @@ -2,10 +2,6 @@ sudo: false language: php -env: - global: - - COMPOSER_ROOT_VERSION="4.0.x-dev" - matrix: include: - php: 5.6 @@ -15,6 +11,8 @@ matrix: - php: 7.1 env: DB=MYSQL INSTALLER_VERSION=4.2.x-dev PHPUNIT_COVERAGE_TEST=1 - php: 7.2 + env: DB=MYSQL INSTALLER_VERSION=4.3.x-dev PHPUNIT_TEST=1 + - php: 7.3 env: DB=MYSQL INSTALLER_VERSION=4.x-dev PHPUNIT_TEST=1 before_script: From d1ea6bb839de1f7c4c120f7b857374120ef46091 Mon Sep 17 00:00:00 2001 From: Robbie Averill Date: Thu, 7 Feb 2019 12:05:32 +0300 Subject: [PATCH 3/3] FIX Categories and tags now respect multibyte url configuration Previously multibyte URLs would always work, regardless of URLSegmentFilter::$default_allow_multibyte. This change means that they will only work when the setting is enabled. --- src/Model/Blog.php | 2 + src/Model/BlogController.php | 17 +++++++-- src/Model/BlogPost.php | 2 +- tests/Model/BlogControllerFunctionalTest.php | 39 ++++++++++++++++++++ tests/Model/BlogControllerFunctionalTest.yml | 29 +++++++++++++++ 5 files changed, 84 insertions(+), 5 deletions(-) create mode 100644 tests/Model/BlogControllerFunctionalTest.php create mode 100644 tests/Model/BlogControllerFunctionalTest.yml diff --git a/src/Model/Blog.php b/src/Model/Blog.php index 0ea3047..b091366 100644 --- a/src/Model/Blog.php +++ b/src/Model/Blog.php @@ -17,6 +17,8 @@ use SilverStripe\Forms\NumericField; use SilverStripe\ORM\DataList; use SilverStripe\ORM\DataObject; use SilverStripe\ORM\DB; +use SilverStripe\ORM\HasManyList; +use SilverStripe\ORM\ManyManyList; use SilverStripe\ORM\SS_List; use SilverStripe\ORM\UnsavedRelationList; use SilverStripe\Security\Group; diff --git a/src/Model/BlogController.php b/src/Model/BlogController.php index fbff77c..c36cb16 100644 --- a/src/Model/BlogController.php +++ b/src/Model/BlogController.php @@ -267,9 +267,14 @@ class BlogController extends PageController $tag = $this->request->param('Tag'); if ($tag) { $filter = URLSegmentFilter::create(); + // url encode unless it's multibyte (already pre-encoded in the database) + // see https://github.com/silverstripe/silverstripe-cms/pull/2384 + if (!$filter->getAllowMultibyte()) { + $tag = rawurlencode($tag); + } return $dataRecord->Tags() - ->filter('URLSegment', [$tag, $filter->filter($tag)]) + ->filter('URLSegment', $tag) ->first(); } return null; @@ -289,9 +294,8 @@ class BlogController extends PageController if ($this->isRSS()) { return $this->rssFeed($this->blogPosts, $category->getLink()); - } else { - return $this->render(); } + return $this->render(); } $this->httpError(404, 'Not Found'); @@ -313,9 +317,14 @@ class BlogController extends PageController $category = $this->request->param('Category'); if ($category) { $filter = URLSegmentFilter::create(); + // url encode unless it's multibyte (already pre-encoded in the database) + // see https://github.com/silverstripe/silverstripe-cms/pull/2384 + if (!$filter->getAllowMultibyte()) { + $category = rawurlencode($category); + } return $dataRecord->Categories() - ->filter('URLSegment', [$category, $filter->filter($category)]) + ->filter('URLSegment', $category) ->first(); } return null; diff --git a/src/Model/BlogPost.php b/src/Model/BlogPost.php index 59dd3b4..ad071d1 100644 --- a/src/Model/BlogPost.php +++ b/src/Model/BlogPost.php @@ -16,6 +16,7 @@ use SilverStripe\Forms\ToggleCompositeField; use SilverStripe\ORM\ArrayList; use SilverStripe\ORM\FieldType\DBDatetime; use SilverStripe\ORM\FieldType\DBHTMLText; +use SilverStripe\ORM\ManyManyList; use SilverStripe\ORM\SS_List; use SilverStripe\ORM\UnsavedRelationList; use SilverStripe\Security\Group; @@ -25,7 +26,6 @@ use SilverStripe\Security\Security; use SilverStripe\TagField\TagField; use SilverStripe\Versioned\Versioned; use SilverStripe\View\ArrayData; -use SilverStripe\View\Parsers\ShortcodeParser; use SilverStripe\View\Requirements; /** diff --git a/tests/Model/BlogControllerFunctionalTest.php b/tests/Model/BlogControllerFunctionalTest.php new file mode 100644 index 0000000..c188bcb --- /dev/null +++ b/tests/Model/BlogControllerFunctionalTest.php @@ -0,0 +1,39 @@ +set(URLSegmentFilter::class, 'default_allow_multibyte', true); + i18n::set_locale('fa_IR'); + + parent::setUp(); + } + + public function testGetCategoriesWithMultibyteUrl() + { + $result = $this->get('my-blog/category/' . rawurlencode('آبید')); + + $this->assertEquals(200, $result->getStatusCode()); + $this->assertContains('آبید', $result->getBody()); + } + + public function testGetTagsWithMultibyteUrl() + { + $result = $this->get('my-blog/tag/' . rawurlencode('برتراند')); + + $this->assertEquals(200, $result->getStatusCode()); + $this->assertContains('برتراند', $result->getBody()); + } +} diff --git a/tests/Model/BlogControllerFunctionalTest.yml b/tests/Model/BlogControllerFunctionalTest.yml new file mode 100644 index 0000000..c29c0e3 --- /dev/null +++ b/tests/Model/BlogControllerFunctionalTest.yml @@ -0,0 +1,29 @@ +SilverStripe\Blog\Model\BlogCategory: + category_a: + Title: آبید + URLSegment: آبید + +SilverStripe\Blog\Model\BlogTag: + tag_a: + Title: برتراند + URLSegment: برتراند + +SilverStripe\Blog\Model\Blog: + blog_a: + URLSegment: my-blog + Title: My Blog + Categories: + - =>SilverStripe\Blog\Model\BlogCategory.category_a + Tags: + - =>SilverStripe\Blog\Model\BlogTag.tag_a + +SilverStripe\Blog\Model\BlogPost: + blogpost_a: + Title: My Blog Post + URLSegment: آبیدآبید + PublishDate: 2017-08-01 00:00:00 + Parent: =>SilverStripe\Blog\Model\Blog.blog_a + Categories: + - =>SilverStripe\Blog\Model\BlogCategory.category_a + Tags: + - =>SilverStripe\Blog\Model\BlogTag.tag_a