{"action":"created","comment":{"url":"https://api.github.com/repos/rackerlabs/repose/pulls/comments/37416067","id":37416067,"diff_hunk":"@@ -0,0 +1,313 @@\n+/*\n+ * _=_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_=\n+ * Repose\n+ * _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-\n+ * Copyright (C) 2010 - 2015 Rackspace US, Inc.\n+ * _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-\n+ * Licensed under the Apache License, Version 2.0 (the \"License\");\n+ * you may not use this file except in compliance with the License.\n+ * You may obtain a copy of the License at\n+ *\n+ *      http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ * =_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_=_\n+ */\n+package org.openrepose.filters.keystonev2\n+\n+import java.io.InputStream\n+import java.util.{Calendar, GregorianCalendar}\n+import javax.servlet.http.HttpServletResponse._\n+import javax.ws.rs.core.MediaType\n+\n+import com.fasterxml.jackson.core.JsonProcessingException\n+import com.typesafe.scalalogging.slf4j.LazyLogging\n+import org.apache.http.HttpHeaders\n+import org.apache.http.client.utils.DateUtils\n+import org.joda.time.format.ISODateTimeFormat\n+import org.openrepose.commons.utils.http.{CommonHttpHeader, ServiceClientResponse}\n+import org.openrepose.core.services.serviceclient.akka.AkkaServiceClient\n+import play.api.libs.functional.syntax._\n+import play.api.libs.json.Reads._\n+import play.api.libs.json._\n+\n+import scala.collection.JavaConverters._\n+import scala.io.Source\n+import scala.util.{Failure, Success, Try}\n+\n+/**\n+ * Contains the functions which interact with the Keystone API.\n+ */\n+class KeystoneRequestHandler(identityServiceUri: String, akkaServiceClient: AkkaServiceClient, traceId: Option[String])\n+  extends LazyLogging {\n+\n+  import KeystoneRequestHandler._\n+\n+  /**\n+   * Call to the Keystone service to get the admin token\n+   * @return a Successful token, or a Failure\n+   */\n+  final def getAdminToken(adminUsername: String, adminPassword: String): Try[String] = {\n+    //authenticate, or get the admin token\n+    val authenticationPayload = Json.obj(\n+      \"auth\" -> Json.obj(\n+        \"passwordCredentials\" -> Json.obj(\n+          \"username\" -> adminUsername,\n+          \"password\" -> adminPassword\n+        )\n+      )\n+    )\n+\n+    val akkaResponse = Try(akkaServiceClient.post(ADMIN_TOKEN_KEY,\n+      s\"$identityServiceUri$TOKEN_ENDPOINT\",","path":"repose-aggregator/components/filters/keystone-v2/src/main/scala/org/openrepose/filters/keystonev2/KeystoneRequestHandler.scala","position":66,"original_position":66,"commit_id":"e93fb861bc3dfa7c7618d345f2da2007de07f5de","original_commit_id":"a939b7f09ed466ad8d9fa30cd577bd1cae4ce834","user":{"login":"adrianjgeorge","id":997130,"avatar_url":"https://avatars.githubusercontent.com/u/997130?v=3","gravatar_id":"","url":"https://api.github.com/users/adrianjgeorge","html_url":"https://github.com/adrianjgeorge","followers_url":"https://api.github.com/users/adrianjgeorge/followers","following_url":"https://api.github.com/users/adrianjgeorge/following{/other_user}","gists_url":"https://api.github.com/users/adrianjgeorge/gists{/gist_id}","starred_url":"https://api.github.com/users/adrianjgeorge/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adrianjgeorge/subscriptions","organizations_url":"https://api.github.com/users/adrianjgeorge/orgs","repos_url":"https://api.github.com/users/adrianjgeorge/repos","events_url":"https://api.github.com/users/adrianjgeorge/events{/privacy}","received_events_url":"https://api.github.com/users/adrianjgeorge/received_events","type":"User","site_admin":false},"body":"that works i suppose","created_at":"2015-08-19T13:51:47Z","updated_at":"2015-08-19T13:51:47Z","html_url":"https://github.com/rackerlabs/repose/pull/1326#discussion_r37416067","pull_request_url":"https://api.github.com/repos/rackerlabs/repose/pulls/1326","_links":{"self":{"href":"https://api.github.com/repos/rackerlabs/repose/pulls/comments/37416067"},"html":{"href":"https://github.com/rackerlabs/repose/pull/1326#discussion_r37416067"},"pull_request":{"href":"https://api.github.com/repos/rackerlabs/repose/pulls/1326"}}},"pull_request":{"url":"https://api.github.com/repos/rackerlabs/repose/pulls/1326","id":38877626,"html_url":"https://github.com/rackerlabs/repose/pull/1326","diff_url":"https://github.com/rackerlabs/repose/pull/1326.diff","patch_url":"https://github.com/rackerlabs/repose/pull/1326.patch","issue_url":"https://api.github.com/repos/rackerlabs/repose/issues/1326","number":1326,"state":"open","locked":false,"title":"REP-1840 Keystone v2 (Newstone)","user":{"login":"dmnjohns","id":1923408,"avatar_url":"https://avatars.githubusercontent.com/u/1923408?v=3","gravatar_id":"","url":"https://api.github.com/users/dmnjohns","html_url":"https://github.com/dmnjohns","followers_url":"https://api.github.com/users/dmnjohns/followers","following_url":"https://api.github.com/users/dmnjohns/following{/other_user}","gists_url":"https://api.github.com/users/dmnjohns/gists{/gist_id}","starred_url":"https://api.github.com/users/dmnjohns/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dmnjohns/subscriptions","organizations_url":"https://api.github.com/users/dmnjohns/orgs","repos_url":"https://api.github.com/users/dmnjohns/repos","events_url":"https://api.github.com/users/dmnjohns/events{/privacy}","received_events_url":"https://api.github.com/users/dmnjohns/received_events","type":"User","site_admin":false},"body":"So yesterday I got Jenny's basic test to pass. All of the unit tests are currently passing. I expect something will fail when the PR builder does it's thing, but it's time to get some more eyes on this.","created_at":"2015-06-30T13:31:05Z","updated_at":"2015-08-19T13:51:47Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5c0a027d29d88ddb04523886aed8099fd05dbf16","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/rackerlabs/repose/pulls/1326/commits","review_comments_url":"https://api.github.com/repos/rackerlabs/repose/pulls/1326/comments","review_comment_url":"https://api.github.com/repos/rackerlabs/repose/pulls/comments{/number}","comments_url":"https://api.github.com/repos/rackerlabs/repose/issues/1326/comments","statuses_url":"https://api.github.com/repos/rackerlabs/repose/statuses/e93fb861bc3dfa7c7618d345f2da2007de07f5de","head":{"label":"rackerlabs:REP-1840-newstonev2","ref":"REP-1840-newstonev2","sha":"e93fb861bc3dfa7c7618d345f2da2007de07f5de","user":{"login":"rackerlabs","id":84293,"avatar_url":"https://avatars.githubusercontent.com/u/84293?v=3","gravatar_id":"","url":"https://api.github.com/users/rackerlabs","html_url":"https://github.com/rackerlabs","followers_url":"https://api.github.com/users/rackerlabs/followers","following_url":"https://api.github.com/users/rackerlabs/following{/other_user}","gists_url":"https://api.github.com/users/rackerlabs/gists{/gist_id}","starred_url":"https://api.github.com/users/rackerlabs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rackerlabs/subscriptions","organizations_url":"https://api.github.com/users/rackerlabs/orgs","repos_url":"https://api.github.com/users/rackerlabs/repos","events_url":"https://api.github.com/users/rackerlabs/events{/privacy}","received_events_url":"https://api.github.com/users/rackerlabs/received_events","type":"Organization","site_admin":false},"repo":{"id":1981821,"name":"repose","full_name":"rackerlabs/repose","owner":{"login":"rackerlabs","id":84293,"avatar_url":"https://avatars.githubusercontent.com/u/84293?v=3","gravatar_id":"","url":"https://api.github.com/users/rackerlabs","html_url":"https://github.com/rackerlabs","followers_url":"https://api.github.com/users/rackerlabs/followers","following_url":"https://api.github.com/users/rackerlabs/following{/other_user}","gists_url":"https://api.github.com/users/rackerlabs/gists{/gist_id}","starred_url":"https://api.github.com/users/rackerlabs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rackerlabs/subscriptions","organizations_url":"https://api.github.com/users/rackerlabs/orgs","repos_url":"https://api.github.com/users/rackerlabs/repos","events_url":"https://api.github.com/users/rackerlabs/events{/privacy}","received_events_url":"https://api.github.com/users/rackerlabs/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/rackerlabs/repose","description":"The powerful, programmable, API Middleware Platform","fork":false,"url":"https://api.github.com/repos/rackerlabs/repose","forks_url":"https://api.github.com/repos/rackerlabs/repose/forks","keys_url":"https://api.github.com/repos/rackerlabs/repose/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rackerlabs/repose/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rackerlabs/repose/teams","hooks_url":"https://api.github.com/repos/rackerlabs/repose/hooks","issue_events_url":"https://api.github.com/repos/rackerlabs/repose/issues/events{/number}","events_url":"https://api.github.com/repos/rackerlabs/repose/events","assignees_url":"https://api.github.com/repos/rackerlabs/repose/assignees{/user}","branches_url":"https://api.github.com/repos/rackerlabs/repose/branches{/branch}","tags_url":"https://api.github.com/repos/rackerlabs/repose/tags","blobs_url":"https://api.github.com/repos/rackerlabs/repose/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rackerlabs/repose/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rackerlabs/repose/git/refs{/sha}","trees_url":"https://api.github.com/repos/rackerlabs/repose/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rackerlabs/repose/statuses/{sha}","languages_url":"https://api.github.com/repos/rackerlabs/repose/languages","stargazers_url":"https://api.github.com/repos/rackerlabs/repose/stargazers","contributors_url":"https://api.github.com/repos/rackerlabs/repose/contributors","subscribers_url":"https://api.github.com/repos/rackerlabs/repose/subscribers","subscription_url":"https://api.github.com/repos/rackerlabs/repose/subscription","commits_url":"https://api.github.com/repos/rackerlabs/repose/commits{/sha}","git_commits_url":"https://api.github.com/repos/rackerlabs/repose/git/commits{/sha}","comments_url":"https://api.github.com/repos/rackerlabs/repose/comments{/number}","issue_comment_url":"https://api.github.com/repos/rackerlabs/repose/issues/comments{/number}","contents_url":"https://api.github.com/repos/rackerlabs/repose/contents/{+path}","compare_url":"https://api.github.com/repos/rackerlabs/repose/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rackerlabs/repose/merges","archive_url":"https://api.github.com/repos/rackerlabs/repose/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rackerlabs/repose/downloads","issues_url":"https://api.github.com/repos/rackerlabs/repose/issues{/number}","pulls_url":"https://api.github.com/repos/rackerlabs/repose/pulls{/number}","milestones_url":"https://api.github.com/repos/rackerlabs/repose/milestones{/number}","notifications_url":"https://api.github.com/repos/rackerlabs/repose/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rackerlabs/repose/labels{/name}","releases_url":"https://api.github.com/repos/rackerlabs/repose/releases{/id}","created_at":"2011-07-01T04:39:34Z","updated_at":"2015-08-18T18:20:05Z","pushed_at":"2015-08-19T13:20:47Z","git_url":"git://github.com/rackerlabs/repose.git","ssh_url":"git@github.com:rackerlabs/repose.git","clone_url":"https://github.com/rackerlabs/repose.git","svn_url":"https://github.com/rackerlabs/repose","homepage":"http://www.openrepose.org/","size":119453,"stargazers_count":200,"watchers_count":200,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":58,"mirror_url":null,"open_issues_count":9,"forks":58,"open_issues":9,"watchers":200,"default_branch":"master"}},"base":{"label":"rackerlabs:master","ref":"master","sha":"ab8d738644075eb890eed997ba5ec9a53ded1858","user":{"login":"rackerlabs","id":84293,"avatar_url":"https://avatars.githubusercontent.com/u/84293?v=3","gravatar_id":"","url":"https://api.github.com/users/rackerlabs","html_url":"https://github.com/rackerlabs","followers_url":"https://api.github.com/users/rackerlabs/followers","following_url":"https://api.github.com/users/rackerlabs/following{/other_user}","gists_url":"https://api.github.com/users/rackerlabs/gists{/gist_id}","starred_url":"https://api.github.com/users/rackerlabs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rackerlabs/subscriptions","organizations_url":"https://api.github.com/users/rackerlabs/orgs","repos_url":"https://api.github.com/users/rackerlabs/repos","events_url":"https://api.github.com/users/rackerlabs/events{/privacy}","received_events_url":"https://api.github.com/users/rackerlabs/received_events","type":"Organization","site_admin":false},"repo":{"id":1981821,"name":"repose","full_name":"rackerlabs/repose","owner":{"login":"rackerlabs","id":84293,"avatar_url":"https://avatars.githubusercontent.com/u/84293?v=3","gravatar_id":"","url":"https://api.github.com/users/rackerlabs","html_url":"https://github.com/rackerlabs","followers_url":"https://api.github.com/users/rackerlabs/followers","following_url":"https://api.github.com/users/rackerlabs/following{/other_user}","gists_url":"https://api.github.com/users/rackerlabs/gists{/gist_id}","starred_url":"https://api.github.com/users/rackerlabs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rackerlabs/subscriptions","organizations_url":"https://api.github.com/users/rackerlabs/orgs","repos_url":"https://api.github.com/users/rackerlabs/repos","events_url":"https://api.github.com/users/rackerlabs/events{/privacy}","received_events_url":"https://api.github.com/users/rackerlabs/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/rackerlabs/repose","description":"The powerful, programmable, API Middleware Platform","fork":false,"url":"https://api.github.com/repos/rackerlabs/repose","forks_url":"https://api.github.com/repos/rackerlabs/repose/forks","keys_url":"https://api.github.com/repos/rackerlabs/repose/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rackerlabs/repose/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rackerlabs/repose/teams","hooks_url":"https://api.github.com/repos/rackerlabs/repose/hooks","issue_events_url":"https://api.github.com/repos/rackerlabs/repose/issues/events{/number}","events_url":"https://api.github.com/repos/rackerlabs/repose/events","assignees_url":"https://api.github.com/repos/rackerlabs/repose/assignees{/user}","branches_url":"https://api.github.com/repos/rackerlabs/repose/branches{/branch}","tags_url":"https://api.github.com/repos/rackerlabs/repose/tags","blobs_url":"https://api.github.com/repos/rackerlabs/repose/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rackerlabs/repose/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rackerlabs/repose/git/refs{/sha}","trees_url":"https://api.github.com/repos/rackerlabs/repose/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rackerlabs/repose/statuses/{sha}","languages_url":"https://api.github.com/repos/rackerlabs/repose/languages","stargazers_url":"https://api.github.com/repos/rackerlabs/repose/stargazers","contributors_url":"https://api.github.com/repos/rackerlabs/repose/contributors","subscribers_url":"https://api.github.com/repos/rackerlabs/repose/subscribers","subscription_url":"https://api.github.com/repos/rackerlabs/repose/subscription","commits_url":"https://api.github.com/repos/rackerlabs/repose/commits{/sha}","git_commits_url":"https://api.github.com/repos/rackerlabs/repose/git/commits{/sha}","comments_url":"https://api.github.com/repos/rackerlabs/repose/comments{/number}","issue_comment_url":"https://api.github.com/repos/rackerlabs/repose/issues/comments{/number}","contents_url":"https://api.github.com/repos/rackerlabs/repose/contents/{+path}","compare_url":"https://api.github.com/repos/rackerlabs/repose/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rackerlabs/repose/merges","archive_url":"https://api.github.com/repos/rackerlabs/repose/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rackerlabs/repose/downloads","issues_url":"https://api.github.com/repos/rackerlabs/repose/issues{/number}","pulls_url":"https://api.github.com/repos/rackerlabs/repose/pulls{/number}","milestones_url":"https://api.github.com/repos/rackerlabs/repose/milestones{/number}","notifications_url":"https://api.github.com/repos/rackerlabs/repose/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rackerlabs/repose/labels{/name}","releases_url":"https://api.github.com/repos/rackerlabs/repose/releases{/id}","created_at":"2011-07-01T04:39:34Z","updated_at":"2015-08-18T18:20:05Z","pushed_at":"2015-08-19T13:20:47Z","git_url":"git://github.com/rackerlabs/repose.git","ssh_url":"git@github.com:rackerlabs/repose.git","clone_url":"https://github.com/rackerlabs/repose.git","svn_url":"https://github.com/rackerlabs/repose","homepage":"http://www.openrepose.org/","size":119453,"stargazers_count":200,"watchers_count":200,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":58,"mirror_url":null,"open_issues_count":9,"forks":58,"open_issues":9,"watchers":200,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/rackerlabs/repose/pulls/1326"},"html":{"href":"https://github.com/rackerlabs/repose/pull/1326"},"issue":{"href":"https://api.github.com/repos/rackerlabs/repose/issues/1326"},"comments":{"href":"https://api.github.com/repos/rackerlabs/repose/issues/1326/comments"},"review_comments":{"href":"https://api.github.com/repos/rackerlabs/repose/pulls/1326/comments"},"review_comment":{"href":"https://api.github.com/repos/rackerlabs/repose/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/rackerlabs/repose/pulls/1326/commits"},"statuses":{"href":"https://api.github.com/repos/rackerlabs/repose/statuses/e93fb861bc3dfa7c7618d345f2da2007de07f5de"}}}}