Skip to content

Commit f27ac9f

Browse files
authored
Merge pull request #28 from cirrusidentity/bug/non-greedy-jessionid
Make jsession sanitize non-greedy
2 parents e3fba5e + bc09150 commit f27ac9f

3 files changed

Lines changed: 43 additions & 11 deletions

File tree

lib/Cas/TicketValidator.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,15 +97,17 @@ public function validateAndDeleteTicket($ticket, $service)
9797

9898

9999
/**
100-
* @param string $parameter
101-
* @return string
100+
* Java CAS clients are inconsistent with their sending of jsessionid, so remove it to
101+
* avoid service url matching issues.
102+
* @param string $parameter The service url to sanitize
103+
* @return string The sanitized url
102104
*/
103105
public static function sanitize($parameter)
104106
{
105107
return preg_replace(
106-
'/;jsessionid=.*[^?].*$/',
108+
'/;jsessionid=.*[^?].*$/U',
107109
'',
108-
preg_replace('/;jsessionid=.*[?]/', '?', urldecode($parameter))
110+
preg_replace('/;jsessionid=.*[?]/U', '?', urldecode($parameter))
109111
);
110112
}
111113
}

tests/lib/TicketValidatorTest.php

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,6 @@
1010
use SimpleSAML\Module\casserver\Cas\TicketValidator;
1111
use SimpleSAML\Utils\Random;
1212

13-
/**
14-
* Created by PhpStorm.
15-
* User: patrick
16-
* Date: 8/23/19
17-
* Time: 12:13 PM
18-
*/
1913
class TicketValidatorTest extends TestCase
2014
{
2115
/**
@@ -35,6 +29,8 @@ class TicketValidatorTest extends TestCase
3529
protected function setUp(): void
3630
{
3731
parent::setUp();
32+
Configuration::clearInternalState();
33+
putenv('SIMPLESAMLPHP_CONFIG_DIR=' . dirname(__DIR__) . '/config');
3834
$casConfig = Configuration::loadFromArray([
3935
'ticketstore' => [
4036
'class' => 'casserver:FileSystemTicketStore',
@@ -131,6 +127,39 @@ public function testExpiredTicket()
131127
$this->assertNull($this->ticketStore->getTicket($id), "ticket deleted after loading");
132128
}
133129

130+
/**
131+
* @dataProvider urlSanitizationProvider
132+
* @param string $serviceUrl The service url that will get sanitized
133+
* @param string $expectedSanitzedUrl The expected result
134+
* @return void
135+
*/
136+
public function testUrlSanitization(string $serviceUrl, string $expectedSanitzedUrl): void
137+
{
138+
$this->assertEquals($expectedSanitzedUrl, TicketValidator::sanitize($serviceUrl));
139+
}
140+
141+
/**
142+
* Urls to test
143+
* @return array
144+
*/
145+
public function urlSanitizationProvider()
146+
{
147+
return [
148+
[
149+
'https://example.edu/kc/portal.do;jsessionid=99AC064A12?a=b',
150+
'https://example.edu/kc/portal.do?a=b',
151+
],
152+
[
153+
'https://example.edu/kc/portal.do?a=b',
154+
'https://example.edu/kc/portal.do?a=b',
155+
],
156+
[
157+
'https://k.edu/kc/portal.do;jsessionid=99AC064A127?ct=Search&cu=https://k.edu/kc/as.do?ssf=456*&rsol=1',
158+
'https://k.edu/kc/portal.do?ct=Search&cu=https://k.edu/kc/as.do?ssf=456*&rsol=1',
159+
]
160+
];
161+
}
162+
134163

135164
/**
136165
* Create a ticket to use for testing

www/utility/urlUtils.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
use SimpleSAML\Configuration;
2525
use SimpleSAML\Module\casserver\Cas\ServiceValidator;
26+
use SimpleSAML\Module\casserver\Cas\TicketValidator;
2627

2728
/**
2829
* @deprecated
@@ -46,5 +47,5 @@ function checkServiceURL($service, array $legal_service_urls)
4647
*/
4748
function sanitize($parameter)
4849
{
49-
return preg_replace('/;jsessionid=.*[^?].*$/', '', preg_replace('/;jsessionid=.*[?]/', '?', urldecode($parameter)));
50+
return TicketValidator::sanitize($parameter);
5051
}

0 commit comments

Comments
 (0)