didww-v3 1.3.1 → 2.0.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/.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
|
+

|
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
|