{"action":"created","comment":{"url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/pulls/comments/38880190","id":38880190,"diff_hunk":"@@ -0,0 +1,499 @@\n+/*\n+ * Copyright (c) 2014-2015 Digital Bazaar, Inc. All rights reserved.\n+ */\n+\n+'use strict';\n+\n+var bedrock = require('bedrock');\n+var config = bedrock.config;\n+var async = require('async');\n+var request = require('request');\n+var jar = request.jar();\n+request = request.defaults({jar: jar, json: true});\n+\n+process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0;\n+\n+describe('bedrock-idp unauthenticated', function() {\n+\n+  it('should allow an unauthenticated request to /i/:id', function(done) {\n+    var testIdentity = config.idp.test.testUser;\n+    var testService = bedrock.config.server.baseUri +\n+      bedrock.config.idp.identityBasePath + '/' + testIdentity;\n+    request.get(\n+      testService,\n+      function(err, res, body) {\n+        res.headers['set-cookie'].should.exist;\n+        res.statusCode.should.equal(200);\n+        body.should.have.property('@context');\n+        body.should.have.property('id');\n+        body.should.have.property('type');\n+        body.id.should.equal(testService);\n+        body.type.should.equal('Identity');\n+        done(err);\n+      }\n+    );\n+  });\n+\n+  it('should allow an unauthenticated request to /i/:id/keys', function(done) {\n+    var testIdentity = config.idp.test.testUser;\n+    var idPath = config.server.baseUri +\n+      config.idp.identityBasePath + '/' + testIdentity + '/keys';\n+    var testService = idPath;\n+    request.get(\n+      testService,\n+      function(err, res, body) {\n+        res.statusCode.should.equal(200);\n+        body.should.be.an('array');\n+        body.should.have.length(1);\n+        var key = body[0];\n+        key.should.have.property('@context');\n+        key.should.have.property('id');\n+        key.should.have.property('type');\n+        key.should.have.property('label');\n+        key.should.have.property('publicKeyPem');\n+        done(err);\n+      }\n+    );\n+  });\n+\n+  it('should allow an unauthenticated request /i/:id/keys/#', function(done) {\n+    var testIdentity = config.idp.test.testUser;\n+    var idPath = config.server.baseUri +\n+      config.idp.identityBasePath + '/' + testIdentity + '/keys';\n+    var testService = idPath;\n+    async.waterfall([\n+      function(callback) {\n+        request.get(testService, function(err, res, body) {\n+          callback(err, body[0].id);\n+        });\n+      },\n+      function(url, callback) {\n+        request.get(url, function(err, res, body) {\n+          res.statusCode.should.equal(200);\n+          res.body.should.be.an('object');\n+          body.should.have.property('@context');\n+          body.should.have.property('id');\n+          body.id.should.equal(url);\n+          body.should.have.property('type');\n+          body.should.have.property('label');\n+          body.should.have.property('publicKeyPem');\n+          callback(err);\n+        });\n+      }\n+    ], done);\n+  });\n+\n+  it('should return 404 on unknown id request to /i/:id', function(done) {\n+    var testIdentity = 'someUnknownIdentity';\n+    var idPath = bedrock.config.server.baseUri +\n+      bedrock.config.idp.identityBasePath + '/' + testIdentity;\n+    var testService = idPath;\n+    request.get(\n+      testService,\n+      function(err, res, body) {\n+        res.statusCode.should.equal(404);\n+        body.should.be.an('object');\n+        body.should.have.property('message');\n+        body.should.have.property('type');\n+        body.type.should.equal('NotFound');\n+        body.should.have.property('details');\n+        body.should.have.property('cause');\n+        done(err);\n+      }\n+    );\n+  });\n+\n+  it('should return 404 on unknown id request to /i/:id/keys', function(done) {\n+    var testIdentity = 'someUnknownIdentity';\n+    var idPath = bedrock.config.server.baseUri +\n+      bedrock.config.idp.identityBasePath + '/' + testIdentity + '/keys';\n+    var testService = idPath;\n+    request.get(\n+      testService,\n+      function(err, res, body) {\n+        res.statusCode.should.equal(404);\n+        body.should.be.an('object');\n+        body.should.have.property('message');\n+        body.should.have.property('type');\n+        body.type.should.equal('NotFound');\n+        body.should.have.property('details');\n+        body.should.have.property('cause');\n+        done(err);\n+      }\n+    );\n+  });\n+\n+  it('should return 404 on request to /i/:id/badendpoint', function(done) {\n+    var testIdentity = config.idp.test.testUser;\n+    var idPath = bedrock.config.server.baseUri +\n+      bedrock.config.idp.identityBasePath + '/' + testIdentity + '/badendpoint';\n+    var testService = idPath;\n+    request.get(\n+      testService,\n+      function(err, res, body) {\n+        // console.log('STATUS', res.statusCode);\n+        // console.log('body', body);\n+        res.statusCode.should.equal(404);\n+        // FIXME: body of this response is null\n+        done(err);\n+      }\n+    );\n+  });\n+\n+  it('should return 404 on an unknown key /i/:id/keys/#', function(done) {\n+    var testIdentity = config.idp.test.testUser;\n+    var idPath = config.server.baseUri +\n+      config.idp.identityBasePath + '/' + testIdentity + '/keys/999';\n+    var testService = idPath;\n+    request.get(idPath, function(err, res, body) {\n+      res.statusCode.should.equal(404);\n+      body.should.be.an('object');\n+      body.should.have.property('message');\n+      body.should.have.property('type');\n+      body.type.should.equal('NotFound');\n+      body.should.have.property('details');\n+      body.details.should.be.an('object');\n+      body.details.should.have.property('key');\n+      body.details.key.should.be.an('object');\n+      body.details.key.should.have.property('id');\n+      body.details.key.id.should.equal(idPath);\n+      body.should.have.property('cause');\n+      done(err);\n+    });\n+  });\n+\n+  // this is proper request, it is not authenticated\n+  it('should not accept post to add a public key', function(done) {\n+    var keyService =\n+      config.server.baseUri +   bedrock.config.idp.identityBasePath +\n+      '/' + config.idp.test.testUser + '/keys';\n+    var publicKey = config.idp.test.publicKeys[0];\n+    request.post(\n+      {\n+        url: keyService,\n+        body: publicKey,\n+        json: true\n+      },\n+      function(err, res, body) {\n+        res.statusCode.should.equal(400);\n+        body.should.be.an('object');\n+        body.should.have.property('message');\n+        body.should.have.property('type');\n+        body.type.should.equal('PermissionDenied');\n+        body.should.have.property('details');\n+        body.details.should.be.an('object');\n+        body.should.have.property('cause');\n+        done(err);\n+      }\n+    );\n+  });\n+\n+});\n+\n+describe('bedrock-idp authenticated', function() {\n+  before(function(done) {\n+    login(done);\n+  });\n+\n+  after(function(done) {\n+    logout(done);\n+  });\n+\n+  it('should accept post to add a public key', function(done) {\n+    var keyService =\n+      config.server.baseUri +   bedrock.config.idp.identityBasePath +\n+      '/' + config.idp.test.testUser + '/keys';\n+    var publicKey = config.idp.test.publicKeys[0];\n+    request.post(\n+      {\n+        url: keyService,\n+        body: publicKey,\n+        json: true\n+      },\n+      function(err, res, body) {\n+        res.statusCode.should.equal(201);\n+        body.should.be.an('object');\n+        body.should.have.property('@context');\n+        // NOTE: id provides url to retrieve the key\n+        body.should.have.property('id');\n+        body.should.have.property('type');\n+        body.should.have.property('label');\n+        body.should.have.property('publicKeyPem');\n+        res.headers.should.be.an('object');\n+        res.headers.should.have.property('location');\n+        res.headers.location.should.equal(body.id);\n+        done(err);\n+      }\n+    );\n+  });\n+\n+  it('should return 409 on post to add a duplicate public key', function(done) {\n+    var keyService =\n+      config.server.baseUri +   bedrock.config.idp.identityBasePath +\n+      '/' + config.idp.test.testUser + '/keys';\n+    var publicKey = config.idp.test.publicKeys[1];\n+    async.series([\n+      function(callback) {\n+        request.post(\n+          {\n+            url: keyService,\n+            body: publicKey,\n+            json: true\n+          },\n+          callback);\n+      },\n+      function(callback) {\n+        request.post(\n+          {\n+            url: keyService,\n+            body: publicKey,\n+            json: true\n+          },\n+          function(err, res, body) {\n+            res.statusCode.should.equal(409);\n+            body.should.be.an('object');\n+            body.should.have.property('message');\n+            body.should.have.property('type');\n+            body.type.should.equal('DuplicateIdentityKey');\n+            body.should.have.property('details');\n+            body.details.should.be.an('object');\n+            body.should.have.property('cause');\n+            callback(err);\n+          }\n+        );\n+      }\n+    ], done);\n+  });\n+\n+  it(\n+    'should return 400 on post to add a malformed public key', function(done) {\n+      var keyService =\n+        config.server.baseUri +   bedrock.config.idp.identityBasePath +\n+        '/' + config.idp.test.testUser + '/keys';\n+      var publicKey = bedrock.util.clone(config.idp.test.publicKeys[2]);\n+      // remove @context to test validator\n+      delete publicKey['@context'];\n+      request.post(\n+        {\n+          url: keyService,\n+          body: publicKey,\n+          json: true\n+        },\n+        function(err, res, body) {\n+          res.statusCode.should.equal(400);\n+          body.should.be.an('object');\n+          body.should.have.property('message');\n+          body.should.have.property('type');\n+          body.type.should.equal('ValidationError');\n+          body.should.have.property('details');\n+          body.details.should.be.an('object');\n+          body.details.should.have.property('errors');\n+          body.details.errors.should.be.an('array');\n+          body.details.errors.should.have.length(1);\n+          var error = body.details.errors[0];\n+          error.should.be.an('object');\n+          error.should.have.property('details');\n+          error.details.should.be.an('object');\n+          error.details.should.have.property('path');\n+          error.details.path.should.equal('@context');\n+          error.details.should.have.property('errors');\n+          error.details.errors.should.be.an('object');\n+          error.details.errors.should.have.property('missing');\n+          body.should.have.property('cause');\n+          done(err);\n+        }\n+      );\n+    });\n+\n+  it('should revoke a public key', function(done) {\n+    var keyService =\n+      config.server.baseUri +   bedrock.config.idp.identityBasePath +\n+      '/' + config.idp.test.testUser + '/keys';\n+    // NOTE: this key was referenced in the previous test but not inserted\n+    var publicKey = config.idp.test.publicKeys[2];\n+    async.waterfall([\n+      function(callback) {\n+        request.post(\n+          {\n+            url: keyService,\n+            body: publicKey,\n+            json: true\n+          },\n+          function(err, res, body) {\n+            callback(err, body.id);\n+          });\n+      },\n+      function(keyUrl, callback) {\n+        var keyInfo = {\n+          '@context': 'https://w3id.org/identity/v1',\n+          id: keyUrl,\n+          revoked: ''\n+        };\n+        request.post(\n+          {\n+            url: keyUrl,\n+            body: keyInfo,\n+            json: true\n+          },\n+          function(err, res, body) {\n+            res.statusCode.should.equal(200);\n+            body.should.be.an('object');\n+            body.should.have.property('@context');\n+            // NOTE: id provides url to retrieve the key\n+            body.should.have.property('id');\n+            body.should.have.property('type');\n+            body.should.have.property('label');\n+            body.should.have.property('publicKeyPem');\n+            body.should.have.property('revoked');\n+            body.revoked.should.be.a('string');\n+            callback(err, keyUrl);\n+          }\n+        );\n+      },\n+      function(keyUrl, callback) {\n+        // retrieve keyUrl to make sure revoked is present\n+        request.get(\n+          {\n+            url: keyUrl,\n+            json: true\n+          },\n+          function(err, res, body) {\n+            res.statusCode.should.equal(200);\n+            body.should.be.an('object');\n+            body.should.have.property('@context');\n+            // NOTE: id provides url to retrieve the key\n+            body.should.have.property('id');\n+            body.should.have.property('type');\n+            body.should.have.property('label');\n+            body.should.have.property('publicKeyPem');\n+            body.should.have.property('revoked');\n+            body.revoked.should.be.a('string');\n+            callback(err);\n+          }\n+        );\n+      }\n+    ], done);\n+  });\n+\n+  it('should modify label on a public key', function(done) {\n+    var keyService =\n+      config.server.baseUri +   bedrock.config.idp.identityBasePath +\n+      '/' + config.idp.test.testUser + '/keys';\n+    // NOTE: this key was referenced in the previous test but not inserted\n+    var publicKey = config.idp.test.publicKeys[3];\n+    async.waterfall([\n+      function(callback) {\n+        request.post(\n+          {\n+            url: keyService,\n+            body: publicKey,\n+            json: true\n+          },\n+          function(err, res, body) {\n+            callback(err, body.id);\n+          });\n+      },\n+      function(keyUrl, callback) {\n+        var keyInfo = {\n+          '@context': 'https://w3id.org/identity/v1',\n+          id: keyUrl,\n+          label: 'newLabel3'\n+        };\n+        request.post(\n+          {\n+            url: keyUrl,\n+            body: keyInfo,\n+            json: true\n+          },\n+          function(err, res, body) {\n+            res.statusCode.should.equal(204);\n+            should.not.exist(body);\n+            callback(err, keyUrl);\n+          }\n+        );\n+      },\n+      function(keyUrl, callback) {\n+        // retrieve keyUrl to make sure revoked is present\n+        request.get(\n+          {\n+            url: keyUrl,\n+            json: true\n+          },\n+          function(err, res, body) {\n+            res.statusCode.should.equal(200);\n+            body.should.be.an('object');\n+            body.should.have.property('@context');\n+            body.should.have.property('id');\n+            body.should.have.property('type');\n+            body.should.have.property('label');\n+            body.label.should.equal('newLabel3');\n+            body.should.have.property('publicKeyPem');\n+            callback(err);\n+          }\n+        );\n+      }\n+    ], done);\n+  });\n+\n+  it('should return 404 on attempt to modify unknown key', function(done) {\n+    var testIdentity = config.idp.test.testUser;\n+    var keyService = config.server.baseUri +\n+      config.idp.identityBasePath + '/' + testIdentity + '/keys/999';\n+    var keyInfo = {\n+      '@context': 'https://w3id.org/identity/v1',\n+      id: keyService,\n+      label: 'newLabel3'\n+    };\n+    request.post(\n+      {\n+        url: keyService,\n+        body: keyInfo,\n+        json: true\n+      },\n+      function(err, res, body) {\n+        res.statusCode.should.equal(404);\n+        body.should.be.an('object');\n+        body.should.have.property('message');\n+        body.should.have.property('type');\n+        body.type.should.equal('NotFound');\n+        body.should.have.property('details');\n+        body.details.should.be.an('object');\n+        body.details.should.have.property('key');\n+        body.details.key.should.be.an('object');\n+        body.details.key.should.have.property('id');\n+        body.details.key.id.should.equal(keyService);\n+        body.should.have.property('cause');\n+        done(err);\n+      }\n+    );\n+  });\n+\n+});\n+\n+function login(callback) {\n+  var loginService = config.server.baseUri + '/session/login';\n+  request.post(\n+    {\n+      url: loginService,\n+      body: {sysIdentifier: config.idp.test.testUser, password: 'password'},\n+      json: true\n+    },\n+    function(err, res, body) {\n+      // console.log('LOGINBODY', body);\n+      callback(err);\n+    }\n+  );\n+};\n+\n+function logout(callback) {\n+  var logoutService = config.server.baseUri + '/session/logout';\n+  request.get(\n+    {","path":"tests/mocha/009-services.js","position":491,"original_position":491,"commit_id":"da90006acd05d530ce27a66a2e1081d176d94713","original_commit_id":"da90006acd05d530ce27a66a2e1081d176d94713","user":{"login":"dlongley","id":168137,"avatar_url":"https://avatars.githubusercontent.com/u/168137?v=3","gravatar_id":"","url":"https://api.github.com/users/dlongley","html_url":"https://github.com/dlongley","followers_url":"https://api.github.com/users/dlongley/followers","following_url":"https://api.github.com/users/dlongley/following{/other_user}","gists_url":"https://api.github.com/users/dlongley/gists{/gist_id}","starred_url":"https://api.github.com/users/dlongley/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dlongley/subscriptions","organizations_url":"https://api.github.com/users/dlongley/orgs","repos_url":"https://api.github.com/users/dlongley/repos","events_url":"https://api.github.com/users/dlongley/events{/privacy}","received_events_url":"https://api.github.com/users/dlongley/received_events","type":"User","site_admin":false},"body":"Nits: move brace up, fix indentation.","created_at":"2015-09-07T21:23:55Z","updated_at":"2015-09-07T21:23:55Z","html_url":"https://github.com/digitalbazaar/bedrock-idp/pull/4#discussion_r38880190","pull_request_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/pulls/4","_links":{"self":{"href":"https://api.github.com/repos/digitalbazaar/bedrock-idp/pulls/comments/38880190"},"html":{"href":"https://github.com/digitalbazaar/bedrock-idp/pull/4#discussion_r38880190"},"pull_request":{"href":"https://api.github.com/repos/digitalbazaar/bedrock-idp/pulls/4"}}},"pull_request":{"url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/pulls/4","id":44379270,"html_url":"https://github.com/digitalbazaar/bedrock-idp/pull/4","diff_url":"https://github.com/digitalbazaar/bedrock-idp/pull/4.diff","patch_url":"https://github.com/digitalbazaar/bedrock-idp/pull/4.patch","issue_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/issues/4","number":4,"state":"open","locked":false,"title":"Protractortests","user":{"login":"dlongley","id":168137,"avatar_url":"https://avatars.githubusercontent.com/u/168137?v=3","gravatar_id":"","url":"https://api.github.com/users/dlongley","html_url":"https://github.com/dlongley","followers_url":"https://api.github.com/users/dlongley/followers","following_url":"https://api.github.com/users/dlongley/following{/other_user}","gists_url":"https://api.github.com/users/dlongley/gists{/gist_id}","starred_url":"https://api.github.com/users/dlongley/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dlongley/subscriptions","organizations_url":"https://api.github.com/users/dlongley/orgs","repos_url":"https://api.github.com/users/dlongley/repos","events_url":"https://api.github.com/users/dlongley/events{/privacy}","received_events_url":"https://api.github.com/users/dlongley/received_events","type":"User","site_admin":false},"body":"","created_at":"2015-09-07T21:07:29Z","updated_at":"2015-09-07T21:23:55Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0ff8684a5837cff4e0914edaa6fb2beba2498892","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/pulls/4/commits","review_comments_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/pulls/4/comments","review_comment_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/pulls/comments{/number}","comments_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/issues/4/comments","statuses_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/statuses/da90006acd05d530ce27a66a2e1081d176d94713","head":{"label":"digitalbazaar:protractortests","ref":"protractortests","sha":"da90006acd05d530ce27a66a2e1081d176d94713","user":{"login":"digitalbazaar","id":167436,"avatar_url":"https://avatars.githubusercontent.com/u/167436?v=3","gravatar_id":"","url":"https://api.github.com/users/digitalbazaar","html_url":"https://github.com/digitalbazaar","followers_url":"https://api.github.com/users/digitalbazaar/followers","following_url":"https://api.github.com/users/digitalbazaar/following{/other_user}","gists_url":"https://api.github.com/users/digitalbazaar/gists{/gist_id}","starred_url":"https://api.github.com/users/digitalbazaar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/digitalbazaar/subscriptions","organizations_url":"https://api.github.com/users/digitalbazaar/orgs","repos_url":"https://api.github.com/users/digitalbazaar/repos","events_url":"https://api.github.com/users/digitalbazaar/events{/privacy}","received_events_url":"https://api.github.com/users/digitalbazaar/received_events","type":"Organization","site_admin":false},"repo":{"id":29356227,"name":"bedrock-idp","full_name":"digitalbazaar/bedrock-idp","owner":{"login":"digitalbazaar","id":167436,"avatar_url":"https://avatars.githubusercontent.com/u/167436?v=3","gravatar_id":"","url":"https://api.github.com/users/digitalbazaar","html_url":"https://github.com/digitalbazaar","followers_url":"https://api.github.com/users/digitalbazaar/followers","following_url":"https://api.github.com/users/digitalbazaar/following{/other_user}","gists_url":"https://api.github.com/users/digitalbazaar/gists{/gist_id}","starred_url":"https://api.github.com/users/digitalbazaar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/digitalbazaar/subscriptions","organizations_url":"https://api.github.com/users/digitalbazaar/orgs","repos_url":"https://api.github.com/users/digitalbazaar/repos","events_url":"https://api.github.com/users/digitalbazaar/events{/privacy}","received_events_url":"https://api.github.com/users/digitalbazaar/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/digitalbazaar/bedrock-idp","description":"Bedrock Identity Provider","fork":false,"url":"https://api.github.com/repos/digitalbazaar/bedrock-idp","forks_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/forks","keys_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/keys{/key_id}","collaborators_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/teams","hooks_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/hooks","issue_events_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/issues/events{/number}","events_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/events","assignees_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/assignees{/user}","branches_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/branches{/branch}","tags_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/tags","blobs_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/git/refs{/sha}","trees_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/git/trees{/sha}","statuses_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/statuses/{sha}","languages_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/languages","stargazers_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/stargazers","contributors_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/contributors","subscribers_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/subscribers","subscription_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/subscription","commits_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/commits{/sha}","git_commits_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/git/commits{/sha}","comments_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/comments{/number}","issue_comment_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/issues/comments{/number}","contents_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/contents/{+path}","compare_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/compare/{base}...{head}","merges_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/merges","archive_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/downloads","issues_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/issues{/number}","pulls_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/pulls{/number}","milestones_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/milestones{/number}","notifications_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/labels{/name}","releases_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/releases{/id}","created_at":"2015-01-16T16:13:09Z","updated_at":"2015-05-07T22:24:18Z","pushed_at":"2015-09-07T21:07:29Z","git_url":"git://github.com/digitalbazaar/bedrock-idp.git","ssh_url":"git@github.com:digitalbazaar/bedrock-idp.git","clone_url":"https://github.com/digitalbazaar/bedrock-idp.git","svn_url":"https://github.com/digitalbazaar/bedrock-idp","homepage":null,"size":1012,"stargazers_count":1,"watchers_count":1,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":4,"forks":0,"open_issues":4,"watchers":1,"default_branch":"master"}},"base":{"label":"digitalbazaar:2.x","ref":"2.x","sha":"5754c727ab3537e7fed7884c0ba9052a04318427","user":{"login":"digitalbazaar","id":167436,"avatar_url":"https://avatars.githubusercontent.com/u/167436?v=3","gravatar_id":"","url":"https://api.github.com/users/digitalbazaar","html_url":"https://github.com/digitalbazaar","followers_url":"https://api.github.com/users/digitalbazaar/followers","following_url":"https://api.github.com/users/digitalbazaar/following{/other_user}","gists_url":"https://api.github.com/users/digitalbazaar/gists{/gist_id}","starred_url":"https://api.github.com/users/digitalbazaar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/digitalbazaar/subscriptions","organizations_url":"https://api.github.com/users/digitalbazaar/orgs","repos_url":"https://api.github.com/users/digitalbazaar/repos","events_url":"https://api.github.com/users/digitalbazaar/events{/privacy}","received_events_url":"https://api.github.com/users/digitalbazaar/received_events","type":"Organization","site_admin":false},"repo":{"id":29356227,"name":"bedrock-idp","full_name":"digitalbazaar/bedrock-idp","owner":{"login":"digitalbazaar","id":167436,"avatar_url":"https://avatars.githubusercontent.com/u/167436?v=3","gravatar_id":"","url":"https://api.github.com/users/digitalbazaar","html_url":"https://github.com/digitalbazaar","followers_url":"https://api.github.com/users/digitalbazaar/followers","following_url":"https://api.github.com/users/digitalbazaar/following{/other_user}","gists_url":"https://api.github.com/users/digitalbazaar/gists{/gist_id}","starred_url":"https://api.github.com/users/digitalbazaar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/digitalbazaar/subscriptions","organizations_url":"https://api.github.com/users/digitalbazaar/orgs","repos_url":"https://api.github.com/users/digitalbazaar/repos","events_url":"https://api.github.com/users/digitalbazaar/events{/privacy}","received_events_url":"https://api.github.com/users/digitalbazaar/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/digitalbazaar/bedrock-idp","description":"Bedrock Identity Provider","fork":false,"url":"https://api.github.com/repos/digitalbazaar/bedrock-idp","forks_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/forks","keys_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/keys{/key_id}","collaborators_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/teams","hooks_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/hooks","issue_events_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/issues/events{/number}","events_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/events","assignees_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/assignees{/user}","branches_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/branches{/branch}","tags_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/tags","blobs_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/git/refs{/sha}","trees_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/git/trees{/sha}","statuses_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/statuses/{sha}","languages_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/languages","stargazers_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/stargazers","contributors_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/contributors","subscribers_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/subscribers","subscription_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/subscription","commits_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/commits{/sha}","git_commits_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/git/commits{/sha}","comments_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/comments{/number}","issue_comment_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/issues/comments{/number}","contents_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/contents/{+path}","compare_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/compare/{base}...{head}","merges_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/merges","archive_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/downloads","issues_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/issues{/number}","pulls_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/pulls{/number}","milestones_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/milestones{/number}","notifications_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/labels{/name}","releases_url":"https://api.github.com/repos/digitalbazaar/bedrock-idp/releases{/id}","created_at":"2015-01-16T16:13:09Z","updated_at":"2015-05-07T22:24:18Z","pushed_at":"2015-09-07T21:07:29Z","git_url":"git://github.com/digitalbazaar/bedrock-idp.git","ssh_url":"git@github.com:digitalbazaar/bedrock-idp.git","clone_url":"https://github.com/digitalbazaar/bedrock-idp.git","svn_url":"https://github.com/digitalbazaar/bedrock-idp","homepage":null,"size":1012,"stargazers_count":1,"watchers_count":1,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":4,"forks":0,"open_issues":4,"watchers":1,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/digitalbazaar/bedrock-idp/pulls/4"},"html":{"href":"https://github.com/digitalbazaar/bedrock-idp/pull/4"},"issue":{"href":"https://api.github.com/repos/digitalbazaar/bedrock-idp/issues/4"},"comments":{"href":"https://api.github.com/repos/digitalbazaar/bedrock-idp/issues/4/comments"},"review_comments":{"href":"https://api.github.com/repos/digitalbazaar/bedrock-idp/pulls/4/comments"},"review_comment":{"href":"https://api.github.com/repos/digitalbazaar/bedrock-idp/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/digitalbazaar/bedrock-idp/pulls/4/commits"},"statuses":{"href":"https://api.github.com/repos/digitalbazaar/bedrock-idp/statuses/da90006acd05d530ce27a66a2e1081d176d94713"}}}}