{"action":"created","comment":{"url":"https://api.github.com/repos/ceph/ceph/pulls/comments/73515631","id":73515631,"diff_hunk":"@@ -4410,3 +4298,192 @@ RGWOp* RGWHandler_REST_Service_S3Website::get_obj_op(bool get_data)\n   op->set_get_data(get_data);\n   return op;\n }\n+\n+bool RGWS3V2TokenBasedAuthEngine::is_applicable() const noexcept\n+{\n+  if (!RGWTokenBasedAuthEngine::is_applicable()) {\n+    return false;\n+  }\n+\n+  if (!date.empty()) {\n+    time_t exp = atoll(date.c_str());\n+    if (now >= exp) {\n+      return false;\n+    }\n+  }\n+\n+  return true;\n+}\n+\n+void RGWS3V2TokenBasedAuthEngine::get_other_tokens()\n+{\n+  if (!s->http_auth || !(*s->http_auth)) {\n+    auth_sign = s->info.args.get(\"Signature\");\n+    date = s->info.args.get(\"Expires\");\n+    qsr = true;\n+  } else {\n+    string auth_str(s->http_auth + 4);\n+    int pos = auth_str.rfind(':');\n+    if (pos >= 0) {\n+      auth_sign = auth_str.substr(pos + 1);\n+    }\n+  }\n+}\n+\n+std::string RGWS3V2TokenExtractor::get_token() const\n+{\n+  string token = \"\";\n+  if (!s->http_auth || !(*s->http_auth)) {\n+    token = s->info.args.get(\"AWSAccessKeyId\");\n+  } else {\n+    string auth_str(s->http_auth + 4);\n+    int pos = auth_str.rfind(':');\n+    if (pos >=0 ) {\n+      token = auth_str.substr(0, pos);\n+    }\n+  }\n+  return token;\n+}\n+\n+bool RGWS3V2LocalAuthEngine::is_applicable() const noexcept\n+{\n+  if (!RGWS3V2TokenBasedAuthEngine::is_applicable()) {\n+    return false;\n+  }\n+\n+  if (!cct->_conf->rgw_s3_auth_use_rados) {\n+    return false;\n+  }\n+\n+  return true;\n+}\n+\n+RGWAuthApplier::aplptr_t RGWS3V2LocalAuthEngine::authenticate() const\n+{\n+  /* get the user info */\n+  string access_key = token;\n+  if (rgw_get_user_info_by_access_key(store, access_key, *(s->user)) < 0) {\n+      dout(5) << \"error reading user info, uid=\" << token\n+              << \" can't authenticate\" << dendl;\n+      return nullptr;\n+  }\n+\n+  /* now verify  signature */\n+  string auth_hdr;\n+  if (!rgw_create_s3_canonical_header(s->info, &s->header_time, auth_hdr,\n+        qsr)) {\n+    dout(10) << \"failed to create auth header\\n\" << auth_hdr << dendl;\n+    return nullptr;\n+  }\n+  dout(10) << \"auth_hdr:\\n\" << auth_hdr << dendl;\n+\n+  time_t req_sec = s->header_time.sec();\n+  if ((req_sec < now - RGW_AUTH_GRACE_MINS * 60 ||\n+      req_sec > now + RGW_AUTH_GRACE_MINS * 60) && !qsr) {\n+    dout(10) << \"req_sec=\" << req_sec << \" now=\" << now\n+             << \"; now - RGW_AUTH_GRACE_MINS=\" << now - RGW_AUTH_GRACE_MINS * 60\n+             << \"; now + RGW_AUTH_GRACE_MINS=\" << now + RGW_AUTH_GRACE_MINS * 60\n+             << dendl;\n+    dout(0)  << \"NOTICE: request time skew too big now=\" << utime_t(now, 0)\n+             << \" req_time=\" << s->header_time\n+             << dendl;\n+    return nullptr;\n+  }\n+\n+  map<string, RGWAccessKey>::iterator iter = s->user->access_keys.find(token);\n+  if (iter == s->user->access_keys.end()) {\n+    dout(0) << \"ERROR: access key not encoded in user info\" << dendl;\n+    return nullptr;\n+  }\n+  RGWAccessKey& k = iter->second;\n+\n+  string digest;\n+  int ret = rgw_get_s3_header_digest(auth_hdr, k.key, digest);\n+  if (ret < 0) {\n+    return nullptr;\n+  }\n+\n+  dout(15) << \"calculated digest=\" << digest << dendl;\n+  dout(15) << \"auth_sign=\" << auth_sign << dendl;\n+  dout(15) << \"compare=\" << auth_sign.compare(digest) << dendl;\n+\n+  if (auth_sign != digest) {\n+    return nullptr;\n+  }\n+\n+  return apl_factory->create_apl_local(cct, *(s->user), k.subuser);\n+}\n+\n+bool RGWS3KeystoneAuthEngine::is_applicable() const noexcept\n+{\n+  if (!RGWS3V2TokenBasedAuthEngine::is_applicable()) {\n+    return false;\n+  }\n+\n+  if (!cct->_conf->rgw_s3_auth_use_keystone ||\n+      cct->_conf->rgw_keystone_url.empty()) {\n+    return false;\n+  }\n+\n+  return true;\n+}\n+\n+RGWRemoteAuthApplier::acl_strategy_t RGWS3KeystoneAuthEngine::get_acl_strategy() const\n+{\n+  return nullptr;\n+}\n+\n+RGWRemoteAuthApplier::AuthInfo\n+RGWS3KeystoneAuthEngine::get_creds_info(const std::string& uid,\n+                                  const std::string& display_name) const noexcept\n+{\n+  return RGWRemoteAuthApplier::AuthInfo {\n+    rgw_user(uid),\n+    display_name,\n+    RGW_PERM_FULL_CONTROL,\n+    true\n+  };\n+}\n+\n+RGWAuthApplier::aplptr_t RGWS3KeystoneAuthEngine::authenticate() const\n+{\n+  int external_auth_result;\n+\n+  RGW_Auth_S3_Keystone_ValidateToken keystone_validator(store->ctx());\n+  string auth_hdr;\n+\n+  if (!rgw_create_s3_canonical_header(s->info,\n+                                        &s->header_time, auth_hdr, qsr)) {\n+    ldout(s->cct, 10) << \"failed to create auth header\\n\" << auth_hdr << dendl;\n+    return nullptr;\n+  } else {\n+    external_auth_result = keystone_validator.validate_s3token(token, auth_hdr,\n+                                                                auth_sign);","path":"src/rgw/rgw_rest_s3.cc","position":396,"original_position":396,"commit_id":"9b56311091a446c6a65ce0a63ceee20fa87782cc","original_commit_id":"9b56311091a446c6a65ce0a63ceee20fa87782cc","user":{"login":"rzarzynski","id":1891217,"avatar_url":"https://avatars.githubusercontent.com/u/1891217?v=3","gravatar_id":"","url":"https://api.github.com/users/rzarzynski","html_url":"https://github.com/rzarzynski","followers_url":"https://api.github.com/users/rzarzynski/followers","following_url":"https://api.github.com/users/rzarzynski/following{/other_user}","gists_url":"https://api.github.com/users/rzarzynski/gists{/gist_id}","starred_url":"https://api.github.com/users/rzarzynski/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rzarzynski/subscriptions","organizations_url":"https://api.github.com/users/rzarzynski/orgs","repos_url":"https://api.github.com/users/rzarzynski/repos","events_url":"https://api.github.com/users/rzarzynski/events{/privacy}","received_events_url":"https://api.github.com/users/rzarzynski/received_events","type":"User","site_admin":false},"body":"Indentation: one space to far. ","created_at":"2016-08-04T12:53:29Z","updated_at":"2016-08-04T12:53:29Z","html_url":"https://github.com/ceph/ceph/pull/10536#discussion_r73515631","pull_request_url":"https://api.github.com/repos/ceph/ceph/pulls/10536","_links":{"self":{"href":"https://api.github.com/repos/ceph/ceph/pulls/comments/73515631"},"html":{"href":"https://github.com/ceph/ceph/pull/10536#discussion_r73515631"},"pull_request":{"href":"https://api.github.com/repos/ceph/ceph/pulls/10536"}}},"pull_request":{"url":"https://api.github.com/repos/ceph/ceph/pulls/10536","id":79681713,"html_url":"https://github.com/ceph/ceph/pull/10536","diff_url":"https://github.com/ceph/ceph/pull/10536.diff","patch_url":"https://github.com/ceph/ceph/pull/10536.patch","issue_url":"https://api.github.com/repos/ceph/ceph/issues/10536","number":10536,"state":"open","locked":false,"title":"[DNM] rgw: Rework of s3 Keystone Authentication code.","user":{"login":"pritha-srivastava","id":10740350,"avatar_url":"https://avatars.githubusercontent.com/u/10740350?v=3","gravatar_id":"","url":"https://api.github.com/users/pritha-srivastava","html_url":"https://github.com/pritha-srivastava","followers_url":"https://api.github.com/users/pritha-srivastava/followers","following_url":"https://api.github.com/users/pritha-srivastava/following{/other_user}","gists_url":"https://api.github.com/users/pritha-srivastava/gists{/gist_id}","starred_url":"https://api.github.com/users/pritha-srivastava/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pritha-srivastava/subscriptions","organizations_url":"https://api.github.com/users/pritha-srivastava/orgs","repos_url":"https://api.github.com/users/pritha-srivastava/repos","events_url":"https://api.github.com/users/pritha-srivastava/events{/privacy}","received_events_url":"https://api.github.com/users/pritha-srivastava/received_events","type":"User","site_admin":false},"body":"The Keystone authentication code has been reworked based on the new authentication infrastructure.\r\n\r\nSigned-off-by: Pritha Srivastava <prsrivas@redhat.com>\r\n","created_at":"2016-08-02T06:21:35Z","updated_at":"2016-08-04T12:53:29Z","closed_at":null,"merged_at":null,"merge_commit_sha":"66f2bc4c301d98d2580e7d1b7d307ecf8123bb14","assignee":{"login":"mattbenjamin","id":301287,"avatar_url":"https://avatars.githubusercontent.com/u/301287?v=3","gravatar_id":"","url":"https://api.github.com/users/mattbenjamin","html_url":"https://github.com/mattbenjamin","followers_url":"https://api.github.com/users/mattbenjamin/followers","following_url":"https://api.github.com/users/mattbenjamin/following{/other_user}","gists_url":"https://api.github.com/users/mattbenjamin/gists{/gist_id}","starred_url":"https://api.github.com/users/mattbenjamin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mattbenjamin/subscriptions","organizations_url":"https://api.github.com/users/mattbenjamin/orgs","repos_url":"https://api.github.com/users/mattbenjamin/repos","events_url":"https://api.github.com/users/mattbenjamin/events{/privacy}","received_events_url":"https://api.github.com/users/mattbenjamin/received_events","type":"User","site_admin":false},"assignees":[{"login":"mattbenjamin","id":301287,"avatar_url":"https://avatars.githubusercontent.com/u/301287?v=3","gravatar_id":"","url":"https://api.github.com/users/mattbenjamin","html_url":"https://github.com/mattbenjamin","followers_url":"https://api.github.com/users/mattbenjamin/followers","following_url":"https://api.github.com/users/mattbenjamin/following{/other_user}","gists_url":"https://api.github.com/users/mattbenjamin/gists{/gist_id}","starred_url":"https://api.github.com/users/mattbenjamin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mattbenjamin/subscriptions","organizations_url":"https://api.github.com/users/mattbenjamin/orgs","repos_url":"https://api.github.com/users/mattbenjamin/repos","events_url":"https://api.github.com/users/mattbenjamin/events{/privacy}","received_events_url":"https://api.github.com/users/mattbenjamin/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/ceph/ceph/pulls/10536/commits","review_comments_url":"https://api.github.com/repos/ceph/ceph/pulls/10536/comments","review_comment_url":"https://api.github.com/repos/ceph/ceph/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ceph/ceph/issues/10536/comments","statuses_url":"https://api.github.com/repos/ceph/ceph/statuses/9b56311091a446c6a65ce0a63ceee20fa87782cc","head":{"label":"pritha-srivastava:wip_s3_keystone_rework","ref":"wip_s3_keystone_rework","sha":"9b56311091a446c6a65ce0a63ceee20fa87782cc","user":{"login":"pritha-srivastava","id":10740350,"avatar_url":"https://avatars.githubusercontent.com/u/10740350?v=3","gravatar_id":"","url":"https://api.github.com/users/pritha-srivastava","html_url":"https://github.com/pritha-srivastava","followers_url":"https://api.github.com/users/pritha-srivastava/followers","following_url":"https://api.github.com/users/pritha-srivastava/following{/other_user}","gists_url":"https://api.github.com/users/pritha-srivastava/gists{/gist_id}","starred_url":"https://api.github.com/users/pritha-srivastava/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pritha-srivastava/subscriptions","organizations_url":"https://api.github.com/users/pritha-srivastava/orgs","repos_url":"https://api.github.com/users/pritha-srivastava/repos","events_url":"https://api.github.com/users/pritha-srivastava/events{/privacy}","received_events_url":"https://api.github.com/users/pritha-srivastava/received_events","type":"User","site_admin":false},"repo":{"id":60273236,"name":"ceph","full_name":"pritha-srivastava/ceph","owner":{"login":"pritha-srivastava","id":10740350,"avatar_url":"https://avatars.githubusercontent.com/u/10740350?v=3","gravatar_id":"","url":"https://api.github.com/users/pritha-srivastava","html_url":"https://github.com/pritha-srivastava","followers_url":"https://api.github.com/users/pritha-srivastava/followers","following_url":"https://api.github.com/users/pritha-srivastava/following{/other_user}","gists_url":"https://api.github.com/users/pritha-srivastava/gists{/gist_id}","starred_url":"https://api.github.com/users/pritha-srivastava/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pritha-srivastava/subscriptions","organizations_url":"https://api.github.com/users/pritha-srivastava/orgs","repos_url":"https://api.github.com/users/pritha-srivastava/repos","events_url":"https://api.github.com/users/pritha-srivastava/events{/privacy}","received_events_url":"https://api.github.com/users/pritha-srivastava/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/pritha-srivastava/ceph","description":"Ceph is a distributed object, block, and file storage platform ","fork":true,"url":"https://api.github.com/repos/pritha-srivastava/ceph","forks_url":"https://api.github.com/repos/pritha-srivastava/ceph/forks","keys_url":"https://api.github.com/repos/pritha-srivastava/ceph/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pritha-srivastava/ceph/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pritha-srivastava/ceph/teams","hooks_url":"https://api.github.com/repos/pritha-srivastava/ceph/hooks","issue_events_url":"https://api.github.com/repos/pritha-srivastava/ceph/issues/events{/number}","events_url":"https://api.github.com/repos/pritha-srivastava/ceph/events","assignees_url":"https://api.github.com/repos/pritha-srivastava/ceph/assignees{/user}","branches_url":"https://api.github.com/repos/pritha-srivastava/ceph/branches{/branch}","tags_url":"https://api.github.com/repos/pritha-srivastava/ceph/tags","blobs_url":"https://api.github.com/repos/pritha-srivastava/ceph/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pritha-srivastava/ceph/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pritha-srivastava/ceph/git/refs{/sha}","trees_url":"https://api.github.com/repos/pritha-srivastava/ceph/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pritha-srivastava/ceph/statuses/{sha}","languages_url":"https://api.github.com/repos/pritha-srivastava/ceph/languages","stargazers_url":"https://api.github.com/repos/pritha-srivastava/ceph/stargazers","contributors_url":"https://api.github.com/repos/pritha-srivastava/ceph/contributors","subscribers_url":"https://api.github.com/repos/pritha-srivastava/ceph/subscribers","subscription_url":"https://api.github.com/repos/pritha-srivastava/ceph/subscription","commits_url":"https://api.github.com/repos/pritha-srivastava/ceph/commits{/sha}","git_commits_url":"https://api.github.com/repos/pritha-srivastava/ceph/git/commits{/sha}","comments_url":"https://api.github.com/repos/pritha-srivastava/ceph/comments{/number}","issue_comment_url":"https://api.github.com/repos/pritha-srivastava/ceph/issues/comments{/number}","contents_url":"https://api.github.com/repos/pritha-srivastava/ceph/contents/{+path}","compare_url":"https://api.github.com/repos/pritha-srivastava/ceph/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pritha-srivastava/ceph/merges","archive_url":"https://api.github.com/repos/pritha-srivastava/ceph/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pritha-srivastava/ceph/downloads","issues_url":"https://api.github.com/repos/pritha-srivastava/ceph/issues{/number}","pulls_url":"https://api.github.com/repos/pritha-srivastava/ceph/pulls{/number}","milestones_url":"https://api.github.com/repos/pritha-srivastava/ceph/milestones{/number}","notifications_url":"https://api.github.com/repos/pritha-srivastava/ceph/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pritha-srivastava/ceph/labels{/name}","releases_url":"https://api.github.com/repos/pritha-srivastava/ceph/releases{/id}","deployments_url":"https://api.github.com/repos/pritha-srivastava/ceph/deployments","created_at":"2016-06-02T14:59:07Z","updated_at":"2016-06-02T14:59:28Z","pushed_at":"2016-08-04T07:38:49Z","git_url":"git://github.com/pritha-srivastava/ceph.git","ssh_url":"git@github.com:pritha-srivastava/ceph.git","clone_url":"https://github.com/pritha-srivastava/ceph.git","svn_url":"https://github.com/pritha-srivastava/ceph","homepage":"http://ceph.com","size":174342,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"ceph:master","ref":"master","sha":"98b9ed1d7ce05b0079b8d8351d2142ae05874b3e","user":{"login":"ceph","id":1015767,"avatar_url":"https://avatars.githubusercontent.com/u/1015767?v=3","gravatar_id":"","url":"https://api.github.com/users/ceph","html_url":"https://github.com/ceph","followers_url":"https://api.github.com/users/ceph/followers","following_url":"https://api.github.com/users/ceph/following{/other_user}","gists_url":"https://api.github.com/users/ceph/gists{/gist_id}","starred_url":"https://api.github.com/users/ceph/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ceph/subscriptions","organizations_url":"https://api.github.com/users/ceph/orgs","repos_url":"https://api.github.com/users/ceph/repos","events_url":"https://api.github.com/users/ceph/events{/privacy}","received_events_url":"https://api.github.com/users/ceph/received_events","type":"Organization","site_admin":false},"repo":{"id":2310495,"name":"ceph","full_name":"ceph/ceph","owner":{"login":"ceph","id":1015767,"avatar_url":"https://avatars.githubusercontent.com/u/1015767?v=3","gravatar_id":"","url":"https://api.github.com/users/ceph","html_url":"https://github.com/ceph","followers_url":"https://api.github.com/users/ceph/followers","following_url":"https://api.github.com/users/ceph/following{/other_user}","gists_url":"https://api.github.com/users/ceph/gists{/gist_id}","starred_url":"https://api.github.com/users/ceph/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ceph/subscriptions","organizations_url":"https://api.github.com/users/ceph/orgs","repos_url":"https://api.github.com/users/ceph/repos","events_url":"https://api.github.com/users/ceph/events{/privacy}","received_events_url":"https://api.github.com/users/ceph/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ceph/ceph","description":"Ceph is a distributed object, block, and file storage platform ","fork":false,"url":"https://api.github.com/repos/ceph/ceph","forks_url":"https://api.github.com/repos/ceph/ceph/forks","keys_url":"https://api.github.com/repos/ceph/ceph/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ceph/ceph/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ceph/ceph/teams","hooks_url":"https://api.github.com/repos/ceph/ceph/hooks","issue_events_url":"https://api.github.com/repos/ceph/ceph/issues/events{/number}","events_url":"https://api.github.com/repos/ceph/ceph/events","assignees_url":"https://api.github.com/repos/ceph/ceph/assignees{/user}","branches_url":"https://api.github.com/repos/ceph/ceph/branches{/branch}","tags_url":"https://api.github.com/repos/ceph/ceph/tags","blobs_url":"https://api.github.com/repos/ceph/ceph/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ceph/ceph/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ceph/ceph/git/refs{/sha}","trees_url":"https://api.github.com/repos/ceph/ceph/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ceph/ceph/statuses/{sha}","languages_url":"https://api.github.com/repos/ceph/ceph/languages","stargazers_url":"https://api.github.com/repos/ceph/ceph/stargazers","contributors_url":"https://api.github.com/repos/ceph/ceph/contributors","subscribers_url":"https://api.github.com/repos/ceph/ceph/subscribers","subscription_url":"https://api.github.com/repos/ceph/ceph/subscription","commits_url":"https://api.github.com/repos/ceph/ceph/commits{/sha}","git_commits_url":"https://api.github.com/repos/ceph/ceph/git/commits{/sha}","comments_url":"https://api.github.com/repos/ceph/ceph/comments{/number}","issue_comment_url":"https://api.github.com/repos/ceph/ceph/issues/comments{/number}","contents_url":"https://api.github.com/repos/ceph/ceph/contents/{+path}","compare_url":"https://api.github.com/repos/ceph/ceph/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ceph/ceph/merges","archive_url":"https://api.github.com/repos/ceph/ceph/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ceph/ceph/downloads","issues_url":"https://api.github.com/repos/ceph/ceph/issues{/number}","pulls_url":"https://api.github.com/repos/ceph/ceph/pulls{/number}","milestones_url":"https://api.github.com/repos/ceph/ceph/milestones{/number}","notifications_url":"https://api.github.com/repos/ceph/ceph/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ceph/ceph/labels{/name}","releases_url":"https://api.github.com/repos/ceph/ceph/releases{/id}","deployments_url":"https://api.github.com/repos/ceph/ceph/deployments","created_at":"2011-09-01T21:41:26Z","updated_at":"2016-08-04T07:35:57Z","pushed_at":"2016-08-04T12:45:05Z","git_url":"git://github.com/ceph/ceph.git","ssh_url":"git@github.com:ceph/ceph.git","clone_url":"https://github.com/ceph/ceph.git","svn_url":"https://github.com/ceph/ceph","homepage":"http://ceph.com","size":231972,"stargazers_count":2349,"watchers_count":2349,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1397,"mirror_url":null,"open_issues_count":494,"forks":1397,"open_issues":494,"watchers":2349,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ceph/ceph/pulls/10536"},"html":{"href":"https://github.com/ceph/ceph/pull/10536"},"issue":{"href":"https://api.github.com/repos/ceph/ceph/issues/10536"},"comments":{"href":"https://api.github.com/repos/ceph/ceph/issues/10536/comments"},"review_comments":{"href":"https://api.github.com/repos/ceph/ceph/pulls/10536/comments"},"review_comment":{"href":"https://api.github.com/repos/ceph/ceph/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ceph/ceph/pulls/10536/commits"},"statuses":{"href":"https://api.github.com/repos/ceph/ceph/statuses/9b56311091a446c6a65ce0a63ceee20fa87782cc"}}}}
{"actor":{"display_login":"rzarzynski"}}