twilio-ruby 5.2.3 → 5.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +26 -0
- data/README.md +3 -3
- data/UPGRADE.md +30 -0
- data/lib/twilio-ruby.rb +0 -18
- data/lib/twilio-ruby/rest/api/v2010/account/incoming_phone_number.rb +2 -2
- data/lib/twilio-ruby/rest/chat/v2/service.rb +24 -2
- data/lib/twilio-ruby/rest/chat/v2/service/channel/message.rb +5 -3
- data/lib/twilio-ruby/rest/client.rb +3 -3
- data/lib/twilio-ruby/rest/ip_messaging/v2/service.rb +24 -2
- data/lib/twilio-ruby/rest/ip_messaging/v2/service/channel/message.rb +5 -3
- data/lib/twilio-ruby/rest/notify/v1/service/notification.rb +12 -12
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace.rb +38 -0
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task_queue.rb +40 -0
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task_queue/task_queue_cumulative_statistics.rb +350 -0
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task_queue/task_queue_real_time_statistics.rb +264 -0
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task_queue/task_queue_statistics.rb +10 -2
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task_queue/task_queues_statistics.rb +15 -3
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/worker.rb +38 -0
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/worker/worker_statistics.rb +6 -2
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/worker/workers_cumulative_statistics.rb +274 -0
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/worker/workers_real_time_statistics.rb +213 -0
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/worker/workers_statistics.rb +14 -10
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/workflow.rb +40 -0
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/workflow/workflow_cumulative_statistics.rb +357 -0
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/workflow/workflow_real_time_statistics.rb +243 -0
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/workflow/workflow_statistics.rb +10 -2
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/workspace_cumulative_statistics.rb +339 -0
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/workspace_real_time_statistics.rb +239 -0
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/workspace_statistics.rb +10 -2
- data/lib/twilio-ruby/rest/video/v1/room.rb +7 -0
- data/lib/twilio-ruby/security/request_validator.rb +1 -1
- data/lib/twilio-ruby/version.rb +1 -1
- data/spec/integration/chat/v2/service/channel/message_spec.rb +41 -7
- data/spec/integration/chat/v2/service_spec.rb +8 -0
- data/spec/integration/ip_messaging/v2/service/channel/message_spec.rb +41 -7
- data/spec/integration/ip_messaging/v2/service_spec.rb +8 -0
- data/spec/integration/taskrouter/v1/workspace/task_queue/task_queue_cumulative_statistics_spec.rb +94 -0
- data/spec/integration/taskrouter/v1/workspace/task_queue/task_queue_real_time_statistics_spec.rb +79 -0
- data/spec/integration/taskrouter/v1/workspace/task_queue_spec.rb +8 -0
- data/spec/integration/taskrouter/v1/workspace/worker/worker_statistics_spec.rb +21 -38
- data/spec/integration/taskrouter/v1/workspace/worker/workers_cumulative_statistics_spec.rb +87 -0
- data/spec/integration/taskrouter/v1/workspace/worker/workers_real_time_statistics_spec.rb +68 -0
- data/spec/integration/taskrouter/v1/workspace/worker/workers_statistics_spec.rb +34 -61
- data/spec/integration/taskrouter/v1/workspace/worker_spec.rb +8 -0
- data/spec/integration/taskrouter/v1/workspace/workflow/workflow_cumulative_statistics_spec.rb +95 -0
- data/spec/integration/taskrouter/v1/workspace/workflow/workflow_real_time_statistics_spec.rb +55 -0
- data/spec/integration/taskrouter/v1/workspace/workflow_spec.rb +12 -4
- data/spec/integration/taskrouter/v1/workspace/workspace_cumulative_statistics_spec.rb +92 -0
- data/spec/integration/taskrouter/v1/workspace/workspace_real_time_statistics_spec.rb +70 -0
- data/spec/integration/taskrouter/v1/workspace_spec.rb +8 -0
- data/spec/integration/video/v1/room_spec.rb +12 -0
- data/spec/security/request_validator_spec.rb +0 -28
- data/spec/twilio_spec.rb +0 -15
- metadata +28 -9
- data/lib/rack/twilio_webhook_authentication.rb +0 -46
- data/lib/twilio-ruby/util/configuration.rb +0 -7
- data/spec/rack/twilio_webhook_authentication_spec.rb +0 -106
- data/spec/util/configuration_spec.rb +0 -15
@@ -0,0 +1,70 @@
|
|
1
|
+
##
|
2
|
+
# This code was generated by
|
3
|
+
# \ / _ _ _| _ _
|
4
|
+
# | (_)\/(_)(_|\/| |(/_ v1.0.0
|
5
|
+
# / /
|
6
|
+
|
7
|
+
require 'spec_helper.rb'
|
8
|
+
|
9
|
+
describe 'WorkspaceRealTimeStatistics' do
|
10
|
+
it "can fetch" do
|
11
|
+
@holodeck.mock(Twilio::Response.new(500, ''))
|
12
|
+
|
13
|
+
expect {
|
14
|
+
@client.taskrouter.v1.workspaces("WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") \
|
15
|
+
.workspace_real_time_statistics().fetch()
|
16
|
+
}.to raise_exception(Twilio::REST::TwilioError)
|
17
|
+
|
18
|
+
values = {}
|
19
|
+
expect(
|
20
|
+
@holodeck.has_request?(Holodeck::Request.new(
|
21
|
+
method: 'get',
|
22
|
+
url: 'https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/RealTimeStatistics',
|
23
|
+
))).to eq(true)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "receives fetch responses" do
|
27
|
+
@holodeck.mock(Twilio::Response.new(
|
28
|
+
200,
|
29
|
+
%q[
|
30
|
+
{
|
31
|
+
"url": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/RealTimeStatistics",
|
32
|
+
"tasks_by_priority": {},
|
33
|
+
"activity_statistics": [
|
34
|
+
{
|
35
|
+
"friendly_name": "Idle",
|
36
|
+
"workers": 0,
|
37
|
+
"sid": "WAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
38
|
+
},
|
39
|
+
{
|
40
|
+
"friendly_name": "Busy",
|
41
|
+
"workers": 9,
|
42
|
+
"sid": "WAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
43
|
+
},
|
44
|
+
{
|
45
|
+
"friendly_name": "Offline",
|
46
|
+
"workers": 6,
|
47
|
+
"sid": "WAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
48
|
+
},
|
49
|
+
{
|
50
|
+
"friendly_name": "Reserved",
|
51
|
+
"workers": 0,
|
52
|
+
"sid": "WAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
53
|
+
}
|
54
|
+
],
|
55
|
+
"workspace_sid": "WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
56
|
+
"longest_task_waiting_age": 100,
|
57
|
+
"total_workers": 100,
|
58
|
+
"total_tasks": 100,
|
59
|
+
"account_sid": "ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
60
|
+
"tasks_by_status": {}
|
61
|
+
}
|
62
|
+
]
|
63
|
+
))
|
64
|
+
|
65
|
+
actual = @client.taskrouter.v1.workspaces("WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") \
|
66
|
+
.workspace_real_time_statistics().fetch()
|
67
|
+
|
68
|
+
expect(actual).to_not eq(nil)
|
69
|
+
end
|
70
|
+
end
|
@@ -38,6 +38,8 @@ describe 'Workspace' do
|
|
38
38
|
"links": {
|
39
39
|
"activities": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Activities",
|
40
40
|
"statistics": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Statistics",
|
41
|
+
"workspace_real_time_statistics": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/RealTimeStatistics",
|
42
|
+
"workspace_cumulative_statistics": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/CumulativeStatistics",
|
41
43
|
"task_queues": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/TaskQueues",
|
42
44
|
"tasks": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Tasks",
|
43
45
|
"workers": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Workers",
|
@@ -91,6 +93,8 @@ describe 'Workspace' do
|
|
91
93
|
"links": {
|
92
94
|
"activities": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Activities",
|
93
95
|
"statistics": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Statistics",
|
96
|
+
"workspace_real_time_statistics": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/RealTimeStatistics",
|
97
|
+
"workspace_cumulative_statistics": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/CumulativeStatistics",
|
94
98
|
"task_queues": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/TaskQueues",
|
95
99
|
"tasks": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Tasks",
|
96
100
|
"workers": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Workers",
|
@@ -155,6 +159,8 @@ describe 'Workspace' do
|
|
155
159
|
"links": {
|
156
160
|
"activities": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Activities",
|
157
161
|
"statistics": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Statistics",
|
162
|
+
"workspace_real_time_statistics": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/RealTimeStatistics",
|
163
|
+
"workspace_cumulative_statistics": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/CumulativeStatistics",
|
158
164
|
"task_queues": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/TaskQueues",
|
159
165
|
"tasks": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Tasks",
|
160
166
|
"workers": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Workers",
|
@@ -237,6 +243,8 @@ describe 'Workspace' do
|
|
237
243
|
"links": {
|
238
244
|
"activities": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Activities",
|
239
245
|
"statistics": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Statistics",
|
246
|
+
"workspace_real_time_statistics": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/RealTimeStatistics",
|
247
|
+
"workspace_cumulative_statistics": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/CumulativeStatistics",
|
240
248
|
"task_queues": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/TaskQueues",
|
241
249
|
"tasks": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Tasks",
|
242
250
|
"workers": "https://taskrouter.twilio.com/v1/Workspaces/WSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/Workers",
|
@@ -40,6 +40,9 @@ describe 'Room' do
|
|
40
40
|
"status_callback_method": "POST",
|
41
41
|
"status_callback": "",
|
42
42
|
"record_participants_on_connect": false,
|
43
|
+
"video_codecs": [
|
44
|
+
"VP8"
|
45
|
+
],
|
43
46
|
"end_time": "2015-07-30T20:00:00Z",
|
44
47
|
"url": "https://video.twilio.com/v1/Rooms/RMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
45
48
|
"links": {
|
@@ -87,6 +90,9 @@ describe 'Room' do
|
|
87
90
|
"status_callback_method": "POST",
|
88
91
|
"status_callback": "",
|
89
92
|
"record_participants_on_connect": false,
|
93
|
+
"video_codecs": [
|
94
|
+
"VP8"
|
95
|
+
],
|
90
96
|
"end_time": "2015-07-30T20:00:00Z",
|
91
97
|
"url": "https://video.twilio.com/v1/Rooms/RMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
92
98
|
"links": {
|
@@ -161,6 +167,9 @@ describe 'Room' do
|
|
161
167
|
"duration": 2,
|
162
168
|
"max_participants": 10,
|
163
169
|
"record_participants_on_connect": false,
|
170
|
+
"video_codecs": [
|
171
|
+
"VP8"
|
172
|
+
],
|
164
173
|
"url": "https://video.twilio.com/v1/Rooms/RM4070b618362c1682b2385b1f9982833c",
|
165
174
|
"links": {
|
166
175
|
"recordings": "https://video.twilio.com/v1/Rooms/RM4070b618362c1682b2385b1f9982833c/Recordings"
|
@@ -220,6 +229,9 @@ describe 'Room' do
|
|
220
229
|
"status_callback_method": "POST",
|
221
230
|
"status_callback": "",
|
222
231
|
"record_participants_on_connect": false,
|
232
|
+
"video_codecs": [
|
233
|
+
"VP8"
|
234
|
+
],
|
223
235
|
"end_time": "2015-07-30T20:00:00Z",
|
224
236
|
"duration": 10,
|
225
237
|
"url": "https://video.twilio.com/v1/Rooms/RMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
@@ -1,34 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Twilio::Security::RequestValidator do
|
4
|
-
describe 'configuration' do
|
5
|
-
after(:each) do
|
6
|
-
Twilio.instance_variable_set('@configuration', nil)
|
7
|
-
end
|
8
|
-
|
9
|
-
it 'should set the auth token from a configuration block' do
|
10
|
-
Twilio.configure do |config|
|
11
|
-
config.auth_token = 'someToken'
|
12
|
-
end
|
13
|
-
|
14
|
-
validator = Twilio::Security::RequestValidator.new
|
15
|
-
expect(validator.instance_variable_get('@auth_token')).to eq('someToken')
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'should overwrite the auth token if passed to initializer' do
|
19
|
-
Twilio.configure do |config|
|
20
|
-
config.auth_token = 'someToken'
|
21
|
-
end
|
22
|
-
|
23
|
-
validator = Twilio::Security::RequestValidator.new 'otherToken'
|
24
|
-
expect(validator.instance_variable_get('@auth_token')).to eq('otherToken')
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'should throw an argument error if the auth token isn\'t set' do
|
28
|
-
expect { Twilio::Security::RequestValidator.new }.to raise_error(ArgumentError)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
4
|
describe 'validations' do
|
33
5
|
let(:token) { '2bd9e9638872de601313dc77410d3b23' }
|
34
6
|
|
data/spec/twilio_spec.rb
CHANGED
@@ -1,15 +0,0 @@
|
|
1
|
-
describe Twilio do
|
2
|
-
after(:each) do
|
3
|
-
Twilio.instance_variable_set('@configuration', nil)
|
4
|
-
end
|
5
|
-
|
6
|
-
it 'should set the account sid and auth token with a config block' do
|
7
|
-
Twilio.configure do |config|
|
8
|
-
config.account_sid = 'someSid'
|
9
|
-
config.auth_token = 'someToken'
|
10
|
-
end
|
11
|
-
|
12
|
-
expect(Twilio.account_sid).to eq('someSid')
|
13
|
-
expect(Twilio.auth_token).to eq('someToken')
|
14
|
-
end
|
15
|
-
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: twilio-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Twilio API Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-09-
|
11
|
+
date: 2017-09-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: libxml-ruby
|
@@ -122,12 +122,12 @@ files:
|
|
122
122
|
- Makefile
|
123
123
|
- README.md
|
124
124
|
- Rakefile
|
125
|
+
- UPGRADE.md
|
125
126
|
- VERSIONS.md
|
126
127
|
- conf/cacert.pem
|
127
128
|
- examples/examples.rb
|
128
129
|
- examples/print_call_log.rb
|
129
130
|
- githooks/pre-commit
|
130
|
-
- lib/rack/twilio_webhook_authentication.rb
|
131
131
|
- lib/twilio-ruby.rb
|
132
132
|
- lib/twilio-ruby/framework/domain.rb
|
133
133
|
- lib/twilio-ruby/framework/error.rb
|
@@ -355,15 +355,23 @@ files:
|
|
355
355
|
- lib/twilio-ruby/rest/taskrouter/v1/workspace/task/reservation.rb
|
356
356
|
- lib/twilio-ruby/rest/taskrouter/v1/workspace/task_channel.rb
|
357
357
|
- lib/twilio-ruby/rest/taskrouter/v1/workspace/task_queue.rb
|
358
|
+
- lib/twilio-ruby/rest/taskrouter/v1/workspace/task_queue/task_queue_cumulative_statistics.rb
|
359
|
+
- lib/twilio-ruby/rest/taskrouter/v1/workspace/task_queue/task_queue_real_time_statistics.rb
|
358
360
|
- lib/twilio-ruby/rest/taskrouter/v1/workspace/task_queue/task_queue_statistics.rb
|
359
361
|
- lib/twilio-ruby/rest/taskrouter/v1/workspace/task_queue/task_queues_statistics.rb
|
360
362
|
- lib/twilio-ruby/rest/taskrouter/v1/workspace/worker.rb
|
361
363
|
- lib/twilio-ruby/rest/taskrouter/v1/workspace/worker/reservation.rb
|
362
364
|
- lib/twilio-ruby/rest/taskrouter/v1/workspace/worker/worker_channel.rb
|
363
365
|
- lib/twilio-ruby/rest/taskrouter/v1/workspace/worker/worker_statistics.rb
|
366
|
+
- lib/twilio-ruby/rest/taskrouter/v1/workspace/worker/workers_cumulative_statistics.rb
|
367
|
+
- lib/twilio-ruby/rest/taskrouter/v1/workspace/worker/workers_real_time_statistics.rb
|
364
368
|
- lib/twilio-ruby/rest/taskrouter/v1/workspace/worker/workers_statistics.rb
|
365
369
|
- lib/twilio-ruby/rest/taskrouter/v1/workspace/workflow.rb
|
370
|
+
- lib/twilio-ruby/rest/taskrouter/v1/workspace/workflow/workflow_cumulative_statistics.rb
|
371
|
+
- lib/twilio-ruby/rest/taskrouter/v1/workspace/workflow/workflow_real_time_statistics.rb
|
366
372
|
- lib/twilio-ruby/rest/taskrouter/v1/workspace/workflow/workflow_statistics.rb
|
373
|
+
- lib/twilio-ruby/rest/taskrouter/v1/workspace/workspace_cumulative_statistics.rb
|
374
|
+
- lib/twilio-ruby/rest/taskrouter/v1/workspace/workspace_real_time_statistics.rb
|
367
375
|
- lib/twilio-ruby/rest/taskrouter/v1/workspace/workspace_statistics.rb
|
368
376
|
- lib/twilio-ruby/rest/trunking.rb
|
369
377
|
- lib/twilio-ruby/rest/trunking/v1.rb
|
@@ -390,7 +398,6 @@ files:
|
|
390
398
|
- lib/twilio-ruby/twiml/twiml.rb
|
391
399
|
- lib/twilio-ruby/twiml/voice_response.rb
|
392
400
|
- lib/twilio-ruby/util.rb
|
393
|
-
- lib/twilio-ruby/util/configuration.rb
|
394
401
|
- lib/twilio-ruby/version.rb
|
395
402
|
- spec/framework/request_spec.rb
|
396
403
|
- spec/framework/serialize_spec.rb
|
@@ -568,6 +575,8 @@ files:
|
|
568
575
|
- spec/integration/taskrouter/v1/workspace/event_spec.rb
|
569
576
|
- spec/integration/taskrouter/v1/workspace/task/reservation_spec.rb
|
570
577
|
- spec/integration/taskrouter/v1/workspace/task_channel_spec.rb
|
578
|
+
- spec/integration/taskrouter/v1/workspace/task_queue/task_queue_cumulative_statistics_spec.rb
|
579
|
+
- spec/integration/taskrouter/v1/workspace/task_queue/task_queue_real_time_statistics_spec.rb
|
571
580
|
- spec/integration/taskrouter/v1/workspace/task_queue/task_queue_statistics_spec.rb
|
572
581
|
- spec/integration/taskrouter/v1/workspace/task_queue/task_queues_statistics_spec.rb
|
573
582
|
- spec/integration/taskrouter/v1/workspace/task_queue_spec.rb
|
@@ -575,10 +584,16 @@ files:
|
|
575
584
|
- spec/integration/taskrouter/v1/workspace/worker/reservation_spec.rb
|
576
585
|
- spec/integration/taskrouter/v1/workspace/worker/worker_channel_spec.rb
|
577
586
|
- spec/integration/taskrouter/v1/workspace/worker/worker_statistics_spec.rb
|
587
|
+
- spec/integration/taskrouter/v1/workspace/worker/workers_cumulative_statistics_spec.rb
|
588
|
+
- spec/integration/taskrouter/v1/workspace/worker/workers_real_time_statistics_spec.rb
|
578
589
|
- spec/integration/taskrouter/v1/workspace/worker/workers_statistics_spec.rb
|
579
590
|
- spec/integration/taskrouter/v1/workspace/worker_spec.rb
|
591
|
+
- spec/integration/taskrouter/v1/workspace/workflow/workflow_cumulative_statistics_spec.rb
|
592
|
+
- spec/integration/taskrouter/v1/workspace/workflow/workflow_real_time_statistics_spec.rb
|
580
593
|
- spec/integration/taskrouter/v1/workspace/workflow/workflow_statistics_spec.rb
|
581
594
|
- spec/integration/taskrouter/v1/workspace/workflow_spec.rb
|
595
|
+
- spec/integration/taskrouter/v1/workspace/workspace_cumulative_statistics_spec.rb
|
596
|
+
- spec/integration/taskrouter/v1/workspace/workspace_real_time_statistics_spec.rb
|
582
597
|
- spec/integration/taskrouter/v1/workspace/workspace_statistics_spec.rb
|
583
598
|
- spec/integration/taskrouter/v1/workspace_spec.rb
|
584
599
|
- spec/integration/trunking/v1/trunk/credential_list_spec.rb
|
@@ -597,7 +612,6 @@ files:
|
|
597
612
|
- spec/jwt/access_token_spec.rb
|
598
613
|
- spec/jwt/client_capability_spec.rb
|
599
614
|
- spec/jwt/task_router_spec.rb
|
600
|
-
- spec/rack/twilio_webhook_authentication_spec.rb
|
601
615
|
- spec/rest/client_spec.rb
|
602
616
|
- spec/security/request_validator_spec.rb
|
603
617
|
- spec/spec_helper.rb
|
@@ -605,7 +619,6 @@ files:
|
|
605
619
|
- spec/twilio_spec.rb
|
606
620
|
- spec/twiml/messaging_response_spec.rb
|
607
621
|
- spec/twiml/voice_response_spec.rb
|
608
|
-
- spec/util/configuration_spec.rb
|
609
622
|
- spec/util/url_encode_spec.rb
|
610
623
|
- twilio-ruby.gemspec
|
611
624
|
homepage: http://github.com/twilio/twilio-ruby
|
@@ -635,7 +648,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
635
648
|
version: '0'
|
636
649
|
requirements: []
|
637
650
|
rubyforge_project:
|
638
|
-
rubygems_version: 2.
|
651
|
+
rubygems_version: 2.2.0
|
639
652
|
signing_key:
|
640
653
|
specification_version: 4
|
641
654
|
summary: A simple library for communicating with the Twilio REST API, building TwiML,
|
@@ -817,6 +830,8 @@ test_files:
|
|
817
830
|
- spec/integration/taskrouter/v1/workspace/event_spec.rb
|
818
831
|
- spec/integration/taskrouter/v1/workspace/task/reservation_spec.rb
|
819
832
|
- spec/integration/taskrouter/v1/workspace/task_channel_spec.rb
|
833
|
+
- spec/integration/taskrouter/v1/workspace/task_queue/task_queue_cumulative_statistics_spec.rb
|
834
|
+
- spec/integration/taskrouter/v1/workspace/task_queue/task_queue_real_time_statistics_spec.rb
|
820
835
|
- spec/integration/taskrouter/v1/workspace/task_queue/task_queue_statistics_spec.rb
|
821
836
|
- spec/integration/taskrouter/v1/workspace/task_queue/task_queues_statistics_spec.rb
|
822
837
|
- spec/integration/taskrouter/v1/workspace/task_queue_spec.rb
|
@@ -824,10 +839,16 @@ test_files:
|
|
824
839
|
- spec/integration/taskrouter/v1/workspace/worker/reservation_spec.rb
|
825
840
|
- spec/integration/taskrouter/v1/workspace/worker/worker_channel_spec.rb
|
826
841
|
- spec/integration/taskrouter/v1/workspace/worker/worker_statistics_spec.rb
|
842
|
+
- spec/integration/taskrouter/v1/workspace/worker/workers_cumulative_statistics_spec.rb
|
843
|
+
- spec/integration/taskrouter/v1/workspace/worker/workers_real_time_statistics_spec.rb
|
827
844
|
- spec/integration/taskrouter/v1/workspace/worker/workers_statistics_spec.rb
|
828
845
|
- spec/integration/taskrouter/v1/workspace/worker_spec.rb
|
846
|
+
- spec/integration/taskrouter/v1/workspace/workflow/workflow_cumulative_statistics_spec.rb
|
847
|
+
- spec/integration/taskrouter/v1/workspace/workflow/workflow_real_time_statistics_spec.rb
|
829
848
|
- spec/integration/taskrouter/v1/workspace/workflow/workflow_statistics_spec.rb
|
830
849
|
- spec/integration/taskrouter/v1/workspace/workflow_spec.rb
|
850
|
+
- spec/integration/taskrouter/v1/workspace/workspace_cumulative_statistics_spec.rb
|
851
|
+
- spec/integration/taskrouter/v1/workspace/workspace_real_time_statistics_spec.rb
|
831
852
|
- spec/integration/taskrouter/v1/workspace/workspace_statistics_spec.rb
|
832
853
|
- spec/integration/taskrouter/v1/workspace_spec.rb
|
833
854
|
- spec/integration/trunking/v1/trunk/credential_list_spec.rb
|
@@ -846,7 +867,6 @@ test_files:
|
|
846
867
|
- spec/jwt/access_token_spec.rb
|
847
868
|
- spec/jwt/client_capability_spec.rb
|
848
869
|
- spec/jwt/task_router_spec.rb
|
849
|
-
- spec/rack/twilio_webhook_authentication_spec.rb
|
850
870
|
- spec/rest/client_spec.rb
|
851
871
|
- spec/security/request_validator_spec.rb
|
852
872
|
- spec/spec_helper.rb
|
@@ -854,5 +874,4 @@ test_files:
|
|
854
874
|
- spec/twilio_spec.rb
|
855
875
|
- spec/twiml/messaging_response_spec.rb
|
856
876
|
- spec/twiml/voice_response_spec.rb
|
857
|
-
- spec/util/configuration_spec.rb
|
858
877
|
- spec/util/url_encode_spec.rb
|
@@ -1,46 +0,0 @@
|
|
1
|
-
module Rack
|
2
|
-
# Middleware that authenticates webhooks from Twilio using the request
|
3
|
-
# validator.
|
4
|
-
#
|
5
|
-
# The middleware takes an auth token with which to set up the request
|
6
|
-
# validator and any number of paths. When a path matches the incoming request
|
7
|
-
# path, the request will be checked for authentication.
|
8
|
-
#
|
9
|
-
# Example:
|
10
|
-
#
|
11
|
-
# require 'rack'
|
12
|
-
# use Rack::TwilioWebhookAuthentication, ENV['AUTH_TOKEN'], /\/messages/
|
13
|
-
#
|
14
|
-
# The above appends this middleware to the stack, using an auth token saved in
|
15
|
-
# the ENV and only against paths that match /\/messages/. If the request
|
16
|
-
# validates then it gets passed on to the action as normal. If the request
|
17
|
-
# doesn't validate then the middleware responds immediately with a 403 status.
|
18
|
-
|
19
|
-
class TwilioWebhookAuthentication
|
20
|
-
def initialize(app, auth_token, *paths, &auth_token_lookup)
|
21
|
-
@app = app
|
22
|
-
@auth_token = auth_token
|
23
|
-
define_singleton_method(:get_auth_token, auth_token_lookup) if block_given?
|
24
|
-
@path_regex = Regexp.union(paths)
|
25
|
-
end
|
26
|
-
|
27
|
-
def call(env)
|
28
|
-
return @app.call(env) unless env['PATH_INFO'].match(@path_regex)
|
29
|
-
request = Rack::Request.new(env)
|
30
|
-
original_url = request.url
|
31
|
-
params = request.post? ? request.POST : {}
|
32
|
-
auth_token = @auth_token || get_auth_token(params['AccountSid'])
|
33
|
-
validator = Twilio::Security::RequestValidator.new(auth_token)
|
34
|
-
signature = env['HTTP_X_TWILIO_SIGNATURE'] || ''
|
35
|
-
if validator.validate(original_url, params, signature)
|
36
|
-
@app.call(env)
|
37
|
-
else
|
38
|
-
[
|
39
|
-
403,
|
40
|
-
{ 'Content-Type' => 'text/plain' },
|
41
|
-
['Twilio Request Validation Failed.']
|
42
|
-
]
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
@@ -1,106 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'rack/mock'
|
3
|
-
|
4
|
-
describe Rack::TwilioWebhookAuthentication do
|
5
|
-
before do
|
6
|
-
@app = ->(_env) { [200, { 'Content-Type' => 'text/plain' }, ['Hello']] }
|
7
|
-
end
|
8
|
-
|
9
|
-
describe 'new' do
|
10
|
-
it 'should initialize with an app, auth token and a path' do
|
11
|
-
expect do
|
12
|
-
Rack::TwilioWebhookAuthentication.new(@app, 'ABC', /\/voice/)
|
13
|
-
end.not_to raise_error
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'should initialize with an app, auth token and paths' do
|
17
|
-
expect do
|
18
|
-
Rack::TwilioWebhookAuthentication.new(@app, 'ABC', /\/voice/, /\/sms/)
|
19
|
-
end.not_to raise_error
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'should initialize with an app, dynamic token and paths' do
|
23
|
-
expect do
|
24
|
-
Rack::TwilioWebhookAuthentication.new(@app, nil, /\/voice/, /\/sms/)
|
25
|
-
end.not_to raise_error
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
describe 'calling against one path with dynamic auth token' do
|
30
|
-
it 'should allow a request through if it validates' do
|
31
|
-
auth_token = 'qwerty'
|
32
|
-
account_sid = 12_345
|
33
|
-
expect_any_instance_of(Rack::Request).to receive(:post?).and_return(true)
|
34
|
-
expect_any_instance_of(Rack::Request).to receive(:POST).and_return({ 'AccountSid' => account_sid })
|
35
|
-
@middleware = Rack::TwilioWebhookAuthentication.new(@app, nil, /\/voice/) { |asid| auth_token }
|
36
|
-
request_validator = double('RequestValidator')
|
37
|
-
expect(Twilio::Security::RequestValidator).to receive(:new).with(auth_token).and_return(request_validator)
|
38
|
-
expect(request_validator).to receive(:validate).and_return(true)
|
39
|
-
request = Rack::MockRequest.env_for('/voice')
|
40
|
-
status, headers, body = @middleware.call(request)
|
41
|
-
expect(status).to be(200)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
describe 'calling against one path' do
|
46
|
-
before do
|
47
|
-
@middleware = Rack::TwilioWebhookAuthentication.new(@app, 'ABC', /\/voice/)
|
48
|
-
end
|
49
|
-
|
50
|
-
it 'should not intercept when the path doesn\'t match' do
|
51
|
-
expect(Twilio::Security::RequestValidator).to_not receive(:validate)
|
52
|
-
request = Rack::MockRequest.env_for('/sms')
|
53
|
-
status, headers, body = @middleware.call(request)
|
54
|
-
expect(status).to be(200)
|
55
|
-
end
|
56
|
-
|
57
|
-
it 'should allow a request through if it validates' do
|
58
|
-
expect_any_instance_of(Twilio::Security::RequestValidator).to(
|
59
|
-
receive(:validate).and_return(true)
|
60
|
-
)
|
61
|
-
request = Rack::MockRequest.env_for('/voice')
|
62
|
-
status, headers, body = @middleware.call(request)
|
63
|
-
expect(status).to be(200)
|
64
|
-
end
|
65
|
-
|
66
|
-
it 'should short circuit a request to 403 if it does not validate' do
|
67
|
-
expect_any_instance_of(Twilio::Security::RequestValidator).to(
|
68
|
-
receive(:validate).and_return(false)
|
69
|
-
)
|
70
|
-
request = Rack::MockRequest.env_for('/voice')
|
71
|
-
status, headers, body = @middleware.call(request)
|
72
|
-
expect(status).to be(403)
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
describe 'calling against many paths' do
|
77
|
-
before do
|
78
|
-
@middleware = Rack::TwilioWebhookAuthentication.new(@app, 'ABC', /\/voice/, /\/sms/)
|
79
|
-
end
|
80
|
-
|
81
|
-
it 'should not intercept when the path doesn\'t match' do
|
82
|
-
expect(Twilio::Security::RequestValidator).to_not receive(:validate)
|
83
|
-
request = Rack::MockRequest.env_for('icesms')
|
84
|
-
status, headers, body = @middleware.call(request)
|
85
|
-
expect(status).to be(200)
|
86
|
-
end
|
87
|
-
|
88
|
-
it 'shold allow a request through if it validates' do
|
89
|
-
expect_any_instance_of(Twilio::Security::RequestValidator).to(
|
90
|
-
receive(:validate).and_return(true)
|
91
|
-
)
|
92
|
-
request = Rack::MockRequest.env_for('/sms')
|
93
|
-
status, headers, body = @middleware.call(request)
|
94
|
-
expect(status).to be(200)
|
95
|
-
end
|
96
|
-
|
97
|
-
it 'should short circuit a request to 403 if it does not validate' do
|
98
|
-
expect_any_instance_of(Twilio::Security::RequestValidator).to(
|
99
|
-
receive(:validate).and_return(false)
|
100
|
-
)
|
101
|
-
request = Rack::MockRequest.env_for('/sms')
|
102
|
-
status, headers, body = @middleware.call(request)
|
103
|
-
expect(status).to be(403)
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|