twilio-ruby 5.0.0.rc10 → 5.0.0.rc11

Sign up to get free protection for your applications and to get access to all the features.
@@ -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