{"action":"created","comment":{"url":"https://api.github.com/repos/shaarli/Shaarli/pulls/comments/188878661","pull_request_review_id":120942898,"id":188878661,"diff_hunk":"@@ -1,27 +1,130 @@\n <?php\n-namespace Shaarli;\n+namespace Shaarli\\Security;\n+\n+use Shaarli\\Config\\ConfigManager;\n \n /**\n  * User login management\n  */\n class LoginManager","path":"application/security/LoginManager.php","position":null,"original_position":10,"commit_id":"34e0e4c68eaafe27b0437f1ad80123dfc7350ab5","original_commit_id":"e83b9e14bc28276f1a5ff67fcac9b471206bd7cd","user":{"login":"virtualtam","id":1615162,"avatar_url":"https://avatars2.githubusercontent.com/u/1615162?v=4","gravatar_id":"","url":"https://api.github.com/users/virtualtam","html_url":"https://github.com/virtualtam","followers_url":"https://api.github.com/users/virtualtam/followers","following_url":"https://api.github.com/users/virtualtam/following{/other_user}","gists_url":"https://api.github.com/users/virtualtam/gists{/gist_id}","starred_url":"https://api.github.com/users/virtualtam/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/virtualtam/subscriptions","organizations_url":"https://api.github.com/users/virtualtam/orgs","repos_url":"https://api.github.com/users/virtualtam/repos","events_url":"https://api.github.com/users/virtualtam/events{/privacy}","received_events_url":"https://api.github.com/users/virtualtam/received_events","type":"User","site_admin":false},"body":"Crap, I completely missed this comment! I'll fix the corresponding code and add tests for this use case ;-)","created_at":"2018-05-17T08:37:14Z","updated_at":"2018-05-17T08:37:15Z","html_url":"https://github.com/shaarli/Shaarli/pull/1086#discussion_r188878661","pull_request_url":"https://api.github.com/repos/shaarli/Shaarli/pulls/1086","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/shaarli/Shaarli/pulls/comments/188878661"},"html":{"href":"https://github.com/shaarli/Shaarli/pull/1086#discussion_r188878661"},"pull_request":{"href":"https://api.github.com/repos/shaarli/Shaarli/pulls/1086"}},"in_reply_to_id":186287717},"pull_request":{"url":"https://api.github.com/repos/shaarli/Shaarli/pulls/1086","id":169840673,"html_url":"https://github.com/shaarli/Shaarli/pull/1086","diff_url":"https://github.com/shaarli/Shaarli/pull/1086.diff","patch_url":"https://github.com/shaarli/Shaarli/pull/1086.patch","issue_url":"https://api.github.com/repos/shaarli/Shaarli/issues/1086","number":1086,"state":"open","locked":false,"title":"Refactor user login and session management","user":{"login":"virtualtam","id":1615162,"avatar_url":"https://avatars2.githubusercontent.com/u/1615162?v=4","gravatar_id":"","url":"https://api.github.com/users/virtualtam","html_url":"https://github.com/virtualtam","followers_url":"https://api.github.com/users/virtualtam/followers","following_url":"https://api.github.com/users/virtualtam/following{/other_user}","gists_url":"https://api.github.com/users/virtualtam/gists{/gist_id}","starred_url":"https://api.github.com/users/virtualtam/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/virtualtam/subscriptions","organizations_url":"https://api.github.com/users/virtualtam/orgs","repos_url":"https://api.github.com/users/virtualtam/repos","events_url":"https://api.github.com/users/virtualtam/events{/privacy}","received_events_url":"https://api.github.com/users/virtualtam/received_events","type":"User","site_admin":false},"body":"This is the second step towards refactoring the login and session system (see #1008), and makes room for future improvements: login/logout/session management is currently mixed up between `LoginManager` and `SessionManager`, with `ConfigManager` acting as a data backend.\r\n\r\nDespite the PR being in progress, feel free to comment (esp. on variable and method naming) and suggest improvements!\r\n\r\n## PR scope\r\n### Changed\r\n- Refactored functions:\r\n    - `allIPs()` => `client_ip_id`\r\n    - `fillSessionInfo()` => `SessionManager->storeLoginInfo()`\r\n    - `setup_login_state()` => `LoginManager->checkLoginState()`\r\n    - `check_auth()` = > `LoginManager->checkCredentials()`\r\n- group security features under the `Shaarli\\Security` namespace\r\n- refactor session and cookie duration mechanism (aka `staySignedIn`, `longlastingsession`)\r\n- refactor user stay-signed-in token management\r\n- inject `$isLoggedIn` state to `PageBuilder`, set the `$is_logged_in` template variable\r\n- update templates to use `$is_logged_in` instead of the global `isLoggedIn()`\r\n- add an adapter `isLoggedIn()` function to ensure compatibility with 3rd-party templates\r\n\r\n### Added\r\n- test coverage for `SessionManager`\r\n\r\n### Removed\r\n- unused `SessionManager` UID (see commit message for removal details)\r\n\r\n### WIP:\r\n- test coverage for `LoginManager`\r\n\r\n## Future work\r\n### Separation of concerns\r\n- move the IP ban management to a dedicated class\r\n- add `get()` and `set()` methods to `SessionManager` to wrap `$_SESSION[...]` operations\r\n- move `storeLoginInfo()` and `logout()` logic from `SessionManager` to `LoginManager`\r\n\r\n### Security\r\n- use safe hashing functions and comparison operators for all hashes and passwords:\r\n    - [password_hash](https://secure.php.net/manual/en/function.password-hash.php)\r\n    - [password_verify](https://secure.php.net/manual/en/function.password-verify.php)\r\n    - [rfc:timing_attack](https://wiki.php.net/rfc/timing_attack)\r\n    - [rfc:deprecate-uniqid](https://wiki.php.net/rfc/deprecate-uniqid)\r\n- refactor the logic behind open-shaarli as it bypasses login checks in a non-(obvious|expected) way\r\n\r\n### Improvements\r\n- add `ConfigManager->isConfigured()` to check if the user has setup Shaarli\r\n- review the session extension mechanism\r\n- review the stay-signed-in mechanism","created_at":"2018-02-18T17:32:45Z","updated_at":"2018-05-17T08:37:15Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b7deaeefedc70e59d4bf1c74cee7e87e4bb310ea","assignee":{"login":"virtualtam","id":1615162,"avatar_url":"https://avatars2.githubusercontent.com/u/1615162?v=4","gravatar_id":"","url":"https://api.github.com/users/virtualtam","html_url":"https://github.com/virtualtam","followers_url":"https://api.github.com/users/virtualtam/followers","following_url":"https://api.github.com/users/virtualtam/following{/other_user}","gists_url":"https://api.github.com/users/virtualtam/gists{/gist_id}","starred_url":"https://api.github.com/users/virtualtam/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/virtualtam/subscriptions","organizations_url":"https://api.github.com/users/virtualtam/orgs","repos_url":"https://api.github.com/users/virtualtam/repos","events_url":"https://api.github.com/users/virtualtam/events{/privacy}","received_events_url":"https://api.github.com/users/virtualtam/received_events","type":"User","site_admin":false},"assignees":[{"login":"virtualtam","id":1615162,"avatar_url":"https://avatars2.githubusercontent.com/u/1615162?v=4","gravatar_id":"","url":"https://api.github.com/users/virtualtam","html_url":"https://github.com/virtualtam","followers_url":"https://api.github.com/users/virtualtam/followers","following_url":"https://api.github.com/users/virtualtam/following{/other_user}","gists_url":"https://api.github.com/users/virtualtam/gists{/gist_id}","starred_url":"https://api.github.com/users/virtualtam/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/virtualtam/subscriptions","organizations_url":"https://api.github.com/users/virtualtam/orgs","repos_url":"https://api.github.com/users/virtualtam/repos","events_url":"https://api.github.com/users/virtualtam/events{/privacy}","received_events_url":"https://api.github.com/users/virtualtam/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"nodiscc","id":3950390,"avatar_url":"https://avatars2.githubusercontent.com/u/3950390?v=4","gravatar_id":"","url":"https://api.github.com/users/nodiscc","html_url":"https://github.com/nodiscc","followers_url":"https://api.github.com/users/nodiscc/followers","following_url":"https://api.github.com/users/nodiscc/following{/other_user}","gists_url":"https://api.github.com/users/nodiscc/gists{/gist_id}","starred_url":"https://api.github.com/users/nodiscc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nodiscc/subscriptions","organizations_url":"https://api.github.com/users/nodiscc/orgs","repos_url":"https://api.github.com/users/nodiscc/repos","events_url":"https://api.github.com/users/nodiscc/events{/privacy}","received_events_url":"https://api.github.com/users/nodiscc/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":144877340,"url":"https://api.github.com/repos/shaarli/Shaarli/labels/cleanup","name":"cleanup","color":"aff5Af","default":false},{"id":117161515,"url":"https://api.github.com/repos/shaarli/Shaarli/labels/enhancement","name":"enhancement","color":"84b6eb","default":true},{"id":248160301,"url":"https://api.github.com/repos/shaarli/Shaarli/labels/in%20review","name":"in review","color":"5319e7","default":false},{"id":158997542,"url":"https://api.github.com/repos/shaarli/Shaarli/labels/please%20test","name":"please test","color":"bfe5bf","default":false},{"id":144867542,"url":"https://api.github.com/repos/shaarli/Shaarli/labels/security","name":"security","color":"111111","default":false},{"id":235130287,"url":"https://api.github.com/repos/shaarli/Shaarli/labels/template","name":"template","color":"fef2c0","default":false}],"milestone":{"url":"https://api.github.com/repos/shaarli/Shaarli/milestones/1","html_url":"https://github.com/shaarli/Shaarli/milestone/1","labels_url":"https://api.github.com/repos/shaarli/Shaarli/milestones/1/labels","id":887186,"number":1,"title":"0.10.0","description":"","creator":{"login":"nodiscc","id":3950390,"avatar_url":"https://avatars2.githubusercontent.com/u/3950390?v=4","gravatar_id":"","url":"https://api.github.com/users/nodiscc","html_url":"https://github.com/nodiscc","followers_url":"https://api.github.com/users/nodiscc/followers","following_url":"https://api.github.com/users/nodiscc/following{/other_user}","gists_url":"https://api.github.com/users/nodiscc/gists{/gist_id}","starred_url":"https://api.github.com/users/nodiscc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nodiscc/subscriptions","organizations_url":"https://api.github.com/users/nodiscc/orgs","repos_url":"https://api.github.com/users/nodiscc/repos","events_url":"https://api.github.com/users/nodiscc/events{/privacy}","received_events_url":"https://api.github.com/users/nodiscc/received_events","type":"User","site_admin":false},"open_issues":16,"closed_issues":60,"state":"open","created_at":"2014-12-02T00:07:31Z","updated_at":"2018-05-17T07:19:13Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/shaarli/Shaarli/pulls/1086/commits","review_comments_url":"https://api.github.com/repos/shaarli/Shaarli/pulls/1086/comments","review_comment_url":"https://api.github.com/repos/shaarli/Shaarli/pulls/comments{/number}","comments_url":"https://api.github.com/repos/shaarli/Shaarli/issues/1086/comments","statuses_url":"https://api.github.com/repos/shaarli/Shaarli/statuses/34e0e4c68eaafe27b0437f1ad80123dfc7350ab5","head":{"label":"virtualtam:refactor/login","ref":"refactor/login","sha":"34e0e4c68eaafe27b0437f1ad80123dfc7350ab5","user":{"login":"virtualtam","id":1615162,"avatar_url":"https://avatars2.githubusercontent.com/u/1615162?v=4","gravatar_id":"","url":"https://api.github.com/users/virtualtam","html_url":"https://github.com/virtualtam","followers_url":"https://api.github.com/users/virtualtam/followers","following_url":"https://api.github.com/users/virtualtam/following{/other_user}","gists_url":"https://api.github.com/users/virtualtam/gists{/gist_id}","starred_url":"https://api.github.com/users/virtualtam/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/virtualtam/subscriptions","organizations_url":"https://api.github.com/users/virtualtam/orgs","repos_url":"https://api.github.com/users/virtualtam/repos","events_url":"https://api.github.com/users/virtualtam/events{/privacy}","received_events_url":"https://api.github.com/users/virtualtam/received_events","type":"User","site_admin":false},"repo":{"id":25399689,"name":"Shaarli","full_name":"virtualtam/Shaarli","owner":{"login":"virtualtam","id":1615162,"avatar_url":"https://avatars2.githubusercontent.com/u/1615162?v=4","gravatar_id":"","url":"https://api.github.com/users/virtualtam","html_url":"https://github.com/virtualtam","followers_url":"https://api.github.com/users/virtualtam/followers","following_url":"https://api.github.com/users/virtualtam/following{/other_user}","gists_url":"https://api.github.com/users/virtualtam/gists{/gist_id}","starred_url":"https://api.github.com/users/virtualtam/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/virtualtam/subscriptions","organizations_url":"https://api.github.com/users/virtualtam/orgs","repos_url":"https://api.github.com/users/virtualtam/repos","events_url":"https://api.github.com/users/virtualtam/events{/privacy}","received_events_url":"https://api.github.com/users/virtualtam/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/virtualtam/Shaarli","description":"The personal, minimalist, super-fast, no-database delicious clone - community repo","fork":true,"url":"https://api.github.com/repos/virtualtam/Shaarli","forks_url":"https://api.github.com/repos/virtualtam/Shaarli/forks","keys_url":"https://api.github.com/repos/virtualtam/Shaarli/keys{/key_id}","collaborators_url":"https://api.github.com/repos/virtualtam/Shaarli/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/virtualtam/Shaarli/teams","hooks_url":"https://api.github.com/repos/virtualtam/Shaarli/hooks","issue_events_url":"https://api.github.com/repos/virtualtam/Shaarli/issues/events{/number}","events_url":"https://api.github.com/repos/virtualtam/Shaarli/events","assignees_url":"https://api.github.com/repos/virtualtam/Shaarli/assignees{/user}","branches_url":"https://api.github.com/repos/virtualtam/Shaarli/branches{/branch}","tags_url":"https://api.github.com/repos/virtualtam/Shaarli/tags","blobs_url":"https://api.github.com/repos/virtualtam/Shaarli/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/virtualtam/Shaarli/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/virtualtam/Shaarli/git/refs{/sha}","trees_url":"https://api.github.com/repos/virtualtam/Shaarli/git/trees{/sha}","statuses_url":"https://api.github.com/repos/virtualtam/Shaarli/statuses/{sha}","languages_url":"https://api.github.com/repos/virtualtam/Shaarli/languages","stargazers_url":"https://api.github.com/repos/virtualtam/Shaarli/stargazers","contributors_url":"https://api.github.com/repos/virtualtam/Shaarli/contributors","subscribers_url":"https://api.github.com/repos/virtualtam/Shaarli/subscribers","subscription_url":"https://api.github.com/repos/virtualtam/Shaarli/subscription","commits_url":"https://api.github.com/repos/virtualtam/Shaarli/commits{/sha}","git_commits_url":"https://api.github.com/repos/virtualtam/Shaarli/git/commits{/sha}","comments_url":"https://api.github.com/repos/virtualtam/Shaarli/comments{/number}","issue_comment_url":"https://api.github.com/repos/virtualtam/Shaarli/issues/comments{/number}","contents_url":"https://api.github.com/repos/virtualtam/Shaarli/contents/{+path}","compare_url":"https://api.github.com/repos/virtualtam/Shaarli/compare/{base}...{head}","merges_url":"https://api.github.com/repos/virtualtam/Shaarli/merges","archive_url":"https://api.github.com/repos/virtualtam/Shaarli/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/virtualtam/Shaarli/downloads","issues_url":"https://api.github.com/repos/virtualtam/Shaarli/issues{/number}","pulls_url":"https://api.github.com/repos/virtualtam/Shaarli/pulls{/number}","milestones_url":"https://api.github.com/repos/virtualtam/Shaarli/milestones{/number}","notifications_url":"https://api.github.com/repos/virtualtam/Shaarli/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/virtualtam/Shaarli/labels{/name}","releases_url":"https://api.github.com/repos/virtualtam/Shaarli/releases{/id}","deployments_url":"https://api.github.com/repos/virtualtam/Shaarli/deployments","created_at":"2014-10-18T14:31:48Z","updated_at":"2018-05-06T12:21:28Z","pushed_at":"2018-05-13T15:09:17Z","git_url":"git://github.com/virtualtam/Shaarli.git","ssh_url":"git@github.com:virtualtam/Shaarli.git","clone_url":"https://github.com/virtualtam/Shaarli.git","svn_url":"https://github.com/virtualtam/Shaarli","homepage":"http://sebsauvage.net/wiki/doku.php?id=php:shaarli","size":5841,"stargazers_count":0,"watchers_count":0,"language":"PHP","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"shaarli:master","ref":"master","sha":"73c5af594c7853e20c453749ed71b93f02595766","user":{"login":"shaarli","id":8275533,"avatar_url":"https://avatars3.githubusercontent.com/u/8275533?v=4","gravatar_id":"","url":"https://api.github.com/users/shaarli","html_url":"https://github.com/shaarli","followers_url":"https://api.github.com/users/shaarli/followers","following_url":"https://api.github.com/users/shaarli/following{/other_user}","gists_url":"https://api.github.com/users/shaarli/gists{/gist_id}","starred_url":"https://api.github.com/users/shaarli/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/shaarli/subscriptions","organizations_url":"https://api.github.com/users/shaarli/orgs","repos_url":"https://api.github.com/users/shaarli/repos","events_url":"https://api.github.com/users/shaarli/events{/privacy}","received_events_url":"https://api.github.com/users/shaarli/received_events","type":"Organization","site_admin":false},"repo":{"id":22287975,"name":"Shaarli","full_name":"shaarli/Shaarli","owner":{"login":"shaarli","id":8275533,"avatar_url":"https://avatars3.githubusercontent.com/u/8275533?v=4","gravatar_id":"","url":"https://api.github.com/users/shaarli","html_url":"https://github.com/shaarli","followers_url":"https://api.github.com/users/shaarli/followers","following_url":"https://api.github.com/users/shaarli/following{/other_user}","gists_url":"https://api.github.com/users/shaarli/gists{/gist_id}","starred_url":"https://api.github.com/users/shaarli/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/shaarli/subscriptions","organizations_url":"https://api.github.com/users/shaarli/orgs","repos_url":"https://api.github.com/users/shaarli/repos","events_url":"https://api.github.com/users/shaarli/events{/privacy}","received_events_url":"https://api.github.com/users/shaarli/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/shaarli/Shaarli","description":"The personal, minimalist, super-fast, database free, bookmarking service - community repo","fork":true,"url":"https://api.github.com/repos/shaarli/Shaarli","forks_url":"https://api.github.com/repos/shaarli/Shaarli/forks","keys_url":"https://api.github.com/repos/shaarli/Shaarli/keys{/key_id}","collaborators_url":"https://api.github.com/repos/shaarli/Shaarli/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/shaarli/Shaarli/teams","hooks_url":"https://api.github.com/repos/shaarli/Shaarli/hooks","issue_events_url":"https://api.github.com/repos/shaarli/Shaarli/issues/events{/number}","events_url":"https://api.github.com/repos/shaarli/Shaarli/events","assignees_url":"https://api.github.com/repos/shaarli/Shaarli/assignees{/user}","branches_url":"https://api.github.com/repos/shaarli/Shaarli/branches{/branch}","tags_url":"https://api.github.com/repos/shaarli/Shaarli/tags","blobs_url":"https://api.github.com/repos/shaarli/Shaarli/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/shaarli/Shaarli/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/shaarli/Shaarli/git/refs{/sha}","trees_url":"https://api.github.com/repos/shaarli/Shaarli/git/trees{/sha}","statuses_url":"https://api.github.com/repos/shaarli/Shaarli/statuses/{sha}","languages_url":"https://api.github.com/repos/shaarli/Shaarli/languages","stargazers_url":"https://api.github.com/repos/shaarli/Shaarli/stargazers","contributors_url":"https://api.github.com/repos/shaarli/Shaarli/contributors","subscribers_url":"https://api.github.com/repos/shaarli/Shaarli/subscribers","subscription_url":"https://api.github.com/repos/shaarli/Shaarli/subscription","commits_url":"https://api.github.com/repos/shaarli/Shaarli/commits{/sha}","git_commits_url":"https://api.github.com/repos/shaarli/Shaarli/git/commits{/sha}","comments_url":"https://api.github.com/repos/shaarli/Shaarli/comments{/number}","issue_comment_url":"https://api.github.com/repos/shaarli/Shaarli/issues/comments{/number}","contents_url":"https://api.github.com/repos/shaarli/Shaarli/contents/{+path}","compare_url":"https://api.github.com/repos/shaarli/Shaarli/compare/{base}...{head}","merges_url":"https://api.github.com/repos/shaarli/Shaarli/merges","archive_url":"https://api.github.com/repos/shaarli/Shaarli/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/shaarli/Shaarli/downloads","issues_url":"https://api.github.com/repos/shaarli/Shaarli/issues{/number}","pulls_url":"https://api.github.com/repos/shaarli/Shaarli/pulls{/number}","milestones_url":"https://api.github.com/repos/shaarli/Shaarli/milestones{/number}","notifications_url":"https://api.github.com/repos/shaarli/Shaarli/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/shaarli/Shaarli/labels{/name}","releases_url":"https://api.github.com/repos/shaarli/Shaarli/releases{/id}","deployments_url":"https://api.github.com/repos/shaarli/Shaarli/deployments","created_at":"2014-07-26T14:10:30Z","updated_at":"2018-05-17T07:19:16Z","pushed_at":"2018-05-17T07:19:13Z","git_url":"git://github.com/shaarli/Shaarli.git","ssh_url":"git@github.com:shaarli/Shaarli.git","clone_url":"https://github.com/shaarli/Shaarli.git","svn_url":"https://github.com/shaarli/Shaarli","homepage":"https://shaarli.readthedocs.io/","size":5932,"stargazers_count":1153,"watchers_count":1153,"language":"PHP","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":135,"mirror_url":null,"archived":false,"open_issues_count":97,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":135,"open_issues":97,"watchers":1153,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/shaarli/Shaarli/pulls/1086"},"html":{"href":"https://github.com/shaarli/Shaarli/pull/1086"},"issue":{"href":"https://api.github.com/repos/shaarli/Shaarli/issues/1086"},"comments":{"href":"https://api.github.com/repos/shaarli/Shaarli/issues/1086/comments"},"review_comments":{"href":"https://api.github.com/repos/shaarli/Shaarli/pulls/1086/comments"},"review_comment":{"href":"https://api.github.com/repos/shaarli/Shaarli/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/shaarli/Shaarli/pulls/1086/commits"},"statuses":{"href":"https://api.github.com/repos/shaarli/Shaarli/statuses/34e0e4c68eaafe27b0437f1ad80123dfc7350ab5"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"virtualtam"}}