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.
- 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
|