From cf0a9c6d0cb0d2a7413d27b0e0cf6c0fe7ce1619 Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Tue, 6 Dec 2016 18:15:48 +0100 Subject: [PATCH 1/5] Add support for serialized token --- composer.json | 1 + src/LinkedIn.php | 5 ++++- tests/LinkedInTest.php | 12 ++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index dea640b..57ae74e 100644 --- a/composer.json +++ b/composer.json @@ -20,6 +20,7 @@ }, "require-dev": { "phpunit/phpunit": "^4.5 || ^5.0", + "nyholm/nsa": "^1.0", "php-http/guzzle5-adapter": "^1.0", "guzzlehttp/psr7": "^1.2", "mockery/mockery": "^0.9", diff --git a/src/LinkedIn.php b/src/LinkedIn.php index bef60cf..b795b85 100644 --- a/src/LinkedIn.php +++ b/src/LinkedIn.php @@ -304,7 +304,10 @@ public function getAccessToken() */ public function setAccessToken($accessToken) { - if (!($accessToken instanceof AccessToken)) { + $deserializedToken = unserialize($accessToken); + if ($deserializedToken instanceof AccessToken) { + $accessToken = $deserializedToken; + } elseif (!$accessToken instanceof AccessToken) { $accessToken = new AccessToken($accessToken); } diff --git a/tests/LinkedInTest.php b/tests/LinkedInTest.php index 7f93b4d..1b6c5e9 100644 --- a/tests/LinkedInTest.php +++ b/tests/LinkedInTest.php @@ -3,6 +3,7 @@ namespace Happyr\LinkedIn; use GuzzleHttp\Psr7\Response; +use Nyholm\NSA; /** * @author Tobias Nyholm @@ -88,6 +89,17 @@ public function testAccessTokenAccessors() $this->assertEquals($token, $linkedIn->getAccessToken()); } + public function testAccessTokenSetterWithSerializedToken() + { + $linkedIn = new LinkedIn(self::APP_ID, self::APP_SECRET); + $token = new AccessToken('foobar'); + $serializedToken = serialize($token); + $linkedIn->setAccessToken($serializedToken); + + $storedToken = NSA::getProperty($linkedIn, 'accessToken'); + $this->assertEquals('foobar', $storedToken->__toString()); + } + public function testGeneratorAccessors() { $get = new \ReflectionMethod('Happyr\LinkedIn\LinkedIn', 'getUrlGenerator'); From 6a99b4ab9c6489f4382f3fa6fd3a7e15c50bda3c Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Tue, 6 Dec 2016 18:20:08 +0100 Subject: [PATCH 2/5] Minor --- src/LinkedIn.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LinkedIn.php b/src/LinkedIn.php index b795b85..f01f7ff 100644 --- a/src/LinkedIn.php +++ b/src/LinkedIn.php @@ -304,7 +304,7 @@ public function getAccessToken() */ public function setAccessToken($accessToken) { - $deserializedToken = unserialize($accessToken); + $deserializedToken = @unserialize($accessToken); if ($deserializedToken instanceof AccessToken) { $accessToken = $deserializedToken; } elseif (!$accessToken instanceof AccessToken) { From e9c8e194110b519883561004a8bc984a1d54b26f Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Wed, 7 Dec 2016 08:25:56 +0100 Subject: [PATCH 3/5] Added factory method for access token --- src/AccessToken.php | 25 +++++++++++++++++++++++++ src/LinkedIn.php | 7 ++----- tests/AccessTokenTest.php | 31 +++++++++++++++++++++++++++++++ tests/LinkedInTest.php | 20 ++++++++++++++++++-- 4 files changed, 76 insertions(+), 7 deletions(-) diff --git a/src/AccessToken.php b/src/AccessToken.php index 926d443..db82d7b 100644 --- a/src/AccessToken.php +++ b/src/AccessToken.php @@ -34,6 +34,31 @@ public function __construct($token = null, $expiresIn = null) } } + /** + * Restore a stored access token. + * + * @param string|AccessToken $token + * + * @return AccessToken + */ + public static function create($token) + { + if (empty($token)) { + return new self(); + } + + if ($token instanceof AccessToken) { + return $token; + } + + $unserialized = @unserialize($token); + if ($unserialized instanceof AccessToken) { + return $unserialized; + } + + return new self($token); + } + /** * @return string */ diff --git a/src/LinkedIn.php b/src/LinkedIn.php index f01f7ff..fcdf9ab 100644 --- a/src/LinkedIn.php +++ b/src/LinkedIn.php @@ -304,11 +304,8 @@ public function getAccessToken() */ public function setAccessToken($accessToken) { - $deserializedToken = @unserialize($accessToken); - if ($deserializedToken instanceof AccessToken) { - $accessToken = $deserializedToken; - } elseif (!$accessToken instanceof AccessToken) { - $accessToken = new AccessToken($accessToken); + if (!$accessToken instanceof AccessToken) { + $accessToken = AccessToken::create($accessToken); } $this->accessToken = $accessToken; diff --git a/tests/AccessTokenTest.php b/tests/AccessTokenTest.php index 9762c5c..4c87641 100644 --- a/tests/AccessTokenTest.php +++ b/tests/AccessTokenTest.php @@ -36,4 +36,35 @@ public function testSetExpiresAt() $token->setExpiresAt(new \DateTime('+2minutes')); $this->assertInstanceOf('\DateTime', $token->getExpiresAt()); } + + public function testCreateWithString() + { + $token = AccessToken::create('foobar'); + $this->assertInstanceOf(AccessToken::class, $token); + $this->assertEquals('foobar', $token->__toString()); + } + + public function testCreateWithNoData() + { + $token = AccessToken::create(''); + $this->assertInstanceOf(AccessToken::class, $token); + $this->assertEquals('', $token->__toString()); + } + + public function testCreateWithAccessToken() + { + $orgToken = new AccessToken('foobar', 10); + $token = AccessToken::create($orgToken); + $this->assertInstanceOf(AccessToken::class, $token); + $this->assertEquals('foobar', $token->__toString()); + } + + public function testCreateWithSerializedAccessToken() + { + $orgToken = new AccessToken('foobar', 10); + $orgTokenSerialized = serialize($orgToken); + $token = AccessToken::create($orgTokenSerialized); + $this->assertInstanceOf(AccessToken::class, $token); + $this->assertEquals('foobar', $token->__toString()); + } } diff --git a/tests/LinkedInTest.php b/tests/LinkedInTest.php index 1b6c5e9..d6ad964 100644 --- a/tests/LinkedInTest.php +++ b/tests/LinkedInTest.php @@ -78,10 +78,16 @@ public function testAccessTokenAccessors() { $token = 'token'; - $auth = $this->getMock('Happyr\LinkedIn\Authenticator', ['fetchNewAccessToken'], [], '', false); + $auth = $this->getMockBuilder('Happyr\LinkedIn\Authenticator') + ->setMethods(['fetchNewAccessToken']) + ->disableOriginalConstructor() + ->getMock(); $auth->expects($this->once())->method('fetchNewAccessToken')->will($this->returnValue($token)); - $linkedIn = $this->getMock('Happyr\LinkedIn\LinkedIn', ['getAuthenticator'], [], '', false); + $linkedIn = $this->getMockBuilder('Happyr\LinkedIn\LinkedIn') + ->setMethods(['getAuthenticator']) + ->disableOriginalConstructor() + ->getMock(); $linkedIn->expects($this->once())->method('getAuthenticator')->willReturn($auth); // Make sure we go to the authenticator only once @@ -100,6 +106,16 @@ public function testAccessTokenSetterWithSerializedToken() $this->assertEquals('foobar', $storedToken->__toString()); } + public function testAccessTokenSetterWithTokenObject() + { + $linkedIn = new LinkedIn(self::APP_ID, self::APP_SECRET); + $token = new AccessToken('foobar'); + $linkedIn->setAccessToken($token); + + $storedToken = NSA::getProperty($linkedIn, 'accessToken'); + $this->assertEquals('foobar', $storedToken->__toString()); + } + public function testGeneratorAccessors() { $get = new \ReflectionMethod('Happyr\LinkedIn\LinkedIn', 'getUrlGenerator'); From f47f3b0544da9a0bfd91fab390c3785a92125464 Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Wed, 7 Dec 2016 15:52:58 +0100 Subject: [PATCH 4/5] minor --- src/LinkedIn.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/LinkedIn.php b/src/LinkedIn.php index fcdf9ab..a277b21 100644 --- a/src/LinkedIn.php +++ b/src/LinkedIn.php @@ -304,11 +304,7 @@ public function getAccessToken() */ public function setAccessToken($accessToken) { - if (!$accessToken instanceof AccessToken) { - $accessToken = AccessToken::create($accessToken); - } - - $this->accessToken = $accessToken; + $this->accessToken = AccessToken::create($accessToken); return $this; } From 835840f938c9e2f6763afe18f7f9dcbe2915b178 Mon Sep 17 00:00:00 2001 From: Tobias Nyholm Date: Wed, 7 Dec 2016 16:30:14 +0100 Subject: [PATCH 5/5] Serialize access token before we store it --- src/Authenticator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Authenticator.php b/src/Authenticator.php index a98f5fd..1b217e2 100644 --- a/src/Authenticator.php +++ b/src/Authenticator.php @@ -81,7 +81,7 @@ public function fetchNewAccessToken(LinkedInUrlGeneratorInterface $urlGenerator) } $storage->set('code', $code); - $storage->set('access_token', $accessToken); + $storage->set('access_token', serialize($accessToken)); return $accessToken; }