diff --git a/.rubocop.yml b/.rubocop.yml new file mode 100644 index 000000000..621674e56 --- /dev/null +++ b/.rubocop.yml @@ -0,0 +1,3 @@ +Metrics/BlockLength: + Exclude: + spec/**/*_spec.rb diff --git a/Gemfile b/Gemfile index 944165098..2eb60f12a 100644 --- a/Gemfile +++ b/Gemfile @@ -1,36 +1,33 @@ +# frozen_string_literal: true + source 'https://rubygems.org' -gem 'jruby-openssl', :platforms => :jruby -gem 'rake', '> 11.0.1', '< 12.0' +gem 'jruby-openssl', platforms: :jruby +gem 'rake', '~> 13.0', '>= 13.0.1' group :development do - gem 'awesome_print', :require => 'ap' - gem 'guard-rspec', '~> 4.5' - gem 'hirb-unicode' - gem 'pry' - gem 'redcarpet' - gem 'wirb' - gem 'wirble' + gem 'awesome_print', require: 'ap' gem 'yard' end group :test do - gem 'coveralls', :require => false - gem 'json', '~> 1.7', :platforms => [:jruby] - gem 'jwt', '~> 1.5', '>= 1.5.6' - gem 'multi_json', '~> 1.11.0' - gem 'mime-types', '< 2.0.0' - gem 'netrc', '~> 0.7.7' - gem 'rb-fsevent', '~> 0.9' - gem 'rspec', '~> 3.0.0' - gem 'simplecov', :require => false - gem 'vcr', '~> 4.0' - gem 'webmock', '~> 3.4', '>= 3.4.2' + gem 'coveralls', require: false + gem 'json', '~> 1.7', platforms: [:jruby] + gem 'jwt', '~> 2.2', '>= 2.2.1' + gem 'mime-types', '~> 3.3', '>= 3.3.1' + gem 'multi_json', '~> 1.14', '>= 1.14.1' + gem 'netrc', '~> 0.11.0' + gem 'rb-fsevent', '~> 0.10.3' + gem 'rspec', '~> 3.9' + gem 'simplecov', require: false + gem 'vcr', '~> 5.1' + gem 'webmock', '~> 3.8', '>= 3.8.2' end -platforms :rbx do - gem 'psych' - gem 'rubysl', '~> 2.0' +group :test, :development do + gem 'pry-byebug' + gem 'redcarpet' + gem 'rubocop' end gemspec diff --git a/lib/octokit/client.rb b/lib/octokit/client.rb index e30cf554b..65cf0ec52 100644 --- a/lib/octokit/client.rb +++ b/lib/octokit/client.rb @@ -36,6 +36,7 @@ require 'octokit/client/marketplace' require 'octokit/client/milestones' require 'octokit/client/notifications' +require 'octokit/client/oauth_applications' require 'octokit/client/objects' require 'octokit/client/organizations' require 'octokit/client/pages' @@ -97,6 +98,7 @@ class Client include Octokit::Client::Marketplace include Octokit::Client::Milestones include Octokit::Client::Notifications + include Octokit::Client::OauthApplications include Octokit::Client::Objects include Octokit::Client::Organizations include Octokit::Client::Pages diff --git a/lib/octokit/client/authorizations.rb b/lib/octokit/client/authorizations.rb index ba8a5acae..69a03eff5 100644 --- a/lib/octokit/client/authorizations.rb +++ b/lib/octokit/client/authorizations.rb @@ -140,77 +140,6 @@ def scopes(token = @access_token, options = {}) sort end - # Check if a token is valid. - # - # Applications can check if a token is valid without rate limits. - # - # @param token [String] 40 character GitHub OAuth access token - # - # @return [Sawyer::Resource] A single authorization for the authenticated user - # @see https://developer.github.com/v3/oauth_authorizations/#check-an-authorization - # @example - # client = Octokit::Client.new(:client_id => 'abcdefg12345', :client_secret => 'secret') - # client.check_application_authorization('deadbeef1234567890deadbeef987654321') - def check_application_authorization(token, options = {}) - opts = ensure_api_media_type(:applications_api, options.dup) - opts[:access_token] = token - key = opts.delete(:client_id) || client_id - secret = opts.delete(:client_secret) || client_secret - - as_app(key, secret) do |app_client| - app_client.post "applications/#{client_id}/tokens", opts - end - end - - # Reset a token - # - # Applications can reset a token without requiring a user to re-authorize. - # - # @param token [String] 40 character GitHub OAuth access token - # - # @return [Sawyer::Resource] A single authorization for the authenticated user - # @see https://developer.github.com/v3/oauth_authorizations/#reset-an-authorization - # @example - # client = Octokit::Client.new(:client_id => 'abcdefg12345', :client_secret => 'secret') - # client.reset_application_authorization('deadbeef1234567890deadbeef987654321') - def reset_application_authorization(token, options = {}) - opts = ensure_api_media_type(:applications_api, options.dup) - opts[:access_token] = token - key = opts.delete(:client_id) || client_id - secret = opts.delete(:client_secret) || client_secret - - as_app(key, secret) do |app_client| - app_client.patch "applications/#{client_id}/tokens", opts - end - end - - # Revoke a token - # - # Applications can revoke (delete) a token - # - # @param token [String] 40 character GitHub OAuth access token - # - # @return [Boolean] Result - # @see https://developer.github.com/v3/oauth_authorizations/#revoke-an-authorization-for-an-application - # @example - # client = Octokit::Client.new(:client_id => 'abcdefg12345', :client_secret => 'secret') - # client.revoke_application_authorization('deadbeef1234567890deadbeef987654321') - def revoke_application_authorization(token, options = {}) - opts = ensure_api_media_type(:applications_api, options.dup) - opts[:access_token] = token - key = opts.delete(:client_id) || client_id - secret = opts.delete(:client_secret) || client_secret - - as_app(key, secret) do |app_client| - app_client.delete "applications/#{client_id}/tokens", opts - - app_client.last_response.status == 204 - end - rescue Octokit::NotFound - false - end - alias :delete_application_authorization :revoke_application_authorization - # Revoke all tokens for an app # # Applications can revoke all of their tokens in a single request @@ -236,7 +165,7 @@ def revoke_all_application_authorizations(options = {}) def authorize_url(app_id = client_id, options = {}) opts = options.dup if app_id.to_s.empty? - raise Octokit::ApplicationCredentialsRequired.new "client_id required" + raise Octokit::ApplicationCredentialsRequired, "client_id required" end authorize_url = opts.delete(:endpoint) || Octokit.web_endpoint authorize_url << "login/oauth/authorize?client_id=#{app_id}" diff --git a/lib/octokit/client/oauth_applications.rb b/lib/octokit/client/oauth_applications.rb new file mode 100644 index 000000000..221d00e3b --- /dev/null +++ b/lib/octokit/client/oauth_applications.rb @@ -0,0 +1,122 @@ +# frozen_string_literal: true + +module Octokit + class Client + + # Methods for the OauthApplications API + # + # @see https://developer.github.com/v3/apps/oauth_applications + module OauthApplications + + # Check if a token is valid. + # + # Applications can check if a token is valid without rate limits. + # + # @param access_token [String] 40 character GitHub OAuth access token + # + # @return [Sawyer::Resource] A single authorization for the authenticated user + # @see https://developer.github.com/v3/apps/oauth_applications/#check-a-token + # + # @example + # client = Octokit::Client.new(:client_id => 'abcdefg12345', :client_secret => 'secret') + # client.check_token('deadbeef1234567890deadbeef987654321') + def check_token(access_token, options = {}) + options = ensure_api_media_type(:applications_api, options.dup) + options[:access_token] = access_token + + key = options.delete(:client_id) || client_id + secret = options.delete(:client_secret) || client_secret + + as_app(key, secret) do |app_client| + app_client.post "applications/#{client_id}/token", options + end + end + alias check_application_authorization check_token + + # Reset a token + # + # Applications can reset a token without requiring a user to re-authorize. + # + # @param access_token [String] 40 character GitHub OAuth access token + # + # @return [Sawyer::Resource] A single authorization for the authenticated user + # @see https://developer.github.com/v3/apps/oauth_applications/#reset-a-token + # + # @example + # client = Octokit::Client.new(:client_id => 'abcdefg12345', :client_secret => 'secret') + # client.reset_token('deadbeef1234567890deadbeef987654321') + def reset_token(access_token, options = {}) + options = ensure_api_media_type(:applications_api, options.dup) + options[:access_token] = access_token + + key = options.delete(:client_id) || client_id + secret = options.delete(:client_secret) || client_secret + + as_app(key, secret) do |app_client| + app_client.patch "applications/#{client_id}/token", options + end + end + alias reset_application_authorization reset_token + + # Delete an app token + # + # Applications can revoke (delete) a token + # + # @param token [String] 40 character GitHub OAuth access token + # + # @return [Boolean] Result + # @see https://developer.github.com/v3/apps/oauth_applications/#delete-an-app-token + # + # @example + # client = Octokit::Client.new(:client_id => 'abcdefg12345', :client_secret => 'secret') + # client.delete_token('deadbeef1234567890deadbeef987654321') + def delete_app_token(access_token, options = {}) + options = ensure_api_media_type(:applications_api, options.dup) + options[:access_token] = access_token + + key = options.delete(:client_id) || client_id + secret = options.delete(:client_secret) || client_secret + + begin + as_app(key, secret) do |app_client| + app_client.delete "applications/#{client_id}/token", options + app_client.last_response.status == 204 + end + rescue Octokit::NotFound + false + end + end + alias delete_application_authorization delete_app_token + alias revoke_application_authorization delete_app_token + + # Delete an app authorization + # + # OAuth application owners can revoke a grant for their OAuth application and a specific user. + # + # @param accces_token [String] 40 character GitHub OAuth access token + # + # @return [Boolean] Result + # @see https://developer.github.com/v3/apps/oauth_applications/#delete-an-app-token + # + # @example + # client = Octokit::Client.new(:client_id => 'abcdefg12345', :client_secret => 'secret') + # client.delete_app_authorization('deadbeef1234567890deadbeef987654321') + def delete_app_authorization(access_token, options = {}) + options = ensure_api_media_type(:applications_api, options.dup) + options[:access_token] = access_token + + key = options.delete(:client_id) || client_id + secret = options.delete(:client_secret) || client_secret + + begin + as_app(key, secret) do |app_client| + app_client.delete "applications/#{client_id}/grant", options + app_client.last_response.status == 204 + end + rescue Octokit::NotFound + false + end + end + end + end +end diff --git a/spec/cassettes/Octokit_Client_Authorizations/_check_application_authorization/checks_an_application_authorization.json b/spec/cassettes/Octokit_Client_Authorizations/_check_application_authorization/checks_an_application_authorization.json deleted file mode 100644 index 30be9a46f..000000000 --- a/spec/cassettes/Octokit_Client_Authorizations/_check_application_authorization/checks_an_application_authorization.json +++ /dev/null @@ -1 +0,0 @@ -{"http_interactions":[{"request":{"method":"put","uri":"https://github.com/gitapi/authorizations/clients//CHECK_APPLICATION_AUTHORIZATION_FINGERPRINT","body":{"encoding":"UTF-8","base64_string":"eyJjbGllbnRfc2VjcmV0IjoiPEdJVEhVQl9DTElFTlRfU0VDUkVUPiJ9\n"},"headers":{"Accept":["application/vnd.github.v3+json"],"User-Agent":["Octokit Ruby Gem 4.12.0"],"Content-Type":["application/json"],"Authorization":["Basic bW9uYWxpc2FvY3RvY2F0OkpiZmp6VEVaaiNyeHRWc1toTEVBS0p1eFVzOQ=="],"Accept-Encoding":["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"]}},"response":{"status":{"code":201,"message":"Created"},"headers":{"Server":["GitHub.com"],"Date":["Sun, 30 Sep 2018 19:47:19 GMT"],"Content-Type":["application/json; charset=utf-8"],"Content-Length":["464"],"Status":["201 Created"],"X-Ratelimit-Limit":["5000"],"X-Ratelimit-Remaining":["4939"],"X-Ratelimit-Reset":["1538339546"],"Cache-Control":["private, max-age=60, s-maxage=60"],"Vary":["Accept, Authorization, Cookie, X-GitHub-OTP"],"Etag":["\"afa831aed22d7d3b5c4a76d33993fb86\""],"Location":["https://github.com/gitapi/authorizations/223759435"],"X-Github-Media-Type":["github.v3; format=json"],"Access-Control-Expose-Headers":["ETag, Link, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval"],"Access-Control-Allow-Origin":["*"],"Strict-Transport-Security":["max-age=31536000; includeSubdomains; preload"],"X-Frame-Options":["deny"],"X-Content-Type-Options":["nosniff"],"X-Xss-Protection":["1; mode=block"],"Referrer-Policy":["origin-when-cross-origin, strict-origin-when-cross-origin"],"Content-Security-Policy":["default-src 'none'"],"X-Runtime-Rack":["0.118312"],"X-Github-Request-Id":["FD95:235B:2341ADE:41EAE2C:5BB12847"]},"body":{"encoding":"UTF-8","base64_string":"eyJpZCI6MjIzNzU5NDM1LCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29t\nL2F1dGhvcml6YXRpb25zLzIyMzc1OTQzNSIsImFwcCI6eyJuYW1lIjoiT2N0\nb2tpdCIsInVybCI6Imh0dHBzOi8vZXhhbXBsZS5jb20iLCJjbGllbnRfaWQi\nOiI8R0lUSFVCX0NMSUVOVF9JRD4ifSwidG9rZW4iOiJDSEVDS19BUFBMSUNB\nVElPTl9BVVRIT1JJWkFUSU9OX1RPS0VOIiwiaGFzaGVkX3Rva2VuIjoiMzU1\nYjQ0ZDI5ZjYzY2ZjM2Y4MTljZDc0MDZjZjdiY2NhM2U5YjllMmE4YmI5ZDI2\nNGU3OWVhY2IxOGNjYjY3MiIsInRva2VuX2xhc3RfZWlnaHQiOiI3MmJhMzEw\nMiIsIm5vdGUiOm51bGwsIm5vdGVfdXJsIjpudWxsLCJjcmVhdGVkX2F0Ijoi\nMjAxOC0wOS0zMFQxOTo0NzoxOVoiLCJ1cGRhdGVkX2F0IjoiMjAxOC0wOS0z\nMFQxOTo0NzoxOVoiLCJzY29wZXMiOltdLCJmaW5nZXJwcmludCI6IkNIRUNL\nX0FQUExJQ0FUSU9OX0FVVEhPUklaQVRJT05fRklOR0VSUFJJTlQifQ==\n"},"http_version":null},"recorded_at":"Sun, 30 Sep 2018 19:47:19 GMT"},{"request":{"method":"post","uri":"https://github.com/gitapi/applications//tokens","body":{"access_token":"CHECK_APPLICATION_AUTHORIZATION_TOKEN", "encoding":"US-ASCII","base64_string":""},"headers":{"Accept":["application/vnd.github.v3+json"],"User-Agent":["Octokit Ruby Gem 4.12.0"],"Content-Type":["application/json"],"Authorization":["Basic NzQ0NjkwYmI4MDBkNTcxNWFkOTA6MjQyMzUyZDU0NDExZTkwYzM5NDExZTA0NzczMjMzMDMyZDAwN2U3MA=="],"Accept-Encoding":["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"]}},"response":{"status":{"code":200,"message":"OK"},"headers":{"Server":["GitHub.com"],"Date":["Sun, 30 Sep 2018 19:47:19 GMT"],"Content-Type":["application/json; charset=utf-8"],"Transfer-Encoding":["chunked"],"Status":["200 OK"],"X-Ratelimit-Limit":["5000"],"X-Ratelimit-Remaining":["4991"],"X-Ratelimit-Reset":["1538339546"],"Cache-Control":["public, max-age=60, s-maxage=60"],"Vary":["Accept"],"Etag":["W/\"d8d05200fa945112128b3c0c93f47251\""],"X-Github-Media-Type":["github.v3; format=json"],"Access-Control-Expose-Headers":["ETag, Link, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval"],"Access-Control-Allow-Origin":["*"],"Strict-Transport-Security":["max-age=31536000; includeSubdomains; preload"],"X-Frame-Options":["deny"],"X-Content-Type-Options":["nosniff"],"X-Xss-Protection":["1; mode=block"],"Referrer-Policy":["origin-when-cross-origin, strict-origin-when-cross-origin"],"Content-Security-Policy":["default-src 'none'"],"X-Runtime-Rack":["0.020729"],"X-Github-Request-Id":["FD96:2360:D4F0C7:1E86E2A:5BB12847"]},"body":{"encoding":"ASCII-8BIT","base64_string":"eyJpZCI6MjIzNzU5NDM1LCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29t\nL2F1dGhvcml6YXRpb25zLzIyMzc1OTQzNSIsImFwcCI6eyJuYW1lIjoiT2N0\nb2tpdCIsInVybCI6Imh0dHBzOi8vZXhhbXBsZS5jb20iLCJjbGllbnRfaWQi\nOiI8R0lUSFVCX0NMSUVOVF9JRD4ifSwidG9rZW4iOiJDSEVDS19BUFBMSUNB\nVElPTl9BVVRIT1JJWkFUSU9OX1RPS0VOIiwiaGFzaGVkX3Rva2VuIjoiMzU1\nYjQ0ZDI5ZjYzY2ZjM2Y4MTljZDc0MDZjZjdiY2NhM2U5YjllMmE4YmI5ZDI2\nNGU3OWVhY2IxOGNjYjY3MiIsInRva2VuX2xhc3RfZWlnaHQiOiI3MmJhMzEw\nMiIsIm5vdGUiOm51bGwsIm5vdGVfdXJsIjpudWxsLCJjcmVhdGVkX2F0Ijoi\nMjAxOC0wOS0zMFQxOTo0NzoxOVoiLCJ1cGRhdGVkX2F0IjoiMjAxOC0wOS0z\nMFQxOTo0NzoxOVoiLCJzY29wZXMiOltdLCJmaW5nZXJwcmludCI6IkNIRUNL\nX0FQUExJQ0FUSU9OX0FVVEhPUklaQVRJT05fRklOR0VSUFJJTlQiLCJ1c2Vy\nIjp7ImxvZ2luIjoiPEdJVEhVQl9MT0dJTj4iLCJpZCI6MjQyMjcyOTIsIm5v\nZGVfaWQiOiJNRFE2VlhObGNqSTBNakkzTWpreSIsImF2YXRhcl91cmwiOiJo\ndHRwczovL2F2YXRhcnMyLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzI0MjI3\nMjkyP3Y9NCIsImdyYXZhdGFyX2lkIjoiIiwidXJsIjoiaHR0cHM6Ly9hcGku\nZ2l0aHViLmNvbS91c2Vycy88R0lUSFVCX0xPR0lOPiIsImh0bWxfdXJsIjoi\naHR0cHM6Ly9naXRodWIuY29tLzxHSVRIVUJfTE9HSU4+IiwiZm9sbG93ZXJz\nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvPEdJVEhVQl9M\nT0dJTj4vZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8vYXBp\nLmdpdGh1Yi5jb20vdXNlcnMvPEdJVEhVQl9MT0dJTj4vZm9sbG93aW5ney9v\ndGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5j\nb20vdXNlcnMvPEdJVEhVQl9MT0dJTj4vZ2lzdHN7L2dpc3RfaWR9Iiwic3Rh\ncnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzLzxHSVRI\nVUJfTE9HSU4+L3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRp\nb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvPEdJVEhV\nQl9MT0dJTj4vc3Vic2NyaXB0aW9ucyIsIm9yZ2FuaXphdGlvbnNfdXJsIjoi\naHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy88R0lUSFVCX0xPR0lOPi9v\ncmdzIiwicmVwb3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vy\ncy88R0lUSFVCX0xPR0lOPi9yZXBvcyIsImV2ZW50c191cmwiOiJodHRwczov\nL2FwaS5naXRodWIuY29tL3VzZXJzLzxHSVRIVUJfTE9HSU4+L2V2ZW50c3sv\ncHJpdmFjeX0iLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGku\nZ2l0aHViLmNvbS91c2Vycy88R0lUSFVCX0xPR0lOPi9yZWNlaXZlZF9ldmVu\ndHMiLCJ0eXBlIjoiVXNlciIsInNpdGVfYWRtaW4iOmZhbHNlfX0=\n"},"http_version":null},"recorded_at":"Sun, 30 Sep 2018 19:47:19 GMT"}],"recorded_with":"VCR 4.0.0"} diff --git a/spec/cassettes/Octokit_Client_Authorizations/_reset_application_authorization/resets_a_token.json b/spec/cassettes/Octokit_Client_Authorizations/_reset_application_authorization/resets_a_token.json deleted file mode 100644 index 3d3277b44..000000000 --- a/spec/cassettes/Octokit_Client_Authorizations/_reset_application_authorization/resets_a_token.json +++ /dev/null @@ -1 +0,0 @@ -{"http_interactions":[{"request":{"method":"put","uri":"https://github.com/gitapi/authorizations/clients//RESET_APPLICATION_AUTHORIZATION_FINGERPRINT","body":{"encoding":"UTF-8","base64_string":"eyJjbGllbnRfc2VjcmV0IjoiPEdJVEhVQl9DTElFTlRfU0VDUkVUPiJ9\n"},"headers":{"Accept":["application/vnd.github.v3+json"],"User-Agent":["Octokit Ruby Gem 4.12.0"],"Content-Type":["application/json"],"Authorization":["Basic bW9uYWxpc2FvY3RvY2F0OkpiZmp6VEVaaiNyeHRWc1toTEVBS0p1eFVzOQ=="],"Accept-Encoding":["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"]}},"response":{"status":{"code":201,"message":"Created"},"headers":{"Server":["GitHub.com"],"Date":["Sun, 30 Sep 2018 19:47:19 GMT"],"Content-Type":["application/json; charset=utf-8"],"Content-Length":["464"],"Status":["201 Created"],"X-Ratelimit-Limit":["5000"],"X-Ratelimit-Remaining":["4940"],"X-Ratelimit-Reset":["1538339546"],"Cache-Control":["private, max-age=60, s-maxage=60"],"Vary":["Accept, Authorization, Cookie, X-GitHub-OTP"],"Etag":["\"019ff4c4d606051fa13f7d999d883be2\""],"Location":["https://github.com/gitapi/authorizations/223759433"],"X-Github-Media-Type":["github.v3; format=json"],"Access-Control-Expose-Headers":["ETag, Link, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval"],"Access-Control-Allow-Origin":["*"],"Strict-Transport-Security":["max-age=31536000; includeSubdomains; preload"],"X-Frame-Options":["deny"],"X-Content-Type-Options":["nosniff"],"X-Xss-Protection":["1; mode=block"],"Referrer-Policy":["origin-when-cross-origin, strict-origin-when-cross-origin"],"Content-Security-Policy":["default-src 'none'"],"X-Runtime-Rack":["0.084694"],"X-Github-Request-Id":["FD93:235B:2341AB0:41EADD7:5BB12846"]},"body":{"encoding":"UTF-8","base64_string":"eyJpZCI6MjIzNzU5NDMzLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29t\nL2F1dGhvcml6YXRpb25zLzIyMzc1OTQzMyIsImFwcCI6eyJuYW1lIjoiT2N0\nb2tpdCIsInVybCI6Imh0dHBzOi8vZXhhbXBsZS5jb20iLCJjbGllbnRfaWQi\nOiI8R0lUSFVCX0NMSUVOVF9JRD4ifSwidG9rZW4iOiJSRVNFVF9BUFBMSUNB\nVElPTl9BVVRIT1JJWkFUSU9OX1RPS0VOIiwiaGFzaGVkX3Rva2VuIjoiZDhk\nZTgxYjg1YmNjZjk0ZjE3MTQxOTFlZTc1YzdmYzA2NTQ3ZDZlYmM2YWM4ZDJh\nMTA4ZmEwYjIwYWFjZjk4NiIsInRva2VuX2xhc3RfZWlnaHQiOiI0MGYyZDRk\nOCIsIm5vdGUiOm51bGwsIm5vdGVfdXJsIjpudWxsLCJjcmVhdGVkX2F0Ijoi\nMjAxOC0wOS0zMFQxOTo0NzoxOVoiLCJ1cGRhdGVkX2F0IjoiMjAxOC0wOS0z\nMFQxOTo0NzoxOVoiLCJzY29wZXMiOltdLCJmaW5nZXJwcmludCI6IlJFU0VU\nX0FQUExJQ0FUSU9OX0FVVEhPUklaQVRJT05fRklOR0VSUFJJTlQifQ==\n"},"http_version":null},"recorded_at":"Sun, 30 Sep 2018 19:47:19 GMT"},{"request":{"method":"patch","uri":"https://github.com/gitapi/applications//tokens","body":{"access_token":"RESET_APPLICATION_AUTHORIZATION_TOKEN", "encoding":"UTF-8","base64_string":"e30=\n"},"headers":{"Accept":["application/vnd.github.v3+json"],"User-Agent":["Octokit Ruby Gem 4.12.0"],"Content-Type":["application/json"],"Authorization":["Basic NzQ0NjkwYmI4MDBkNTcxNWFkOTA6MjQyMzUyZDU0NDExZTkwYzM5NDExZTA0NzczMjMzMDMyZDAwN2U3MA=="],"Accept-Encoding":["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"]}},"response":{"status":{"code":200,"message":"OK"},"headers":{"Server":["GitHub.com"],"Date":["Sun, 30 Sep 2018 19:47:19 GMT"],"Content-Type":["application/json; charset=utf-8"],"Transfer-Encoding":["chunked"],"Status":["200 OK"],"X-Ratelimit-Limit":["5000"],"X-Ratelimit-Remaining":["4992"],"X-Ratelimit-Reset":["1538339546"],"Cache-Control":["public, max-age=60, s-maxage=60"],"Vary":["Accept"],"Etag":["W/\"4818be58670f15601bbffbdcf7648205\""],"X-Github-Media-Type":["github.v3; format=json"],"Access-Control-Expose-Headers":["ETag, Link, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval"],"Access-Control-Allow-Origin":["*"],"Strict-Transport-Security":["max-age=31536000; includeSubdomains; preload"],"X-Frame-Options":["deny"],"X-Content-Type-Options":["nosniff"],"X-Xss-Protection":["1; mode=block"],"Referrer-Policy":["origin-when-cross-origin, strict-origin-when-cross-origin"],"Content-Security-Policy":["default-src 'none'"],"X-Runtime-Rack":["0.036227"],"X-Github-Request-Id":["FD94:235F:6288A1:EDF10A:5BB12847"]},"body":{"encoding":"ASCII-8BIT","base64_string":"eyJpZCI6MjIzNzU5NDMzLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29t\nL2F1dGhvcml6YXRpb25zLzIyMzc1OTQzMyIsImFwcCI6eyJuYW1lIjoiT2N0\nb2tpdCIsInVybCI6Imh0dHBzOi8vZXhhbXBsZS5jb20iLCJjbGllbnRfaWQi\nOiI8R0lUSFVCX0NMSUVOVF9JRD4ifSwidG9rZW4iOiI2MDhkMzU2YWRlMDAx\nZjBiNWM3YjEyNWNlYjAzYmI3Y2QxMWI4YzU1IiwiaGFzaGVkX3Rva2VuIjoi\nOTkxODU0ZTc5NmMwMmZkNTdiNzEwM2EwNzM2ZTEwMzEyMTllMDk3YmE3YzQ1\nOThlYTVjYjE0MGFkODE2MTE3YSIsInRva2VuX2xhc3RfZWlnaHQiOiJkMTFi\nOGM1NSIsIm5vdGUiOm51bGwsIm5vdGVfdXJsIjpudWxsLCJjcmVhdGVkX2F0\nIjoiMjAxOC0wOS0zMFQxOTo0NzoxOVoiLCJ1cGRhdGVkX2F0IjoiMjAxOC0w\nOS0zMFQxOTo0NzoxOVoiLCJzY29wZXMiOltdLCJmaW5nZXJwcmludCI6IlJF\nU0VUX0FQUExJQ0FUSU9OX0FVVEhPUklaQVRJT05fRklOR0VSUFJJTlQiLCJ1\nc2VyIjp7ImxvZ2luIjoiPEdJVEhVQl9MT0dJTj4iLCJpZCI6MjQyMjcyOTIs\nIm5vZGVfaWQiOiJNRFE2VlhObGNqSTBNakkzTWpreSIsImF2YXRhcl91cmwi\nOiJodHRwczovL2F2YXRhcnMyLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzI0\nMjI3MjkyP3Y9NCIsImdyYXZhdGFyX2lkIjoiIiwidXJsIjoiaHR0cHM6Ly9h\ncGkuZ2l0aHViLmNvbS91c2Vycy88R0lUSFVCX0xPR0lOPiIsImh0bWxfdXJs\nIjoiaHR0cHM6Ly9naXRodWIuY29tLzxHSVRIVUJfTE9HSU4+IiwiZm9sbG93\nZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvPEdJVEhV\nQl9MT0dJTj4vZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0dHBzOi8v\nYXBpLmdpdGh1Yi5jb20vdXNlcnMvPEdJVEhVQl9MT0dJTj4vZm9sbG93aW5n\ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1\nYi5jb20vdXNlcnMvPEdJVEhVQl9MT0dJTj4vZ2lzdHN7L2dpc3RfaWR9Iiwi\nc3RhcnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzLzxH\nSVRIVUJfTE9HSU4+L3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3Jp\ncHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvPEdJ\nVEhVQl9MT0dJTj4vc3Vic2NyaXB0aW9ucyIsIm9yZ2FuaXphdGlvbnNfdXJs\nIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy88R0lUSFVCX0xPR0lO\nPi9vcmdzIiwicmVwb3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91\nc2Vycy88R0lUSFVCX0xPR0lOPi9yZXBvcyIsImV2ZW50c191cmwiOiJodHRw\nczovL2FwaS5naXRodWIuY29tL3VzZXJzLzxHSVRIVUJfTE9HSU4+L2V2ZW50\nc3svcHJpdmFjeX0iLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9h\ncGkuZ2l0aHViLmNvbS91c2Vycy88R0lUSFVCX0xPR0lOPi9yZWNlaXZlZF9l\ndmVudHMiLCJ0eXBlIjoiVXNlciIsInNpdGVfYWRtaW4iOmZhbHNlfX0=\n"},"http_version":null},"recorded_at":"Sun, 30 Sep 2018 19:47:19 GMT"}],"recorded_with":"VCR 4.0.0"} diff --git a/spec/cassettes/Octokit_Client_Authorizations/_revoke_application_authorization/deletes_an_application_authorization.json b/spec/cassettes/Octokit_Client_Authorizations/_revoke_application_authorization/deletes_an_application_authorization.json deleted file mode 100644 index 45ddb3822..000000000 --- a/spec/cassettes/Octokit_Client_Authorizations/_revoke_application_authorization/deletes_an_application_authorization.json +++ /dev/null @@ -1 +0,0 @@ -{"http_interactions":[{"request":{"method":"put","uri":"https://github.com/gitapi/authorizations/clients//REVOKE_APPLICATION_AUTHORIZATION_FINGERPRINT","body":{"encoding":"UTF-8","base64_string":"eyJjbGllbnRfc2VjcmV0IjoiPEdJVEhVQl9DTElFTlRfU0VDUkVUPiJ9\n"},"headers":{"Accept":["application/vnd.github.v3+json"],"User-Agent":["Octokit Ruby Gem 4.12.0"],"Content-Type":["application/json"],"Authorization":["Basic bW9uYWxpc2FvY3RvY2F0OkpiZmp6VEVaaiNyeHRWc1toTEVBS0p1eFVzOQ=="],"Accept-Encoding":["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"]}},"response":{"status":{"code":201,"message":"Created"},"headers":{"Server":["GitHub.com"],"Date":["Sun, 30 Sep 2018 19:47:18 GMT"],"Content-Type":["application/json; charset=utf-8"],"Content-Length":["464"],"Status":["201 Created"],"X-Ratelimit-Limit":["5000"],"X-Ratelimit-Remaining":["4941"],"X-Ratelimit-Reset":["1538339546"],"Cache-Control":["private, max-age=60, s-maxage=60"],"Vary":["Accept, Authorization, Cookie, X-GitHub-OTP"],"Etag":["\"6dc38737089c76e5a6ccfbe68fb9bc70\""],"Location":["https://github.com/gitapi/authorizations/223759430"],"X-Github-Media-Type":["github.v3; format=json"],"Access-Control-Expose-Headers":["ETag, Link, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval"],"Access-Control-Allow-Origin":["*"],"Strict-Transport-Security":["max-age=31536000; includeSubdomains; preload"],"X-Frame-Options":["deny"],"X-Content-Type-Options":["nosniff"],"X-Xss-Protection":["1; mode=block"],"Referrer-Policy":["origin-when-cross-origin, strict-origin-when-cross-origin"],"Content-Security-Policy":["default-src 'none'"],"X-Runtime-Rack":["0.109614"],"X-Github-Request-Id":["FD91:235D:1C16501:371C352:5BB12846"]},"body":{"encoding":"UTF-8","base64_string":"eyJpZCI6MjIzNzU5NDMwLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29t\nL2F1dGhvcml6YXRpb25zLzIyMzc1OTQzMCIsImFwcCI6eyJuYW1lIjoiT2N0\nb2tpdCIsInVybCI6Imh0dHBzOi8vZXhhbXBsZS5jb20iLCJjbGllbnRfaWQi\nOiI8R0lUSFVCX0NMSUVOVF9JRD4ifSwidG9rZW4iOiJSRVZPS0VfQVBQTElD\nQVRJT05fQVVUSE9SSVpBVElPTl9UT0tFTiIsImhhc2hlZF90b2tlbiI6ImIz\nMzMzZDBmYWU4NThlZWNkYmVkOTg4NzkxZmM4NDFlZmJjNTkwNmIwY2QxMTIx\nNDdhMjA2YTc1NWQ4NzUxNmIiLCJ0b2tlbl9sYXN0X2VpZ2h0IjoiZWVmYjcx\nYWUiLCJub3RlIjpudWxsLCJub3RlX3VybCI6bnVsbCwiY3JlYXRlZF9hdCI6\nIjIwMTgtMDktMzBUMTk6NDc6MThaIiwidXBkYXRlZF9hdCI6IjIwMTgtMDkt\nMzBUMTk6NDc6MThaIiwic2NvcGVzIjpbXSwiZmluZ2VycHJpbnQiOiJSRVZP\nS0VfQVBQTElDQVRJT05fQVVUSE9SSVpBVElPTl9GSU5HRVJQUklOVCJ9\n"},"http_version":null},"recorded_at":"Sun, 30 Sep 2018 19:47:18 GMT"},{"request":{"method":"delete","uri":"https://github.com/gitapi/applications//tokens","body":{"access_token":"REVOKE_APPLICATION_AUTHORIZATION_TOKEN", "encoding":"UTF-8","base64_string":"e30=\n"},"headers":{"Accept":["application/vnd.github.v3+json"],"User-Agent":["Octokit Ruby Gem 4.12.0"],"Content-Type":["application/json"],"Authorization":["Basic NzQ0NjkwYmI4MDBkNTcxNWFkOTA6MjQyMzUyZDU0NDExZTkwYzM5NDExZTA0NzczMjMzMDMyZDAwN2U3MA=="],"Accept-Encoding":["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"]}},"response":{"status":{"code":204,"message":"No Content"},"headers":{"Server":["GitHub.com"],"Date":["Sun, 30 Sep 2018 19:47:18 GMT"],"Content-Type":["application/octet-stream"],"Status":["204 No Content"],"X-Ratelimit-Limit":["5000"],"X-Ratelimit-Remaining":["4993"],"X-Ratelimit-Reset":["1538339546"],"X-Github-Media-Type":["github.v3; format=json"],"Access-Control-Expose-Headers":["ETag, Link, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval"],"Access-Control-Allow-Origin":["*"],"Strict-Transport-Security":["max-age=31536000; includeSubdomains; preload"],"X-Frame-Options":["deny"],"X-Content-Type-Options":["nosniff"],"X-Xss-Protection":["1; mode=block"],"Referrer-Policy":["origin-when-cross-origin, strict-origin-when-cross-origin"],"Content-Security-Policy":["default-src 'none'"],"X-Runtime-Rack":["0.038270"],"X-Github-Request-Id":["FD92:235B:2341AA2:41EADB2:5BB12846"]},"body":{"encoding":"UTF-8","base64_string":""},"http_version":null},"recorded_at":"Sun, 30 Sep 2018 19:47:18 GMT"}],"recorded_with":"VCR 4.0.0"} diff --git a/spec/cassettes/Octokit_Client_OauthApplications/_check_token/checks_the_token_is_valid.json b/spec/cassettes/Octokit_Client_OauthApplications/_check_token/checks_the_token_is_valid.json new file mode 100644 index 000000000..cf8f975f4 --- /dev/null +++ b/spec/cassettes/Octokit_Client_OauthApplications/_check_token/checks_the_token_is_valid.json @@ -0,0 +1 @@ +{"http_interactions":[{"request":{"method":"post","uri":"https://github.com/gitapi/applications//token","body":{"encoding":"UTF-8","base64_string":"eyJhY2Nlc3NfdG9rZW4iOiI8R0lUSFVCX1RFU1RfT0FVVEhfVE9LRU4+In0=\n"},"headers":{"Accept":["application/vnd.github.doctor-strange-preview+json"],"User-Agent":["Octokit Ruby Gem 4.17.0"],"Content-Type":["application/json"],"Authorization":["Basic NzQ0NjkwYmI4MDBkNTcxNWFkOTA6YTFkZmU2YTc3MzljOTJiOGRmMDBmM2FiOWU5ZDc2OTVhNWU4NGU0ZQ=="],"Accept-Encoding":["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"]}},"response":{"status":{"code":200,"message":"OK"},"headers":{"Server":["GitHub.com"],"Date":["Wed, 25 Mar 2020 16:50:38 GMT"],"Content-Type":["application/json; charset=utf-8"],"Transfer-Encoding":["chunked"],"Status":["200 OK"],"X-Ratelimit-Limit":["5000"],"X-Ratelimit-Remaining":["4987"],"X-Ratelimit-Reset":["1585156070"],"Cache-Control":["public, max-age=60, s-maxage=60"],"Vary":["Accept","Accept-Encoding, Accept, X-Requested-With"],"Etag":["W/\"39bae7cfdf7a2d9b768b0db38ef6a771\""],"X-Github-Media-Type":["github.v3; param=doctor-strange-preview; format=json"],"Access-Control-Expose-Headers":["ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, Deprecation, Sunset"],"Access-Control-Allow-Origin":["*"],"Strict-Transport-Security":["max-age=31536000; includeSubdomains; preload"],"X-Frame-Options":["deny"],"X-Content-Type-Options":["nosniff"],"X-Xss-Protection":["1; mode=block"],"Referrer-Policy":["origin-when-cross-origin, strict-origin-when-cross-origin"],"Content-Security-Policy":["default-src 'none'"],"X-Github-Request-Id":["DA28:27B4:134D50:333DDE:5E7B8BDE"]},"body":{"encoding":"ASCII-8BIT","base64_string":"eyJpZCI6NDAxNjg4NzQyLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29t\nL2F1dGhvcml6YXRpb25zLzQwMTY4ODc0MiIsImFwcCI6eyJuYW1lIjoiT2N0\nb2tpdCIsInVybCI6Imh0dHBzOi8vZXhhbXBsZS5jb20iLCJjbGllbnRfaWQi\nOiI8R0lUSFVCX0NMSUVOVF9JRD4ifSwidG9rZW4iOiI8R0lUSFVCX1RFU1Rf\nT0FVVEhfVE9LRU4+IiwiaGFzaGVkX3Rva2VuIjoiOGVhNThhOWZjYjcwZWFm\nMzMyNDRlMTljZDcwMzM5NGY1YTEyNGZjN2RlZjBlNTY0YjU5NGY3ZWE4Mzcw\nMTFjZiIsInRva2VuX2xhc3RfZWlnaHQiOiI4OTM1ZDIyYiIsIm5vdGUiOm51\nbGwsIm5vdGVfdXJsIjpudWxsLCJjcmVhdGVkX2F0IjoiMjAyMC0wMy0yNVQx\nNjo0OToxOFoiLCJ1cGRhdGVkX2F0IjoiMjAyMC0wMy0yNVQxNjo0OToyN1oi\nLCJzY29wZXMiOltdLCJmaW5nZXJwcmludCI6bnVsbCwidXNlciI6eyJsb2dp\nbiI6InRhcmVieXRlIiwiaWQiOjU2NDExMywibm9kZV9pZCI6Ik1EUTZWWE5s\nY2pVMk5ERXhNdz09IiwiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFyczIu\nZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNTY0MTEzP3Y9NCIsImdyYXZhdGFy\nX2lkIjoiIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy90\nYXJlYnl0ZSIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL3RhcmVi\neXRlIiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20v\ndXNlcnMvdGFyZWJ5dGUvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0\ndHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvdGFyZWJ5dGUvZm9sbG93aW5n\ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1\nYi5jb20vdXNlcnMvdGFyZWJ5dGUvZ2lzdHN7L2dpc3RfaWR9Iiwic3RhcnJl\nZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3RhcmVieXRl\nL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRpb25zX3VybCI6\nImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvdGFyZWJ5dGUvc3Vic2Ny\naXB0aW9ucyIsIm9yZ2FuaXphdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0\naHViLmNvbS91c2Vycy90YXJlYnl0ZS9vcmdzIiwicmVwb3NfdXJsIjoiaHR0\ncHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy90YXJlYnl0ZS9yZXBvcyIsImV2\nZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3RhcmVi\neXRlL2V2ZW50c3svcHJpdmFjeX0iLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoi\naHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy90YXJlYnl0ZS9yZWNlaXZl\nZF9ldmVudHMiLCJ0eXBlIjoiVXNlciIsInNpdGVfYWRtaW4iOnRydWV9fQ==\n"},"http_version":null},"recorded_at":"Wed, 25 Mar 2020 16:50:38 GMT"}],"recorded_with":"VCR 5.1.0"} \ No newline at end of file diff --git a/spec/cassettes/Octokit_Client_OauthApplications/_check_token/has_a_check_application_authorization_alias.json b/spec/cassettes/Octokit_Client_OauthApplications/_check_token/has_a_check_application_authorization_alias.json new file mode 100644 index 000000000..18601532c --- /dev/null +++ b/spec/cassettes/Octokit_Client_OauthApplications/_check_token/has_a_check_application_authorization_alias.json @@ -0,0 +1 @@ +{"http_interactions":[{"request":{"method":"post","uri":"https://github.com/gitapi/applications//token","body":{"encoding":"UTF-8","base64_string":"eyJhY2Nlc3NfdG9rZW4iOiI8R0lUSFVCX1RFU1RfT0FVVEhfVE9LRU4+In0=\n"},"headers":{"Accept":["application/vnd.github.doctor-strange-preview+json"],"User-Agent":["Octokit Ruby Gem 4.17.0"],"Content-Type":["application/json"],"Authorization":["Basic NzQ0NjkwYmI4MDBkNTcxNWFkOTA6YTFkZmU2YTc3MzljOTJiOGRmMDBmM2FiOWU5ZDc2OTVhNWU4NGU0ZQ=="],"Accept-Encoding":["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"]}},"response":{"status":{"code":200,"message":"OK"},"headers":{"Server":["GitHub.com"],"Date":["Wed, 25 Mar 2020 16:50:38 GMT"],"Content-Type":["application/json; charset=utf-8"],"Transfer-Encoding":["chunked"],"Status":["200 OK"],"X-Ratelimit-Limit":["5000"],"X-Ratelimit-Remaining":["4988"],"X-Ratelimit-Reset":["1585156070"],"Cache-Control":["public, max-age=60, s-maxage=60"],"Vary":["Accept","Accept-Encoding, Accept, X-Requested-With"],"Etag":["W/\"39bae7cfdf7a2d9b768b0db38ef6a771\""],"X-Github-Media-Type":["github.v3; param=doctor-strange-preview; format=json"],"Access-Control-Expose-Headers":["ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, Deprecation, Sunset"],"Access-Control-Allow-Origin":["*"],"Strict-Transport-Security":["max-age=31536000; includeSubdomains; preload"],"X-Frame-Options":["deny"],"X-Content-Type-Options":["nosniff"],"X-Xss-Protection":["1; mode=block"],"Referrer-Policy":["origin-when-cross-origin, strict-origin-when-cross-origin"],"Content-Security-Policy":["default-src 'none'"],"X-Github-Request-Id":["DA27:20EF:734686:C48293:5E7B8BDE"]},"body":{"encoding":"ASCII-8BIT","base64_string":"eyJpZCI6NDAxNjg4NzQyLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29t\nL2F1dGhvcml6YXRpb25zLzQwMTY4ODc0MiIsImFwcCI6eyJuYW1lIjoiT2N0\nb2tpdCIsInVybCI6Imh0dHBzOi8vZXhhbXBsZS5jb20iLCJjbGllbnRfaWQi\nOiI8R0lUSFVCX0NMSUVOVF9JRD4ifSwidG9rZW4iOiI8R0lUSFVCX1RFU1Rf\nT0FVVEhfVE9LRU4+IiwiaGFzaGVkX3Rva2VuIjoiOGVhNThhOWZjYjcwZWFm\nMzMyNDRlMTljZDcwMzM5NGY1YTEyNGZjN2RlZjBlNTY0YjU5NGY3ZWE4Mzcw\nMTFjZiIsInRva2VuX2xhc3RfZWlnaHQiOiI4OTM1ZDIyYiIsIm5vdGUiOm51\nbGwsIm5vdGVfdXJsIjpudWxsLCJjcmVhdGVkX2F0IjoiMjAyMC0wMy0yNVQx\nNjo0OToxOFoiLCJ1cGRhdGVkX2F0IjoiMjAyMC0wMy0yNVQxNjo0OToyN1oi\nLCJzY29wZXMiOltdLCJmaW5nZXJwcmludCI6bnVsbCwidXNlciI6eyJsb2dp\nbiI6InRhcmVieXRlIiwiaWQiOjU2NDExMywibm9kZV9pZCI6Ik1EUTZWWE5s\nY2pVMk5ERXhNdz09IiwiYXZhdGFyX3VybCI6Imh0dHBzOi8vYXZhdGFyczIu\nZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNTY0MTEzP3Y9NCIsImdyYXZhdGFy\nX2lkIjoiIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy90\nYXJlYnl0ZSIsImh0bWxfdXJsIjoiaHR0cHM6Ly9naXRodWIuY29tL3RhcmVi\neXRlIiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20v\ndXNlcnMvdGFyZWJ5dGUvZm9sbG93ZXJzIiwiZm9sbG93aW5nX3VybCI6Imh0\ndHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvdGFyZWJ5dGUvZm9sbG93aW5n\ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1\nYi5jb20vdXNlcnMvdGFyZWJ5dGUvZ2lzdHN7L2dpc3RfaWR9Iiwic3RhcnJl\nZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3RhcmVieXRl\nL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJzY3JpcHRpb25zX3VybCI6\nImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvdGFyZWJ5dGUvc3Vic2Ny\naXB0aW9ucyIsIm9yZ2FuaXphdGlvbnNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0\naHViLmNvbS91c2Vycy90YXJlYnl0ZS9vcmdzIiwicmVwb3NfdXJsIjoiaHR0\ncHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy90YXJlYnl0ZS9yZXBvcyIsImV2\nZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIuY29tL3VzZXJzL3RhcmVi\neXRlL2V2ZW50c3svcHJpdmFjeX0iLCJyZWNlaXZlZF9ldmVudHNfdXJsIjoi\naHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy90YXJlYnl0ZS9yZWNlaXZl\nZF9ldmVudHMiLCJ0eXBlIjoiVXNlciIsInNpdGVfYWRtaW4iOnRydWV9fQ==\n"},"http_version":null},"recorded_at":"Wed, 25 Mar 2020 16:50:38 GMT"}],"recorded_with":"VCR 5.1.0"} \ No newline at end of file diff --git a/spec/cassettes/Octokit_Client_OauthApplications/_delete_app_authorization/revokes_the_app_s_access_to_the_user.json b/spec/cassettes/Octokit_Client_OauthApplications/_delete_app_authorization/revokes_the_app_s_access_to_the_user.json new file mode 100644 index 000000000..8dae38826 --- /dev/null +++ b/spec/cassettes/Octokit_Client_OauthApplications/_delete_app_authorization/revokes_the_app_s_access_to_the_user.json @@ -0,0 +1 @@ +{"http_interactions":[{"request":{"method":"delete","uri":"https://github.com/gitapi/applications//grant","body":{"encoding":"UTF-8","base64_string":"eyJhY2Nlc3NfdG9rZW4iOiI8R0lUSFVCX1RFU1RfT0FVVEhfVE9LRU4+In0=\n"},"headers":{"Accept":["application/vnd.github.doctor-strange-preview+json"],"User-Agent":["Octokit Ruby Gem 4.17.0"],"Content-Type":["application/json"],"Authorization":["Basic NzQ0NjkwYmI4MDBkNTcxNWFkOTA6YTFkZmU2YTc3MzljOTJiOGRmMDBmM2FiOWU5ZDc2OTVhNWU4NGU0ZQ=="],"Accept-Encoding":["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"]}},"response":{"status":{"code":404,"message":"Not Found"},"headers":{"Server":["GitHub.com"],"Date":["Wed, 25 Mar 2020 16:54:56 GMT"],"Content-Type":["application/json; charset=utf-8"],"Transfer-Encoding":["chunked"],"Status":["404 Not Found"],"X-Ratelimit-Limit":["5000"],"X-Ratelimit-Remaining":["4981"],"X-Ratelimit-Reset":["1585156070"],"X-Github-Media-Type":["github.v3; param=doctor-strange-preview; format=json"],"Access-Control-Expose-Headers":["ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, Deprecation, Sunset"],"Access-Control-Allow-Origin":["*"],"Strict-Transport-Security":["max-age=31536000; includeSubdomains; preload"],"X-Frame-Options":["deny"],"X-Content-Type-Options":["nosniff"],"X-Xss-Protection":["1; mode=block"],"Referrer-Policy":["origin-when-cross-origin, strict-origin-when-cross-origin"],"Content-Security-Policy":["default-src 'none'"],"Vary":["Accept-Encoding, Accept, X-Requested-With"],"X-Github-Request-Id":["DA78:371A:4FD075:B533E8:5E7B8CE0"]},"body":{"encoding":"ASCII-8BIT","base64_string":"eyJtZXNzYWdlIjoiTm90IEZvdW5kIiwiZG9jdW1lbnRhdGlvbl91cmwiOiJo\ndHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL29hdXRoX2F1dGhvcml6\nYXRpb25zLyNyZXZva2UtYS1ncmFudC1mb3ItYW4tYXBwbGljYXRpb24ifQ==\n"},"http_version":null},"recorded_at":"Wed, 25 Mar 2020 16:54:56 GMT"}],"recorded_with":"VCR 5.1.0"} \ No newline at end of file diff --git a/spec/cassettes/Octokit_Client_OauthApplications/_delete_app_token/deletes_the_token.json b/spec/cassettes/Octokit_Client_OauthApplications/_delete_app_token/deletes_the_token.json new file mode 100644 index 000000000..87c56ddde --- /dev/null +++ b/spec/cassettes/Octokit_Client_OauthApplications/_delete_app_token/deletes_the_token.json @@ -0,0 +1 @@ +{"http_interactions":[{"request":{"method":"delete","uri":"https://github.com/gitapi/applications//token","body":{"encoding":"UTF-8","base64_string":"eyJhY2Nlc3NfdG9rZW4iOiI8R0lUSFVCX1RFU1RfT0FVVEhfVE9LRU4+In0=\n"},"headers":{"Accept":["application/vnd.github.doctor-strange-preview+json"],"User-Agent":["Octokit Ruby Gem 4.17.0"],"Content-Type":["application/json"],"Authorization":["Basic NzQ0NjkwYmI4MDBkNTcxNWFkOTA6YTFkZmU2YTc3MzljOTJiOGRmMDBmM2FiOWU5ZDc2OTVhNWU4NGU0ZQ=="],"Accept-Encoding":["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"]}},"response":{"status":{"code":404,"message":"Not Found"},"headers":{"Server":["GitHub.com"],"Date":["Wed, 25 Mar 2020 16:52:51 GMT"],"Content-Type":["application/json; charset=utf-8"],"Transfer-Encoding":["chunked"],"Status":["404 Not Found"],"X-Ratelimit-Limit":["5000"],"X-Ratelimit-Remaining":["4984"],"X-Ratelimit-Reset":["1585156070"],"X-Github-Media-Type":["github.v3; param=doctor-strange-preview; format=json"],"Access-Control-Expose-Headers":["ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, Deprecation, Sunset"],"Access-Control-Allow-Origin":["*"],"Strict-Transport-Security":["max-age=31536000; includeSubdomains; preload"],"X-Frame-Options":["deny"],"X-Content-Type-Options":["nosniff"],"X-Xss-Protection":["1; mode=block"],"Referrer-Policy":["origin-when-cross-origin, strict-origin-when-cross-origin"],"Content-Security-Policy":["default-src 'none'"],"Vary":["Accept-Encoding, Accept, X-Requested-With"],"X-Github-Request-Id":["DA4B:3F47:816BD3:D4A49A:5E7B8C63"]},"body":{"encoding":"ASCII-8BIT","base64_string":"eyJtZXNzYWdlIjoiTm90IEZvdW5kIiwiZG9jdW1lbnRhdGlvbl91cmwiOiJo\ndHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL29hdXRoX2F1dGhvcml6\nYXRpb25zLyNyZXZva2UtYW4tYXV0aG9yaXphdGlvbi1mb3ItYW4tYXBwbGlj\nYXRpb24ifQ==\n"},"http_version":null},"recorded_at":"Wed, 25 Mar 2020 16:52:51 GMT"}],"recorded_with":"VCR 5.1.0"} \ No newline at end of file diff --git a/spec/cassettes/Octokit_Client_OauthApplications/_delete_app_token/has_a_delete_application_authorization_alias.json b/spec/cassettes/Octokit_Client_OauthApplications/_delete_app_token/has_a_delete_application_authorization_alias.json new file mode 100644 index 000000000..284a1ca9d --- /dev/null +++ b/spec/cassettes/Octokit_Client_OauthApplications/_delete_app_token/has_a_delete_application_authorization_alias.json @@ -0,0 +1 @@ +{"http_interactions":[{"request":{"method":"delete","uri":"https://github.com/gitapi/applications//token","body":{"encoding":"UTF-8","base64_string":"eyJhY2Nlc3NfdG9rZW4iOiI8R0lUSFVCX1RFU1RfT0FVVEhfVE9LRU4+In0=\n"},"headers":{"Accept":["application/vnd.github.doctor-strange-preview+json"],"User-Agent":["Octokit Ruby Gem 4.17.0"],"Content-Type":["application/json"],"Authorization":["Basic NzQ0NjkwYmI4MDBkNTcxNWFkOTA6YTFkZmU2YTc3MzljOTJiOGRmMDBmM2FiOWU5ZDc2OTVhNWU4NGU0ZQ=="],"Accept-Encoding":["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"]}},"response":{"status":{"code":204,"message":"No Content"},"headers":{"Date":["Wed, 25 Mar 2020 16:53:36 GMT"],"Server":["GitHub.com"],"Status":["204 No Content"],"X-Ratelimit-Limit":["5000"],"X-Ratelimit-Remaining":["4983"],"X-Ratelimit-Reset":["1585156070"],"X-Github-Media-Type":["github.v3; param=doctor-strange-preview; format=json"],"Access-Control-Expose-Headers":["ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, Deprecation, Sunset"],"Access-Control-Allow-Origin":["*"],"Strict-Transport-Security":["max-age=31536000; includeSubdomains; preload"],"X-Frame-Options":["deny"],"X-Content-Type-Options":["nosniff"],"X-Xss-Protection":["1; mode=block"],"Referrer-Policy":["origin-when-cross-origin, strict-origin-when-cross-origin"],"Content-Security-Policy":["default-src 'none'"],"Vary":["Accept-Encoding, Accept, X-Requested-With"],"X-Github-Request-Id":["DA56:1F48:3F3692:540AC0:5E7B8C90"]},"body":{"encoding":"UTF-8","base64_string":""},"http_version":null},"recorded_at":"Wed, 25 Mar 2020 16:53:36 GMT"}],"recorded_with":"VCR 5.1.0"} \ No newline at end of file diff --git a/spec/cassettes/Octokit_Client_OauthApplications/_delete_app_token/has_a_revoke_application_authorization_alias.json b/spec/cassettes/Octokit_Client_OauthApplications/_delete_app_token/has_a_revoke_application_authorization_alias.json new file mode 100644 index 000000000..97fb1a90b --- /dev/null +++ b/spec/cassettes/Octokit_Client_OauthApplications/_delete_app_token/has_a_revoke_application_authorization_alias.json @@ -0,0 +1 @@ +{"http_interactions":[{"request":{"method":"delete","uri":"https://github.com/gitapi/applications//token","body":{"encoding":"UTF-8","base64_string":"eyJhY2Nlc3NfdG9rZW4iOiI8R0lUSFVCX1RFU1RfT0FVVEhfVE9LRU4+In0=\n"},"headers":{"Accept":["application/vnd.github.doctor-strange-preview+json"],"User-Agent":["Octokit Ruby Gem 4.17.0"],"Content-Type":["application/json"],"Authorization":["Basic NzQ0NjkwYmI4MDBkNTcxNWFkOTA6YTFkZmU2YTc3MzljOTJiOGRmMDBmM2FiOWU5ZDc2OTVhNWU4NGU0ZQ=="],"Accept-Encoding":["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"]}},"response":{"status":{"code":204,"message":"No Content"},"headers":{"Date":["Wed, 25 Mar 2020 16:54:17 GMT"],"Server":["GitHub.com"],"Status":["204 No Content"],"X-Ratelimit-Limit":["5000"],"X-Ratelimit-Remaining":["4982"],"X-Ratelimit-Reset":["1585156070"],"X-Github-Media-Type":["github.v3; param=doctor-strange-preview; format=json"],"Access-Control-Expose-Headers":["ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, Deprecation, Sunset"],"Access-Control-Allow-Origin":["*"],"Strict-Transport-Security":["max-age=31536000; includeSubdomains; preload"],"X-Frame-Options":["deny"],"X-Content-Type-Options":["nosniff"],"X-Xss-Protection":["1; mode=block"],"Referrer-Policy":["origin-when-cross-origin, strict-origin-when-cross-origin"],"Content-Security-Policy":["default-src 'none'"],"Vary":["Accept-Encoding, Accept, X-Requested-With"],"X-Github-Request-Id":["DA6D:241D:2B5428:3B35B4:5E7B8CB9"]},"body":{"encoding":"UTF-8","base64_string":""},"http_version":null},"recorded_at":"Wed, 25 Mar 2020 16:54:17 GMT"}],"recorded_with":"VCR 5.1.0"} \ No newline at end of file diff --git a/spec/cassettes/Octokit_Client_OauthApplications/_reset_token/has_a_reset_application_authorization_alias.json b/spec/cassettes/Octokit_Client_OauthApplications/_reset_token/has_a_reset_application_authorization_alias.json new file mode 100644 index 000000000..6bb98b27f --- /dev/null +++ b/spec/cassettes/Octokit_Client_OauthApplications/_reset_token/has_a_reset_application_authorization_alias.json @@ -0,0 +1 @@ +{"http_interactions":[{"request":{"method":"patch","uri":"https://github.com/gitapi/applications//token","body":{"encoding":"UTF-8","base64_string":"eyJhY2Nlc3NfdG9rZW4iOiI8R0lUSFVCX1RFU1RfT0FVVEhfVE9LRU4+In0=\n"},"headers":{"Accept":["application/vnd.github.doctor-strange-preview+json"],"User-Agent":["Octokit Ruby Gem 4.17.0"],"Content-Type":["application/json"],"Authorization":["Basic NzQ0NjkwYmI4MDBkNTcxNWFkOTA6YTFkZmU2YTc3MzljOTJiOGRmMDBmM2FiOWU5ZDc2OTVhNWU4NGU0ZQ=="],"Accept-Encoding":["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"]}},"response":{"status":{"code":200,"message":"OK"},"headers":{"Server":["GitHub.com"],"Date":["Wed, 25 Mar 2020 16:52:00 GMT"],"Content-Type":["application/json; charset=utf-8"],"Transfer-Encoding":["chunked"],"Status":["200 OK"],"X-Ratelimit-Limit":["5000"],"X-Ratelimit-Remaining":["4985"],"X-Ratelimit-Reset":["1585156070"],"Cache-Control":["public, max-age=60, s-maxage=60"],"Vary":["Accept","Accept-Encoding, Accept, X-Requested-With"],"Etag":["W/\"14f3e6db62518d29100f07b491bcedb6\""],"X-Github-Media-Type":["github.v3; param=doctor-strange-preview; format=json"],"Access-Control-Expose-Headers":["ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, Deprecation, Sunset"],"Access-Control-Allow-Origin":["*"],"Strict-Transport-Security":["max-age=31536000; includeSubdomains; preload"],"X-Frame-Options":["deny"],"X-Content-Type-Options":["nosniff"],"X-Xss-Protection":["1; mode=block"],"Referrer-Policy":["origin-when-cross-origin, strict-origin-when-cross-origin"],"Content-Security-Policy":["default-src 'none'"],"X-Github-Request-Id":["DA41:7818:9437AB:FB6C8D:5E7B8C2F"]},"body":{"encoding":"ASCII-8BIT","base64_string":"eyJpZCI6NDAxNjg5NzQ1LCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29t\nL2F1dGhvcml6YXRpb25zLzQwMTY4OTc0NSIsImFwcCI6eyJuYW1lIjoiT2N0\nb2tpdCIsInVybCI6Imh0dHBzOi8vZXhhbXBsZS5jb20iLCJjbGllbnRfaWQi\nOiI8R0lUSFVCX0NMSUVOVF9JRD4ifSwidG9rZW4iOiIyZWU1Mjc1ZmQyZTAx\nMDI1MzA4OGY3MmM5YjExZTRjMTJhZTgzZjc1IiwiaGFzaGVkX3Rva2VuIjoi\nOTQ5M2RjZjhlZDczZDVkNmFmZWI1N2I2NzAyMzI0MGUzYTllNzhjMzNlOWZh\nMDllNjQ1YmQ2M2QwZTI5NjBiNSIsInRva2VuX2xhc3RfZWlnaHQiOiIyYWU4\nM2Y3NSIsIm5vdGUiOm51bGwsIm5vdGVfdXJsIjpudWxsLCJjcmVhdGVkX2F0\nIjoiMjAyMC0wMy0yNVQxNjo1MToyMVoiLCJ1cGRhdGVkX2F0IjoiMjAyMC0w\nMy0yNVQxNjo1MjowMFoiLCJzY29wZXMiOltdLCJmaW5nZXJwcmludCI6bnVs\nbCwidXNlciI6eyJsb2dpbiI6InRhcmVieXRlIiwiaWQiOjU2NDExMywibm9k\nZV9pZCI6Ik1EUTZWWE5sY2pVMk5ERXhNdz09IiwiYXZhdGFyX3VybCI6Imh0\ndHBzOi8vYXZhdGFyczIuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNTY0MTEz\nP3Y9NCIsImdyYXZhdGFyX2lkIjoiIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0\naHViLmNvbS91c2Vycy90YXJlYnl0ZSIsImh0bWxfdXJsIjoiaHR0cHM6Ly9n\naXRodWIuY29tL3RhcmVieXRlIiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8v\nYXBpLmdpdGh1Yi5jb20vdXNlcnMvdGFyZWJ5dGUvZm9sbG93ZXJzIiwiZm9s\nbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvdGFy\nZWJ5dGUvZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0\ndHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvdGFyZWJ5dGUvZ2lzdHN7L2dp\nc3RfaWR9Iiwic3RhcnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29t\nL3VzZXJzL3RhcmVieXRlL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJz\nY3JpcHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMv\ndGFyZWJ5dGUvc3Vic2NyaXB0aW9ucyIsIm9yZ2FuaXphdGlvbnNfdXJsIjoi\naHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy90YXJlYnl0ZS9vcmdzIiwi\ncmVwb3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy90YXJl\nYnl0ZS9yZXBvcyIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIu\nY29tL3VzZXJzL3RhcmVieXRlL2V2ZW50c3svcHJpdmFjeX0iLCJyZWNlaXZl\nZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy90\nYXJlYnl0ZS9yZWNlaXZlZF9ldmVudHMiLCJ0eXBlIjoiVXNlciIsInNpdGVf\nYWRtaW4iOnRydWV9fQ==\n"},"http_version":null},"recorded_at":"Wed, 25 Mar 2020 16:52:00 GMT"}],"recorded_with":"VCR 5.1.0"} \ No newline at end of file diff --git a/spec/cassettes/Octokit_Client_OauthApplications/_reset_token/resets_the_token.json b/spec/cassettes/Octokit_Client_OauthApplications/_reset_token/resets_the_token.json new file mode 100644 index 000000000..41fa91417 --- /dev/null +++ b/spec/cassettes/Octokit_Client_OauthApplications/_reset_token/resets_the_token.json @@ -0,0 +1 @@ +{"http_interactions":[{"request":{"method":"patch","uri":"https://github.com/gitapi/applications//token","body":{"encoding":"UTF-8","base64_string":"eyJhY2Nlc3NfdG9rZW4iOiI8R0lUSFVCX1RFU1RfT0FVVEhfVE9LRU4+In0=\n"},"headers":{"Accept":["application/vnd.github.doctor-strange-preview+json"],"User-Agent":["Octokit Ruby Gem 4.17.0"],"Content-Type":["application/json"],"Authorization":["Basic NzQ0NjkwYmI4MDBkNTcxNWFkOTA6YTFkZmU2YTc3MzljOTJiOGRmMDBmM2FiOWU5ZDc2OTVhNWU4NGU0ZQ=="],"Accept-Encoding":["gzip;q=1.0,deflate;q=0.6,identity;q=0.3"]}},"response":{"status":{"code":200,"message":"OK"},"headers":{"Server":["GitHub.com"],"Date":["Wed, 25 Mar 2020 16:51:11 GMT"],"Content-Type":["application/json; charset=utf-8"],"Transfer-Encoding":["chunked"],"Status":["200 OK"],"X-Ratelimit-Limit":["5000"],"X-Ratelimit-Remaining":["4986"],"X-Ratelimit-Reset":["1585156070"],"Cache-Control":["public, max-age=60, s-maxage=60"],"Vary":["Accept","Accept-Encoding, Accept, X-Requested-With"],"Etag":["W/\"93777c1c3a5f829bc4fa625c2498d7de\""],"X-Github-Media-Type":["github.v3; param=doctor-strange-preview; format=json"],"Access-Control-Expose-Headers":["ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, Deprecation, Sunset"],"Access-Control-Allow-Origin":["*"],"Strict-Transport-Security":["max-age=31536000; includeSubdomains; preload"],"X-Frame-Options":["deny"],"X-Content-Type-Options":["nosniff"],"X-Xss-Protection":["1; mode=block"],"Referrer-Policy":["origin-when-cross-origin, strict-origin-when-cross-origin"],"Content-Security-Policy":["default-src 'none'"],"X-Github-Request-Id":["DA2E:5DF8:A7D58:1D85FA:5E7B8BFE"]},"body":{"encoding":"ASCII-8BIT","base64_string":"eyJpZCI6NDAxNjg4NzQyLCJ1cmwiOiJodHRwczovL2FwaS5naXRodWIuY29t\nL2F1dGhvcml6YXRpb25zLzQwMTY4ODc0MiIsImFwcCI6eyJuYW1lIjoiT2N0\nb2tpdCIsInVybCI6Imh0dHBzOi8vZXhhbXBsZS5jb20iLCJjbGllbnRfaWQi\nOiI8R0lUSFVCX0NMSUVOVF9JRD4ifSwidG9rZW4iOiJlMmE4NjExN2E2ZDMw\nNmFlYWExNzMxMWIyOTJjYWFhNTNhNDEwNWE2IiwiaGFzaGVkX3Rva2VuIjoi\nMmYyNDhlNjQyYzE0YTkzZDE4NDk3YjMyMzJjMmZkYTllNDVjMTJkYzY0ZDhh\nMWZhMzE2NWNhMDc3YTE2NGUwZiIsInRva2VuX2xhc3RfZWlnaHQiOiIzYTQx\nMDVhNiIsIm5vdGUiOm51bGwsIm5vdGVfdXJsIjpudWxsLCJjcmVhdGVkX2F0\nIjoiMjAyMC0wMy0yNVQxNjo0OToxOFoiLCJ1cGRhdGVkX2F0IjoiMjAyMC0w\nMy0yNVQxNjo1MToxMVoiLCJzY29wZXMiOltdLCJmaW5nZXJwcmludCI6bnVs\nbCwidXNlciI6eyJsb2dpbiI6InRhcmVieXRlIiwiaWQiOjU2NDExMywibm9k\nZV9pZCI6Ik1EUTZWWE5sY2pVMk5ERXhNdz09IiwiYXZhdGFyX3VybCI6Imh0\ndHBzOi8vYXZhdGFyczIuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNTY0MTEz\nP3Y9NCIsImdyYXZhdGFyX2lkIjoiIiwidXJsIjoiaHR0cHM6Ly9hcGkuZ2l0\naHViLmNvbS91c2Vycy90YXJlYnl0ZSIsImh0bWxfdXJsIjoiaHR0cHM6Ly9n\naXRodWIuY29tL3RhcmVieXRlIiwiZm9sbG93ZXJzX3VybCI6Imh0dHBzOi8v\nYXBpLmdpdGh1Yi5jb20vdXNlcnMvdGFyZWJ5dGUvZm9sbG93ZXJzIiwiZm9s\nbG93aW5nX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvdGFy\nZWJ5dGUvZm9sbG93aW5ney9vdGhlcl91c2VyfSIsImdpc3RzX3VybCI6Imh0\ndHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvdGFyZWJ5dGUvZ2lzdHN7L2dp\nc3RfaWR9Iiwic3RhcnJlZF91cmwiOiJodHRwczovL2FwaS5naXRodWIuY29t\nL3VzZXJzL3RhcmVieXRlL3N0YXJyZWR7L293bmVyfXsvcmVwb30iLCJzdWJz\nY3JpcHRpb25zX3VybCI6Imh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMv\ndGFyZWJ5dGUvc3Vic2NyaXB0aW9ucyIsIm9yZ2FuaXphdGlvbnNfdXJsIjoi\naHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy90YXJlYnl0ZS9vcmdzIiwi\ncmVwb3NfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy90YXJl\nYnl0ZS9yZXBvcyIsImV2ZW50c191cmwiOiJodHRwczovL2FwaS5naXRodWIu\nY29tL3VzZXJzL3RhcmVieXRlL2V2ZW50c3svcHJpdmFjeX0iLCJyZWNlaXZl\nZF9ldmVudHNfdXJsIjoiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2Vycy90\nYXJlYnl0ZS9yZWNlaXZlZF9ldmVudHMiLCJ0eXBlIjoiVXNlciIsInNpdGVf\nYWRtaW4iOnRydWV9fQ==\n"},"http_version":null},"recorded_at":"Wed, 25 Mar 2020 16:51:11 GMT"}],"recorded_with":"VCR 5.1.0"} \ No newline at end of file diff --git a/spec/helper.rb b/spec/helper.rb index 99ed3953a..f62ae44ea 100644 --- a/spec/helper.rb +++ b/spec/helper.rb @@ -15,6 +15,7 @@ require 'webmock/rspec' require 'base64' require 'jwt' +require 'pry-byebug' WebMock.disable_net_connect!(:allow => 'coveralls.io') @@ -90,6 +91,11 @@ c.define_cassette_placeholder("") do test_github_integration_installation end + # This MUST belong to the app used for test_github_client_id and + # test_github_client_secret + c.define_cassette_placeholder("") do + test_github_oauth_token + end c.before_http_request(:real?) do |request| next if request.headers['X-Vcr-Test-Repo-Setup'] @@ -226,6 +232,10 @@ def test_github_integration_pem_key ENV.fetch 'OCTOKIT_TEST_INTEGRATION_PEM_KEY', "#{fixture_path}/fake_integration.private-key.pem" end +def test_github_oauth_token + ENV.fetch 'OCTOKIT_TEST_GITHUB_OAUTH_TOKEN', 'q' * 40 +end + def stub_delete(url) stub_request(:delete, github_url(url)) end diff --git a/spec/octokit/client/authorizations_spec.rb b/spec/octokit/client/authorizations_spec.rb index da70165ab..a4bddc591 100644 --- a/spec/octokit/client/authorizations_spec.rb +++ b/spec/octokit/client/authorizations_spec.rb @@ -225,150 +225,6 @@ def note end end # .authorize_url - describe ".check_application_authorization" do - it "checks an application authorization", :vcr do - fingerprint = SecureRandom.hex(6) - use_vcr_placeholder_for(fingerprint, "CHECK_APPLICATION_AUTHORIZATION_FINGERPRINT") - - authorization = @client.create_authorization( - idempotent: true, - client_id: test_github_client_id, - client_secret: test_github_client_secret, - fingerprint: fingerprint - ) - - use_vcr_placeholder_for(authorization.token, "CHECK_APPLICATION_AUTHORIZATION_TOKEN") - - token = @app_client.check_application_authorization(authorization.token, accept: preview_header) - path = "/applications/#{test_github_client_id}/tokens" - - expect(WebMock).to have_requested(:post, github_url(path)).with( - basic_auth: [ - test_github_client_id, - test_github_client_secret - ] - ) - - expect(token.user.login).to eq(test_github_login) - end - - it "works in Enterprise mode" do - api_endpoint = "https://gh-enterprise.com/api/v3" - client_id = "abcde12345fghij67890" - client_secret = "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcd" - token = "25f94a2a5c7fbaf499c665bc73d67c1c87e496da8985131633ee0a95819db2e8" - - path = File.join(api_endpoint, "/applications/#{client_id}/tokens") - - client = Octokit::Client.new( - client_id: client_id, - client_secret: client_secret, - api_endpoint: api_endpoint - ) - - request = stub_request(:post, path).with(basic_auth: [client_id, client_secret]) - client.check_application_authorization(token, accept: preview_header) - - assert_requested request - end - end # .check_application_authorization - - describe ".reset_application_authorization" do - it "resets a token", :vcr do - fingerprint = SecureRandom.hex(6) - use_vcr_placeholder_for(fingerprint, "RESET_APPLICATION_AUTHORIZATION_FINGERPRINT") - - authorization = @client.create_authorization( - idempotent: true, - client_id: test_github_client_id, - client_secret: test_github_client_secret, - fingerprint: fingerprint - ) - - use_vcr_placeholder_for(authorization.token, "RESET_APPLICATION_AUTHORIZATION_TOKEN") - - new_authorization = @app_client.reset_application_authorization(authorization.token, accept: preview_header) - - expect(new_authorization.rels[:self].href).to eq(authorization.rels[:self].href) - expect(new_authorization.token).to_not eq(authorization.token) - - path = "/applications/#{test_github_client_id}/tokens" - expect(WebMock).to have_requested(:patch, github_url(path)).with( - basic_auth: [ - test_github_client_id, - test_github_client_secret - ] - ) - end - - it "works in Enterprise mode" do - api_endpoint = "https://gh-enterprise.com/api/v3" - client_id = "abcde12345fghij67890" - client_secret = "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcd" - token = "25f94a2a5c7fbaf499c665bc73d67c1c87e496da8985131633ee0a95819db2e8" - - path = File.join(api_endpoint, "/applications/#{client_id}/tokens") - - client = Octokit::Client.new( - client_id: client_id, - client_secret: client_secret, - api_endpoint: api_endpoint - ) - - request = stub_request(:patch, path).with(basic_auth: [client_id, client_secret]) - client.reset_application_authorization(token, accept: preview_header) - - assert_requested request - end - end # .reset_application_authorization - - describe ".revoke_application_authorization" do - it "deletes an application authorization", :vcr do - fingerprint = SecureRandom.hex(6) - use_vcr_placeholder_for(fingerprint, "REVOKE_APPLICATION_AUTHORIZATION_FINGERPRINT") - - authorization = @client.create_authorization( - idempotent: true, - client_id: test_github_client_id, - client_secret: test_github_client_secret, - fingerprint: fingerprint - ) - - use_vcr_placeholder_for(authorization.token, "REVOKE_APPLICATION_AUTHORIZATION_TOKEN") - - result = @app_client.revoke_application_authorization(authorization.token, accept: preview_header) - expect(result).to be_truthy - - path = "/applications/#{test_github_client_id}/tokens" - expect(WebMock).to have_requested(:delete, github_url(path)).with( - basic_auth: [ - test_github_client_id, - test_github_client_secret - ] - ) - end - - it "works in Enterprise mode" do - api_endpoint = "https://gh-enterprise.com/api/v3" - client_id = "abcde12345fghij67890" - client_secret = "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcd" - token = "25f94a2a5c7fbaf499c665bc73d67c1c87e496da8985131633ee0a95819db2e8" - - path = File.join(api_endpoint, "/applications/#{client_id}/tokens") - - client = Octokit::Client.new( - client_id: client_id, - client_secret: client_secret, - api_endpoint: api_endpoint - ) - - request = stub_request(:delete, path).with(basic_auth: [client_id, client_secret]) - client.revoke_application_authorization(token, accept: preview_header) - - assert_requested request - end - end # .revoke_application_authorization - describe ".revoke_all_application_authorizations" do before do allow(@app_client).to receive(:octokit_warn) diff --git a/spec/octokit/client/oauth_applications_spec.rb b/spec/octokit/client/oauth_applications_spec.rb new file mode 100644 index 000000000..771c070f5 --- /dev/null +++ b/spec/octokit/client/oauth_applications_spec.rb @@ -0,0 +1,165 @@ +# frozen_string_literal: true + +require 'helper' +require 'securerandom' + +# Right now until we come up with a better way we have to make these tokens +# by hand because the Authorizations API is going away. +# +# See https://developer.github.com/changes/2019-11-05-deprecated-passwords-and-authorizations-api/ +describe Octokit::Client::OauthApplications do + before do + Octokit.reset! + + @app_client = Octokit::Client.new( + client_id: test_github_client_id, + client_secret: test_github_client_secret + ) + + @access_token = test_github_oauth_token + end + + after do + Octokit.reset! + end + + describe '.check_token' do + it 'checks the token is valid', :vcr do + @app_client.check_token(@access_token, accept: Octokit::Preview::PREVIEW_TYPES[:applications_api]) + path = "/applications/#{test_github_client_id}/token" + + expect(WebMock).to have_requested(:post, github_url(path)).with( + basic_auth: [test_github_client_id, test_github_client_secret], + ) + end + + it 'has a .check_application_authorization alias', :vcr do + @app_client.check_application_authorization(@access_token, accept: Octokit::Preview::PREVIEW_TYPES[:applications_api]) + path = "/applications/#{test_github_client_id}/token" + + expect(WebMock).to have_requested(:post, github_url(path)).with( + basic_auth: [test_github_client_id, test_github_client_secret], + ) + end + + it "works in Enterprise mode" do + api_endpoint = "https://gh-enterprise.com/api/v3" + client_id = "abcde12345fghij67890" + client_secret = "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcd" + token = "25f94a2a5c7fbaf499c665bc73d67c1c87e496da8985131633ee0a95819db2e8" + + path = File.join(api_endpoint, "/applications/#{client_id}/token") + + client = Octokit::Client.new( + client_id: client_id, + client_secret: client_secret, + api_endpoint: api_endpoint + ) + + request = stub_request(:post, path).with(basic_auth: [client_id, client_secret]) + client.check_token(token, accept: Octokit::Preview::PREVIEW_TYPES[:applications_api]) + + assert_requested request + end + end # .check_token + + describe '.reset_token' do + it 'resets the token', :vcr do + @app_client.reset_token(@access_token, accept: Octokit::Preview::PREVIEW_TYPES[:applications_api]) + path = "/applications/#{test_github_client_id}/token" + + expect(WebMock).to have_requested(:patch, github_url(path)).with( + basic_auth: [test_github_client_id, test_github_client_secret], + ) + end + + it 'has a .reset_application_authorization alias', :vcr do + @app_client.reset_application_authorization(@access_token, accept: Octokit::Preview::PREVIEW_TYPES[:applications_api]) + path = "/applications/#{test_github_client_id}/token" + + expect(WebMock).to have_requested(:patch, github_url(path)).with( + basic_auth: [test_github_client_id, test_github_client_secret], + ) + end + + it "works in Enterprise mode" do + api_endpoint = "https://gh-enterprise.com/api/v3" + client_id = "abcde12345fghij67890" + client_secret = "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcd" + token = "25f94a2a5c7fbaf499c665bc73d67c1c87e496da8985131633ee0a95819db2e8" + + path = File.join(api_endpoint, "/applications/#{client_id}/token") + + client = Octokit::Client.new( + client_id: client_id, + client_secret: client_secret, + api_endpoint: api_endpoint + ) + + request = stub_request(:patch, path).with(basic_auth: [client_id, client_secret]) + client.reset_token(token, accept: Octokit::Preview::PREVIEW_TYPES[:applications_api]) + + assert_requested request + end + end # .reset_token + + describe '.delete_app_token' do + it 'deletes the token', :vcr do + @app_client.delete_app_token(@access_token, accept: Octokit::Preview::PREVIEW_TYPES[:applications_api]) + path = "/applications/#{test_github_client_id}/token" + + expect(WebMock).to have_requested(:delete, github_url(path)).with( + basic_auth: [test_github_client_id, test_github_client_secret], + ) + end + + it 'has a .delete_application_authorization alias', :vcr do + @app_client.delete_application_authorization(@access_token, accept: Octokit::Preview::PREVIEW_TYPES[:applications_api]) + path = "/applications/#{test_github_client_id}/token" + + expect(WebMock).to have_requested(:delete, github_url(path)).with( + basic_auth: [test_github_client_id, test_github_client_secret], + ) + end + + it 'has a .revoke_application_authorization alias', :vcr do + @app_client.revoke_application_authorization(@access_token, accept: Octokit::Preview::PREVIEW_TYPES[:applications_api]) + path = "/applications/#{test_github_client_id}/token" + + expect(WebMock).to have_requested(:delete, github_url(path)).with( + basic_auth: [test_github_client_id, test_github_client_secret], + ) + end + + it "works in Enterprise mode" do + api_endpoint = "https://gh-enterprise.com/api/v3" + client_id = "abcde12345fghij67890" + client_secret = "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcd" + token = "25f94a2a5c7fbaf499c665bc73d67c1c87e496da8985131633ee0a95819db2e8" + + path = File.join(api_endpoint, "/applications/#{client_id}/token") + + client = Octokit::Client.new( + client_id: client_id, + client_secret: client_secret, + api_endpoint: api_endpoint + ) + + request = stub_request(:delete, path).with(basic_auth: [client_id, client_secret]) + client.delete_app_token(token, accept: Octokit::Preview::PREVIEW_TYPES[:applications_api]) + + assert_requested request + end + end # .delete_app_token + + describe '.delete_app_authorization', :vcr do + it "revokes the app's access to the user" do + @app_client.delete_app_authorization(@access_token, accept: Octokit::Preview::PREVIEW_TYPES[:applications_api]) + path = "/applications/#{test_github_client_id}/grant" + + expect(WebMock).to have_requested(:delete, github_url(path)).with( + basic_auth: [test_github_client_id, test_github_client_secret], + ) + end + end +end