{"action":"created","comment":{"url":"https://api.github.com/repos/owncloud/oauth2/pulls/comments/185977951","pull_request_review_id":117479465,"id":185977951,"diff_hunk":"@@ -0,0 +1,299 @@\n+<?php\n+/**\n+ * ownCloud\n+ *\n+ * @author Artur Neumann <artur@jankaritech.com>\n+ * @copyright Copyright (c) 2018 Artur Neumann artur@jankaritech.com\n+ *\n+ * This library is free software; you can redistribute it and/or\n+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE\n+ * License as published by the Free Software Foundation; either\n+ * version 3 of the License, or any later version.\n+ *\n+ * This library is distributed in the hope that it will be useful,\n+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.\n+ *\n+ * You should have received a copy of the GNU Affero General Public\n+ * License along with this library.  If not, see <http://www.gnu.org/licenses/>.\n+ *\n+ */\n+\n+use Behat\\Behat\\Context\\Context;\n+use Behat\\Behat\\Hook\\Scope\\BeforeScenarioScope;\n+use Behat\\MinkExtension\\Context\\RawMinkContext;\n+use Page\\Oauth2AuthRequestPage;\n+use TestHelpers\\WebDavHelper;\n+use GuzzleHttp\\Client;\n+\n+require_once 'bootstrap.php';\n+\n+/**\n+ * Context keeping steps for oauth tests\n+ *\n+ */\n+class Oauth2Context extends RawMinkContext implements Context {\n+\t\n+\t/**\n+\t * \n+\t * @var FeatureContext\n+\t */\n+\tprivate $featureContext;\n+\t/**\n+\t * \n+\t * @var WebUIGeneralContext\n+\t */\n+\tprivate $webUIGeneralContext;\n+\t/**\n+\t * \n+\t * @var WebUILoginContext\n+\t */\n+\tprivate $webUILoginContext;\n+\t/**\n+\t * \n+\t * @var Oauth2AuthRequestPage\n+\t */\n+\tprivate $oauth2AuthRequestPage;\n+\t\n+\tprivate $clientId = 'xdXOt13JKxym1B1QcEncf2XDkLAexMBFwiT9j6EfhhHFJhs2KM9jbjTmf8JBXE69';\n+\tprivate $clientSecret = 'UBntmLjC2yYCeHwsyj73Uwo9TAaecAetRwMw0xYcvNL9yRdLSUi0hUAHfvCHFeFh';\n+\tprivate $redirectUriPort;\n+\tprivate $redirectUriHost = \"localhost\";\n+\t/**\n+\t * \n+\t * @var stdClass\n+\t * attributes: \n+\t * access_token, token_type, expires_in, refresh_token, user_id, message_url\n+\t * @link https://github.com/owncloud/oauth2#protocol-flow\n+\t */\n+\tprivate $accessTokenResponse;\n+\t\n+\t/**\n+\t * \n+\t * @param Oauth2AuthRequestPage $oauth2AuthRequestPage\n+\t * \n+\t * @return void\n+\t */\n+\tpublic function __construct(Oauth2AuthRequestPage $oauth2AuthRequestPage) {\n+\t\t$this->oauth2AuthRequestPage = $oauth2AuthRequestPage;\n+\t}\n+\n+\t/**\n+\t * @When /^the user(?: \"([^\"]*)\")? sends an oauth2 authorization request using the webUI$/\n+\t * @Given /^the user(?: \"([^\"]*)\")? has sent an oauth2 authorization request$/\n+\t * \n+\t * @param string $username\n+\t * \n+\t * @return void\n+\t */\n+\tpublic function oauthAuthorizationRequestUsingTheWebui($username = null) {\n+\t\t$fullUrl = $this->featureContext->getBaseUrl() .\n+\t\t'/index.php/apps/oauth2/authorize?response_type=code&client_id=' .\n+\t\t$this->clientId .\n+\t\t'&redirect_uri=http://' .\n+\t\t$this->redirectUriHost . ':' .\n+\t\t$this->redirectUriPort;\n+\t\tif ($username !== null) {\n+\t\t\t$fullUrl = $fullUrl . \"&user=$username\";\n+\t\t}\n+\t\t$this->visitPath($fullUrl);\n+\t}\n+\n+\t/**\n+\t * @When the user sends an oauth2 authorization request with an unregistered clientId using the webUI\n+\t *\n+\t * @return void\n+\t */\n+\tpublic function oAuthAuthorizationRequestUnregisteredClientIdUsingTheWebui() {\n+\t\t$this->visitPath(\n+\t\t\t$this->featureContext->getBaseUrl() .\n+\t\t\t'/index.php/apps/oauth2/authorize?response_type=code&client_id=xxxxxx' .\n+\t\t\t'&redirect_uri=http://' .\n+\t\t\t$this->redirectUriHost . ':' .\n+\t\t\t$this->redirectUriPort\n+\t\t);\n+\t}\n+\n+\t/**\n+\t * @When the user authorizes the oauth app using the webUI\n+\t * \n+\t * @return void\n+\t */\n+\tpublic function theUserAuthorizesOauthAppUsingTheWebUI() {\n+\t\t$this->oauth2AuthRequestPage->authorizeApp();\n+\t}\n+\n+\t/**\n+\t * @Given the user :user has correctly established an oauth session\n+\t * \n+\t * @param string $user\n+\t * \n+\t * @return void\n+\t */\n+\tpublic function establishOauthSession($user) {\n+\t\t$this->oauthAuthorizationRequestUsingTheWebui();\n+\t\t$this->webUILoginContext\n+\t\t\t->theUserLogsInWithUsernameAndPasswordAfterRedirectFromThePage(\n+\t\t\t\t$user,\n+\t\t\t\t$this->featureContext->getPasswordForUser($user),\n+\t\t\t\t\"oauth2AuthRequest\"\n+\t\t\t);\n+\t\t$this->theUserAuthorizesOauthAppUsingTheWebUI();\n+\t\t$this->clientAppRequestsAccessToken();\n+\t}\n+\n+\t/**\n+\t * @When the client app refreshes the access token\n+\t * \n+\t * @return void\n+\t */\n+\tpublic function refreshAccessToken() {\n+\t\t$oldAccessToken = $this->accessTokenResponse->access_token;\n+\t\t$this->clientAppRequestsAccessToken(\n+\t\t\t$this->accessTokenResponse->refresh_token\n+\t\t);\n+\t\tPHPUnit_Framework_Assert::assertNotSame(\n+\t\t\t$oldAccessToken, $this->accessTokenResponse->access_token,\n+\t\t\t__METHOD__ . \" the new token is not different to the old one\"\n+\t\t);\n+\t}\n+\n+\t/**\n+\t * @When the user switches the user to continue the oauth process using the webUI\n+\t *\n+\t * @return void\n+\t */\n+\tpublic function switchTheUserToContinueOauthProcess() {\n+\t\t$this->oauth2AuthRequestPage->switchUsers();\n+\t}\n+\n+\t/**\n+\t * @When the client app requests an access token\n+\t * @Given the client app has requested an access token\n+\t * \n+\t * @param string $refreshToken if set the `grant_type` `refresh_token`\n+\t *                             will be used with the given refresh token\n+\t *                             to request a new access token\n+\t * \n+\t * @return void\n+\t */\n+\tpublic function clientAppRequestsAccessToken($refreshToken = null) {\n+\t\t$redirectUri = \\parse_url($this->getSession()->getCurrentUrl());\n+\t\tparse_str($redirectUri['query'], $parameters);\n+\t\t$client = new Client();\n+\t\t$options = [];\n+\t\t$options['auth'] = [$this->clientId, $this->clientSecret];\n+\t\n+\t\tif ($refreshToken === null) {\n+\t\t\t$options['body'] = [\n+\t\t\t\t'grant_type' => 'authorization_code',\n+\t\t\t\t'code' => $parameters['code'],\n+\t\t\t\t'redirect_uri' => 'http://' . $this->redirectUriHost . ':' .\n+\t\t\t\t$this->redirectUriPort\n+\t\t\t];\n+\t\t} else {\n+\t\t\t$options['body'] = [\n+\t\t\t\t'grant_type' => 'refresh_token',\n+\t\t\t\t'refresh_token' => $refreshToken\n+\t\t\t];\n+\t\t}\n+\n+\t\t$fullUrl = $this->featureContext->getBaseUrl() .\n+\t\t\t\t   '/index.php/apps/oauth2/api/v1/token';\n+\t\t$request = $client->createRequest('POST', $fullUrl, $options);\n+\t\t$response = $client->send($request);\n+\t\t$this->accessTokenResponse = json_decode($response->getBody()->getContents());\n+\t}\n+\n+\t/**\n+\t * @Then the client app should be able to download the file :file of :user using the access token for authentication\n+\t *\n+\t * @param string $file\n+\t * @param string $user\n+\t * \n+\t * @return void\n+\t */\n+\tpublic function accessFileUsingOauthToken($file, $user) {\n+\t\t$result = WebDavHelper::makeDavRequest(\n+\t\t\t$this->featureContext->getBaseUrl(),\n+\t\t\t$user, $this->accessTokenResponse->access_token,\n+\t\t\t'GET', $file, [], null, null, 2, \"files\", null, \"bearer\"\n+\t\t);\n+\t\t$originalFile = \\getenv(\"SRC_SKELETON_DIR\") . \"/\" . \\trim($file);\n+\t\t$localContent = \\file_get_contents($originalFile);\n+\t\t$downloadedContent = $result->getBody()->getContents();\n+\t\t\tPHPUnit_Framework_Assert::assertSame(\n+\t\t\t\t$localContent, $downloadedContent,\n+\t\t\t\t__METHOD__ . \" content of downloaded file is not as expected\"\n+\t\t\t);\n+\t}\n+\n+\t/**\n+\t * @Then the client app should receive an authorization code\n+\t * \n+\t * @return void\n+\t */\n+\tpublic function clientAppShouldReceiveAuthCode() {\n+\t\t$redirectUri = \\parse_url($this->getSession()->getCurrentUrl());\n+\t\tPHPUnit_Framework_Assert::assertEquals(\n+\t\t\t$this->redirectUriHost, $redirectUri['host'],\n+\t\t\t__METHOD__ . \" the host of redirect uri should be '\" .\n+\t\t\t$this->redirectUriHost . \"' but it is '\" .\n+\t\t\t$redirectUri['host'] . \"'\"\n+\t\t);\n+\t\tPHPUnit_Framework_Assert::assertEquals(\n+\t\t\t$this->redirectUriPort, $redirectUri['port'],\n+\t\t\t__METHOD__ . \" the port of redirect uri should be '\" .\n+\t\t\t$this->redirectUriPort . \"' but it is '\" .\n+\t\t\t$redirectUri['port'] . \"'\"\n+\t\t);\n+\t\tparse_str($redirectUri['query'], $parameters);\n+\t\tPHPUnit_Framework_Assert::assertEquals(\n+\t\t\t64, strlen($parameters['code']), \n+\t\t\t__METHOD__ . \" received code should be 64 char long but its \" .\n+\t\t\tstrlen($parameters['code']) . \" long\"\n+\t\t);\n+\t}\n+\n+\t/**\n+\t * @Then an invalid oauth request message should be shown\n+\t * \n+\t * @return void\n+\t */\n+\tpublic function invalidOauthRequestMessageShouldBeShown() {\n+\t\t$error = $this->oauth2AuthRequestPage->getErrorMessageHeading();\n+\t\tPHPUnit_Framework_Assert::assertSame(\"Request not valid\", $error);\n+\t}\n+\t/**\n+\t * This will run before EVERY scenario.\n+\t * It will set the properties for this object.\n+\t *\n+\t * @BeforeScenario @webUI\n+\t *\n+\t * @param BeforeScenarioScope $scope\n+\t *\n+\t * @return void\n+\t */\n+\tpublic function before(BeforeScenarioScope $scope) {\n+\t\t// Get the environment\n+\t\t$environment = $scope->getEnvironment();\n+\t\t// Get all the contexts you need in this context\n+\t\t$this->featureContext = $environment->getContext('FeatureContext');\n+\t\t$this->webUIGeneralContext = $environment->getContext('WebUIGeneralContext');\n+\t\t$this->webUILoginContext = $environment->getContext('WebUILoginContext');\n+\t\t$this->redirectUriPort = $this->findAvaliablePort();\n+\t}\n+\n+\t/**\n+\t * finds an availibale network port\n+\t * \n+\t * @return int port number\n+\t */\n+\tprivate function findAvaliablePort() {","path":"tests/acceptance/features/bootstrap/Oauth2Context.php","position":293,"original_position":293,"commit_id":"3066fdda3e769e604109ead8552bac40104f4371","original_commit_id":"3066fdda3e769e604109ead8552bac40104f4371","user":{"login":"phil-davis","id":1535615,"avatar_url":"https://avatars1.githubusercontent.com/u/1535615?v=4","gravatar_id":"","url":"https://api.github.com/users/phil-davis","html_url":"https://github.com/phil-davis","followers_url":"https://api.github.com/users/phil-davis/followers","following_url":"https://api.github.com/users/phil-davis/following{/other_user}","gists_url":"https://api.github.com/users/phil-davis/gists{/gist_id}","starred_url":"https://api.github.com/users/phil-davis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/phil-davis/subscriptions","organizations_url":"https://api.github.com/users/phil-davis/orgs","repos_url":"https://api.github.com/users/phil-davis/repos","events_url":"https://api.github.com/users/phil-davis/events{/privacy}","received_events_url":"https://api.github.com/users/phil-davis/received_events","type":"User","site_admin":false},"body":"typo in function name also.\r\n","created_at":"2018-05-04T01:53:29Z","updated_at":"2018-05-04T01:53:29Z","html_url":"https://github.com/owncloud/oauth2/pull/132#discussion_r185977951","pull_request_url":"https://api.github.com/repos/owncloud/oauth2/pulls/132","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/owncloud/oauth2/pulls/comments/185977951"},"html":{"href":"https://github.com/owncloud/oauth2/pull/132#discussion_r185977951"},"pull_request":{"href":"https://api.github.com/repos/owncloud/oauth2/pulls/132"}}},"pull_request":{"url":"https://api.github.com/repos/owncloud/oauth2/pulls/132","id":185662803,"html_url":"https://github.com/owncloud/oauth2/pull/132","diff_url":"https://github.com/owncloud/oauth2/pull/132.diff","patch_url":"https://github.com/owncloud/oauth2/pull/132.patch","issue_url":"https://api.github.com/repos/owncloud/oauth2/issues/132","number":132,"state":"open","locked":false,"title":"acceptance tests","user":{"login":"individual-it","id":2425577,"avatar_url":"https://avatars1.githubusercontent.com/u/2425577?v=4","gravatar_id":"","url":"https://api.github.com/users/individual-it","html_url":"https://github.com/individual-it","followers_url":"https://api.github.com/users/individual-it/followers","following_url":"https://api.github.com/users/individual-it/following{/other_user}","gists_url":"https://api.github.com/users/individual-it/gists{/gist_id}","starred_url":"https://api.github.com/users/individual-it/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/individual-it/subscriptions","organizations_url":"https://api.github.com/users/individual-it/orgs","repos_url":"https://api.github.com/users/individual-it/repos","events_url":"https://api.github.com/users/individual-it/events{/privacy}","received_events_url":"https://api.github.com/users/individual-it/received_events","type":"User","site_admin":false},"body":"first iteration of acceptance tests for the oauth app\r\nshould tick a couple of boxes in the test-plan https://github.com/owncloud/QA/blob/master/Server/Test_Plan_OAuth2.md","created_at":"2018-05-03T09:40:30Z","updated_at":"2018-05-04T01:53:29Z","closed_at":null,"merged_at":null,"merge_commit_sha":"42401deb643f4528969b0b3d227005384dbfe316","assignee":{"login":"individual-it","id":2425577,"avatar_url":"https://avatars1.githubusercontent.com/u/2425577?v=4","gravatar_id":"","url":"https://api.github.com/users/individual-it","html_url":"https://github.com/individual-it","followers_url":"https://api.github.com/users/individual-it/followers","following_url":"https://api.github.com/users/individual-it/following{/other_user}","gists_url":"https://api.github.com/users/individual-it/gists{/gist_id}","starred_url":"https://api.github.com/users/individual-it/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/individual-it/subscriptions","organizations_url":"https://api.github.com/users/individual-it/orgs","repos_url":"https://api.github.com/users/individual-it/repos","events_url":"https://api.github.com/users/individual-it/events{/privacy}","received_events_url":"https://api.github.com/users/individual-it/received_events","type":"User","site_admin":false},"assignees":[{"login":"individual-it","id":2425577,"avatar_url":"https://avatars1.githubusercontent.com/u/2425577?v=4","gravatar_id":"","url":"https://api.github.com/users/individual-it","html_url":"https://github.com/individual-it","followers_url":"https://api.github.com/users/individual-it/followers","following_url":"https://api.github.com/users/individual-it/following{/other_user}","gists_url":"https://api.github.com/users/individual-it/gists{/gist_id}","starred_url":"https://api.github.com/users/individual-it/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/individual-it/subscriptions","organizations_url":"https://api.github.com/users/individual-it/orgs","repos_url":"https://api.github.com/users/individual-it/repos","events_url":"https://api.github.com/users/individual-it/events{/privacy}","received_events_url":"https://api.github.com/users/individual-it/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"DeepDiver1975","id":1005065,"avatar_url":"https://avatars2.githubusercontent.com/u/1005065?v=4","gravatar_id":"","url":"https://api.github.com/users/DeepDiver1975","html_url":"https://github.com/DeepDiver1975","followers_url":"https://api.github.com/users/DeepDiver1975/followers","following_url":"https://api.github.com/users/DeepDiver1975/following{/other_user}","gists_url":"https://api.github.com/users/DeepDiver1975/gists{/gist_id}","starred_url":"https://api.github.com/users/DeepDiver1975/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DeepDiver1975/subscriptions","organizations_url":"https://api.github.com/users/DeepDiver1975/orgs","repos_url":"https://api.github.com/users/DeepDiver1975/repos","events_url":"https://api.github.com/users/DeepDiver1975/events{/privacy}","received_events_url":"https://api.github.com/users/DeepDiver1975/received_events","type":"User","site_admin":false},{"login":"patrickjahns","id":6403243,"avatar_url":"https://avatars2.githubusercontent.com/u/6403243?v=4","gravatar_id":"","url":"https://api.github.com/users/patrickjahns","html_url":"https://github.com/patrickjahns","followers_url":"https://api.github.com/users/patrickjahns/followers","following_url":"https://api.github.com/users/patrickjahns/following{/other_user}","gists_url":"https://api.github.com/users/patrickjahns/gists{/gist_id}","starred_url":"https://api.github.com/users/patrickjahns/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/patrickjahns/subscriptions","organizations_url":"https://api.github.com/users/patrickjahns/orgs","repos_url":"https://api.github.com/users/patrickjahns/repos","events_url":"https://api.github.com/users/patrickjahns/events{/privacy}","received_events_url":"https://api.github.com/users/patrickjahns/received_events","type":"User","site_admin":false},{"login":"davitol","id":10596560,"avatar_url":"https://avatars1.githubusercontent.com/u/10596560?v=4","gravatar_id":"","url":"https://api.github.com/users/davitol","html_url":"https://github.com/davitol","followers_url":"https://api.github.com/users/davitol/followers","following_url":"https://api.github.com/users/davitol/following{/other_user}","gists_url":"https://api.github.com/users/davitol/gists{/gist_id}","starred_url":"https://api.github.com/users/davitol/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davitol/subscriptions","organizations_url":"https://api.github.com/users/davitol/orgs","repos_url":"https://api.github.com/users/davitol/repos","events_url":"https://api.github.com/users/davitol/events{/privacy}","received_events_url":"https://api.github.com/users/davitol/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":{"url":"https://api.github.com/repos/owncloud/oauth2/milestones/8","html_url":"https://github.com/owncloud/oauth2/milestone/8","labels_url":"https://api.github.com/repos/owncloud/oauth2/milestones/8/labels","id":3132283,"number":8,"title":"development","description":"","creator":{"login":"patrickjahns","id":6403243,"avatar_url":"https://avatars2.githubusercontent.com/u/6403243?v=4","gravatar_id":"","url":"https://api.github.com/users/patrickjahns","html_url":"https://github.com/patrickjahns","followers_url":"https://api.github.com/users/patrickjahns/followers","following_url":"https://api.github.com/users/patrickjahns/following{/other_user}","gists_url":"https://api.github.com/users/patrickjahns/gists{/gist_id}","starred_url":"https://api.github.com/users/patrickjahns/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/patrickjahns/subscriptions","organizations_url":"https://api.github.com/users/patrickjahns/orgs","repos_url":"https://api.github.com/users/patrickjahns/repos","events_url":"https://api.github.com/users/patrickjahns/events{/privacy}","received_events_url":"https://api.github.com/users/patrickjahns/received_events","type":"User","site_admin":false},"open_issues":2,"closed_issues":0,"state":"open","created_at":"2018-02-21T08:53:21Z","updated_at":"2018-05-03T20:24:53Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/owncloud/oauth2/pulls/132/commits","review_comments_url":"https://api.github.com/repos/owncloud/oauth2/pulls/132/comments","review_comment_url":"https://api.github.com/repos/owncloud/oauth2/pulls/comments{/number}","comments_url":"https://api.github.com/repos/owncloud/oauth2/issues/132/comments","statuses_url":"https://api.github.com/repos/owncloud/oauth2/statuses/3066fdda3e769e604109ead8552bac40104f4371","head":{"label":"owncloud:acceptance-tests","ref":"acceptance-tests","sha":"3066fdda3e769e604109ead8552bac40104f4371","user":{"login":"owncloud","id":1645051,"avatar_url":"https://avatars3.githubusercontent.com/u/1645051?v=4","gravatar_id":"","url":"https://api.github.com/users/owncloud","html_url":"https://github.com/owncloud","followers_url":"https://api.github.com/users/owncloud/followers","following_url":"https://api.github.com/users/owncloud/following{/other_user}","gists_url":"https://api.github.com/users/owncloud/gists{/gist_id}","starred_url":"https://api.github.com/users/owncloud/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/owncloud/subscriptions","organizations_url":"https://api.github.com/users/owncloud/orgs","repos_url":"https://api.github.com/users/owncloud/repos","events_url":"https://api.github.com/users/owncloud/events{/privacy}","received_events_url":"https://api.github.com/users/owncloud/received_events","type":"Organization","site_admin":false},"repo":{"id":73076742,"name":"oauth2","full_name":"owncloud/oauth2","owner":{"login":"owncloud","id":1645051,"avatar_url":"https://avatars3.githubusercontent.com/u/1645051?v=4","gravatar_id":"","url":"https://api.github.com/users/owncloud","html_url":"https://github.com/owncloud","followers_url":"https://api.github.com/users/owncloud/followers","following_url":"https://api.github.com/users/owncloud/following{/other_user}","gists_url":"https://api.github.com/users/owncloud/gists{/gist_id}","starred_url":"https://api.github.com/users/owncloud/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/owncloud/subscriptions","organizations_url":"https://api.github.com/users/owncloud/orgs","repos_url":"https://api.github.com/users/owncloud/repos","events_url":"https://api.github.com/users/owncloud/events{/privacy}","received_events_url":"https://api.github.com/users/owncloud/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/owncloud/oauth2","description":"🔐  Application for using OAuth 2.0 in ownCloud","fork":false,"url":"https://api.github.com/repos/owncloud/oauth2","forks_url":"https://api.github.com/repos/owncloud/oauth2/forks","keys_url":"https://api.github.com/repos/owncloud/oauth2/keys{/key_id}","collaborators_url":"https://api.github.com/repos/owncloud/oauth2/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/owncloud/oauth2/teams","hooks_url":"https://api.github.com/repos/owncloud/oauth2/hooks","issue_events_url":"https://api.github.com/repos/owncloud/oauth2/issues/events{/number}","events_url":"https://api.github.com/repos/owncloud/oauth2/events","assignees_url":"https://api.github.com/repos/owncloud/oauth2/assignees{/user}","branches_url":"https://api.github.com/repos/owncloud/oauth2/branches{/branch}","tags_url":"https://api.github.com/repos/owncloud/oauth2/tags","blobs_url":"https://api.github.com/repos/owncloud/oauth2/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/owncloud/oauth2/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/owncloud/oauth2/git/refs{/sha}","trees_url":"https://api.github.com/repos/owncloud/oauth2/git/trees{/sha}","statuses_url":"https://api.github.com/repos/owncloud/oauth2/statuses/{sha}","languages_url":"https://api.github.com/repos/owncloud/oauth2/languages","stargazers_url":"https://api.github.com/repos/owncloud/oauth2/stargazers","contributors_url":"https://api.github.com/repos/owncloud/oauth2/contributors","subscribers_url":"https://api.github.com/repos/owncloud/oauth2/subscribers","subscription_url":"https://api.github.com/repos/owncloud/oauth2/subscription","commits_url":"https://api.github.com/repos/owncloud/oauth2/commits{/sha}","git_commits_url":"https://api.github.com/repos/owncloud/oauth2/git/commits{/sha}","comments_url":"https://api.github.com/repos/owncloud/oauth2/comments{/number}","issue_comment_url":"https://api.github.com/repos/owncloud/oauth2/issues/comments{/number}","contents_url":"https://api.github.com/repos/owncloud/oauth2/contents/{+path}","compare_url":"https://api.github.com/repos/owncloud/oauth2/compare/{base}...{head}","merges_url":"https://api.github.com/repos/owncloud/oauth2/merges","archive_url":"https://api.github.com/repos/owncloud/oauth2/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/owncloud/oauth2/downloads","issues_url":"https://api.github.com/repos/owncloud/oauth2/issues{/number}","pulls_url":"https://api.github.com/repos/owncloud/oauth2/pulls{/number}","milestones_url":"https://api.github.com/repos/owncloud/oauth2/milestones{/number}","notifications_url":"https://api.github.com/repos/owncloud/oauth2/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/owncloud/oauth2/labels{/name}","releases_url":"https://api.github.com/repos/owncloud/oauth2/releases{/id}","deployments_url":"https://api.github.com/repos/owncloud/oauth2/deployments","created_at":"2016-11-07T12:35:17Z","updated_at":"2018-04-21T01:44:23Z","pushed_at":"2018-05-03T20:50:33Z","git_url":"git://github.com/owncloud/oauth2.git","ssh_url":"git@github.com:owncloud/oauth2.git","clone_url":"https://github.com/owncloud/oauth2.git","svn_url":"https://github.com/owncloud/oauth2","homepage":"","size":528,"stargazers_count":15,"watchers_count":15,"language":"PHP","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":10,"mirror_url":null,"archived":false,"open_issues_count":25,"license":{"key":"agpl-3.0","name":"GNU Affero General Public License v3.0","spdx_id":"AGPL-3.0","url":"https://api.github.com/licenses/agpl-3.0"},"forks":10,"open_issues":25,"watchers":15,"default_branch":"master"}},"base":{"label":"owncloud:master","ref":"master","sha":"eed04cbe1ef14289989ae91faf0a46ed64bbab26","user":{"login":"owncloud","id":1645051,"avatar_url":"https://avatars3.githubusercontent.com/u/1645051?v=4","gravatar_id":"","url":"https://api.github.com/users/owncloud","html_url":"https://github.com/owncloud","followers_url":"https://api.github.com/users/owncloud/followers","following_url":"https://api.github.com/users/owncloud/following{/other_user}","gists_url":"https://api.github.com/users/owncloud/gists{/gist_id}","starred_url":"https://api.github.com/users/owncloud/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/owncloud/subscriptions","organizations_url":"https://api.github.com/users/owncloud/orgs","repos_url":"https://api.github.com/users/owncloud/repos","events_url":"https://api.github.com/users/owncloud/events{/privacy}","received_events_url":"https://api.github.com/users/owncloud/received_events","type":"Organization","site_admin":false},"repo":{"id":73076742,"name":"oauth2","full_name":"owncloud/oauth2","owner":{"login":"owncloud","id":1645051,"avatar_url":"https://avatars3.githubusercontent.com/u/1645051?v=4","gravatar_id":"","url":"https://api.github.com/users/owncloud","html_url":"https://github.com/owncloud","followers_url":"https://api.github.com/users/owncloud/followers","following_url":"https://api.github.com/users/owncloud/following{/other_user}","gists_url":"https://api.github.com/users/owncloud/gists{/gist_id}","starred_url":"https://api.github.com/users/owncloud/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/owncloud/subscriptions","organizations_url":"https://api.github.com/users/owncloud/orgs","repos_url":"https://api.github.com/users/owncloud/repos","events_url":"https://api.github.com/users/owncloud/events{/privacy}","received_events_url":"https://api.github.com/users/owncloud/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/owncloud/oauth2","description":"🔐  Application for using OAuth 2.0 in ownCloud","fork":false,"url":"https://api.github.com/repos/owncloud/oauth2","forks_url":"https://api.github.com/repos/owncloud/oauth2/forks","keys_url":"https://api.github.com/repos/owncloud/oauth2/keys{/key_id}","collaborators_url":"https://api.github.com/repos/owncloud/oauth2/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/owncloud/oauth2/teams","hooks_url":"https://api.github.com/repos/owncloud/oauth2/hooks","issue_events_url":"https://api.github.com/repos/owncloud/oauth2/issues/events{/number}","events_url":"https://api.github.com/repos/owncloud/oauth2/events","assignees_url":"https://api.github.com/repos/owncloud/oauth2/assignees{/user}","branches_url":"https://api.github.com/repos/owncloud/oauth2/branches{/branch}","tags_url":"https://api.github.com/repos/owncloud/oauth2/tags","blobs_url":"https://api.github.com/repos/owncloud/oauth2/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/owncloud/oauth2/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/owncloud/oauth2/git/refs{/sha}","trees_url":"https://api.github.com/repos/owncloud/oauth2/git/trees{/sha}","statuses_url":"https://api.github.com/repos/owncloud/oauth2/statuses/{sha}","languages_url":"https://api.github.com/repos/owncloud/oauth2/languages","stargazers_url":"https://api.github.com/repos/owncloud/oauth2/stargazers","contributors_url":"https://api.github.com/repos/owncloud/oauth2/contributors","subscribers_url":"https://api.github.com/repos/owncloud/oauth2/subscribers","subscription_url":"https://api.github.com/repos/owncloud/oauth2/subscription","commits_url":"https://api.github.com/repos/owncloud/oauth2/commits{/sha}","git_commits_url":"https://api.github.com/repos/owncloud/oauth2/git/commits{/sha}","comments_url":"https://api.github.com/repos/owncloud/oauth2/comments{/number}","issue_comment_url":"https://api.github.com/repos/owncloud/oauth2/issues/comments{/number}","contents_url":"https://api.github.com/repos/owncloud/oauth2/contents/{+path}","compare_url":"https://api.github.com/repos/owncloud/oauth2/compare/{base}...{head}","merges_url":"https://api.github.com/repos/owncloud/oauth2/merges","archive_url":"https://api.github.com/repos/owncloud/oauth2/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/owncloud/oauth2/downloads","issues_url":"https://api.github.com/repos/owncloud/oauth2/issues{/number}","pulls_url":"https://api.github.com/repos/owncloud/oauth2/pulls{/number}","milestones_url":"https://api.github.com/repos/owncloud/oauth2/milestones{/number}","notifications_url":"https://api.github.com/repos/owncloud/oauth2/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/owncloud/oauth2/labels{/name}","releases_url":"https://api.github.com/repos/owncloud/oauth2/releases{/id}","deployments_url":"https://api.github.com/repos/owncloud/oauth2/deployments","created_at":"2016-11-07T12:35:17Z","updated_at":"2018-04-21T01:44:23Z","pushed_at":"2018-05-03T20:50:33Z","git_url":"git://github.com/owncloud/oauth2.git","ssh_url":"git@github.com:owncloud/oauth2.git","clone_url":"https://github.com/owncloud/oauth2.git","svn_url":"https://github.com/owncloud/oauth2","homepage":"","size":528,"stargazers_count":15,"watchers_count":15,"language":"PHP","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":10,"mirror_url":null,"archived":false,"open_issues_count":25,"license":{"key":"agpl-3.0","name":"GNU Affero General Public License v3.0","spdx_id":"AGPL-3.0","url":"https://api.github.com/licenses/agpl-3.0"},"forks":10,"open_issues":25,"watchers":15,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/owncloud/oauth2/pulls/132"},"html":{"href":"https://github.com/owncloud/oauth2/pull/132"},"issue":{"href":"https://api.github.com/repos/owncloud/oauth2/issues/132"},"comments":{"href":"https://api.github.com/repos/owncloud/oauth2/issues/132/comments"},"review_comments":{"href":"https://api.github.com/repos/owncloud/oauth2/pulls/132/comments"},"review_comment":{"href":"https://api.github.com/repos/owncloud/oauth2/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/owncloud/oauth2/pulls/132/commits"},"statuses":{"href":"https://api.github.com/repos/owncloud/oauth2/statuses/3066fdda3e769e604109ead8552bac40104f4371"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"phil-davis"}}