yoti 1.6.3 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +22 -224
  3. data/lib/yoti.rb +54 -1
  4. data/lib/yoti/client.rb +13 -4
  5. data/lib/yoti/configuration.rb +7 -2
  6. data/lib/yoti/data_type/age_verification.rb +1 -1
  7. data/lib/yoti/data_type/base_profile.rb +1 -1
  8. data/lib/yoti/data_type/image.rb +4 -12
  9. data/lib/yoti/data_type/image_jpeg.rb +2 -0
  10. data/lib/yoti/data_type/image_png.rb +2 -0
  11. data/lib/yoti/data_type/media.rb +19 -0
  12. data/lib/yoti/data_type/signed_time_stamp.rb +1 -1
  13. data/lib/yoti/doc_scan/client.rb +187 -0
  14. data/lib/yoti/doc_scan/constants.rb +31 -0
  15. data/lib/yoti/doc_scan/errors.rb +81 -0
  16. data/lib/yoti/doc_scan/session/create/create_session_result.rb +50 -0
  17. data/lib/yoti/doc_scan/session/create/document_filter.rb +31 -0
  18. data/lib/yoti/doc_scan/session/create/document_restrictions_filter.rb +140 -0
  19. data/lib/yoti/doc_scan/session/create/notification_config.rb +142 -0
  20. data/lib/yoti/doc_scan/session/create/orthogonal_restrictions_filter.rb +150 -0
  21. data/lib/yoti/doc_scan/session/create/requested_check.rb +39 -0
  22. data/lib/yoti/doc_scan/session/create/requested_document_authenticity_check.rb +95 -0
  23. data/lib/yoti/doc_scan/session/create/requested_face_match_check.rb +95 -0
  24. data/lib/yoti/doc_scan/session/create/requested_id_document_comparison_check.rb +53 -0
  25. data/lib/yoti/doc_scan/session/create/requested_liveness_check.rb +108 -0
  26. data/lib/yoti/doc_scan/session/create/requested_task.rb +39 -0
  27. data/lib/yoti/doc_scan/session/create/requested_text_extraction_task.rb +116 -0
  28. data/lib/yoti/doc_scan/session/create/required_document.rb +31 -0
  29. data/lib/yoti/doc_scan/session/create/required_id_document.rb +53 -0
  30. data/lib/yoti/doc_scan/session/create/sdk_config.rb +221 -0
  31. data/lib/yoti/doc_scan/session/create/session_specification.rb +221 -0
  32. data/lib/yoti/doc_scan/session/retrieve/authenticity_check_response.rb +12 -0
  33. data/lib/yoti/doc_scan/session/retrieve/breakdown_response.rb +38 -0
  34. data/lib/yoti/doc_scan/session/retrieve/check_response.rb +63 -0
  35. data/lib/yoti/doc_scan/session/retrieve/details_response.rb +28 -0
  36. data/lib/yoti/doc_scan/session/retrieve/document_fields_response.rb +21 -0
  37. data/lib/yoti/doc_scan/session/retrieve/document_id_photo_response.rb +21 -0
  38. data/lib/yoti/doc_scan/session/retrieve/face_map_response.rb +21 -0
  39. data/lib/yoti/doc_scan/session/retrieve/face_match_check_response.rb +12 -0
  40. data/lib/yoti/doc_scan/session/retrieve/frame_response.rb +21 -0
  41. data/lib/yoti/doc_scan/session/retrieve/generated_check_response.rb +28 -0
  42. data/lib/yoti/doc_scan/session/retrieve/generated_media.rb +28 -0
  43. data/lib/yoti/doc_scan/session/retrieve/generated_text_data_check_response.rb +12 -0
  44. data/lib/yoti/doc_scan/session/retrieve/get_session_result.rb +127 -0
  45. data/lib/yoti/doc_scan/session/retrieve/id_document_comparison_check_response.rb +12 -0
  46. data/lib/yoti/doc_scan/session/retrieve/id_document_resource_response.rb +57 -0
  47. data/lib/yoti/doc_scan/session/retrieve/liveness_check_response.rb +12 -0
  48. data/lib/yoti/doc_scan/session/retrieve/liveness_resource_response.rb +24 -0
  49. data/lib/yoti/doc_scan/session/retrieve/media_response.rb +38 -0
  50. data/lib/yoti/doc_scan/session/retrieve/page_response.rb +27 -0
  51. data/lib/yoti/doc_scan/session/retrieve/recommendation_response.rb +34 -0
  52. data/lib/yoti/doc_scan/session/retrieve/report_response.rb +31 -0
  53. data/lib/yoti/doc_scan/session/retrieve/resource_container.rb +50 -0
  54. data/lib/yoti/doc_scan/session/retrieve/resource_response.rb +39 -0
  55. data/lib/yoti/doc_scan/session/retrieve/task_response.rb +87 -0
  56. data/lib/yoti/doc_scan/session/retrieve/text_data_check_response.rb +12 -0
  57. data/lib/yoti/doc_scan/session/retrieve/text_extraction_task_response.rb +18 -0
  58. data/lib/yoti/doc_scan/session/retrieve/zoom_liveness_resource_response.rb +33 -0
  59. data/lib/yoti/doc_scan/support/supported_documents.rb +60 -0
  60. data/lib/yoti/dynamic_share_service/extension/thirdparty_attribute_extension.rb +62 -11
  61. data/lib/yoti/dynamic_share_service/policy/dynamic_policy.rb +84 -22
  62. data/lib/yoti/dynamic_share_service/share_url.rb +28 -33
  63. data/lib/yoti/errors.rb +15 -2
  64. data/lib/yoti/http/aml_check_request.rb +12 -6
  65. data/lib/yoti/http/payloads/aml_address.rb +4 -0
  66. data/lib/yoti/http/payloads/aml_profile.rb +7 -1
  67. data/lib/yoti/http/profile_request.rb +11 -6
  68. data/lib/yoti/http/request.rb +221 -18
  69. data/lib/yoti/http/signed_request.rb +13 -4
  70. data/lib/yoti/protobuf/main.rb +1 -1
  71. data/lib/yoti/ssl.rb +2 -2
  72. data/lib/yoti/util/anchor_processor.rb +1 -1
  73. data/lib/yoti/util/validation.rb +41 -0
  74. data/lib/yoti/version.rb +1 -1
  75. data/yoti.gemspec +19 -9
  76. metadata +60 -67
  77. data/.github/ISSUE_TEMPLATE.md +0 -17
  78. data/.gitignore +0 -39
  79. data/CONTRIBUTING.md +0 -127
  80. data/Guardfile +0 -11
  81. data/Rakefile +0 -49
  82. data/login_flow.png +0 -0
  83. data/rubocop.yml +0 -57
  84. data/yardstick.yml +0 -9
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Yoti
4
+ module DocScan
5
+ module Session
6
+ module Create
7
+ class RequiredDocument
8
+ #
9
+ # @param [String] type
10
+ #
11
+ def initialize(type)
12
+ raise(TypeError, "#{self.class} cannot be instantiated") if self.class == RequiredDocument
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,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Yoti
4
+ module DocScan
5
+ module Session
6
+ module Create
7
+ class RequiredIdDocument < RequiredDocument
8
+ #
9
+ # @param [DocumentFilter] filter
10
+ #
11
+ def initialize(filter = nil)
12
+ super(Constants::ID_DOCUMENT)
13
+
14
+ Validation.assert_is_a(DocumentFilter, filter, 'filter', true)
15
+ @filter = filter
16
+ end
17
+
18
+ def as_json(*_args)
19
+ json = super
20
+ json[:filter] = @filter.as_json unless @filter.nil?
21
+ json
22
+ end
23
+
24
+ #
25
+ # @return [RequiredIdDocumentBuilder]
26
+ #
27
+ def self.builder
28
+ RequiredIdDocumentBuilder.new
29
+ end
30
+ end
31
+
32
+ class RequiredIdDocumentBuilder
33
+ #
34
+ # @param [DocumentFilter] filter
35
+ #
36
+ # @return [self]
37
+ #
38
+ def with_filter(filter)
39
+ @filter = filter
40
+ self
41
+ end
42
+
43
+ #
44
+ # @return [RequiredIdDocument]
45
+ #
46
+ def build
47
+ RequiredIdDocument.new(@filter)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,221 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Yoti
4
+ module DocScan
5
+ module Session
6
+ module Create
7
+ class SdkConfig
8
+ #
9
+ # @param [String] allowed_capture_methods
10
+ # @param [String] primary_colour
11
+ # @param [String] secondary_colour
12
+ # @param [String] font_colour
13
+ # @param [String] locale
14
+ # @param [String] preset_issuing_country
15
+ # @param [String] success_url
16
+ # @param [String] error_url
17
+ #
18
+ def initialize(
19
+ allowed_capture_methods,
20
+ primary_colour,
21
+ secondary_colour,
22
+ font_colour,
23
+ locale,
24
+ preset_issuing_country,
25
+ success_url,
26
+ error_url
27
+ )
28
+ Validation.assert_is_a(String, allowed_capture_methods, 'allowed_capture_methods', true)
29
+ @allowed_capture_methods = allowed_capture_methods
30
+
31
+ Validation.assert_is_a(String, primary_colour, 'primary_colour', true)
32
+ @primary_colour = primary_colour
33
+
34
+ Validation.assert_is_a(String, secondary_colour, 'secondary_colour', true)
35
+ @secondary_colour = secondary_colour
36
+
37
+ Validation.assert_is_a(String, font_colour, 'font_colour', true)
38
+ @font_colour = font_colour
39
+
40
+ Validation.assert_is_a(String, locale, 'locale', true)
41
+ @locale = locale
42
+
43
+ Validation.assert_is_a(String, preset_issuing_country, 'preset_issuing_country', true)
44
+ @preset_issuing_country = preset_issuing_country
45
+
46
+ Validation.assert_is_a(String, success_url, 'success_url', true)
47
+ @success_url = success_url
48
+
49
+ Validation.assert_is_a(String, error_url, 'error_url', true)
50
+ @error_url = error_url
51
+ end
52
+
53
+ def to_json(*_args)
54
+ as_json.to_json
55
+ end
56
+
57
+ def as_json(*_args)
58
+ {
59
+ allowed_capture_methods: @allowed_capture_methods,
60
+ primary_colour: @primary_colour,
61
+ secondary_colour: @secondary_colour,
62
+ font_colour: @font_colour,
63
+ locale: @locale,
64
+ preset_issuing_country: @preset_issuing_country,
65
+ success_url: @success_url,
66
+ error_url: @error_url
67
+ }.compact
68
+ end
69
+
70
+ #
71
+ # @return [SdkConfigBuilder]
72
+ #
73
+ def self.builder
74
+ SdkConfigBuilder.new
75
+ end
76
+ end
77
+
78
+ #
79
+ # Builder to assist in the creation of {SdkConfig}.
80
+ #
81
+ class SdkConfigBuilder
82
+ def initialize
83
+ @topics = []
84
+ end
85
+
86
+ #
87
+ # Sets the allowed capture method to "CAMERA"
88
+ #
89
+ # @return [self]
90
+ #
91
+ def with_allows_camera
92
+ with_allowed_capture_methods(Constants::CAMERA)
93
+ end
94
+
95
+ #
96
+ # Sets the allowed capture method to "CAMERA_AND_UPLOAD"
97
+ #
98
+ # @return [self]
99
+ #
100
+ def with_allows_camera_and_upload
101
+ with_allowed_capture_methods(Constants::CAMERA_AND_UPLOAD)
102
+ end
103
+
104
+ #
105
+ # Sets the allowed capture method
106
+ #
107
+ # @param [String] allowed_capture_methods
108
+ #
109
+ # @return [self]
110
+ #
111
+ def with_allowed_capture_methods(allowed_capture_methods)
112
+ @allowed_capture_methods = allowed_capture_methods
113
+ self
114
+ end
115
+
116
+ #
117
+ # Sets the primary colour to be used by the web/native client
118
+ #
119
+ # @param [String] primary_colour
120
+ #
121
+ # @return [self]
122
+ #
123
+ def with_primary_colour(primary_colour)
124
+ @primary_colour = primary_colour
125
+ self
126
+ end
127
+
128
+ #
129
+ # Sets the secondary colour to be used by the web/native client (used on the button)
130
+ #
131
+ # @param [String] secondary_colour
132
+ #
133
+ # @return [self]
134
+ #
135
+ def with_secondary_colour(secondary_colour)
136
+ @secondary_colour = secondary_colour
137
+ self
138
+ end
139
+
140
+ #
141
+ # Sets the font colour to be used by the web/native client (used on the button)
142
+ #
143
+ # @param [String] font_colour
144
+ #
145
+ # @return [self]
146
+ #
147
+ def with_font_colour(font_colour)
148
+ @font_colour = font_colour
149
+ self
150
+ end
151
+
152
+ #
153
+ # Sets the locale on the builder
154
+ #
155
+ # @param [String] locale
156
+ #
157
+ # @return [self]
158
+ #
159
+ def with_locale(locale)
160
+ @locale = locale
161
+ self
162
+ end
163
+
164
+ #
165
+ # Sets the preset issuing country on the builder
166
+ #
167
+ # @param [String] preset_issuing_country
168
+ #
169
+ # @return [self]
170
+ #
171
+ def with_preset_issuing_country(preset_issuing_country)
172
+ @preset_issuing_country = preset_issuing_country
173
+ self
174
+ end
175
+
176
+ #
177
+ # Sets the success URL for the redirect that follows the web/native client
178
+ # uploading documents successfully
179
+ #
180
+ # @param [String] success_url
181
+ #
182
+ # @return [self]
183
+ #
184
+ def with_success_url(success_url)
185
+ @success_url = success_url
186
+ self
187
+ end
188
+
189
+ #
190
+ # Sets the error URL for the redirect that follows the web/native client
191
+ # uploading documents unsuccessfully
192
+ #
193
+ # @param [String] error_url
194
+ #
195
+ # @return [self]
196
+ #
197
+ def with_error_url(error_url)
198
+ @error_url = error_url
199
+ self
200
+ end
201
+
202
+ #
203
+ # @return [SdkConfig]
204
+ #
205
+ def build
206
+ SdkConfig.new(
207
+ @allowed_capture_methods,
208
+ @primary_colour,
209
+ @secondary_colour,
210
+ @font_colour,
211
+ @locale,
212
+ @preset_issuing_country,
213
+ @success_url,
214
+ @error_url
215
+ )
216
+ end
217
+ end
218
+ end
219
+ end
220
+ end
221
+ end
@@ -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