virgil-sdk 4.2.3

Sign up to get free protection for your applications and to get access to all the features.
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