phaxio 2.0.0 → 2.1.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 +5 -5
- data/Gemfile +2 -1
- data/README.md +53 -20
- data/lib/phaxio/client.rb +46 -16
- data/lib/phaxio/config.rb +7 -5
- data/lib/phaxio/resource.rb +11 -5
- data/lib/phaxio/resources/account.rb +1 -1
- data/lib/phaxio/resources/ata.rb +285 -0
- data/lib/phaxio/resources/callback.rb +10 -56
- data/lib/phaxio/resources/fax.rb +11 -11
- data/lib/phaxio/resources/phax_code.rb +2 -2
- data/lib/phaxio/resources/phone_number.rb +31 -5
- data/lib/phaxio/resources/port_number.rb +42 -0
- data/lib/phaxio/resources/port_number_note.rb +51 -0
- data/lib/phaxio/resources/port_order.rb +172 -0
- data/lib/phaxio/resources/public/area_code.rb +1 -1
- data/lib/phaxio/resources/public/country.rb +1 -1
- data/lib/phaxio/resources/webhook.rb +65 -0
- data/lib/phaxio/version.rb +1 -1
- data/lib/phaxio.rb +13 -3
- data/phaxio.gemspec +2 -1
- data/spec/client_spec.rb +38 -6
- data/spec/phaxio_spec.rb +7 -1
- data/spec/resources/account_spec.rb +1 -7
- data/spec/resources/ata_spec.rb +207 -0
- data/spec/resources/fax_spec.rb +42 -89
- data/spec/resources/phax_code_spec.rb +26 -32
- data/spec/resources/phone_number_spec.rb +19 -30
- data/spec/resources/port_number_note_spec.rb +33 -0
- data/spec/resources/port_number_spec.rb +32 -0
- data/spec/resources/port_order_spec.rb +76 -0
- data/spec/resources/public/area_code_spec.rb +1 -1
- data/spec/resources/public/country_spec.rb +1 -7
- data/spec/resources/{callback_spec.rb → webhook_spec.rb} +8 -8
- data/spec/spec_helper.rb +1 -0
- data/spec/support/{vcr_cassettes/resources/account/status.yml → cassettes/account/get.yml} +13 -14
- data/spec/support/cassettes/ata/add_phone_number.yml +89 -0
- data/spec/support/cassettes/ata/create.yml +46 -0
- data/spec/support/cassettes/ata/delete.yml +86 -0
- data/spec/support/cassettes/ata/get.yml +87 -0
- data/spec/support/cassettes/ata/list.yml +67 -0
- data/spec/support/cassettes/ata/provisioning_urls.yml +43 -0
- data/spec/support/cassettes/ata/reference.yml +87 -0
- data/spec/support/cassettes/ata/regenerate.yml +89 -0
- data/spec/support/cassettes/ata/remove_phone_number.yml +130 -0
- data/spec/support/cassettes/ata/update.yml +89 -0
- data/spec/support/cassettes/fax/cancel.yml +90 -0
- data/spec/support/cassettes/fax/create.yml +48 -0
- data/spec/support/cassettes/fax/delete.yml +88 -0
- data/spec/support/cassettes/fax/delete_file.yml +88 -0
- data/spec/support/cassettes/fax/file.yml +93 -0
- data/spec/support/cassettes/fax/get.yml +88 -0
- data/spec/support/cassettes/fax/list.yml +49 -0
- data/spec/support/cassettes/fax/reference.yml +88 -0
- data/spec/support/cassettes/fax/resend.yml +90 -0
- data/spec/support/cassettes/fax/test_receive.yml +49 -0
- data/spec/support/{vcr_cassettes/resources/fax/resend.yml → cassettes/phax_code/create.yml} +14 -15
- data/spec/support/cassettes/phax_code/create_png.yml +50 -0
- data/spec/support/cassettes/phax_code/get_by_id.yml +86 -0
- data/spec/support/{vcr_cassettes/resources/fax/delete.yml → cassettes/phax_code/get_default.yml} +14 -15
- data/spec/support/cassettes/phax_code/get_default_png.yml +48 -0
- data/spec/support/cassettes/phax_code/get_png_by_id.yml +90 -0
- data/spec/support/{vcr_cassettes/resources → cassettes}/phone_number/create.yml +15 -16
- data/spec/support/cassettes/phone_number/get.yml +44 -0
- data/spec/support/cassettes/phone_number/list.yml +72 -0
- data/spec/support/cassettes/phone_number/reference.yml +45 -0
- data/spec/support/cassettes/phone_number/release.yml +86 -0
- data/spec/support/cassettes/port_number/get.yml +88 -0
- data/spec/support/cassettes/port_number_note/list.yml +88 -0
- data/spec/support/cassettes/port_order/create.yml +48 -0
- data/spec/support/cassettes/port_order/get.yml +91 -0
- data/spec/support/cassettes/port_order/list.yml +52 -0
- data/spec/support/{vcr_cassettes/resources/public/area_codes → cassettes/public/area_code}/list.yml +18 -18
- data/spec/support/{vcr_cassettes/resources → cassettes}/public/country/list.yml +14 -15
- data/spec/support/files/test.txt +1 -0
- data/spec/support/vcr.rb +25 -8
- metadata +125 -31
- data/spec/support/credentials.rb +0 -7
- data/spec/support/vcr_cassettes/resources/fax/cancel.yml +0 -46
- data/spec/support/vcr_cassettes/resources/fax/create.yml +0 -230
- data/spec/support/vcr_cassettes/resources/fax/delete_file.yml +0 -44
- data/spec/support/vcr_cassettes/resources/fax/file.yml +0 -251
- data/spec/support/vcr_cassettes/resources/fax/get.yml +0 -44
- data/spec/support/vcr_cassettes/resources/fax/list.yml +0 -56
- data/spec/support/vcr_cassettes/resources/fax/test_receive.yml +0 -231
- data/spec/support/vcr_cassettes/resources/phax_code/create.yml +0 -100
- data/spec/support/vcr_cassettes/resources/phax_code/get.yml +0 -190
- data/spec/support/vcr_cassettes/resources/phone_number/get.yml +0 -45
- data/spec/support/vcr_cassettes/resources/phone_number/list.yml +0 -52
- data/spec/support/vcr_cassettes/resources/phone_number/release.yml +0 -44
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 508fcbe635de23974bfdefe06aec6811fd7f91bd03377dd4a90b971cd1b6a44f
|
|
4
|
+
data.tar.gz: e33347de232350332fe604ecae8c0f511a3774fb9ef7c863f6a269bb53bad787
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6a041ed3d71f144ae2c2776a69be5d947982f1eb76c2a2e748f07b245d48ac8714c9199702b71a9b8c0cd404ea6318518834cb9da9365f569cc6b35633c66e83
|
|
7
|
+
data.tar.gz: d50baaa1fc873a3a20268fb0c56d1b902d0b922d8fcdb731d40e23d89c74bd9c6fea3e35aa66e8c7472502b5af7ac1ad060b5cec22d3fe244e816d98d9be10d5
|
data/Gemfile
CHANGED
data/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://travis-ci.org/phaxio/phaxio-ruby)
|
|
4
4
|
|
|
5
|
-
A Ruby gem for interacting with the [Phaxio API](https://www.phaxio.com/docs/api/v2).
|
|
5
|
+
A Ruby gem for interacting with the [Phaxio API](https://www.phaxio.com/docs/api/v2.1).
|
|
6
6
|
|
|
7
7
|
## Installation
|
|
8
8
|
|
|
@@ -26,14 +26,14 @@ $ gem install phaxio
|
|
|
26
26
|
|
|
27
27
|
## Usage
|
|
28
28
|
|
|
29
|
-
Set up your API Key, API Secret, and, optionally,
|
|
29
|
+
Set up your API Key, API Secret, and, optionally, Webhook Token.
|
|
30
30
|
|
|
31
31
|
``` ruby
|
|
32
32
|
require 'phaxio'
|
|
33
33
|
|
|
34
34
|
Phaxio.api_key = '11111'
|
|
35
35
|
Phaxio.api_secret = '22222'
|
|
36
|
-
Phaxio.
|
|
36
|
+
Phaxio.webhook_token = '33333'
|
|
37
37
|
```
|
|
38
38
|
|
|
39
39
|
Try sending a fax:
|
|
@@ -243,45 +243,78 @@ Account.get
|
|
|
243
243
|
# => Account(balance: 1000, faxes_today: 0, faxes_this_month: 100)
|
|
244
244
|
```
|
|
245
245
|
|
|
246
|
-
####
|
|
246
|
+
#### Webhook
|
|
247
247
|
|
|
248
|
-
##### `
|
|
248
|
+
##### `Webhook.valid_signature?`
|
|
249
249
|
|
|
250
|
-
Validate the
|
|
250
|
+
Validate the webhook signature sent with a Phaxio webhook. Requires that Phaxio.webhook_token be
|
|
251
251
|
set.
|
|
252
252
|
|
|
253
253
|
``` ruby
|
|
254
|
-
|
|
254
|
+
Webhook.valid_signature? received_signature, webhook_url, received_params, received_files
|
|
255
255
|
# => true
|
|
256
256
|
```
|
|
257
257
|
|
|
258
|
-
##
|
|
258
|
+
## Webhook Validation Example with Sinatra
|
|
259
259
|
|
|
260
260
|
``` ruby
|
|
261
261
|
require 'sinatra/base'
|
|
262
262
|
require 'phaxio'
|
|
263
263
|
|
|
264
|
-
class
|
|
265
|
-
Phaxio.
|
|
266
|
-
config.api_key = '0123456789'
|
|
267
|
-
config.api_secret = '0123456789'
|
|
268
|
-
config.callback_token = '0123456789'
|
|
269
|
-
end
|
|
264
|
+
class PhaxioWebhookExample < Sinatra::Base
|
|
265
|
+
Phaxio.webhook_token = 'YOUR WEBHOOK TOKEN HERE'
|
|
270
266
|
|
|
271
|
-
post '/
|
|
267
|
+
post '/webhook' do
|
|
272
268
|
signature = request.env['HTTP_X_PHAXIO_SIGNATURE']
|
|
273
269
|
url = request.url
|
|
274
|
-
file_params = params[:
|
|
275
|
-
if Phaxio::
|
|
270
|
+
file_params = params[:file]
|
|
271
|
+
if Phaxio::Webhook.valid_signature? signature, url, webhook_params, file_params
|
|
276
272
|
'Success'
|
|
277
273
|
else
|
|
278
|
-
'Invalid
|
|
274
|
+
'Invalid webhook signature'
|
|
279
275
|
end
|
|
280
276
|
end
|
|
281
277
|
|
|
282
|
-
def
|
|
278
|
+
def webhook_params
|
|
283
279
|
params.select do |key, _value|
|
|
284
|
-
%w(success is_test direction fax metadata message).include?(key)
|
|
280
|
+
%w(success is_test direction fax metadata message event_type).include?(key)
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
end
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
## Webhook Validation Example with Rails Controller
|
|
287
|
+
|
|
288
|
+
``` ruby
|
|
289
|
+
class WebhookController < ApplicationController
|
|
290
|
+
skip_before_action :verify_authenticity_token
|
|
291
|
+
|
|
292
|
+
def index
|
|
293
|
+
signature = request.headers['X-Phaxio-Signature']
|
|
294
|
+
Phaxio.webhook_token = 'YOUR WEBHOOK TOKEN HERE'
|
|
295
|
+
url = request.original_url
|
|
296
|
+
|
|
297
|
+
Rails.logger.debug "URL: " + url
|
|
298
|
+
Rails.logger.debug "Signature: " + signature
|
|
299
|
+
Rails.logger.debug "params: " + params.inspect
|
|
300
|
+
Rails.logger.debug "webhook_params: " + webhook_params.to_h.inspect
|
|
301
|
+
|
|
302
|
+
if Phaxio::Webhook.valid_signature? signature, url, webhook_params.to_h, file_params
|
|
303
|
+
Rails.logger.debug "Success"
|
|
304
|
+
render plain: 'Success'
|
|
305
|
+
else
|
|
306
|
+
Rails.logger.debug "Invalid webhook signature"
|
|
307
|
+
render plain: 'Invalid webhook signature'
|
|
308
|
+
end
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
def webhook_params
|
|
312
|
+
params.permit(:success, :is_test, :direction, :fax, :metadata, :event_type, :message)
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
def file_params
|
|
316
|
+
if params[:file]
|
|
317
|
+
[{ :name => 'file', :tempfile => params[:file].tempfile }]
|
|
285
318
|
end
|
|
286
319
|
end
|
|
287
320
|
end
|
data/lib/phaxio/client.rb
CHANGED
|
@@ -27,6 +27,7 @@ module Phaxio
|
|
|
27
27
|
begin
|
|
28
28
|
response = case method.to_s
|
|
29
29
|
when 'post' then post(endpoint, params)
|
|
30
|
+
when 'patch' then patch(endpoint, params)
|
|
30
31
|
when 'get' then get(endpoint, params)
|
|
31
32
|
when 'delete' then delete(endpoint, params)
|
|
32
33
|
else raise ArgumentError, "HTTP method `#{method}` is not supported."
|
|
@@ -55,10 +56,7 @@ module Phaxio
|
|
|
55
56
|
body = JSON.parse(response.body).with_indifferent_access
|
|
56
57
|
else
|
|
57
58
|
extension = MimeTypeHelper.extension_for_mimetype content_type
|
|
58
|
-
filename = File.join(
|
|
59
|
-
Dir.tmpdir,
|
|
60
|
-
Dir::Tmpname.make_tmpname('phaxio-', "download.#{extension}")
|
|
61
|
-
)
|
|
59
|
+
filename = File.join Dir.tmpdir, tmpname(extension)
|
|
62
60
|
File.open(filename, 'wb') { |file| file.write response.body }
|
|
63
61
|
body = {'success' => response.success?, 'data' => File.open(filename, 'rb')}
|
|
64
62
|
end
|
|
@@ -93,28 +91,54 @@ module Phaxio
|
|
|
93
91
|
end
|
|
94
92
|
end
|
|
95
93
|
|
|
94
|
+
def tmpname(extension)
|
|
95
|
+
t = Time.now.strftime("%Y%m%d")
|
|
96
|
+
"phaxio-#{t}-#{$$}-#{rand(0x100000000).to_s(36)}-download.#{extension}"
|
|
97
|
+
end
|
|
98
|
+
|
|
96
99
|
def post endpoint, params = {}
|
|
97
100
|
# Handle file params
|
|
98
101
|
params.each do |k, v|
|
|
99
102
|
next unless k.to_s == 'file'
|
|
100
|
-
|
|
101
|
-
|
|
103
|
+
|
|
104
|
+
if v.is_a? Array
|
|
105
|
+
file_param = v.map { |file| file_to_param file }
|
|
106
|
+
else
|
|
107
|
+
file_param = file_to_param v
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
params[k] = file_param
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
conn.post endpoint, params, api_headers(params)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def patch endpoint, params = {}
|
|
117
|
+
# Handle file params
|
|
118
|
+
params.each do |k, v|
|
|
119
|
+
next unless k.to_s == 'file'
|
|
120
|
+
|
|
121
|
+
if v.is_a? Array
|
|
122
|
+
file_param = v.map { |file| file_to_param file }
|
|
123
|
+
else
|
|
124
|
+
file_param = file_to_param v
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
params[k] = file_param
|
|
102
128
|
end
|
|
103
129
|
|
|
104
|
-
conn.
|
|
130
|
+
conn.patch endpoint, params, api_headers(params)
|
|
105
131
|
end
|
|
106
132
|
|
|
107
133
|
def get endpoint, params = {}
|
|
108
|
-
conn.get endpoint, params
|
|
134
|
+
conn.get endpoint, params, api_headers(params)
|
|
109
135
|
end
|
|
110
136
|
|
|
111
137
|
def delete endpoint, params = {}
|
|
112
|
-
conn.delete endpoint, params
|
|
138
|
+
conn.delete endpoint, params, api_headers(params)
|
|
113
139
|
end
|
|
114
140
|
|
|
115
141
|
def api_params params
|
|
116
|
-
params = default_params.merge params
|
|
117
|
-
|
|
118
142
|
# Convert times to ISO 8601
|
|
119
143
|
params.each do |k, v|
|
|
120
144
|
next unless v.kind_of?(Time) || v.kind_of?(Date)
|
|
@@ -124,11 +148,17 @@ module Phaxio
|
|
|
124
148
|
params
|
|
125
149
|
end
|
|
126
150
|
|
|
127
|
-
def
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
}
|
|
151
|
+
def api_headers params
|
|
152
|
+
api_key = params.delete(:api_key) || Phaxio.api_key
|
|
153
|
+
api_secret = params.delete(:api_secret) || Phaxio.api_secret
|
|
154
|
+
return unless api_key && api_secret
|
|
155
|
+
auth = Base64.strict_encode64("#{api_key}:#{api_secret}")
|
|
156
|
+
{'Authorization' => "Basic #{auth}"}
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def file_to_param file
|
|
160
|
+
mime_type = MimeTypeHelper.mimetype_for_file file.path
|
|
161
|
+
Faraday::UploadIO.new file, mime_type
|
|
132
162
|
end
|
|
133
163
|
end
|
|
134
164
|
end
|
data/lib/phaxio/config.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
module Phaxio
|
|
2
2
|
class Config
|
|
3
|
-
DEFAULT_API_ENDPOINT = 'https://api.phaxio.com/v2/'.freeze
|
|
3
|
+
DEFAULT_API_ENDPOINT = 'https://api.phaxio.com/v2.1/'.freeze
|
|
4
4
|
|
|
5
5
|
class << self
|
|
6
6
|
# Your Phaxio API key. This will be used for all interactions with the Phaxio API.
|
|
@@ -13,14 +13,16 @@ module Phaxio
|
|
|
13
13
|
# To find your API secret, visit https://console.phaxio.com/api_credentials
|
|
14
14
|
attr_accessor :api_secret
|
|
15
15
|
|
|
16
|
-
# Your Phaxio
|
|
16
|
+
# Your Phaxio webhook token. This will be used to verify that webhook requests are coming
|
|
17
17
|
# from Phaxio.
|
|
18
18
|
#
|
|
19
|
-
# To find your
|
|
20
|
-
attr_accessor :
|
|
19
|
+
# To find your webhook token, visit https://console.phaxio.com/user/callbacks/edit
|
|
20
|
+
attr_accessor :webhook_token
|
|
21
|
+
alias callback_token webhook_token
|
|
22
|
+
alias callback_token= webhook_token=
|
|
21
23
|
|
|
22
24
|
# The Phaxio API endpoint. Users generally shouldn't need to change it.
|
|
23
|
-
# Defaults to https://api.phaxio.com/v2/
|
|
25
|
+
# Defaults to https://api.phaxio.com/v2.1/
|
|
24
26
|
attr_writer :api_endpoint
|
|
25
27
|
|
|
26
28
|
def api_endpoint
|
data/lib/phaxio/resource.rb
CHANGED
|
@@ -139,12 +139,18 @@ module Phaxio
|
|
|
139
139
|
#
|
|
140
140
|
# @see Phaxio::Resource.response_collection
|
|
141
141
|
def initialize response_data, resource
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
142
|
+
# For some endpoints we'll get a hash with `paging` and `data` attributes.
|
|
143
|
+
# For others, just an array.
|
|
144
|
+
if response_data.is_a? Hash
|
|
145
|
+
if response_data.key? 'paging'
|
|
146
|
+
self.total = response_data['paging']['total']
|
|
147
|
+
self.per_page = response_data['paging']['per_page']
|
|
148
|
+
self.page = response_data['paging']['page']
|
|
149
|
+
end
|
|
150
|
+
self.raw_data = response_data['data']
|
|
151
|
+
else
|
|
152
|
+
self.raw_data = response_data
|
|
146
153
|
end
|
|
147
|
-
self.raw_data = response_data['data']
|
|
148
154
|
self.collection = raw_data.map { |record_data| resource.response_record record_data }
|
|
149
155
|
end
|
|
150
156
|
|
|
@@ -22,7 +22,7 @@ module Phaxio
|
|
|
22
22
|
# Any parameters to send to Phaxio. This action does not have any unique parameters.
|
|
23
23
|
# @return [Phaxio::Resources::Acount] Your account information.
|
|
24
24
|
# @raise [Phaxio::Error::PhaxioError]
|
|
25
|
-
# @see https://www.phaxio.com/docs/api/v2/account/status
|
|
25
|
+
# @see https://www.phaxio.com/docs/api/v2.1/account/status
|
|
26
26
|
def get params = {}
|
|
27
27
|
response = Client.request :get, account_status_endpoint, params
|
|
28
28
|
response_record response
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
module Phaxio
|
|
2
|
+
module Resources
|
|
3
|
+
# Provides functionality for managing ATAs.
|
|
4
|
+
class Ata < Resource
|
|
5
|
+
ATAS_PATH = 'atas'.freeze
|
|
6
|
+
private_constant :ATAS_PATH
|
|
7
|
+
|
|
8
|
+
# @return [Integer] the ID of the ATA.
|
|
9
|
+
# @!attribute id
|
|
10
|
+
|
|
11
|
+
# @return [String] the name of the ATA.
|
|
12
|
+
# @!attribute name
|
|
13
|
+
|
|
14
|
+
# @return [String] the description of the ATA.
|
|
15
|
+
# @!attribute description
|
|
16
|
+
|
|
17
|
+
# @return [String] The user phone number associated with the ATA.
|
|
18
|
+
# @!attribute user_phone_number
|
|
19
|
+
|
|
20
|
+
# @return [String] The domain for the ATA.
|
|
21
|
+
# @!attribute domain
|
|
22
|
+
|
|
23
|
+
# @return [String] The user agent for the ATA.
|
|
24
|
+
# @!attribute user_agent
|
|
25
|
+
|
|
26
|
+
# @return [String] The SIP URI for the ATA.
|
|
27
|
+
# @!attribute sip_uri
|
|
28
|
+
|
|
29
|
+
# @return [String] The mac address for the ATA.
|
|
30
|
+
# @!attribute mac_address
|
|
31
|
+
|
|
32
|
+
# @return [String] The name of the group which the ATA belongs to.
|
|
33
|
+
# @!attribute group
|
|
34
|
+
|
|
35
|
+
# @return [String] The username for the ATA.
|
|
36
|
+
# @!attribute username
|
|
37
|
+
|
|
38
|
+
# @return [String] The password for the ATA.
|
|
39
|
+
# @!attribute password
|
|
40
|
+
|
|
41
|
+
has_normal_attributes %w[
|
|
42
|
+
id name description user_phone_number domain user_agent sip_uri
|
|
43
|
+
mac_address group username password
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
# @return [Time] The time at which the ATA was last registered.
|
|
47
|
+
# @!attribute last_registered
|
|
48
|
+
|
|
49
|
+
# @return [Time] The time at which the ATA's registration expires.
|
|
50
|
+
# @!attribute expiry_time
|
|
51
|
+
|
|
52
|
+
has_time_attributes %w[
|
|
53
|
+
last_registered expiry_time
|
|
54
|
+
]
|
|
55
|
+
|
|
56
|
+
# A reference to an ATA. This is returned by certain actions which don't
|
|
57
|
+
# return the full ATA.
|
|
58
|
+
class Reference
|
|
59
|
+
# @return [Integer]
|
|
60
|
+
# The ID of the referenced ATA.
|
|
61
|
+
attr_accessor :id
|
|
62
|
+
|
|
63
|
+
def to_i
|
|
64
|
+
id
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Gets the referenced ATA.
|
|
68
|
+
# @return [Phaxio::Resources::ATA]
|
|
69
|
+
def get
|
|
70
|
+
Ata.get self
|
|
71
|
+
end
|
|
72
|
+
alias :retrieve :get
|
|
73
|
+
alias :find :get
|
|
74
|
+
|
|
75
|
+
private
|
|
76
|
+
|
|
77
|
+
def initialize id
|
|
78
|
+
self.id = id
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# A set of provisioning URLs.
|
|
83
|
+
class ProvisioningURLs
|
|
84
|
+
# @return [Hash<String: String>] The hash of provisioning URLs.
|
|
85
|
+
# @!attribute urls
|
|
86
|
+
attr_reader :urls
|
|
87
|
+
|
|
88
|
+
GRANDSTREAM = 'Grandstream'
|
|
89
|
+
OBI = 'OBi'
|
|
90
|
+
NETGEN = 'Netgen'
|
|
91
|
+
|
|
92
|
+
def initialize data
|
|
93
|
+
@urls = data
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# @return [String] The Grandstream provisioning url.
|
|
97
|
+
def grandstream
|
|
98
|
+
self.urls.fetch(GRANDSTREAM)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# @return [String] The OBi provisioning url.
|
|
102
|
+
def obi
|
|
103
|
+
self.urls.fetch(OBI)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# @return [String] The Netgen provisioning url.
|
|
107
|
+
def netgen
|
|
108
|
+
self.urls.fetch(NETGEN)
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
class << self
|
|
113
|
+
# @macro paging
|
|
114
|
+
# List ATAs
|
|
115
|
+
# @param params[Hash]
|
|
116
|
+
# Any parameters to send to Phaxio.
|
|
117
|
+
# @return [Phaxio::Resource::Collection<Phaxio::Resources::Ata>]
|
|
118
|
+
# The collection of ATAs matching your request.
|
|
119
|
+
# @raise [Phaxio::Error::PhaxioError]
|
|
120
|
+
# @see https://www.phaxio.com/docs/api/v2.1/atas/list
|
|
121
|
+
def list params = {}
|
|
122
|
+
response = Client.request :get, atas_endpoint, params
|
|
123
|
+
response_collection response
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# Create an ATA
|
|
127
|
+
# @param params [Hash]
|
|
128
|
+
# Any parameters to send to Phaxio.
|
|
129
|
+
# - *name* [String] - A name used to identify the ATA.
|
|
130
|
+
# - *description* [String] - A longer description of the ATA.
|
|
131
|
+
# - *domain* [String] - A domain for the ATA.
|
|
132
|
+
# - *mac_address* [String] - A mac address for the ATA.
|
|
133
|
+
# @return [Phaxio::Resources::Ata]
|
|
134
|
+
# The created ATA, including the generated username and password.
|
|
135
|
+
# @raise [Phaxio::Error::PhaxioError]
|
|
136
|
+
# @see https://www.phaxio.com/docs/api/v2.1/atas/create
|
|
137
|
+
def create params = {}
|
|
138
|
+
response = Client.request :post, atas_endpoint, params
|
|
139
|
+
response_record response
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# Get an ATA
|
|
143
|
+
# @param id [Integer]
|
|
144
|
+
# The ID of the ATA to retrieve information about.
|
|
145
|
+
# @param params [Hash]
|
|
146
|
+
# Any parameters to send to Phaxio.
|
|
147
|
+
# - *with_credentials* [Boolean] - If enabled, the username and
|
|
148
|
+
# password for the ATA will be included in the response.
|
|
149
|
+
# @return [Phaxio::Resources::Ata]
|
|
150
|
+
# The requested ATA.
|
|
151
|
+
# @raise [Phaxio::Error::PhaxioError]
|
|
152
|
+
# @see https://www.phaxio.com/docs/api/v2.1/atas/get
|
|
153
|
+
def get id, params = {}
|
|
154
|
+
response = Client.request :get, ata_endpoint(id.to_i), params
|
|
155
|
+
response_record response
|
|
156
|
+
end
|
|
157
|
+
alias :retrieve :get
|
|
158
|
+
alias :find :get
|
|
159
|
+
|
|
160
|
+
# Update an ATA
|
|
161
|
+
# @param id [Integer]
|
|
162
|
+
# The ID of the ATA to update.
|
|
163
|
+
# @param params [Hash]
|
|
164
|
+
# Any parameters to send to Phaxio.
|
|
165
|
+
# - *name* [String] - A name used to identify the ATA.
|
|
166
|
+
# - *description* [String] - A longer description of the ATA.
|
|
167
|
+
# - *mac_address* [String] - A mac address for the ATA.
|
|
168
|
+
# @return [Phaxio::Resources::Ata]
|
|
169
|
+
# The updated ATA.
|
|
170
|
+
# @raise [Phaxio::Error::PhaxioError]
|
|
171
|
+
# @see https://www.phaxio.com/docs/api/v2.1/atas/update
|
|
172
|
+
def update id, params = {}
|
|
173
|
+
response = Client.request :patch, ata_endpoint(id.to_i), params
|
|
174
|
+
response_record response
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
# Regenerate credentials for an ATA
|
|
178
|
+
# @param id [Integer]
|
|
179
|
+
# The ID of the ATA for which credentials should be regenerated.
|
|
180
|
+
# @param params [Hash]
|
|
181
|
+
# Any parameters to send to Phaxio. This action takes no unique parameters.
|
|
182
|
+
# @return [Phaxio::Resources::Ata]
|
|
183
|
+
# The ATA, including the new username and password.
|
|
184
|
+
# @raise Phaxio::Error::PhaxioError
|
|
185
|
+
# @see https://www.phaxio.com/docs/api/v2.1/atas/regenerate_credentials
|
|
186
|
+
def regenerate_credentials id, params = {}
|
|
187
|
+
response = Client.request :patch, regenerate_credentials_endpoint(id.to_i), params
|
|
188
|
+
response_record response
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# Delete an ATA
|
|
192
|
+
# @param id [Integer]
|
|
193
|
+
# The ID of the ATA to delete.
|
|
194
|
+
# @param params [Hash]
|
|
195
|
+
# Any parameters to send to Phaxio. This action takes no unique parameters.
|
|
196
|
+
# @return [Phaxio::Resources::Ata::Reference]
|
|
197
|
+
# A reference to the deleted ATA.
|
|
198
|
+
# @raise [Phaxio::Error::PhaxioError]
|
|
199
|
+
# @see https://www.phaxio.com/docs/api/v2.1/atas/delete
|
|
200
|
+
def delete id, params = {}
|
|
201
|
+
response = Client.request :delete, ata_endpoint(id.to_i), params
|
|
202
|
+
response_reference response
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# Add a phone number
|
|
206
|
+
# @param id [Integer]
|
|
207
|
+
# The ID of the ATA to which you want to add a number.
|
|
208
|
+
# @param phone_number [String]
|
|
209
|
+
# The phone number to add to the ATA.
|
|
210
|
+
# @param params [Hash]
|
|
211
|
+
# Any parameters to send to Phaxio. This action takes no unique parameters.
|
|
212
|
+
# @return [Phaxio::Resources::PhoneNumber::Reference]
|
|
213
|
+
# A reference to the added phone number.
|
|
214
|
+
# @raise [Phaxio::Error::PhaxioError]
|
|
215
|
+
# @see https://www.phaxio.com/docs/api/v2.1/atas/add_phone_number
|
|
216
|
+
def add_phone_number id, phone_number, params = {}
|
|
217
|
+
response = Client.request :post, phone_number_endpoint(id, phone_number), params
|
|
218
|
+
response_phone_number_reference response
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
# Remove a phone number
|
|
222
|
+
# @param id [Integer]
|
|
223
|
+
# The ID of the ATA from which you want to remove the phone number.
|
|
224
|
+
# @param phone_number [String]
|
|
225
|
+
# The phone number you want to remove.
|
|
226
|
+
# @param params [Hash]
|
|
227
|
+
# Any parameters to send to Phaxio. This action takes no unique parameters.
|
|
228
|
+
# @return [Phaxio::Resources::PhoneNumber::Reference]
|
|
229
|
+
# A reference to the removed phone number.
|
|
230
|
+
# @raise [Phaxio::Error::PhaxioError]
|
|
231
|
+
# @see https://www.phaxio.com/docs/api/v2.1/atas/remove_phone_number
|
|
232
|
+
def remove_phone_number id, phone_number, params = {}
|
|
233
|
+
response = Client.request :delete, phone_number_endpoint(id, phone_number), params
|
|
234
|
+
response_phone_number_reference response
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
# Get ATA provisioning URLs for your Phaxio account.
|
|
238
|
+
# @param params [Hash]
|
|
239
|
+
# Any parameters to send to Phaxio.
|
|
240
|
+
# - *group* [String] - If given, this action instead returns
|
|
241
|
+
# provisioning URLs for the named group.
|
|
242
|
+
# @return [Phaxio::Resources::Ata::ProvisioningURLs
|
|
243
|
+
# @see https://www.phaxio.com/docs/api/v2.1/atas/provisioning_urls
|
|
244
|
+
def provisioning_urls params = {}
|
|
245
|
+
response = Client.request :get, provisioning_urls_endpoint, params
|
|
246
|
+
response_provisioning_urls response
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
private
|
|
250
|
+
|
|
251
|
+
def response_reference response
|
|
252
|
+
Reference.new Integer(response['id'])
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
def response_phone_number_reference response
|
|
256
|
+
PhoneNumber::Reference.new(response['phone_number'])
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
def response_provisioning_urls response
|
|
260
|
+
ProvisioningURLs.new(response)
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
def atas_endpoint
|
|
264
|
+
ATAS_PATH
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
def ata_endpoint id
|
|
268
|
+
"#{atas_endpoint}/#{id}"
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
def regenerate_credentials_endpoint id
|
|
272
|
+
"#{ata_endpoint(id)}/regenerate_credentials"
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
def phone_number_endpoint id, phone_number
|
|
276
|
+
"#{ata_endpoint(id)}/phone_numbers/#{phone_number}"
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
def provisioning_urls_endpoint
|
|
280
|
+
"#{atas_endpoint}/provisioning_urls"
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
end
|
|
284
|
+
end
|
|
285
|
+
end
|
|
@@ -1,63 +1,17 @@
|
|
|
1
1
|
module Phaxio
|
|
2
2
|
module Resources
|
|
3
|
-
#
|
|
4
|
-
# @see
|
|
5
|
-
# @see https://www.phaxio.com/docs/api/v2/faxes/receive_callback
|
|
3
|
+
# This class is provided for the sake of backwards compatibility; use the Webhook resource instead.
|
|
4
|
+
# @see Phaxio::Resources::Webhook
|
|
6
5
|
class Callback
|
|
7
|
-
DIGEST = OpenSSL::Digest.new('sha1')
|
|
8
|
-
private_constant :DIGEST
|
|
9
|
-
|
|
10
6
|
class << self
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
# @param files [Array<File>]
|
|
20
|
-
# The files received with the callback, if any.
|
|
21
|
-
# @return [true, false]
|
|
22
|
-
# @raise [Phaxio::Error::PhaxioError]
|
|
23
|
-
# @see https://www.phaxio.com/docs/security/callbacks
|
|
24
|
-
def valid_signature? signature, url, params, files = []
|
|
25
|
-
check_signature = generate_check_signature url, params, files
|
|
26
|
-
check_signature == signature
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
private
|
|
30
|
-
|
|
31
|
-
def generate_check_signature url, params, files = []
|
|
32
|
-
params_string = generate_params_string(params)
|
|
33
|
-
files_string = generate_files_string(files)
|
|
34
|
-
callback_data = "#{url}#{params_string}#{files_string}"
|
|
35
|
-
OpenSSL::HMAC.hexdigest(DIGEST, callback_token, callback_data)
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def callback_token
|
|
39
|
-
Phaxio.callback_token or raise(Error::PhaxioError, 'No callback token has been set')
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def generate_params_string(params)
|
|
43
|
-
sorted_params = params.sort_by { |key, _value| key }
|
|
44
|
-
params_strings = sorted_params.map { |key, value| "#{key}#{value}" }
|
|
45
|
-
params_strings.join
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def generate_files_string(files)
|
|
49
|
-
files_array = files_to_array(files).reject(&:nil?)
|
|
50
|
-
sorted_files = files_array.sort_by { |file| file[:name] }
|
|
51
|
-
files_strings = sorted_files.map { |file| generate_file_string(file) }
|
|
52
|
-
files_strings.join
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def files_to_array(files)
|
|
56
|
-
files.is_a?(Array) ? files : [files]
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def generate_file_string(file)
|
|
60
|
-
file[:name] + DIGEST.hexdigest(file[:tempfile].read)
|
|
7
|
+
def valid_signature? *args
|
|
8
|
+
Phaxio::Resources::Webhook.valid_signature? *args
|
|
9
|
+
rescue Error::PhaxioError => error
|
|
10
|
+
if error.message == 'No webhook token has been set'
|
|
11
|
+
raise Error::PhaxioError, 'No callback token has been set'
|
|
12
|
+
else
|
|
13
|
+
raise error
|
|
14
|
+
end
|
|
61
15
|
end
|
|
62
16
|
end
|
|
63
17
|
end
|