yoti 1.9.0 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/lib/yoti.rb +9 -0
- data/lib/yoti/activity_details.rb +3 -5
- data/lib/yoti/configuration.rb +1 -1
- data/lib/yoti/data_type/document_details.rb +1 -1
- data/lib/yoti/data_type/image.rb +1 -1
- data/lib/yoti/data_type/media.rb +3 -0
- data/lib/yoti/doc_scan/client.rb +6 -2
- data/lib/yoti/doc_scan/constants.rb +4 -0
- data/lib/yoti/doc_scan/session/create/document_filter.rb +1 -1
- data/lib/yoti/doc_scan/session/create/objective/objective.rb +31 -0
- data/lib/yoti/doc_scan/session/create/objective/proof_of_address_objective.rb +31 -0
- data/lib/yoti/doc_scan/session/create/requested_check.rb +1 -1
- data/lib/yoti/doc_scan/session/create/requested_supplementary_doc_text_extraction_task.rb +94 -0
- data/lib/yoti/doc_scan/session/create/requested_task.rb +1 -1
- data/lib/yoti/doc_scan/session/create/required_document.rb +1 -1
- data/lib/yoti/doc_scan/session/create/required_supplementary_document.rb +90 -0
- data/lib/yoti/doc_scan/session/retrieve/file_response.rb +21 -0
- data/lib/yoti/doc_scan/session/retrieve/generated_supplementary_document_text_data_check_response.rb +12 -0
- data/lib/yoti/doc_scan/session/retrieve/get_session_result.rb +18 -0
- data/lib/yoti/doc_scan/session/retrieve/page_response.rb +10 -0
- data/lib/yoti/doc_scan/session/retrieve/resource_container.rb +25 -6
- data/lib/yoti/doc_scan/session/retrieve/resource_response.rb +2 -0
- data/lib/yoti/doc_scan/session/retrieve/supplementary_document_resource_response.rb +57 -0
- data/lib/yoti/doc_scan/session/retrieve/supplementary_document_text_data_check_response.rb +12 -0
- data/lib/yoti/doc_scan/session/retrieve/supplementary_document_text_extraction_task_response.rb +18 -0
- data/lib/yoti/doc_scan/session/retrieve/task_response.rb +2 -0
- data/lib/yoti/dynamic_share_service/dynamic_scenario.rb +5 -0
- data/lib/yoti/dynamic_share_service/extension/extension.rb +3 -0
- data/lib/yoti/dynamic_share_service/extension/location_constraint_extension.rb +3 -0
- data/lib/yoti/dynamic_share_service/extension/transactional_flow_extension.rb +4 -0
- data/lib/yoti/dynamic_share_service/policy/dynamic_policy.rb +3 -0
- data/lib/yoti/dynamic_share_service/policy/wanted_anchor.rb +3 -0
- data/lib/yoti/dynamic_share_service/policy/wanted_attribute.rb +5 -0
- data/lib/yoti/http/request.rb +1 -1
- data/lib/yoti/http/signed_request.rb +1 -1
- data/lib/yoti/protobuf/main.rb +8 -8
- data/lib/yoti/share/attribute_issuance_details.rb +6 -0
- data/lib/yoti/ssl.rb +2 -2
- data/lib/yoti/util/age_processor.rb +1 -1
- data/lib/yoti/util/anchor_processor.rb +1 -1
- data/lib/yoti/util/log.rb +1 -1
- data/lib/yoti/version.rb +1 -1
- metadata +11 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 76c473c29aaa7900698cd353fd4efbadf1d58e2e71e02e5ab13671a0da360334
|
4
|
+
data.tar.gz: 542da906f9709554119c66fa81d0b2629ab0c783f9412c70c4fa754330cc2199
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c3fa9ca3fbe4953ca94543bac7bf5edb663b751065bdb8395f963274302c6290be51c45baa2c90a5094b9b7efb15f90c2e5b8af17531ecf25dd6b64691b3079d
|
7
|
+
data.tar.gz: dd28ffbcdfa70f9d9b4ccc95163582c41a2113189376912e68f3bd622b95931465f9ef68788b7ead2f4841240144811207bd6f1ca0df64ff011cb78c2d9fe9c9
|
data/Gemfile
CHANGED
data/lib/yoti.rb
CHANGED
@@ -61,11 +61,15 @@ require_relative 'yoti/doc_scan/session/create/requested_face_match_check'
|
|
61
61
|
require_relative 'yoti/doc_scan/session/create/requested_liveness_check'
|
62
62
|
require_relative 'yoti/doc_scan/session/create/requested_task'
|
63
63
|
require_relative 'yoti/doc_scan/session/create/requested_text_extraction_task'
|
64
|
+
require_relative 'yoti/doc_scan/session/create/requested_supplementary_doc_text_extraction_task'
|
65
|
+
require_relative 'yoti/doc_scan/session/create/objective/objective'
|
66
|
+
require_relative 'yoti/doc_scan/session/create/objective/proof_of_address_objective'
|
64
67
|
require_relative 'yoti/doc_scan/session/create/document_filter'
|
65
68
|
require_relative 'yoti/doc_scan/session/create/document_restrictions_filter'
|
66
69
|
require_relative 'yoti/doc_scan/session/create/orthogonal_restrictions_filter'
|
67
70
|
require_relative 'yoti/doc_scan/session/create/required_document'
|
68
71
|
require_relative 'yoti/doc_scan/session/create/required_id_document'
|
72
|
+
require_relative 'yoti/doc_scan/session/create/required_supplementary_document'
|
69
73
|
require_relative 'yoti/doc_scan/session/create/sdk_config'
|
70
74
|
require_relative 'yoti/doc_scan/session/create/notification_config'
|
71
75
|
require_relative 'yoti/doc_scan/session/create/session_specification'
|
@@ -80,12 +84,15 @@ require_relative 'yoti/doc_scan/session/retrieve/document_fields_response'
|
|
80
84
|
require_relative 'yoti/doc_scan/session/retrieve/document_id_photo_response'
|
81
85
|
require_relative 'yoti/doc_scan/session/retrieve/face_map_response'
|
82
86
|
require_relative 'yoti/doc_scan/session/retrieve/face_match_check_response'
|
87
|
+
require_relative 'yoti/doc_scan/session/retrieve/file_response'
|
83
88
|
require_relative 'yoti/doc_scan/session/retrieve/frame_response'
|
84
89
|
require_relative 'yoti/doc_scan/session/retrieve/generated_check_response'
|
85
90
|
require_relative 'yoti/doc_scan/session/retrieve/generated_media'
|
86
91
|
require_relative 'yoti/doc_scan/session/retrieve/generated_text_data_check_response'
|
92
|
+
require_relative 'yoti/doc_scan/session/retrieve/generated_supplementary_document_text_data_check_response'
|
87
93
|
require_relative 'yoti/doc_scan/session/retrieve/get_session_result'
|
88
94
|
require_relative 'yoti/doc_scan/session/retrieve/id_document_resource_response'
|
95
|
+
require_relative 'yoti/doc_scan/session/retrieve/supplementary_document_resource_response'
|
89
96
|
require_relative 'yoti/doc_scan/session/retrieve/liveness_check_response'
|
90
97
|
require_relative 'yoti/doc_scan/session/retrieve/liveness_resource_response'
|
91
98
|
require_relative 'yoti/doc_scan/session/retrieve/media_response'
|
@@ -97,6 +104,8 @@ require_relative 'yoti/doc_scan/session/retrieve/task_response'
|
|
97
104
|
require_relative 'yoti/doc_scan/session/retrieve/text_data_check_response'
|
98
105
|
require_relative 'yoti/doc_scan/session/retrieve/text_extraction_task_response'
|
99
106
|
require_relative 'yoti/doc_scan/session/retrieve/zoom_liveness_resource_response'
|
107
|
+
require_relative 'yoti/doc_scan/session/retrieve/supplementary_document_text_data_check_response'
|
108
|
+
require_relative 'yoti/doc_scan/session/retrieve/supplementary_document_text_extraction_task_response'
|
100
109
|
|
101
110
|
require_relative 'yoti/doc_scan/support/supported_documents'
|
102
111
|
|
@@ -61,7 +61,7 @@ module Yoti
|
|
61
61
|
#
|
62
62
|
# The age under/over attribute
|
63
63
|
#
|
64
|
-
# @deprecated 2.0.0 - replaced by:
|
64
|
+
# @deprecated will be removed in 2.0.0 - replaced by:
|
65
65
|
# - Yoti::Profile#age_verifications
|
66
66
|
# - Yoti::Profile#find_age_over_verification
|
67
67
|
# - Yoti::Profile#find_age_under_verification
|
@@ -108,9 +108,7 @@ module Yoti
|
|
108
108
|
@extended_user_profile = process_decrypted_profile(decrypted_profile)
|
109
109
|
@extended_application_profile = process_decrypted_profile(decrypted_application_profile)
|
110
110
|
@extra_data = extra_data
|
111
|
-
@user_profile = @extended_user_profile.
|
112
|
-
[name, attribute.value]
|
113
|
-
end.to_h
|
111
|
+
@user_profile = @extended_user_profile.transform_values(&:value)
|
114
112
|
end
|
115
113
|
|
116
114
|
#
|
@@ -195,7 +193,7 @@ module Yoti
|
|
195
193
|
#
|
196
194
|
# Processes age verification
|
197
195
|
#
|
198
|
-
# @deprecated 2.0.0
|
196
|
+
# @deprecated will be removed in 2.0.0
|
199
197
|
#
|
200
198
|
# @param [Yoti::Protobuf::Attrpubapi::Attribute] attribute
|
201
199
|
#
|
data/lib/yoti/configuration.rb
CHANGED
@@ -56,7 +56,7 @@ module Yoti
|
|
56
56
|
|
57
57
|
return if valid.any?
|
58
58
|
|
59
|
-
config_list = required_configs.map { |conf|
|
59
|
+
config_list = required_configs.map { |conf| "`#{conf}`" }.join(', ')
|
60
60
|
message = "At least one of the configuration values has to be set: #{config_list}."
|
61
61
|
raise ConfigurationError, message
|
62
62
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Yoti
|
2
2
|
class DocumentDetails
|
3
3
|
#
|
4
|
-
# @deprecated 2.0.0 pattern is no longer used for validation.
|
4
|
+
# @deprecated will be removed in 2.0.0 - pattern is no longer used for validation.
|
5
5
|
#
|
6
6
|
VALIDATION_PATTERN = '^([A-Za-z_]*) ([A-Za-z]{3}) ([A-Za-z0-9]{1}).*$'
|
7
7
|
|
data/lib/yoti/data_type/image.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
module Yoti
|
4
4
|
class Image < Media
|
5
5
|
def initialize(content, mime_type)
|
6
|
-
raise(TypeError, "#{self.class} is an abstract class, so cannot be instantiated") if
|
6
|
+
raise(TypeError, "#{self.class} is an abstract class, so cannot be instantiated") if instance_of?(Image)
|
7
7
|
|
8
8
|
super(content, mime_type)
|
9
9
|
end
|
data/lib/yoti/data_type/media.rb
CHANGED
data/lib/yoti/doc_scan/client.rb
CHANGED
@@ -84,7 +84,7 @@ module Yoti
|
|
84
84
|
# @param [String] session_id
|
85
85
|
# @param [String] media_id
|
86
86
|
#
|
87
|
-
# @return [Yoti::Media]
|
87
|
+
# @return [Yoti::Media|nil]
|
88
88
|
#
|
89
89
|
def get_media_content(session_id, media_id)
|
90
90
|
Validation.assert_is_a(String, session_id, 'session_id')
|
@@ -99,9 +99,13 @@ module Yoti
|
|
99
99
|
begin
|
100
100
|
response = request.execute
|
101
101
|
|
102
|
+
content_type = response.get_fields('content-type')
|
103
|
+
|
104
|
+
return nil if response.code == 204 || content_type.nil?
|
105
|
+
|
102
106
|
Yoti::Media.new(
|
103
107
|
response.body,
|
104
|
-
|
108
|
+
content_type[0]
|
105
109
|
)
|
106
110
|
rescue Yoti::RequestError => e
|
107
111
|
raise Yoti::DocScan::Error.wrap(e)
|
@@ -6,10 +6,13 @@ module Yoti
|
|
6
6
|
ID_DOCUMENT_AUTHENTICITY = 'ID_DOCUMENT_AUTHENTICITY'
|
7
7
|
ID_DOCUMENT_COMPARISON = 'ID_DOCUMENT_COMPARISON'
|
8
8
|
ID_DOCUMENT_TEXT_DATA_CHECK = 'ID_DOCUMENT_TEXT_DATA_CHECK'
|
9
|
+
SUPPLEMENTARY_DOCUMENT_TEXT_DATA_CHECK = 'SUPPLEMENTARY_DOCUMENT_TEXT_DATA_CHECK'
|
9
10
|
ID_DOCUMENT_FACE_MATCH = 'ID_DOCUMENT_FACE_MATCH'
|
10
11
|
LIVENESS = 'LIVENESS'
|
11
12
|
ID_DOCUMENT_TEXT_DATA_EXTRACTION = 'ID_DOCUMENT_TEXT_DATA_EXTRACTION'
|
13
|
+
SUPPLEMENTARY_DOCUMENT_TEXT_DATA_EXTRACTION = 'SUPPLEMENTARY_DOCUMENT_TEXT_DATA_EXTRACTION'
|
12
14
|
ID_DOCUMENT = 'ID_DOCUMENT'
|
15
|
+
SUPPLEMENTARY_DOCUMENT = 'SUPPLEMENTARY_DOCUMENT'
|
13
16
|
ORTHOGONAL_RESTRICTIONS = 'ORTHOGONAL_RESTRICTIONS'
|
14
17
|
DOCUMENT_RESTRICTIONS = 'DOCUMENT_RESTRICTIONS'
|
15
18
|
INCLUDE = 'WHITELIST'
|
@@ -26,6 +29,7 @@ module Yoti
|
|
26
29
|
TASK_COMPLETION = 'TASK_COMPLETION'
|
27
30
|
CHECK_COMPLETION = 'CHECK_COMPLETION'
|
28
31
|
SESSION_COMPLETION = 'SESSION_COMPLETION'
|
32
|
+
PROOF_OF_ADDRESS = 'PROOF_OF_ADDRESS'
|
29
33
|
end
|
30
34
|
end
|
31
35
|
end
|
@@ -9,7 +9,7 @@ module Yoti
|
|
9
9
|
# @param [String] type
|
10
10
|
#
|
11
11
|
def initialize(type)
|
12
|
-
raise(TypeError, "#{self.class} cannot be instantiated") if
|
12
|
+
raise(TypeError, "#{self.class} cannot be instantiated") if instance_of?(DocumentFilter)
|
13
13
|
|
14
14
|
Validation.assert_is_a(String, type, 'type')
|
15
15
|
@type = type
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Yoti
|
4
|
+
module DocScan
|
5
|
+
module Session
|
6
|
+
module Create
|
7
|
+
class Objective
|
8
|
+
#
|
9
|
+
# @param [String] type
|
10
|
+
#
|
11
|
+
def initialize(type)
|
12
|
+
raise(TypeError, "#{self.class} cannot be instantiated") if instance_of?(Objective)
|
13
|
+
|
14
|
+
Validation.assert_is_a(String, type, 'type')
|
15
|
+
@type = type
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_json(*_args)
|
19
|
+
as_json.to_json
|
20
|
+
end
|
21
|
+
|
22
|
+
def as_json(*_args)
|
23
|
+
{
|
24
|
+
type: @type
|
25
|
+
}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Yoti
|
4
|
+
module DocScan
|
5
|
+
module Session
|
6
|
+
module Create
|
7
|
+
class ProofOfAddressObjective < Objective
|
8
|
+
def initialize
|
9
|
+
super(Constants::PROOF_OF_ADDRESS)
|
10
|
+
end
|
11
|
+
|
12
|
+
#
|
13
|
+
# @return [ProofOfAddressObjectiveBuilder]
|
14
|
+
#
|
15
|
+
def self.builder
|
16
|
+
ProofOfAddressObjectiveBuilder.new
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class ProofOfAddressObjectiveBuilder
|
21
|
+
#
|
22
|
+
# @return [ProofOfAddressObjective]
|
23
|
+
#
|
24
|
+
def build
|
25
|
+
ProofOfAddressObjective.new
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -13,7 +13,7 @@ module Yoti
|
|
13
13
|
# @param [#as_json] config The configuration to apply to the Check
|
14
14
|
#
|
15
15
|
def initialize(type, config)
|
16
|
-
raise(TypeError, "#{self.class} cannot be instantiated") if
|
16
|
+
raise(TypeError, "#{self.class} cannot be instantiated") if instance_of?(RequestedCheck)
|
17
17
|
|
18
18
|
Validation.assert_is_a(String, type, 'type')
|
19
19
|
@type = type
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Yoti
|
4
|
+
module DocScan
|
5
|
+
module Session
|
6
|
+
module Create
|
7
|
+
class RequestedSupplementaryDocTextExtractionTask < RequestedTask
|
8
|
+
#
|
9
|
+
# @param [RequestedSupplementaryDocTextExtractionTaskConfig] config
|
10
|
+
#
|
11
|
+
def initialize(config)
|
12
|
+
Validation.assert_is_a(
|
13
|
+
RequestedSupplementaryDocTextExtractionTaskConfig,
|
14
|
+
config,
|
15
|
+
'config'
|
16
|
+
)
|
17
|
+
|
18
|
+
super(Constants::SUPPLEMENTARY_DOCUMENT_TEXT_DATA_EXTRACTION, config)
|
19
|
+
end
|
20
|
+
|
21
|
+
#
|
22
|
+
# @return [RequestedSupplementaryDocTextExtractionTaskBuilder]
|
23
|
+
#
|
24
|
+
def self.builder
|
25
|
+
RequestedSupplementaryDocTextExtractionTaskBuilder.new
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
#
|
30
|
+
# The configuration applied when creating each SupplementaryDocTextExtractionTask
|
31
|
+
#
|
32
|
+
class RequestedSupplementaryDocTextExtractionTaskConfig
|
33
|
+
#
|
34
|
+
# @param [String] manual_check
|
35
|
+
# Describes the manual fallback behaviour applied to each Task
|
36
|
+
#
|
37
|
+
def initialize(manual_check)
|
38
|
+
Validation.assert_is_a(String, manual_check, 'manual_check')
|
39
|
+
@manual_check = manual_check
|
40
|
+
end
|
41
|
+
|
42
|
+
def as_json(*_args)
|
43
|
+
{
|
44
|
+
manual_check: @manual_check
|
45
|
+
}.compact
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
#
|
50
|
+
# Builder to assist creation of {RequestedSupplementaryDocTextExtractionTask}
|
51
|
+
#
|
52
|
+
class RequestedSupplementaryDocTextExtractionTaskBuilder
|
53
|
+
#
|
54
|
+
# Requires that the Task is always followed by a manual TextDataCheck
|
55
|
+
#
|
56
|
+
# @return [self]
|
57
|
+
#
|
58
|
+
def with_manual_check_always
|
59
|
+
@manual_check = Constants::ALWAYS
|
60
|
+
self
|
61
|
+
end
|
62
|
+
|
63
|
+
#
|
64
|
+
# Requires that only failed Tasks are followed by a manual TextDataCheck
|
65
|
+
#
|
66
|
+
# @return [self]
|
67
|
+
#
|
68
|
+
def with_manual_check_fallback
|
69
|
+
@manual_check = Constants::FALLBACK
|
70
|
+
self
|
71
|
+
end
|
72
|
+
|
73
|
+
#
|
74
|
+
# The SupplementaryDocTextExtractionTask will never fallback to a manual TextDataCheck
|
75
|
+
#
|
76
|
+
# @return [self]
|
77
|
+
#
|
78
|
+
def with_manual_check_never
|
79
|
+
@manual_check = Constants::NEVER
|
80
|
+
self
|
81
|
+
end
|
82
|
+
|
83
|
+
#
|
84
|
+
# @return [RequestedSupplementaryDocTextExtractionTask]
|
85
|
+
#
|
86
|
+
def build
|
87
|
+
config = RequestedSupplementaryDocTextExtractionTaskConfig.new(@manual_check)
|
88
|
+
RequestedSupplementaryDocTextExtractionTask.new(config)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -13,7 +13,7 @@ module Yoti
|
|
13
13
|
# @param [#as_json] config Configuration to apply to the Task
|
14
14
|
#
|
15
15
|
def initialize(type, config)
|
16
|
-
raise(TypeError, "#{self.class} cannot be instantiated") if
|
16
|
+
raise(TypeError, "#{self.class} cannot be instantiated") if instance_of?(RequestedTask)
|
17
17
|
|
18
18
|
Validation.assert_is_a(String, type, 'type')
|
19
19
|
@type = type
|
@@ -9,7 +9,7 @@ module Yoti
|
|
9
9
|
# @param [String] type
|
10
10
|
#
|
11
11
|
def initialize(type)
|
12
|
-
raise(TypeError, "#{self.class} cannot be instantiated") if
|
12
|
+
raise(TypeError, "#{self.class} cannot be instantiated") if instance_of?(RequiredDocument)
|
13
13
|
|
14
14
|
Validation.assert_is_a(String, type, 'type')
|
15
15
|
@type = type
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Yoti
|
4
|
+
module DocScan
|
5
|
+
module Session
|
6
|
+
module Create
|
7
|
+
class RequiredSupplementaryDocument < RequiredDocument
|
8
|
+
#
|
9
|
+
# @param [Objective] objective
|
10
|
+
# @param [Array<String>] document_types
|
11
|
+
# @param [Array<String>] country_codes
|
12
|
+
#
|
13
|
+
def initialize(objective, document_types, country_codes)
|
14
|
+
super(Constants::SUPPLEMENTARY_DOCUMENT)
|
15
|
+
|
16
|
+
Validation.assert_is_a(Objective, objective, 'objective')
|
17
|
+
@objective = objective
|
18
|
+
|
19
|
+
Validation.assert_is_a(Array, document_types, 'document_types', true)
|
20
|
+
@document_types = document_types
|
21
|
+
|
22
|
+
Validation.assert_is_a(Array, country_codes, 'country_codes', true)
|
23
|
+
@country_codes = country_codes
|
24
|
+
end
|
25
|
+
|
26
|
+
def as_json(*_args)
|
27
|
+
json = super
|
28
|
+
json[:objective] = @objective.as_json
|
29
|
+
json[:document_types] = @document_types unless @document_types.nil?
|
30
|
+
json[:country_codes] = @country_codes unless @country_codes.nil?
|
31
|
+
json
|
32
|
+
end
|
33
|
+
|
34
|
+
#
|
35
|
+
# @return [RequiredSupplementaryDocumentBuilder]
|
36
|
+
#
|
37
|
+
def self.builder
|
38
|
+
RequiredSupplementaryDocumentBuilder.new
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class RequiredSupplementaryDocumentBuilder
|
43
|
+
#
|
44
|
+
# @param [Objective] objective
|
45
|
+
#
|
46
|
+
# @return [self]
|
47
|
+
#
|
48
|
+
def with_objective(objective)
|
49
|
+
Validation.assert_is_a(Objective, objective, 'objective')
|
50
|
+
@objective = objective
|
51
|
+
self
|
52
|
+
end
|
53
|
+
|
54
|
+
#
|
55
|
+
# @param [Array<String>] country_codes
|
56
|
+
#
|
57
|
+
# @return [self]
|
58
|
+
#
|
59
|
+
def with_country_codes(country_codes)
|
60
|
+
Validation.assert_is_a(Array, country_codes, 'country_codes')
|
61
|
+
@country_codes = country_codes
|
62
|
+
self
|
63
|
+
end
|
64
|
+
|
65
|
+
#
|
66
|
+
# @param [Array<String>] document_types
|
67
|
+
#
|
68
|
+
# @return [self]
|
69
|
+
#
|
70
|
+
def with_document_types(document_types)
|
71
|
+
Validation.assert_is_a(Array, document_types, 'document_types')
|
72
|
+
@document_types = document_types
|
73
|
+
self
|
74
|
+
end
|
75
|
+
|
76
|
+
#
|
77
|
+
# @return [RequiredSupplementaryDocument]
|
78
|
+
#
|
79
|
+
def build
|
80
|
+
RequiredSupplementaryDocument.new(
|
81
|
+
@objective,
|
82
|
+
@document_types,
|
83
|
+
@country_codes
|
84
|
+
)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Yoti
|
4
|
+
module DocScan
|
5
|
+
module Session
|
6
|
+
module Retrieve
|
7
|
+
class FileResponse
|
8
|
+
# @return [MediaResponse]
|
9
|
+
attr_reader :media
|
10
|
+
|
11
|
+
#
|
12
|
+
# @param [Hash] file
|
13
|
+
#
|
14
|
+
def initialize(file)
|
15
|
+
@media = MediaResponse.new(file['media']) unless file['media'].nil?
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -74,13 +74,29 @@ module Yoti
|
|
74
74
|
@checks.select { |check| check.is_a?(FaceMatchCheckResponse) }
|
75
75
|
end
|
76
76
|
|
77
|
+
#
|
78
|
+
# @deprecated replaced by id_document_text_data_checks
|
77
79
|
#
|
78
80
|
# @return [Array<TextDataCheckResponse>]
|
79
81
|
#
|
80
82
|
def text_data_checks
|
83
|
+
id_document_text_data_checks
|
84
|
+
end
|
85
|
+
|
86
|
+
#
|
87
|
+
# @return [Array<TextDataCheckResponse>]
|
88
|
+
#
|
89
|
+
def id_document_text_data_checks
|
81
90
|
@checks.select { |check| check.is_a?(TextDataCheckResponse) }
|
82
91
|
end
|
83
92
|
|
93
|
+
#
|
94
|
+
# @return [Array<SupplementaryDocumentTextDataCheckResponse>]
|
95
|
+
#
|
96
|
+
def supplementary_document_text_data_checks
|
97
|
+
@checks.select { |check| check.is_a?(SupplementaryDocumentTextDataCheckResponse) }
|
98
|
+
end
|
99
|
+
|
84
100
|
#
|
85
101
|
# @return [Array<LivenessCheckResponse>]
|
86
102
|
#
|
@@ -115,6 +131,8 @@ module Yoti
|
|
115
131
|
TextDataCheckResponse.new(check)
|
116
132
|
when Constants::LIVENESS
|
117
133
|
LivenessCheckResponse.new(check)
|
134
|
+
when Constants::SUPPLEMENTARY_DOCUMENT_TEXT_DATA_CHECK
|
135
|
+
SupplementaryDocumentTextDataCheckResponse.new(check)
|
118
136
|
else
|
119
137
|
CheckResponse.new(check)
|
120
138
|
end
|
@@ -11,6 +11,9 @@ module Yoti
|
|
11
11
|
# @return [MediaResponse]
|
12
12
|
attr_reader :media
|
13
13
|
|
14
|
+
# @return [Array<FrameResponse>]
|
15
|
+
attr_reader :frames
|
16
|
+
|
14
17
|
#
|
15
18
|
# @param [Hash] page
|
16
19
|
#
|
@@ -19,6 +22,13 @@ module Yoti
|
|
19
22
|
@capture_method = page['capture_method']
|
20
23
|
|
21
24
|
@media = MediaResponse.new(page['media']) unless page['media'].nil?
|
25
|
+
|
26
|
+
if page['frames'].nil?
|
27
|
+
@frames = []
|
28
|
+
else
|
29
|
+
Validation.assert_is_a(Array, page['frames'], 'frames')
|
30
|
+
@frames = page['frames'].map { |frame| FrameResponse.new(frame) }
|
31
|
+
end
|
22
32
|
end
|
23
33
|
end
|
24
34
|
end
|
@@ -8,6 +8,9 @@ module Yoti
|
|
8
8
|
# @return [Array<IdDocumentResourceResponse>]
|
9
9
|
attr_reader :id_documents
|
10
10
|
|
11
|
+
# @return [Array<SupplementaryDocumentResourceResponse>]
|
12
|
+
attr_reader :supplementary_documents
|
13
|
+
|
11
14
|
# @return [Array<LivenessResourceResponse>]
|
12
15
|
attr_reader :liveness_capture
|
13
16
|
|
@@ -15,12 +18,8 @@ module Yoti
|
|
15
18
|
# @param [Hash] resources
|
16
19
|
#
|
17
20
|
def initialize(resources)
|
18
|
-
|
19
|
-
|
20
|
-
else
|
21
|
-
Validation.assert_is_a(Array, resources['id_documents'], 'id_documents')
|
22
|
-
@id_documents = resources['id_documents'].map { |resource| IdDocumentResourceResponse.new(resource) }
|
23
|
-
end
|
21
|
+
@id_documents = parse_id_documents(resources)
|
22
|
+
@supplementary_documents = parse_supplementary_documents(resources)
|
24
23
|
|
25
24
|
if resources['liveness_capture'].nil?
|
26
25
|
@liveness_capture = []
|
@@ -43,6 +42,26 @@ module Yoti
|
|
43
42
|
def zoom_liveness_resources
|
44
43
|
@liveness_capture.select { |resource| resource.is_a?(ZoomLivenessResourceResponse) }
|
45
44
|
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def parse_id_documents(resources)
|
49
|
+
return [] if resources['id_documents'].nil?
|
50
|
+
|
51
|
+
Validation.assert_is_a(Array, resources['id_documents'], 'id_documents')
|
52
|
+
resources['id_documents'].map do |resource|
|
53
|
+
IdDocumentResourceResponse.new(resource)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def parse_supplementary_documents(resources)
|
58
|
+
return [] if resources['supplementary_documents'].nil?
|
59
|
+
|
60
|
+
Validation.assert_is_a(Array, resources['supplementary_documents'], 'supplementary_documents')
|
61
|
+
resources['supplementary_documents'].map do |resource|
|
62
|
+
SupplementaryDocumentResourceResponse.new(resource)
|
63
|
+
end
|
64
|
+
end
|
46
65
|
end
|
47
66
|
end
|
48
67
|
end
|
@@ -26,6 +26,8 @@ module Yoti
|
|
26
26
|
case task['type']
|
27
27
|
when Constants::ID_DOCUMENT_TEXT_DATA_EXTRACTION
|
28
28
|
TextExtractionTaskResponse.new(task)
|
29
|
+
when Constants::SUPPLEMENTARY_DOCUMENT_TEXT_DATA_EXTRACTION
|
30
|
+
SupplementaryDocumentTextExtractionTaskResponse.new(task)
|
29
31
|
else
|
30
32
|
TaskResponse.new(task)
|
31
33
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Yoti
|
4
|
+
module DocScan
|
5
|
+
module Session
|
6
|
+
module Retrieve
|
7
|
+
class SupplementaryDocumentResourceResponse < ResourceResponse
|
8
|
+
# @return [String]
|
9
|
+
attr_reader :document_type
|
10
|
+
|
11
|
+
# @return [String]
|
12
|
+
attr_reader :issuing_country
|
13
|
+
|
14
|
+
# @return [Array<PageResponse>]
|
15
|
+
attr_reader :pages
|
16
|
+
|
17
|
+
# @return [DocumentFieldsResponse]
|
18
|
+
attr_reader :document_fields
|
19
|
+
|
20
|
+
# @return [FileResponse]
|
21
|
+
attr_reader :document_file
|
22
|
+
|
23
|
+
#
|
24
|
+
# @param [Hash] resource
|
25
|
+
#
|
26
|
+
def initialize(resource)
|
27
|
+
super(resource)
|
28
|
+
|
29
|
+
Validation.assert_is_a(String, resource['document_type'], 'document_type', true)
|
30
|
+
@document_type = resource['document_type']
|
31
|
+
|
32
|
+
Validation.assert_is_a(String, resource['issuing_country'], 'issuing_country', true)
|
33
|
+
@issuing_country = resource['issuing_country']
|
34
|
+
|
35
|
+
if resource['pages'].nil?
|
36
|
+
@pages = []
|
37
|
+
else
|
38
|
+
Validation.assert_is_a(Array, resource['pages'], 'pages')
|
39
|
+
@pages = resource['pages'].map { |page| PageResponse.new(page) }
|
40
|
+
end
|
41
|
+
|
42
|
+
@document_fields = DocumentFieldsResponse.new(resource['document_fields']) unless resource['document_fields'].nil?
|
43
|
+
|
44
|
+
@document_file = FileResponse.new(resource['file']) unless resource['file'].nil?
|
45
|
+
end
|
46
|
+
|
47
|
+
#
|
48
|
+
# @return [Array<SupplementaryDocumentTextExtractionTaskResponse>]
|
49
|
+
#
|
50
|
+
def text_extraction_tasks
|
51
|
+
@tasks.select { |task| task.is_a?(SupplementaryDocumentTextExtractionTaskResponse) }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/lib/yoti/doc_scan/session/retrieve/supplementary_document_text_extraction_task_response.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Yoti
|
4
|
+
module DocScan
|
5
|
+
module Session
|
6
|
+
module Retrieve
|
7
|
+
class SupplementaryDocumentTextExtractionTaskResponse < TaskResponse
|
8
|
+
#
|
9
|
+
# @return [Array<GeneratedSupplementaryDocumentTextDataCheckResponse>]
|
10
|
+
#
|
11
|
+
def generated_text_data_checks
|
12
|
+
@generated_checks.select { |check| check.is_a?(GeneratedSupplementaryDocumentTextDataCheckResponse) }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -75,6 +75,8 @@ module Yoti
|
|
75
75
|
case check['type']
|
76
76
|
when Constants::ID_DOCUMENT_TEXT_DATA_CHECK
|
77
77
|
GeneratedTextDataCheckResponse.new(check)
|
78
|
+
when Constants::SUPPLEMENTARY_DOCUMENT_TEXT_DATA_CHECK
|
79
|
+
GeneratedSupplementaryDocumentTextDataCheckResponse.new(check)
|
78
80
|
else
|
79
81
|
GeneratedCheckResponse.new(check)
|
80
82
|
end
|
@@ -4,8 +4,13 @@ module Yoti
|
|
4
4
|
module DynamicSharingService
|
5
5
|
# Describes a dynamic share
|
6
6
|
class DynamicScenario
|
7
|
+
# @return [Yoti::DynamicSharingService::DynamicPolicy]
|
7
8
|
attr_reader :policy
|
9
|
+
|
10
|
+
# @return [Array<Yoti::DynamicSharingService::Extension>]
|
8
11
|
attr_reader :extensions
|
12
|
+
|
13
|
+
# @return [String]
|
9
14
|
attr_reader :callback_endpoint
|
10
15
|
|
11
16
|
def initialize
|
@@ -4,8 +4,13 @@ module Yoti
|
|
4
4
|
module DynamicSharingService
|
5
5
|
# Describes a wanted attribute in a dynamic sharing policy
|
6
6
|
class WantedAttribute
|
7
|
+
# @return [String]
|
7
8
|
attr_reader :name
|
9
|
+
|
10
|
+
# @return [String]
|
8
11
|
attr_reader :derivation
|
12
|
+
|
13
|
+
# @return [Array<#as_json>]
|
9
14
|
attr_reader :constraints
|
10
15
|
|
11
16
|
def initialize
|
data/lib/yoti/http/request.rb
CHANGED
data/lib/yoti/protobuf/main.rb
CHANGED
@@ -3,12 +3,12 @@ $LOAD_PATH.unshift File.expand_path('./attrpubapi/', __dir__)
|
|
3
3
|
require 'google/protobuf'
|
4
4
|
require 'json'
|
5
5
|
|
6
|
-
require_relative 'attrpubapi/List_pb
|
7
|
-
require_relative 'compubapi/EncryptedData_pb
|
8
|
-
require_relative 'compubapi/SignedTimestamp_pb
|
9
|
-
require_relative 'sharepubapi/ExtraData_pb
|
10
|
-
require_relative 'sharepubapi/IssuingAttributes_pb
|
11
|
-
require_relative 'sharepubapi/ThirdPartyAttribute_pb
|
6
|
+
require_relative 'attrpubapi/List_pb'
|
7
|
+
require_relative 'compubapi/EncryptedData_pb'
|
8
|
+
require_relative 'compubapi/SignedTimestamp_pb'
|
9
|
+
require_relative 'sharepubapi/ExtraData_pb'
|
10
|
+
require_relative 'sharepubapi/IssuingAttributes_pb'
|
11
|
+
require_relative 'sharepubapi/ThirdPartyAttribute_pb'
|
12
12
|
|
13
13
|
module Yoti
|
14
14
|
module Protobuf
|
@@ -91,9 +91,9 @@ module Yoti
|
|
91
91
|
private
|
92
92
|
|
93
93
|
def convert_multi_value(value)
|
94
|
-
|
94
|
+
proto_multi_values = Yoti::Protobuf::Attrpubapi::MultiValue.decode(value).values
|
95
95
|
items = []
|
96
|
-
|
96
|
+
proto_multi_values.each do |item|
|
97
97
|
items << value_based_on_content_type(item.data, item.content_type)
|
98
98
|
end
|
99
99
|
MultiValue.new(items)
|
@@ -5,6 +5,7 @@ require 'base64'
|
|
5
5
|
module Yoti
|
6
6
|
module Share
|
7
7
|
class Definition
|
8
|
+
# @return [String]
|
8
9
|
attr_reader :name
|
9
10
|
|
10
11
|
#
|
@@ -18,8 +19,13 @@ module Yoti
|
|
18
19
|
end
|
19
20
|
|
20
21
|
class AttributeIssuanceDetails
|
22
|
+
# @return [String]
|
21
23
|
attr_reader :token
|
24
|
+
|
25
|
+
# @return [Array<Yoti::Share::Definition>]
|
22
26
|
attr_reader :attributes
|
27
|
+
|
28
|
+
# @return [DateTime|nil]
|
23
29
|
attr_reader :expiry_date
|
24
30
|
|
25
31
|
#
|
data/lib/yoti/ssl.rb
CHANGED
@@ -42,7 +42,7 @@ module Yoti
|
|
42
42
|
# @param message [String] message to be signed
|
43
43
|
# @return [String] signed message encoded in base 64
|
44
44
|
def get_secure_signature(message)
|
45
|
-
digest = OpenSSL::Digest
|
45
|
+
digest = OpenSSL::Digest.new('SHA256')
|
46
46
|
Base64.strict_encode64(private_key.sign(digest, message))
|
47
47
|
end
|
48
48
|
|
@@ -60,7 +60,7 @@ module Yoti
|
|
60
60
|
end
|
61
61
|
|
62
62
|
# Reset and reload the Private Key used for SSL functions
|
63
|
-
# @deprecated 2.0.0
|
63
|
+
# @deprecated will be removed in 2.0.0
|
64
64
|
def reload!
|
65
65
|
@private_key = nil
|
66
66
|
@pem = nil
|
@@ -20,7 +20,7 @@ module Yoti
|
|
20
20
|
# @return [Array<Yoti::Anchor>]
|
21
21
|
#
|
22
22
|
def process
|
23
|
-
result_data = ANCHOR_LIST_KEYS.
|
23
|
+
result_data = ANCHOR_LIST_KEYS.transform_values { |_value| [] }
|
24
24
|
|
25
25
|
@anchors_list.each do |anchor|
|
26
26
|
x509_certs_list = convert_certs_list_to_X509(anchor.origin_server_certs)
|
data/lib/yoti/util/log.rb
CHANGED
data/lib/yoti/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yoti
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yoti
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-11-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: google-protobuf
|
@@ -189,16 +189,20 @@ files:
|
|
189
189
|
- lib/yoti/doc_scan/session/create/document_filter.rb
|
190
190
|
- lib/yoti/doc_scan/session/create/document_restrictions_filter.rb
|
191
191
|
- lib/yoti/doc_scan/session/create/notification_config.rb
|
192
|
+
- lib/yoti/doc_scan/session/create/objective/objective.rb
|
193
|
+
- lib/yoti/doc_scan/session/create/objective/proof_of_address_objective.rb
|
192
194
|
- lib/yoti/doc_scan/session/create/orthogonal_restrictions_filter.rb
|
193
195
|
- lib/yoti/doc_scan/session/create/requested_check.rb
|
194
196
|
- lib/yoti/doc_scan/session/create/requested_document_authenticity_check.rb
|
195
197
|
- lib/yoti/doc_scan/session/create/requested_face_match_check.rb
|
196
198
|
- lib/yoti/doc_scan/session/create/requested_id_document_comparison_check.rb
|
197
199
|
- lib/yoti/doc_scan/session/create/requested_liveness_check.rb
|
200
|
+
- lib/yoti/doc_scan/session/create/requested_supplementary_doc_text_extraction_task.rb
|
198
201
|
- lib/yoti/doc_scan/session/create/requested_task.rb
|
199
202
|
- lib/yoti/doc_scan/session/create/requested_text_extraction_task.rb
|
200
203
|
- lib/yoti/doc_scan/session/create/required_document.rb
|
201
204
|
- lib/yoti/doc_scan/session/create/required_id_document.rb
|
205
|
+
- lib/yoti/doc_scan/session/create/required_supplementary_document.rb
|
202
206
|
- lib/yoti/doc_scan/session/create/sdk_config.rb
|
203
207
|
- lib/yoti/doc_scan/session/create/session_specification.rb
|
204
208
|
- lib/yoti/doc_scan/session/retrieve/authenticity_check_response.rb
|
@@ -209,9 +213,11 @@ files:
|
|
209
213
|
- lib/yoti/doc_scan/session/retrieve/document_id_photo_response.rb
|
210
214
|
- lib/yoti/doc_scan/session/retrieve/face_map_response.rb
|
211
215
|
- lib/yoti/doc_scan/session/retrieve/face_match_check_response.rb
|
216
|
+
- lib/yoti/doc_scan/session/retrieve/file_response.rb
|
212
217
|
- lib/yoti/doc_scan/session/retrieve/frame_response.rb
|
213
218
|
- lib/yoti/doc_scan/session/retrieve/generated_check_response.rb
|
214
219
|
- lib/yoti/doc_scan/session/retrieve/generated_media.rb
|
220
|
+
- lib/yoti/doc_scan/session/retrieve/generated_supplementary_document_text_data_check_response.rb
|
215
221
|
- lib/yoti/doc_scan/session/retrieve/generated_text_data_check_response.rb
|
216
222
|
- lib/yoti/doc_scan/session/retrieve/get_session_result.rb
|
217
223
|
- lib/yoti/doc_scan/session/retrieve/id_document_comparison_check_response.rb
|
@@ -224,6 +230,9 @@ files:
|
|
224
230
|
- lib/yoti/doc_scan/session/retrieve/report_response.rb
|
225
231
|
- lib/yoti/doc_scan/session/retrieve/resource_container.rb
|
226
232
|
- lib/yoti/doc_scan/session/retrieve/resource_response.rb
|
233
|
+
- lib/yoti/doc_scan/session/retrieve/supplementary_document_resource_response.rb
|
234
|
+
- lib/yoti/doc_scan/session/retrieve/supplementary_document_text_data_check_response.rb
|
235
|
+
- lib/yoti/doc_scan/session/retrieve/supplementary_document_text_extraction_task_response.rb
|
227
236
|
- lib/yoti/doc_scan/session/retrieve/task_response.rb
|
228
237
|
- lib/yoti/doc_scan/session/retrieve/text_data_check_response.rb
|
229
238
|
- lib/yoti/doc_scan/session/retrieve/text_extraction_task_response.rb
|