{"action":"created","comment":{"url":"https://api.github.com/repos/codice/ddf/pulls/comments/203060401","pull_request_review_id":137876321,"id":203060401,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwMzA2MDQwMQ==","diff_hunk":"@@ -0,0 +1,154 @@\n+/**\n+ * Copyright (c) Codice Foundation\n+ *\n+ * <p>This is free software: you can redistribute it and/or modify it under the terms of the GNU\n+ * Lesser General Public License as published by the Free Software Foundation, either version 3 of\n+ * the License, or any later version.\n+ *\n+ * <p>This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\n+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n+ * GNU Lesser General Public License for more details. A copy of the GNU Lesser General Public\n+ * License is distributed along with this program and can be found at\n+ * <http://www.gnu.org/licenses/lgpl.html>.\n+ */\n+package org.codice.ddf.security.idp.plugin.nameidpolicy;\n+\n+import ddf.security.SubjectUtils;\n+import ddf.security.samlp.SamlProtocol.Binding;\n+import java.util.List;\n+import java.util.Set;\n+import java.util.function.Predicate;\n+import java.util.stream.Stream;\n+import javax.annotation.Nullable;\n+import org.apache.commons.lang.StringUtils;\n+import org.codice.ddf.security.idp.plugin.SamlPresignPlugin;\n+import org.opensaml.core.xml.schema.XSString;\n+import org.opensaml.saml.saml2.core.Attribute;\n+import org.opensaml.saml.saml2.core.AuthnRequest;\n+import org.opensaml.saml.saml2.core.NameID;\n+import org.opensaml.saml.saml2.core.NameIDPolicy;\n+import org.opensaml.saml.saml2.core.Response;\n+import org.slf4j.Logger;\n+import org.slf4j.LoggerFactory;\n+\n+/**\n+ * This plugin is responsible for setting the <@code>NameID</@code>'s <@code>Format</@code> &\n+ * <@code>SPNameQualifier</@code> on the outgoing <@code>Response</@code>. It does this by parsing\n+ * the <@code>NameIDPolicy</@code> of the passed in <@code>AuthnRequest</@code>.\n+ *\n+ * <p>See section 3.4.1.1 of the SAML Core specification for more information.\n+ */\n+public class NameIdPolicyPresignPlugin implements SamlPresignPlugin {\n+\n+  private static final Logger LOGGER = LoggerFactory.getLogger(NameIdPolicyPresignPlugin.class);\n+\n+  @Override\n+  public void processPresign(\n+      Response response,\n+      AuthnRequest authnRequest,\n+      List<String> spMetadata,\n+      Set<Binding> supportedBindings) {\n+    NameIDPolicy nameIdPolicy = authnRequest.getNameIDPolicy();\n+\n+    if (nameIdPolicy == null\n+        || (StringUtils.isEmpty(nameIdPolicy.getFormat())\n+            && StringUtils.isEmpty(nameIdPolicy.getSPNameQualifier()))) {\n+      return;\n+    }\n+\n+    response\n+        .getAssertions()\n+        .stream()\n+        .map(assertion -> assertion.getSubject().getNameID())\n+        .forEach(\n+            assertionNameId ->\n+                setAssertionNameIdQualifierAndFormat(\n+                    assertionNameId,\n+                    nameIdPolicy.getFormat(),\n+                    nameIdPolicy.getSPNameQualifier(),\n+                    response));\n+  }\n+\n+  private void setAssertionNameIdQualifierAndFormat(\n+      NameID assertionNameId,\n+      @Nullable String nameIdFormatPolicy,\n+      @Nullable String spNameQualifierPolicy,\n+      Response response) {\n+\n+    if (StringUtils.isNotEmpty(spNameQualifierPolicy)) {\n+      assertionNameId.setSPNameQualifier(spNameQualifierPolicy);\n+    }\n+\n+    // the Assertion's NameID Format is set to the NameIDPolicy Format after the switch statement\n+    if (StringUtils.isNotEmpty(nameIdFormatPolicy)) {\n+      switch (nameIdFormatPolicy) {\n+          // supported NameIDFormats\n+        case NameID.UNSPECIFIED:\n+          return; // avoid changing the Format later\n+        case NameID.PERSISTENT:\n+          // TODO DDF-3965\n+          break;\n+\n+          // partially supported NameIDFormats\n+        case NameID.X509_SUBJECT:\n+          LOGGER.warn(\"Specifying the \\\"X509Subject\\\" NameIDPolicy Format is not fully supported.\");","path":"platform/security/idp/security-idp-plugin/security-idp-plugin-nameidpolicy/src/main/java/org/codice/ddf/security/idp/plugin/nameidpolicy/NameIdPolicyPresignPlugin.java","position":94,"original_position":94,"commit_id":"07cebcd4c5aa0050a17938ac163d3831402cb476","original_commit_id":"07cebcd4c5aa0050a17938ac163d3831402cb476","user":{"login":"bakejeyner","id":14284361,"node_id":"MDQ6VXNlcjE0Mjg0MzYx","avatar_url":"https://avatars2.githubusercontent.com/u/14284361?v=4","gravatar_id":"","url":"https://api.github.com/users/bakejeyner","html_url":"https://github.com/bakejeyner","followers_url":"https://api.github.com/users/bakejeyner/followers","following_url":"https://api.github.com/users/bakejeyner/following{/other_user}","gists_url":"https://api.github.com/users/bakejeyner/gists{/gist_id}","starred_url":"https://api.github.com/users/bakejeyner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bakejeyner/subscriptions","organizations_url":"https://api.github.com/users/bakejeyner/orgs","repos_url":"https://api.github.com/users/bakejeyner/repos","events_url":"https://api.github.com/users/bakejeyner/events{/privacy}","received_events_url":"https://api.github.com/users/bakejeyner/received_events","type":"User","site_admin":false},"body":"I'm not sure what our security logging practices are. This may be a good spot for it.\r\n\r\n@blen-desta , @brjeter , @coyotesqrl ?","created_at":"2018-07-17T15:07:28Z","updated_at":"2018-07-17T15:07:29Z","html_url":"https://github.com/codice/ddf/pull/3412#discussion_r203060401","pull_request_url":"https://api.github.com/repos/codice/ddf/pulls/3412","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/codice/ddf/pulls/comments/203060401"},"html":{"href":"https://github.com/codice/ddf/pull/3412#discussion_r203060401"},"pull_request":{"href":"https://api.github.com/repos/codice/ddf/pulls/3412"}},"in_reply_to_id":202854293},"pull_request":{"url":"https://api.github.com/repos/codice/ddf/pulls/3412","id":200517984,"node_id":"MDExOlB1bGxSZXF1ZXN0MjAwNTE3OTg0","html_url":"https://github.com/codice/ddf/pull/3412","diff_url":"https://github.com/codice/ddf/pull/3412.diff","patch_url":"https://github.com/codice/ddf/pull/3412.patch","issue_url":"https://api.github.com/repos/codice/ddf/issues/3412","number":3412,"state":"open","locked":false,"title":"DDF-3893 The IdP should account for the NameIDPolicy in AuthnRequests","user":{"login":"bakejeyner","id":14284361,"node_id":"MDQ6VXNlcjE0Mjg0MzYx","avatar_url":"https://avatars2.githubusercontent.com/u/14284361?v=4","gravatar_id":"","url":"https://api.github.com/users/bakejeyner","html_url":"https://github.com/bakejeyner","followers_url":"https://api.github.com/users/bakejeyner/followers","following_url":"https://api.github.com/users/bakejeyner/following{/other_user}","gists_url":"https://api.github.com/users/bakejeyner/gists{/gist_id}","starred_url":"https://api.github.com/users/bakejeyner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bakejeyner/subscriptions","organizations_url":"https://api.github.com/users/bakejeyner/orgs","repos_url":"https://api.github.com/users/bakejeyner/repos","events_url":"https://api.github.com/users/bakejeyner/events{/privacy}","received_events_url":"https://api.github.com/users/bakejeyner/received_events","type":"User","site_admin":false},"body":"#### What does this PR do?\r\nAdds support for `NameIDPolicy`s on the `AuthnRequest` in DDF's IdP.\r\n\r\n#### Who is reviewing it? \r\n@blen-desta\r\n@brjeter\r\n\r\n#### Ask 2 committers to review/merge the PR and tag them here. If you don't know who to ask, you can request reviews in https://groups.google.com/forum/#!forum/ddf-developers .\r\n(please choose ONLY two committers from below, delete the rest)\r\n@coyotesqrl\r\n@stustison\r\n\r\n#### How should this be tested? (List steps with links to updated documentation)\r\n1. Build and install DDF\r\n2. Run [this branch of the SAML CTK](https://github.com/bakejeyner/saml-conformance/tree/DDF-3893), and verify that there are no errors.\r\n\r\n#### What are the relevant tickets?\r\n[DDF-3893](https://codice.atlassian.net/browse/DDF-3893)\r\n\r\n#### Checklist:\r\n- [ ] Documentation Updated\r\n- [x] Update / Add Unit Tests\r\n- [ ] Update / Add Integration Tests\r\n\r\n#### Notes on Review Process\r\nPlease see [Notes on Review Process](https://codice.atlassian.net/wiki/spaces/DDF/pages/71946981/Pull+Request+Guidelines) for further guidance on requirements for merging and abbreviated reviews. \r\n\r\n#### Review Comment Legend:\r\n- ✏️ (Pencil) This comment is a nitpick or style suggestion, no action required for approval. This comment should provide a suggestion either as an in line code snippet or a gist. \r\n- ❓ (Question Mark) This comment is to gain a clearer understanding of design or code choices, clarification is required but action may not be necessary for approval.\r\n- ❗ (Exclamation Mark) This comment is critical and requires clarification or action before approval.\r\n","created_at":"2018-07-10T20:44:26Z","updated_at":"2018-07-17T15:07:29Z","closed_at":null,"merged_at":null,"merge_commit_sha":"a7c7939a623c29b24258e878bef22183969be58e","assignee":null,"assignees":[],"requested_reviewers":[{"login":"stustison","id":4391679,"node_id":"MDQ6VXNlcjQzOTE2Nzk=","avatar_url":"https://avatars0.githubusercontent.com/u/4391679?v=4","gravatar_id":"","url":"https://api.github.com/users/stustison","html_url":"https://github.com/stustison","followers_url":"https://api.github.com/users/stustison/followers","following_url":"https://api.github.com/users/stustison/following{/other_user}","gists_url":"https://api.github.com/users/stustison/gists{/gist_id}","starred_url":"https://api.github.com/users/stustison/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stustison/subscriptions","organizations_url":"https://api.github.com/users/stustison/orgs","repos_url":"https://api.github.com/users/stustison/repos","events_url":"https://api.github.com/users/stustison/events{/privacy}","received_events_url":"https://api.github.com/users/stustison/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/codice/ddf/pulls/3412/commits","review_comments_url":"https://api.github.com/repos/codice/ddf/pulls/3412/comments","review_comment_url":"https://api.github.com/repos/codice/ddf/pulls/comments{/number}","comments_url":"https://api.github.com/repos/codice/ddf/issues/3412/comments","statuses_url":"https://api.github.com/repos/codice/ddf/statuses/07cebcd4c5aa0050a17938ac163d3831402cb476","head":{"label":"bakejeyner:DDF-3893","ref":"DDF-3893","sha":"07cebcd4c5aa0050a17938ac163d3831402cb476","user":{"login":"bakejeyner","id":14284361,"node_id":"MDQ6VXNlcjE0Mjg0MzYx","avatar_url":"https://avatars2.githubusercontent.com/u/14284361?v=4","gravatar_id":"","url":"https://api.github.com/users/bakejeyner","html_url":"https://github.com/bakejeyner","followers_url":"https://api.github.com/users/bakejeyner/followers","following_url":"https://api.github.com/users/bakejeyner/following{/other_user}","gists_url":"https://api.github.com/users/bakejeyner/gists{/gist_id}","starred_url":"https://api.github.com/users/bakejeyner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bakejeyner/subscriptions","organizations_url":"https://api.github.com/users/bakejeyner/orgs","repos_url":"https://api.github.com/users/bakejeyner/repos","events_url":"https://api.github.com/users/bakejeyner/events{/privacy}","received_events_url":"https://api.github.com/users/bakejeyner/received_events","type":"User","site_admin":false},"repo":{"id":114053519,"node_id":"MDEwOlJlcG9zaXRvcnkxMTQwNTM1MTk=","name":"ddf","full_name":"bakejeyner/ddf","owner":{"login":"bakejeyner","id":14284361,"node_id":"MDQ6VXNlcjE0Mjg0MzYx","avatar_url":"https://avatars2.githubusercontent.com/u/14284361?v=4","gravatar_id":"","url":"https://api.github.com/users/bakejeyner","html_url":"https://github.com/bakejeyner","followers_url":"https://api.github.com/users/bakejeyner/followers","following_url":"https://api.github.com/users/bakejeyner/following{/other_user}","gists_url":"https://api.github.com/users/bakejeyner/gists{/gist_id}","starred_url":"https://api.github.com/users/bakejeyner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bakejeyner/subscriptions","organizations_url":"https://api.github.com/users/bakejeyner/orgs","repos_url":"https://api.github.com/users/bakejeyner/repos","events_url":"https://api.github.com/users/bakejeyner/events{/privacy}","received_events_url":"https://api.github.com/users/bakejeyner/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/bakejeyner/ddf","description":"DDF Distributed Data Framework - an open source, modular integration framework.","fork":true,"url":"https://api.github.com/repos/bakejeyner/ddf","forks_url":"https://api.github.com/repos/bakejeyner/ddf/forks","keys_url":"https://api.github.com/repos/bakejeyner/ddf/keys{/key_id}","collaborators_url":"https://api.github.com/repos/bakejeyner/ddf/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/bakejeyner/ddf/teams","hooks_url":"https://api.github.com/repos/bakejeyner/ddf/hooks","issue_events_url":"https://api.github.com/repos/bakejeyner/ddf/issues/events{/number}","events_url":"https://api.github.com/repos/bakejeyner/ddf/events","assignees_url":"https://api.github.com/repos/bakejeyner/ddf/assignees{/user}","branches_url":"https://api.github.com/repos/bakejeyner/ddf/branches{/branch}","tags_url":"https://api.github.com/repos/bakejeyner/ddf/tags","blobs_url":"https://api.github.com/repos/bakejeyner/ddf/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/bakejeyner/ddf/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/bakejeyner/ddf/git/refs{/sha}","trees_url":"https://api.github.com/repos/bakejeyner/ddf/git/trees{/sha}","statuses_url":"https://api.github.com/repos/bakejeyner/ddf/statuses/{sha}","languages_url":"https://api.github.com/repos/bakejeyner/ddf/languages","stargazers_url":"https://api.github.com/repos/bakejeyner/ddf/stargazers","contributors_url":"https://api.github.com/repos/bakejeyner/ddf/contributors","subscribers_url":"https://api.github.com/repos/bakejeyner/ddf/subscribers","subscription_url":"https://api.github.com/repos/bakejeyner/ddf/subscription","commits_url":"https://api.github.com/repos/bakejeyner/ddf/commits{/sha}","git_commits_url":"https://api.github.com/repos/bakejeyner/ddf/git/commits{/sha}","comments_url":"https://api.github.com/repos/bakejeyner/ddf/comments{/number}","issue_comment_url":"https://api.github.com/repos/bakejeyner/ddf/issues/comments{/number}","contents_url":"https://api.github.com/repos/bakejeyner/ddf/contents/{+path}","compare_url":"https://api.github.com/repos/bakejeyner/ddf/compare/{base}...{head}","merges_url":"https://api.github.com/repos/bakejeyner/ddf/merges","archive_url":"https://api.github.com/repos/bakejeyner/ddf/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/bakejeyner/ddf/downloads","issues_url":"https://api.github.com/repos/bakejeyner/ddf/issues{/number}","pulls_url":"https://api.github.com/repos/bakejeyner/ddf/pulls{/number}","milestones_url":"https://api.github.com/repos/bakejeyner/ddf/milestones{/number}","notifications_url":"https://api.github.com/repos/bakejeyner/ddf/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/bakejeyner/ddf/labels{/name}","releases_url":"https://api.github.com/repos/bakejeyner/ddf/releases{/id}","deployments_url":"https://api.github.com/repos/bakejeyner/ddf/deployments","created_at":"2017-12-13T00:25:39Z","updated_at":"2018-06-12T15:37:38Z","pushed_at":"2018-07-16T18:36:50Z","git_url":"git://github.com/bakejeyner/ddf.git","ssh_url":"git@github.com:bakejeyner/ddf.git","clone_url":"https://github.com/bakejeyner/ddf.git","svn_url":"https://github.com/bakejeyner/ddf","homepage":"http://ddf.codice.org","size":377915,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"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,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"codice:master","ref":"master","sha":"ab2c197bb5f33783dab967a13d3c0604b4e9734f","user":{"login":"codice","id":2386734,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIzODY3MzQ=","avatar_url":"https://avatars2.githubusercontent.com/u/2386734?v=4","gravatar_id":"","url":"https://api.github.com/users/codice","html_url":"https://github.com/codice","followers_url":"https://api.github.com/users/codice/followers","following_url":"https://api.github.com/users/codice/following{/other_user}","gists_url":"https://api.github.com/users/codice/gists{/gist_id}","starred_url":"https://api.github.com/users/codice/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/codice/subscriptions","organizations_url":"https://api.github.com/users/codice/orgs","repos_url":"https://api.github.com/users/codice/repos","events_url":"https://api.github.com/users/codice/events{/privacy}","received_events_url":"https://api.github.com/users/codice/received_events","type":"Organization","site_admin":false},"repo":{"id":15173563,"node_id":"MDEwOlJlcG9zaXRvcnkxNTE3MzU2Mw==","name":"ddf","full_name":"codice/ddf","owner":{"login":"codice","id":2386734,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIzODY3MzQ=","avatar_url":"https://avatars2.githubusercontent.com/u/2386734?v=4","gravatar_id":"","url":"https://api.github.com/users/codice","html_url":"https://github.com/codice","followers_url":"https://api.github.com/users/codice/followers","following_url":"https://api.github.com/users/codice/following{/other_user}","gists_url":"https://api.github.com/users/codice/gists{/gist_id}","starred_url":"https://api.github.com/users/codice/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/codice/subscriptions","organizations_url":"https://api.github.com/users/codice/orgs","repos_url":"https://api.github.com/users/codice/repos","events_url":"https://api.github.com/users/codice/events{/privacy}","received_events_url":"https://api.github.com/users/codice/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/codice/ddf","description":"DDF Distributed Data Framework - an open source, modular integration framework.","fork":false,"url":"https://api.github.com/repos/codice/ddf","forks_url":"https://api.github.com/repos/codice/ddf/forks","keys_url":"https://api.github.com/repos/codice/ddf/keys{/key_id}","collaborators_url":"https://api.github.com/repos/codice/ddf/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/codice/ddf/teams","hooks_url":"https://api.github.com/repos/codice/ddf/hooks","issue_events_url":"https://api.github.com/repos/codice/ddf/issues/events{/number}","events_url":"https://api.github.com/repos/codice/ddf/events","assignees_url":"https://api.github.com/repos/codice/ddf/assignees{/user}","branches_url":"https://api.github.com/repos/codice/ddf/branches{/branch}","tags_url":"https://api.github.com/repos/codice/ddf/tags","blobs_url":"https://api.github.com/repos/codice/ddf/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/codice/ddf/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/codice/ddf/git/refs{/sha}","trees_url":"https://api.github.com/repos/codice/ddf/git/trees{/sha}","statuses_url":"https://api.github.com/repos/codice/ddf/statuses/{sha}","languages_url":"https://api.github.com/repos/codice/ddf/languages","stargazers_url":"https://api.github.com/repos/codice/ddf/stargazers","contributors_url":"https://api.github.com/repos/codice/ddf/contributors","subscribers_url":"https://api.github.com/repos/codice/ddf/subscribers","subscription_url":"https://api.github.com/repos/codice/ddf/subscription","commits_url":"https://api.github.com/repos/codice/ddf/commits{/sha}","git_commits_url":"https://api.github.com/repos/codice/ddf/git/commits{/sha}","comments_url":"https://api.github.com/repos/codice/ddf/comments{/number}","issue_comment_url":"https://api.github.com/repos/codice/ddf/issues/comments{/number}","contents_url":"https://api.github.com/repos/codice/ddf/contents/{+path}","compare_url":"https://api.github.com/repos/codice/ddf/compare/{base}...{head}","merges_url":"https://api.github.com/repos/codice/ddf/merges","archive_url":"https://api.github.com/repos/codice/ddf/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/codice/ddf/downloads","issues_url":"https://api.github.com/repos/codice/ddf/issues{/number}","pulls_url":"https://api.github.com/repos/codice/ddf/pulls{/number}","milestones_url":"https://api.github.com/repos/codice/ddf/milestones{/number}","notifications_url":"https://api.github.com/repos/codice/ddf/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/codice/ddf/labels{/name}","releases_url":"https://api.github.com/repos/codice/ddf/releases{/id}","deployments_url":"https://api.github.com/repos/codice/ddf/deployments","created_at":"2013-12-13T20:38:28Z","updated_at":"2018-07-17T14:17:25Z","pushed_at":"2018-07-17T14:56:14Z","git_url":"git://github.com/codice/ddf.git","ssh_url":"git@github.com:codice/ddf.git","clone_url":"https://github.com/codice/ddf.git","svn_url":"https://github.com/codice/ddf","homepage":"http://ddf.codice.org","size":394317,"stargazers_count":86,"watchers_count":86,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":150,"mirror_url":null,"archived":false,"open_issues_count":33,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":150,"open_issues":33,"watchers":86,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/codice/ddf/pulls/3412"},"html":{"href":"https://github.com/codice/ddf/pull/3412"},"issue":{"href":"https://api.github.com/repos/codice/ddf/issues/3412"},"comments":{"href":"https://api.github.com/repos/codice/ddf/issues/3412/comments"},"review_comments":{"href":"https://api.github.com/repos/codice/ddf/pulls/3412/comments"},"review_comment":{"href":"https://api.github.com/repos/codice/ddf/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/codice/ddf/pulls/3412/commits"},"statuses":{"href":"https://api.github.com/repos/codice/ddf/statuses/07cebcd4c5aa0050a17938ac163d3831402cb476"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"bakejeyner"}}