virgil-sdk 4.2.3

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.
Files changed (63) hide show
  1. checksums.yaml +7 -0
  2. data/.DS_Store +0 -0
  3. data/.gitignore +15 -0
  4. data/Gemfile +4 -0
  5. data/README.md +134 -0
  6. data/Rakefile +9 -0
  7. data/bin/console +16 -0
  8. data/bin/setup +8 -0
  9. data/dockefiles/Dockerfile-200 +25 -0
  10. data/dockefiles/Dockerfile-2110 +36 -0
  11. data/dockefiles/Dockerfile-220 +26 -0
  12. data/dockefiles/Dockerfile-226 +25 -0
  13. data/dockefiles/Dockerfile-233 +25 -0
  14. data/dockefiles/Dockerfile-240 +26 -0
  15. data/docker-compose.yml +107 -0
  16. data/lib/virgil/sdk.rb +10 -0
  17. data/lib/virgil/sdk/client.rb +47 -0
  18. data/lib/virgil/sdk/client/card.rb +142 -0
  19. data/lib/virgil/sdk/client/card_validator.rb +104 -0
  20. data/lib/virgil/sdk/client/http.rb +45 -0
  21. data/lib/virgil/sdk/client/http/base_connection.rb +112 -0
  22. data/lib/virgil/sdk/client/http/cards_service_connection.rb +113 -0
  23. data/lib/virgil/sdk/client/http/request.rb +63 -0
  24. data/lib/virgil/sdk/client/request_signer.rb +90 -0
  25. data/lib/virgil/sdk/client/requests.rb +50 -0
  26. data/lib/virgil/sdk/client/requests/confirm_identity_request.rb +67 -0
  27. data/lib/virgil/sdk/client/requests/create_card_request.rb +105 -0
  28. data/lib/virgil/sdk/client/requests/revoke_card_request.rb +85 -0
  29. data/lib/virgil/sdk/client/requests/signable_request.rb +142 -0
  30. data/lib/virgil/sdk/client/requests/verify_identity_request.rb +60 -0
  31. data/lib/virgil/sdk/client/search_criteria.rb +79 -0
  32. data/lib/virgil/sdk/client/signatures_base64.rb +25 -0
  33. data/lib/virgil/sdk/client/virgil_client.rb +425 -0
  34. data/lib/virgil/sdk/cryptography.rb +42 -0
  35. data/lib/virgil/sdk/cryptography/hashes.rb +44 -0
  36. data/lib/virgil/sdk/cryptography/hashes/fingerprint.rb +79 -0
  37. data/lib/virgil/sdk/cryptography/hashes/hash_algorithm.rb +91 -0
  38. data/lib/virgil/sdk/cryptography/keys.rb +48 -0
  39. data/lib/virgil/sdk/cryptography/keys/key_pair.rb +46 -0
  40. data/lib/virgil/sdk/cryptography/keys/key_pair_type.rb +108 -0
  41. data/lib/virgil/sdk/cryptography/keys/key_storage.rb +177 -0
  42. data/lib/virgil/sdk/cryptography/keys/private_key.rb +44 -0
  43. data/lib/virgil/sdk/cryptography/keys/public_key.rb +44 -0
  44. data/lib/virgil/sdk/cryptography/keys/storage_item.rb +63 -0
  45. data/lib/virgil/sdk/cryptography/virgil_crypto.rb +411 -0
  46. data/lib/virgil/sdk/high_level.rb +21 -0
  47. data/lib/virgil/sdk/high_level/virgil_api.rb +71 -0
  48. data/lib/virgil/sdk/high_level/virgil_app_credentials.rb +54 -0
  49. data/lib/virgil/sdk/high_level/virgil_buffer.rb +161 -0
  50. data/lib/virgil/sdk/high_level/virgil_card.rb +204 -0
  51. data/lib/virgil/sdk/high_level/virgil_card_manager.rb +294 -0
  52. data/lib/virgil/sdk/high_level/virgil_card_verifier_info.rb +49 -0
  53. data/lib/virgil/sdk/high_level/virgil_context.rb +69 -0
  54. data/lib/virgil/sdk/high_level/virgil_identity.rb +17 -0
  55. data/lib/virgil/sdk/high_level/virgil_identity/email_confirmation.rb +60 -0
  56. data/lib/virgil/sdk/high_level/virgil_identity/validation_token.rb +49 -0
  57. data/lib/virgil/sdk/high_level/virgil_identity/verification_attempt.rb +69 -0
  58. data/lib/virgil/sdk/high_level/virgil_identity/verification_options.rb +56 -0
  59. data/lib/virgil/sdk/high_level/virgil_key.rb +168 -0
  60. data/lib/virgil/sdk/high_level/virgil_key_manager.rb +97 -0
  61. data/lib/virgil/sdk/version.rb +5 -0
  62. data/virgil-sdk.gemspec +31 -0
  63. metadata +203 -0
data/lib/virgil/sdk.rb ADDED
@@ -0,0 +1,10 @@
1
+ require "virgil/sdk/version"
2
+ require "virgil/crypto"
3
+
4
+ module Virgil
5
+ module SDK
6
+ autoload :Cryptography, 'virgil/sdk/cryptography'
7
+ autoload :Client, 'virgil/sdk/client'
8
+ autoload :HighLevel, 'virgil/sdk/high_level'
9
+ end
10
+ end
@@ -0,0 +1,47 @@
1
+ # Copyright (C) 2016 Virgil Security Inc.
2
+ #
3
+ # Lead Maintainer: Virgil Security Inc. <support@virgilsecurity.com>
4
+ #
5
+ # All rights reserved.
6
+ #
7
+ # Redistribution and use in source and binary forms, with or without
8
+ # modification, are permitted provided that the following conditions are
9
+ # met:
10
+ #
11
+ # (1) Redistributions of source code must retain the above copyright
12
+ # notice, this list of conditions and the following disclaimer.
13
+ #
14
+ # (2) Redistributions in binary form must reproduce the above copyright
15
+ # notice, this list of conditions and the following disclaimer in
16
+ # the documentation and/or other materials provided with the
17
+ # distribution.
18
+ #
19
+ # (3) Neither the name of the copyright holder nor the names of its
20
+ # contributors may be used to endorse or promote products derived from
21
+ # this software without specific prior written permission.
22
+ #
23
+ # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR
24
+ # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26
+ # DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
27
+ # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28
+ # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29
+ # SERVICES; LOSS OF USE, bytes, OR PROFITS; OR BUSINESS INTERRUPTION)
30
+ # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
31
+ # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
32
+ # IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33
+ # POSSIBILITY OF SUCH DAMAGE.
34
+ module Virgil
35
+ module SDK
36
+ module Client
37
+ autoload :SignaturesBase64, 'virgil/sdk/client/signatures_base64'
38
+ autoload :Card, 'virgil/sdk/client/card'
39
+ autoload :CardValidator, 'virgil/sdk/client/card_validator'
40
+ autoload :SearchCriteria, 'virgil/sdk/client/search_criteria'
41
+ autoload :RequestSigner, 'virgil/sdk/client/request_signer'
42
+ autoload :VirgilClient, 'virgil/sdk/client/virgil_client'
43
+ autoload :HTTP, 'virgil/sdk/client/http'
44
+ autoload :Requests, 'virgil/sdk/client/requests'
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,142 @@
1
+ # Copyright (C) 2016 Virgil Security Inc.
2
+ #
3
+ # Lead Maintainer: Virgil Security Inc. <support@virgilsecurity.com>
4
+ #
5
+ # All rights reserved.
6
+ #
7
+ # Redistribution and use in source and binary forms, with or without
8
+ # modification, are permitted provided that the following conditions are
9
+ # met:
10
+ #
11
+ # (1) Redistributions of source code must retain the above copyright
12
+ # notice, this list of conditions and the following disclaimer.
13
+ #
14
+ # (2) Redistributions in binary form must reproduce the above copyright
15
+ # notice, this list of conditions and the following disclaimer in
16
+ # the documentation and/or other materials provided with the
17
+ # distribution.
18
+ #
19
+ # (3) Neither the name of the copyright holder nor the names of its
20
+ # contributors may be used to endorse or promote products derived from
21
+ # this software without specific prior written permission.
22
+ #
23
+ # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR
24
+ # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26
+ # DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
27
+ # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28
+ # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29
+ # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30
+ # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
31
+ # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
32
+ # IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33
+ # POSSIBILITY OF SUCH DAMAGE.
34
+ require 'base64'
35
+ require 'json'
36
+ module Virgil
37
+ module SDK
38
+ module Client
39
+ # Model representing cards information.
40
+ Card = Struct.new(:id, :snapshot, :identity,
41
+ :identity_type, :public_key, :scope,
42
+ :data, :device, :device_name, :version,
43
+ :signatures, :validation_token) do
44
+
45
+ extend SignaturesBase64
46
+
47
+ def initialize(options)
48
+ self.id = options[:id]
49
+ self.snapshot = options[:snapshot]
50
+ self.identity = options[:identity]
51
+ self.identity_type = options[:identity_type]
52
+ self.public_key = options[:public_key]
53
+ self.scope = options[:scope]
54
+ self.data = options[:data] || {}
55
+ self.device = options[:device]
56
+ self.device_name = options[:device_name]
57
+ self.version = options[:version]
58
+ self.signatures = options[:signatures] || {}
59
+ end
60
+
61
+ # Create new Card from response containing json-encoded snapshot.
62
+ # Args:
63
+ # response: Cards service response containing base64 encoded content_snapshot.
64
+ # Returns:
65
+ # Card model restored from snapshot.
66
+ def self.from_response(response)
67
+ snapshot = Base64.decode64(response["content_snapshot"])
68
+ snapshot_model = JSON.parse(snapshot)
69
+ info = snapshot_model.fetch("info", {}) || {}
70
+
71
+ return new(
72
+ id: response["id"],
73
+ snapshot: snapshot,
74
+ identity: snapshot_model["identity"],
75
+ identity_type: snapshot_model["identity_type"],
76
+ public_key: Virgil::Crypto::Bytes.from_base64(
77
+ snapshot_model["public_key"]
78
+ ),
79
+ device: info["device"],
80
+ device_name: info["device_name"],
81
+ data: snapshot_model.fetch("data", {}),
82
+ scope: snapshot_model["scope"],
83
+ version: response["meta"]["card_version"],
84
+ signatures: response["meta"]["signs"]
85
+ )
86
+ end
87
+
88
+
89
+
90
+
91
+ def to_request
92
+ request = Virgil::SDK::Client::Requests::CreateCardRequest.new({})
93
+ request.restore(Crypto::Bytes.from_string(self.snapshot), self.signatures, validation_token)
94
+ request
95
+ end
96
+
97
+ def export
98
+ self.to_request.export
99
+ end
100
+
101
+
102
+ def self.from_request_model(request_model)
103
+ snapshot = Base64.decode64(request_model[:content_snapshot])
104
+ # if request_model[:content_snapshot].is_a?(Array)
105
+ # snapshot = Virgil::Crypto::Bytes.new(request_model[:content_snapshot]).to_s
106
+ # end
107
+
108
+ snapshot_model = JSON.parse(snapshot)
109
+ meta = request_model[:meta]
110
+ info = snapshot_model.fetch("info", {}) || {}
111
+ return new(
112
+ snapshot: snapshot,
113
+ identity: snapshot_model["identity"],
114
+ identity_type: snapshot_model["identity_type"],
115
+ public_key: Virgil::Crypto::Bytes.from_base64(
116
+ snapshot_model["public_key"]
117
+ ),
118
+ device: info["device"],
119
+ device_name: info["device_name"],
120
+ data: snapshot_model.fetch("data", {}),
121
+ scope: snapshot_model["scope"],
122
+ signatures: meta[:signs]
123
+ )
124
+ end
125
+
126
+
127
+ end
128
+
129
+ Card::APPLICATION = "application"
130
+ Card::GLOBAL = "global"
131
+
132
+
133
+
134
+
135
+ Card::SERVICE_URL = ENV["VIRGIL_SERVICE_URL"] || "https://ra.virgilsecurity.com"
136
+ Card::READ_ONLY_SERVICE_URL = ENV["VIRGIL_READ_ONLY_SERVICE_URL"] || "https://cards-ro.virgilsecurity.com"
137
+
138
+ Card::VRA_VERSION = "v1" # version of service, which creates and deletes local and global cards
139
+ Card::VC_VERSION = "v4" # version of service, which gets, searchs card
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,104 @@
1
+ # Copyright (C) 2016 Virgil Security Inc.
2
+ #
3
+ # Lead Maintainer: Virgil Security Inc. <support@virgilsecurity.com>
4
+ #
5
+ # All rights reserved.
6
+ #
7
+ # Redistribution and use in source and binary forms, with or without
8
+ # modification, are permitted provided that the following conditions are
9
+ # met:
10
+ #
11
+ # (1) Redistributions of source code must retain the above copyright
12
+ # notice, this list of conditions and the following disclaimer.
13
+ #
14
+ # (2) Redistributions in binary form must reproduce the above copyright
15
+ # notice, this list of conditions and the following disclaimer in
16
+ # the documentation and/or other materials provided with the
17
+ # distribution.
18
+ #
19
+ # (3) Neither the name of the copyright holder nor the names of its
20
+ # contributors may be used to endorse or promote products derived from
21
+ # this software without specific prior written permission.
22
+ #
23
+ # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR
24
+ # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26
+ # DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
27
+ # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28
+ # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29
+ # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30
+ # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
31
+ # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
32
+ # IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33
+ # POSSIBILITY OF SUCH DAMAGE.
34
+
35
+
36
+
37
+ module Virgil
38
+ module SDK
39
+ module Client
40
+ # Class used for cards signatures validation.
41
+ class CardValidator
42
+ SERVICE_CARD_ID =
43
+ '3e29d43373348cfb373b7eae189214dc01d7237765e572db685839b64adca853'
44
+ SERVICE_PUBLIC_KEY =
45
+ 'LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUNvd0JRWURLMlZ3QXlFQVlSNTAx'\
46
+ 'a1YxdFVuZTJ1T2RrdzRrRXJSUmJKcmMyU3lhejVWMWZ1RytyVnM9Ci0tLS0tRU5E'\
47
+ 'IFBVQkxJQyBLRVktLS0tLQo='
48
+
49
+ attr_reader :crypto, :verifiers
50
+
51
+ def initialize(crypto)
52
+ @crypto = crypto
53
+ @public_key_bytes = Crypto::Bytes.from_base64(SERVICE_PUBLIC_KEY)
54
+ @public_key = crypto.import_public_key(@public_key_bytes)
55
+ @verifiers = {
56
+ SERVICE_CARD_ID => @public_key
57
+ }
58
+ end
59
+
60
+ # Add signature verifier.
61
+ #
62
+ # Args:
63
+ # card_id: Card identifier
64
+ # public_key: Public key used for signature verification.
65
+ def add_verifier(card_id, public_key)
66
+ @verifiers[card_id] = public_key
67
+ end
68
+
69
+ # Validates Card using verifiers.
70
+ #
71
+ # Args:
72
+ # card: Card for validation.
73
+ # Returns:
74
+ # True if card signatures are valid, false otherwise.
75
+ def is_valid?(card)
76
+
77
+ return true if (card.version == '4.0' || card.version == '3.0')
78
+
79
+ fingerprint = self.crypto.calculate_fingerprint(
80
+ Crypto::Bytes.from_string(card.snapshot)
81
+ )
82
+ fingerprint_hex = fingerprint.to_hex
83
+ return false if fingerprint_hex != card.id
84
+
85
+ verifiers = self.verifiers.clone
86
+ card_public_key = self.crypto.import_public_key(card.public_key)
87
+ verifiers[fingerprint_hex] = card_public_key
88
+ verifiers.each do |id, key|
89
+ unless card.signatures.has_key?(id)
90
+ return false
91
+ end
92
+ is_valid = self.crypto.verify(
93
+ fingerprint.value,
94
+ Crypto::Bytes.from_base64(card.signatures[id]),
95
+ key
96
+ )
97
+ return false unless is_valid
98
+ end
99
+ true
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,45 @@
1
+ # Copyright (C) 2016 Virgil Security Inc.
2
+ #
3
+ # Lead Maintainer: Virgil Security Inc. <support@virgilsecurity.com>
4
+ #
5
+ # All rights reserved.
6
+ #
7
+ # Redistribution and use in source and binary forms, with or without
8
+ # modification, are permitted provided that the following conditions are
9
+ # met:
10
+ #
11
+ # (1) Redistributions of source code must retain the above copyright
12
+ # notice, this list of conditions and the following disclaimer.
13
+ #
14
+ # (2) Redistributions in binary form must reproduce the above copyright
15
+ # notice, this list of conditions and the following disclaimer in
16
+ # the documentation and/or other materials provided with the
17
+ # distribution.
18
+ #
19
+ # (3) Neither the name of the copyright holder nor the names of its
20
+ # contributors may be used to endorse or promote products derived from
21
+ # this software without specific prior written permission.
22
+ #
23
+ # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR
24
+ # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26
+ # DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
27
+ # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28
+ # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29
+ # SERVICES; LOSS OF USE, bytes, OR PROFITS; OR BUSINESS INTERRUPTION)
30
+ # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
31
+ # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
32
+ # IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33
+ # POSSIBILITY OF SUCH DAMAGE.
34
+ module Virgil
35
+ module SDK
36
+ module Client
37
+ module HTTP
38
+ autoload :Request, 'virgil/sdk/client/http/request'
39
+ autoload :BaseConnection, 'virgil/sdk/client/http/base_connection'
40
+ autoload :CardsServiceConnection,
41
+ 'virgil/sdk/client/http/cards_service_connection'
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,112 @@
1
+ # Copyright (C) 2016 Virgil Security Inc.
2
+ #
3
+ # Lead Maintainer: Virgil Security Inc. <support@virgilsecurity.com>
4
+ #
5
+ # All rights reserved.
6
+ #
7
+ # Redistribution and use in source and binary forms, with or without
8
+ # modification, are permitted provided that the following conditions are
9
+ # met:
10
+ #
11
+ # (1) Redistributions of source code must retain the above copyright
12
+ # notice, this list of conditions and the following disclaimer.
13
+ #
14
+ # (2) Redistributions in binary form must reproduce the above copyright
15
+ # notice, this list of conditions and the following disclaimer in
16
+ # the documentation and/or other materials provided with the
17
+ # distribution.
18
+ #
19
+ # (3) Neither the name of the copyright holder nor the names of its
20
+ # contributors may be used to endorse or promote products derived from
21
+ # this software without specific prior written permission.
22
+ #
23
+ # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR
24
+ # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26
+ # DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
27
+ # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28
+ # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29
+ # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30
+ # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
31
+ # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
32
+ # IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33
+ # POSSIBILITY OF SUCH DAMAGE.
34
+ require 'faraday'
35
+ require 'faraday_middleware'
36
+ require 'json'
37
+
38
+ module Virgil
39
+ module SDK
40
+ module Client
41
+ module HTTP
42
+ # Base API service connection class.
43
+ class BaseConnection
44
+ class ApiError < StandardError
45
+ end
46
+
47
+ ERRORS = {}
48
+
49
+ attr_accessor :access_token, :base_url
50
+
51
+ # Constructs new BaseConnection object.
52
+ def initialize(access_token, base_url)
53
+ self.access_token = access_token
54
+ self.base_url = base_url
55
+ end
56
+
57
+ # Sends http request to the endpoint.
58
+ #
59
+ # Args:
60
+ # request: HTTP::Request object containing sending request data.
61
+ #
62
+ # Returns:
63
+ # Deserialized ruby object from the json response.
64
+ #
65
+ # Raises:
66
+ # HTTPError with error message decoded from errors dictionary.
67
+ def send_request(request)
68
+ response = faraday_connection.run_request(
69
+ request.method,
70
+ request.endpoint,
71
+ request.body,
72
+ request.headers
73
+ )
74
+ return response.body if response.success?
75
+
76
+ raise ApiError.new(error_message(response))
77
+
78
+ end
79
+
80
+ private
81
+
82
+ def faraday_connection
83
+ @faraday_connection ||= Faraday.new(url: base_url) do |connection|
84
+ if access_token
85
+ connection.authorization :VIRGIL, access_token
86
+ end
87
+ connection.request :json
88
+ connection.response :json, :content_type => /\bjson$/
89
+ connection.response :follow_redirects
90
+ connection.adapter Faraday.default_adapter
91
+ end
92
+ end
93
+
94
+
95
+ def error_message(response)
96
+ error_message = nil
97
+ error_body = response.body
98
+ if error_body
99
+ error_body = JSON.parse(error_body) unless error_body.is_a? Hash
100
+ error_code = error_body['code'] ||
101
+ (error_body['error'] && error_body['error']['code'])
102
+ error_message = self.class::ERRORS[error_code] || error_code
103
+ end
104
+ # token = attempt.confirm(emailConfirmation)
105
+ error_message = "Error code is #{response.status}" unless error_message
106
+ error_message
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end