Skip to content

Commit b668742

Browse files
authored
Merge pull request #42 from IMSGlobal/samesite_cookies
Dual write cookies to support Chrome 80 samesite update
2 parents 1343c23 + e6ffb52 commit b668742

File tree

3 files changed

+47
-11
lines changed

3 files changed

+47
-11
lines changed

src/lti/Cache.php

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,45 @@
22
namespace IMSGlobal\LTI;
33

44
class Cache {
5+
6+
private $cache;
7+
58
public function get_launch_data($key) {
6-
return $_SESSION[$key];
9+
$this->load_cache();
10+
return $this->cache[$key];
711
}
812

913
public function cache_launch_data($key, $jwt_body) {
10-
$_SESSION[$key] = $jwt_body;
14+
$this->cache[$key] = $jwt_body;
15+
$this->save_cache();
1116
return $this;
1217
}
1318

1419
public function cache_nonce($nonce) {
15-
$_SESSION['nonce'][$nonce] = true;
20+
$this->cache['nonce'][$nonce] = true;
21+
$this->save_cache();
1622
return $this;
1723
}
1824

1925
public function check_nonce($nonce) {
20-
if (!isset($_SESSION['nonce'][$nonce])) {
26+
$this->load_cache();
27+
if (!isset($this->cache['nonce'][$nonce])) {
2128
return false;
2229
}
23-
unset($_SESSION['nonce'][$nonce]);
2430
return true;
2531
}
32+
33+
private function load_cache() {
34+
$cache = file_get_contents(sys_get_temp_dir() . '/lti_cache.txt');
35+
if (empty($cache)) {
36+
file_put_contents(sys_get_temp_dir() . '/lti_cache.txt', '{}');
37+
$this->cache = [];
38+
}
39+
$this->cache = json_decode($cache, true);
40+
}
41+
42+
private function save_cache() {
43+
file_put_contents(sys_get_temp_dir() . '/lti_cache.txt', json_encode($this->cache));
44+
}
2645
}
2746
?>

src/lti/Cookie.php

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,31 @@
33

44
class Cookie {
55
public function get_cookie($name) {
6-
if (!isset($_COOKIE[$name])) {
7-
return false;
6+
if (isset($_COOKIE[$name])) {
7+
return $_COOKIE[$name];
88
}
9-
return $_COOKIE[$name];
9+
// Look for backup cookie if same site is not supported by the user's browser.
10+
if (isset($_COOKIE["LEGACY_" . $name])) {
11+
return $_COOKIE["LEGACY_" . $name];
12+
}
13+
return false;
1014
}
1115

12-
public function set_cookie($name, $value, $exp = 3600) {
13-
setcookie($name, $value, time() + $exp);
16+
public function set_cookie($name, $value, $exp = 3600, $options = []) {
17+
$cookie_options = [
18+
'expires' => time() + $exp
19+
];
20+
21+
// SameSite none and secure will be required for tools to work inside iframes
22+
$same_site_options = [
23+
'samesite' => 'None',
24+
'secure' => true
25+
];
26+
27+
setcookie($name, $value, array_merge($cookie_options, $same_site_options, $options));
28+
29+
// Set a second fallback cookie in the event that "SameSite" is not supported
30+
setcookie("LEGACY_" . $name, $value, array_merge($cookie_options, $options));
1431
return $this;
1532
}
1633
}

src/lti/LTI_OIDC_Login.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public function do_oidc_login_redirect($launch_url, array $request = null) {
6262
// Generate State.
6363
// Set cookie (short lived)
6464
$state = str_replace('.', '_', uniqid('state-', true));
65-
$this->cookie->set_cookie("lti1p3_$state", $state);
65+
$this->cookie->set_cookie("lti1p3_$state", $state, 60);
6666

6767
// Generate Nonce.
6868
$nonce = uniqid('nonce-', true);

0 commit comments

Comments
 (0)