diff --git a/CHANGELOG.md b/CHANGELOG.md index 31f55a9..1cb19a3 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Cookies Changelog +## 1.1.8 - 2017.01.23 +### Changed +* Fixed an issue with removing cookies +* Added try/catch so errors are logged instead of exceptions thrown + ## 1.1.7 - 2017.12.06 ### Changed * Updated to require craftcms/cms `^3.0.0-RC1` diff --git a/composer.json b/composer.json index 985224c..08f479a 100644 --- a/composer.json +++ b/composer.json @@ -2,7 +2,7 @@ "name": "nystudio107/craft3-cookies", "description": "A simple plugin for setting and getting cookies from within Craft CMS templates.", "type": "craft-plugin", - "version": "1.1.7", + "version": "1.1.8", "keywords": [ "craft", "cms", diff --git a/src/services/CookiesService.php b/src/services/CookiesService.php index 0bfee8c..90f0be4 100644 --- a/src/services/CookiesService.php +++ b/src/services/CookiesService.php @@ -12,6 +12,8 @@ use Craft; use craft\base\Component; +use yii\base\Exception; +use yii\base\InvalidConfigException; use yii\web\Cookie; /** @@ -44,13 +46,13 @@ public function set( $secure = false, $httpOnly = false ) { - $expire = (int)$expire; - // Make sure the cookie expiry is in the past if we're deleting the cookie - if ($value == "") { - $expire = (int)(time() - 3600); + if (empty($value)) { + Craft::$app->response->cookies->remove($name); + } else { + $expire = (int)$expire; + setcookie($name, $value, $expire, $path, $domain, $secure, $httpOnly); + $_COOKIE[$name] = $value; } - setcookie($name, $value, $expire, $path, $domain, $secure, $httpOnly); - $_COOKIE[$name] = $value; } /** @@ -64,8 +66,9 @@ public function get($name = "") { $result = ""; if (isset($_COOKIE[$name])) { - $result = $_COOKIE[$name]; + $result = $_COOKIE[$name]; } + return $result; } @@ -89,24 +92,36 @@ public function setSecure( $secure = false, $httpOnly = false ) { - if ($name == "") { - Craft::$app->request->cookies->delete($name); + if (empty($value)) { + Craft::$app->response->cookies->remove($name); } else { $expire = (int)$expire; - // Make sure the cookie expiry is in the past if we're deleting the cookie - if ($value == "") { - $expire = (int)(time() - 3600); - } - $cookie = new Cookie($name, ''); + $cookie = new Cookie(['name' => $name, 'value' => '']); + + try { + $cookie->value = Craft::$app->security->hashData(base64_encode(serialize($value))); + } catch (InvalidConfigException $e) { + Craft::error( + 'Error setting secure cookie: '.$e->getMessage(), + __METHOD__ + ); - $cookie->value = Craft::$app->security->hashData(base64_encode(serialize($value))); + return; + } catch (Exception $e) { + Craft::error( + 'Error setting secure cookie: '.$e->getMessage(), + __METHOD__ + ); + + return; + } $cookie->expire = $expire; $cookie->path = $path; $cookie->domain = $domain; $cookie->secure = $secure; $cookie->httpOnly = $httpOnly; - Craft::$app->request->cookies->add($cookie); + Craft::$app->response->cookies->add($cookie); } } @@ -121,12 +136,28 @@ public function getSecure($name = "") { $result = ""; $cookie = Craft::$app->request->cookies->get($name); + try { + $data = Craft::$app->security->validateData($cookie->value); + } catch (InvalidConfigException $e) { + Craft::error( + 'Error getting secure cookie: '.$e->getMessage(), + __METHOD__ + ); + $data = false; + } catch (Exception $e) { + Craft::error( + 'Error getting secure cookie: '.$e->getMessage(), + __METHOD__ + ); + $data = false; + } if ($cookie && !empty($cookie->value) - && ($data = Craft::$app->security->validateData($cookie->value)) !== false + && $data !== false ) { $result = @unserialize(base64_decode($data)); } + return $result; } }