nexmo 4.7.0 → 4.8.0
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/nexmo/client.rb +22 -24
- data/lib/nexmo/signature.rb +11 -1
- data/lib/nexmo/version.rb +1 -1
- data/nexmo.gemspec +2 -1
- data/spec/nexmo/client_spec.rb +21 -39
- data/spec/nexmo/jwt_spec.rb +1 -1
- metadata +16 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fc7d3219d5a4d8671e83fa33eb807e317778b479
|
4
|
+
data.tar.gz: 51cec360405377fca50f586cc5fc5fb375a23409
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 781a072b8c216d96d000aec974974f648ca5375899380279d4ac8ddb55ca5824df744b4bdf1e959d19919bfb00125159f69d0e558706c7d187badbce70df1bc1
|
7
|
+
data.tar.gz: e540e6124bb1d17c166ca0ddf2ab166083869f5330f1285fa42f21f85ad3df1a09ae3c0f146cb3b64ba8982d58f6e6dd208e6bff2ad5cb595d87815588f54d25
|
data/lib/nexmo/client.rb
CHANGED
@@ -6,9 +6,9 @@ module Nexmo
|
|
6
6
|
attr_accessor :key, :secret, :auth_token
|
7
7
|
|
8
8
|
def initialize(options = {})
|
9
|
-
@key = options.fetch(:key) { ENV
|
9
|
+
@key = options.fetch(:key) { ENV['NEXMO_API_KEY'] }
|
10
10
|
|
11
|
-
@secret = options.fetch(:secret) { ENV
|
11
|
+
@secret = options.fetch(:secret) { ENV['NEXMO_API_SECRET'] }
|
12
12
|
|
13
13
|
@signature_secret = options.fetch(:signature_secret) { ENV['NEXMO_SIGNATURE_SECRET'] }
|
14
14
|
|
@@ -20,8 +20,6 @@ module Nexmo
|
|
20
20
|
|
21
21
|
@api_host = options.fetch(:api_host) { 'api.nexmo.com' }
|
22
22
|
|
23
|
-
@sns_host = options.fetch(:sns_host) { 'sns.nexmo.com' }
|
24
|
-
|
25
23
|
@user_agent = "nexmo-ruby/#{VERSION} ruby/#{RUBY_VERSION}"
|
26
24
|
|
27
25
|
if options.key?(:app_name) && options.key?(:app_version)
|
@@ -101,14 +99,6 @@ module Nexmo
|
|
101
99
|
get(@host, '/search/messages', Hash === params ? params : {ids: Array(params)})
|
102
100
|
end
|
103
101
|
|
104
|
-
def send_ussd_push_message(params)
|
105
|
-
post(@host, '/ussd/json', params)
|
106
|
-
end
|
107
|
-
|
108
|
-
def send_ussd_prompt_message(params)
|
109
|
-
post(@host, '/ussd-prompt/json', params)
|
110
|
-
end
|
111
|
-
|
112
102
|
def send_2fa_message(params)
|
113
103
|
post(@host, '/sc/us/2fa/json', params)
|
114
104
|
end
|
@@ -129,14 +119,6 @@ module Nexmo
|
|
129
119
|
post(@host, '/sc/us/alert/opt-in/manage/json', params)
|
130
120
|
end
|
131
121
|
|
132
|
-
def sns_publish(message, params)
|
133
|
-
post(@sns_host, '/sns/json', {cmd: 'publish', message: message}.merge(params))
|
134
|
-
end
|
135
|
-
|
136
|
-
def sns_subscribe(recipient, params)
|
137
|
-
post(@sns_host, '/sns/json', {cmd: 'subscribe', to: recipient}.merge(params))
|
138
|
-
end
|
139
|
-
|
140
122
|
def initiate_call(params)
|
141
123
|
Kernel.warn "#{self.class}##{__method__} is deprecated (use the Voice API instead)."
|
142
124
|
|
@@ -280,7 +262,7 @@ module Nexmo
|
|
280
262
|
|
281
263
|
def get(host, request_uri, params = {})
|
282
264
|
uri = URI('https://' + host + request_uri)
|
283
|
-
uri.query = Params.encode(params.merge(
|
265
|
+
uri.query = Params.encode(params.merge(api_key_and_secret))
|
284
266
|
|
285
267
|
message = Net::HTTP::Get.new(uri.request_uri)
|
286
268
|
|
@@ -291,7 +273,7 @@ module Nexmo
|
|
291
273
|
uri = URI('https://' + host + request_uri)
|
292
274
|
|
293
275
|
message = Net::HTTP::Post.new(uri.request_uri)
|
294
|
-
message.form_data = params.merge(
|
276
|
+
message.form_data = params.merge(api_key_and_secret)
|
295
277
|
|
296
278
|
request(uri, message)
|
297
279
|
end
|
@@ -301,14 +283,14 @@ module Nexmo
|
|
301
283
|
|
302
284
|
message = Net::HTTP::Put.new(uri.request_uri)
|
303
285
|
message['Content-Type'] = 'application/json'
|
304
|
-
message.body = JSON.generate(params.merge(
|
286
|
+
message.body = JSON.generate(params.merge(api_key_and_secret))
|
305
287
|
|
306
288
|
request(uri, message)
|
307
289
|
end
|
308
290
|
|
309
291
|
def delete(host, request_uri)
|
310
292
|
uri = URI('https://' + host + request_uri)
|
311
|
-
uri.query = Params.encode(
|
293
|
+
uri.query = Params.encode(api_key_and_secret)
|
312
294
|
|
313
295
|
message = Net::HTTP::Delete.new(uri.request_uri)
|
314
296
|
|
@@ -366,6 +348,22 @@ module Nexmo
|
|
366
348
|
end
|
367
349
|
end
|
368
350
|
|
351
|
+
def api_key_and_secret
|
352
|
+
unless @key
|
353
|
+
raise AuthenticationError.new('No API key provided. ' \
|
354
|
+
'See https://developer.nexmo.com/concepts/guides/authentication for details, ' \
|
355
|
+
'or email support@nexmo.com if you have any questions.')
|
356
|
+
end
|
357
|
+
|
358
|
+
unless @secret
|
359
|
+
raise AuthenticationError.new('No API secret provided. ' \
|
360
|
+
'See https://developer.nexmo.com/concepts/guides/authentication for details, ' \
|
361
|
+
'or email support@nexmo.com if you have any questions.')
|
362
|
+
end
|
363
|
+
|
364
|
+
{api_key: @key, api_secret: @secret}
|
365
|
+
end
|
366
|
+
|
369
367
|
def generate_auth_token
|
370
368
|
unless @application_id
|
371
369
|
raise AuthenticationError.new('No application_id provided. ' \
|
data/lib/nexmo/signature.rb
CHANGED
@@ -8,11 +8,21 @@ module Nexmo
|
|
8
8
|
|
9
9
|
signature = params.delete('sig')
|
10
10
|
|
11
|
-
|
11
|
+
secure_compare(signature, digest(params, secret))
|
12
12
|
end
|
13
13
|
|
14
14
|
private
|
15
15
|
|
16
|
+
if defined?(::JWT::SecurityUtils) # ruby-jwt v2
|
17
|
+
def self.secure_compare(left, right)
|
18
|
+
::JWT::SecurityUtils.secure_compare(left, right)
|
19
|
+
end
|
20
|
+
else
|
21
|
+
def self.secure_compare(left, right)
|
22
|
+
::JWT.secure_compare(left, right)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
16
26
|
def self.digest(params, secret)
|
17
27
|
md5 = Digest::MD5.new
|
18
28
|
|
data/lib/nexmo/version.rb
CHANGED
data/nexmo.gemspec
CHANGED
@@ -12,14 +12,15 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.summary = 'This is the Ruby client library for Nexmo\'s API. To use it you\'ll need a Nexmo account. Sign up for free at https://www.nexmo.com'
|
13
13
|
s.files = Dir.glob('{lib,spec}/**/*') + %w(LICENSE.txt README.md nexmo.gemspec)
|
14
14
|
s.required_ruby_version = '>= 1.9.3'
|
15
|
-
s.add_dependency('jwt')
|
16
15
|
s.add_development_dependency('rake')
|
17
16
|
s.add_development_dependency('minitest', '~> 5.0')
|
18
17
|
|
19
18
|
if RUBY_VERSION == '1.9.3'
|
19
|
+
s.add_dependency('jwt', '< 2.0.0')
|
20
20
|
s.add_development_dependency('addressable', '< 2.5.0')
|
21
21
|
s.add_development_dependency('webmock', '~> 1.0')
|
22
22
|
else
|
23
|
+
s.add_dependency('jwt')
|
23
24
|
s.add_development_dependency('webmock', '~> 2.0')
|
24
25
|
end
|
25
26
|
|
data/spec/nexmo/client_spec.rb
CHANGED
@@ -16,8 +16,6 @@ describe 'Nexmo::Client' do
|
|
16
16
|
|
17
17
|
@api_base_url = 'https://api.nexmo.com'
|
18
18
|
|
19
|
-
@sns_base_url = 'https://sns.nexmo.com'
|
20
|
-
|
21
19
|
@response_body = {body: '{"key":"value"}', headers: {'Content-Type' => 'application/json;charset=utf-8'}}
|
22
20
|
|
23
21
|
@response_object = {'key' => 'value'}
|
@@ -187,22 +185,6 @@ describe 'Nexmo::Client' do
|
|
187
185
|
end
|
188
186
|
end
|
189
187
|
|
190
|
-
describe 'send_ussd_push_message method' do
|
191
|
-
it 'posts to the ussd resource and returns the response object' do
|
192
|
-
expect_post "#@base_url/ussd/json", "api_key=#@api_key&api_secret=#@api_secret&from=MyCompany20&to=447525856424&text=Hello"
|
193
|
-
|
194
|
-
@client.send_ussd_push_message(from: 'MyCompany20', to: '447525856424', text: 'Hello').must_equal(@response_object)
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
describe 'send_ussd_prompt_message method' do
|
199
|
-
it 'posts to the ussd prompt resource and returns the response object' do
|
200
|
-
expect_post "#@base_url/ussd-prompt/json", "api_key=#@api_key&api_secret=#@api_secret&from=virtual-number&to=447525856424&text=Hello"
|
201
|
-
|
202
|
-
@client.send_ussd_prompt_message(from: 'virtual-number', to: '447525856424', text: 'Hello').must_equal(@response_object)
|
203
|
-
end
|
204
|
-
end
|
205
|
-
|
206
188
|
describe 'send_2fa_message method' do
|
207
189
|
it 'posts to the short code two factor authentication resource and returns the response object' do
|
208
190
|
expect_post "#@base_url/sc/us/2fa/json", "api_key=#@api_key&api_secret=#@api_secret&to=16365553226&pin=1234"
|
@@ -243,22 +225,6 @@ describe 'Nexmo::Client' do
|
|
243
225
|
end
|
244
226
|
end
|
245
227
|
|
246
|
-
describe 'sns_publish method' do
|
247
|
-
it 'posts to the sns resource and returns the response object' do
|
248
|
-
expect_post "#@sns_base_url/sns/json", "api_key=#@api_key&api_secret=#@api_secret&cmd=publish&message=Hello&topic=arn&from=MyCompany20"
|
249
|
-
|
250
|
-
@client.sns_publish('Hello', topic: 'arn', from: 'MyCompany20').must_equal(@response_object)
|
251
|
-
end
|
252
|
-
end
|
253
|
-
|
254
|
-
describe 'sns_subscribe method' do
|
255
|
-
it 'posts to the sns resource and returns the response object' do
|
256
|
-
expect_post "#@sns_base_url/sns/json", "api_key=#@api_key&api_secret=#@api_secret&cmd=subscribe&to=447525856424&topic=arn"
|
257
|
-
|
258
|
-
@client.sns_subscribe('447525856424', topic: 'arn').must_equal(@response_object)
|
259
|
-
end
|
260
|
-
end
|
261
|
-
|
262
228
|
describe 'initiate_call method' do
|
263
229
|
it 'posts to the call resource and returns the response object' do
|
264
230
|
expect_post "#@base_url/call/json", "api_key=#@api_key&api_secret=#@api_secret&to=16365553226&answer_url=http://example.com/answer"
|
@@ -533,24 +499,40 @@ describe 'Nexmo::Client' do
|
|
533
499
|
it 'raises an authentication error exception if the signature secret was not provided' do
|
534
500
|
client = Nexmo::Client.new(key: @api_key, secret: @api_secret)
|
535
501
|
|
536
|
-
exception = proc {
|
502
|
+
exception = proc { client.check_signature({}) }.must_raise(Nexmo::AuthenticationError)
|
537
503
|
|
538
504
|
exception.message.must_include('No signature_secret provided.')
|
539
505
|
end
|
540
506
|
end
|
541
507
|
|
508
|
+
it 'raises an authentication error exception if the api key was not provided' do
|
509
|
+
client = Nexmo::Client.new(secret: @api_secret)
|
510
|
+
|
511
|
+
exception = proc { client.get_balance }.must_raise(Nexmo::AuthenticationError)
|
512
|
+
|
513
|
+
exception.message.must_include('No API key provided.')
|
514
|
+
end
|
515
|
+
|
516
|
+
it 'raises an authentication error exception if the api secret was not provided' do
|
517
|
+
client = Nexmo::Client.new(key: @api_key)
|
518
|
+
|
519
|
+
exception = proc { client.get_balance }.must_raise(Nexmo::AuthenticationError)
|
520
|
+
|
521
|
+
exception.message.must_include('No API secret provided.')
|
522
|
+
end
|
523
|
+
|
542
524
|
it 'raises an authentication error exception if the application id was not provided' do
|
543
|
-
|
525
|
+
client = Nexmo::Client.new(private_key: @private_key)
|
544
526
|
|
545
|
-
exception = proc {
|
527
|
+
exception = proc { client.get_calls }.must_raise(Nexmo::AuthenticationError)
|
546
528
|
|
547
529
|
exception.message.must_include('No application_id provided.')
|
548
530
|
end
|
549
531
|
|
550
532
|
it 'raises an authentication error exception if the private key was not provided' do
|
551
|
-
|
533
|
+
client = Nexmo::Client.new(application_id: @application_id)
|
552
534
|
|
553
|
-
exception = proc {
|
535
|
+
exception = proc { client.get_calls }.must_raise(Nexmo::AuthenticationError)
|
554
536
|
|
555
537
|
exception.message.must_include('No private_key provided.')
|
556
538
|
end
|
data/spec/nexmo/jwt_spec.rb
CHANGED
metadata
CHANGED
@@ -1,23 +1,23 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nexmo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Craft
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-11-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: rake
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
|
-
type: :
|
20
|
+
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
@@ -25,33 +25,33 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: minitest
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
33
|
+
version: '5.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
40
|
+
version: '5.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: jwt
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
48
|
-
type: :
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: webmock
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -110,7 +110,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
110
110
|
version: '0'
|
111
111
|
requirements: []
|
112
112
|
rubyforge_project:
|
113
|
-
rubygems_version: 2.6.
|
113
|
+
rubygems_version: 2.6.13
|
114
114
|
signing_key:
|
115
115
|
specification_version: 4
|
116
116
|
summary: This is the Ruby client library for Nexmo's API. To use it you'll need a
|