{"action":"created","comment":{"url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/pulls/comments/93771743","pull_request_review_id":14307060,"id":93771743,"diff_hunk":"@@ -0,0 +1,216 @@\n+<?php\n+\n+/**\n+ * Copyright 2016 SURFnet B.V.\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\");\n+ * you may not use this file except in compliance with the License.\n+ * You may obtain a copy of the License at\n+ *\n+ *     http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ */\n+\n+namespace Surfnet\\SamlBundle\\Tests\\Component\\Signing;\n+\n+use PHPUnit_Framework_TestCase as TestCase;\n+use Psr\\Log\\NullLogger;\n+use SAML2_AuthnRequest;\n+use SAML2_Certificate_KeyLoader;\n+use SAML2_Certificate_X509;\n+use SAML2_DOMDocumentFactory;\n+use Surfnet\\SamlBundle\\SAML2\\AuthnRequest;\n+use Surfnet\\SamlBundle\\Signing\\SignatureVerifier;\n+use XMLSecurityKey;\n+\n+class AuthnRequestSigningTest extends TestCase\n+{\n+    /**\n+     * @var string\n+     */\n+    private $authRequestNoSubject = <<<AUTHNREQUEST_NO_SUBJECT\n+<samlp:AuthnRequest\n+    xmlns:samlp=\"urn:oasis:names:tc:SAML:2.0:protocol\"\n+    xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\"\n+    AssertionConsumerServiceIndex=\"1\"\n+    Destination=\"https://tiqr.stepup.org/idp/profile/saml2/Redirect/SSO\"\n+    ID=\"_2b0226190ca1c22de6f66e85f5c95158\"\n+    IssueInstant=\"2014-09-22T13:42:00Z\"\n+    Version=\"2.0\">\n+  <saml:Issuer>https://gateway.stepup.org/saml20/sp/metadata</saml:Issuer>\n+</samlp:AuthnRequest>\n+AUTHNREQUEST_NO_SUBJECT;\n+\n+    /**\n+     * @var string|null\n+     */\n+    private $publicKey = null;\n+\n+    /**\n+     * @test\n+     * @group Signing\n+     */\n+    public function a_signature_is_verified_if_the_data_to_sign_corresponds_with_how_it_is_included_in_the_http_query_regardless_of_how_it_is_encoded(\n+    )\n+    {\n+        $authnRequestWithDefaultEncoding = $this->createSignedAuthnRequestPreparingDataToSignWith(\n+            [$this, 'encodeDataToSignWithPhpsHttpBuildQuery']\n+        );\n+        $authnRequestWithCustomEncoding  = $this->createSignedAuthnRequestPreparingDataToSignWith(\n+            [$this, 'encodeDataToSignWithCustomEncoder']\n+        );\n+\n+        $certificate = SAML2_Certificate_X509::createFromCertificateData($this->getPublicKey());\n+\n+        $signatureVerifier    = new SignatureVerifier(new SAML2_Certificate_KeyLoader, new NullLogger);\n+        $signatureWithDefaultEncodingIsVerified = $signatureVerifier->isSignedWith(\n+            $authnRequestWithDefaultEncoding,\n+            $certificate\n+        );\n+        $signatureWithCustomEncodingIsVerified  = $signatureVerifier->isSignedWith(\n+            $authnRequestWithCustomEncoding,\n+            $certificate\n+        );\n+\n+        $this->assertTrue(\n+            $signatureWithDefaultEncodingIsVerified,\n+            'The signature of the authn request with PHP\\'s default http query encoding '\n+            . 'should correspond with its data to sign, but it does not'\n+        );\n+        $this->assertTrue($signatureWithCustomEncodingIsVerified,\n+            'The signature of the authn request with a custom http query encoding '\n+            . 'should correspond with its data to sign, but it does not'\n+        );\n+    }\n+\n+    /**\n+     * @test\n+     * @group Signing\n+     */\n+    public function a_signature_is_not_verified_if_the_data_to_sign_does_not_correspond_with_how_it_is_included_in_the_http_query()\n+    {\n+        $authnRequestWithModifiedDataToSign = $this->createSignedAuthnRequestPreparingDataToSignWith(\n+            [$this, 'encodeDataToSignWithPhpsHttpBuildQuery'],\n+            'this-is-a-custom-signature'\n+        );\n+\n+        $certificate = SAML2_Certificate_X509::createFromCertificateData($this->getPublicKey());\n+\n+        $signatureVerifier   = new SignatureVerifier(new SAML2_Certificate_KeyLoader, new NullLogger);\n+        $signatureIsVerified = $signatureVerifier->isSignedWith($authnRequestWithModifiedDataToSign, $certificate);\n+\n+        $this->assertFalse(\n+            $signatureIsVerified,\n+            'A signature that does not correspond with the data to sign and '\n+            . 'how it is included in the http query should not be verified, but it is'\n+        );\n+    }\n+\n+    /**\n+     * @test\n+     * @group Signing\n+     */\n+    public function a_signature_is_not_verified_if_parameter_order_of_the_corresponding_http_query_is_not_correct()\n+    {\n+        $authnRequestWithModifiedDataToSign = $this->createSignedAuthnRequestPreparingDataToSignWith(\n+            [$this, 'changeParameterAndEncodeDataToSign']\n+        );\n+\n+        $certificate = SAML2_Certificate_X509::createFromCertificateData($this->getPublicKey());\n+\n+        $signatureVerifier   = new SignatureVerifier(new SAML2_Certificate_KeyLoader, new NullLogger);\n+        $signatureIsVerified = $signatureVerifier->isSignedWith($authnRequestWithModifiedDataToSign, $certificate);\n+\n+        $this->assertFalse(\n+            $signatureIsVerified,\n+            'A signature that corresponds with the data to sign '\n+            . 'but the data to sign is in the wrong order should not be verified, but it is'\n+        );\n+    }\n+\n+    /**\n+     * @param array $params\n+     * @return string\n+     */\n+    private function encodeDataToSignWithPhpsHttpBuildQuery(array $params)\n+    {\n+        return http_build_query($params);\n+    }\n+\n+    /**\n+     * @param array $params\n+     * @return string\n+     */\n+    private function encodeDataToSignWithCustomEncoder(array $params)\n+    {\n+        $encodedParams = http_build_query($params);\n+\n+        return str_replace('%3A', ':', $encodedParams);\n+    }\n+\n+    /**\n+     * @param array $params\n+     * @return string\n+     */\n+    private function changeParameterAndEncodeDataToSign(array $params)\n+    {\n+        return http_build_query(array_reverse($params, true));\n+    }\n+\n+    /**\n+     * @param callable $prepareDataToSign Expects an associative array of data to sign and returns a string to sign\n+     * @param null|string $customSignature Signature to be used instead of signature to sign data to sign with\n+     * @return AuthnRequest\n+     */\n+    private function createSignedAuthnRequestPreparingDataToSignWith(\n+        callable $prepareDataToSign,\n+        $customSignature = null\n+    ) {\n+        $keyData    = file_get_contents(__DIR__.'/../../../Resources/keys/development_privatekey.pem');\n+        $privateKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA256, ['type' => 'private']);\n+        $privateKey->loadKey($keyData);\n+\n+        $domDocument          = SAML2_DOMDocumentFactory::fromString($this->authRequestNoSubject);\n+        $unsignedAuthnRequest = SAML2_AuthnRequest::fromXML($domDocument->firstChild);\n+        $unsignedAuthnRequest->setSignatureKey($privateKey);\n+        $unsignedAuthnRequest->setCertificates([$this->getPublicKey()]);","path":"src/Tests/Component/Signing/AuthnRequestSigningTest.php","position":181,"original_position":181,"commit_id":"53f1a17256477c1ed7493c28861ac0f08bc1338a","original_commit_id":"53f1a17256477c1ed7493c28861ac0f08bc1338a","user":{"login":"rjkip","id":1734555,"avatar_url":"https://avatars.githubusercontent.com/u/1734555?v=3","gravatar_id":"","url":"https://api.github.com/users/rjkip","html_url":"https://github.com/rjkip","followers_url":"https://api.github.com/users/rjkip/followers","following_url":"https://api.github.com/users/rjkip/following{/other_user}","gists_url":"https://api.github.com/users/rjkip/gists{/gist_id}","starred_url":"https://api.github.com/users/rjkip/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rjkip/subscriptions","organizations_url":"https://api.github.com/users/rjkip/orgs","repos_url":"https://api.github.com/users/rjkip/repos","events_url":"https://api.github.com/users/rjkip/events{/privacy}","received_events_url":"https://api.github.com/users/rjkip/received_events","type":"User","site_admin":false},"body":"Your examples concern requests that are actually signed :wink: Since we do not do this in our AuthnRequestFactory, I'd prefer chucking them out :slightly_smiling_face: ","created_at":"2016-12-23T14:36:39Z","updated_at":"2016-12-23T14:36:39Z","html_url":"https://github.com/SURFnet/Stepup-saml-bundle/pull/55#discussion_r93771743","pull_request_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/pulls/55","_links":{"self":{"href":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/pulls/comments/93771743"},"html":{"href":"https://github.com/SURFnet/Stepup-saml-bundle/pull/55#discussion_r93771743"},"pull_request":{"href":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/pulls/55"}}},"pull_request":{"url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/pulls/55","id":99243082,"html_url":"https://github.com/SURFnet/Stepup-saml-bundle/pull/55","diff_url":"https://github.com/SURFnet/Stepup-saml-bundle/pull/55.diff","patch_url":"https://github.com/SURFnet/Stepup-saml-bundle/pull/55.patch","issue_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/issues/55","number":55,"state":"open","locked":false,"title":"Bugfix: signature verification with different query encoding","user":{"login":"arothuis","id":3816591,"avatar_url":"https://avatars.githubusercontent.com/u/3816591?v=3","gravatar_id":"","url":"https://api.github.com/users/arothuis","html_url":"https://github.com/arothuis","followers_url":"https://api.github.com/users/arothuis/followers","following_url":"https://api.github.com/users/arothuis/following{/other_user}","gists_url":"https://api.github.com/users/arothuis/gists{/gist_id}","starred_url":"https://api.github.com/users/arothuis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/arothuis/subscriptions","organizations_url":"https://api.github.com/users/arothuis/orgs","repos_url":"https://api.github.com/users/arothuis/repos","events_url":"https://api.github.com/users/arothuis/events{/privacy}","received_events_url":"https://api.github.com/users/arothuis/received_events","type":"User","site_admin":false},"body":"[136419577](https://www.pivotaltracker.com/story/show/136419577)\r\n\r\nIf the SP sends a SAMLRequest that is encoded differently as query parameters than PHP's standard way of encoding (`http_build_query`), signature verification should not break.\r\n\r\nThe spec states: \r\n> (...) [N]ote that URL-encoding is not canonical; that is, there are multiple legal encodings for a given value. The relying party MUST therefore perform the verification step using the original URL-encoded values it received on the query string. It is not sufficient to re-encode the parameters after the have been processed by software because > the resulting encoding may not match the signer's encoding.\r\n\r\nFor further reference, see: [Oasis Standard regarding SAML Bindings, 15 March 2005, page 18, line 620](https://docs.oasis-open.org/security/saml/v2.0/saml-bindings-2.0-os.pdf)\r\n\r\nWe were [re-encoding the query string](https://github.com/SURFnet/Stepup-saml-bundle/blob/3c0371d428af4a23e98438ccd76df890cf36edbf/src/SAML2/AuthnRequest.php#L305-L319), but we should rely on the encoding given.\r\n\r\n","created_at":"2016-12-23T13:36:20Z","updated_at":"2016-12-23T14:36:39Z","closed_at":null,"merged_at":null,"merge_commit_sha":"2628b12e34826210f13005c017737d4bb3940594","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/pulls/55/commits","review_comments_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/pulls/55/comments","review_comment_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/pulls/comments{/number}","comments_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/issues/55/comments","statuses_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/statuses/53f1a17256477c1ed7493c28861ac0f08bc1338a","head":{"label":"SURFnet:bugfix/signature-verification-with-different-query-encoding","ref":"bugfix/signature-verification-with-different-query-encoding","sha":"53f1a17256477c1ed7493c28861ac0f08bc1338a","user":{"login":"SURFnet","id":1485353,"avatar_url":"https://avatars.githubusercontent.com/u/1485353?v=3","gravatar_id":"","url":"https://api.github.com/users/SURFnet","html_url":"https://github.com/SURFnet","followers_url":"https://api.github.com/users/SURFnet/followers","following_url":"https://api.github.com/users/SURFnet/following{/other_user}","gists_url":"https://api.github.com/users/SURFnet/gists{/gist_id}","starred_url":"https://api.github.com/users/SURFnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SURFnet/subscriptions","organizations_url":"https://api.github.com/users/SURFnet/orgs","repos_url":"https://api.github.com/users/SURFnet/repos","events_url":"https://api.github.com/users/SURFnet/events{/privacy}","received_events_url":"https://api.github.com/users/SURFnet/received_events","type":"Organization","site_admin":false},"repo":{"id":25961674,"name":"Stepup-saml-bundle","full_name":"SURFnet/Stepup-saml-bundle","owner":{"login":"SURFnet","id":1485353,"avatar_url":"https://avatars.githubusercontent.com/u/1485353?v=3","gravatar_id":"","url":"https://api.github.com/users/SURFnet","html_url":"https://github.com/SURFnet","followers_url":"https://api.github.com/users/SURFnet/followers","following_url":"https://api.github.com/users/SURFnet/following{/other_user}","gists_url":"https://api.github.com/users/SURFnet/gists{/gist_id}","starred_url":"https://api.github.com/users/SURFnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SURFnet/subscriptions","organizations_url":"https://api.github.com/users/SURFnet/orgs","repos_url":"https://api.github.com/users/SURFnet/repos","events_url":"https://api.github.com/users/SURFnet/events{/privacy}","received_events_url":"https://api.github.com/users/SURFnet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/SURFnet/Stepup-saml-bundle","description":"SAML bundle for gateway, self-service, and ra","fork":false,"url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle","forks_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/forks","keys_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/keys{/key_id}","collaborators_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/teams","hooks_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/hooks","issue_events_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/issues/events{/number}","events_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/events","assignees_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/assignees{/user}","branches_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/branches{/branch}","tags_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/tags","blobs_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/git/refs{/sha}","trees_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/git/trees{/sha}","statuses_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/statuses/{sha}","languages_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/languages","stargazers_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/stargazers","contributors_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/contributors","subscribers_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/subscribers","subscription_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/subscription","commits_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/commits{/sha}","git_commits_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/git/commits{/sha}","comments_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/comments{/number}","issue_comment_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/issues/comments{/number}","contents_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/contents/{+path}","compare_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/compare/{base}...{head}","merges_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/merges","archive_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/downloads","issues_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/issues{/number}","pulls_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/pulls{/number}","milestones_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/milestones{/number}","notifications_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/labels{/name}","releases_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/releases{/id}","deployments_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/deployments","created_at":"2014-10-30T08:35:54Z","updated_at":"2016-10-31T16:02:44Z","pushed_at":"2016-12-23T13:36:20Z","git_url":"git://github.com/SURFnet/Stepup-saml-bundle.git","ssh_url":"git@github.com:SURFnet/Stepup-saml-bundle.git","clone_url":"https://github.com/SURFnet/Stepup-saml-bundle.git","svn_url":"https://github.com/SURFnet/Stepup-saml-bundle","homepage":null,"size":236,"stargazers_count":5,"watchers_count":5,"language":"PHP","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":13,"mirror_url":null,"open_issues_count":1,"forks":13,"open_issues":1,"watchers":5,"default_branch":"develop"}},"base":{"label":"SURFnet:develop","ref":"develop","sha":"3c0371d428af4a23e98438ccd76df890cf36edbf","user":{"login":"SURFnet","id":1485353,"avatar_url":"https://avatars.githubusercontent.com/u/1485353?v=3","gravatar_id":"","url":"https://api.github.com/users/SURFnet","html_url":"https://github.com/SURFnet","followers_url":"https://api.github.com/users/SURFnet/followers","following_url":"https://api.github.com/users/SURFnet/following{/other_user}","gists_url":"https://api.github.com/users/SURFnet/gists{/gist_id}","starred_url":"https://api.github.com/users/SURFnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SURFnet/subscriptions","organizations_url":"https://api.github.com/users/SURFnet/orgs","repos_url":"https://api.github.com/users/SURFnet/repos","events_url":"https://api.github.com/users/SURFnet/events{/privacy}","received_events_url":"https://api.github.com/users/SURFnet/received_events","type":"Organization","site_admin":false},"repo":{"id":25961674,"name":"Stepup-saml-bundle","full_name":"SURFnet/Stepup-saml-bundle","owner":{"login":"SURFnet","id":1485353,"avatar_url":"https://avatars.githubusercontent.com/u/1485353?v=3","gravatar_id":"","url":"https://api.github.com/users/SURFnet","html_url":"https://github.com/SURFnet","followers_url":"https://api.github.com/users/SURFnet/followers","following_url":"https://api.github.com/users/SURFnet/following{/other_user}","gists_url":"https://api.github.com/users/SURFnet/gists{/gist_id}","starred_url":"https://api.github.com/users/SURFnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SURFnet/subscriptions","organizations_url":"https://api.github.com/users/SURFnet/orgs","repos_url":"https://api.github.com/users/SURFnet/repos","events_url":"https://api.github.com/users/SURFnet/events{/privacy}","received_events_url":"https://api.github.com/users/SURFnet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/SURFnet/Stepup-saml-bundle","description":"SAML bundle for gateway, self-service, and ra","fork":false,"url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle","forks_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/forks","keys_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/keys{/key_id}","collaborators_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/teams","hooks_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/hooks","issue_events_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/issues/events{/number}","events_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/events","assignees_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/assignees{/user}","branches_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/branches{/branch}","tags_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/tags","blobs_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/git/refs{/sha}","trees_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/git/trees{/sha}","statuses_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/statuses/{sha}","languages_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/languages","stargazers_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/stargazers","contributors_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/contributors","subscribers_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/subscribers","subscription_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/subscription","commits_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/commits{/sha}","git_commits_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/git/commits{/sha}","comments_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/comments{/number}","issue_comment_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/issues/comments{/number}","contents_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/contents/{+path}","compare_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/compare/{base}...{head}","merges_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/merges","archive_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/downloads","issues_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/issues{/number}","pulls_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/pulls{/number}","milestones_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/milestones{/number}","notifications_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/labels{/name}","releases_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/releases{/id}","deployments_url":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/deployments","created_at":"2014-10-30T08:35:54Z","updated_at":"2016-10-31T16:02:44Z","pushed_at":"2016-12-23T13:36:20Z","git_url":"git://github.com/SURFnet/Stepup-saml-bundle.git","ssh_url":"git@github.com:SURFnet/Stepup-saml-bundle.git","clone_url":"https://github.com/SURFnet/Stepup-saml-bundle.git","svn_url":"https://github.com/SURFnet/Stepup-saml-bundle","homepage":null,"size":236,"stargazers_count":5,"watchers_count":5,"language":"PHP","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":13,"mirror_url":null,"open_issues_count":1,"forks":13,"open_issues":1,"watchers":5,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/pulls/55"},"html":{"href":"https://github.com/SURFnet/Stepup-saml-bundle/pull/55"},"issue":{"href":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/issues/55"},"comments":{"href":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/issues/55/comments"},"review_comments":{"href":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/pulls/55/comments"},"review_comment":{"href":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/pulls/55/commits"},"statuses":{"href":"https://api.github.com/repos/SURFnet/Stepup-saml-bundle/statuses/53f1a17256477c1ed7493c28861ac0f08bc1338a"}}}}
{"actor":{"display_login":"rjkip"}}