trusona 2.4.0 → 2.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
[![Build Status](https://travis-ci.com/
|
7
|
+
[![Build Status](https://travis-ci.com/trusona/trusona-server-sdk-ruby.svg?branch=master)](https://travis-ci.com/trusona/trusona-server-sdk-ruby)
|
8
8
|
[![Maintainability](https://api.codeclimate.com/v1/badges/ec9f4f928125c278fa39/maintainability)](https://codeclimate.com/github/trusona/trusona-server-sdk-ruby/maintainability)
|
9
9
|
[![Test Coverage](https://api.codeclimate.com/v1/badges/ec9f4f928125c278fa39/test_coverage)](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
|