{"action":"created","comment":{"url":"https://api.github.com/repos/mozilla/fxa-content-server/pulls/comments/200307235","pull_request_review_id":134583416,"id":200307235,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwMDMwNzIzNQ==","diff_hunk":"@@ -0,0 +1,175 @@\n+/* This Source Code Form is subject to the terms of the Mozilla Public\n+ * License, v. 2.0. If a copy of the MPL was not distributed with this\n+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n+\n+define(function (require, exports, module) {\n+  const sjcl = require('sjcl');\n+\n+  function importFxaCryptoDeriver() {\n+    return import(/* webpackChunkName: \"fxaCryptoDeriver\" */ 'fxaCryptoDeriver');\n+  }\n+\n+  const RECOVERY_KEY_VERSION = '\\x01';\n+  const ALPHABET_BASE32 = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';\n+\n+  return {\n+    /**\n+     * Generate a random base32 string of length and\n+     * prepend encryption version number.\n+     *\n+     * @param {Integer} length Length of string to generate\n+     * @returns {string}\n+     */\n+    generateRecoveryKey: function (length) {\n+      return importFxaCryptoDeriver().then((fxaCryptoDeriver) => {\n+        const jose = fxaCryptoDeriver.jose;\n+        const bytes = jose.util.randomBytes(length - 1);\n+        const code = [];\n+        for (let i = 0; i < length; i++) {\n+          code.push(ALPHABET_BASE32[bytes[i] % 32]);\n+        }\n+\n+        // Prepend version and return code\n+        return RECOVERY_KEY_VERSION + code.join('');\n+      });\n+    },\n+\n+    /**\n+     * Creates the encryption keys from the uid and recovery key. The object contains\n+     * `recoveryKeyId` which can be used to retrieve the recovery data and\n+     * `recoveryEnc` which can be used to decrypt the data.\n+     *\n+     * @param {String} uid Uid of user\n+     * @param {String} recoveryKey Base32 encoded string\n+     * @returns {Promise} A promise that will be fulfilled with the `recoveryKeyId` and `recoveryEnc`\n+     */\n+    getRecoveryEncryption: function (uid, recoveryKey) {\n+      return Promise.resolve()\n+        .then(() => {\n+          if (! uid) {\n+            throw new Error('Missing uid');\n+          }\n+\n+          if (! recoveryKey) {\n+            throw new Error('Missing recoveryKey');\n+          }\n+\n+          const km = sjcl.codec.base32.toBits(recoveryKey);\n+          const salt = sjcl.codec.hex.toBits(uid);\n+\n+          const info1 = sjcl.codec.utf8String.toBits('fxa recovery fingerprint');\n+          const info2 = sjcl.codec.utf8String.toBits('fxa recovery encrypt key');\n+\n+          const recoveryKeyIdRaw = sjcl.misc.hkdf(km, 16 * 8, salt, info1);\n+          const recoveryKeyEncRaw = sjcl.misc.hkdf(km, 32 * 8, salt, info2);\n+\n+          // Convert to hex strings for readability\n+          const recoveryKeyId = sjcl.codec.hex.fromBits(recoveryKeyIdRaw);\n+          const recoveryEnc = sjcl.codec.hex.fromBits(recoveryKeyEncRaw);\n+\n+          return {\n+            recoveryEnc,\n+            recoveryKeyId\n+          };\n+        });\n+    },\n+\n+    /**\n+     * Creates an encrypted bundle for the recovery data provided using\n+     * the recovery key id and recovery encryption.\n+     *\n+     * This encryption is based on the protocol described in\n+     *\n+     * https://github.com/mozilla/fxa-auth-server/blob/master/docs/recovery_keys.md\n+     *\n+     * @param {String} recoveryKeyId Recovery key id used in encryption\n+     * @param {String} recoveryEnc Recovery encryption used to encrypt bundle","path":"app/scripts/lib/crypto/recovery-keys.js","position":86,"original_position":86,"commit_id":"f804438a2ea9fbd5cb70aab445b18836b9c4e3ad","original_commit_id":"f804438a2ea9fbd5cb70aab445b18836b9c4e3ad","user":{"login":"shane-tomlinson","id":848085,"node_id":"MDQ6VXNlcjg0ODA4NQ==","avatar_url":"https://avatars3.githubusercontent.com/u/848085?v=4","gravatar_id":"","url":"https://api.github.com/users/shane-tomlinson","html_url":"https://github.com/shane-tomlinson","followers_url":"https://api.github.com/users/shane-tomlinson/followers","following_url":"https://api.github.com/users/shane-tomlinson/following{/other_user}","gists_url":"https://api.github.com/users/shane-tomlinson/gists{/gist_id}","starred_url":"https://api.github.com/users/shane-tomlinson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/shane-tomlinson/subscriptions","organizations_url":"https://api.github.com/users/shane-tomlinson/orgs","repos_url":"https://api.github.com/users/shane-tomlinson/repos","events_url":"https://api.github.com/users/shane-tomlinson/events{/privacy}","received_events_url":"https://api.github.com/users/shane-tomlinson/received_events","type":"User","site_admin":false},"body":"I just saw that @rfk suggested returning a JWK from `getRecoveryEncryption` so this point would be moot, `recoveryEn` would be `recoveryJWK` or similar.","created_at":"2018-07-05T10:38:38Z","updated_at":"2018-07-05T10:46:19Z","html_url":"https://github.com/mozilla/fxa-content-server/pull/6323#discussion_r200307235","pull_request_url":"https://api.github.com/repos/mozilla/fxa-content-server/pulls/6323","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/mozilla/fxa-content-server/pulls/comments/200307235"},"html":{"href":"https://github.com/mozilla/fxa-content-server/pull/6323#discussion_r200307235"},"pull_request":{"href":"https://api.github.com/repos/mozilla/fxa-content-server/pulls/6323"}},"in_reply_to_id":200300096},"pull_request":{"url":"https://api.github.com/repos/mozilla/fxa-content-server/pulls/6323","id":198443504,"node_id":"MDExOlB1bGxSZXF1ZXN0MTk4NDQzNTA0","html_url":"https://github.com/mozilla/fxa-content-server/pull/6323","diff_url":"https://github.com/mozilla/fxa-content-server/pull/6323.diff","patch_url":"https://github.com/mozilla/fxa-content-server/pull/6323.patch","issue_url":"https://api.github.com/repos/mozilla/fxa-content-server/issues/6323","number":6323,"state":"open","locked":false,"title":"feat(crypto): initial account recovery crypto","user":{"login":"vbudhram","id":1295288,"node_id":"MDQ6VXNlcjEyOTUyODg=","avatar_url":"https://avatars0.githubusercontent.com/u/1295288?v=4","gravatar_id":"","url":"https://api.github.com/users/vbudhram","html_url":"https://github.com/vbudhram","followers_url":"https://api.github.com/users/vbudhram/followers","following_url":"https://api.github.com/users/vbudhram/following{/other_user}","gists_url":"https://api.github.com/users/vbudhram/gists{/gist_id}","starred_url":"https://api.github.com/users/vbudhram/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vbudhram/subscriptions","organizations_url":"https://api.github.com/users/vbudhram/orgs","repos_url":"https://api.github.com/users/vbudhram/repos","events_url":"https://api.github.com/users/vbudhram/events{/privacy}","received_events_url":"https://api.github.com/users/vbudhram/received_events","type":"User","site_admin":false},"body":"Extracted this from https://github.com/mozilla/fxa-js-client/pull/278 since it is more efficent to use the fxa-crypto-relier here.\r\n\r\nThis also attempts to verify recovery key test vectors found in https://gist.github.com/rfk/0462fc6c81e43f2b9abbea41c479a784. Unfortunately it does not generate the same hkdf as the python script. WIP until then.\r\n\r\nConnects to https://github.com/mozilla/fxa-content-server/pull/6203","created_at":"2018-06-29T23:13:27Z","updated_at":"2018-07-05T10:46:19Z","closed_at":null,"merged_at":null,"merge_commit_sha":"aea1e68384a2579d53f9126819832bdfbad3d89b","assignee":{"login":"vbudhram","id":1295288,"node_id":"MDQ6VXNlcjEyOTUyODg=","avatar_url":"https://avatars0.githubusercontent.com/u/1295288?v=4","gravatar_id":"","url":"https://api.github.com/users/vbudhram","html_url":"https://github.com/vbudhram","followers_url":"https://api.github.com/users/vbudhram/followers","following_url":"https://api.github.com/users/vbudhram/following{/other_user}","gists_url":"https://api.github.com/users/vbudhram/gists{/gist_id}","starred_url":"https://api.github.com/users/vbudhram/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vbudhram/subscriptions","organizations_url":"https://api.github.com/users/vbudhram/orgs","repos_url":"https://api.github.com/users/vbudhram/repos","events_url":"https://api.github.com/users/vbudhram/events{/privacy}","received_events_url":"https://api.github.com/users/vbudhram/received_events","type":"User","site_admin":false},"assignees":[{"login":"vbudhram","id":1295288,"node_id":"MDQ6VXNlcjEyOTUyODg=","avatar_url":"https://avatars0.githubusercontent.com/u/1295288?v=4","gravatar_id":"","url":"https://api.github.com/users/vbudhram","html_url":"https://github.com/vbudhram","followers_url":"https://api.github.com/users/vbudhram/followers","following_url":"https://api.github.com/users/vbudhram/following{/other_user}","gists_url":"https://api.github.com/users/vbudhram/gists{/gist_id}","starred_url":"https://api.github.com/users/vbudhram/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vbudhram/subscriptions","organizations_url":"https://api.github.com/users/vbudhram/orgs","repos_url":"https://api.github.com/users/vbudhram/repos","events_url":"https://api.github.com/users/vbudhram/events{/privacy}","received_events_url":"https://api.github.com/users/vbudhram/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":968342095,"node_id":"MDU6TGFiZWw5NjgzNDIwOTU=","url":"https://api.github.com/repos/mozilla/fxa-content-server/labels/train-116","name":"train-116","color":"d4c5f9","default":false},{"id":346099260,"node_id":"MDU6TGFiZWwzNDYwOTkyNjA=","url":"https://api.github.com/repos/mozilla/fxa-content-server/labels/waffle:active","name":"waffle:active","color":"ededed","default":false}],"milestone":{"url":"https://api.github.com/repos/mozilla/fxa-content-server/milestones/141","html_url":"https://github.com/mozilla/fxa-content-server/milestone/141","labels_url":"https://api.github.com/repos/mozilla/fxa-content-server/milestones/141/labels","id":3278225,"node_id":"MDk6TWlsZXN0b25lMzI3ODIyNQ==","number":141,"title":"FxA-153: Account recovery","description":"Reduce user data loss caused by forgotten passwords by allowing the user to recover their account using a code.","creator":{"login":"shane-tomlinson","id":848085,"node_id":"MDQ6VXNlcjg0ODA4NQ==","avatar_url":"https://avatars3.githubusercontent.com/u/848085?v=4","gravatar_id":"","url":"https://api.github.com/users/shane-tomlinson","html_url":"https://github.com/shane-tomlinson","followers_url":"https://api.github.com/users/shane-tomlinson/followers","following_url":"https://api.github.com/users/shane-tomlinson/following{/other_user}","gists_url":"https://api.github.com/users/shane-tomlinson/gists{/gist_id}","starred_url":"https://api.github.com/users/shane-tomlinson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/shane-tomlinson/subscriptions","organizations_url":"https://api.github.com/users/shane-tomlinson/orgs","repos_url":"https://api.github.com/users/shane-tomlinson/repos","events_url":"https://api.github.com/users/shane-tomlinson/events{/privacy}","received_events_url":"https://api.github.com/users/shane-tomlinson/received_events","type":"User","site_admin":false},"open_issues":5,"closed_issues":0,"state":"open","created_at":"2018-04-18T14:34:21Z","updated_at":"2018-06-29T23:13:27Z","due_on":"2018-06-29T07:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/mozilla/fxa-content-server/pulls/6323/commits","review_comments_url":"https://api.github.com/repos/mozilla/fxa-content-server/pulls/6323/comments","review_comment_url":"https://api.github.com/repos/mozilla/fxa-content-server/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mozilla/fxa-content-server/issues/6323/comments","statuses_url":"https://api.github.com/repos/mozilla/fxa-content-server/statuses/f804438a2ea9fbd5cb70aab445b18836b9c4e3ad","head":{"label":"mozilla:feature.account-recovery-crypto","ref":"feature.account-recovery-crypto","sha":"f804438a2ea9fbd5cb70aab445b18836b9c4e3ad","user":{"login":"mozilla","id":131524,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzMTUyNA==","avatar_url":"https://avatars2.githubusercontent.com/u/131524?v=4","gravatar_id":"","url":"https://api.github.com/users/mozilla","html_url":"https://github.com/mozilla","followers_url":"https://api.github.com/users/mozilla/followers","following_url":"https://api.github.com/users/mozilla/following{/other_user}","gists_url":"https://api.github.com/users/mozilla/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla/subscriptions","organizations_url":"https://api.github.com/users/mozilla/orgs","repos_url":"https://api.github.com/users/mozilla/repos","events_url":"https://api.github.com/users/mozilla/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla/received_events","type":"Organization","site_admin":false},"repo":{"id":11778024,"node_id":"MDEwOlJlcG9zaXRvcnkxMTc3ODAyNA==","name":"fxa-content-server","full_name":"mozilla/fxa-content-server","owner":{"login":"mozilla","id":131524,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzMTUyNA==","avatar_url":"https://avatars2.githubusercontent.com/u/131524?v=4","gravatar_id":"","url":"https://api.github.com/users/mozilla","html_url":"https://github.com/mozilla","followers_url":"https://api.github.com/users/mozilla/followers","following_url":"https://api.github.com/users/mozilla/following{/other_user}","gists_url":"https://api.github.com/users/mozilla/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla/subscriptions","organizations_url":"https://api.github.com/users/mozilla/orgs","repos_url":"https://api.github.com/users/mozilla/repos","events_url":"https://api.github.com/users/mozilla/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mozilla/fxa-content-server","description":"Firefox Accounts Content Server","fork":false,"url":"https://api.github.com/repos/mozilla/fxa-content-server","forks_url":"https://api.github.com/repos/mozilla/fxa-content-server/forks","keys_url":"https://api.github.com/repos/mozilla/fxa-content-server/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mozilla/fxa-content-server/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mozilla/fxa-content-server/teams","hooks_url":"https://api.github.com/repos/mozilla/fxa-content-server/hooks","issue_events_url":"https://api.github.com/repos/mozilla/fxa-content-server/issues/events{/number}","events_url":"https://api.github.com/repos/mozilla/fxa-content-server/events","assignees_url":"https://api.github.com/repos/mozilla/fxa-content-server/assignees{/user}","branches_url":"https://api.github.com/repos/mozilla/fxa-content-server/branches{/branch}","tags_url":"https://api.github.com/repos/mozilla/fxa-content-server/tags","blobs_url":"https://api.github.com/repos/mozilla/fxa-content-server/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mozilla/fxa-content-server/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mozilla/fxa-content-server/git/refs{/sha}","trees_url":"https://api.github.com/repos/mozilla/fxa-content-server/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mozilla/fxa-content-server/statuses/{sha}","languages_url":"https://api.github.com/repos/mozilla/fxa-content-server/languages","stargazers_url":"https://api.github.com/repos/mozilla/fxa-content-server/stargazers","contributors_url":"https://api.github.com/repos/mozilla/fxa-content-server/contributors","subscribers_url":"https://api.github.com/repos/mozilla/fxa-content-server/subscribers","subscription_url":"https://api.github.com/repos/mozilla/fxa-content-server/subscription","commits_url":"https://api.github.com/repos/mozilla/fxa-content-server/commits{/sha}","git_commits_url":"https://api.github.com/repos/mozilla/fxa-content-server/git/commits{/sha}","comments_url":"https://api.github.com/repos/mozilla/fxa-content-server/comments{/number}","issue_comment_url":"https://api.github.com/repos/mozilla/fxa-content-server/issues/comments{/number}","contents_url":"https://api.github.com/repos/mozilla/fxa-content-server/contents/{+path}","compare_url":"https://api.github.com/repos/mozilla/fxa-content-server/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mozilla/fxa-content-server/merges","archive_url":"https://api.github.com/repos/mozilla/fxa-content-server/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mozilla/fxa-content-server/downloads","issues_url":"https://api.github.com/repos/mozilla/fxa-content-server/issues{/number}","pulls_url":"https://api.github.com/repos/mozilla/fxa-content-server/pulls{/number}","milestones_url":"https://api.github.com/repos/mozilla/fxa-content-server/milestones{/number}","notifications_url":"https://api.github.com/repos/mozilla/fxa-content-server/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mozilla/fxa-content-server/labels{/name}","releases_url":"https://api.github.com/repos/mozilla/fxa-content-server/releases{/id}","deployments_url":"https://api.github.com/repos/mozilla/fxa-content-server/deployments","created_at":"2013-07-30T23:35:35Z","updated_at":"2018-07-04T20:27:28Z","pushed_at":"2018-07-04T20:27:25Z","git_url":"git://github.com/mozilla/fxa-content-server.git","ssh_url":"git@github.com:mozilla/fxa-content-server.git","clone_url":"https://github.com/mozilla/fxa-content-server.git","svn_url":"https://github.com/mozilla/fxa-content-server","homepage":"","size":20839,"stargazers_count":143,"watchers_count":143,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":124,"mirror_url":null,"archived":false,"open_issues_count":159,"license":{"key":"mpl-2.0","name":"Mozilla Public License 2.0","spdx_id":"MPL-2.0","url":"https://api.github.com/licenses/mpl-2.0","node_id":"MDc6TGljZW5zZTE0"},"forks":124,"open_issues":159,"watchers":143,"default_branch":"master"}},"base":{"label":"mozilla:master","ref":"master","sha":"eb10ac87016da56422c827d32491852c0d1d3f21","user":{"login":"mozilla","id":131524,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzMTUyNA==","avatar_url":"https://avatars2.githubusercontent.com/u/131524?v=4","gravatar_id":"","url":"https://api.github.com/users/mozilla","html_url":"https://github.com/mozilla","followers_url":"https://api.github.com/users/mozilla/followers","following_url":"https://api.github.com/users/mozilla/following{/other_user}","gists_url":"https://api.github.com/users/mozilla/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla/subscriptions","organizations_url":"https://api.github.com/users/mozilla/orgs","repos_url":"https://api.github.com/users/mozilla/repos","events_url":"https://api.github.com/users/mozilla/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla/received_events","type":"Organization","site_admin":false},"repo":{"id":11778024,"node_id":"MDEwOlJlcG9zaXRvcnkxMTc3ODAyNA==","name":"fxa-content-server","full_name":"mozilla/fxa-content-server","owner":{"login":"mozilla","id":131524,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEzMTUyNA==","avatar_url":"https://avatars2.githubusercontent.com/u/131524?v=4","gravatar_id":"","url":"https://api.github.com/users/mozilla","html_url":"https://github.com/mozilla","followers_url":"https://api.github.com/users/mozilla/followers","following_url":"https://api.github.com/users/mozilla/following{/other_user}","gists_url":"https://api.github.com/users/mozilla/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla/subscriptions","organizations_url":"https://api.github.com/users/mozilla/orgs","repos_url":"https://api.github.com/users/mozilla/repos","events_url":"https://api.github.com/users/mozilla/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mozilla/fxa-content-server","description":"Firefox Accounts Content Server","fork":false,"url":"https://api.github.com/repos/mozilla/fxa-content-server","forks_url":"https://api.github.com/repos/mozilla/fxa-content-server/forks","keys_url":"https://api.github.com/repos/mozilla/fxa-content-server/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mozilla/fxa-content-server/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mozilla/fxa-content-server/teams","hooks_url":"https://api.github.com/repos/mozilla/fxa-content-server/hooks","issue_events_url":"https://api.github.com/repos/mozilla/fxa-content-server/issues/events{/number}","events_url":"https://api.github.com/repos/mozilla/fxa-content-server/events","assignees_url":"https://api.github.com/repos/mozilla/fxa-content-server/assignees{/user}","branches_url":"https://api.github.com/repos/mozilla/fxa-content-server/branches{/branch}","tags_url":"https://api.github.com/repos/mozilla/fxa-content-server/tags","blobs_url":"https://api.github.com/repos/mozilla/fxa-content-server/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mozilla/fxa-content-server/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mozilla/fxa-content-server/git/refs{/sha}","trees_url":"https://api.github.com/repos/mozilla/fxa-content-server/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mozilla/fxa-content-server/statuses/{sha}","languages_url":"https://api.github.com/repos/mozilla/fxa-content-server/languages","stargazers_url":"https://api.github.com/repos/mozilla/fxa-content-server/stargazers","contributors_url":"https://api.github.com/repos/mozilla/fxa-content-server/contributors","subscribers_url":"https://api.github.com/repos/mozilla/fxa-content-server/subscribers","subscription_url":"https://api.github.com/repos/mozilla/fxa-content-server/subscription","commits_url":"https://api.github.com/repos/mozilla/fxa-content-server/commits{/sha}","git_commits_url":"https://api.github.com/repos/mozilla/fxa-content-server/git/commits{/sha}","comments_url":"https://api.github.com/repos/mozilla/fxa-content-server/comments{/number}","issue_comment_url":"https://api.github.com/repos/mozilla/fxa-content-server/issues/comments{/number}","contents_url":"https://api.github.com/repos/mozilla/fxa-content-server/contents/{+path}","compare_url":"https://api.github.com/repos/mozilla/fxa-content-server/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mozilla/fxa-content-server/merges","archive_url":"https://api.github.com/repos/mozilla/fxa-content-server/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mozilla/fxa-content-server/downloads","issues_url":"https://api.github.com/repos/mozilla/fxa-content-server/issues{/number}","pulls_url":"https://api.github.com/repos/mozilla/fxa-content-server/pulls{/number}","milestones_url":"https://api.github.com/repos/mozilla/fxa-content-server/milestones{/number}","notifications_url":"https://api.github.com/repos/mozilla/fxa-content-server/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mozilla/fxa-content-server/labels{/name}","releases_url":"https://api.github.com/repos/mozilla/fxa-content-server/releases{/id}","deployments_url":"https://api.github.com/repos/mozilla/fxa-content-server/deployments","created_at":"2013-07-30T23:35:35Z","updated_at":"2018-07-04T20:27:28Z","pushed_at":"2018-07-04T20:27:25Z","git_url":"git://github.com/mozilla/fxa-content-server.git","ssh_url":"git@github.com:mozilla/fxa-content-server.git","clone_url":"https://github.com/mozilla/fxa-content-server.git","svn_url":"https://github.com/mozilla/fxa-content-server","homepage":"","size":20839,"stargazers_count":143,"watchers_count":143,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":124,"mirror_url":null,"archived":false,"open_issues_count":159,"license":{"key":"mpl-2.0","name":"Mozilla Public License 2.0","spdx_id":"MPL-2.0","url":"https://api.github.com/licenses/mpl-2.0","node_id":"MDc6TGljZW5zZTE0"},"forks":124,"open_issues":159,"watchers":143,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mozilla/fxa-content-server/pulls/6323"},"html":{"href":"https://github.com/mozilla/fxa-content-server/pull/6323"},"issue":{"href":"https://api.github.com/repos/mozilla/fxa-content-server/issues/6323"},"comments":{"href":"https://api.github.com/repos/mozilla/fxa-content-server/issues/6323/comments"},"review_comments":{"href":"https://api.github.com/repos/mozilla/fxa-content-server/pulls/6323/comments"},"review_comment":{"href":"https://api.github.com/repos/mozilla/fxa-content-server/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mozilla/fxa-content-server/pulls/6323/commits"},"statuses":{"href":"https://api.github.com/repos/mozilla/fxa-content-server/statuses/f804438a2ea9fbd5cb70aab445b18836b9c4e3ad"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"shane-tomlinson"}}