didww-v3 1.3.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/tests.yml +5 -1
- data/.rubocop.yml +3 -0
- data/CHANGELOG.md +20 -2
- data/Gemfile +1 -0
- data/README.md +5 -1
- data/Rakefile +1 -0
- data/bin/console +1 -0
- data/didww-v3.gemspec +3 -1
- data/lib/didww/{middleware.rb → base_middleware.rb} +5 -4
- data/lib/didww/callback/request_validator.rb +68 -0
- data/lib/didww/client.rb +61 -13
- data/lib/didww/complex_objects/base.rb +1 -0
- data/lib/didww/complex_objects/capacity_order_item.rb +1 -0
- data/lib/didww/complex_objects/cdr_export_filter.rb +1 -0
- data/lib/didww/complex_objects/configurations/base.rb +1 -0
- data/lib/didww/complex_objects/configurations/const.rb +1 -0
- data/lib/didww/complex_objects/configurations/h323_configuration.rb +1 -0
- data/lib/didww/complex_objects/configurations/iax2_configuration.rb +1 -0
- data/lib/didww/complex_objects/configurations/pstn_configuration.rb +1 -0
- data/lib/didww/complex_objects/configurations/sip_configuration.rb +1 -0
- data/lib/didww/complex_objects/configurations.rb +1 -0
- data/lib/didww/complex_objects/did_order_item.rb +14 -12
- data/lib/didww/encrypt.rb +101 -0
- data/lib/didww/jsonapi_middleware.rb +21 -0
- data/lib/didww/resources/address.rb +37 -0
- data/lib/didww/resources/address_verification.rb +56 -0
- data/lib/didww/resources/area.rb +12 -0
- data/lib/didww/resources/available_did.rb +1 -0
- data/lib/didww/resources/balance.rb +1 -0
- data/lib/didww/resources/base.rb +2 -1
- data/lib/didww/resources/capacity_pool.rb +1 -0
- data/lib/didww/resources/cdr_export.rb +12 -1
- data/lib/didww/resources/city.rb +5 -0
- data/lib/didww/resources/country.rb +1 -0
- data/lib/didww/resources/did.rb +3 -1
- data/lib/didww/resources/did_group.rb +1 -4
- data/lib/didww/resources/did_group_type.rb +1 -0
- data/lib/didww/resources/did_reservation.rb +1 -0
- data/lib/didww/resources/encrypted_file.rb +58 -0
- data/lib/didww/resources/identity.rb +78 -0
- data/lib/didww/resources/order.rb +9 -0
- data/lib/didww/resources/permanent_supporting_document.rb +15 -0
- data/lib/didww/resources/pop.rb +1 -0
- data/lib/didww/resources/proof.rb +19 -0
- data/lib/didww/resources/proof_type.rb +14 -0
- data/lib/didww/resources/public_key.rb +12 -0
- data/lib/didww/resources/qty_based_pricing.rb +1 -0
- data/lib/didww/resources/region.rb +1 -0
- data/lib/didww/resources/requirement.rb +61 -0
- data/lib/didww/resources/requirement_validation.rb +10 -0
- data/lib/didww/resources/shared_capacity_group.rb +1 -0
- data/lib/didww/resources/stock_keeping_unit.rb +1 -0
- data/lib/didww/resources/supporting_document_template.rb +14 -0
- data/lib/didww/resources/trunk/const.rb +1 -0
- data/lib/didww/resources/trunk.rb +1 -0
- data/lib/didww/resources/trunk_group.rb +1 -0
- data/lib/didww/version.rb +2 -1
- data/lib/didww.rb +5 -1
- metadata +33 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9d736e9893b21ef96ef76993d6bb3da3e47c1dbb760edcc6ea13d0cf86d5e847
|
4
|
+
data.tar.gz: 9d641935ce36af938ea6641b7488835535ef4a01f6464b5c90f667dafac953c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b2cef4993cda70bd45a3a1efd960ab26d9ba603de9a10c246c537ccdbbb3506e923f1628643fabcefcc7be8ca1f9a6a93342b996e6233b9eadadc77818d766fe
|
7
|
+
data.tar.gz: de556881b793c412ea2fb486bacd00f89a3c07ad3902e755f5a4140e2eb0fda10f1b748ea719ce9968e87e476797bed8b28ce3b032f1e107ed457946235f303f
|
data/.github/workflows/tests.yml
CHANGED
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -4,15 +4,33 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
5
5
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
6
6
|
|
7
|
-
## [
|
7
|
+
## [2.0.0] - 2021-10-26
|
8
|
+
### Breaking Changes
|
9
|
+
- upgrade `json_api_client` version to `1.18.0` [#9](https://github.com/didww/didww-v3-ruby/pull/9)
|
10
|
+
Handling of 4XX responses was changed - it now raises JsonApiClient::Errors::ClientError with `detail` as error message instead of adding it into base errors.
|
11
|
+
- /v3/dids in request and response attributes pending_removal being removed in favor of billing_cycles_count.
|
12
|
+
- /v3/did_groups restriction message removed in favor of requirements relationship.
|
13
|
+
|
8
14
|
### Changes
|
9
15
|
- replace travis with github actions [#7](https://github.com/didww/didww-v3-ruby/pull/7) [#9](https://github.com/didww/didww-v3-ruby/pull/9)
|
10
16
|
- use rubocop 1.9.X version [#7](https://github.com/didww/didww-v3-ruby/pull/7)
|
11
17
|
- add bundle-audit [#7](https://github.com/didww/didww-v3-ruby/pull/7)
|
18
|
+
- /v3/orders request attribute items of type DID Order Item Attributes can have billing_cycles_count.
|
19
|
+
- /v3/dids added address_verification relationship.
|
20
|
+
- callbacks attributes added to /v3/orders, /v3/cdr_exports.
|
21
|
+
- /v3/proof_types read endpoints being added.
|
22
|
+
- /v3/supporting_document_templates read endpoints being added.
|
23
|
+
- /v3/requirements read endpoints being added.
|
24
|
+
- /v3/identities read, write, and delete endpoints being added.
|
25
|
+
- /v3/addresses read, write, and delete endpoints being added.
|
26
|
+
- /v3/encrypted_files read, write, and delete endpoints being added.
|
27
|
+
- /v3/proofs write, delete endpoint being added.
|
28
|
+
- /v3/permanent_supporting_documents write, delete endpoint being added.
|
29
|
+
- /v3/address_verifications read and write endpoints being added.
|
30
|
+
- /v3/requirement_validations write endpoint being added.
|
12
31
|
|
13
32
|
### Bugfixes
|
14
33
|
- fix order purchase when activesupport 6.X.X is used.
|
15
|
-
- fix BigDecimal 2 support for ruby 2.7+.
|
16
34
|
|
17
35
|
## [1.3.0] - 2018-09-03
|
18
36
|
### Changes
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Ruby client for DIDWW API v3.
|
2
2
|
|
3
|
-
|
3
|
+
![Tests](https://github.com/didww/didww-v3-ruby/workflows/Tests/badge.svg)
|
4
4
|
|
5
5
|
About DIDWW API v3
|
6
6
|
-----
|
@@ -11,6 +11,10 @@ The DIDWW API v3 is a fully compliant implementation of the [JSON API specificat
|
|
11
11
|
|
12
12
|
Read more https://doc.didww.com/api
|
13
13
|
|
14
|
+
Gem Versions **2.X.X** are intended to use with DIDWW API 3 version [2021-04-19](https://doc.didww.com/api3/2021-04-19/index.html).
|
15
|
+
|
16
|
+
Gem Versions **1.X.X** are intended to use with DIDWW API 3 version [2017-09-18](https://doc.didww.com/api3/2017-09-18/index.html).
|
17
|
+
|
14
18
|
## Installation
|
15
19
|
|
16
20
|
Add this line to your application's Gemfile:
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
data/didww-v3.gemspec
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
|
2
3
|
lib = File.expand_path('../lib', __FILE__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
@@ -23,7 +24,8 @@ Gem::Specification.new do |spec|
|
|
23
24
|
|
24
25
|
spec.add_dependency 'activesupport'
|
25
26
|
spec.add_dependency 'faraday'
|
26
|
-
spec.add_dependency 'json_api_client', '1.
|
27
|
+
spec.add_dependency 'json_api_client', '1.18.0'
|
27
28
|
spec.add_dependency 'http'
|
28
29
|
spec.add_dependency 'down'
|
30
|
+
spec.add_dependency 'openssl-oaep'
|
29
31
|
end
|
@@ -1,11 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module DIDWW
|
2
3
|
# :nodoc:
|
3
|
-
class
|
4
|
+
class BaseMiddleware < Faraday::Middleware
|
4
5
|
def call(request_env)
|
5
6
|
headers = {}
|
6
|
-
headers['
|
7
|
-
headers['
|
8
|
-
headers['
|
7
|
+
headers['Api-Key'] = DIDWW::Client.api_key
|
8
|
+
headers['User-Agent'] = "didww-v3 Ruby gem v#{VERSION}"
|
9
|
+
headers['x-didww-api-version'] = DIDWW::Client.api_version unless DIDWW::Client.api_version.blank?
|
9
10
|
|
10
11
|
request_env[:request_headers].merge!(headers)
|
11
12
|
request_env.url.host = URI(DIDWW::Client.api_base_url).host
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'openssl'
|
3
|
+
|
4
|
+
module DIDWW
|
5
|
+
module Callback
|
6
|
+
# @example
|
7
|
+
# validator = DIDWW::Callback::RequestValidator.new(api_key)
|
8
|
+
# uri = request.original_url
|
9
|
+
# if request.post?
|
10
|
+
# # Collect all parameters passed from DIDWW.
|
11
|
+
# params = env['rack.request.form_hash']
|
12
|
+
# else
|
13
|
+
# params = env['rack.request.query_hash']
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# signature = env['HTTP_X_DIDWW_SIGNATURE']
|
17
|
+
# validator.validate(uri, params, signature) #=> true if the request is from DIDWW
|
18
|
+
# # or with rails
|
19
|
+
class RequestValidator
|
20
|
+
DIGEST_ALGO = 'SHA1'
|
21
|
+
HEADER = 'X-DIDWW-Signature'
|
22
|
+
|
23
|
+
def initialize(api_key)
|
24
|
+
@api_key = api_key
|
25
|
+
end
|
26
|
+
|
27
|
+
# @param url [String]
|
28
|
+
# @param payload [Hash]
|
29
|
+
# @param signature [String]
|
30
|
+
# @return [Boolean] whether signature valid or not.
|
31
|
+
def validate(url, payload, signature)
|
32
|
+
return false if signature.blank?
|
33
|
+
|
34
|
+
signature == valid_signature(url, payload)
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
# @param url [String]
|
40
|
+
# @param payload [Hash]
|
41
|
+
# @return [String] generated signature in URL safe format.
|
42
|
+
def valid_signature(url, payload)
|
43
|
+
normalized_url = normalize_url(url)
|
44
|
+
data = normalized_url + payload.sort.join
|
45
|
+
OpenSSL::HMAC.hexdigest(DIGEST_ALGO, @api_key, data)
|
46
|
+
end
|
47
|
+
|
48
|
+
# @return [String] normalized URL.
|
49
|
+
def normalize_url(url)
|
50
|
+
parsed_url = URI ensure_protocol_url(url)
|
51
|
+
url = "#{parsed_url.scheme || 'http'}://"
|
52
|
+
url += "#{parsed_url.userinfo}@" if parsed_url.userinfo
|
53
|
+
url += "#{parsed_url.host}:#{parsed_url.port || parsed_url.default_port}#{parsed_url.path}"
|
54
|
+
url += "?#{parsed_url.query}" if parsed_url.query
|
55
|
+
url += "##{parsed_url.fragment}" if parsed_url.fragment
|
56
|
+
url
|
57
|
+
end
|
58
|
+
|
59
|
+
def ensure_protocol_url(url)
|
60
|
+
if url[%r{\A[a-zA-Z]+://}i]
|
61
|
+
url
|
62
|
+
else
|
63
|
+
'http://' + url
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/lib/didww/client.rb
CHANGED
@@ -1,18 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'active_support/core_ext/module/attribute_accessors'
|
3
|
+
require 'active_support/core_ext/object/blank'
|
2
4
|
require 'json_api_client'
|
3
5
|
|
4
6
|
require 'didww/resources/base'
|
5
7
|
|
6
|
-
# Fixes BigDecimal 2 support for ruby 2.7+ without introducing json_api_client breaking changes.
|
7
|
-
# https://github.com/JsonApiClient/json_api_client/commit/ac372b8bab3b71bb0aa5c4dcc6ced1d9c3fe8d14
|
8
|
-
class JsonApiClient::Schema::Types::FixedDecimal
|
9
|
-
def self.cast(value, _)
|
10
|
-
BigDecimal(value)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
JsonApiClient::Schema.register decimal: JsonApiClient::Schema::Types::FixedDecimal
|
15
|
-
|
16
8
|
module DIDWW
|
17
9
|
module Client
|
18
10
|
BASE_URLS = {
|
@@ -21,7 +13,7 @@ module DIDWW
|
|
21
13
|
}.freeze
|
22
14
|
DEFAULT_MODE = :sandbox
|
23
15
|
|
24
|
-
mattr_accessor :api_key, :api_mode, :http_verbose
|
16
|
+
mattr_accessor :api_key, :api_mode, :http_verbose, :api_version
|
25
17
|
|
26
18
|
class << self
|
27
19
|
def configure
|
@@ -39,8 +31,20 @@ module DIDWW
|
|
39
31
|
@@api_key
|
40
32
|
end
|
41
33
|
|
34
|
+
def api_version
|
35
|
+
@@api_version
|
36
|
+
end
|
37
|
+
|
38
|
+
def with_api_version(api_version)
|
39
|
+
old_api_version = self.api_version
|
40
|
+
self.api_version = api_version
|
41
|
+
yield
|
42
|
+
ensure
|
43
|
+
self.api_version = old_api_version
|
44
|
+
end
|
45
|
+
|
42
46
|
def api_base_url
|
43
|
-
BASE_URLS[api_mode]
|
47
|
+
ENV['DIDWW_API_URL'].presence || BASE_URLS[api_mode]
|
44
48
|
end
|
45
49
|
|
46
50
|
def balance
|
@@ -107,6 +111,38 @@ module DIDWW
|
|
107
111
|
Resource::DidReservation
|
108
112
|
end
|
109
113
|
|
114
|
+
def requirements
|
115
|
+
Resource::Requirement
|
116
|
+
end
|
117
|
+
|
118
|
+
def identities
|
119
|
+
Resource::Identity
|
120
|
+
end
|
121
|
+
|
122
|
+
def proofs
|
123
|
+
Resource::Proof
|
124
|
+
end
|
125
|
+
|
126
|
+
def addresses
|
127
|
+
Resource::Address
|
128
|
+
end
|
129
|
+
|
130
|
+
def permanent_supporting_documents
|
131
|
+
Resource::PermanentSupportingDocument
|
132
|
+
end
|
133
|
+
|
134
|
+
def encrypted_file
|
135
|
+
Resource::EncryptedFile
|
136
|
+
end
|
137
|
+
|
138
|
+
def address_verifications
|
139
|
+
Resource::AddressVerification
|
140
|
+
end
|
141
|
+
|
142
|
+
def requirement_validation
|
143
|
+
Resource::RequirementValidation
|
144
|
+
end
|
145
|
+
|
110
146
|
def api_mode=(arg)
|
111
147
|
unless BASE_URLS.keys.include?(arg)
|
112
148
|
raise ArgumentError.new("Mode should be in #{BASE_URLS.keys} (given '#{arg}').")
|
@@ -124,7 +160,7 @@ module DIDWW
|
|
124
160
|
DIDWW::Resource::Base.site = api_base_url
|
125
161
|
DIDWW::Resource::Base.connection do |connection|
|
126
162
|
connection.use Faraday::Response::Logger if http_verbose?
|
127
|
-
connection.use DIDWW::
|
163
|
+
connection.use DIDWW::JsonapiMiddleware
|
128
164
|
end
|
129
165
|
JsonApiClient::Paginating::Paginator.page_param = 'number'
|
130
166
|
JsonApiClient::Paginating::Paginator.per_page_param = 'size'
|
@@ -149,6 +185,18 @@ module DIDWW
|
|
149
185
|
require 'didww/resources/trunk'
|
150
186
|
require 'didww/resources/available_did'
|
151
187
|
require 'didww/resources/did_reservation'
|
188
|
+
require 'didww/resources/requirement'
|
189
|
+
require 'didww/resources/proof_type'
|
190
|
+
require 'didww/resources/supporting_document_template'
|
191
|
+
require 'didww/resources/identity'
|
192
|
+
require 'didww/resources/proof'
|
193
|
+
require 'didww/resources/address'
|
194
|
+
require 'didww/resources/permanent_supporting_document'
|
195
|
+
require 'didww/resources/encrypted_file'
|
196
|
+
require 'didww/resources/address_verification'
|
197
|
+
require 'didww/resources/requirement_validation'
|
198
|
+
require 'didww/resources/public_key'
|
199
|
+
require 'didww/resources/area'
|
152
200
|
end
|
153
201
|
|
154
202
|
end
|
@@ -1,21 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module DIDWW
|
2
3
|
module ComplexObject
|
3
4
|
class DidOrderItem < Base
|
4
5
|
# passed at order creation
|
5
|
-
property :qty,
|
6
|
-
property :available_did_id,
|
7
|
-
property :did_reservation_id,
|
8
|
-
property :sku_id,
|
6
|
+
property :qty, type: :int
|
7
|
+
property :available_did_id, type: :string
|
8
|
+
property :did_reservation_id, type: :string
|
9
|
+
property :sku_id, type: :string
|
10
|
+
property :billing_cycles_count, type: :string
|
9
11
|
|
10
12
|
# returned
|
11
|
-
property :setup_price,
|
12
|
-
property :monthly_price,
|
13
|
-
property :nrc,
|
14
|
-
property :mrc,
|
15
|
-
property :propated_mrc,
|
16
|
-
property :billed_from,
|
17
|
-
property :billed_to,
|
18
|
-
property :did_group_id,
|
13
|
+
property :setup_price, type: :decimal
|
14
|
+
property :monthly_price, type: :decimal
|
15
|
+
property :nrc, type: :decimal
|
16
|
+
property :mrc, type: :decimal
|
17
|
+
property :propated_mrc, type: :boolean
|
18
|
+
property :billed_from, type: :string
|
19
|
+
property :billed_to, type: :string
|
20
|
+
property :did_group_id, type: :string
|
19
21
|
end
|
20
22
|
end
|
21
23
|
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'openssl'
|
3
|
+
require 'openssl/oaep'
|
4
|
+
require 'net/http'
|
5
|
+
|
6
|
+
module DIDWW
|
7
|
+
# Allows to encrypt file on Ruby-side before uploading to `/v3/encrypted_files`.
|
8
|
+
# @example
|
9
|
+
# file_content_1 = File.read('file_to_send_1.jpg', mode: 'rb')
|
10
|
+
# file_content_2 = File.read('file_to_send_1.pdf', mode: 'rb')
|
11
|
+
# enc = DIDWW::Encrypt.new
|
12
|
+
# enc_data_1 = enc.encrypt(file_content_1)
|
13
|
+
# enc_data_2 = enc.encrypt(file_content_2)
|
14
|
+
# enc_io_1 = Faraday::UploadIO.new(StringIO.new(enc_data_1), 'application/octet-stream')
|
15
|
+
# enc_io_2 = Faraday::UploadIO.new(StringIO.new(enc_data_2), 'application/octet-stream')
|
16
|
+
# DIDWW::Resource::EncryptedFile.upload(
|
17
|
+
# encryption_fingerprint: enc.encryption_fingerprint,
|
18
|
+
# items: [
|
19
|
+
# { file: enc_io_1, description: 'file_to_send_1.jpg' },
|
20
|
+
# { file: enc_io_2, description: 'file_to_send_2.pdf' }
|
21
|
+
# ]
|
22
|
+
# ) # => Array if IDs
|
23
|
+
#
|
24
|
+
class Encrypt
|
25
|
+
AES_ALGO = [256, :CBC]
|
26
|
+
AES_KEY_LEN = 32
|
27
|
+
AES_IV_LEN = 16
|
28
|
+
LABEL = ''
|
29
|
+
SEPARATOR = ':::'
|
30
|
+
|
31
|
+
class << self
|
32
|
+
# @param binary [String]
|
33
|
+
# @return [String]
|
34
|
+
def encrypt(binary)
|
35
|
+
new.encrypt(binary)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
attr_reader :public_keys, :encryption_fingerprint
|
40
|
+
|
41
|
+
def initialize
|
42
|
+
reset!
|
43
|
+
end
|
44
|
+
|
45
|
+
# @param binary [String] binary content of a file.
|
46
|
+
# @return [String] binary content of an encrypted file.
|
47
|
+
def encrypt(binary)
|
48
|
+
aes_key, aes_iv, encrypted_aes = encrypt_aes(binary)
|
49
|
+
aes_credentials = aes_key + aes_iv
|
50
|
+
encrypted_rsa_a = encrypt_rsa_oaep(public_keys[0], aes_credentials)
|
51
|
+
encrypted_rsa_b = encrypt_rsa_oaep(public_keys[1], aes_credentials)
|
52
|
+
encrypted_rsa_a + encrypted_rsa_b + encrypted_aes
|
53
|
+
end
|
54
|
+
|
55
|
+
# Resets public keys and fingerprint.
|
56
|
+
def reset!
|
57
|
+
@public_keys = fetch_public_keys
|
58
|
+
@encryption_fingerprint = calculate_fingerprint
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
# @return [Array(String,String)] public keys.
|
64
|
+
def fetch_public_keys
|
65
|
+
DIDWW::Resource::PublicKey.find.map(&:key)
|
66
|
+
end
|
67
|
+
|
68
|
+
def calculate_fingerprint
|
69
|
+
public_keys.map { |pub_key| fingerprint_for(pub_key) }.join(SEPARATOR)
|
70
|
+
end
|
71
|
+
|
72
|
+
# @param public_key [String] PEM public key.
|
73
|
+
# @return [String] hexstring digest SHA1 for public key binary.
|
74
|
+
def fingerprint_for(public_key)
|
75
|
+
public_key += "\n" unless public_key[-1] == "\n"
|
76
|
+
public_key_base64 = public_key.split("\n")[1..-2].join
|
77
|
+
public_key_bin = Base64.decode64(public_key_base64)
|
78
|
+
OpenSSL::Digest::SHA1.hexdigest(public_key_bin)
|
79
|
+
end
|
80
|
+
|
81
|
+
# @param public_key [String]
|
82
|
+
# @param text [String]
|
83
|
+
def encrypt_rsa_oaep(public_key, text)
|
84
|
+
rsa = OpenSSL::PKey::RSA.new(public_key)
|
85
|
+
rsa.public_encrypt_oaep(text, LABEL, OpenSSL::Digest::SHA256)
|
86
|
+
end
|
87
|
+
|
88
|
+
# @param binary [String]
|
89
|
+
# @return [Array(String,String,String)] binaries key, vector, encrypted data.
|
90
|
+
def encrypt_aes(binary)
|
91
|
+
key = SecureRandom.random_bytes(AES_KEY_LEN)
|
92
|
+
iv = SecureRandom.random_bytes(AES_IV_LEN)
|
93
|
+
cipher = OpenSSL::Cipher::AES.new(*AES_ALGO)
|
94
|
+
cipher.encrypt
|
95
|
+
cipher.key = key
|
96
|
+
cipher.iv = iv
|
97
|
+
encrypted = cipher.update(binary) + cipher.final
|
98
|
+
[key, iv, encrypted]
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module DIDWW
|
3
|
+
# :nodoc:
|
4
|
+
class JsonapiMiddleware < Faraday::Middleware
|
5
|
+
def call(request_env)
|
6
|
+
headers = {}
|
7
|
+
headers['Content-Type'] = 'application/vnd.api+json'
|
8
|
+
headers['Api-Key'] = DIDWW::Client.api_key
|
9
|
+
headers['User-Agent'] = "didww-v3 Ruby gem v#{VERSION}"
|
10
|
+
headers['x-didww-api-version'] = DIDWW::Client.api_version unless DIDWW::Client.api_version.blank?
|
11
|
+
|
12
|
+
request_env[:request_headers].merge!(headers)
|
13
|
+
request_env.url.host = URI(DIDWW::Client.api_base_url).host
|
14
|
+
|
15
|
+
@app.call(request_env).on_complete do |response_env|
|
16
|
+
# do something with the response
|
17
|
+
# response_env[:response_headers].merge!(...)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module DIDWW
|
3
|
+
module Resource
|
4
|
+
class Address < Base
|
5
|
+
|
6
|
+
has_one :identity, class_name: 'Identity'
|
7
|
+
has_one :country, class_name: 'Country'
|
8
|
+
has_many :proofs, class_name: 'Proof'
|
9
|
+
has_many :city, class_name: 'City'
|
10
|
+
has_many :area, class_name: 'Area'
|
11
|
+
|
12
|
+
property :city_name, type: :string
|
13
|
+
# Type: String
|
14
|
+
# Description:
|
15
|
+
|
16
|
+
property :postal_code, type: :string
|
17
|
+
# Type: String
|
18
|
+
# Description:
|
19
|
+
|
20
|
+
property :address, type: :string
|
21
|
+
# Type: String
|
22
|
+
# Description:
|
23
|
+
|
24
|
+
property :description, type: :string
|
25
|
+
# Type: String
|
26
|
+
# Description:
|
27
|
+
|
28
|
+
property :created_at, type: :date
|
29
|
+
# Type: Date
|
30
|
+
# Description:
|
31
|
+
|
32
|
+
property :verified, type: :boolean
|
33
|
+
# Type: Boolean
|
34
|
+
# Description:
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module DIDWW
|
3
|
+
module Resource
|
4
|
+
class AddressVerification < Base
|
5
|
+
STATUS_PENDING = 'Pending'
|
6
|
+
STATUS_APPROVED = 'Approved'
|
7
|
+
STATUS_REJECTED = 'Rejected'
|
8
|
+
STATUSES = [
|
9
|
+
STATUS_PENDING,
|
10
|
+
STATUS_APPROVED,
|
11
|
+
STATUS_REJECTED
|
12
|
+
].freeze
|
13
|
+
|
14
|
+
has_one :address, class_name: 'Address'
|
15
|
+
has_many :dids, class_name: 'Did'
|
16
|
+
has_many :onetime_files, class_name: 'EncryptedFile'
|
17
|
+
|
18
|
+
property :service_description, type: :string
|
19
|
+
# Type: String
|
20
|
+
# Description:
|
21
|
+
|
22
|
+
property :status, type: :string
|
23
|
+
# Type: String
|
24
|
+
# Description:
|
25
|
+
|
26
|
+
property :reject_reasons, type: :string
|
27
|
+
# Type: String
|
28
|
+
# Description:
|
29
|
+
|
30
|
+
property :created_at, type: :date
|
31
|
+
# Type: Date
|
32
|
+
# Description:
|
33
|
+
|
34
|
+
property :callback_url, type: :string
|
35
|
+
# Type: String
|
36
|
+
# Description: valid URI for callbacks
|
37
|
+
|
38
|
+
property :callback_method, type: :string
|
39
|
+
# Type: String
|
40
|
+
# Description: GET or POST
|
41
|
+
|
42
|
+
def pending?
|
43
|
+
status == STATUS_PENDING
|
44
|
+
end
|
45
|
+
|
46
|
+
def approved?
|
47
|
+
status == STATUS_APPROVED
|
48
|
+
end
|
49
|
+
|
50
|
+
def rejected?
|
51
|
+
status == STATUS_REJECTED
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|