vonage 7.24.0 → 8.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +87 -387
  3. data/lib/vonage/applications.rb +4 -12
  4. data/lib/vonage/client.rb +0 -51
  5. data/lib/vonage/client_error.rb +1 -1
  6. data/lib/vonage/config.rb +1 -9
  7. data/lib/vonage/conversations/events.rb +0 -12
  8. data/lib/vonage/conversations/legs.rb +0 -6
  9. data/lib/vonage/conversations/members.rb +0 -15
  10. data/lib/vonage/conversations/users.rb +0 -15
  11. data/lib/vonage/conversations.rb +0 -30
  12. data/lib/vonage/errors.rb +20 -37
  13. data/lib/vonage/gsm7.rb +1 -1
  14. data/lib/vonage/jwt.rb +0 -17
  15. data/lib/vonage/keys.rb +1 -8
  16. data/lib/vonage/logger.rb +3 -5
  17. data/lib/vonage/messaging/channels/viber.rb +1 -8
  18. data/lib/vonage/messaging/channels/whats_app.rb +1 -3
  19. data/lib/vonage/messaging.rb +3 -19
  20. data/lib/vonage/namespace.rb +60 -132
  21. data/lib/vonage/numbers.rb +6 -29
  22. data/lib/vonage/server_error.rb +1 -1
  23. data/lib/vonage/signature.rb +5 -5
  24. data/lib/vonage/sms.rb +20 -20
  25. data/lib/vonage/version.rb +1 -1
  26. data/lib/vonage/video/archives.rb +53 -18
  27. data/lib/vonage/video/list_response.rb +11 -0
  28. data/lib/vonage/video/moderation.rb +22 -7
  29. data/lib/vonage/video/signals.rb +9 -4
  30. data/lib/vonage/video/streams.rb +12 -6
  31. data/lib/vonage/video.rb +13 -50
  32. data/lib/vonage/voice/actions/connect.rb +3 -27
  33. data/lib/vonage/voice/actions/conversation.rb +2 -2
  34. data/lib/vonage/voice/actions/pay.rb +107 -0
  35. data/lib/vonage/voice/actions/talk.rb +2 -11
  36. data/lib/vonage/voice/talk.rb +1 -11
  37. data/lib/vonage/voice.rb +0 -22
  38. data/lib/vonage.rb +0 -2
  39. data/vonage.gemspec +1 -3
  40. metadata +9 -98
  41. data/lib/vonage/api_error.rb +0 -33
  42. data/lib/vonage/conversation/event/list_response.rb +0 -11
  43. data/lib/vonage/conversation/event.rb +0 -108
  44. data/lib/vonage/conversation/list_response.rb +0 -11
  45. data/lib/vonage/conversation/member/list_response.rb +0 -11
  46. data/lib/vonage/conversation/member.rb +0 -134
  47. data/lib/vonage/conversation/user/conversations_list_response.rb +0 -11
  48. data/lib/vonage/conversation/user/sessions_list_response.rb +0 -11
  49. data/lib/vonage/conversation/user.rb +0 -67
  50. data/lib/vonage/conversation.rb +0 -164
  51. data/lib/vonage/meetings/applications.rb +0 -25
  52. data/lib/vonage/meetings/dial_in_numbers/list_response.rb +0 -11
  53. data/lib/vonage/meetings/dial_in_numbers.rb +0 -23
  54. data/lib/vonage/meetings/recordings.rb +0 -36
  55. data/lib/vonage/meetings/rooms/list_response.rb +0 -11
  56. data/lib/vonage/meetings/rooms.rb +0 -155
  57. data/lib/vonage/meetings/sessions/list_response.rb +0 -11
  58. data/lib/vonage/meetings/sessions.rb +0 -28
  59. data/lib/vonage/meetings/themes/list_response.rb +0 -11
  60. data/lib/vonage/meetings/themes.rb +0 -218
  61. data/lib/vonage/meetings.rb +0 -38
  62. data/lib/vonage/number_insight_2.rb +0 -36
  63. data/lib/vonage/proactive_connect/events/list_response.rb +0 -11
  64. data/lib/vonage/proactive_connect/events.rb +0 -68
  65. data/lib/vonage/proactive_connect/item.rb +0 -104
  66. data/lib/vonage/proactive_connect/items/file_response.rb +0 -32
  67. data/lib/vonage/proactive_connect/items/list_response.rb +0 -11
  68. data/lib/vonage/proactive_connect/items.rb +0 -107
  69. data/lib/vonage/proactive_connect/list.rb +0 -168
  70. data/lib/vonage/proactive_connect/lists/list_response.rb +0 -11
  71. data/lib/vonage/proactive_connect/lists.rb +0 -35
  72. data/lib/vonage/proactive_connect.rb +0 -33
  73. data/lib/vonage/subaccounts/balance_transfers/list_response.rb +0 -11
  74. data/lib/vonage/subaccounts/credit_transfers/list_response.rb +0 -11
  75. data/lib/vonage/subaccounts/list_response.rb +0 -15
  76. data/lib/vonage/subaccounts.rb +0 -203
  77. data/lib/vonage/users/list_response.rb +0 -11
  78. data/lib/vonage/users.rb +0 -156
  79. data/lib/vonage/verify2/channels/email.rb +0 -36
  80. data/lib/vonage/verify2/channels/silent_auth.rb +0 -45
  81. data/lib/vonage/verify2/channels/sms.rb +0 -53
  82. data/lib/vonage/verify2/channels/voice.rb +0 -32
  83. data/lib/vonage/verify2/channels/whats_app.rb +0 -38
  84. data/lib/vonage/verify2/channels/whats_app_interactive.rb +0 -32
  85. data/lib/vonage/verify2/start_verification_options.rb +0 -62
  86. data/lib/vonage/verify2/workflow.rb +0 -39
  87. data/lib/vonage/verify2/workflow_builder.rb +0 -25
  88. data/lib/vonage/verify2.rb +0 -97
  89. data/lib/vonage/video/archives/list_response.rb +0 -11
  90. data/lib/vonage/video/broadcasts/list_response.rb +0 -11
  91. data/lib/vonage/video/broadcasts.rb +0 -75
  92. data/lib/vonage/video/captions.rb +0 -67
  93. data/lib/vonage/video/renders/list_response.rb +0 -11
  94. data/lib/vonage/video/renders.rb +0 -107
  95. data/lib/vonage/video/sip.rb +0 -48
  96. data/lib/vonage/video/streams/list_response.rb +0 -11
  97. data/lib/vonage/video/web_socket.rb +0 -61
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Vonage
4
4
  class Messaging::Channels::Viber < Messaging::Message
5
- MESSAGE_TYPES = ['text', 'image', 'video', 'file']
5
+ MESSAGE_TYPES = ['text', 'image']
6
6
 
7
7
  attr_reader :data
8
8
 
@@ -33,13 +33,6 @@ module Vonage
33
33
  when 'image'
34
34
  raise Vonage::ClientError.new(":message must be a Hash") unless message.is_a? Hash
35
35
  raise Vonage::ClientError.new(":url is required in :message") unless message[:url]
36
- when 'video'
37
- raise Vonage::ClientError.new(":message must be a Hash") unless message.is_a? Hash
38
- raise Vonage::ClientError.new(":url is required in :message") unless message[:url]
39
- raise Vonage::ClientError.new(":thumb_url is required in :message") unless message[:thumb_url]
40
- when 'file'
41
- raise Vonage::ClientError.new(":message must be a Hash") unless message.is_a? Hash
42
- raise Vonage::ClientError.new(":url is required in :message") unless message[:url]
43
36
  end
44
37
  end
45
38
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Vonage
4
4
  class Messaging::Channels::WhatsApp < Messaging::Message
5
- MESSAGE_TYPES = ['text', 'image', 'audio', 'video', 'file', 'template', 'sticker', 'custom']
5
+ MESSAGE_TYPES = ['text', 'image', 'audio', 'video', 'file', 'template', 'custom']
6
6
 
7
7
  attr_reader :data
8
8
 
@@ -35,8 +35,6 @@ module Vonage
35
35
  raise Vonage::ClientError.new(":name is required in :template") unless message[:name]
36
36
  raise Vonage::ClientError.new(":whatsapp is required in :opts") unless opts[:whatsapp]
37
37
  raise Vonage::ClientError.new(":locale is required in :whatsapp") unless opts[:whatsapp][:locale]
38
- when 'sticker'
39
- raise Vonage::ClientError.new(":message must contain either :id or :url") unless message.has_key?(:id) ^ message.has_key?(:url)
40
38
  when 'custom'
41
39
  raise Vonage::ClientError.new(":message must be a Hash") unless message.is_a? Hash
42
40
  else
@@ -1,21 +1,16 @@
1
1
  # typed: true
2
2
  # frozen_string_literal: true
3
- require 'forwardable'
4
3
 
5
4
  module Vonage
6
5
  class Messaging < Namespace
7
- extend Forwardable
8
-
9
6
  self.authentication = BearerToken
10
7
 
11
8
  self.request_body = JSON
12
9
 
13
- def_delegators Message, *Message::CHANNELS.keys
14
-
15
10
  # Send a Message.
16
11
  #
17
12
  # @example
18
- # message = client.messaging.sms(message: "Hello world!")
13
+ # message = Vonage::Messaging::Message.sms(message: "Hello world!")
19
14
  # response = client.messaging.send(to: "447700900000", from: "447700900001", **message)
20
15
  #
21
16
  # @option params [required, String] :to
@@ -27,19 +22,8 @@ module Vonage
27
22
  #
28
23
  # @see https://developer.vonage.com/api/messages-olympus#SendMessage
29
24
  #
30
- def send(to:, from:, **message)
31
- request('/v1/messages', params: {to: to, from: from, **message}, type: Post)
32
- end
33
-
34
- # Validate a JSON Web Token from a Messages API Webhook.
35
- #
36
- # @param [String, required] :token The JWT from the Webhook's Authorization header
37
- # @param [String, optional] :signature_secret The account signature secret. Required, unless `signature_secret`
38
- # is set in `Config`
39
- #
40
- # @return [Boolean] true, if the JWT is verified, false otherwise
41
- def verify_webhook_token(token:, signature_secret: @config.signature_secret)
42
- JWT.verify_hs256_signature(token: token, signature_secret: signature_secret)
25
+ def send(params)
26
+ request('/v1/messages', params: params, type: Post)
43
27
  end
44
28
  end
45
29
  end
@@ -1,9 +1,6 @@
1
1
  # typed: true
2
2
  # frozen_string_literal: true
3
-
4
3
  require 'net/http'
5
- require 'net/http/persistent'
6
- require 'net/http/post/multipart'
7
4
  require 'json'
8
5
 
9
6
  module Vonage
@@ -13,7 +10,8 @@ module Vonage
13
10
 
14
11
  @host = set_host
15
12
 
16
- @http = Net::HTTP::Persistent.new
13
+ @http = Net::HTTP.new(@host, Net::HTTP.https_default_port, p_addr = nil)
14
+ @http.use_ssl = true
17
15
 
18
16
  @config.http.set(@http) unless @config.http.nil?
19
17
  end
@@ -23,7 +21,8 @@ module Vonage
23
21
  end
24
22
 
25
23
  def self.host=(host)
26
- raise ArgumentError unless %i[rest_host video_host vonage_host].include?(host)
24
+ raise ArgumentError unless host == :rest_host || host == :video_host
25
+
27
26
  @host = host
28
27
  end
29
28
 
@@ -48,7 +47,6 @@ module Vonage
48
47
  end
49
48
 
50
49
  protected
51
-
52
50
  # :nocov:
53
51
 
54
52
  Get = Net::HTTP::Get
@@ -61,7 +59,7 @@ module Vonage
61
59
  authentication = self.class.authentication.new(@config)
62
60
  authentication.update(params)
63
61
 
64
- uri = URI("https://" + @host + path)
62
+ uri = URI('https://' + @host + path)
65
63
  unless type.const_get(:REQUEST_HAS_BODY) || params.empty?
66
64
  uri.query = Params.encode(params)
67
65
  end
@@ -73,20 +71,17 @@ module Vonage
73
71
  request = type.new(uri)
74
72
 
75
73
  # set headers
76
- request["User-Agent"] = UserAgent.string(
77
- @config.app_name,
78
- @config.app_version
79
- )
80
- request["Accept"] = "application/json"
81
- self.class.request_headers.each { |key, value| request[key] = value }
74
+ request['User-Agent'] = UserAgent.string(@config.app_name, @config.app_version)
75
+ request['Accept'] = 'application/json'
76
+ self.class.request_headers.each do |key, value|
77
+ request[key] = value
78
+ end
82
79
 
83
80
  # Set BearerToken if needed
84
81
  authentication.update(request)
85
82
 
86
83
  # set body
87
- if type.const_get(:REQUEST_HAS_BODY)
88
- self.class.request_body.update(request, params)
89
- end
84
+ self.class.request_body.update(request, params) if type.const_get(:REQUEST_HAS_BODY)
90
85
 
91
86
  request
92
87
  end
@@ -94,8 +89,7 @@ module Vonage
94
89
  def make_request!(request, &block)
95
90
  logger.log_request_info(request)
96
91
 
97
- uri = URI("https://" + @host + request.path)
98
- response = @http.request(uri, request, &block)
92
+ response = @http.request(request, &block)
99
93
 
100
94
  logger.log_response_info(response, @host)
101
95
 
@@ -107,31 +101,16 @@ module Vonage
107
101
  end
108
102
 
109
103
  def request(path, params: nil, type: Get, response_class: Response, &block)
110
- auto_advance =
111
- (
112
- if !params.nil? && params.key?(:auto_advance)
113
- params[:auto_advance]
114
- else
115
- false
116
- end
117
- )
118
-
119
- params =
120
- params.tap { |params| params.delete(:auto_advance) } if !params.nil? &&
121
- params.key?(:auto_advance)
104
+ auto_advance = !params.nil? && params.key?(:auto_advance) ? params[:auto_advance] : false
105
+
106
+ params = params.tap { |params| params.delete(:auto_advance) } if !params.nil? && params.key?(:auto_advance)
122
107
 
123
108
  request = build_request(path: path, params: params || {}, type: type)
124
109
 
125
110
  response = make_request!(request, &block)
126
111
 
127
112
  if auto_advance
128
- iterable_request(
129
- path,
130
- response: response,
131
- response_class: response_class,
132
- params: params,
133
- &block
134
- )
113
+ iterable_request(path, response: response, response_class: response_class, params: params, &block)
135
114
  else
136
115
  return if block
137
116
 
@@ -139,59 +118,22 @@ module Vonage
139
118
  end
140
119
  end
141
120
 
142
- def multipart_post_request(path, filepath:, file_name:, mime_type:, params: {}, override_uri: nil, no_auth: false, response_class: Response, &block)
143
- authentication = self.class.authentication.new(@config) unless no_auth
144
-
145
- uri = override_uri ? URI(override_uri) : URI('https://' + @host + path)
146
-
147
- http = Net::HTTP.new(uri.host, Net::HTTP.https_default_port, p_addr = nil)
148
- http.use_ssl = true
149
- http.set_debug_output($stdout)
150
-
151
- response = File.open(filepath) do |file|
152
- request = Net::HTTP::Post::Multipart.new(
153
- uri,
154
- params.merge(file: Multipart::Post::UploadIO.new(file, mime_type, file_name))
155
- )
156
-
157
- request['User-Agent'] = UserAgent.string(@config.app_name, @config.app_version)
158
-
159
- # Set BearerToken if needed
160
- authentication.update(request) unless no_auth
161
-
162
- logger.log_request_info(request)
163
-
164
- http.request(request, &block)
165
- end
166
-
167
- logger.log_response_info(response, @host)
168
-
169
- return if block
170
-
171
- logger.debug(response.body) if response.body
172
-
173
- parse(response, response_class)
174
- end
175
-
176
121
  def iterable_request(path, response: nil, response_class: nil, params: {}, &block)
177
122
  json_response = ::JSON.parse(response.body)
178
123
  response = parse(response, response_class)
179
124
  remainder = remaining_count(json_response)
180
125
 
181
126
  while remainder > 0
182
- params = { page_size: json_response["page_size"] }
183
-
184
- if json_response["record_index"] && json_response["record_index"] == 0
185
- params[:record_index] = json_response["page_size"]
186
- elsif json_response["record_index"] &&
187
- json_response["record_index"] != 0
188
- params[:record_index] = (
189
- json_response["record_index"] + json_response["page_size"]
190
- )
127
+ params = { page_size: json_response['page_size'] }
128
+
129
+ if json_response['record_index'] && json_response['record_index'] == 0
130
+ params[:record_index] = json_response['page_size']
131
+ elsif json_response['record_index'] && json_response['record_index'] != 0
132
+ params[:record_index] = (json_response['record_index'] + json_response['page_size'])
191
133
  end
192
134
 
193
- if json_response["total_pages"]
194
- params[:page] = json_response["page"] + 1
135
+ if json_response['total_pages']
136
+ params[:page] = json_response['page'] + 1
195
137
  end
196
138
 
197
139
  request = build_request(path: path, type: Get, params: params)
@@ -202,15 +144,11 @@ module Vonage
202
144
  json_response = ::JSON.parse(paginated_response.body)
203
145
  remainder = remaining_count(json_response)
204
146
 
205
- if response.respond_to?("_embedded")
206
- collection_name = collection_name(response["_embedded"])
207
- response["_embedded"][collection_name].push(
208
- *next_response["_embedded"][collection_name]
209
- )
147
+ if response.respond_to?('_embedded')
148
+ collection_name = collection_name(response['_embedded'])
149
+ response['_embedded'][collection_name].push(*next_response['_embedded'][collection_name])
210
150
  else
211
- response[collection_name(response)].push(
212
- *next_response[collection_name(next_response)]
213
- )
151
+ response[collection_name(response)].push(*next_response[collection_name(next_response)])
214
152
  end
215
153
  end
216
154
 
@@ -218,51 +156,43 @@ module Vonage
218
156
  end
219
157
 
220
158
  def remaining_count(params)
221
- if params.key?("total_pages")
222
- params["total_pages"] - params["page"]
223
- elsif params.key?("count")
224
- params["count"] -
225
- (
226
- if params["record_index"] == 0
227
- params["page_size"]
228
- else
229
- (params["record_index"] + params["page_size"])
230
- end
231
- )
159
+ if params.key?('total_pages')
160
+ params['total_pages'] - params['page']
161
+ elsif params.key?('count')
162
+ params['count'] - (params['record_index'] == 0 ? params['page_size'] : (params['record_index'] + params['page_size']))
232
163
  else
233
164
  0
234
165
  end
235
166
  end
236
167
 
237
168
  def collection_name(params)
238
- @collection_name ||=
239
- case
240
- when params.respond_to?("calls")
241
- "calls"
242
- when params.respond_to?("users")
243
- "users"
244
- when params.respond_to?("legs")
245
- "legs"
246
- when params.respond_to?("data")
247
- "data"
248
- when params.respond_to?("conversations")
249
- "conversations"
250
- when params.respond_to?("applications")
251
- "applications"
252
- when params.respond_to?("records")
253
- "records"
254
- when params.respond_to?("reports")
255
- "reports"
256
- when params.respond_to?("networks")
257
- "networks"
258
- when params.respond_to?("countries")
259
- "countries"
260
- when params.respond_to?("media")
261
- "media"
262
- when params.respond_to?("numbers")
263
- "numbers"
264
- when params.respond_to?("events")
265
- "events"
169
+ @collection_name ||= case
170
+ when params.respond_to?('calls')
171
+ 'calls'
172
+ when params.respond_to?('users')
173
+ 'users'
174
+ when params.respond_to?('legs')
175
+ 'legs'
176
+ when params.respond_to?('data')
177
+ 'data'
178
+ when params.respond_to?('conversations')
179
+ 'conversations'
180
+ when params.respond_to?('applications')
181
+ 'applications'
182
+ when params.respond_to?('records')
183
+ 'records'
184
+ when params.respond_to?('reports')
185
+ 'reports'
186
+ when params.respond_to?('networks')
187
+ 'networks'
188
+ when params.respond_to?('countries')
189
+ 'countries'
190
+ when params.respond_to?('media')
191
+ 'media'
192
+ when params.respond_to?('numbers')
193
+ 'numbers'
194
+ when params.respond_to?('events')
195
+ 'events'
266
196
  else
267
197
  params.entity.attributes.keys[0].to_s
268
198
  end
@@ -273,7 +203,7 @@ module Vonage
273
203
  when Net::HTTPNoContent
274
204
  response_class.new(nil, response)
275
205
  when Net::HTTPSuccess
276
- if response['Content-Type'] && response['Content-Type'].split(';').first == 'application/json' && !response.body.empty?
206
+ if response['Content-Type'].split(';').first == 'application/json'
277
207
  entity = ::JSON.parse(response.body, object_class: Vonage::Entity)
278
208
 
279
209
  response_class.new(entity, response)
@@ -297,8 +227,6 @@ module Vonage
297
227
  @config.rest_host
298
228
  when :video_host
299
229
  @config.video_host
300
- when :vonage_host
301
- @config.vonage_host
302
230
  else
303
231
  @config.api_host
304
232
  end
@@ -5,8 +5,6 @@ module Vonage
5
5
  class Numbers < Namespace
6
6
  include Keys
7
7
 
8
- self.authentication = Basic
9
-
10
8
  self.host = :rest_host
11
9
 
12
10
  # Retrieve all the inbound numbers associated with your Vonage account.
@@ -54,7 +52,7 @@ module Vonage
54
52
  # @see https://developer.nexmo.com/api/developer/numbers#getOwnedNumbers
55
53
  #
56
54
  def list(params = nil)
57
- request("/account/numbers", params: params, response_class: ListResponse)
55
+ request('/account/numbers', params: params, response_class: ListResponse)
58
56
  end
59
57
 
60
58
  # Retrieve inbound numbers that are available for the specified country.
@@ -102,7 +100,7 @@ module Vonage
102
100
  # @see https://developer.nexmo.com/api/developer/numbers#getAvailableNumbers
103
101
  #
104
102
  def search(params)
105
- request("/number/search", params: params, response_class: ListResponse)
103
+ request('/number/search', params: params, response_class: ListResponse)
106
104
  end
107
105
 
108
106
  # Request to purchase a specific inbound number.
@@ -127,12 +125,7 @@ module Vonage
127
125
  # @see https://developer.nexmo.com/api/developer/numbers#buyANumber
128
126
  #
129
127
  def buy(params)
130
- request(
131
- "/number/buy",
132
- params: params,
133
- type: Post,
134
- response_class: Response
135
- )
128
+ request('/number/buy', params: params, type: Post, response_class: Response)
136
129
  end
137
130
 
138
131
  # Cancel your subscription for a specific inbound number.
@@ -157,12 +150,7 @@ module Vonage
157
150
  # @see https://developer.nexmo.com/api/developer/numbers#cancelANumber
158
151
  #
159
152
  def cancel(params)
160
- request(
161
- "/number/cancel",
162
- params: params,
163
- type: Post,
164
- response_class: Response
165
- )
153
+ request('/number/cancel', params: params, type: Post, response_class: Response)
166
154
  end
167
155
 
168
156
  # Change the behaviour of a number that you own.
@@ -210,25 +198,14 @@ module Vonage
210
198
  # @see https://developer.nexmo.com/api/developer/numbers#updateANumber
211
199
  #
212
200
  def update(params)
213
- request(
214
- "/number/update",
215
- params: camelcase(params),
216
- type: Post,
217
- response_class: Response
218
- )
201
+ request('/number/update', params: camelcase(params), type: Post, response_class: Response)
219
202
  end
220
203
 
221
204
  private
222
205
 
223
206
  # A specific implementation of iterable_request for Numbers, because the Numbers API
224
207
  # handles pagination differently to other Vonage APIs
225
- def iterable_request(
226
- path,
227
- response: nil,
228
- response_class: nil,
229
- params: {},
230
- &block
231
- )
208
+ def iterable_request(path, response: nil, response_class: nil, params: {}, &block)
232
209
  response = parse(response, response_class)
233
210
  params[:index] = 1 unless params.has_key?(:index)
234
211
  size = params.fetch(:size, 10)
@@ -1,6 +1,6 @@
1
1
  # typed: strong
2
2
 
3
3
  module Vonage
4
- class ServerError < APIError
4
+ class ServerError < Error
5
5
  end
6
6
  end
@@ -27,24 +27,24 @@ module Vonage
27
27
  #
28
28
  # @see https://developer.nexmo.com/concepts/guides/signing-messages
29
29
  #
30
- def check(params, signature_secret: @config.signature_secret, signature_method: @config.signature_method)
30
+ def check(params, signature_method: @config.signature_method)
31
31
  params = params.dup
32
32
 
33
33
  signature = params.delete('sig')
34
34
 
35
- ::JWT::JWA::Hmac::SecurityUtils.secure_compare(signature, digest(params, signature_secret, signature_method))
35
+ ::JWT::SecurityUtils.secure_compare(signature, digest(params, signature_method))
36
36
  end
37
37
 
38
38
  private
39
39
 
40
- def digest(params, signature_secret, signature_method)
40
+ def digest(params, signature_method)
41
41
  digest_string = params.sort.map { |k, v| "&#{k}=#{v.tr('&=', '_')}" }.join
42
42
 
43
43
  case signature_method
44
44
  when 'md5', 'sha1', 'sha256', 'sha512'
45
- OpenSSL::HMAC.hexdigest(signature_method, signature_secret, digest_string).upcase
45
+ OpenSSL::HMAC.hexdigest(signature_method, @config.signature_secret, digest_string).upcase
46
46
  when 'md5hash'
47
- Digest::MD5.hexdigest("#{digest_string}#{signature_secret}")
47
+ Digest::MD5.hexdigest("#{digest_string}#{@config.signature_secret}")
48
48
  else
49
49
  raise ArgumentError, "Unknown signature algorithm: #{signature_method}. Expected: md5hash, md5, sha1, sha256, or sha512."
50
50
  end
data/lib/vonage/sms.rb CHANGED
@@ -47,6 +47,14 @@ module Vonage
47
47
  # @option params [String] :type
48
48
  # The format of the message body.
49
49
  #
50
+ # @option params [String] :vcard
51
+ # A business card in [vCard format](https://en.wikipedia.org/wiki/VCard).
52
+ # Depends on **:type** option having the value `vcard`.
53
+ #
54
+ # @option params [String] :vcal
55
+ # A calendar event in [vCal format](https://en.wikipedia.org/wiki/VCal).
56
+ # Depends on **:type** option having the value `vcal`.
57
+ #
50
58
  # @option params [String] :body
51
59
  # Hex encoded binary data.
52
60
  # Depends on **:type** option having the value `binary`.
@@ -59,6 +67,18 @@ module Vonage
59
67
  # The value of the [protocol identifier](https://en.wikipedia.org/wiki/GSM_03.40#Protocol_Identifier) to use.
60
68
  # Ensure that the value is aligned with **:udh**.
61
69
  #
70
+ # @option params [String] :title
71
+ # The title for a wappush SMS.
72
+ # Depends on **:type** option having the value `wappush`.
73
+ #
74
+ # @option params [String] :url
75
+ # The URL of your website.
76
+ # Depends on **:type** option having the value `wappush`.
77
+ #
78
+ # @option params [String] :validity
79
+ # The availability for an SMS in milliseconds.
80
+ # Depends on **:type** option having the value `wappush`.
81
+ #
62
82
  # @option params [String] :client_ref
63
83
  # You can optionally include your own reference of up to 40 characters.
64
84
  #
@@ -91,31 +111,11 @@ module Vonage
91
111
  response
92
112
  end
93
113
 
94
- # Validate a Signature from an SMS API Webhook.
95
- #
96
- # @param [Hash, required] :webhook_params The parameters from the webhook request body
97
- # @param [String, optional] :signature_secret The account signature secret. Required, unless `signature_secret`
98
- # is set in `Config`
99
- # @param [String, optional] :signature_method The account signature method. Required, unless `signature_method`
100
- # is set in `Config`
101
- #
102
- # @return [Boolean] true, if the JWT is verified, false otherwise
103
- def verify_webhook_sig(webhook_params:, signature_secret: @config.signature_secret, signature_method: @config.signature_method)
104
- signature.check(webhook_params, signature_secret: signature_secret, signature_method: signature_method)
105
- end
106
-
107
114
  private
108
115
 
109
116
  sig { params(text: String).returns(T::Boolean) }
110
117
  def unicode?(text)
111
118
  !Vonage::GSM7.encoded?(text)
112
119
  end
113
-
114
- # @return [Signature]
115
- #
116
- sig { returns(T.nilable(Vonage::Signature)) }
117
- def signature
118
- @signature ||= T.let(Signature.new(@config), T.nilable(Vonage::Signature))
119
- end
120
120
  end
121
121
  end
@@ -1,5 +1,5 @@
1
1
  # typed: strong
2
2
 
3
3
  module Vonage
4
- VERSION = '7.24.0'
4
+ VERSION = '8.0.0.beta'
5
5
  end