Skip to content

Commit bc21205

Browse files
committed
Safeguarding prefixes with dash patterns.
1 parent 53d2fa3 commit bc21205

File tree

3 files changed

+45
-33
lines changed

3 files changed

+45
-33
lines changed

src/ContextualAliasStorage.php

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ public function save($source, $alias, $langcode = LanguageInterface::LANGCODE_NO
9292

9393
$context = $this->getSourceContext($source);
9494

95-
if ($context && strpos($alias, '/' . $context . '/') === 0) {
96-
$alias = substr($alias, strlen($context) + 2);
95+
if ($context && strpos($alias, '/--' . $context . '--/') === 0) {
96+
$alias = substr($alias, strlen($context) + 6);
9797
}
9898

9999
$fields = [
@@ -179,7 +179,7 @@ public function load($conditions) {
179179
$select->orderBy('context', 'ASC');
180180
}
181181

182-
$select->addExpression("CASE WHEN context = '' OR context IS NULL THEN alias ELSE CONCAT('/', context, alias) END", 'alias');
182+
$select->addExpression("CASE WHEN context = '' OR context IS NULL THEN alias ELSE CONCAT('/--', context, '--', alias) END", 'alias');
183183
// ENDCHANGE
184184

185185
foreach ($conditions as $field => $value) {
@@ -193,11 +193,14 @@ public function load($conditions) {
193193
$aliasGroup = $select->orConditionGroup();
194194
$aliasGroup->condition($field, $this->connection->escapeLike($value), 'LIKE');
195195
$contextGroup = $aliasGroup->andConditionGroup();
196-
$tail = explode('/', $value);
197-
$head = array_shift($tail);
198-
$contextGroup
199-
->condition('context', $head)
200-
->condition('alias', $this->connection->escapeLike('/' . implode('/', $tail)), 'LIKE');
196+
if (substr($value, 0, 3) == '/--') {
197+
$tail = explode('/', $value);
198+
$head = substr(array_shift($tail), 2, -2);
199+
$contextGroup
200+
->condition('context', $head)
201+
->condition('alias', $this->connection->escapeLike('/' . implode('/', $tail)), 'LIKE');
202+
}
203+
$aliasGroup->condition($contextGroup);
201204
}
202205
else {
203206
$select->condition($field, $this->connection->escapeLike($value), 'LIKE');
@@ -251,7 +254,7 @@ public function preloadPathAlias($preloaded, $langcode) {
251254
$select->isNull('context');
252255
}
253256

254-
$select->addExpression("CASE WHEN context = '' OR context IS NULL THEN alias ELSE CONCAT('/', context, alias) END", 'alias');
257+
$select->addExpression("CASE WHEN context = '' OR context IS NULL THEN alias ELSE CONCAT('/--', context, '--', alias) END", 'alias');
255258
// ENDCHANGE
256259

257260
// Always get the language-specific alias before the language-neutral one.
@@ -317,7 +320,7 @@ public function lookupPathAlias($path, $langcode) {
317320
}
318321

319322
if ($context != $currentContext) {
320-
$select->addExpression("CASE WHEN context = '' OR context IS NULL THEN alias ELSE CONCAT('/', context, alias) END", 'alias');
323+
$select->addExpression("CASE WHEN context = '' OR context IS NULL THEN alias ELSE CONCAT('/--', context, '--', alias) END", 'alias');
321324
}
322325
else {
323326
$select->addField(static::TABLE, 'alias', 'alias');
@@ -353,24 +356,34 @@ public function lookupPathSource($path, $langcode) {
353356
$nonContextGroup->isNull('context');
354357
$aliasGroup->condition($nonContextGroup);
355358
$contextGroup = $aliasGroup->andConditionGroup();
356-
$tail = explode('/', ltrim($alias, '/'));
357-
$head = array_shift($tail);
358-
$contextGroup
359-
->condition('context', $head)
360-
->condition('alias', $this->connection->escapeLike('/' . implode('/', $tail)), 'LIKE');
361-
$aliasGroup->condition($contextGroup);
359+
$value = ltrim($alias, '/');
360+
361+
if (substr($value, 0, 2) == '--') {
362+
$tail = explode('/', $value);
363+
$head = substr(array_shift($tail), 2, -2);
364+
$contextGroup
365+
->condition('context', $head)
366+
->condition('alias', $this->connection->escapeLike('/' . implode('/', $tail)), 'LIKE');
367+
$aliasGroup->condition($contextGroup);
368+
}
369+
362370
$select->condition($aliasGroup);
363371
}
364372
else {
365-
$tail = explode('/', ltrim($alias, '/'));
366-
$head = array_shift($tail);
373+
$value = ltrim($alias, '/');
367374

368375
$aliasGroup = $select->orConditionGroup();
369-
$contextGroup = $aliasGroup->andConditionGroup();
376+
if (substr($value, 0, 2) == '--') {
377+
$tail = explode('/', $value);
378+
$head = substr(array_shift($tail), 2, -2);
379+
$contextGroup = $aliasGroup->andConditionGroup();
380+
381+
$contextGroup
382+
->condition('context', $head)
383+
->condition('alias', $this->connection->escapeLike('/' . implode('/', $tail)), 'LIKE');
384+
$aliasGroup->condition($contextGroup);
385+
}
370386

371-
$contextGroup
372-
->condition('context', $head)
373-
->condition('alias', $this->connection->escapeLike('/' . implode('/', $tail)), 'LIKE');
374387

375388
$nonContextGroup = $aliasGroup->andConditionGroup();
376389
$nonContextGroup->condition('alias', $this->connection->escapeLike($alias), 'LIKE');
@@ -380,7 +393,6 @@ public function lookupPathSource($path, $langcode) {
380393
$nullContextGroup->condition('alias', $this->connection->escapeLike($alias), 'LIKE');
381394
$nullContextGroup->isNull('context');
382395

383-
$aliasGroup->condition($contextGroup);
384396
$aliasGroup->condition($nonContextGroup);
385397
$aliasGroup->condition($nullContextGroup);
386398
$select->condition($aliasGroup);

src/Entity/ContextualRedirect.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public function preSave(EntityStorageInterface $storage_controller) {
1616
$context = isset($parsed['path']) ? $aliasStorage->getSourceContext($parsed['path']) : NULL;
1717
$this->set('context', $context);
1818
$this->set('hash', Redirect::generateHash(
19-
($context ? '/' . $context : '') . $this->redirect_source->path,
19+
($context ? '/--' . $context : '--') . $this->redirect_source->path,
2020
(array) $this->redirect_source->query,
2121
$this->language()->getId()
2222
));

tests/src/Kernel/ContextualAliasesTest.php

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,8 @@ public function testNoContextSimpleAlias() {
126126
public function testNoContextContextualAlias() {
127127
$this->resolver->getCurrentContext()->willReturn(NULL);
128128
$this->assertEquals('/A', $this->manager->getPathByAlias('/A'));
129-
$this->assertEquals('/a', $this->manager->getPathByAlias('/one/A'));
130-
$this->assertEquals('/one/A', $this->manager->getAliasByPath('/a'));
129+
$this->assertEquals('/a', $this->manager->getPathByAlias('/--one--/A'));
130+
$this->assertEquals('/--one--/A', $this->manager->getAliasByPath('/a'));
131131
}
132132

133133
/**
@@ -136,7 +136,7 @@ public function testNoContextContextualAlias() {
136136
public function testContextMatchingAlias() {
137137
$this->resolver->getCurrentContext()->willReturn('one');
138138
$this->assertEquals('/a', $this->manager->getPathByAlias('/A'));
139-
$this->assertEquals('/a', $this->manager->getPathByAlias('/one/A'));
139+
$this->assertEquals('/a', $this->manager->getPathByAlias('/--one--/A'));
140140
$this->assertEquals('/A', $this->manager->getAliasByPath('/a'));
141141
}
142142

@@ -146,8 +146,8 @@ public function testContextMatchingAlias() {
146146
public function testContextNotMatchingAlias() {
147147
$this->resolver->getCurrentContext()->willReturn('two');
148148
$this->assertEquals('/A', $this->manager->getPathByAlias('/A'));
149-
$this->assertEquals('/a', $this->manager->getPathByAlias('/one/A'));
150-
$this->assertEquals('/one/A', $this->manager->getAliasByPath('/a'));
149+
$this->assertEquals('/a', $this->manager->getPathByAlias('/--one--/A'));
150+
$this->assertEquals('/--one--/A', $this->manager->getAliasByPath('/a'));
151151
}
152152

153153
/**
@@ -177,13 +177,13 @@ public function testNonContextualConflictingAlias() {
177177
*/
178178
public function testContextualConflictingAlias() {
179179
$this->resolver->getCurrentContext()->willReturn(NULL);
180-
$this->assertEquals('/e', $this->manager->getPathByAlias('/two/one/E'));
181-
$this->assertEquals('/two/one/E', $this->manager->getAliasByPath('/e'));
180+
$this->assertEquals('/e', $this->manager->getPathByAlias('/--two--/one/E'));
181+
$this->assertEquals('/--two--/one/E', $this->manager->getAliasByPath('/e'));
182182

183183
$this->resolver->getCurrentContext()->willReturn('one');
184184
$this->assertEquals('/two/E', $this->manager->getPathByAlias('/two/E'));
185-
$this->assertEquals('/e', $this->manager->getPathByAlias('/two/one/E'));
186-
$this->assertEquals('/two/one/E', $this->manager->getAliasByPath('/e'));
185+
$this->assertEquals('/e', $this->manager->getPathByAlias('/--two--/one/E'));
186+
$this->assertEquals('/--two--/one/E', $this->manager->getAliasByPath('/e'));
187187

188188
$this->resolver->getCurrentContext()->willReturn('two');
189189
$this->assertEquals('/e', $this->manager->getPathByAlias('/one/E'));

0 commit comments

Comments
 (0)