trusona 2.4.0 → 2.5.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
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/.travis.yml +9 -8
- data/README.md +2 -2
- data/lib/trusona.rb +3 -1
- data/lib/trusona/api/signed_request.rb +4 -1
- data/lib/trusona/api/verified_response.rb +6 -1
- data/lib/trusona/identity_document.rb +4 -4
- data/lib/trusona/mappers/base_mapper.rb +5 -0
- data/lib/trusona/mappers/paired_tru_code_mapper.rb +1 -0
- data/lib/trusona/resources/base_resource.rb +1 -1
- data/lib/trusona/resources/device_user_binding.rb +1 -0
- data/lib/trusona/resources/device_user_binding_activation.rb +2 -1
- data/lib/trusona/resources/identity_document.rb +4 -4
- data/lib/trusona/resources/paired_tru_code.rb +1 -0
- data/lib/trusona/resources/tru_code.rb +2 -1
- data/lib/trusona/resources/trusonafication.rb +14 -5
- data/lib/trusona/resources/user_account.rb +6 -2
- data/lib/trusona/resources/user_identifier.rb +3 -1
- data/lib/trusona/resources/validators.rb +1 -0
- data/lib/trusona/services/base_service.rb +9 -2
- data/lib/trusona/services/device_user_bindings_service.rb +3 -3
- data/lib/trusona/services/identity_documents_service.rb +3 -3
- data/lib/trusona/services/paired_tru_code_service.rb +1 -0
- data/lib/trusona/trusonafication.rb +27 -6
- data/lib/trusona/version.rb +1 -1
- data/lib/trusona/workers/device_finder.rb +1 -0
- data/lib/trusona/workers/identity_document_finder.rb +1 -0
- data/lib/trusona/workers/paired_tru_code_finder.rb +1 -0
- data/lib/trusona/workers/tru_code_finder.rb +1 -0
- data/lib/trusona/workers/trusonafication_canceler.rb +27 -0
- data/lib/trusona/workers/trusonafication_creator.rb +2 -1
- data/lib/trusona/workers/trusonafication_finder.rb +1 -1
- data/lib/trusona/workers/user_identifier_finder.rb +1 -0
- data/trusona.gemspec +1 -1
- metadata +8 -7
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 906506ed8d694fd61fe05897fa97ceaa465db24b0b08cdf2decb589d52b3410d
|
4
|
+
data.tar.gz: c3bb934222dc999e733b7aec5604bb047693b59be7114b980f72fd83d4f9c3a0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e164cf93f000014441c9bc56efd8ee6768013fedfd395b40356c5914616f724e61c64d12ffe23c232596754c26e279b0165a78acdde56ed8533ddc19f649bc3
|
7
|
+
data.tar.gz: ccc02437d947a00c9ec87c14474064bcc0dcee23df105796927f1b42141a9b68853dbd1201a8fe1ddcaf440f4e9165c4a700f38ce911b085c94af5dc22c53a0d
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/.travis.yml
CHANGED
@@ -1,21 +1,22 @@
|
|
1
|
-
sudo: false
|
2
1
|
language: ruby
|
3
2
|
cache:
|
4
3
|
- bundler
|
5
4
|
rvm:
|
6
|
-
- 2.4
|
7
|
-
- 2.5
|
5
|
+
- 2.4
|
6
|
+
- 2.5
|
7
|
+
- 2.6
|
8
|
+
- 2.7
|
8
9
|
before_script:
|
9
10
|
- openssl aes-256-cbc -K $encrypted_2ddff5084a28_key -iv $encrypted_2ddff5084a28_iv -in trusona.key.pem.enc -out trusona.key.pem -d
|
10
11
|
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
11
12
|
- chmod +x ./cc-test-reporter
|
12
13
|
- ./cc-test-reporter before-build
|
13
14
|
script:
|
14
|
-
- bundle exec rspec
|
15
|
-
- bundle exec rubocop lib
|
16
|
-
- gem build trusona.gemspec
|
15
|
+
- bundle exec rspec -f p
|
16
|
+
- bundle exec rubocop lib -F
|
17
|
+
- echo | bundle exec gem build trusona.gemspec
|
17
18
|
after_script:
|
18
|
-
- ./cc-test-reporter after-build --exit-code
|
19
|
+
- if [[ $TRAVIS_PULL_REQUEST == false ]] && [[ $TRAVIS_BRANCH == master ]] && [[ $TRAVIS_TEST_RESULT == 0 ]] && [[ $TRAVIS_JOB_NUMBER =~ ^.*.1$ ]]; then ./cc-test-reporter after-build -t simplecov --exit-code 0; fi
|
19
20
|
deploy:
|
20
21
|
provider: rubygems
|
21
22
|
api_key: $RUBYGEMS_API_KEY
|
@@ -24,7 +25,7 @@ deploy:
|
|
24
25
|
skip_cleanup: true
|
25
26
|
on:
|
26
27
|
tags: true
|
27
|
-
rvm: '2.
|
28
|
+
rvm: '2.6'
|
28
29
|
notifications:
|
29
30
|
slack:
|
30
31
|
on_success: always
|
data/README.md
CHANGED
@@ -4,7 +4,7 @@ Easily interact with the Trusona REST API.
|
|
4
4
|
|
5
5
|
## Current Status
|
6
6
|
|
7
|
-
[](https://travis-ci.com/trusona/trusona-server-sdk-ruby)
|
8
8
|
[](https://codeclimate.com/github/trusona/trusona-server-sdk-ruby/maintainability)
|
9
9
|
[](https://codeclimate.com/github/trusona/trusona-server-sdk-ruby/test_coverage)
|
10
10
|
|
@@ -171,7 +171,7 @@ Note that the custom fields are not used in the case that the Trusonafication is
|
|
171
171
|
| Prompt | `prompt` | N | Should the user be prompted to Accept or Reject this Trusonafication? Defaults to `true`. |
|
172
172
|
| Expiration | `expires_at` | N | The ISO-8601 UTC timestamp of the Trusonafication's expiration. Defaults to 90 seconds from creation. |
|
173
173
|
| Custom Fields | `custom_fields` | N | Arbitrary key-value data fields made available to the Trusonafication. Amount of data in the hash is limited to 1MB |
|
174
|
-
| Callback URL | `callback_url` | N |
|
174
|
+
| Callback URL | `callback_url` | N | A HTTPS URL to POST to when the trusonafication has been completed (accepted, rejected, or expired).<br><br> **NOTE:** The URL should include a randomized segment so it cannot be guessed and abused by third-parties e.g. https://your.domain.com/completed_authentications/f8abe61d-4e51-493f-97b1-464c157624f2. |
|
175
175
|
|
176
176
|
[^1]: You must provide at least one field that would allow Trusona to determine which user to authenticate. The identifier fields are `device_identifier`, `user_identifier`, `email`, and `trucode_id`.
|
177
177
|
|
data/lib/trusona.rb
CHANGED
@@ -32,6 +32,7 @@ require 'trusona/workers/device_user_binding_creator'
|
|
32
32
|
require 'trusona/workers/device_user_binding_activator'
|
33
33
|
require 'trusona/workers/trusonafication_creator'
|
34
34
|
require 'trusona/workers/trusonafication_finder'
|
35
|
+
require 'trusona/workers/trusonafication_canceler'
|
35
36
|
require 'trusona/workers/identity_document_finder'
|
36
37
|
require 'trusona/workers/device_finder'
|
37
38
|
require 'trusona/workers/user_deactivator'
|
@@ -118,6 +119,7 @@ module Trusona
|
|
118
119
|
end
|
119
120
|
|
120
121
|
raise Trusona::ConfigurationError unless @config
|
122
|
+
|
121
123
|
@config
|
122
124
|
end
|
123
125
|
|
@@ -136,7 +138,7 @@ module Trusona
|
|
136
138
|
attr_accessor :token, :secret
|
137
139
|
attr_reader :api_host
|
138
140
|
|
139
|
-
def initialize
|
141
|
+
def initialize
|
140
142
|
@api_host = 'api.trusona.net'
|
141
143
|
end
|
142
144
|
|
@@ -22,7 +22,7 @@ module Trusona
|
|
22
22
|
def headers
|
23
23
|
@headers.merge(
|
24
24
|
'x-date' => @date,
|
25
|
-
'Date'
|
25
|
+
'Date' => @date,
|
26
26
|
'X-Date' => @date,
|
27
27
|
'Authorization' => @signature,
|
28
28
|
'Content-Type' => determine_content_type
|
@@ -33,17 +33,20 @@ module Trusona
|
|
33
33
|
|
34
34
|
def determine_content_type
|
35
35
|
return '' if @method == 'GET' || @method == 'DELETE'
|
36
|
+
|
36
37
|
Trusona::Api::HTTPClient::CONTENT_TYPE
|
37
38
|
end
|
38
39
|
|
39
40
|
def build_path(path)
|
40
41
|
return path if @uri.query.nil? || @uri.query.empty?
|
42
|
+
|
41
43
|
[@uri.path, @uri.query].join('?')
|
42
44
|
end
|
43
45
|
|
44
46
|
def build_uri(path, body)
|
45
47
|
return build_uri_with_query(URI(path)) if URI(path).query
|
46
48
|
return build_uri_with_body_as_query(path, body) if valid_hash_body(body)
|
49
|
+
|
47
50
|
URI::HTTPS.build(host: @host, path: path)
|
48
51
|
end
|
49
52
|
|
@@ -15,7 +15,9 @@ module Trusona
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def to_h
|
18
|
-
JSON.parse(@unverified.body)
|
18
|
+
JSON.parse(@unverified.body)
|
19
|
+
rescue StandardError
|
20
|
+
{}
|
19
21
|
end
|
20
22
|
|
21
23
|
def verified?
|
@@ -50,6 +52,7 @@ module Trusona
|
|
50
52
|
|
51
53
|
def parse_path(uri)
|
52
54
|
return uri.path unless uri.query
|
55
|
+
|
53
56
|
[uri.path, uri.query].join('?')
|
54
57
|
end
|
55
58
|
|
@@ -61,6 +64,7 @@ module Trusona
|
|
61
64
|
server = @unverified.headers['server']
|
62
65
|
response_type = @unverified.headers['Content-Type']
|
63
66
|
return response_type unless server == LEGACY_SERVER_HEADER
|
67
|
+
|
64
68
|
determine_request_content_type
|
65
69
|
end
|
66
70
|
|
@@ -69,6 +73,7 @@ module Trusona
|
|
69
73
|
return default_type unless @unverified.request
|
70
74
|
return default_type unless @unverified.request.options
|
71
75
|
return default_type unless @unverified.request.options[:headers]
|
76
|
+
|
72
77
|
@unverified.request.options[:headers]['Content-Type']
|
73
78
|
end
|
74
79
|
|
@@ -28,10 +28,10 @@ module Trusona
|
|
28
28
|
#
|
29
29
|
|
30
30
|
def self.all(user_identifier: nil)
|
31
|
-
# rubocop:disable
|
31
|
+
# rubocop:disable Layout/LineLength
|
32
32
|
raise ArgumentError, 'A user identifier is required.' unless user_identifier
|
33
33
|
|
34
|
-
# rubocop:enable
|
34
|
+
# rubocop:enable Layout/LineLength
|
35
35
|
|
36
36
|
Trusona::Workers::IdentityDocumentFinder.new.find_all(user_identifier)
|
37
37
|
end
|
@@ -55,10 +55,10 @@ module Trusona
|
|
55
55
|
# Trusona::IdentityDocument.find('4FDF044D-89FB-4043-947D-A029CF785B5F')
|
56
56
|
#
|
57
57
|
def self.find(id: nil)
|
58
|
-
# rubocop:disable
|
58
|
+
# rubocop:disable Layout/LineLength
|
59
59
|
raise ArgumentError, 'An Identity Document identifier is required.' unless id
|
60
60
|
|
61
|
-
# rubocop:enable
|
61
|
+
# rubocop:enable Layout/LineLength
|
62
62
|
|
63
63
|
Trusona::Workers::IdentityDocumentFinder.new.find(id)
|
64
64
|
end
|
@@ -27,6 +27,7 @@ module Trusona
|
|
27
27
|
|
28
28
|
def map_item(item, existing)
|
29
29
|
return nil if item.nil? || item.empty?
|
30
|
+
|
30
31
|
item = normalize_keys(item)
|
31
32
|
item = merge_existing_state(item, existing.to_h)
|
32
33
|
item = map_custom_fields(item)
|
@@ -40,6 +41,7 @@ module Trusona
|
|
40
41
|
|
41
42
|
def map_custom_fields(response)
|
42
43
|
return response if custom_mappings.nil? || custom_mappings.empty?
|
44
|
+
|
43
45
|
custom_mappings.each do |original_key, new_key|
|
44
46
|
value = response.delete(original_key)
|
45
47
|
response[new_key] = value
|
@@ -51,17 +53,20 @@ module Trusona
|
|
51
53
|
def response_invalid?(response)
|
52
54
|
return true if response.nil?
|
53
55
|
return true unless response.respond_to?(:to_h)
|
56
|
+
|
54
57
|
false
|
55
58
|
end
|
56
59
|
|
57
60
|
def resource_invalid?(resource)
|
58
61
|
return true if resource.nil?
|
59
62
|
return true unless resource.respond_to?(:new)
|
63
|
+
|
60
64
|
false
|
61
65
|
end
|
62
66
|
|
63
67
|
def existing_invalid?(existing)
|
64
68
|
return true unless existing.respond_to?(:to_h)
|
69
|
+
|
65
70
|
false
|
66
71
|
end
|
67
72
|
end
|
@@ -11,7 +11,7 @@ module Trusona
|
|
11
11
|
|
12
12
|
def initialize(params = {})
|
13
13
|
normalized_params = normalize_keys(params)
|
14
|
-
@id
|
14
|
+
@id = normalized_params[:id]
|
15
15
|
@active = normalized_params[:active]
|
16
16
|
|
17
17
|
@params = normalized_params
|
@@ -20,6 +20,7 @@ module Trusona
|
|
20
20
|
|
21
21
|
def validate
|
22
22
|
return false unless @id
|
23
|
+
|
23
24
|
true
|
24
25
|
end
|
25
26
|
end
|
@@ -15,14 +15,14 @@ module Trusona
|
|
15
15
|
normalized = normalize_keys(params)
|
16
16
|
|
17
17
|
@params = normalized
|
18
|
-
@document_hash
|
19
|
-
@id
|
20
|
-
@type
|
18
|
+
@document_hash = normalized[:document_hash]
|
19
|
+
@id = normalized[:id]
|
20
|
+
@type = normalized[:type]
|
21
21
|
@verification_status = normalized[:verification_status]
|
22
22
|
@user_identifier = normalized[:user_identifier]
|
23
23
|
end
|
24
24
|
|
25
|
-
def to_json
|
25
|
+
def to_json(*_args)
|
26
26
|
JSON(
|
27
27
|
hash: @document_hash,
|
28
28
|
id: @id,
|
@@ -19,7 +19,7 @@ module Trusona
|
|
19
19
|
raise ArgumentError unless validate
|
20
20
|
end
|
21
21
|
|
22
|
-
def to_json
|
22
|
+
def to_json(*_args)
|
23
23
|
JSON(to_h)
|
24
24
|
end
|
25
25
|
|
@@ -35,6 +35,7 @@ module Trusona
|
|
35
35
|
|
36
36
|
def validate
|
37
37
|
return false unless present?(@relying_party_id)
|
38
|
+
|
38
39
|
true
|
39
40
|
end
|
40
41
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rubocop:disable Metrics/ClassLength
|
3
4
|
module Trusona
|
4
5
|
module Resources
|
5
6
|
##
|
@@ -18,6 +19,7 @@ module Trusona
|
|
18
19
|
def initialize(params = {})
|
19
20
|
@params = normalize_keys(params)
|
20
21
|
return if @params.nil?
|
22
|
+
|
21
23
|
self.accepted_level = determine_accepted_level(@params)
|
22
24
|
self.action = @params[:action]
|
23
25
|
self.device_identifier = @params[:device_identifier]
|
@@ -44,7 +46,8 @@ module Trusona
|
|
44
46
|
end
|
45
47
|
|
46
48
|
# rubocop:disable Metrics/MethodLength
|
47
|
-
|
49
|
+
# rubocop:disable Metrics/AbcSize
|
50
|
+
def to_json(*_args)
|
48
51
|
JSON(
|
49
52
|
device_identifier: device_identifier,
|
50
53
|
user_identifier: user_identifier,
|
@@ -64,10 +67,12 @@ module Trusona
|
|
64
67
|
)
|
65
68
|
end
|
66
69
|
# rubocop:enable Metrics/MethodLength
|
70
|
+
# rubocop:enable Metrics/AbcSize
|
67
71
|
|
68
72
|
def accepted?
|
69
73
|
return true if status == :accepted
|
70
74
|
return true if status == :accepted_at_higher_level
|
75
|
+
|
71
76
|
false
|
72
77
|
end
|
73
78
|
|
@@ -79,8 +84,8 @@ module Trusona
|
|
79
84
|
attributes_present && attributes_filled
|
80
85
|
end
|
81
86
|
|
82
|
-
# rubocop:disable MethodLength
|
83
|
-
# rubocop:disable CyclomaticComplexity
|
87
|
+
# rubocop:disable Metrics/MethodLength
|
88
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
84
89
|
def status
|
85
90
|
case @status
|
86
91
|
when 'INVALID_TRUSONA_ID'
|
@@ -103,14 +108,15 @@ module Trusona
|
|
103
108
|
:invalid
|
104
109
|
end
|
105
110
|
end
|
106
|
-
# rubocop:enable CyclomaticComplexity
|
107
|
-
# rubocop:enable MethodLength
|
111
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
112
|
+
# rubocop:enable Metrics/MethodLength
|
108
113
|
|
109
114
|
private
|
110
115
|
|
111
116
|
def defaulting_to(value, param)
|
112
117
|
return value if param.nil?
|
113
118
|
return value if param.respond_to?(:empty?) && param.empty?
|
119
|
+
|
114
120
|
param
|
115
121
|
end
|
116
122
|
|
@@ -135,9 +141,12 @@ module Trusona
|
|
135
141
|
true
|
136
142
|
end
|
137
143
|
|
144
|
+
# rubocop:disable Layout/LineLength
|
138
145
|
def identifier
|
139
146
|
device_identifier || user_identifier || trucode_id || trusona_id || email
|
140
147
|
end
|
148
|
+
# rubocop:enable Layout/LineLength
|
141
149
|
end
|
142
150
|
end
|
143
151
|
end
|
152
|
+
# rubocop:enable Metrics/ClassLength
|
@@ -38,12 +38,12 @@ module Trusona
|
|
38
38
|
@emails = parse_emails(params_with_symbol_keys[:emails])
|
39
39
|
@max_level = parse_max_level(params_with_symbol_keys[:metadata])
|
40
40
|
|
41
|
-
@params
|
41
|
+
@params = params_with_symbol_keys
|
42
42
|
end
|
43
43
|
# rubocop:enable Metrics/MethodLength
|
44
44
|
# rubocop:enable Metrics/AbcSize
|
45
45
|
|
46
|
-
def to_json
|
46
|
+
def to_json(*_args)
|
47
47
|
JSON(to_h)
|
48
48
|
end
|
49
49
|
|
@@ -52,20 +52,24 @@ module Trusona
|
|
52
52
|
def determine_status(status)
|
53
53
|
return Status::INACTIVE if status == 'inactive'
|
54
54
|
return Status::ACTIVE if status == 'active'
|
55
|
+
|
55
56
|
Status::UNKNOWN
|
56
57
|
end
|
57
58
|
|
58
59
|
def parse_emails(emails)
|
59
60
|
return [] if emails.nil? || emails.empty?
|
61
|
+
|
60
62
|
emails.map { |e| UserAccountEmail.new(e) }
|
61
63
|
end
|
62
64
|
|
63
65
|
def parse_max_level(metadata)
|
64
66
|
return Level::ENTRY unless metadata
|
67
|
+
|
65
68
|
level = metadata['max_level'] || metadata[:max_level]
|
66
69
|
|
67
70
|
return Level::ESSENTIAL if level == 'essential'
|
68
71
|
return Level::EXECUTIVE if level == 'executive'
|
72
|
+
|
69
73
|
Level::ENTRY
|
70
74
|
end
|
71
75
|
|
@@ -19,7 +19,7 @@ module Trusona
|
|
19
19
|
@params
|
20
20
|
end
|
21
21
|
|
22
|
-
def to_json
|
22
|
+
def to_json(*_args)
|
23
23
|
JSON(to_h)
|
24
24
|
end
|
25
25
|
|
@@ -36,12 +36,14 @@ module Trusona
|
|
36
36
|
def attributes_present
|
37
37
|
return false unless @params.key?(:identifier)
|
38
38
|
return false unless @params.key?(:trusona_id)
|
39
|
+
|
39
40
|
true
|
40
41
|
end
|
41
42
|
|
42
43
|
def attributes_filled
|
43
44
|
return false if @params.fetch(:identifier).empty?
|
44
45
|
return false if @params.fetch(:trusona_id).empty?
|
46
|
+
|
45
47
|
true
|
46
48
|
end
|
47
49
|
end
|
@@ -21,21 +21,25 @@ module Trusona
|
|
21
21
|
|
22
22
|
def get(resource)
|
23
23
|
raise Trusona::InvalidResourceError unless resource.id
|
24
|
+
|
24
25
|
handle(@client.get(member_path(resource)), resource)
|
25
26
|
end
|
26
27
|
|
27
28
|
def create(resource)
|
28
29
|
raise Trusona::InvalidResourceError unless resource.valid?
|
30
|
+
|
29
31
|
handle(@client.post(collection_path, resource.to_json), resource)
|
30
32
|
end
|
31
33
|
|
32
34
|
def update(resource)
|
33
35
|
raise Trusona::InvalidResourceError unless resource.id
|
36
|
+
|
34
37
|
handle(@client.patch(member_path(resource), resource.to_json), resource)
|
35
38
|
end
|
36
39
|
|
37
40
|
def delete(resource)
|
38
41
|
raise Trusona::InvalidResourceError unless resource.id
|
42
|
+
|
39
43
|
handle(@client.delete(member_path(resource)), resource)
|
40
44
|
end
|
41
45
|
|
@@ -53,12 +57,13 @@ module Trusona
|
|
53
57
|
raise Trusona::SigningError unless response.verified?
|
54
58
|
end
|
55
59
|
|
56
|
-
# rubocop:disable MethodLength
|
60
|
+
# rubocop:disable Metrics/MethodLength
|
57
61
|
# rubocop:disable Metrics/CyclomaticComplexity
|
58
62
|
def handle(response, resource = {})
|
59
63
|
@response = response
|
60
64
|
|
61
65
|
raise if resource.nil?
|
66
|
+
|
62
67
|
case response.code
|
63
68
|
when 200..299
|
64
69
|
success(response, resource)
|
@@ -78,7 +83,7 @@ module Trusona
|
|
78
83
|
raise Trusona::RequestError, readable_error
|
79
84
|
end
|
80
85
|
end
|
81
|
-
# rubocop:enable MethodLength
|
86
|
+
# rubocop:enable Metrics/MethodLength
|
82
87
|
# rubocop:enable Metrics/CyclomaticComplexity
|
83
88
|
|
84
89
|
def success(response, resource)
|
@@ -113,10 +118,12 @@ module Trusona
|
|
113
118
|
def readable_error
|
114
119
|
default = '[UNKNOWN] Error - An unknown error has occurred.'
|
115
120
|
return default unless @response
|
121
|
+
|
116
122
|
body = @response.to_h
|
117
123
|
msg = []
|
118
124
|
msg << "[#{body['error']}] #{body['message']} - #{body['description']}"
|
119
125
|
return msg.join("\n") unless body['field_errors']
|
126
|
+
|
120
127
|
body['field_errors'].each do |field|
|
121
128
|
msg << "\t #{field.join(' => ')}"
|
122
129
|
end
|
@@ -6,9 +6,9 @@ module Trusona
|
|
6
6
|
## Device User Bindings Service
|
7
7
|
class DeviceUserBindingsService < BaseService
|
8
8
|
def initialize(
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
client: Trusona::Api::HTTPClient.new(Trusona.config.api_host),
|
10
|
+
mapper: Trusona::Mappers::DeviceUserBindingMapper.new
|
11
|
+
)
|
12
12
|
@client = client
|
13
13
|
@mapper = mapper
|
14
14
|
@resource_path = '/api/v2/user_devices'
|
@@ -6,9 +6,9 @@ module Trusona
|
|
6
6
|
## Identity Documents Service
|
7
7
|
class IdentityDocumentsService < BaseService
|
8
8
|
def initialize(
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
client: Trusona::Api::HTTPClient.new(Trusona.config.api_host),
|
10
|
+
mapper: Trusona::Mappers::IdentityDocumentMapper.new
|
11
|
+
)
|
12
12
|
@client = client
|
13
13
|
@mapper = mapper
|
14
14
|
@resource_path = '/api/v2/identity_documents'
|
@@ -28,6 +28,29 @@ module Trusona
|
|
28
28
|
Trusona::Workers::TrusonaficationFinder.new.find(trusonafication_id)
|
29
29
|
end
|
30
30
|
|
31
|
+
##
|
32
|
+
# Cancels existing IN_PROGRESS Trusonafications using their ID. Once
|
33
|
+
# canceled the trusonafication can no longer be acted upon.
|
34
|
+
#
|
35
|
+
# @param trusonafication_id [String] the ID of an existing Trusonafication
|
36
|
+
# @raise [Trusona::InvalidRecordIdentifier] if the +trusonafication_id+ is
|
37
|
+
# empty or nil.
|
38
|
+
# @raise [Trusona::ResourceNotFoundError] if the resource does not exist
|
39
|
+
# in the Trusona API
|
40
|
+
# @raise [Trusona::UnprocessableEntityError] if the resource could not be
|
41
|
+
# cancel because it was not IN_PROGRESS
|
42
|
+
#
|
43
|
+
# @example
|
44
|
+
# Trusona::Trusonafication.cancel('756c1034-2159-4cf9-bd48-662a60a7afff')
|
45
|
+
#
|
46
|
+
def self.cancel(trusonafication_id)
|
47
|
+
if trusonafication_id.nil? || trusonafication_id.strip.empty?
|
48
|
+
raise Trusona::InvalidRecordIdentifier, 'Trusonafication ID is missing'
|
49
|
+
end
|
50
|
+
|
51
|
+
Trusona::Workers::TrusonaficationCanceler.new.cancel(trusonafication_id)
|
52
|
+
end
|
53
|
+
|
31
54
|
##
|
32
55
|
# Creates a Trusonafication using the supplied options
|
33
56
|
#
|
@@ -58,14 +81,12 @@ module Trusona
|
|
58
81
|
# @option params [Hash] :custom_fields Optional data to be associated with
|
59
82
|
# this Trusonafication and can be used to constomize any UX elements. Total
|
60
83
|
# size of data is limited to 1MB.
|
61
|
-
# @option params [String] :callback_url
|
62
|
-
# trusonafication has been completed (accepted, rejected, or expired).
|
63
|
-
# request will be a POST and the body will be the same JSON format as
|
64
|
-
# sending a GET request to /api/v2/trusonafications/{id}.
|
84
|
+
# @option params [String] :callback_url A HTTPS URL to POST to call when the
|
85
|
+
# trusonafication has been completed (accepted, rejected, or expired).
|
65
86
|
#
|
66
87
|
# NOTE: The URL should include a randomized segment so it cannot be guessed
|
67
|
-
# and abused by third-parties
|
68
|
-
#
|
88
|
+
# and abused by third-parties e.g. https://your.domain.com/completed_authentications/f8abe61d-4e51-493f-97b1-464c157624f2.
|
89
|
+
#
|
69
90
|
# @param timeout [Int] (30) The max amount of time, in seconds, to wait
|
70
91
|
# for a response from the Trusona API when polling for a Trusonafication
|
71
92
|
# result
|
data/lib/trusona/version.rb
CHANGED
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Trusona
|
4
|
+
module Workers
|
5
|
+
#
|
6
|
+
## Cancel a Trusonafication
|
7
|
+
class TrusonaficationCanceler
|
8
|
+
def initialize(service: nil)
|
9
|
+
@service = service || Trusona::Services::TrusonaficationService.new
|
10
|
+
end
|
11
|
+
|
12
|
+
def cancel(trusonafication_id)
|
13
|
+
if trusonafication_id.nil? || trusonafication_id.strip.empty?
|
14
|
+
raise(
|
15
|
+
Trusona::InvalidResourceError,
|
16
|
+
'Trusonafication Id cannot be empty or nil'
|
17
|
+
)
|
18
|
+
end
|
19
|
+
|
20
|
+
resource = Trusona::Resources::Trusonafication.new(
|
21
|
+
id: trusonafication_id
|
22
|
+
)
|
23
|
+
@service.delete(resource)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -14,6 +14,7 @@ module Trusona
|
|
14
14
|
def create(params: {}, timeout: nil, &block)
|
15
15
|
raise ArgumentError, 'Missing or empty params hash' if
|
16
16
|
params.nil? || params.empty?
|
17
|
+
|
17
18
|
resource = Trusona::Resources::Trusonafication.new(params)
|
18
19
|
trusonafication = @service.create(resource)
|
19
20
|
return trusonafication unless block_given?
|
@@ -43,4 +44,4 @@ module Trusona
|
|
43
44
|
# rubocop:enable Metrics/MethodLength
|
44
45
|
end
|
45
46
|
end
|
46
|
-
end
|
47
|
+
end
|
data/trusona.gemspec
CHANGED
@@ -39,7 +39,7 @@ Gem::Specification.new do |spec|
|
|
39
39
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
40
40
|
spec.add_development_dependency 'rspec-wait', '~> 0.0'
|
41
41
|
spec.add_development_dependency 'rubocop', '~> 0.49'
|
42
|
-
spec.add_development_dependency 'simplecov', '
|
42
|
+
spec.add_development_dependency 'simplecov', '0.17'
|
43
43
|
spec.add_development_dependency 'yard', '~> 0.9'
|
44
44
|
spec.add_development_dependency 'webmock', '~> 3.5'
|
45
45
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trusona
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Trusona
|
@@ -43,7 +43,7 @@ cert_chain:
|
|
43
43
|
++bYzfdt4k2vDjnMpWjx4gb0LFsLOGKsPlw9TBgCDqu96KTAbSnHh/9GIkGn76Kw
|
44
44
|
eNCk84I=
|
45
45
|
-----END CERTIFICATE-----
|
46
|
-
date:
|
46
|
+
date: 2020-02-04 00:00:00.000000000 Z
|
47
47
|
dependencies:
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: httparty
|
@@ -217,16 +217,16 @@ dependencies:
|
|
217
217
|
name: simplecov
|
218
218
|
requirement: !ruby/object:Gem::Requirement
|
219
219
|
requirements:
|
220
|
-
- -
|
220
|
+
- - '='
|
221
221
|
- !ruby/object:Gem::Version
|
222
|
-
version: '0.
|
222
|
+
version: '0.17'
|
223
223
|
type: :development
|
224
224
|
prerelease: false
|
225
225
|
version_requirements: !ruby/object:Gem::Requirement
|
226
226
|
requirements:
|
227
|
-
- -
|
227
|
+
- - '='
|
228
228
|
- !ruby/object:Gem::Version
|
229
|
-
version: '0.
|
229
|
+
version: '0.17'
|
230
230
|
- !ruby/object:Gem::Dependency
|
231
231
|
name: yard
|
232
232
|
requirement: !ruby/object:Gem::Requirement
|
@@ -346,6 +346,7 @@ files:
|
|
346
346
|
- lib/trusona/workers/paired_tru_code_finder.rb
|
347
347
|
- lib/trusona/workers/tru_code_creator.rb
|
348
348
|
- lib/trusona/workers/tru_code_finder.rb
|
349
|
+
- lib/trusona/workers/trusonafication_canceler.rb
|
349
350
|
- lib/trusona/workers/trusonafication_creator.rb
|
350
351
|
- lib/trusona/workers/trusonafication_finder.rb
|
351
352
|
- lib/trusona/workers/user_account_finder.rb
|
@@ -375,7 +376,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
375
376
|
version: '0'
|
376
377
|
requirements: []
|
377
378
|
rubyforge_project:
|
378
|
-
rubygems_version: 2.
|
379
|
+
rubygems_version: 2.7.7
|
379
380
|
signing_key:
|
380
381
|
specification_version: 4
|
381
382
|
summary: Trusona REST API wrapper
|
metadata.gz.sig
CHANGED
Binary file
|