zoom_rb 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6298bd85028abebb9ba4b82a23d22ddefeeca40d424cd71274c1696f20986d59
4
- data.tar.gz: f312fbe762644b491bb9e51c56b500797f0e457edcc30d99235ba9859e56ede7
3
+ metadata.gz: f1daca097d96a5590a12307f6fb353a613e8c74ae5c0a0ab93fde738fcd3518b
4
+ data.tar.gz: 33bbfbb55bb2343c296cddfd92906b799fd57ded467f7755e836971b58f675ad
5
5
  SHA512:
6
- metadata.gz: 27314937fc73a8c099edd373160f062e05c1f02b3ab35955877f7cdd48cd645031165a4873f83cd6332e69f1c03eb9fd02e851036d8a1c46c8b01f358fe69406
7
- data.tar.gz: 9317f1791b0f20c0a53ddc0fe7518aab7d3760b41f7a7fe81aa22d3a4a0785aab200dd0f478930cfa3e6b2271e78043c5f1b62dd7704f7dce8755ebee537f6a4
6
+ metadata.gz: 3c02b9b0964774320e19da1a8269e864c012b86ea32e4383d1e69618dc6d6a2e927fb263782009c199a57003c3b11b6c928b3d5945a955df8aaf4050fabd0721
7
+ data.tar.gz: a5b0c0c8ae5d8c59e30967a4b48e1372dccd0642dd90a5bc8551b917b0a91f8a912dfe2a4c056caae6659ac477812cfd79b745659ac361b63649edbc2a163c86
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ # 1.1.0
2
+
3
+ ### New features
4
+ * Support the new Zoom API OAuth security measures which are described here:
5
+ https://marketplace.zoom.us/docs/guides/stay-up-to-date/announcements/#zoom-oauth-security-updates
6
+ * Support the code_verifier parameter in the access_tokens call.
7
+
1
8
  # 1.0.2
2
9
 
3
10
  ### Fixes:
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- zoom_rb (1.0.2)
4
+ zoom_rb (1.1.0)
5
5
  httparty (~> 0.13)
6
6
  json (>= 1.8)
7
7
  jwt
@@ -6,12 +6,16 @@ module Zoom
6
6
  extend Zoom::Actions
7
7
 
8
8
  post 'access_tokens',
9
- '/oauth/token?grant_type=authorization_code&code=:auth_code&redirect_uri=:redirect_uri',
10
- oauth: true
9
+ '/oauth/token',
10
+ oauth: true,
11
+ require: %i[grant_type code redirect_uri],
12
+ permit: :code_verifier,
13
+ args_to_params: { auth_code: :code }
11
14
 
12
15
  post 'refresh_tokens',
13
- '/oauth/token?grant_type=refresh_token&refresh_token=:refresh_token',
14
- oauth: true
16
+ '/oauth/token',
17
+ oauth: true,
18
+ require: %i[grant_type refresh_token]
15
19
 
16
20
  post 'data_compliance', '/oauth/data/compliance',
17
21
  oauth: true,
@@ -19,8 +23,10 @@ module Zoom
19
23
  client_id user_id account_id deauthorization_event_received compliance_completed
20
24
  ]
21
25
 
22
- post 'revoke_tokens', '/oauth/revoke?token=:access_token',
23
- oauth: true
26
+ post 'revoke_tokens', '/oauth/revoke',
27
+ oauth: true,
28
+ require: :token,
29
+ args_to_params: { access_token: :token }
24
30
  end
25
31
  end
26
32
  end
data/lib/zoom/actions.rb CHANGED
@@ -26,31 +26,40 @@ module Zoom
26
26
  end
27
27
  end
28
28
 
29
- def self.make_request(client, method, parsed_path, params, request_options)
29
+ def self.make_request(args)
30
+ client, method, parsed_path, params, request_options, oauth =
31
+ args.values_at :client, :method, :parsed_path, :params, :request_options, :oauth
30
32
  case method
31
33
  when :get
32
34
  request_options[:query] = params
33
35
  when :post, :put, :patch
34
- request_options[:body] = params.to_json
36
+ request_options[:body] =
37
+ oauth ? URI.encode_www_form(params.to_a) : params.to_json
35
38
  end
36
39
  client.class.public_send(method, parsed_path, **request_options)
37
40
  end
38
41
 
39
42
  [:get, :post, :patch, :put, :delete].each do |method|
40
43
  define_method(method) do |name, path, options={}|
41
- required, permitted, oauth = options.values_at :require, :permit, :oauth
44
+ required, permitted, oauth, args_to_params, headers =
45
+ options.values_at :require, :permit, :oauth, :args_to_params, :headers
42
46
  required = Array(required) unless required.is_a?(Hash)
43
47
  permitted = Array(permitted) unless permitted.is_a?(Hash)
44
48
 
45
49
  define_method(name) do |*args|
46
50
  path_keys = Zoom::Actions.extract_path_keys(path)
47
- params = Zoom::Params.new(Utils.extract_options!(args))
51
+ params = Utils.extract_options!(args)
52
+ args_to_params&.each { |key, value| params[value] = params.delete key if params[key] }
53
+ params = Zoom::Params.new(params)
48
54
  parsed_path = Zoom::Actions.parse_path(path, path_keys, params)
49
55
  request_options = Zoom::Actions.determine_request_options(self, oauth)
50
56
  params = params.require(path_keys) unless path_keys.empty?
51
57
  params_without_required = required.empty? ? params : params.require(required)
52
58
  params_without_required.permit(permitted) unless permitted.empty?
53
- response = Zoom::Actions.make_request(self, method, parsed_path, params, request_options)
59
+ response = Zoom::Actions.make_request({
60
+ client: self, method: method, parsed_path: parsed_path,
61
+ params: params, request_options: request_options, oauth: oauth
62
+ })
54
63
  Utils.parse_response(response)
55
64
  end
56
65
  end
data/lib/zoom/client.rb CHANGED
@@ -35,14 +35,20 @@ module Zoom
35
35
 
36
36
  def oauth_request_headers
37
37
  {
38
- 'Authorization' => "Basic #{auth_token}"
39
- }.merge(headers)
38
+ 'Authorization' => "Basic #{auth_token}",
39
+ 'Accept' => 'application/json',
40
+ 'Content-Type' => 'application/x-www-form-urlencoded',
41
+ }
40
42
  end
41
43
 
42
- def request_headers
44
+ def bearer_authorization_header
43
45
  {
44
46
  'Authorization' => "Bearer #{access_token}"
45
- }.merge(headers)
47
+ }
48
+ end
49
+
50
+ def request_headers
51
+ bearer_authorization_header.merge(headers)
46
52
  end
47
53
 
48
54
  def auth_token
@@ -13,7 +13,7 @@ module Zoom
13
13
  # Returns (access_token, refresh_token)
14
14
  #
15
15
  def initialize(config)
16
- Zoom::Params.new(config).permit( %i[auth_token auth_code redirect_uri access_token refresh_token timeout])
16
+ Zoom::Params.new(config).permit( %i[auth_token auth_code redirect_uri access_token refresh_token timeout code_verifier])
17
17
  Zoom::Params.new(config).require_one_of(%i[access_token refresh_token auth_code])
18
18
  if (config.keys & [:auth_code, :redirect_uri]).any?
19
19
  Zoom::Params.new(config).require( %i[auth_code redirect_uri])
@@ -28,13 +28,19 @@ module Zoom
28
28
  end
29
29
 
30
30
  def refresh
31
- response = refresh_tokens(refresh_token: @refresh_token)
31
+ response = refresh_tokens(grant_type: 'refresh_token', refresh_token: @refresh_token)
32
32
  set_tokens(response)
33
33
  response
34
34
  end
35
35
 
36
36
  def oauth
37
- response = access_tokens(auth_code: @auth_code, redirect_uri: @redirect_uri)
37
+ response = access_tokens(
38
+ grant_type: 'authorization_code',
39
+ auth_code: @auth_code,
40
+ redirect_uri: @redirect_uri,
41
+ code_verifier: @code_verifier
42
+ )
43
+
38
44
  set_tokens(response)
39
45
  response
40
46
  end
data/lib/zoom/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Zoom
4
- VERSION = '1.0.2'
4
+ VERSION = '1.1.0'
5
5
  end
@@ -0,0 +1,3 @@
1
+ {
2
+ "status": "success"
3
+ }
@@ -4,23 +4,49 @@ require 'spec_helper'
4
4
 
5
5
  describe Zoom::Actions::Token do
6
6
  let(:zc) { oauth_client }
7
- let(:args) { { auth_code: 'xxx', redirect_uri: 'http://localhost:3000' } }
7
+ let(:args) { { grant_type: 'authorization_code', auth_code: 'xxx', redirect_uri: 'http://localhost:3000', code_verifier: 'xxx' } }
8
+ let(:body) { { grant_type: 'authorization_code', redirect_uri: 'http://localhost:3000', code_verifier: 'xxx', code: 'xxx' } }
8
9
 
9
10
  describe '#access_tokens action' do
11
+ let(:path) { '/oauth/token' }
12
+
13
+ let(:params) do
14
+ {
15
+ base_uri: 'https://zoom.us/',
16
+ body: URI.encode_www_form(body.to_a),
17
+ headers: {
18
+ 'Accept'=>'application/json',
19
+ 'Authorization'=>'Basic eHh4Onh4eA==',
20
+ 'Content-Type'=>'application/x-www-form-urlencoded'
21
+ }
22
+ }
23
+ end
24
+
10
25
  before :each do
11
- stub_request(
12
- :post,
13
- zoom_auth_url('oauth/token')
14
- ).to_return(body: json_response('token', 'access_token'),
15
- headers: { 'Content-Type' => 'application/json' })
26
+ Zoom.configure do |config|
27
+ config.api_key = 'xxx'
28
+ config.api_secret = 'xxx'
29
+ end
30
+
31
+ allow(Zoom::Utils).to receive(:parse_response).and_return(code: 200)
32
+ allow(Zoom::Client::OAuth).to(
33
+ receive(:post).with(path, params)
34
+ .and_return(body: json_response('token', 'access_token'),
35
+ headers: { 'Content-Type' => 'application/json' })
36
+ )
16
37
  end
17
38
 
18
- it "requires an error when args missing" do
19
- expect { zc.access_tokens }.to raise_error(Zoom::ParameterMissing, [:auth_code, :redirect_uri].to_s)
39
+ it "raises an error when args missing" do
40
+ expect { zc.access_tokens }.to raise_error(Zoom::ParameterMissing, [:grant_type, :code, :redirect_uri].to_s)
20
41
  end
21
42
 
22
43
  it 'returns a hash' do
23
44
  expect(zc.access_tokens(args)).to be_kind_of(Hash)
24
45
  end
46
+
47
+ it 'passes args in the body and sends x-www-form-urlencoded header' do
48
+ zc.access_tokens(args)
49
+ expect(Zoom::Client::OAuth).to have_received(:post).with(path, params)
50
+ end
25
51
  end
26
52
  end
@@ -23,6 +23,11 @@ describe Zoom::Actions::Token do
23
23
 
24
24
  describe '#data_compliance action' do
25
25
  before :each do
26
+ Zoom.configure do |config|
27
+ config.api_key = 'xxx'
28
+ config.api_secret = 'xxx'
29
+ end
30
+
26
31
  stub_request(
27
32
  :post,
28
33
  zoom_auth_url('oauth/data/compliance')
@@ -30,7 +35,7 @@ describe Zoom::Actions::Token do
30
35
  headers: { 'Content-Type' => 'application/json' })
31
36
  end
32
37
 
33
- it "requires an error when args missing" do
38
+ it "raises an error when args missing" do
34
39
  expect { zc.data_compliance }.to raise_error(Zoom::ParameterMissing, [:client_id, :user_id, :account_id, :deauthorization_event_received, :compliance_completed].to_s)
35
40
  end
36
41
 
@@ -4,23 +4,48 @@ require 'spec_helper'
4
4
 
5
5
  describe Zoom::Actions::Token do
6
6
  let(:zc) { oauth_client }
7
- let(:args) { { refresh_token: 'xxx' } }
7
+ let(:args) { { grant_type: 'refresh_token', refresh_token: 'xxx' } }
8
8
 
9
9
  describe '#refresh_tokens action' do
10
+ let(:path) { '/oauth/token' }
11
+
12
+ let(:params) do
13
+ {
14
+ base_uri: 'https://zoom.us/',
15
+ body: URI.encode_www_form(args.to_a),
16
+ headers: {
17
+ 'Accept'=>'application/json',
18
+ 'Authorization'=>'Basic eHh4Onh4eA==',
19
+ 'Content-Type'=>'application/x-www-form-urlencoded'
20
+ }
21
+ }
22
+ end
23
+
10
24
  before :each do
11
- stub_request(
12
- :post,
13
- zoom_auth_url('oauth/token')
14
- ).to_return(body: json_response('token', 'refresh_token'),
15
- headers: { 'Content-Type' => 'application/json' })
25
+ Zoom.configure do |config|
26
+ config.api_key = 'xxx'
27
+ config.api_secret = 'xxx'
28
+ end
29
+
30
+ allow(Zoom::Utils).to receive(:parse_response).and_return(code: 200)
31
+ allow(Zoom::Client::OAuth).to(
32
+ receive(:post).with(path, params)
33
+ .and_return(body: json_response('token', 'access_token'),
34
+ headers: { 'Content-Type' => 'application/json' })
35
+ )
16
36
  end
17
37
 
18
- it "requires an error when args missing" do
19
- expect { zc.refresh_tokens }.to raise_error(Zoom::ParameterMissing, [:refresh_token].to_s)
38
+ it "raises an error when args missing" do
39
+ expect { zc.refresh_tokens }.to raise_error(Zoom::ParameterMissing, [:grant_type, :refresh_token].to_s)
20
40
  end
21
41
 
22
42
  it 'returns a hash' do
23
43
  expect(zc.refresh_tokens(args)).to be_kind_of(Hash)
24
44
  end
45
+
46
+ it 'passes args in the body and sends x-www-form-urlencoded header' do
47
+ zc.refresh_tokens(args)
48
+ expect(Zoom::Client::OAuth).to have_received(:post).with(path, params)
49
+ end
25
50
  end
26
51
  end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Zoom::Actions::Token do
6
+ let(:zc) { oauth_client }
7
+ let(:args) { { access_token: 'xxx' } }
8
+ let(:body) { { token: 'xxx' } }
9
+
10
+ describe '#revoke_tokens action' do
11
+ let(:path) { '/oauth/revoke' }
12
+
13
+ let(:params) do
14
+ {
15
+ base_uri: 'https://zoom.us/',
16
+ body: URI.encode_www_form(body.to_a),
17
+ headers: {
18
+ 'Accept'=>'application/json',
19
+ 'Authorization'=>'Basic eHh4Onh4eA==',
20
+ 'Content-Type'=>'application/x-www-form-urlencoded'
21
+ }
22
+ }
23
+ end
24
+
25
+ before :each do
26
+ Zoom.configure do |config|
27
+ config.api_key = 'xxx'
28
+ config.api_secret = 'xxx'
29
+ end
30
+
31
+ allow(Zoom::Utils).to receive(:parse_response).and_return(code: 200)
32
+ allow(Zoom::Client::OAuth).to(
33
+ receive(:post).with(path, params)
34
+ .and_return(body: json_response('token', 'access_token'),
35
+ headers: { 'Content-Type' => 'application/json' })
36
+ )
37
+ end
38
+
39
+ it "raises an error when args missing" do
40
+ expect { zc.revoke_tokens }.to raise_error(Zoom::ParameterMissing, [:token].to_s)
41
+ end
42
+
43
+ it 'returns a hash' do
44
+ expect(zc.revoke_tokens(args)).to be_kind_of(Hash)
45
+ end
46
+
47
+ it 'passes args in the body and sends x-www-form-urlencoded header' do
48
+ zc.revoke_tokens(args)
49
+ expect(Zoom::Client::OAuth).to have_received(:post).with(path, params)
50
+ end
51
+ end
52
+ end
@@ -12,7 +12,7 @@ describe Zoom::Actions do
12
12
 
13
13
  describe 'self.extract_path_keys' do
14
14
  subject { described_class.extract_path_keys(path) }
15
-
15
+
16
16
  it { is_expected.to match_array(path_keys) }
17
17
  end
18
18
 
@@ -23,10 +23,22 @@ describe Zoom::Actions do
23
23
  end
24
24
 
25
25
  describe 'self.make_request' do
26
- subject { described_class.make_request(client, method, parsed_path, params, request_options) }
26
+ subject do
27
+ described_class.make_request({
28
+ client: client, method: method, parsed_path: parsed_path,
29
+ params: params, request_options: request_options
30
+ })
31
+ end
27
32
 
28
33
  let(:request_options) { Zoom::Actions.determine_request_options(client, oauth) }
29
34
 
35
+ before :each do
36
+ Zoom.configure do |config|
37
+ config.api_key = 'xxx'
38
+ config.api_secret = 'xxx'
39
+ end
40
+ end
41
+
30
42
  context 'when get' do
31
43
  let(:method) { :get }
32
44
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zoom_rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kyle Boe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-20 00:00:00.000000000 Z
11
+ date: 2022-02-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -266,6 +266,7 @@ files:
266
266
  - spec/fixtures/token/access_token.json
267
267
  - spec/fixtures/token/data_compliance.json
268
268
  - spec/fixtures/token/refresh_token.json
269
+ - spec/fixtures/token/revoke_token.json
269
270
  - spec/fixtures/user/assistant/create.json
270
271
  - spec/fixtures/user/assistant/list.json
271
272
  - spec/fixtures/user/assistant/set.json
@@ -395,6 +396,7 @@ files:
395
396
  - spec/lib/zoom/actions/token/access_token_spec.rb
396
397
  - spec/lib/zoom/actions/token/data_compliance_spec.rb
397
398
  - spec/lib/zoom/actions/token/refresh_token_spec.rb
399
+ - spec/lib/zoom/actions/token/revoke_token_spec.rb
398
400
  - spec/lib/zoom/actions/user/assistant/create_spec.rb
399
401
  - spec/lib/zoom/actions/user/assistant/delete_all_spec.rb
400
402
  - spec/lib/zoom/actions/user/assistant/delete_spec.rb
@@ -544,6 +546,7 @@ test_files:
544
546
  - spec/fixtures/token/access_token.json
545
547
  - spec/fixtures/token/data_compliance.json
546
548
  - spec/fixtures/token/refresh_token.json
549
+ - spec/fixtures/token/revoke_token.json
547
550
  - spec/fixtures/user/assistant/create.json
548
551
  - spec/fixtures/user/assistant/list.json
549
552
  - spec/fixtures/user/assistant/set.json
@@ -673,6 +676,7 @@ test_files:
673
676
  - spec/lib/zoom/actions/token/access_token_spec.rb
674
677
  - spec/lib/zoom/actions/token/data_compliance_spec.rb
675
678
  - spec/lib/zoom/actions/token/refresh_token_spec.rb
679
+ - spec/lib/zoom/actions/token/revoke_token_spec.rb
676
680
  - spec/lib/zoom/actions/user/assistant/create_spec.rb
677
681
  - spec/lib/zoom/actions/user/assistant/delete_all_spec.rb
678
682
  - spec/lib/zoom/actions/user/assistant/delete_spec.rb