{"action":"created","comment":{"url":"https://api.github.com/repos/georgestephanis/two-factor/pulls/comments/36748078","id":36748078,"diff_hunk":"@@ -0,0 +1,274 @@\n+<?php\n+/**\n+ * Class for creating a backup codes provider.\n+ *\n+ * @since 0.1-dev\n+ *\n+ * @package Two_Factor\n+ */\n+class Two_Factor_Backup_Codes extends Two_Factor_Provider {\n+\n+\t/**\n+\t * The user meta backup codes key.\n+\t * @type string\n+\t */\n+\tconst BACKUP_CODES_META_KEY = '_two_factor_backup_codes';\n+\n+\t/**\n+\t * The number backup codes.\n+\t * @type int\n+\t */\n+\tconst NUMBER_OF_CODES = 10;\n+\n+\t/**\n+\t * Ensures only one instance of this class exists in memory at any one time.\n+\t *\n+\t * @since 0.1-dev\n+\t */\n+\tstatic function get_instance() {\n+\t\tstatic $instance;\n+\t\t$class = __CLASS__;\n+\t\tif ( ! is_a( $instance, $class ) ) {\n+\t\t\t$instance = new $class;\n+\t\t}\n+\t\treturn $instance;\n+\t}\n+\n+\t/**\n+\t * Class constructor.\n+\t *\n+\t * @since 0.1-dev\n+\t */\n+\tprotected function __construct() {\n+\t\tadd_action( 'two-factor-user-options-' . __CLASS__, array( $this, 'user_options' ) );\n+\t\tadd_action( 'admin_notices', array( $this, 'admin_notices' ) );\n+\t\tadd_action( 'wp_ajax_two_factor_backup_codes_generate', array( $this, 'ajax_generate_json' ) );\n+\n+\t\treturn parent::__construct();\n+\t}\n+\n+\t/**\n+\t * Displays an admin notice when backup codes have ran out.\n+\t *\n+\t * @since 0.1-dev\n+\t */\n+\tpublic static function admin_notices() {\n+\t\t// Only show this notice if we are out of backup codes.\n+\t\t$user_id = get_current_user_id();\n+\t\t$backup_codes = get_user_meta( $user_id, self::BACKUP_CODES_META_KEY, true );\n+\t\tif ( ! empty( $backup_codes ) ) {\n+\t\t\treturn;\n+\t\t}\n+\n+\t\t// Only show when the provider is enabled.\n+\t\tif ( false === Two_Factor_Backup_Codes::get_instance()->is_enabled( $user_id ) ) {\n+\t\t\treturn;\n+\t\t}\n+\t\t?>\n+\t\t<div class=\"error\">\n+\t\t\t<p><?php echo wp_kses( sprintf( __( 'Two-Factor: You are out of backup codes and need to <a href=\"%1$s#two-factor-backup-codes\" >regenerate</a>!' ), esc_url( get_edit_user_link( $user_id ) ) ), array( 'a' => array( 'href' => array() ) ) ); ?></p>\n+\t\t</div>\n+\t\t<?php\n+\t}\n+\n+\t/**\n+\t * Verify the provider is enabled.\n+\t *\n+\t * @since 0.1-dev\n+\t *\n+\t * @param int $user_id The logged-in user ID.\n+\t */\n+\tpublic function is_enabled( $user_id ) {\n+\t\t$enabled_providers = (array) get_user_meta( $user_id, Two_Factor_Core::ENABLED_PROVIDERS_USER_META_KEY, true );\n+\t\tif ( in_array( __CLASS__, $enabled_providers ) ) {\n+\t\t\treturn true;\n+\t\t}\n+\t\treturn false;\n+\t}\n+\n+\t/**\n+\t * Returns the name of the provider.\n+\t *\n+\t * @since 0.1-dev\n+\t */\n+\tpublic function get_label() {\n+\t\treturn _x( 'Backup Verification Codes (Single Use)', 'Provider Label' );\n+\t}\n+\n+\t/**\n+\t * Whether this Two Factor provider is configured and available for the user specified.\n+\t *\n+\t * @since 0.1-dev\n+\t *\n+\t * @param WP_User $user WP_User object of the logged-in user.\n+\t * @return boolean\n+\t */\n+\tpublic function is_available_for_user( $user ) {\n+\t\treturn true;\n+\t}\n+\n+\t/**\n+\t * Inserts markup at the end of the user profile field for this provider.\n+\t *\n+\t * @since 0.1-dev\n+\t *\n+\t * @param WP_User $user WP_User object of the logged-in user.\n+\t */\n+\tpublic function user_options( $user ) {\n+\t\t$user_id = $user->ID;\n+\t\t$backup_codes = get_user_meta( $user_id, self::BACKUP_CODES_META_KEY, true );\n+\t\t$ajax_nonce = wp_create_nonce( 'two-factor-backup-codes-generate-json' );\n+\t\t?>\n+\t\t<p id=\"two-factor-backup-codes\">\n+\t\t\t<button type=\"button\" class=\"button button-two-factor-backup-codes-generate button-secondary hide-if-no-js\">\n+\t\t\t\t<?php esc_html_e( 'Generate Verification Codes' ); ?>\n+\t\t\t</button>\n+\t\t\t<?php echo wp_kses( sprintf( _n( '%s unused code remaining.', '%s unused codes remaining.', count( $backup_codes ) ), '<span class=\"two-factor-backup-codes-count\">' . count( $backup_codes ) . '</span>' ), array( 'span' => array( 'class' => array() ) ) ); ?>\n+\t\t</p>\n+\t\t<div class=\"two-factor-backup-codes-wrapper\" style=\"display:none;\">\n+\t\t\t<ol class=\"two-factor-backup-codes-unused-codes\"></ol>\n+\t\t\t<p class=\"description\"><?php esc_html_e( \"Write 'em down y'all!\" ); ?></p>\n+\t\t</div>\n+\t\t<script type=\"text/javascript\">\n+\t\t\t// @todo: move this into a JS file & internationalize the count strings\n+\t\t\tjQuery( document ).ready( function( $ ) {\n+\t\t\t\t$( '.button-two-factor-backup-codes-generate' ).click( function() {\n+\t\t\t\t\tjQuery.ajax( {\n+\t\t\t\t\t\turl: ajaxurl,\n+\t\t\t\t\t\tdata: {\n+\t\t\t\t\t\t\taction: 'two_factor_backup_codes_generate',\n+\t\t\t\t\t\t\tnonce: '<?php echo esc_js( $ajax_nonce ); ?>'\n+\t\t\t\t\t\t},\n+\t\t\t\t\t\tdataType: 'JSON',\n+\t\t\t\t\t\tsuccess: function( data ) {\n+\t\t\t\t\t\t\t$( '.two-factor-backup-codes-wrapper' ).show();\n+\t\t\t\t\t\t\t$( '.two-factor-backup-codes-unused-codes' ).html( '' );\n+\t\t\t\t\t\t\t$.each( data, function( key, val ) {\n+\t\t\t\t\t\t\t\t$( '.two-factor-backup-codes-unused-codes' ).append( '<li>' + val + '</li>' );\n+\t\t\t\t\t\t\t} );\n+\t\t\t\t\t\t\t// Update counter.\n+\t\t\t\t\t\t\t$( '.two-factor-backup-codes-count' ).html( data.length );\n+\t\t\t\t\t\t},\n+\t\t\t\t\t\terror: function( errorThrown ) {\n+\t\t\t\t\t\t\talert( 'error' ); // @todo: remove for production\n+\t\t\t\t\t\t\tconsole.log( errorThrown );\n+\t\t\t\t\t\t}\n+\t\t\t\t\t} );\n+\t\t\t\t} );\n+\t\t\t} );\n+\t\t</script>\n+\t\t<?php\n+\t}\n+\n+\t/**\n+\t * Generates backup codes & updates the user meta.\n+\t *\n+\t * @since 0.1-dev\n+\t *\n+\t * @param int $user_id The logged-in user ID.\n+\t */\n+\tpublic function generate_codes( $user_id ) {\n+\t\t$codes = array();\n+\t\t$codes_hashed = array();\n+\n+\t\tfor ( $i = 0; $i < self::NUMBER_OF_CODES; $i++ ) {","path":"providers/class.two-factor-backup-codes.php","position":174,"original_position":174,"commit_id":"fb76b6a7b432b6fde5361bab551342927207258d","original_commit_id":"fb76b6a7b432b6fde5361bab551342927207258d","user":{"login":"georgestephanis","id":941023,"avatar_url":"https://avatars.githubusercontent.com/u/941023?v=3","gravatar_id":"","url":"https://api.github.com/users/georgestephanis","html_url":"https://github.com/georgestephanis","followers_url":"https://api.github.com/users/georgestephanis/followers","following_url":"https://api.github.com/users/georgestephanis/following{/other_user}","gists_url":"https://api.github.com/users/georgestephanis/gists{/gist_id}","starred_url":"https://api.github.com/users/georgestephanis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/georgestephanis/subscriptions","organizations_url":"https://api.github.com/users/georgestephanis/orgs","repos_url":"https://api.github.com/users/georgestephanis/repos","events_url":"https://api.github.com/users/georgestephanis/events{/privacy}","received_events_url":"https://api.github.com/users/georgestephanis/received_events","type":"User","site_admin":false},"body":"I almost wonder if it may be tidier to do an `array_fill()` and then `array_map()` to populate the array instead of a for loop.  Probably fine to leave as is.","created_at":"2015-08-11T14:06:12Z","updated_at":"2015-08-11T14:06:12Z","html_url":"https://github.com/georgestephanis/two-factor/pull/14#discussion_r36748078","pull_request_url":"https://api.github.com/repos/georgestephanis/two-factor/pulls/14","_links":{"self":{"href":"https://api.github.com/repos/georgestephanis/two-factor/pulls/comments/36748078"},"html":{"href":"https://github.com/georgestephanis/two-factor/pull/14#discussion_r36748078"},"pull_request":{"href":"https://api.github.com/repos/georgestephanis/two-factor/pulls/14"}}},"pull_request":{"url":"https://api.github.com/repos/georgestephanis/two-factor/pulls/14","id":41305883,"html_url":"https://github.com/georgestephanis/two-factor/pull/14","diff_url":"https://github.com/georgestephanis/two-factor/pull/14.diff","patch_url":"https://github.com/georgestephanis/two-factor/pull/14.patch","issue_url":"https://api.github.com/repos/georgestephanis/two-factor/issues/14","number":14,"state":"open","locked":false,"title":"Adds Backup Codes Provider","user":{"login":"stevenkword","id":1030598,"avatar_url":"https://avatars.githubusercontent.com/u/1030598?v=3","gravatar_id":"","url":"https://api.github.com/users/stevenkword","html_url":"https://github.com/stevenkword","followers_url":"https://api.github.com/users/stevenkword/followers","following_url":"https://api.github.com/users/stevenkword/following{/other_user}","gists_url":"https://api.github.com/users/stevenkword/gists{/gist_id}","starred_url":"https://api.github.com/users/stevenkword/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stevenkword/subscriptions","organizations_url":"https://api.github.com/users/stevenkword/orgs","repos_url":"https://api.github.com/users/stevenkword/repos","events_url":"https://api.github.com/users/stevenkword/events{/privacy}","received_events_url":"https://api.github.com/users/stevenkword/received_events","type":"User","site_admin":false},"body":"Adds the backup-codes provider to the list of potential methods.  Verification codes are single use and stored in the database as an array of hashed string.  Let me know if you have any questions.","created_at":"2015-07-31T04:10:51Z","updated_at":"2015-08-11T14:06:12Z","closed_at":null,"merged_at":null,"merge_commit_sha":"66a732664f010f0d87a797f33202ebf47ae80e90","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/georgestephanis/two-factor/pulls/14/commits","review_comments_url":"https://api.github.com/repos/georgestephanis/two-factor/pulls/14/comments","review_comment_url":"https://api.github.com/repos/georgestephanis/two-factor/pulls/comments{/number}","comments_url":"https://api.github.com/repos/georgestephanis/two-factor/issues/14/comments","statuses_url":"https://api.github.com/repos/georgestephanis/two-factor/statuses/fb76b6a7b432b6fde5361bab551342927207258d","head":{"label":"georgestephanis:backup-codes","ref":"backup-codes","sha":"fb76b6a7b432b6fde5361bab551342927207258d","user":{"login":"georgestephanis","id":941023,"avatar_url":"https://avatars.githubusercontent.com/u/941023?v=3","gravatar_id":"","url":"https://api.github.com/users/georgestephanis","html_url":"https://github.com/georgestephanis","followers_url":"https://api.github.com/users/georgestephanis/followers","following_url":"https://api.github.com/users/georgestephanis/following{/other_user}","gists_url":"https://api.github.com/users/georgestephanis/gists{/gist_id}","starred_url":"https://api.github.com/users/georgestephanis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/georgestephanis/subscriptions","organizations_url":"https://api.github.com/users/georgestephanis/orgs","repos_url":"https://api.github.com/users/georgestephanis/repos","events_url":"https://api.github.com/users/georgestephanis/events{/privacy}","received_events_url":"https://api.github.com/users/georgestephanis/received_events","type":"User","site_admin":false},"repo":{"id":25655458,"name":"two-factor","full_name":"georgestephanis/two-factor","owner":{"login":"georgestephanis","id":941023,"avatar_url":"https://avatars.githubusercontent.com/u/941023?v=3","gravatar_id":"","url":"https://api.github.com/users/georgestephanis","html_url":"https://github.com/georgestephanis","followers_url":"https://api.github.com/users/georgestephanis/followers","following_url":"https://api.github.com/users/georgestephanis/following{/other_user}","gists_url":"https://api.github.com/users/georgestephanis/gists{/gist_id}","starred_url":"https://api.github.com/users/georgestephanis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/georgestephanis/subscriptions","organizations_url":"https://api.github.com/users/georgestephanis/orgs","repos_url":"https://api.github.com/users/georgestephanis/repos","events_url":"https://api.github.com/users/georgestephanis/events{/privacy}","received_events_url":"https://api.github.com/users/georgestephanis/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/georgestephanis/two-factor","description":"Two-Factor Authentication for WordPress.","fork":false,"url":"https://api.github.com/repos/georgestephanis/two-factor","forks_url":"https://api.github.com/repos/georgestephanis/two-factor/forks","keys_url":"https://api.github.com/repos/georgestephanis/two-factor/keys{/key_id}","collaborators_url":"https://api.github.com/repos/georgestephanis/two-factor/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/georgestephanis/two-factor/teams","hooks_url":"https://api.github.com/repos/georgestephanis/two-factor/hooks","issue_events_url":"https://api.github.com/repos/georgestephanis/two-factor/issues/events{/number}","events_url":"https://api.github.com/repos/georgestephanis/two-factor/events","assignees_url":"https://api.github.com/repos/georgestephanis/two-factor/assignees{/user}","branches_url":"https://api.github.com/repos/georgestephanis/two-factor/branches{/branch}","tags_url":"https://api.github.com/repos/georgestephanis/two-factor/tags","blobs_url":"https://api.github.com/repos/georgestephanis/two-factor/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/georgestephanis/two-factor/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/georgestephanis/two-factor/git/refs{/sha}","trees_url":"https://api.github.com/repos/georgestephanis/two-factor/git/trees{/sha}","statuses_url":"https://api.github.com/repos/georgestephanis/two-factor/statuses/{sha}","languages_url":"https://api.github.com/repos/georgestephanis/two-factor/languages","stargazers_url":"https://api.github.com/repos/georgestephanis/two-factor/stargazers","contributors_url":"https://api.github.com/repos/georgestephanis/two-factor/contributors","subscribers_url":"https://api.github.com/repos/georgestephanis/two-factor/subscribers","subscription_url":"https://api.github.com/repos/georgestephanis/two-factor/subscription","commits_url":"https://api.github.com/repos/georgestephanis/two-factor/commits{/sha}","git_commits_url":"https://api.github.com/repos/georgestephanis/two-factor/git/commits{/sha}","comments_url":"https://api.github.com/repos/georgestephanis/two-factor/comments{/number}","issue_comment_url":"https://api.github.com/repos/georgestephanis/two-factor/issues/comments{/number}","contents_url":"https://api.github.com/repos/georgestephanis/two-factor/contents/{+path}","compare_url":"https://api.github.com/repos/georgestephanis/two-factor/compare/{base}...{head}","merges_url":"https://api.github.com/repos/georgestephanis/two-factor/merges","archive_url":"https://api.github.com/repos/georgestephanis/two-factor/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/georgestephanis/two-factor/downloads","issues_url":"https://api.github.com/repos/georgestephanis/two-factor/issues{/number}","pulls_url":"https://api.github.com/repos/georgestephanis/two-factor/pulls{/number}","milestones_url":"https://api.github.com/repos/georgestephanis/two-factor/milestones{/number}","notifications_url":"https://api.github.com/repos/georgestephanis/two-factor/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/georgestephanis/two-factor/labels{/name}","releases_url":"https://api.github.com/repos/georgestephanis/two-factor/releases{/id}","created_at":"2014-10-23T20:03:04Z","updated_at":"2015-08-08T03:46:30Z","pushed_at":"2015-08-11T06:16:46Z","git_url":"git://github.com/georgestephanis/two-factor.git","ssh_url":"git@github.com:georgestephanis/two-factor.git","clone_url":"https://github.com/georgestephanis/two-factor.git","svn_url":"https://github.com/georgestephanis/two-factor","homepage":"https://github.com/georgestephanis/two-factor","size":634,"stargazers_count":41,"watchers_count":41,"language":"PHP","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":13,"mirror_url":null,"open_issues_count":8,"forks":13,"open_issues":8,"watchers":41,"default_branch":"master"}},"base":{"label":"georgestephanis:master","ref":"master","sha":"d2bfdfc66e0d5f266e2d6e4d41974292278f7e8e","user":{"login":"georgestephanis","id":941023,"avatar_url":"https://avatars.githubusercontent.com/u/941023?v=3","gravatar_id":"","url":"https://api.github.com/users/georgestephanis","html_url":"https://github.com/georgestephanis","followers_url":"https://api.github.com/users/georgestephanis/followers","following_url":"https://api.github.com/users/georgestephanis/following{/other_user}","gists_url":"https://api.github.com/users/georgestephanis/gists{/gist_id}","starred_url":"https://api.github.com/users/georgestephanis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/georgestephanis/subscriptions","organizations_url":"https://api.github.com/users/georgestephanis/orgs","repos_url":"https://api.github.com/users/georgestephanis/repos","events_url":"https://api.github.com/users/georgestephanis/events{/privacy}","received_events_url":"https://api.github.com/users/georgestephanis/received_events","type":"User","site_admin":false},"repo":{"id":25655458,"name":"two-factor","full_name":"georgestephanis/two-factor","owner":{"login":"georgestephanis","id":941023,"avatar_url":"https://avatars.githubusercontent.com/u/941023?v=3","gravatar_id":"","url":"https://api.github.com/users/georgestephanis","html_url":"https://github.com/georgestephanis","followers_url":"https://api.github.com/users/georgestephanis/followers","following_url":"https://api.github.com/users/georgestephanis/following{/other_user}","gists_url":"https://api.github.com/users/georgestephanis/gists{/gist_id}","starred_url":"https://api.github.com/users/georgestephanis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/georgestephanis/subscriptions","organizations_url":"https://api.github.com/users/georgestephanis/orgs","repos_url":"https://api.github.com/users/georgestephanis/repos","events_url":"https://api.github.com/users/georgestephanis/events{/privacy}","received_events_url":"https://api.github.com/users/georgestephanis/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/georgestephanis/two-factor","description":"Two-Factor Authentication for WordPress.","fork":false,"url":"https://api.github.com/repos/georgestephanis/two-factor","forks_url":"https://api.github.com/repos/georgestephanis/two-factor/forks","keys_url":"https://api.github.com/repos/georgestephanis/two-factor/keys{/key_id}","collaborators_url":"https://api.github.com/repos/georgestephanis/two-factor/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/georgestephanis/two-factor/teams","hooks_url":"https://api.github.com/repos/georgestephanis/two-factor/hooks","issue_events_url":"https://api.github.com/repos/georgestephanis/two-factor/issues/events{/number}","events_url":"https://api.github.com/repos/georgestephanis/two-factor/events","assignees_url":"https://api.github.com/repos/georgestephanis/two-factor/assignees{/user}","branches_url":"https://api.github.com/repos/georgestephanis/two-factor/branches{/branch}","tags_url":"https://api.github.com/repos/georgestephanis/two-factor/tags","blobs_url":"https://api.github.com/repos/georgestephanis/two-factor/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/georgestephanis/two-factor/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/georgestephanis/two-factor/git/refs{/sha}","trees_url":"https://api.github.com/repos/georgestephanis/two-factor/git/trees{/sha}","statuses_url":"https://api.github.com/repos/georgestephanis/two-factor/statuses/{sha}","languages_url":"https://api.github.com/repos/georgestephanis/two-factor/languages","stargazers_url":"https://api.github.com/repos/georgestephanis/two-factor/stargazers","contributors_url":"https://api.github.com/repos/georgestephanis/two-factor/contributors","subscribers_url":"https://api.github.com/repos/georgestephanis/two-factor/subscribers","subscription_url":"https://api.github.com/repos/georgestephanis/two-factor/subscription","commits_url":"https://api.github.com/repos/georgestephanis/two-factor/commits{/sha}","git_commits_url":"https://api.github.com/repos/georgestephanis/two-factor/git/commits{/sha}","comments_url":"https://api.github.com/repos/georgestephanis/two-factor/comments{/number}","issue_comment_url":"https://api.github.com/repos/georgestephanis/two-factor/issues/comments{/number}","contents_url":"https://api.github.com/repos/georgestephanis/two-factor/contents/{+path}","compare_url":"https://api.github.com/repos/georgestephanis/two-factor/compare/{base}...{head}","merges_url":"https://api.github.com/repos/georgestephanis/two-factor/merges","archive_url":"https://api.github.com/repos/georgestephanis/two-factor/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/georgestephanis/two-factor/downloads","issues_url":"https://api.github.com/repos/georgestephanis/two-factor/issues{/number}","pulls_url":"https://api.github.com/repos/georgestephanis/two-factor/pulls{/number}","milestones_url":"https://api.github.com/repos/georgestephanis/two-factor/milestones{/number}","notifications_url":"https://api.github.com/repos/georgestephanis/two-factor/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/georgestephanis/two-factor/labels{/name}","releases_url":"https://api.github.com/repos/georgestephanis/two-factor/releases{/id}","created_at":"2014-10-23T20:03:04Z","updated_at":"2015-08-08T03:46:30Z","pushed_at":"2015-08-11T06:16:46Z","git_url":"git://github.com/georgestephanis/two-factor.git","ssh_url":"git@github.com:georgestephanis/two-factor.git","clone_url":"https://github.com/georgestephanis/two-factor.git","svn_url":"https://github.com/georgestephanis/two-factor","homepage":"https://github.com/georgestephanis/two-factor","size":634,"stargazers_count":41,"watchers_count":41,"language":"PHP","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":13,"mirror_url":null,"open_issues_count":8,"forks":13,"open_issues":8,"watchers":41,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/georgestephanis/two-factor/pulls/14"},"html":{"href":"https://github.com/georgestephanis/two-factor/pull/14"},"issue":{"href":"https://api.github.com/repos/georgestephanis/two-factor/issues/14"},"comments":{"href":"https://api.github.com/repos/georgestephanis/two-factor/issues/14/comments"},"review_comments":{"href":"https://api.github.com/repos/georgestephanis/two-factor/pulls/14/comments"},"review_comment":{"href":"https://api.github.com/repos/georgestephanis/two-factor/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/georgestephanis/two-factor/pulls/14/commits"},"statuses":{"href":"https://api.github.com/repos/georgestephanis/two-factor/statuses/fb76b6a7b432b6fde5361bab551342927207258d"}}}}