twilio-ruby 5.0.0.rc21 → 5.0.0.rc22

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.
Files changed (238) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +3 -0
  3. data/lib/twilio-ruby.rb +7 -3
  4. data/lib/twilio-ruby/framework/domain.rb +5 -1
  5. data/lib/twilio-ruby/framework/page.rb +4 -4
  6. data/lib/twilio-ruby/framework/serialize.rb +3 -2
  7. data/lib/twilio-ruby/framework/values.rb +7 -0
  8. data/lib/twilio-ruby/framework/version.rb +4 -6
  9. data/lib/twilio-ruby/jwt/access_token.rb +160 -134
  10. data/lib/twilio-ruby/jwt/client_capability.rb +98 -0
  11. data/lib/twilio-ruby/jwt/jwt.rb +56 -0
  12. data/lib/twilio-ruby/jwt/task_router.rb +108 -139
  13. data/lib/twilio-ruby/rest/accounts.rb +1 -1
  14. data/lib/twilio-ruby/rest/accounts/v1/credential.rb +1 -1
  15. data/lib/twilio-ruby/rest/accounts/v1/credential/public_key.rb +30 -17
  16. data/lib/twilio-ruby/rest/api.rb +2 -2
  17. data/lib/twilio-ruby/rest/api/v2010/account.rb +31 -18
  18. data/lib/twilio-ruby/rest/api/v2010/account/address.rb +32 -19
  19. data/lib/twilio-ruby/rest/api/v2010/account/address/dependent_phone_number.rb +18 -5
  20. data/lib/twilio-ruby/rest/api/v2010/account/application.rb +32 -19
  21. data/lib/twilio-ruby/rest/api/v2010/account/authorized_connect_app.rb +20 -7
  22. data/lib/twilio-ruby/rest/api/v2010/account/available_phone_number.rb +20 -7
  23. data/lib/twilio-ruby/rest/api/v2010/account/available_phone_number/local.rb +20 -7
  24. data/lib/twilio-ruby/rest/api/v2010/account/available_phone_number/mobile.rb +20 -7
  25. data/lib/twilio-ruby/rest/api/v2010/account/available_phone_number/toll_free.rb +20 -7
  26. data/lib/twilio-ruby/rest/api/v2010/account/call.rb +33 -20
  27. data/lib/twilio-ruby/rest/api/v2010/account/call/feedback.rb +13 -13
  28. data/lib/twilio-ruby/rest/api/v2010/account/call/feedback_summary.rb +8 -8
  29. data/lib/twilio-ruby/rest/api/v2010/account/call/notification.rb +23 -10
  30. data/lib/twilio-ruby/rest/api/v2010/account/call/recording.rb +23 -10
  31. data/lib/twilio-ruby/rest/api/v2010/account/conference.rb +27 -14
  32. data/lib/twilio-ruby/rest/api/v2010/account/conference/participant.rb +32 -19
  33. data/lib/twilio-ruby/rest/api/v2010/account/connect_app.rb +25 -12
  34. data/lib/twilio-ruby/rest/api/v2010/account/incoming_phone_number.rb +32 -19
  35. data/lib/twilio-ruby/rest/api/v2010/account/incoming_phone_number/assigned_add_on.rb +24 -11
  36. data/lib/twilio-ruby/rest/api/v2010/account/incoming_phone_number/assigned_add_on/assigned_add_on_extension.rb +20 -7
  37. data/lib/twilio-ruby/rest/api/v2010/account/incoming_phone_number/local.rb +24 -11
  38. data/lib/twilio-ruby/rest/api/v2010/account/incoming_phone_number/mobile.rb +24 -11
  39. data/lib/twilio-ruby/rest/api/v2010/account/incoming_phone_number/toll_free.rb +24 -11
  40. data/lib/twilio-ruby/rest/api/v2010/account/key.rb +26 -13
  41. data/lib/twilio-ruby/rest/api/v2010/account/message.rb +30 -17
  42. data/lib/twilio-ruby/rest/api/v2010/account/message/feedback.rb +5 -5
  43. data/lib/twilio-ruby/rest/api/v2010/account/message/media.rb +23 -10
  44. data/lib/twilio-ruby/rest/api/v2010/account/new_key.rb +5 -5
  45. data/lib/twilio-ruby/rest/api/v2010/account/new_signing_key.rb +5 -5
  46. data/lib/twilio-ruby/rest/api/v2010/account/notification.rb +23 -10
  47. data/lib/twilio-ruby/rest/api/v2010/account/outgoing_caller_id.rb +28 -15
  48. data/lib/twilio-ruby/rest/api/v2010/account/queue.rb +30 -17
  49. data/lib/twilio-ruby/rest/api/v2010/account/queue/member.rb +23 -10
  50. data/lib/twilio-ruby/rest/api/v2010/account/recording.rb +23 -10
  51. data/lib/twilio-ruby/rest/api/v2010/account/recording/add_on_result.rb +21 -8
  52. data/lib/twilio-ruby/rest/api/v2010/account/recording/add_on_result/payload.rb +21 -8
  53. data/lib/twilio-ruby/rest/api/v2010/account/recording/transcription.rb +21 -8
  54. data/lib/twilio-ruby/rest/api/v2010/account/short_code.rb +27 -14
  55. data/lib/twilio-ruby/rest/api/v2010/account/signing_key.rb +26 -13
  56. data/lib/twilio-ruby/rest/api/v2010/account/sip.rb +1 -1
  57. data/lib/twilio-ruby/rest/api/v2010/account/sip/credential_list.rb +27 -14
  58. data/lib/twilio-ruby/rest/api/v2010/account/sip/credential_list/credential.rb +29 -16
  59. data/lib/twilio-ruby/rest/api/v2010/account/sip/domain.rb +30 -17
  60. data/lib/twilio-ruby/rest/api/v2010/account/sip/domain/credential_list_mapping.rb +24 -11
  61. data/lib/twilio-ruby/rest/api/v2010/account/sip/domain/ip_access_control_list_mapping.rb +24 -11
  62. data/lib/twilio-ruby/rest/api/v2010/account/sip/ip_access_control_list.rb +27 -14
  63. data/lib/twilio-ruby/rest/api/v2010/account/sip/ip_access_control_list/ip_address.rb +29 -16
  64. data/lib/twilio-ruby/rest/api/v2010/account/token.rb +5 -5
  65. data/lib/twilio-ruby/rest/api/v2010/account/transcription.rb +21 -8
  66. data/lib/twilio-ruby/rest/api/v2010/account/usage.rb +1 -1
  67. data/lib/twilio-ruby/rest/api/v2010/account/usage/record.rb +20 -7
  68. data/lib/twilio-ruby/rest/api/v2010/account/usage/record/all_time.rb +20 -7
  69. data/lib/twilio-ruby/rest/api/v2010/account/usage/record/daily.rb +20 -7
  70. data/lib/twilio-ruby/rest/api/v2010/account/usage/record/last_month.rb +20 -7
  71. data/lib/twilio-ruby/rest/api/v2010/account/usage/record/monthly.rb +20 -7
  72. data/lib/twilio-ruby/rest/api/v2010/account/usage/record/this_month.rb +20 -7
  73. data/lib/twilio-ruby/rest/api/v2010/account/usage/record/today.rb +20 -7
  74. data/lib/twilio-ruby/rest/api/v2010/account/usage/record/yearly.rb +20 -7
  75. data/lib/twilio-ruby/rest/api/v2010/account/usage/record/yesterday.rb +20 -7
  76. data/lib/twilio-ruby/rest/api/v2010/account/usage/trigger.rb +32 -19
  77. data/lib/twilio-ruby/rest/api/v2010/account/validation_request.rb +5 -5
  78. data/lib/twilio-ruby/rest/chat.rb +4 -4
  79. data/lib/twilio-ruby/rest/chat/v1/credential.rb +30 -17
  80. data/lib/twilio-ruby/rest/chat/v1/service.rb +29 -16
  81. data/lib/twilio-ruby/rest/chat/v1/service/channel.rb +32 -19
  82. data/lib/twilio-ruby/rest/chat/v1/service/channel/invite.rb +27 -14
  83. data/lib/twilio-ruby/rest/chat/v1/service/channel/member.rb +32 -19
  84. data/lib/twilio-ruby/rest/chat/v1/service/channel/message.rb +32 -19
  85. data/lib/twilio-ruby/rest/chat/v1/service/role.rb +27 -14
  86. data/lib/twilio-ruby/rest/chat/v1/service/user.rb +30 -17
  87. data/lib/twilio-ruby/rest/chat/v1/service/user/user_channel.rb +18 -5
  88. data/lib/twilio-ruby/rest/chat/v2/credential.rb +30 -17
  89. data/lib/twilio-ruby/rest/chat/v2/service.rb +29 -16
  90. data/lib/twilio-ruby/rest/chat/v2/service/channel.rb +32 -19
  91. data/lib/twilio-ruby/rest/chat/v2/service/channel/invite.rb +27 -14
  92. data/lib/twilio-ruby/rest/chat/v2/service/channel/member.rb +32 -19
  93. data/lib/twilio-ruby/rest/chat/v2/service/channel/message.rb +32 -19
  94. data/lib/twilio-ruby/rest/chat/v2/service/role.rb +27 -14
  95. data/lib/twilio-ruby/rest/chat/v2/service/user.rb +30 -17
  96. data/lib/twilio-ruby/rest/chat/v2/service/user/user_channel.rb +18 -5
  97. data/lib/twilio-ruby/rest/fax.rb +2 -2
  98. data/lib/twilio-ruby/rest/fax/v1/fax.rb +32 -19
  99. data/lib/twilio-ruby/rest/fax/v1/fax/fax_media.rb +21 -8
  100. data/lib/twilio-ruby/rest/ip_messaging.rb +4 -4
  101. data/lib/twilio-ruby/rest/ip_messaging/v1/credential.rb +30 -17
  102. data/lib/twilio-ruby/rest/ip_messaging/v1/service.rb +29 -16
  103. data/lib/twilio-ruby/rest/ip_messaging/v1/service/channel.rb +32 -19
  104. data/lib/twilio-ruby/rest/ip_messaging/v1/service/channel/invite.rb +27 -14
  105. data/lib/twilio-ruby/rest/ip_messaging/v1/service/channel/member.rb +32 -19
  106. data/lib/twilio-ruby/rest/ip_messaging/v1/service/channel/message.rb +32 -19
  107. data/lib/twilio-ruby/rest/ip_messaging/v1/service/role.rb +27 -14
  108. data/lib/twilio-ruby/rest/ip_messaging/v1/service/user.rb +30 -17
  109. data/lib/twilio-ruby/rest/ip_messaging/v1/service/user/user_channel.rb +18 -5
  110. data/lib/twilio-ruby/rest/ip_messaging/v2/credential.rb +30 -17
  111. data/lib/twilio-ruby/rest/ip_messaging/v2/service.rb +29 -16
  112. data/lib/twilio-ruby/rest/ip_messaging/v2/service/channel.rb +32 -19
  113. data/lib/twilio-ruby/rest/ip_messaging/v2/service/channel/invite.rb +27 -14
  114. data/lib/twilio-ruby/rest/ip_messaging/v2/service/channel/member.rb +32 -19
  115. data/lib/twilio-ruby/rest/ip_messaging/v2/service/channel/message.rb +32 -19
  116. data/lib/twilio-ruby/rest/ip_messaging/v2/service/role.rb +27 -14
  117. data/lib/twilio-ruby/rest/ip_messaging/v2/service/user.rb +30 -17
  118. data/lib/twilio-ruby/rest/ip_messaging/v2/service/user/user_channel.rb +18 -5
  119. data/lib/twilio-ruby/rest/lookups.rb +2 -2
  120. data/lib/twilio-ruby/rest/lookups/v1/phone_number.rb +6 -6
  121. data/lib/twilio-ruby/rest/messaging.rb +2 -2
  122. data/lib/twilio-ruby/rest/messaging/v1/service.rb +30 -17
  123. data/lib/twilio-ruby/rest/messaging/v1/service/alpha_sender.rb +24 -11
  124. data/lib/twilio-ruby/rest/messaging/v1/service/phone_number.rb +24 -11
  125. data/lib/twilio-ruby/rest/messaging/v1/service/short_code.rb +24 -11
  126. data/lib/twilio-ruby/rest/monitor.rb +4 -4
  127. data/lib/twilio-ruby/rest/monitor/v1/alert.rb +23 -10
  128. data/lib/twilio-ruby/rest/monitor/v1/event.rb +22 -9
  129. data/lib/twilio-ruby/rest/notify.rb +4 -4
  130. data/lib/twilio-ruby/rest/notify/v1/credential.rb +30 -17
  131. data/lib/twilio-ruby/rest/notify/v1/service.rb +32 -19
  132. data/lib/twilio-ruby/rest/notify/v1/service/binding.rb +27 -14
  133. data/lib/twilio-ruby/rest/notify/v1/service/notification.rb +5 -5
  134. data/lib/twilio-ruby/rest/notify/v1/service/segment.rb +18 -5
  135. data/lib/twilio-ruby/rest/notify/v1/service/user.rb +27 -14
  136. data/lib/twilio-ruby/rest/notify/v1/service/user/segment_memberships.rb +7 -7
  137. data/lib/twilio-ruby/rest/notify/v1/service/user/user_binding.rb +27 -14
  138. data/lib/twilio-ruby/rest/preview.rb +18 -18
  139. data/lib/twilio-ruby/rest/preview/bulk_exports/export.rb +3 -3
  140. data/lib/twilio-ruby/rest/preview/bulk_exports/export/day.rb +18 -5
  141. data/lib/twilio-ruby/rest/preview/bulk_exports/export_configuration.rb +8 -8
  142. data/lib/twilio-ruby/rest/preview/hosted_numbers/hosted_number_order.rb +32 -19
  143. data/lib/twilio-ruby/rest/preview/marketplace/available_add_on.rb +20 -7
  144. data/lib/twilio-ruby/rest/preview/marketplace/available_add_on/available_add_on_extension.rb +20 -7
  145. data/lib/twilio-ruby/rest/preview/marketplace/installed_add_on.rb +30 -17
  146. data/lib/twilio-ruby/rest/preview/marketplace/installed_add_on/installed_add_on_extension.rb +23 -10
  147. data/lib/twilio-ruby/rest/preview/proxy/service.rb +30 -17
  148. data/lib/twilio-ruby/rest/preview/proxy/service/phone_number.rb +24 -11
  149. data/lib/twilio-ruby/rest/preview/proxy/service/session.rb +32 -19
  150. data/lib/twilio-ruby/rest/preview/proxy/service/session/interaction.rb +22 -9
  151. data/lib/twilio-ruby/rest/preview/proxy/service/session/participant.rb +32 -19
  152. data/lib/twilio-ruby/rest/preview/proxy/service/session/participant/message_interaction.rb +24 -11
  153. data/lib/twilio-ruby/rest/preview/proxy/service/short_code.rb +24 -11
  154. data/lib/twilio-ruby/rest/preview/sync/service.rb +30 -17
  155. data/lib/twilio-ruby/rest/preview/sync/service/document.rb +28 -15
  156. data/lib/twilio-ruby/rest/preview/sync/service/document/document_permission.rb +24 -11
  157. data/lib/twilio-ruby/rest/preview/sync/service/sync_list.rb +25 -12
  158. data/lib/twilio-ruby/rest/preview/sync/service/sync_list/sync_list_item.rb +29 -16
  159. data/lib/twilio-ruby/rest/preview/sync/service/sync_list/sync_list_permission.rb +24 -11
  160. data/lib/twilio-ruby/rest/preview/sync/service/sync_map.rb +25 -12
  161. data/lib/twilio-ruby/rest/preview/sync/service/sync_map/sync_map_item.rb +29 -16
  162. data/lib/twilio-ruby/rest/preview/sync/service/sync_map/sync_map_permission.rb +24 -11
  163. data/lib/twilio-ruby/rest/preview/wireless/command.rb +26 -13
  164. data/lib/twilio-ruby/rest/preview/wireless/rate_plan.rb +30 -17
  165. data/lib/twilio-ruby/rest/preview/wireless/sim.rb +28 -15
  166. data/lib/twilio-ruby/rest/preview/wireless/sim/usage.rb +6 -6
  167. data/lib/twilio-ruby/rest/pricing.rb +3 -3
  168. data/lib/twilio-ruby/rest/pricing/v1/messaging.rb +1 -1
  169. data/lib/twilio-ruby/rest/pricing/v1/messaging/country.rb +20 -7
  170. data/lib/twilio-ruby/rest/pricing/v1/phone_number.rb +1 -1
  171. data/lib/twilio-ruby/rest/pricing/v1/phone_number/country.rb +20 -7
  172. data/lib/twilio-ruby/rest/pricing/v1/voice.rb +1 -1
  173. data/lib/twilio-ruby/rest/pricing/v1/voice/country.rb +20 -7
  174. data/lib/twilio-ruby/rest/pricing/v1/voice/number.rb +3 -3
  175. data/lib/twilio-ruby/rest/sync.rb +2 -2
  176. data/lib/twilio-ruby/rest/sync/v1/service.rb +30 -17
  177. data/lib/twilio-ruby/rest/sync/v1/service/document.rb +28 -15
  178. data/lib/twilio-ruby/rest/sync/v1/service/document/document_permission.rb +24 -11
  179. data/lib/twilio-ruby/rest/sync/v1/service/sync_list.rb +25 -12
  180. data/lib/twilio-ruby/rest/sync/v1/service/sync_list/sync_list_item.rb +29 -16
  181. data/lib/twilio-ruby/rest/sync/v1/service/sync_list/sync_list_permission.rb +24 -11
  182. data/lib/twilio-ruby/rest/sync/v1/service/sync_map.rb +25 -12
  183. data/lib/twilio-ruby/rest/sync/v1/service/sync_map/sync_map_item.rb +29 -16
  184. data/lib/twilio-ruby/rest/sync/v1/service/sync_map/sync_map_permission.rb +24 -11
  185. data/lib/twilio-ruby/rest/taskrouter.rb +2 -2
  186. data/lib/twilio-ruby/rest/taskrouter/v1/workspace.rb +33 -20
  187. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/activity.rb +32 -19
  188. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/event.rb +22 -9
  189. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task.rb +32 -19
  190. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task/reservation.rb +27 -14
  191. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task_channel.rb +20 -7
  192. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task_queue.rb +33 -20
  193. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task_queue/task_queue_statistics.rb +6 -6
  194. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task_queue/task_queues_statistics.rb +20 -7
  195. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/worker.rb +33 -20
  196. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/worker/reservation.rb +27 -14
  197. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/worker/worker_channel.rb +25 -12
  198. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/worker/worker_statistics.rb +6 -6
  199. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/worker/workers_statistics.rb +6 -6
  200. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/workflow.rb +33 -20
  201. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/workflow/workflow_statistics.rb +6 -6
  202. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/workspace_statistics.rb +6 -6
  203. data/lib/twilio-ruby/rest/trunking.rb +2 -2
  204. data/lib/twilio-ruby/rest/trunking/v1/trunk.rb +30 -17
  205. data/lib/twilio-ruby/rest/trunking/v1/trunk/credential_list.rb +24 -11
  206. data/lib/twilio-ruby/rest/trunking/v1/trunk/ip_access_control_list.rb +24 -11
  207. data/lib/twilio-ruby/rest/trunking/v1/trunk/origination_url.rb +29 -16
  208. data/lib/twilio-ruby/rest/trunking/v1/trunk/phone_number.rb +24 -11
  209. data/lib/twilio-ruby/rest/video.rb +4 -4
  210. data/lib/twilio-ruby/rest/video/v1/recording.rb +23 -10
  211. data/lib/twilio-ruby/rest/video/v1/room.rb +29 -16
  212. data/lib/twilio-ruby/rest/video/v1/room/recording.rb +20 -7
  213. data/lib/twilio-ruby/rest/wireless.rb +6 -6
  214. data/lib/twilio-ruby/rest/wireless/v1/command.rb +26 -13
  215. data/lib/twilio-ruby/rest/wireless/v1/rate_plan.rb +30 -17
  216. data/lib/twilio-ruby/rest/wireless/v1/sim.rb +27 -14
  217. data/lib/twilio-ruby/rest/wireless/v1/sim/usage_record.rb +20 -7
  218. data/lib/twilio-ruby/twiml/messaging_response.rb +147 -0
  219. data/lib/twilio-ruby/twiml/twiml.rb +77 -0
  220. data/lib/twilio-ruby/twiml/voice_response.rb +925 -0
  221. data/lib/twilio-ruby/version.rb +1 -1
  222. data/spec/holodeck/hologram.rb +0 -1
  223. data/spec/jwt/access_token_spec.rb +126 -182
  224. data/spec/jwt/client_capability_spec.rb +104 -0
  225. data/spec/jwt/task_router_spec.rb +164 -97
  226. data/spec/twiml/messaging_response_spec.rb +62 -0
  227. data/spec/twiml/voice_response_spec.rb +452 -0
  228. data/twilio-ruby.gemspec +4 -2
  229. metadata +36 -23
  230. data/lib/twilio-ruby/compatibility/v2010/account/call/feedback.rb +0 -15
  231. data/lib/twilio-ruby/compatibility/v2010/account/queue/member.rb +0 -23
  232. data/lib/twilio-ruby/jwt/capability.rb +0 -64
  233. data/lib/twilio-ruby/twiml/response.rb +0 -16
  234. data/spec/jwt/capability_spec.rb +0 -186
  235. data/spec/jwt/task_router_taskqueue_spec.rb +0 -111
  236. data/spec/jwt/task_router_worker_spec.rb +0 -146
  237. data/spec/jwt/task_router_workspace_spec.rb +0 -110
  238. data/spec/twiml/twiml_response_spec.rb +0 -47
@@ -0,0 +1,98 @@
1
+ module Twilio
2
+ module JWT
3
+ class ClientCapability < BaseJWT
4
+ attr_accessor :account_sid,
5
+ :auth_token,
6
+ :client_name,
7
+ :scopes
8
+
9
+ def initialize(account_sid, auth_token, scopes: [], nbf: nil, ttl: 3600, valid_until: nil)
10
+ super(secret_key: auth_token, issuer: account_sid, nbf: nbf, ttl: ttl, valid_until: valid_until)
11
+ @account_sid = account_sid
12
+ @auth_token = auth_token
13
+ @client_name = nil
14
+ @scopes = scopes
15
+ end
16
+
17
+ def add_scope(scope)
18
+ @scopes.push(scope)
19
+ end
20
+
21
+ def to_s
22
+ self.to_jwt
23
+ end
24
+
25
+ protected
26
+ def _generate_payload
27
+
28
+ scope = ''
29
+ unless @scopes.empty?
30
+ scope = @scopes.map {|scope| scope._generate_payload}.join(' ')
31
+ end
32
+
33
+ payload = {
34
+ scope: scope
35
+ }
36
+
37
+ payload
38
+ end
39
+ end
40
+
41
+ module Scope
42
+ def _generate_payload
43
+ raise 'Not Implemented'
44
+ end
45
+ end
46
+
47
+ class IncomingClientScope
48
+ include Scope
49
+
50
+ def initialize(client_name)
51
+ @client_name = client_name
52
+ end
53
+
54
+ def _generate_payload
55
+ "scope:client:incoming?clientName" + CGI.escape("=#{@client_name}")
56
+ end
57
+
58
+ end
59
+
60
+ class OutgoingClientScope
61
+ include Scope
62
+
63
+ def initialize(application_sid, client_name = nil, params = {})
64
+ @application_sid = application_sid
65
+ @client_name = client_name
66
+ @params = params
67
+ end
68
+
69
+ def _generate_payload
70
+ prefix = "scope:client:outgoing"
71
+ application_sid = "appSid=#{@application_sid}"
72
+ unless @client_name.nil?
73
+ client_name = "clientName=#{@client_name}"
74
+ end
75
+ unless @params.empty?
76
+ params = "appParams=" + @params.map {|k, v| "#{k}=#{v}"}.join('&')
77
+ end
78
+
79
+ suffix = CGI.escape([application_sid, client_name, params].compact.join('&'))
80
+
81
+ [prefix, suffix].join('?')
82
+ end
83
+ end
84
+
85
+ class EventStreamScope
86
+ include Scope
87
+
88
+ def initialize(filters = {})
89
+ @filters = filters
90
+ @filters[:path] = '/2010-04-01/Events'
91
+ end
92
+
93
+ def _generate_payload
94
+ "scope:stream:subscribe?" + CGI.escape(@filters.map {|k, v| "#{k}=#{v}"}.join('&'))
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,56 @@
1
+ module Twilio
2
+ module JWT
3
+ class BaseJWT
4
+ # valid_until overrides ttl if specified
5
+ def initialize(secret_key: nil, issuer: nil, subject: nil, nbf: nil, ttl: 3600, valid_until: nil)
6
+ if secret_key.nil?
7
+ raise ArgumentError, 'JWT does not have a signing key'
8
+ end
9
+
10
+ @secret_key = secret_key
11
+ @issuer = issuer
12
+ @subject = subject
13
+ @algorithm = 'HS256'
14
+ @nbf = nbf
15
+ @ttl = ttl
16
+ @valid_until = valid_until
17
+ end
18
+
19
+ def _generate_headers
20
+ {}
21
+ end
22
+
23
+ def _generate_payload
24
+ fail NotImplementedError
25
+ end
26
+
27
+ def headers
28
+ headers = self._generate_headers.clone()
29
+ headers[:typ] = 'JWT'
30
+ headers[:alg] = @algorithm
31
+ headers
32
+ end
33
+
34
+ def payload
35
+ payload = self._generate_payload.clone()
36
+
37
+ payload[:iss] = @issuer
38
+ payload[:nbf] = @nbf || Time.now.to_i
39
+
40
+ if @valid_until.nil?
41
+ payload[:exp] = Time.now.to_i + @ttl
42
+ else
43
+ payload[:exp] = @valid_until
44
+ end
45
+
46
+ payload[:sub] = @subject unless @subject.nil?
47
+ payload
48
+ end
49
+
50
+ def to_jwt
51
+ ::JWT.encode self.payload, @secret_key, @algorithm, self.headers
52
+ end
53
+
54
+ end
55
+ end
56
+ end
@@ -1,202 +1,171 @@
1
1
  module Twilio
2
2
  module JWT
3
- class TaskRouterCapability
4
- TASK_ROUTER_BASE_URL = 'https://taskrouter.twilio.com'
3
+ class TaskRouterCapability < BaseJWT
5
4
  TASK_ROUTER_VERSION = 'v1'
6
- TASK_ROUTER_WEBSOCKET_BASE_URL = 'https://event-bridge.twilio.com/v1/wschannels'
7
-
8
- REQUIRED = {required: true}
9
- OPTIONAL = {required: false}
10
-
11
- def initialize(account_sid, auth_token, workspace_sid, channel_id)
5
+ def initialize(account_sid, auth_token, workspace_sid, channel_id, nbf: nil, ttl: 3600, valid_until: nil)
6
+ super(secret_key: auth_token,
7
+ issuer: account_sid,
8
+ nbf: nbf,
9
+ ttl: ttl,
10
+ valid_until: valid_until
11
+ )
12
12
  @account_sid = account_sid
13
13
  @auth_token = auth_token
14
- @policies = []
15
-
16
14
  @workspace_sid = workspace_sid
17
15
  @channel_id = channel_id
18
-
19
- @base_url = "#{TASK_ROUTER_BASE_URL}/#{TASK_ROUTER_VERSION}/Workspaces/#{workspace_sid}"
20
-
21
- validate_jwt
22
-
23
- setup_resource
24
-
25
- allow_websocket_requests(@channel_id)
26
- allow(@resource_url, 'GET')
27
- end
28
-
29
- def allow_fetch_subresources
30
- allow(@resource_url + '/**', 'GET')
31
- end
32
-
33
- def allow_updates
34
- allow(@resource_url, 'POST')
35
- end
36
-
37
- def allow_updates_subresources
38
- allow(@resource_url + '/**', 'POST')
39
- end
40
-
41
- def allow_delete
42
- allow(@resource_url, 'DELETE')
43
- end
44
-
45
- def allow_delete_subresources
46
- allow(@resource_url + '/**', 'DELETE')
16
+ @policies = []
47
17
  end
48
18
 
49
- def add_policy(url, method, allowed = true, query_filters = nil, post_filters = nil)
50
- policy = {
51
- url: url,
52
- method: method,
53
- query_filter: query_filters || {},
54
- post_filter: post_filters || {},
55
- allow: allowed
56
- }
57
-
19
+ def add_policy(policy)
58
20
  @policies.push(policy)
59
21
  end
60
22
 
61
- def allow(url, method, query_filters = nil, post_filters = nil)
62
- add_policy(url, method, true, query_filters, post_filters)
23
+ def to_s
24
+ to_jwt
63
25
  end
64
26
 
65
- def deny(url, method, query_filters = nil, post_filters = nil)
66
- add_policy(url, method, false, query_filters, post_filters)
67
- end
27
+ protected
28
+ def _generate_payload
29
+ Twilio::JWT::TaskRouterUtils.web_socket_policies(@account_sid, @channel_id).each {|policy| self.add_policy(policy)}
30
+ policies = @policies.map{ |policy| policy._generate_payload}
68
31
 
69
- def generate_token(ttl = 3600)
70
- task_router_attributes = {
32
+ payload = {
71
33
  account_sid: @account_sid,
72
34
  workspace_sid: @workspace_sid,
73
- channel: @channel_id
35
+ channel: @channel_id,
36
+ version: TASK_ROUTER_VERSION,
37
+ friendly_name: @channel_id,
38
+ policies: policies
74
39
  }
75
40
 
76
41
  if @channel_id[0..1] == 'WK'
77
- task_router_attributes[:worker_sid] = @channel_id
42
+ payload[:worker_sid] = @channel_id
78
43
  elsif @channel_id[0..1] == 'WQ'
79
- task_router_attributes[:taskqueue_sid] = @channel_id
44
+ payload[:taskqueue_sid] = @channel_id
80
45
  end
81
46
 
82
- generate_token_protected(ttl, task_router_attributes)
47
+ payload
83
48
  end
49
+ end
84
50
 
85
- protected
51
+ class Policy
52
+ attr_accessor :url,
53
+ :method,
54
+ :allowed,
55
+ :post_filters,
56
+ :query_filters
86
57
 
87
- def generate_token_protected(ttl = 3600, extra_attributes)
88
- payload = {
89
- iss: @account_sid,
90
- exp: (Time.now.to_i + ttl),
91
- version: TASK_ROUTER_VERSION,
92
- friendly_name: @channel_id,
93
- policies: @policies,
94
- }
95
- extra_attributes.each { |key, value|
96
- payload[key] = value
97
- }
98
-
99
- ::JWT.encode payload, @auth_token
58
+ def initialize(url, method, allowed, post_filters={}, query_filters={})
59
+ @url = url
60
+ @method = method
61
+ @allowed = allowed
62
+ @post_filters = post_filters
63
+ @query_filters = query_filters
100
64
  end
101
65
 
102
- def setup_resource
103
- if @channel_id[0..1] == 'WS'
104
- @resource_url = @base_url
105
- elsif @channel_id[0..1] == 'WK'
106
- @resource_url = @base_url + '/Workers/' + @channel_id
107
-
108
- @activity_url = @base_url + '/Activities'
109
- allow(@activity_url, 'GET')
66
+ def _generate_payload
67
+ policy = {
68
+ url: @url,
69
+ method: @method,
70
+ query_filter: @query_filters,
71
+ post_filter: @post_filters,
72
+ allow: @allowed
73
+ }
74
+ policy
75
+ end
110
76
 
111
- @tasks_url = @base_url + '/Tasks/**'
112
- allow(@tasks_url, 'GET')
77
+ end
113
78
 
114
- @worker_reservations_url = @resource_url + '/Reservations/**'
115
- allow(@worker_reservations_url, 'GET')
79
+ class TaskRouterUtils
80
+ TASK_ROUTER_VERSION = 'v1'
81
+ TASK_ROUTER_BASE_URL = 'https://taskrouter.twilio.com'
82
+ TASK_ROUTER_WEBSOCKET_BASE_URL = 'https://event-bridge.twilio.com/v1/wschannels'
116
83
 
117
- elsif @channel_id[0..1] == 'WQ'
118
- @resource_url = @base_url + '/TaskQueues/' + @channel_id
119
- end
84
+ def self.workspaces
85
+ [TASK_ROUTER_BASE_URL, TASK_ROUTER_VERSION, 'Workspaces'].join('/')
120
86
  end
121
87
 
122
- def allow_websocket_requests(channel_id)
123
- worker_url = "#{TASK_ROUTER_WEBSOCKET_BASE_URL}/#{@account_sid}/#{channel_id}"
124
- ['GET', 'POST'].each do |meth|
125
- add_policy(worker_url, meth)
126
- end
88
+ def self.workspace(worskspace_sid)
89
+ [TASK_ROUTER_BASE_URL, TASK_ROUTER_VERSION, 'Workspaces', worskspace_sid].join('/')
127
90
  end
128
91
 
129
- def validate_jwt
130
- if @account_sid.nil? or @account_sid[0..1] != 'AC'
131
- raise "Invalid AccountSid provided #{@account_sid}"
132
- end
133
- if @workspace_sid.nil? or @workspace_sid[0..1] != 'WS'
134
- raise "Invalid WorkspaceSid provided #{@workspace_sid}"
135
- end
136
- if @channel_id.nil?
137
- raise 'ChannelId not provided'
138
- end
139
- @prefix = @channel_id[0..1]
140
- if @prefix != 'WS' and @prefix != 'WK' and @prefix != 'WQ'
141
- raise "Invalid ChannelId provided: #{@channel_id}"
142
- end
92
+ def self.all_workspaces
93
+ [TASK_ROUTER_BASE_URL, TASK_ROUTER_VERSION, 'Workspaces', '**'].join('/')
143
94
  end
144
- end
145
95
 
146
- class WorkerCapability < TaskRouterCapability
96
+ def self.tasks(workspace_sid)
97
+ [self.workspace(workspace_sid), 'Tasks'].join('/')
98
+ end
147
99
 
148
- def initialize(account_sid, auth_token, workspace_sid, worker_sid)
149
- super(account_sid, auth_token, workspace_sid, worker_sid)
150
- @tasks_url = @base_url + '/Tasks/**'
151
- @activity_url = @base_url + '/Activities'
152
- @worker_reservations_url = @resource_url + '/Reservations/**'
100
+ def self.task(workspace_sid, tasks_sid)
101
+ [self.workspace(workspace_sid), 'Tasks', tasks_sid].join('/')
102
+ end
153
103
 
154
- allow(@activity_url, 'GET')
155
- allow(@tasks_url, 'GET')
156
- allow(@worker_reservations_url, 'GET')
104
+ def self.all_tasks(workspace_sid)
105
+ [self.workspace(workspace_sid), 'Tasks', '**'].join('/')
157
106
  end
158
107
 
159
- def allow_activity_updates
160
- allow(@resource_url, 'POST', nil, {ActivitySid: REQUIRED})
108
+ def self.task_queues(workspace_sid)
109
+ [self.workspace(workspace_sid), 'TaskQueues'].join('/')
161
110
  end
162
111
 
163
- def allow_reservation_updates
164
- allow(@tasks_url, 'POST', nil, nil)
165
- allow(@worker_reservations_url, 'POST', nil, nil)
112
+ def self.task_queue(workspace_sid, taskqueue_sid)
113
+ [self.workspace(workspace_sid), 'TaskQueues', taskqueue_sid].join('/')
166
114
  end
167
115
 
168
- protected
116
+ def self.all_task_queues(workspace_sid)
117
+ [self.workspace(workspace_sid), 'TaskQueues', '**'].join('/')
118
+ end
169
119
 
170
- def setup_resource
171
- @resource_url = @base_url + '/Workers/' + @channel_id
120
+ def self.activities(workspace_sid)
121
+ [self.workspace(workspace_sid), 'Activities'].join('/')
172
122
  end
173
123
 
174
- end
124
+ def self.activity(workspace_sid, activity_sid)
125
+ [self.workspace(workspace_sid), 'Activities', activity_sid].join('/')
126
+ end
175
127
 
176
- class WorkspaceCapability < TaskRouterCapability
128
+ def self.all_activities(workspace_sid)
129
+ [self.workspace(workspace_sid), 'Activities', '**'].join('/')
130
+ end
177
131
 
178
- def initialize(account_sid, auth_token, workspace_sid)
179
- super(account_sid, auth_token, workspace_sid, workspace_sid)
132
+ def self.workers(workspace_sid)
133
+ [self.workspace(workspace_sid), 'Workers'].join('/')
180
134
  end
181
135
 
182
- protected
136
+ def self.worker(workspace_sid, worker_sid)
137
+ [self.workspace(workspace_sid), 'Workers', worker_sid].join('/')
138
+ end
183
139
 
184
- def setup_resource
185
- @resource_url = @base_url
140
+ def self.all_workers(workspace_sid)
141
+ [self.workspace(workspace_sid), 'Workers', '**'].join('/')
186
142
  end
187
143
 
188
- end
144
+ def self.reservations(workspace_sid, worker_sid)
145
+ [self.worker(workspace_sid, worker_sid), 'Reservations'].join('/')
146
+ end
189
147
 
190
- class TaskQueueCapability < TaskRouterCapability
148
+ def self.reservation(workspace_sid, worker_sid, reservation_sid)
149
+ [self.worker(workspace_sid, worker_sid), 'Reservations', reservation_sid].join('/')
150
+ end
191
151
 
192
- def initialize(account_sid, auth_token, workspace_sid, taskqueue_sid)
193
- super(account_sid, auth_token, workspace_sid, taskqueue_sid)
152
+ def self.all_reservations(workspace_sid, worker_sid)
153
+ [self.worker(workspace_sid, worker_sid), 'Reservations', '**'].join('/')
194
154
  end
195
155
 
196
- protected
156
+ def self.web_socket_policies(account_sid, channel_sid)
157
+ url = [TASK_ROUTER_WEBSOCKET_BASE_URL, account_sid, channel_sid].join('/')
158
+ get = Policy.new(url, 'GET', true)
159
+ post = Policy.new(url, 'POST', true)
160
+ [get, post]
161
+ end
197
162
 
198
- def setup_resource
199
- @resource_url = @base_url + '/TaskQueues/' + @channel_id
163
+ def self.worker_policies(workspace_sid, worker_sid)
164
+ activities = Policy.new(self.activities(workspace_sid), 'GET', true)
165
+ tasks = Policy.new(self.all_tasks(workspace_sid), 'GET', true)
166
+ reservations = Policy.new(self.all_reservations(workspace_sid, worker_sid), 'GET', true)
167
+ fetch = Policy.new(self.worker(workspace_sid, worker_sid), 'GET', true)
168
+ [activities, tasks, reservations, fetch]
200
169
  end
201
170
  end
202
171
  end