nexmo 5.8.0 → 5.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/nexmo.rb +1 -1
- data/lib/nexmo/account.rb +36 -1
- data/lib/nexmo/alerts.rb +46 -0
- data/lib/nexmo/applications.rb +118 -0
- data/lib/nexmo/applications_v2.rb +71 -0
- data/lib/nexmo/authentication/abstract.rb +3 -1
- data/lib/nexmo/authentication/basic.rb +3 -1
- data/lib/nexmo/authentication/bearer_token.rb +3 -1
- data/lib/nexmo/authentication/key_secret_params.rb +3 -1
- data/lib/nexmo/authentication/key_secret_query.rb +3 -1
- data/lib/nexmo/call_dtmf.rb +12 -0
- data/lib/nexmo/call_stream.rb +26 -0
- data/lib/nexmo/call_talk.rb +30 -0
- data/lib/nexmo/calls.rb +188 -0
- data/lib/nexmo/client.rb +77 -1
- data/lib/nexmo/conversation_events.rb +47 -0
- data/lib/nexmo/conversation_legs.rb +14 -0
- data/lib/nexmo/conversation_members.rb +74 -0
- data/lib/nexmo/conversation_users.rb +63 -0
- data/lib/nexmo/conversations.rb +110 -0
- data/lib/nexmo/errors.rb +41 -0
- data/lib/nexmo/errors/error.rb +0 -27
- data/lib/nexmo/form_data.rb +3 -1
- data/lib/nexmo/http.rb +3 -1
- data/lib/nexmo/json.rb +3 -1
- data/lib/nexmo/jwt.rb +25 -0
- data/lib/nexmo/keys.rb +3 -1
- data/lib/nexmo/logger.rb +3 -1
- data/lib/nexmo/namespace.rb +4 -2
- data/lib/nexmo/number_insight.rb +102 -0
- data/lib/nexmo/numbers.rb +155 -0
- data/lib/nexmo/params.rb +3 -1
- data/lib/nexmo/redact.rb +20 -0
- data/lib/nexmo/secrets.rb +53 -0
- data/lib/nexmo/signature.rb +24 -13
- data/lib/nexmo/sms.rb +88 -0
- data/lib/nexmo/user_agent.rb +3 -1
- data/lib/nexmo/verify.rb +144 -0
- data/lib/nexmo/version.rb +1 -1
- data/nexmo.gemspec +2 -0
- metadata +31 -3
- data/lib/nexmo/problem.rb +0 -20
data/lib/nexmo/params.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
require 'cgi'
|
3
3
|
|
4
4
|
module Nexmo
|
5
|
-
module Params
|
5
|
+
module Params
|
6
6
|
def self.encode(params)
|
7
7
|
params.flat_map { |k, vs| Array(vs).map { |v| "#{escape(k)}=#{escape(v)}" } }.join('&')
|
8
8
|
end
|
@@ -21,4 +21,6 @@ module Nexmo
|
|
21
21
|
|
22
22
|
private_class_method :escape
|
23
23
|
end
|
24
|
+
|
25
|
+
private_constant :Params
|
24
26
|
end
|
data/lib/nexmo/redact.rb
CHANGED
@@ -6,6 +6,26 @@ module Nexmo
|
|
6
6
|
|
7
7
|
self.request_body = JSON
|
8
8
|
|
9
|
+
# Redact a specific message.
|
10
|
+
#
|
11
|
+
# @example
|
12
|
+
# response = client.redact.transaction(id: '00A0B0C0', product: 'sms')
|
13
|
+
#
|
14
|
+
# @option params [required, String] :id
|
15
|
+
# The transaction ID to redact.
|
16
|
+
#
|
17
|
+
# @option params [required, String] :product
|
18
|
+
# Product name that the ID provided relates to.
|
19
|
+
#
|
20
|
+
# @option params [required, String] :type
|
21
|
+
# Required if redacting SMS data.
|
22
|
+
#
|
23
|
+
# @param [Hash] params
|
24
|
+
#
|
25
|
+
# @return [Entity]
|
26
|
+
#
|
27
|
+
# @see https://developer.nexmo.com/api/redact#redact-message
|
28
|
+
#
|
9
29
|
def transaction(params)
|
10
30
|
request('/v1/redact/transaction', params: params, type: Post)
|
11
31
|
end
|
data/lib/nexmo/secrets.rb
CHANGED
@@ -6,18 +6,71 @@ module Nexmo
|
|
6
6
|
|
7
7
|
self.request_body = JSON
|
8
8
|
|
9
|
+
# Create API Secret.
|
10
|
+
#
|
11
|
+
# @example
|
12
|
+
# response = client.secrets.create(secret: 'T0ps3cr3t')
|
13
|
+
#
|
14
|
+
# @option params [required, String] :secret
|
15
|
+
# The new secret must follow these rules:
|
16
|
+
# - minimum 8 characters
|
17
|
+
# - maximum 25 characters
|
18
|
+
# - minimum 1 lower case character
|
19
|
+
# - minimum 1 upper case character
|
20
|
+
# - minimum 1 digit
|
21
|
+
#
|
22
|
+
# @param [Hash] params
|
23
|
+
#
|
24
|
+
# @return [Entity]
|
25
|
+
#
|
26
|
+
# @see https://developer.nexmo.com/api/account#createAPISecret
|
27
|
+
#
|
9
28
|
def create(params)
|
10
29
|
request('/accounts/' + account_id + '/secrets', params: params, type: Post)
|
11
30
|
end
|
12
31
|
|
32
|
+
# Retrieve API Secrets.
|
33
|
+
#
|
34
|
+
# @example
|
35
|
+
# response = client.secrets.list
|
36
|
+
# response._embedded.secrets.each do |item|
|
37
|
+
# puts "#{item.created_at} #{item.id}"
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
# @return [Entity]
|
41
|
+
#
|
42
|
+
# @see https://developer.nexmo.com/api/account#retrieveAPISecrets
|
43
|
+
#
|
13
44
|
def list
|
14
45
|
request('/accounts/' + account_id + '/secrets')
|
15
46
|
end
|
16
47
|
|
48
|
+
# Retrieve one API Secret.
|
49
|
+
#
|
50
|
+
# @example
|
51
|
+
# response = client.secrets.get(secret_id)
|
52
|
+
#
|
53
|
+
# @param [String] secret_id
|
54
|
+
#
|
55
|
+
# @return [Entity]
|
56
|
+
#
|
57
|
+
# @see https://developer.nexmo.com/api/account#retrieveAPISecret
|
58
|
+
#
|
17
59
|
def get(secret_id)
|
18
60
|
request('/accounts/' + account_id + '/secrets/' + secret_id)
|
19
61
|
end
|
20
62
|
|
63
|
+
# Revoke an API Secret.
|
64
|
+
#
|
65
|
+
# @example
|
66
|
+
# response = client.secrets.revoke(secret_id)
|
67
|
+
#
|
68
|
+
# @param [String] secret_id
|
69
|
+
#
|
70
|
+
# @return [Entity]
|
71
|
+
#
|
72
|
+
# @see https://developer.nexmo.com/api/account#revokeAPISecret
|
73
|
+
#
|
21
74
|
def revoke(secret_id)
|
22
75
|
request('/accounts/' + account_id + '/secrets/' + secret_id, type: Delete)
|
23
76
|
end
|
data/lib/nexmo/signature.rb
CHANGED
@@ -3,34 +3,45 @@ require 'jwt'
|
|
3
3
|
|
4
4
|
module Nexmo
|
5
5
|
class Signature
|
6
|
-
def
|
6
|
+
def initialize(secret)
|
7
|
+
@secret = secret
|
8
|
+
end
|
9
|
+
|
10
|
+
# Check webhook request signature.
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
# client = Nexmo::Client.new(signature_secret: 'secret')
|
14
|
+
#
|
15
|
+
# if client.signature.check(request.GET)
|
16
|
+
# # valid signature
|
17
|
+
# else
|
18
|
+
# # invalid signature
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
# @param [Hash] params
|
22
|
+
#
|
23
|
+
# @see https://developer.nexmo.com/concepts/guides/signing-messages
|
24
|
+
#
|
25
|
+
def check(params)
|
7
26
|
params = params.dup
|
8
27
|
|
9
28
|
signature = params.delete('sig')
|
10
29
|
|
11
|
-
::JWT::SecurityUtils.secure_compare(signature, digest(params
|
12
|
-
end
|
13
|
-
|
14
|
-
def initialize(client)
|
15
|
-
@client = client
|
30
|
+
::JWT::SecurityUtils.secure_compare(signature, digest(params))
|
16
31
|
end
|
17
32
|
|
18
|
-
|
19
|
-
self.class.check(params, @client.signature_secret)
|
20
|
-
end
|
33
|
+
private
|
21
34
|
|
22
|
-
def
|
35
|
+
def digest(params)
|
23
36
|
md5 = Digest::MD5.new
|
24
37
|
|
25
38
|
params.sort.each do |k, v|
|
26
39
|
md5.update("&#{k}=#{v}")
|
27
40
|
end
|
28
41
|
|
29
|
-
md5.update(secret)
|
42
|
+
md5.update(@secret)
|
30
43
|
|
31
44
|
md5.hexdigest
|
32
45
|
end
|
33
|
-
|
34
|
-
private_class_method :digest
|
35
46
|
end
|
36
47
|
end
|
data/lib/nexmo/sms.rb
CHANGED
@@ -6,6 +6,94 @@ module Nexmo
|
|
6
6
|
|
7
7
|
self.host = 'rest.nexmo.com'
|
8
8
|
|
9
|
+
# Send an outbound SMS from your Nexmo account.
|
10
|
+
#
|
11
|
+
# @example
|
12
|
+
# response = client.sms.send(from: 'Ruby', to: '447700900000', text: 'Hello world')
|
13
|
+
#
|
14
|
+
# if response.messages.first.status == '0'
|
15
|
+
# puts "Sent message id=#{response.messages.first.message_id}"
|
16
|
+
# else
|
17
|
+
# puts "Error: #{response.messages.first.error_text}"
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# @option params [required, String] :from
|
21
|
+
# The name or number the message should be sent from.
|
22
|
+
# Alphanumeric senderID's are not supported in all countries, see [Global Messaging](https://developer.nexmo.com/messaging/sms/guides/global-messaging#country-specific-features) for more details.
|
23
|
+
# If alphanumeric, spaces will be ignored. Numbers are specified in E.164 format.
|
24
|
+
#
|
25
|
+
# @option params [required, String] :to
|
26
|
+
# The number that the message should be sent to.
|
27
|
+
# Numbers are specified in E.164 format.
|
28
|
+
#
|
29
|
+
# @option params [String] :text
|
30
|
+
# The body of the message being sent.
|
31
|
+
# If your message contains characters that can be encoded according to the GSM Standard and Extended tables then you can set the **:type** to `text`.
|
32
|
+
# If your message contains characters outside this range, then you will need to set the **:type** to `unicode`.
|
33
|
+
#
|
34
|
+
# @option params [Integer] :ttl
|
35
|
+
# The duration in milliseconds the delivery of an SMS will be attempted.
|
36
|
+
# By default Nexmo attempt delivery for 72 hours, however the maximum effective value depends on the operator and is typically 24 - 48 hours.
|
37
|
+
# We recommend this value should be kept at its default or at least 30 minutes.
|
38
|
+
#
|
39
|
+
# @option params [Boolean] :status_report_req
|
40
|
+
# Boolean indicating if you like to receive a [Delivery Receipt](https://developer.nexmo.com/messaging/sms/building-blocks/receive-a-delivery-receipt).
|
41
|
+
#
|
42
|
+
# @option params [String] :callback
|
43
|
+
# The webhook endpoint the delivery receipt for this sms is sent to.
|
44
|
+
# This parameter overrides the webhook endpoint you set in Dashboard.
|
45
|
+
#
|
46
|
+
# @option params [Integer] :message_class
|
47
|
+
# The Data Coding Scheme value of the message.
|
48
|
+
#
|
49
|
+
# @option params [String] :type
|
50
|
+
# The format of the message body.
|
51
|
+
#
|
52
|
+
# @option params [String] :vcard
|
53
|
+
# A business card in [vCard format](https://en.wikipedia.org/wiki/VCard).
|
54
|
+
# Depends on **:type** option having the value `vcard`.
|
55
|
+
#
|
56
|
+
# @option params [String] :vcal
|
57
|
+
# A calendar event in [vCal format](https://en.wikipedia.org/wiki/VCal).
|
58
|
+
# Depends on **:type** option having the value `vcal`.
|
59
|
+
#
|
60
|
+
# @option params [String] :body
|
61
|
+
# Hex encoded binary data.
|
62
|
+
# Depends on **:type** option having the value `binary`.
|
63
|
+
#
|
64
|
+
# @option params [String] :udh
|
65
|
+
# Your custom Hex encoded [User Data Header](https://en.wikipedia.org/wiki/User_Data_Header).
|
66
|
+
# Depends on **:type** option having the value `binary`.
|
67
|
+
#
|
68
|
+
# @option params [Integer] :protocol_id
|
69
|
+
# The value of the [protocol identifier](https://en.wikipedia.org/wiki/GSM_03.40#Protocol_Identifier) to use.
|
70
|
+
# Ensure that the value is aligned with **:udh**.
|
71
|
+
#
|
72
|
+
# @option params [String] :title
|
73
|
+
# The title for a wappush SMS.
|
74
|
+
# Depends on **:type** option having the value `wappush`.
|
75
|
+
#
|
76
|
+
# @option params [String] :url
|
77
|
+
# The URL of your website.
|
78
|
+
# Depends on **:type** option having the value `wappush`.
|
79
|
+
#
|
80
|
+
# @option params [String] :validity
|
81
|
+
# The availability for an SMS in milliseconds.
|
82
|
+
# Depends on **:type** option having the value `wappush`.
|
83
|
+
#
|
84
|
+
# @option params [String] :client_ref
|
85
|
+
# You can optionally include your own reference of up to 40 characters.
|
86
|
+
#
|
87
|
+
# @option params [String] :account_ref
|
88
|
+
# An optional string used to identify separate accounts using the SMS endpoint for billing purposes.
|
89
|
+
# To use this feature, please email [support@nexmo.com](mailto:support@nexmo.com).
|
90
|
+
#
|
91
|
+
# @param [Hash] params
|
92
|
+
#
|
93
|
+
# @return [Entity]
|
94
|
+
#
|
95
|
+
# @see https://developer.nexmo.com/api/sms#send-an-sms
|
96
|
+
#
|
9
97
|
def send(params)
|
10
98
|
request('/sms/json', params: hyphenate(params), type: Post)
|
11
99
|
end
|
data/lib/nexmo/user_agent.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Nexmo
|
4
|
-
module UserAgent
|
4
|
+
module UserAgent
|
5
5
|
def self.string(app_name, app_version)
|
6
6
|
identifiers = []
|
7
7
|
identifiers << 'nexmo-ruby/' + VERSION
|
@@ -10,4 +10,6 @@ module Nexmo
|
|
10
10
|
identifiers.join(' ')
|
11
11
|
end
|
12
12
|
end
|
13
|
+
|
14
|
+
private_constant :UserAgent
|
13
15
|
end
|
data/lib/nexmo/verify.rb
CHANGED
@@ -4,26 +4,170 @@ module Nexmo
|
|
4
4
|
class Verify < Namespace
|
5
5
|
alias_method :http_request, :request
|
6
6
|
|
7
|
+
private :http_request
|
8
|
+
|
9
|
+
# Generate and send a PIN to your user.
|
10
|
+
#
|
11
|
+
# @note You can make a maximum of one Verify request per second.
|
12
|
+
#
|
13
|
+
# @example
|
14
|
+
# response = client.verify.request(number: '447700900000', brand: 'Acme Inc')
|
15
|
+
#
|
16
|
+
# if response.status == '0'
|
17
|
+
# puts "Started verification request_id=#{response.request_id}"
|
18
|
+
# else
|
19
|
+
# puts "Error: #{response.error_text}"
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# @option params [required, String] :number
|
23
|
+
# The mobile or landline phone number to verify.
|
24
|
+
# Unless you are setting **:country** explicitly, this number must be in E.164 format.
|
25
|
+
#
|
26
|
+
# @option params [String] :country
|
27
|
+
# If you do not provide **:number** in international format or you are not sure if **:number** is correctly formatted, specify the two-character country code in **:country**.
|
28
|
+
# Verify will then format the number for you.
|
29
|
+
#
|
30
|
+
# @option params [required, String] :brand
|
31
|
+
# An 18-character alphanumeric string you can use to personalize the verification request SMS body, to help users identify your company or application name.
|
32
|
+
# For example: "Your `Acme Inc` PIN is ..."
|
33
|
+
#
|
34
|
+
# @option params [String] :sender_id
|
35
|
+
# An 11-character alphanumeric string that represents the [identity of the sender](https://developer.nexmo.com/messaging/sms/guides/custom-sender-id) of the verification request.
|
36
|
+
# Depending on the destination of the phone number you are sending the verification SMS to, restrictions might apply.
|
37
|
+
#
|
38
|
+
# @option params [Integer] :code_length
|
39
|
+
# The length of the verification code.
|
40
|
+
#
|
41
|
+
# @option params [String] :lg
|
42
|
+
# By default, the SMS or text-to-speech (TTS) message is generated in the locale that matches the **:number**.
|
43
|
+
# For example, the text message or TTS message for a `33*` number is sent in French.
|
44
|
+
# Use this parameter to explicitly control the language, accent and gender used for the Verify request.
|
45
|
+
#
|
46
|
+
# @option params [Integer] :pin_expiry
|
47
|
+
# How log the generated verification code is valid for, in seconds.
|
48
|
+
# When you specify both **:pin_expiry** and **:next_event_wait** then **:pin_expiry** must be an integer multiple of **:next_event_wait** otherwise **:pin_expiry** is defaulted to equal **:next_event_wait**.
|
49
|
+
# See [changing the event timings](https://developer.nexmo.com/verify/guides/changing-default-timings).
|
50
|
+
#
|
51
|
+
# @option params [Integer] :next_event_wait
|
52
|
+
# Specifies the wait time in seconds between attempts to deliver the verification code.
|
53
|
+
#
|
54
|
+
# @option params [Integer] :workflow_id
|
55
|
+
# Selects the predefined sequence of SMS and TTS (Text To Speech) actions to use in order to convey the PIN to your user.
|
56
|
+
# For example, an id of 1 identifies the workflow SMS - TTS - TTS.
|
57
|
+
# For a list of all workflows and their associated ids, please visit the [developer portal](https://developer.nexmo.com/verify/guides/workflows-and-events).
|
58
|
+
#
|
59
|
+
# @param [Hash] params
|
60
|
+
#
|
61
|
+
# @return [Entity]
|
62
|
+
#
|
63
|
+
# @see https://developer.nexmo.com/api/verify#verifyRequest
|
64
|
+
#
|
7
65
|
def request(params)
|
8
66
|
http_request('/verify/json', params: params, type: Post)
|
9
67
|
end
|
10
68
|
|
69
|
+
# Confirm that the PIN you received from your user matches the one sent by Nexmo in your verification request.
|
70
|
+
#
|
71
|
+
# @example
|
72
|
+
# response = client.verify.check(request_id: request_id, code: '1234')
|
73
|
+
#
|
74
|
+
# if response.status == '0'
|
75
|
+
# puts "Verification complete, event_id=#{response.event_id}"
|
76
|
+
# else
|
77
|
+
# puts "Error: #{response.error_text}"
|
78
|
+
# end
|
79
|
+
#
|
80
|
+
# @option params [required, String] :request_id
|
81
|
+
# The Verify request to check.
|
82
|
+
# This is the `request_id` you received in the response to the Verify request.
|
83
|
+
#
|
84
|
+
# @option params [required, String] :code
|
85
|
+
# The verification code entered by your user.
|
86
|
+
#
|
87
|
+
# @option params [String] :ip_address
|
88
|
+
# The IP address used by your user when they entered the verification code.
|
89
|
+
# Nexmo uses this information to identify fraud and spam. This ultimately benefits all Nexmo customers.
|
90
|
+
#
|
91
|
+
# @param [Hash] params
|
92
|
+
#
|
93
|
+
# @return [Entity]
|
94
|
+
#
|
95
|
+
# @see https://developer.nexmo.com/api/verify#verifyCheck
|
96
|
+
#
|
11
97
|
def check(params)
|
12
98
|
http_request('/verify/check/json', params: params, type: Post)
|
13
99
|
end
|
14
100
|
|
101
|
+
# Check the status of past or current verification requests.
|
102
|
+
#
|
103
|
+
# @example
|
104
|
+
# response = client.verify.search(request_id: request_id)
|
105
|
+
#
|
106
|
+
# @option params [String] :request_id
|
107
|
+
# The `request_id` you received in the Verify Request Response.
|
108
|
+
#
|
109
|
+
# @option params [Array<string>] :request_ids
|
110
|
+
# More than one `request_id`.
|
111
|
+
# Each `request_id` is a new parameter in the Verify Search request.
|
112
|
+
#
|
113
|
+
# @param [Hash] params
|
114
|
+
#
|
115
|
+
# @return [Entity]
|
116
|
+
#
|
117
|
+
# @see https://developer.nexmo.com/api/verify#verifySearch
|
118
|
+
#
|
15
119
|
def search(params)
|
16
120
|
http_request('/verify/search/json', params: params)
|
17
121
|
end
|
18
122
|
|
123
|
+
# Control the progress of your verification requests.
|
124
|
+
#
|
125
|
+
# @example
|
126
|
+
# response = client.verify.control(request_id: request_id, cmd: 'cancel')
|
127
|
+
#
|
128
|
+
# @option params [required, String] :request_id
|
129
|
+
# The `request_id` you received in the response to the Verify request.
|
130
|
+
#
|
131
|
+
# @option params [required, String] :cmd
|
132
|
+
# The command to execute, depending on whether you want to cancel the verification process, or advance to the next verification event.
|
133
|
+
# You must wait at least 30 seconds before cancelling a Verify request.
|
134
|
+
#
|
135
|
+
# @param [Hash] params
|
136
|
+
#
|
137
|
+
# @return [Entity]
|
138
|
+
#
|
139
|
+
# @see https://developer.nexmo.com/api/verify#verifyControl
|
140
|
+
#
|
19
141
|
def control(params)
|
20
142
|
http_request('/verify/control/json', params: params, type: Post)
|
21
143
|
end
|
22
144
|
|
145
|
+
# Cancel an existing verification request.
|
146
|
+
#
|
147
|
+
# @example
|
148
|
+
# response = client.verify.cancel(request_id)
|
149
|
+
#
|
150
|
+
# @param [String] id
|
151
|
+
#
|
152
|
+
# @return [Entity]
|
153
|
+
#
|
154
|
+
# @see https://developer.nexmo.com/api/verify#verifyControl
|
155
|
+
#
|
23
156
|
def cancel(id)
|
24
157
|
control(request_id: id, cmd: 'cancel')
|
25
158
|
end
|
26
159
|
|
160
|
+
# Trigger the next verification event for an existing verification request.
|
161
|
+
#
|
162
|
+
# @example
|
163
|
+
# response = client.verify.trigger_next_event(request_id)
|
164
|
+
#
|
165
|
+
# @param [String] id
|
166
|
+
#
|
167
|
+
# @return [Entity]
|
168
|
+
#
|
169
|
+
# @see https://developer.nexmo.com/api/verify#verifyControl
|
170
|
+
#
|
27
171
|
def trigger_next_event(id)
|
28
172
|
control(request_id: id, cmd: 'trigger_next_event')
|
29
173
|
end
|