yoti 1.6.4 → 1.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/README.md +22 -224
  4. data/lib/yoti.rb +63 -1
  5. data/lib/yoti/activity_details.rb +3 -5
  6. data/lib/yoti/client.rb +13 -4
  7. data/lib/yoti/configuration.rb +8 -3
  8. data/lib/yoti/data_type/age_verification.rb +1 -1
  9. data/lib/yoti/data_type/base_profile.rb +1 -1
  10. data/lib/yoti/data_type/document_details.rb +1 -1
  11. data/lib/yoti/data_type/image.rb +4 -12
  12. data/lib/yoti/data_type/image_jpeg.rb +2 -0
  13. data/lib/yoti/data_type/image_png.rb +2 -0
  14. data/lib/yoti/data_type/media.rb +22 -0
  15. data/lib/yoti/data_type/signed_time_stamp.rb +1 -1
  16. data/lib/yoti/doc_scan/client.rb +191 -0
  17. data/lib/yoti/doc_scan/constants.rb +35 -0
  18. data/lib/yoti/doc_scan/errors.rb +81 -0
  19. data/lib/yoti/doc_scan/session/create/create_session_result.rb +50 -0
  20. data/lib/yoti/doc_scan/session/create/document_filter.rb +31 -0
  21. data/lib/yoti/doc_scan/session/create/document_restrictions_filter.rb +140 -0
  22. data/lib/yoti/doc_scan/session/create/notification_config.rb +142 -0
  23. data/lib/yoti/doc_scan/session/create/objective/objective.rb +31 -0
  24. data/lib/yoti/doc_scan/session/create/objective/proof_of_address_objective.rb +31 -0
  25. data/lib/yoti/doc_scan/session/create/orthogonal_restrictions_filter.rb +150 -0
  26. data/lib/yoti/doc_scan/session/create/requested_check.rb +39 -0
  27. data/lib/yoti/doc_scan/session/create/requested_document_authenticity_check.rb +95 -0
  28. data/lib/yoti/doc_scan/session/create/requested_face_match_check.rb +95 -0
  29. data/lib/yoti/doc_scan/session/create/requested_id_document_comparison_check.rb +53 -0
  30. data/lib/yoti/doc_scan/session/create/requested_liveness_check.rb +108 -0
  31. data/lib/yoti/doc_scan/session/create/requested_supplementary_doc_text_extraction_task.rb +94 -0
  32. data/lib/yoti/doc_scan/session/create/requested_task.rb +39 -0
  33. data/lib/yoti/doc_scan/session/create/requested_text_extraction_task.rb +116 -0
  34. data/lib/yoti/doc_scan/session/create/required_document.rb +31 -0
  35. data/lib/yoti/doc_scan/session/create/required_id_document.rb +53 -0
  36. data/lib/yoti/doc_scan/session/create/required_supplementary_document.rb +90 -0
  37. data/lib/yoti/doc_scan/session/create/sdk_config.rb +221 -0
  38. data/lib/yoti/doc_scan/session/create/session_specification.rb +221 -0
  39. data/lib/yoti/doc_scan/session/retrieve/authenticity_check_response.rb +12 -0
  40. data/lib/yoti/doc_scan/session/retrieve/breakdown_response.rb +38 -0
  41. data/lib/yoti/doc_scan/session/retrieve/check_response.rb +63 -0
  42. data/lib/yoti/doc_scan/session/retrieve/details_response.rb +28 -0
  43. data/lib/yoti/doc_scan/session/retrieve/document_fields_response.rb +21 -0
  44. data/lib/yoti/doc_scan/session/retrieve/document_id_photo_response.rb +21 -0
  45. data/lib/yoti/doc_scan/session/retrieve/face_map_response.rb +21 -0
  46. data/lib/yoti/doc_scan/session/retrieve/face_match_check_response.rb +12 -0
  47. data/lib/yoti/doc_scan/session/retrieve/file_response.rb +21 -0
  48. data/lib/yoti/doc_scan/session/retrieve/frame_response.rb +21 -0
  49. data/lib/yoti/doc_scan/session/retrieve/generated_check_response.rb +28 -0
  50. data/lib/yoti/doc_scan/session/retrieve/generated_media.rb +28 -0
  51. data/lib/yoti/doc_scan/session/retrieve/generated_supplementary_document_text_data_check_response.rb +12 -0
  52. data/lib/yoti/doc_scan/session/retrieve/generated_text_data_check_response.rb +12 -0
  53. data/lib/yoti/doc_scan/session/retrieve/get_session_result.rb +145 -0
  54. data/lib/yoti/doc_scan/session/retrieve/id_document_comparison_check_response.rb +12 -0
  55. data/lib/yoti/doc_scan/session/retrieve/id_document_resource_response.rb +57 -0
  56. data/lib/yoti/doc_scan/session/retrieve/liveness_check_response.rb +12 -0
  57. data/lib/yoti/doc_scan/session/retrieve/liveness_resource_response.rb +24 -0
  58. data/lib/yoti/doc_scan/session/retrieve/media_response.rb +38 -0
  59. data/lib/yoti/doc_scan/session/retrieve/page_response.rb +37 -0
  60. data/lib/yoti/doc_scan/session/retrieve/recommendation_response.rb +34 -0
  61. data/lib/yoti/doc_scan/session/retrieve/report_response.rb +31 -0
  62. data/lib/yoti/doc_scan/session/retrieve/resource_container.rb +69 -0
  63. data/lib/yoti/doc_scan/session/retrieve/resource_response.rb +41 -0
  64. data/lib/yoti/doc_scan/session/retrieve/supplementary_document_resource_response.rb +57 -0
  65. data/lib/yoti/doc_scan/session/retrieve/supplementary_document_text_data_check_response.rb +12 -0
  66. data/lib/yoti/doc_scan/session/retrieve/supplementary_document_text_extraction_task_response.rb +18 -0
  67. data/lib/yoti/doc_scan/session/retrieve/task_response.rb +89 -0
  68. data/lib/yoti/doc_scan/session/retrieve/text_data_check_response.rb +12 -0
  69. data/lib/yoti/doc_scan/session/retrieve/text_extraction_task_response.rb +18 -0
  70. data/lib/yoti/doc_scan/session/retrieve/zoom_liveness_resource_response.rb +33 -0
  71. data/lib/yoti/doc_scan/support/supported_documents.rb +60 -0
  72. data/lib/yoti/dynamic_share_service/dynamic_scenario.rb +5 -0
  73. data/lib/yoti/dynamic_share_service/extension/extension.rb +3 -0
  74. data/lib/yoti/dynamic_share_service/extension/location_constraint_extension.rb +3 -0
  75. data/lib/yoti/dynamic_share_service/extension/thirdparty_attribute_extension.rb +1 -1
  76. data/lib/yoti/dynamic_share_service/extension/transactional_flow_extension.rb +4 -0
  77. data/lib/yoti/dynamic_share_service/policy/dynamic_policy.rb +74 -9
  78. data/lib/yoti/dynamic_share_service/policy/wanted_anchor.rb +3 -0
  79. data/lib/yoti/dynamic_share_service/policy/wanted_attribute.rb +5 -0
  80. data/lib/yoti/dynamic_share_service/share_url.rb +26 -33
  81. data/lib/yoti/errors.rb +15 -2
  82. data/lib/yoti/http/aml_check_request.rb +12 -6
  83. data/lib/yoti/http/payloads/aml_address.rb +4 -0
  84. data/lib/yoti/http/payloads/aml_profile.rb +7 -1
  85. data/lib/yoti/http/profile_request.rb +11 -6
  86. data/lib/yoti/http/request.rb +219 -18
  87. data/lib/yoti/http/signed_request.rb +13 -4
  88. data/lib/yoti/protobuf/main.rb +8 -8
  89. data/lib/yoti/share/attribute_issuance_details.rb +6 -0
  90. data/lib/yoti/ssl.rb +4 -4
  91. data/lib/yoti/util/age_processor.rb +1 -1
  92. data/lib/yoti/util/anchor_processor.rb +2 -2
  93. data/lib/yoti/util/log.rb +1 -1
  94. data/lib/yoti/util/validation.rb +41 -0
  95. data/lib/yoti/version.rb +1 -1
  96. data/yoti.gemspec +18 -6
  97. metadata +69 -33
  98. data/.github/ISSUE_TEMPLATE.md +0 -17
  99. data/.gitignore +0 -39
  100. data/CONTRIBUTING.md +0 -98
  101. data/Guardfile +0 -11
  102. data/Rakefile +0 -54
  103. data/login_flow.png +0 -0
  104. data/rubocop.yml +0 -57
  105. data/yardstick.yml +0 -9
@@ -0,0 +1,221 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Yoti
4
+ module DocScan
5
+ module Session
6
+ module Create
7
+ class SessionSpecification
8
+ #
9
+ # @param [Integer] client_session_token_ttl
10
+ # @param [Integer] resources_ttl
11
+ # @param [String] user_tracking_id
12
+ # @param [NotificationConfig] notifications
13
+ # @param [Array<RequestedCheck>] requested_checks
14
+ # @param [Array<RequestedTask>] requested_tasks
15
+ # @param [SdkConfig] sdk_config
16
+ # @param [Array<RequiredDocument>] required_documents
17
+ # @param [Boolean] block_biometric_consent
18
+ #
19
+ def initialize(
20
+ client_session_token_ttl,
21
+ resources_ttl,
22
+ user_tracking_id,
23
+ notifications,
24
+ requested_checks,
25
+ requested_tasks,
26
+ sdk_config,
27
+ required_documents,
28
+ block_biometric_consent = nil
29
+ )
30
+ Validation.assert_is_a(Integer, client_session_token_ttl, 'client_session_token_ttl', true)
31
+ @client_session_token_ttl = client_session_token_ttl
32
+
33
+ Validation.assert_is_a(Integer, resources_ttl, 'resources_ttl', true)
34
+ @resources_ttl = resources_ttl
35
+
36
+ Validation.assert_is_a(String, user_tracking_id, 'user_tracking_id', true)
37
+ @user_tracking_id = user_tracking_id
38
+
39
+ Validation.assert_is_a(NotificationConfig, notifications, 'notifications', true)
40
+ @notifications = notifications
41
+
42
+ Validation.assert_is_a(Array, requested_checks, 'requested_checks', true)
43
+ @requested_checks = requested_checks
44
+
45
+ Validation.assert_is_a(Array, requested_tasks, 'requested_tasks', true)
46
+ @requested_tasks = requested_tasks
47
+
48
+ Validation.assert_is_a(SdkConfig, sdk_config, 'sdk_config', true)
49
+ @sdk_config = sdk_config
50
+
51
+ Validation.assert_is_a(Array, required_documents, 'required_documents', true)
52
+ @required_documents = required_documents
53
+
54
+ @block_biometric_consent = block_biometric_consent
55
+ end
56
+
57
+ def to_json(*_args)
58
+ as_json.to_json
59
+ end
60
+
61
+ def as_json(*_args)
62
+ {
63
+ client_session_token_ttl: @client_session_token_ttl,
64
+ resources_ttl: @resources_ttl,
65
+ user_tracking_id: @user_tracking_id,
66
+ notifications: @notifications,
67
+ requested_checks: @requested_checks.map(&:as_json),
68
+ requested_tasks: @requested_tasks.map(&:as_json),
69
+ sdk_config: @sdk_config,
70
+ required_documents: @required_documents.map(&:as_json),
71
+ block_biometric_consent: @block_biometric_consent
72
+ }.compact
73
+ end
74
+
75
+ #
76
+ # @return [SessionSpecificationBuilder]
77
+ #
78
+ def self.builder
79
+ SessionSpecificationBuilder.new
80
+ end
81
+ end
82
+
83
+ class SessionSpecificationBuilder
84
+ def initialize
85
+ @requested_checks = []
86
+ @requested_tasks = []
87
+ @required_documents = []
88
+ end
89
+
90
+ #
91
+ # Client-session-token time-to-live to apply to the created session
92
+ #
93
+ # @param [Integer] client_session_token_ttl
94
+ #
95
+ # @return [self]
96
+ #
97
+ def with_client_session_token_ttl(client_session_token_ttl)
98
+ @client_session_token_ttl = client_session_token_ttl
99
+ self
100
+ end
101
+
102
+ #
103
+ # Time-to-live used for all Resources created in the course of the session
104
+ #
105
+ # @param [Integer] resources_ttl
106
+ #
107
+ # @return [self]
108
+ #
109
+ def with_resources_ttl(resources_ttl)
110
+ @resources_ttl = resources_ttl
111
+ self
112
+ end
113
+
114
+ #
115
+ # User tracking id, for the Relying Business to track returning users
116
+ #
117
+ # @param [String] user_tracking_id
118
+ #
119
+ # @return [self]
120
+ #
121
+ def with_user_tracking_id(user_tracking_id)
122
+ @user_tracking_id = user_tracking_id
123
+ self
124
+ end
125
+
126
+ #
127
+ # For configuring call-back messages
128
+ #
129
+ # @param [NotificationConfig] notifications
130
+ #
131
+ # @return [self]
132
+ #
133
+ def with_notifications(notifications)
134
+ @notifications = notifications
135
+ self
136
+ end
137
+
138
+ #
139
+ # The check to be performed on each Document
140
+ #
141
+ # @param [RequestedCheck] requested_check
142
+ #
143
+ # @return [self]
144
+ #
145
+ def with_requested_check(requested_check)
146
+ Validation.assert_is_a(RequestedCheck, requested_check, 'requested_check')
147
+ @requested_checks.push(requested_check)
148
+ self
149
+ end
150
+
151
+ #
152
+ # The task to be performed on each Document
153
+ #
154
+ # @param [RequestedTask] requested_task
155
+ #
156
+ # @return [self]
157
+ #
158
+ def with_requested_task(requested_task)
159
+ Validation.assert_is_a(RequestedTask, requested_task, 'requested_task')
160
+ @requested_tasks.push(requested_task)
161
+ self
162
+ end
163
+
164
+ #
165
+ # The SDK configuration set on the session specification
166
+ #
167
+ # @param [SdkConfig] sdk_config
168
+ #
169
+ # @return [self]
170
+ #
171
+ def with_sdk_config(sdk_config)
172
+ @sdk_config = sdk_config
173
+ self
174
+ end
175
+
176
+ #
177
+ # Adds a RequiredDocument to the list documents required from the client
178
+ #
179
+ # @param [RequiredDocument] required_document
180
+ #
181
+ # @return [self]
182
+ #
183
+ def with_required_document(required_document)
184
+ Validation.assert_is_a(RequiredDocument, required_document, 'required_document')
185
+ @required_documents.push(required_document)
186
+ self
187
+ end
188
+
189
+ #
190
+ # Whether or not to block the collection of biometric consent
191
+ #
192
+ # @param [Boolean] block_biometric_consent
193
+ #
194
+ # @return [self]
195
+ #
196
+ def with_block_biometric_consent(block_biometric_consent)
197
+ @block_biometric_consent = block_biometric_consent
198
+ self
199
+ end
200
+
201
+ #
202
+ # @return [SessionSpecification]
203
+ #
204
+ def build
205
+ SessionSpecification.new(
206
+ @client_session_token_ttl,
207
+ @resources_ttl,
208
+ @user_tracking_id,
209
+ @notifications,
210
+ @requested_checks,
211
+ @requested_tasks,
212
+ @sdk_config,
213
+ @required_documents,
214
+ @block_biometric_consent
215
+ )
216
+ end
217
+ end
218
+ end
219
+ end
220
+ end
221
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Yoti
4
+ module DocScan
5
+ module Session
6
+ module Retrieve
7
+ class AuthenticityCheckResponse < CheckResponse
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Yoti
4
+ module DocScan
5
+ module Session
6
+ module Retrieve
7
+ class BreakdownResponse
8
+ # @return [String]
9
+ attr_reader :sub_check
10
+
11
+ # @return [String]
12
+ attr_reader :result
13
+
14
+ # @return [Array<DetailsResponse>]
15
+ attr_reader :details
16
+
17
+ #
18
+ # @param [Hash] breakdown
19
+ #
20
+ def initialize(breakdown)
21
+ Validation.assert_is_a(String, breakdown['sub_check'], 'sub_check', true)
22
+ @sub_check = breakdown['sub_check']
23
+
24
+ Validation.assert_is_a(String, breakdown['result'], 'result', true)
25
+ @result = breakdown['result']
26
+
27
+ if breakdown['details'].nil?
28
+ @details = []
29
+ else
30
+ Validation.assert_is_a(Array, breakdown['details'], 'details')
31
+ @details = breakdown['details'].map { |details| DetailsResponse.new(details) }
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Yoti
4
+ module DocScan
5
+ module Session
6
+ module Retrieve
7
+ class CheckResponse
8
+ # @return [String]
9
+ attr_reader :type
10
+
11
+ # @return [String]
12
+ attr_reader :id
13
+
14
+ # @return [String]
15
+ attr_reader :state
16
+
17
+ # @return [Array<String>]
18
+ attr_reader :resources_used
19
+
20
+ # @return [Array<GeneratedMedia>]
21
+ attr_reader :generated_media
22
+
23
+ # @return [<ReportResponse>]
24
+ attr_reader :report
25
+
26
+ # @return [<DateTime>]
27
+ attr_reader :created
28
+
29
+ # @return [<DateTime>]
30
+ attr_reader :last_updated
31
+
32
+ #
33
+ # @param [Hash] check
34
+ #
35
+ def initialize(check)
36
+ Validation.assert_is_a(String, check['type'], 'type', true)
37
+ @type = check['type']
38
+
39
+ Validation.assert_is_a(String, check['id'], 'id', true)
40
+ @id = check['id']
41
+
42
+ Validation.assert_is_a(String, check['state'], 'state', true)
43
+ @state = check['state']
44
+
45
+ Validation.assert_is_a(Array, check['resources_used'], 'resources_used', true)
46
+ @resources_used = check['resources_used']
47
+
48
+ if check['generated_media'].nil?
49
+ @generated_media = []
50
+ else
51
+ Validation.assert_is_a(Array, check['generated_media'], 'generated_media')
52
+ @generated_media = check['generated_media'].map { |media| GeneratedMedia.new(media) }
53
+ end
54
+
55
+ @report = ReportResponse.new(check['report']) unless check['report'].nil?
56
+ @created = DateTime.parse(check['created']) unless check['created'].nil?
57
+ @last_updated = DateTime.parse(check['last_updated']) unless check['last_updated'].nil?
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Yoti
4
+ module DocScan
5
+ module Session
6
+ module Retrieve
7
+ class DetailsResponse
8
+ # @return [String]
9
+ attr_reader :name
10
+
11
+ # @return [String]
12
+ attr_reader :value
13
+
14
+ #
15
+ # @param [Hash] details
16
+ #
17
+ def initialize(details)
18
+ Validation.assert_is_a(String, details['name'], 'name', true)
19
+ @name = details['name']
20
+
21
+ Validation.assert_is_a(String, details['value'], 'value', true)
22
+ @value = details['value']
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ 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 DocumentFieldsResponse
8
+ # @return [MediaResponse]
9
+ attr_reader :media
10
+
11
+ #
12
+ # @param [Hash] document_fields
13
+ #
14
+ def initialize(document_fields)
15
+ @media = MediaResponse.new(document_fields['media']) unless document_fields['media'].nil?
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ 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 DocumentIdPhotoResponse
8
+ # @return [MediaResponse]
9
+ attr_reader :media
10
+
11
+ #
12
+ # @param [Hash] document_id_photo
13
+ #
14
+ def initialize(document_id_photo)
15
+ @media = MediaResponse.new(document_id_photo['media']) unless document_id_photo['media'].nil?
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ 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 FaceMapResponse
8
+ # @return [MediaResponse]
9
+ attr_reader :media
10
+
11
+ #
12
+ # @param [Hash] facemap
13
+ #
14
+ def initialize(facemap)
15
+ @media = MediaResponse.new(facemap['media']) unless facemap['media'].nil?
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Yoti
4
+ module DocScan
5
+ module Session
6
+ module Retrieve
7
+ class FaceMatchCheckResponse < CheckResponse
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end