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.
- checksums.yaml +4 -4
- data/lib/rack/twilio_webhook_authentication.rb +3 -3
- data/lib/twilio-ruby/jwt/access_token.rb +111 -0
- data/lib/twilio-ruby/{util → jwt}/capability.rb +9 -9
- data/lib/twilio-ruby/jwt/task_router.rb +203 -0
- data/lib/twilio-ruby/{util → security}/request_validator.rb +1 -1
- data/lib/twilio-ruby/version.rb +1 -1
- data/lib/twilio-ruby.rb +11 -13
- data/spec/jwt/access_token_spec.rb +114 -0
- data/spec/{util → jwt}/capability_spec.rb +18 -18
- data/spec/jwt/task_router_spec.rb +110 -0
- data/spec/jwt/task_router_taskqueue_spec.rb +111 -0
- data/spec/jwt/task_router_worker_spec.rb +146 -0
- data/spec/jwt/task_router_workspace_spec.rb +110 -0
- data/spec/rack/twilio_webhook_authentication_spec.rb +7 -7
- data/spec/{util → security}/request_validator_spec.rb +5 -5
- data/twilio-ruby.gemspec +0 -1
- metadata +19 -31
- data/lib/twilio-ruby/task_router/capability.rb +0 -87
- data/lib/twilio-ruby/task_router.rb +0 -0
- data/lib/twilio-ruby/util/access_token.rb +0 -70
- data/lib/twilio-ruby/util/client_config.rb +0 -29
- data/spec/task_router_spec.rb +0 -114
- data/spec/util/access_token_spec.rb +0 -103
- data/spec/util/client_config_spec.rb +0 -21
@@ -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::
|
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::
|
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::
|
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::
|
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::
|
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::
|
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::
|
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::
|
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::
|
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::
|
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::
|
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::
|
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.
|
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/
|
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
|