twilio-ruby 5.0.0.rc10 → 5.0.0.rc11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,146 @@
1
+ require 'spec_helper'
2
+
3
+ describe Twilio::JWT::WorkerCapability do
4
+ describe 'with a capability' do
5
+ before :each do
6
+ @capability = Twilio::JWT::WorkerCapability.new 'AC123', 'foobar', 'WS456', 'WK789'
7
+ end
8
+
9
+ it 'should return a valid jwt when #generate_token is called' do
10
+ token = @capability.generate_token
11
+ decoded, header = JWT.decode token, 'foobar'
12
+ expect(decoded['policies']).not_to be_nil
13
+ expect(decoded['iss']).not_to be_nil
14
+ expect(decoded['exp']).not_to be_nil
15
+ expect(decoded['account_sid']).to eq('AC123')
16
+ expect(decoded['workspace_sid']).to eq('WS456')
17
+ expect(decoded['worker_sid']).to eq('WK789')
18
+ expect(decoded['channel']).to eq('WK789')
19
+ end
20
+
21
+ it 'should properly set the iss key in the payload' do
22
+ token = @capability.generate_token
23
+ decoded, header = JWT.decode token, 'foobar'
24
+ expect(decoded['iss']).to eq('AC123')
25
+ end
26
+
27
+ it 'should properly set exp based on the default 1-hour ttl' do
28
+ seconds = Time.now.to_i
29
+ token = @capability.generate_token
30
+ decoded, header = JWT.decode token, 'foobar'
31
+ expect(decoded['exp']).to eq(seconds + 3600)
32
+ end
33
+
34
+ it 'should properly set exp based on the ttl arg to #generate_token' do
35
+ seconds = Time.now.to_i
36
+ ttl = rand 10000
37
+ token = @capability.generate_token ttl
38
+ decoded, header = JWT.decode token, 'foobar'
39
+ expect(decoded['exp']).to eq(seconds + ttl)
40
+ end
41
+
42
+ it 'should allow websocket operations and activity list fetches by default' do
43
+ token = @capability.generate_token
44
+ decoded, header = JWT.decode token, 'foobar'
45
+ expect(decoded['policies'].size).to eq(6)
46
+ get_policy = {
47
+ "url" => 'https://event-bridge.twilio.com/v1/wschannels/AC123/WK789',
48
+ "method" => 'GET',
49
+ "query_filter" => {},
50
+ "post_filter" => {},
51
+ "allow" => true
52
+ }
53
+ expect(decoded['policies'][0]).to eq(get_policy)
54
+ post_policy = {
55
+ "url" => 'https://event-bridge.twilio.com/v1/wschannels/AC123/WK789',
56
+ "method" => 'POST',
57
+ "query_filter" => {},
58
+ "post_filter" => {},
59
+ "allow" => true
60
+ }
61
+ expect(decoded['policies'][1]).to eq(post_policy)
62
+
63
+ worker_fetch_policy = {
64
+ 'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Workers/WK789',
65
+ 'method' => 'GET',
66
+ 'query_filter' => {},
67
+ 'post_filter' => {},
68
+ 'allow' => true
69
+ }
70
+ expect(decoded['policies'][2]).to eq(worker_fetch_policy)
71
+
72
+ activities_policy = {
73
+ 'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Activities',
74
+ 'method' => 'GET',
75
+ 'query_filter' => {},
76
+ 'post_filter' => {},
77
+ 'allow' => true
78
+ }
79
+ expect(decoded['policies'][3]).to eq(activities_policy)
80
+
81
+ tasks_policy = {
82
+ 'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Tasks/**',
83
+ 'method' => 'GET',
84
+ 'query_filter' => {},
85
+ 'post_filter' => {},
86
+ 'allow' => true
87
+ }
88
+ expect(decoded['policies'][4]).to eq(tasks_policy)
89
+
90
+ worker_reservations_policy = {
91
+ 'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Workers/WK789/Reservations/**',
92
+ 'method' => 'GET',
93
+ 'query_filter' => {},
94
+ 'post_filter' => {},
95
+ 'allow' => true
96
+ }
97
+ expect(decoded['policies'][5]).to eq(worker_reservations_policy)
98
+ end
99
+
100
+ it 'should add a policy when #allow_activity_updates is called' do
101
+ token = @capability.generate_token
102
+ decoded, header = JWT.decode token, 'foobar'
103
+ policies_size = decoded['policies'].size
104
+
105
+ @capability.allow_activity_updates
106
+ token = @capability.generate_token
107
+ decoded, header = JWT.decode token, 'foobar'
108
+ activity_policy = {
109
+ 'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Workers/WK789',
110
+ 'method' => 'POST',
111
+ 'query_filter' => {},
112
+ 'post_filter' => {'ActivitySid' => {'required' => true}},
113
+ 'allow' => true
114
+ }
115
+ expect(decoded['policies'][-1]).to eq(activity_policy)
116
+ expect(decoded['policies'].size).to eq(policies_size+1)
117
+ end
118
+
119
+ it 'should add two policies when #allow_reservation_updates is called' do
120
+ token = @capability.generate_token
121
+ decoded, header = JWT.decode token, 'foobar'
122
+ policies_size = decoded['policies'].size
123
+
124
+ @capability.allow_reservation_updates
125
+ token = @capability.generate_token
126
+ decoded, header = JWT.decode token, 'foobar'
127
+ tasks_policy = {
128
+ 'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Tasks/**',
129
+ 'method' => 'POST',
130
+ 'query_filter' => {},
131
+ 'post_filter' => {},
132
+ 'allow' => true
133
+ }
134
+ expect(decoded['policies'][-2]).to eq(tasks_policy)
135
+ worker_reservations_policy = {
136
+ 'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Workers/WK789/Reservations/**',
137
+ 'method' => 'POST',
138
+ 'query_filter' => {},
139
+ 'post_filter' => {},
140
+ 'allow' => true
141
+ }
142
+ expect(decoded['policies'][-1]).to eq(worker_reservations_policy)
143
+ expect(decoded['policies'].size).to eq(policies_size+2)
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,110 @@
1
+ require 'spec_helper'
2
+
3
+ describe Twilio::JWT::WorkspaceCapability do
4
+ describe 'with a capability' do
5
+ before :each do
6
+ @capability = Twilio::JWT::WorkspaceCapability.new 'AC123', 'foobar', 'WS456'
7
+ end
8
+
9
+ it 'should return a valid jwt when #generate_token is called' do
10
+ token = @capability.generate_token
11
+ decoded, header = JWT.decode token, 'foobar'
12
+ expect(decoded['policies']).not_to be_nil
13
+ expect(decoded['iss']).not_to be_nil
14
+ expect(decoded['exp']).not_to be_nil
15
+ expect(decoded['account_sid']).to eq('AC123')
16
+ expect(decoded['workspace_sid']).to eq('WS456')
17
+ expect(decoded['channel']).to eq('WS456')
18
+ end
19
+
20
+ it 'should properly set the iss key in the payload' do
21
+ token = @capability.generate_token
22
+ decoded, header = JWT.decode token, 'foobar'
23
+ expect(decoded['iss']).to eq('AC123')
24
+ end
25
+
26
+ it 'should properly set exp based on the default 1-hour ttl' do
27
+ seconds = Time.now.to_i
28
+ token = @capability.generate_token
29
+ decoded, header = JWT.decode token, 'foobar'
30
+ expect(decoded['exp']).to eq(seconds + 3600)
31
+ end
32
+
33
+ it 'should properly set exp based on the ttl arg to #generate_token' do
34
+ seconds = Time.now.to_i
35
+ ttl = rand 10000
36
+ token = @capability.generate_token ttl
37
+ decoded, header = JWT.decode token, 'foobar'
38
+ expect(decoded['exp']).to eq(seconds + ttl)
39
+ end
40
+
41
+ it 'should allow websocket operations and fetching the workspace by default' do
42
+ token = @capability.generate_token
43
+ decoded, header = JWT.decode token, 'foobar'
44
+ expect(decoded['policies'].size).to eq(3)
45
+ get_policy = {
46
+ "url" => 'https://event-bridge.twilio.com/v1/wschannels/AC123/WS456',
47
+ "method" => 'GET',
48
+ "query_filter" => {},
49
+ "post_filter" => {},
50
+ "allow" => true
51
+ }
52
+ expect(decoded['policies'][0]).to eq(get_policy)
53
+ post_policy = {
54
+ "url" => 'https://event-bridge.twilio.com/v1/wschannels/AC123/WS456',
55
+ "method" => 'POST',
56
+ "query_filter" => {},
57
+ "post_filter" => {},
58
+ "allow" => true
59
+ }
60
+ expect(decoded['policies'][1]).to eq(post_policy)
61
+
62
+ workspace_fetch_policy = {
63
+ 'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456',
64
+ 'method' => 'GET',
65
+ 'query_filter' => {},
66
+ 'post_filter' => {},
67
+ 'allow' => true
68
+ }
69
+ expect(decoded['policies'][2]).to eq(workspace_fetch_policy)
70
+ end
71
+
72
+ it 'should add a policy when #allow_fetch_subresources is called' do
73
+ token = @capability.generate_token
74
+ decoded, header = JWT.decode token, 'foobar'
75
+ policies_size = decoded['policies'].size
76
+
77
+ @capability.allow_fetch_subresources
78
+ token = @capability.generate_token
79
+ decoded, header = JWT.decode token, 'foobar'
80
+ workspace_fetch_policy = {
81
+ 'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/**',
82
+ 'method' => 'GET',
83
+ 'query_filter' => {},
84
+ 'post_filter' => {},
85
+ 'allow' => true
86
+ }
87
+ expect(decoded['policies'][-1]).to eq(workspace_fetch_policy)
88
+ expect(decoded['policies'].size).to eq(policies_size+1)
89
+ end
90
+
91
+ it 'should add a policy when #allow_update_subresources is called' do
92
+ token = @capability.generate_token
93
+ decoded, header = JWT.decode token, 'foobar'
94
+ policies_size = decoded['policies'].size
95
+
96
+ @capability.allow_updates_subresources
97
+ token = @capability.generate_token
98
+ decoded, header = JWT.decode token, 'foobar'
99
+ workspace_update_policy = {
100
+ 'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/**',
101
+ 'method' => 'POST',
102
+ 'query_filter' => {},
103
+ 'post_filter' => {},
104
+ 'allow' => true
105
+ }
106
+ expect(decoded['policies'][-1]).to eq(workspace_update_policy)
107
+ expect(decoded['policies'].size).to eq(policies_size+1)
108
+ end
109
+ end
110
+ end
@@ -34,7 +34,7 @@ describe Rack::TwilioWebhookAuthentication do
34
34
  expect_any_instance_of(Rack::Request).to receive(:POST).and_return({'AccountSid' => account_sid})
35
35
  @middleware = Rack::TwilioWebhookAuthentication.new(@app, nil, /\/voice/) { |asid| auth_token}
36
36
  request_validator = double('RequestValidator')
37
- expect(Twilio::Util::RequestValidator).to receive(:new).with(auth_token).and_return(request_validator)
37
+ expect(Twilio::Security::RequestValidator).to receive(:new).with(auth_token).and_return(request_validator)
38
38
  expect(request_validator).to receive(:validate).and_return(true)
39
39
  request = Rack::MockRequest.env_for('/voice')
40
40
  status, headers, body = @middleware.call(request)
@@ -50,14 +50,14 @@ describe Rack::TwilioWebhookAuthentication do
50
50
  end
51
51
 
52
52
  it 'should not intercept when the path doesn\'t match' do
53
- expect(Twilio::Util::RequestValidator).to_not receive(:validate)
53
+ expect(Twilio::Security::RequestValidator).to_not receive(:validate)
54
54
  request = Rack::MockRequest.env_for('/sms')
55
55
  status, headers, body = @middleware.call(request)
56
56
  expect(status).to be(200)
57
57
  end
58
58
 
59
59
  it 'should allow a request through if it validates' do
60
- expect_any_instance_of(Twilio::Util::RequestValidator).to(
60
+ expect_any_instance_of(Twilio::Security::RequestValidator).to(
61
61
  receive(:validate).and_return(true)
62
62
  )
63
63
  request = Rack::MockRequest.env_for('/voice')
@@ -66,7 +66,7 @@ describe Rack::TwilioWebhookAuthentication do
66
66
  end
67
67
 
68
68
  it 'should short circuit a request to 403 if it does not validate' do
69
- expect_any_instance_of(Twilio::Util::RequestValidator).to(
69
+ expect_any_instance_of(Twilio::Security::RequestValidator).to(
70
70
  receive(:validate).and_return(false)
71
71
  )
72
72
  request = Rack::MockRequest.env_for('/voice')
@@ -83,14 +83,14 @@ describe Rack::TwilioWebhookAuthentication do
83
83
  end
84
84
 
85
85
  it 'should not intercept when the path doesn\'t match' do
86
- expect(Twilio::Util::RequestValidator).to_not receive(:validate)
86
+ expect(Twilio::Security::RequestValidator).to_not receive(:validate)
87
87
  request = Rack::MockRequest.env_for('icesms')
88
88
  status, headers, body = @middleware.call(request)
89
89
  expect(status).to be(200)
90
90
  end
91
91
 
92
92
  it 'shold allow a request through if it validates' do
93
- expect_any_instance_of(Twilio::Util::RequestValidator).to(
93
+ expect_any_instance_of(Twilio::Security::RequestValidator).to(
94
94
  receive(:validate).and_return(true)
95
95
  )
96
96
  request = Rack::MockRequest.env_for('/sms')
@@ -99,7 +99,7 @@ describe Rack::TwilioWebhookAuthentication do
99
99
  end
100
100
 
101
101
  it 'should short circuit a request to 403 if it does not validate' do
102
- expect_any_instance_of(Twilio::Util::RequestValidator).to(
102
+ expect_any_instance_of(Twilio::Security::RequestValidator).to(
103
103
  receive(:validate).and_return(false)
104
104
  )
105
105
  request = Rack::MockRequest.env_for('/sms')
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Twilio::Util::RequestValidator do
3
+ describe Twilio::Security::RequestValidator do
4
4
  describe 'configuration' do
5
5
  after(:each) do
6
6
  Twilio.instance_variable_set('@configuration', nil)
@@ -11,7 +11,7 @@ describe Twilio::Util::RequestValidator do
11
11
  config.auth_token = 'someToken'
12
12
  end
13
13
 
14
- validator = Twilio::Util::RequestValidator.new
14
+ validator = Twilio::Security::RequestValidator.new
15
15
  expect(validator.instance_variable_get('@auth_token')).to eq('someToken')
16
16
  end
17
17
 
@@ -20,19 +20,19 @@ describe Twilio::Util::RequestValidator do
20
20
  config.auth_token = 'someToken'
21
21
  end
22
22
 
23
- validator = Twilio::Util::RequestValidator.new 'otherToken'
23
+ validator = Twilio::Security::RequestValidator.new 'otherToken'
24
24
  expect(validator.instance_variable_get('@auth_token')).to eq('otherToken')
25
25
  end
26
26
 
27
27
  it 'should throw an argument error if the auth token isn\'t set' do
28
- expect { Twilio::Util::RequestValidator.new }.to raise_error(ArgumentError)
28
+ expect { Twilio::Security::RequestValidator.new }.to raise_error(ArgumentError)
29
29
  end
30
30
  end
31
31
 
32
32
  describe 'validations' do
33
33
  let(:token) { '2bd9e9638872de601313dc77410d3b23' }
34
34
 
35
- let(:validator) { Twilio::Util::RequestValidator.new token }
35
+ let(:validator) { Twilio::Security::RequestValidator.new token }
36
36
 
37
37
  let(:voice_url) { 'http://twiliotests.heroku.com/validate/voice' }
38
38
 
data/twilio-ruby.gemspec CHANGED
@@ -23,7 +23,6 @@ Gem::Specification.new do |spec|
23
23
 
24
24
  spec.add_dependency('builder', '>= 2.1.2')
25
25
  spec.add_dependency('jwt', '~> 1.0')
26
- spec.add_dependency('activesupport', '~> 4.2')
27
26
  spec.add_dependency('faraday', '~>0.9')
28
27
  spec.add_dependency('jruby-openssl') if RUBY_PLATFORM == 'java'
29
28
  # Workaround for RBX <= 2.2.1, should be fixed in next version
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twilio-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.0.rc10
4
+ version: 5.0.0.rc11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Benton
@@ -38,20 +38,6 @@ dependencies:
38
38
  - - ~>
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.0'
41
- - !ruby/object:Gem::Dependency
42
- name: activesupport
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ~>
46
- - !ruby/object:Gem::Version
47
- version: '4.2'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ~>
53
- - !ruby/object:Gem::Version
54
- version: '4.2'
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: faraday
57
43
  requirement: !ruby/object:Gem::Requirement
@@ -115,6 +101,9 @@ files:
115
101
  - lib/twilio-ruby/framework/twilio_response.rb
116
102
  - lib/twilio-ruby/framework/version.rb
117
103
  - lib/twilio-ruby/http/http_client.rb
104
+ - lib/twilio-ruby/jwt/access_token.rb
105
+ - lib/twilio-ruby/jwt/capability.rb
106
+ - lib/twilio-ruby/jwt/task_router.rb
118
107
  - lib/twilio-ruby/rest/api.rb
119
108
  - lib/twilio-ruby/rest/api/v2010.rb
120
109
  - lib/twilio-ruby/rest/api/v2010/account.rb
@@ -238,15 +227,10 @@ files:
238
227
  - lib/twilio-ruby/rest/trunking/v1/trunk/ip_access_control_list.rb
239
228
  - lib/twilio-ruby/rest/trunking/v1/trunk/origination_url.rb
240
229
  - lib/twilio-ruby/rest/trunking/v1/trunk/phone_number.rb
241
- - lib/twilio-ruby/task_router.rb
242
- - lib/twilio-ruby/task_router/capability.rb
230
+ - lib/twilio-ruby/security/request_validator.rb
243
231
  - lib/twilio-ruby/twiml/response.rb
244
232
  - lib/twilio-ruby/util.rb
245
- - lib/twilio-ruby/util/access_token.rb
246
- - lib/twilio-ruby/util/capability.rb
247
- - lib/twilio-ruby/util/client_config.rb
248
233
  - lib/twilio-ruby/util/configuration.rb
249
- - lib/twilio-ruby/util/request_validator.rb
250
234
  - lib/twilio-ruby/version.rb
251
235
  - spec/framework/serialize_spec.rb
252
236
  - spec/holodeck/holodeck.rb
@@ -355,16 +339,18 @@ files:
355
339
  - spec/integration/trunking/v1/trunk/origination_url_spec.rb
356
340
  - spec/integration/trunking/v1/trunk/phone_number_spec.rb
357
341
  - spec/integration/trunking/v1/trunk_spec.rb
342
+ - spec/jwt/access_token_spec.rb
343
+ - spec/jwt/capability_spec.rb
344
+ - spec/jwt/task_router_spec.rb
345
+ - spec/jwt/task_router_taskqueue_spec.rb
346
+ - spec/jwt/task_router_worker_spec.rb
347
+ - spec/jwt/task_router_workspace_spec.rb
358
348
  - spec/rack/twilio_webhook_authentication_spec.rb
349
+ - spec/security/request_validator_spec.rb
359
350
  - spec/spec_helper.rb
360
351
  - spec/support/fakeweb.rb
361
- - spec/task_router_spec.rb
362
352
  - spec/twilio_spec.rb
363
- - spec/util/access_token_spec.rb
364
- - spec/util/capability_spec.rb
365
- - spec/util/client_config_spec.rb
366
353
  - spec/util/configuration_spec.rb
367
- - spec/util/request_validator_spec.rb
368
354
  - spec/util/url_encode_spec.rb
369
355
  - twilio-ruby.gemspec
370
356
  homepage: http://github.com/twilio/twilio-ruby
@@ -506,14 +492,16 @@ test_files:
506
492
  - spec/integration/trunking/v1/trunk/origination_url_spec.rb
507
493
  - spec/integration/trunking/v1/trunk/phone_number_spec.rb
508
494
  - spec/integration/trunking/v1/trunk_spec.rb
495
+ - spec/jwt/access_token_spec.rb
496
+ - spec/jwt/capability_spec.rb
497
+ - spec/jwt/task_router_spec.rb
498
+ - spec/jwt/task_router_taskqueue_spec.rb
499
+ - spec/jwt/task_router_worker_spec.rb
500
+ - spec/jwt/task_router_workspace_spec.rb
509
501
  - spec/rack/twilio_webhook_authentication_spec.rb
502
+ - spec/security/request_validator_spec.rb
510
503
  - spec/spec_helper.rb
511
504
  - spec/support/fakeweb.rb
512
- - spec/task_router_spec.rb
513
505
  - spec/twilio_spec.rb
514
- - spec/util/access_token_spec.rb
515
- - spec/util/capability_spec.rb
516
- - spec/util/client_config_spec.rb
517
506
  - spec/util/configuration_spec.rb
518
- - spec/util/request_validator_spec.rb
519
507
  - spec/util/url_encode_spec.rb