selfsdk 0.0.196 → 0.0.197
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/authenticated.rb +1 -0
- data/lib/messages/fact_request.rb +7 -1
- data/lib/messages/fact_response.rb +9 -0
- data/lib/messages/message.rb +2 -10
- data/lib/selfsdk.rb +7 -2
- data/lib/services/auth.rb +24 -68
- data/lib/services/facts.rb +18 -150
- data/lib/services/messaging.rb +1 -1
- data/lib/services/requester.rb +242 -0
- data/lib/source_definition.rb +61 -0
- data/lib/sources.rb +4 -60
- metadata +3 -4
- data/lib/messages/authentication_message.rb +0 -31
- data/lib/messages/authentication_req.rb +0 -55
- data/lib/messages/authentication_resp.rb +0 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 88cd6714a5c258e5777b5c7ce465c998b9215fb16459e1687282e3695961fb2a
|
4
|
+
data.tar.gz: b05a49bc266ba95b6a957bea27b31edd5216afeea30dc159ca134b65ecf59261
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e9bea262aad81d5125dce00ce7afebb05b454eec6e7c26ab8a147ac5177894add5ae827158418100944bd729f8378c59d0296b57a792e688658edf917f2f7b01
|
7
|
+
data.tar.gz: 2aafa0e3b09648a67e95d662e19694faa9fb56fe90161cb44f045108f5aee004611390e9e702e0b198a0d9516d21e90ec61170a9b79d70f4b66c1a8694b87a3b
|
data/lib/authenticated.rb
CHANGED
@@ -12,7 +12,12 @@ module SelfSDK
|
|
12
12
|
MSG_TYPE = "identities.facts.query.req"
|
13
13
|
DEFAULT_EXP_TIMEOUT = 900
|
14
14
|
|
15
|
-
attr_accessor :facts, :options
|
15
|
+
attr_accessor :facts, :options, :auth
|
16
|
+
|
17
|
+
def initialize(messaging)
|
18
|
+
@typ = MSG_TYPE
|
19
|
+
super
|
20
|
+
end
|
16
21
|
|
17
22
|
def parse_facts(facts)
|
18
23
|
@facts = []
|
@@ -82,6 +87,7 @@ module SelfSDK
|
|
82
87
|
b = {
|
83
88
|
typ: MSG_TYPE,
|
84
89
|
iss: @jwt.id,
|
90
|
+
aud: @to,
|
85
91
|
sub: @to,
|
86
92
|
iat: SelfSDK::Time.now.strftime('%FT%TZ'),
|
87
93
|
exp: (SelfSDK::Time.now + @exp_timeout).strftime('%FT%TZ'),
|
@@ -13,6 +13,11 @@ module SelfSDK
|
|
13
13
|
|
14
14
|
attr_accessor :facts, :audience, :auth
|
15
15
|
|
16
|
+
def initialize(messaging)
|
17
|
+
@typ = MSG_TYPE
|
18
|
+
super
|
19
|
+
end
|
20
|
+
|
16
21
|
def parse(input, envelope=nil)
|
17
22
|
@input = input
|
18
23
|
@typ = MSG_TYPE
|
@@ -84,6 +89,10 @@ module SelfSDK
|
|
84
89
|
auth: @auth }
|
85
90
|
end
|
86
91
|
|
92
|
+
def auth_response?
|
93
|
+
@auth == true
|
94
|
+
end
|
95
|
+
|
87
96
|
protected
|
88
97
|
|
89
98
|
def proto(to_device)
|
data/lib/messages/message.rb
CHANGED
@@ -4,8 +4,6 @@
|
|
4
4
|
|
5
5
|
require_relative "fact_request"
|
6
6
|
require_relative "fact_response"
|
7
|
-
require_relative "authentication_resp"
|
8
|
-
require_relative "authentication_req"
|
9
7
|
require_relative "chat_message"
|
10
8
|
require_relative "chat_message_read"
|
11
9
|
require_relative "chat_message_delivered"
|
@@ -30,18 +28,12 @@ module SelfSDK
|
|
30
28
|
payload = JSON.parse(messaging.jwt.decode(jwt[:payload]), symbolize_names: true)
|
31
29
|
|
32
30
|
case payload[:typ]
|
33
|
-
when
|
31
|
+
when SelfSDK::Messages::FactRequest::MSG_TYPE
|
34
32
|
m = FactRequest.new(messaging)
|
35
33
|
m.parse(body, envelope)
|
36
|
-
when
|
34
|
+
when SelfSDK::Messages::FactResponse::MSG_TYPE
|
37
35
|
m = FactResponse.new(messaging)
|
38
36
|
m.parse(body, envelope)
|
39
|
-
when "identities.authenticate.resp"
|
40
|
-
m = AuthenticationResp.new(messaging)
|
41
|
-
m.parse(body, envelope)
|
42
|
-
when "identities.authenticate.req"
|
43
|
-
m = AuthenticationReq.new(messaging)
|
44
|
-
m.parse(body, envelope)
|
45
37
|
when SelfSDK::Messages::ChatMessage::MSG_TYPE
|
46
38
|
m = ChatMessage.new(messaging)
|
47
39
|
m.parse(body, envelope)
|
data/lib/selfsdk.rb
CHANGED
@@ -17,6 +17,7 @@ require_relative 'authenticated'
|
|
17
17
|
require_relative 'acl'
|
18
18
|
require_relative 'sources'
|
19
19
|
require_relative 'services/auth'
|
20
|
+
require_relative 'services/requester'
|
20
21
|
require_relative 'services/facts'
|
21
22
|
require_relative 'services/identity'
|
22
23
|
require_relative 'services/messaging'
|
@@ -66,12 +67,12 @@ module SelfSDK
|
|
66
67
|
|
67
68
|
# Provides access to SelfSDK::Services::Facts service
|
68
69
|
def facts
|
69
|
-
@facts ||= SelfSDK::Services::Facts.new(
|
70
|
+
@facts ||= SelfSDK::Services::Facts.new(requester)
|
70
71
|
end
|
71
72
|
|
72
73
|
# Provides access to SelfSDK::Services::Authentication service
|
73
74
|
def authentication
|
74
|
-
@authentication ||= SelfSDK::Services::Authentication.new(
|
75
|
+
@authentication ||= SelfSDK::Services::Authentication.new(requester)
|
75
76
|
end
|
76
77
|
|
77
78
|
# Provides access to SelfSDK::Services::Identity service
|
@@ -109,6 +110,10 @@ module SelfSDK
|
|
109
110
|
|
110
111
|
protected
|
111
112
|
|
113
|
+
def requester
|
114
|
+
@requester ||= SelfSDK::Services::Requester.new(messaging, @client)
|
115
|
+
end
|
116
|
+
|
112
117
|
def base_url(opts)
|
113
118
|
return opts[:base_url] if opts.key? :base_url
|
114
119
|
return "https://api.#{opts[:env].to_s}.joinself.com" if opts.key? :env
|
data/lib/services/auth.rb
CHANGED
@@ -16,10 +16,8 @@ module SelfSDK
|
|
16
16
|
# @param client [SelfSDK::Client] http client object.
|
17
17
|
#
|
18
18
|
# @return [SelfSDK::Services::Authentication] authentication service.
|
19
|
-
def initialize(
|
20
|
-
@
|
21
|
-
@messaging_service = messaging
|
22
|
-
@client = client
|
19
|
+
def initialize(requester)
|
20
|
+
@requester = requester
|
23
21
|
end
|
24
22
|
|
25
23
|
# Sends an authentication request to the specified selfid.
|
@@ -30,6 +28,7 @@ module SelfSDK
|
|
30
28
|
# @param [String] selfid the receiver of the authentication request.
|
31
29
|
# @param [Hash] opts the options to authenticate.
|
32
30
|
# @option opts [String] :cid The unique identifier of the authentication request.
|
31
|
+
# @option opts [Array] :facts array of facts to be requested
|
33
32
|
# @yield [request] Invokes the block with an authentication response for each result.
|
34
33
|
# @return [String, String] conversation id or encoded body.
|
35
34
|
#
|
@@ -38,29 +37,21 @@ module SelfSDK
|
|
38
37
|
# @param [Hash] opts the options to authenticate.
|
39
38
|
# @option [Boolean] :async if the request is asynchronous.
|
40
39
|
# @option opts [String] :cid The unique identifier of the authentication request.
|
40
|
+
# @option opts [Array] :facts array of facts to be requested
|
41
41
|
# @return [String, String] conversation id or encoded body.
|
42
42
|
def request(selfid, opts = {}, &block)
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
# when a block is given the request will always be asynchronous.
|
57
|
-
if block_given?
|
58
|
-
@messaging.set_observer(req, timeout: req.exp_timeout, &block)
|
59
|
-
return req.send_message
|
60
|
-
end
|
61
|
-
|
62
|
-
# Otherwise the request is synchronous
|
63
|
-
req.request
|
43
|
+
opts[:auth] = true
|
44
|
+
facts = opts.fetch(:facts, [])
|
45
|
+
|
46
|
+
@requester.request(selfid, facts, opts, &block)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Adds an observer for a fact response
|
50
|
+
# Whenever you receive a fact response registered observers will receive a notification.
|
51
|
+
#
|
52
|
+
# @yield [request] Invokes the block with a fact response message.
|
53
|
+
def subscribe(&block)
|
54
|
+
@requester.subscribe(true, &block)
|
64
55
|
end
|
65
56
|
|
66
57
|
# Generates a QR code so users can authenticate to your app.
|
@@ -70,10 +61,10 @@ module SelfSDK
|
|
70
61
|
#
|
71
62
|
# @return [String, String] conversation id or encoded body.
|
72
63
|
def generate_qr(opts = {})
|
73
|
-
opts[:
|
74
|
-
|
75
|
-
|
76
|
-
|
64
|
+
opts[:auth] = true
|
65
|
+
facts = opts.fetch(:facts, [])
|
66
|
+
|
67
|
+
@requester.generate_qr(facts, opts)
|
77
68
|
end
|
78
69
|
|
79
70
|
# Generates a deep link to authenticate with self app.
|
@@ -84,24 +75,10 @@ module SelfSDK
|
|
84
75
|
#
|
85
76
|
# @return [String, String] conversation id or encoded body.
|
86
77
|
def generate_deep_link(callback, opts = {})
|
87
|
-
opts[:
|
88
|
-
|
89
|
-
body = @client.jwt.encode(request(selfid, opts))
|
90
|
-
|
91
|
-
if @client.env.empty?
|
92
|
-
return "https://links.joinself.com/?link=#{callback}%3Fqr=#{body}&apn=com.joinself.app"
|
93
|
-
elsif @client.env == 'development'
|
94
|
-
return "https://links.joinself.com/?link=#{callback}%3Fqr=#{body}&apn=com.joinself.app.dev"
|
95
|
-
end
|
96
|
-
"https://#{@client.env}.links.joinself.com/?link=#{callback}%3Fqr=#{body}&apn=com.joinself.app.#{@client.env}"
|
97
|
-
end
|
78
|
+
opts[:auth] = true
|
79
|
+
facts = opts.fetch(:facts, [])
|
98
80
|
|
99
|
-
|
100
|
-
def subscribe(&block)
|
101
|
-
@messaging.subscribe :authentication_response do |res|
|
102
|
-
valid_payload(res.input)
|
103
|
-
yield(res)
|
104
|
-
end
|
81
|
+
@requester.generate_deep_link(facts, callback, opts)
|
105
82
|
end
|
106
83
|
|
107
84
|
private
|
@@ -130,27 +107,6 @@ module SelfSDK
|
|
130
107
|
nil
|
131
108
|
end
|
132
109
|
|
133
|
-
# Prepares an authentication payload to be sent to a user.
|
134
|
-
#
|
135
|
-
# @param selfid [string] the selfid of the user you want to send the auth request to.
|
136
|
-
# @param cid [string] the conversation id to be used.
|
137
|
-
def prepare_payload(selfid, cid)
|
138
|
-
# TODO should this be moved to its own message/auth_req.rb?
|
139
|
-
body = {
|
140
|
-
typ: 'identities.authenticate.req',
|
141
|
-
aud: @client.self_url,
|
142
|
-
iss: @client.jwt.id,
|
143
|
-
sub: selfid,
|
144
|
-
iat: SelfSDK::Time.now.strftime('%FT%TZ'),
|
145
|
-
exp: (SelfSDK::Time.now + 3600).strftime('%FT%TZ'),
|
146
|
-
cid: cid,
|
147
|
-
jti: SecureRandom.uuid,
|
148
|
-
device_id: @messaging.device_id,
|
149
|
-
}
|
150
|
-
|
151
|
-
@client.jwt.prepare(body)
|
152
|
-
end
|
153
|
-
|
154
110
|
def parse_payload(response)
|
155
111
|
jws = @client.jwt.parse(response)
|
156
112
|
return unless jws.include? :payload
|
@@ -161,7 +117,7 @@ module SelfSDK
|
|
161
117
|
identity = @client.entity(payload[:sub])
|
162
118
|
return if identity.nil?
|
163
119
|
|
164
|
-
|
120
|
+
payload
|
165
121
|
end
|
166
122
|
end
|
167
123
|
end
|
data/lib/services/facts.rb
CHANGED
@@ -18,10 +18,8 @@ module SelfSDK
|
|
18
18
|
# @param client [SelfSDK::Client] http client object.
|
19
19
|
#
|
20
20
|
# @return [SelfSDK::Services::Facts] facts service.
|
21
|
-
def initialize(
|
22
|
-
@
|
23
|
-
@messaging_service = messaging
|
24
|
-
@client = client
|
21
|
+
def initialize(requester)
|
22
|
+
@requester = requester
|
25
23
|
end
|
26
24
|
|
27
25
|
# Sends a fact request to the specified selfid.
|
@@ -29,45 +27,24 @@ module SelfSDK
|
|
29
27
|
# permission.
|
30
28
|
#
|
31
29
|
# @overload request(selfid, facts, opts = {}, &block)
|
32
|
-
# @param selfid [string] the receiver of the
|
33
|
-
# @param [
|
34
|
-
# @
|
30
|
+
# @param selfid [string] the receiver of the fact request.
|
31
|
+
# @param facts [Array] array of facts to be requested
|
32
|
+
# @param [Hash] opts the options to process the request.
|
33
|
+
# @option opts [String] :cid The unique identifier of the fact request.
|
35
34
|
# @yield [request] Invokes the given block when a response is received.
|
36
35
|
# @return [Object] SelfSDK:::Messages::FactRequest
|
37
36
|
#
|
38
37
|
# @overload request(selfid, facts, opts = {})
|
39
|
-
# @param selfid [string] the receiver of the
|
40
|
-
# @param [
|
41
|
-
# @
|
38
|
+
# @param selfid [string] the receiver of the fact request.
|
39
|
+
# @param facts [Array] array of facts to be requested
|
40
|
+
# @param [Hash] opts the options to request.
|
41
|
+
# @option opts [String] :cid The unique identifier of the fact request.
|
42
42
|
# @option opts [Integer] :exp_timeout timeout in seconds to expire the request.
|
43
43
|
# @option opts [Integer] :allowed_for number of seconds for enabling recurrent requests.
|
44
|
-
# @option opts [Boolean] :auth allows displaying the request as anuthentication request with facts.
|
45
44
|
# @return [Object] SelfSDK:::Messages::FactRequest
|
46
45
|
def request(selfid, facts, opts = {}, &block)
|
47
|
-
|
48
|
-
|
49
|
-
if rq
|
50
|
-
raise "You're not permitting connections from #{selfid}" unless @messaging_service.is_permitted?(selfid)
|
51
|
-
end
|
52
|
-
|
53
|
-
req = SelfSDK::Messages::FactRequest.new(@messaging)
|
54
|
-
req.populate(selfid, prepare_facts(facts), opts)
|
55
|
-
|
56
|
-
body = @client.jwt.prepare(req.body)
|
57
|
-
return body unless rq
|
58
|
-
|
59
|
-
# when a block is given the request will always be asynchronous.
|
60
|
-
if block_given?
|
61
|
-
@messaging.set_observer(req, timeout: req.exp_timeout, &block)
|
62
|
-
return req.send_message
|
63
|
-
end
|
64
|
-
|
65
|
-
if opts[:async] == true
|
66
|
-
return req.send_message
|
67
|
-
end
|
68
|
-
|
69
|
-
# Otherwise the request is synchronous
|
70
|
-
req.request
|
46
|
+
opts[:auth] = false # force auth to false as you have auth service to make auth requests
|
47
|
+
@requester.request(selfid, facts, opts, &block)
|
71
48
|
end
|
72
49
|
|
73
50
|
# Sends a request through an intermediary.
|
@@ -81,8 +58,7 @@ module SelfSDK
|
|
81
58
|
# @option opts [String] intermediary an intermediary identity to be used.
|
82
59
|
# @return [Object] SelfSDK:::Messages::FactRequest
|
83
60
|
def request_via_intermediary(selfid, facts, opts = {}, &block)
|
84
|
-
|
85
|
-
request(selfid, facts, opts, &block)
|
61
|
+
@requester.request_via_intermediary(selfid, facts, opts, &block)
|
86
62
|
end
|
87
63
|
|
88
64
|
# Adds an observer for a fact response
|
@@ -90,7 +66,7 @@ module SelfSDK
|
|
90
66
|
#
|
91
67
|
# @yield [request] Invokes the block with a fact response message.
|
92
68
|
def subscribe(&block)
|
93
|
-
@
|
69
|
+
@requester.subscribe(false, &block)
|
94
70
|
end
|
95
71
|
|
96
72
|
# Generates a QR code so users can send facts to your app.
|
@@ -101,10 +77,8 @@ module SelfSDK
|
|
101
77
|
#
|
102
78
|
# @return [String, String] conversation id or encoded body.
|
103
79
|
def generate_qr(facts, opts = {})
|
104
|
-
opts[:
|
105
|
-
|
106
|
-
req = request(selfid, facts, opts)
|
107
|
-
::RQRCode::QRCode.new(req, level: 'l')
|
80
|
+
opts[:auth] = false
|
81
|
+
@requester.generate_qr(facts, opts)
|
108
82
|
end
|
109
83
|
|
110
84
|
# Generates a deep link to authenticate with self app.
|
@@ -116,114 +90,8 @@ module SelfSDK
|
|
116
90
|
#
|
117
91
|
# @return [String, String] conversation id or encoded body.
|
118
92
|
def generate_deep_link(facts, callback, opts = {})
|
119
|
-
opts[:
|
120
|
-
|
121
|
-
body = @client.jwt.encode(request(selfid, facts, opts))
|
122
|
-
|
123
|
-
if @client.env.empty?
|
124
|
-
return "https://links.joinself.com/?link=#{callback}%3Fqr=#{body}&apn=com.joinself.app"
|
125
|
-
elsif @client.env == 'development'
|
126
|
-
return "https://links.joinself.com/?link=#{callback}%3Fqr=#{body}&apn=com.joinself.app.dev"
|
127
|
-
end
|
128
|
-
"https://#{@client.env}.links.joinself.com/?link=#{callback}%3Fqr=#{body}&apn=com.joinself.app.#{@client.env}"
|
129
|
-
end
|
130
|
-
|
131
|
-
private
|
132
|
-
|
133
|
-
# As request facts can accept an array of strings this populates with necessary
|
134
|
-
# structure this short fact definitions.
|
135
|
-
#
|
136
|
-
# @param facts [Array] an array of strings or hashes.
|
137
|
-
# @return [Array] a list of hashed facts.
|
138
|
-
def prepare_facts(facts)
|
139
|
-
fs = []
|
140
|
-
facts.each do |f|
|
141
|
-
fact = if f.is_a?(Hash)
|
142
|
-
f
|
143
|
-
else
|
144
|
-
{ fact: f }
|
145
|
-
end
|
146
|
-
# validate_fact!(fact)
|
147
|
-
fs << fact
|
148
|
-
end
|
149
|
-
fs
|
150
|
-
end
|
151
|
-
|
152
|
-
def validate_fact!(f)
|
153
|
-
errInvalidFactToSource = 'provided source does not support given fact'
|
154
|
-
errInvalidSource = 'provided fact does not specify a valid source'
|
155
|
-
|
156
|
-
raise 'provided fact does not specify a name' if f[:fact].empty?
|
157
|
-
return unless f.has_key? :sources
|
158
|
-
|
159
|
-
valid_sources = [SOURCE_USER_SPECIFIED,
|
160
|
-
SOURCE_PASSPORT,
|
161
|
-
SOURCE_DRIVING_LICENSE,
|
162
|
-
SOURCE_IDENTITY_CARD,
|
163
|
-
SOURCE_TWITTER,
|
164
|
-
SOURCE_LINKEDIN,
|
165
|
-
SOURCE_FACEBOK]
|
166
|
-
fact_for_passport = [FACT_DOCUMENT_NUMBER,
|
167
|
-
FACT_SURNAME,
|
168
|
-
FACT_GIVEN_NAMES,
|
169
|
-
FACT_DATE_OF_BIRTH,
|
170
|
-
FACT_DATE_OF_EXPIRATION,
|
171
|
-
FACT_SEX,
|
172
|
-
FACT_NATIONALITY,
|
173
|
-
FACT_COUNTRY_OF_ISSUANCE]
|
174
|
-
|
175
|
-
facts_for_dl = [FACT_DOCUMENT_NUMBER,
|
176
|
-
FACT_SURNAME,
|
177
|
-
FACT_GIVEN_NAMES,
|
178
|
-
FACT_DATE_OF_BIRTH,
|
179
|
-
FACT_DATE_OF_ISSUANCE,
|
180
|
-
FACT_DATE_OF_EXPIRATION,
|
181
|
-
FACT_ADDRESS,
|
182
|
-
FACT_ISSUING_AUTHORITY,
|
183
|
-
FACT_PLACE_OF_BIRTH,
|
184
|
-
FACT_COUNTRY_OF_ISSUANCE]
|
185
|
-
|
186
|
-
facts_for_user = [FACT_DOCUMENT_NUMBER,
|
187
|
-
FACT_DISPLAY_NAME,
|
188
|
-
FACT_EMAIL,
|
189
|
-
FACT_PHONE]
|
190
|
-
|
191
|
-
facts_for_twitter = [FACT_ACCOUNT_ID, FACT_NICKNAME]
|
192
|
-
facts_for_linkedin = [FACT_ACCOUNT_ID, FACT_NICKNAME]
|
193
|
-
facts_for_facebook = [FACT_ACCOUNT_ID, FACT_NICKNAME]
|
194
|
-
facts_for_live = [FACT_SELFIE]
|
195
|
-
|
196
|
-
f[:sources].each do |s|
|
197
|
-
raise errInvalidSource unless valid_sources.include? s.to_s
|
198
|
-
|
199
|
-
if s.to_s == SOURCE_PASSPORT || s.to_s == SOURCE_IDENTITY_CARD
|
200
|
-
raise errInvalidFactToSource unless fact_for_passport.include? f[:fact]
|
201
|
-
end
|
202
|
-
|
203
|
-
if s.to_s == SOURCE_DRIVING_LICENSE
|
204
|
-
raise errInvalidFactToSource unless facts_for_dl.include? f[:fact]
|
205
|
-
end
|
206
|
-
|
207
|
-
if s.to_s == SOURCE_USER_SPECIFIED
|
208
|
-
raise errInvalidFactToSource unless facts_for_user.include? f[:fact].to_s
|
209
|
-
end
|
210
|
-
|
211
|
-
if s.to_s == SOURCE_TWITTER
|
212
|
-
raise errInvalidFactToSource unless facts_for_twitter.include? f[:fact].to_s
|
213
|
-
end
|
214
|
-
|
215
|
-
if s.to_s == SOURCE_LINKEDIN
|
216
|
-
raise errInvalidFactToSource unless facts_for_linkedin.include? f[:fact].to_s
|
217
|
-
end
|
218
|
-
|
219
|
-
if s.to_s == SOURCE_FACEBOOK
|
220
|
-
raise errInvalidFactToSource unless facts_for_facebook.include? f[:fact].to_s
|
221
|
-
end
|
222
|
-
|
223
|
-
if s.to_s == SOURCE_LIVE
|
224
|
-
raise errInvalidFactToSource unless facts_for_live.include? f[:fact].to_s
|
225
|
-
end
|
226
|
-
end
|
93
|
+
opts[:auth] = false
|
94
|
+
@requester.generate_deep_link(facts, callback, opts)
|
227
95
|
end
|
228
96
|
end
|
229
97
|
end
|
data/lib/services/messaging.rb
CHANGED
@@ -26,7 +26,7 @@ module SelfSDK
|
|
26
26
|
# Subscribes to a specific message type and attaches the given observer
|
27
27
|
# which will be executed when a meeting criteria message is received.
|
28
28
|
#
|
29
|
-
# @param [String] type message type (ex: SelfSDK::Messages::
|
29
|
+
# @param [String] type message type (ex: SelfSDK::Messages::FactRequest.MSG_TYPE
|
30
30
|
# @yield [SelfSDK::Messages::Message] receives incoming message.
|
31
31
|
def subscribe(type, &block)
|
32
32
|
@client.subscribe(type, &block)
|
@@ -0,0 +1,242 @@
|
|
1
|
+
# Copyright 2020 Self Group Ltd. All Rights Reserved.
|
2
|
+
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
# Namespace for classes and modules that handle SelfSDK gem
|
6
|
+
module SelfSDK
|
7
|
+
# Namespace for classes and modules that handle selfsdk-gem public ui
|
8
|
+
module Services
|
9
|
+
# Self provides this self-hosted verified intermediary.
|
10
|
+
DEFAULT_INTERMEDIARY = "self_intermediary"
|
11
|
+
# Input class to handle fact requests on self network.
|
12
|
+
class Requester
|
13
|
+
# Creates a new facts service.
|
14
|
+
# Facts service mainly manages fact requests against self users wanting
|
15
|
+
# to share their verified facts with your app.
|
16
|
+
#
|
17
|
+
# @param messaging [SelfSDK::Messaging] messaging object.
|
18
|
+
# @param client [SelfSDK::Client] http client object.
|
19
|
+
#
|
20
|
+
# @return [SelfSDK::Services::Facts] facts service.
|
21
|
+
def initialize(messaging, client)
|
22
|
+
@messaging = messaging.client
|
23
|
+
@messaging_service = messaging
|
24
|
+
@client = client
|
25
|
+
end
|
26
|
+
|
27
|
+
# Sends a fact request to the specified selfid.
|
28
|
+
# An fact request allows your app to access trusted facts of your user with its
|
29
|
+
# permission.
|
30
|
+
#
|
31
|
+
# @overload request(selfid, facts, opts = {}, &block)
|
32
|
+
# @param selfid [string] the receiver of the authentication request.
|
33
|
+
# @param [Hash] opts the options to authenticate.
|
34
|
+
# @option opts [String] :cid The unique identifier of the authentication request.
|
35
|
+
# @yield [request] Invokes the given block when a response is received.
|
36
|
+
# @return [Object] SelfSDK:::Messages::FactRequest
|
37
|
+
#
|
38
|
+
# @overload request(selfid, facts, opts = {})
|
39
|
+
# @param selfid [string] the receiver of the authentication request.
|
40
|
+
# @param [Hash] opts the options to authenticate.
|
41
|
+
# @option opts [String] :cid The unique identifier of the authentication request.
|
42
|
+
# @option opts [Integer] :exp_timeout timeout in seconds to expire the request.
|
43
|
+
# @option opts [Integer] :allowed_for number of seconds for enabling recurrent requests.
|
44
|
+
# @option opts [Boolean] :auth allows displaying the request as anuthentication request with facts.
|
45
|
+
# @return [Object] SelfSDK:::Messages::FactRequest
|
46
|
+
def request(selfid, facts, opts = {}, &block)
|
47
|
+
SelfSDK.logger.info "authenticating #{selfid}"
|
48
|
+
rq = opts.fetch(:request, true)
|
49
|
+
if rq
|
50
|
+
raise "You're not permitting connections from #{selfid}" unless @messaging_service.is_permitted?(selfid)
|
51
|
+
end
|
52
|
+
|
53
|
+
req = SelfSDK::Messages::FactRequest.new(@messaging)
|
54
|
+
req.populate(selfid, prepare_facts(facts), opts)
|
55
|
+
|
56
|
+
body = @client.jwt.prepare(req.body)
|
57
|
+
return body unless rq
|
58
|
+
|
59
|
+
# when a block is given the request will always be asynchronous.
|
60
|
+
if block_given?
|
61
|
+
@messaging.set_observer(req, timeout: req.exp_timeout, &block)
|
62
|
+
return req.send_message
|
63
|
+
end
|
64
|
+
|
65
|
+
if opts[:async] == true
|
66
|
+
return req.send_message
|
67
|
+
end
|
68
|
+
|
69
|
+
# Otherwise the request is synchronous
|
70
|
+
req.request
|
71
|
+
end
|
72
|
+
|
73
|
+
# Sends a request through an intermediary.
|
74
|
+
# An intermediary is an entity trusted by the user and acting as a proxy between you
|
75
|
+
# and the recipient of your fact request.
|
76
|
+
# Intermediaries usually do not provide the original user facts, but they create its
|
77
|
+
# own assertions based on your request and the user's facts.
|
78
|
+
#
|
79
|
+
# @param selfid [string] the receiver of the authentication request.
|
80
|
+
# @param [Hash] opts the options to authenticate.
|
81
|
+
# @option opts [String] intermediary an intermediary identity to be used.
|
82
|
+
# @return [Object] SelfSDK:::Messages::FactRequest
|
83
|
+
def request_via_intermediary(selfid, facts, opts = {}, &block)
|
84
|
+
opts[:intermediary] = opts.fetch(:intermediary, DEFAULT_INTERMEDIARY)
|
85
|
+
request(selfid, facts, opts, &block)
|
86
|
+
end
|
87
|
+
|
88
|
+
# Adds an observer for a fact response
|
89
|
+
# Whenever you receive a fact response registered observers will receive a notification.
|
90
|
+
#
|
91
|
+
# @yield [request] Invokes the block with a fact response message.
|
92
|
+
def subscribe(auth, &block)
|
93
|
+
if auth == true
|
94
|
+
@auth_subscription = block
|
95
|
+
else
|
96
|
+
@fact_subscription = block
|
97
|
+
end
|
98
|
+
|
99
|
+
@messaging.subscribe :fact_response do |res|
|
100
|
+
if res.auth_response?
|
101
|
+
@auth_subscription&.call(res)
|
102
|
+
else
|
103
|
+
@fact_subscription&.call(res)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
# Generates a QR code so users can send facts to your app.
|
109
|
+
#
|
110
|
+
# @param facts [Array] a list of facts to be requested.
|
111
|
+
# @option opts [String] :cid The unique identifier of the authentication request.
|
112
|
+
# @option opts [String] :options Options you want to share with the identity.
|
113
|
+
#
|
114
|
+
# @return [String, String] conversation id or encoded body.
|
115
|
+
def generate_qr(facts, opts = {})
|
116
|
+
opts[:request] = false
|
117
|
+
selfid = opts.fetch(:selfid, "-")
|
118
|
+
req = request(selfid, facts, opts)
|
119
|
+
::RQRCode::QRCode.new(req, level: 'l')
|
120
|
+
end
|
121
|
+
|
122
|
+
# Generates a deep link to authenticate with self app.
|
123
|
+
#
|
124
|
+
# @param facts [Array] a list of facts to be requested.
|
125
|
+
# @param callback [String] the url you'll be redirected if the app is not installed.
|
126
|
+
# @option opts [String] :selfid the user selfid you want to authenticate.
|
127
|
+
# @option opts [String] :cid The unique identifier of the authentication request.
|
128
|
+
#
|
129
|
+
# @return [String, String] conversation id or encoded body.
|
130
|
+
def generate_deep_link(facts, callback, opts = {})
|
131
|
+
opts[:request] = false
|
132
|
+
selfid = opts.fetch(:selfid, "-")
|
133
|
+
body = @client.jwt.encode(request(selfid, facts, opts))
|
134
|
+
|
135
|
+
if @client.env.empty?
|
136
|
+
return "https://links.joinself.com/?link=#{callback}%3Fqr=#{body}&apn=com.joinself.app"
|
137
|
+
elsif @client.env == 'development'
|
138
|
+
return "https://links.joinself.com/?link=#{callback}%3Fqr=#{body}&apn=com.joinself.app.dev"
|
139
|
+
end
|
140
|
+
"https://#{@client.env}.links.joinself.com/?link=#{callback}%3Fqr=#{body}&apn=com.joinself.app.#{@client.env}"
|
141
|
+
end
|
142
|
+
|
143
|
+
private
|
144
|
+
|
145
|
+
# As request facts can accept an array of strings this populates with necessary
|
146
|
+
# structure this short fact definitions.
|
147
|
+
#
|
148
|
+
# @param facts [Array] an array of strings or hashes.
|
149
|
+
# @return [Array] a list of hashed facts.
|
150
|
+
def prepare_facts(facts)
|
151
|
+
fs = []
|
152
|
+
facts.each do |f|
|
153
|
+
fact = if f.is_a?(Hash)
|
154
|
+
f
|
155
|
+
else
|
156
|
+
{ fact: f }
|
157
|
+
end
|
158
|
+
# validate_fact!(fact)
|
159
|
+
fs << fact
|
160
|
+
end
|
161
|
+
fs
|
162
|
+
end
|
163
|
+
|
164
|
+
def validate_fact!(f)
|
165
|
+
errInvalidFactToSource = 'provided source does not support given fact'
|
166
|
+
errInvalidSource = 'provided fact does not specify a valid source'
|
167
|
+
|
168
|
+
raise 'provided fact does not specify a name' if f[:fact].empty?
|
169
|
+
return unless f.has_key? :sources
|
170
|
+
|
171
|
+
valid_sources = [SOURCE_USER_SPECIFIED,
|
172
|
+
SOURCE_PASSPORT,
|
173
|
+
SOURCE_DRIVING_LICENSE,
|
174
|
+
SOURCE_IDENTITY_CARD,
|
175
|
+
SOURCE_TWITTER,
|
176
|
+
SOURCE_LINKEDIN,
|
177
|
+
SOURCE_FACEBOK]
|
178
|
+
fact_for_passport = [FACT_DOCUMENT_NUMBER,
|
179
|
+
FACT_SURNAME,
|
180
|
+
FACT_GIVEN_NAMES,
|
181
|
+
FACT_DATE_OF_BIRTH,
|
182
|
+
FACT_DATE_OF_EXPIRATION,
|
183
|
+
FACT_SEX,
|
184
|
+
FACT_NATIONALITY,
|
185
|
+
FACT_COUNTRY_OF_ISSUANCE]
|
186
|
+
|
187
|
+
facts_for_dl = [FACT_DOCUMENT_NUMBER,
|
188
|
+
FACT_SURNAME,
|
189
|
+
FACT_GIVEN_NAMES,
|
190
|
+
FACT_DATE_OF_BIRTH,
|
191
|
+
FACT_DATE_OF_ISSUANCE,
|
192
|
+
FACT_DATE_OF_EXPIRATION,
|
193
|
+
FACT_ADDRESS,
|
194
|
+
FACT_ISSUING_AUTHORITY,
|
195
|
+
FACT_PLACE_OF_BIRTH,
|
196
|
+
FACT_COUNTRY_OF_ISSUANCE]
|
197
|
+
|
198
|
+
facts_for_user = [FACT_DOCUMENT_NUMBER,
|
199
|
+
FACT_DISPLAY_NAME,
|
200
|
+
FACT_EMAIL,
|
201
|
+
FACT_PHONE]
|
202
|
+
|
203
|
+
facts_for_twitter = [FACT_ACCOUNT_ID, FACT_NICKNAME]
|
204
|
+
facts_for_linkedin = [FACT_ACCOUNT_ID, FACT_NICKNAME]
|
205
|
+
facts_for_facebook = [FACT_ACCOUNT_ID, FACT_NICKNAME]
|
206
|
+
facts_for_live = [FACT_SELFIE]
|
207
|
+
|
208
|
+
f[:sources].each do |s|
|
209
|
+
raise errInvalidSource unless valid_sources.include? s.to_s
|
210
|
+
|
211
|
+
if s.to_s == SOURCE_PASSPORT || s.to_s == SOURCE_IDENTITY_CARD
|
212
|
+
raise errInvalidFactToSource unless fact_for_passport.include? f[:fact]
|
213
|
+
end
|
214
|
+
|
215
|
+
if s.to_s == SOURCE_DRIVING_LICENSE
|
216
|
+
raise errInvalidFactToSource unless facts_for_dl.include? f[:fact]
|
217
|
+
end
|
218
|
+
|
219
|
+
if s.to_s == SOURCE_USER_SPECIFIED
|
220
|
+
raise errInvalidFactToSource unless facts_for_user.include? f[:fact].to_s
|
221
|
+
end
|
222
|
+
|
223
|
+
if s.to_s == SOURCE_TWITTER
|
224
|
+
raise errInvalidFactToSource unless facts_for_twitter.include? f[:fact].to_s
|
225
|
+
end
|
226
|
+
|
227
|
+
if s.to_s == SOURCE_LINKEDIN
|
228
|
+
raise errInvalidFactToSource unless facts_for_linkedin.include? f[:fact].to_s
|
229
|
+
end
|
230
|
+
|
231
|
+
if s.to_s == SOURCE_FACEBOOK
|
232
|
+
raise errInvalidFactToSource unless facts_for_facebook.include? f[:fact].to_s
|
233
|
+
end
|
234
|
+
|
235
|
+
if s.to_s == SOURCE_LIVE
|
236
|
+
raise errInvalidFactToSource unless facts_for_live.include? f[:fact].to_s
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end
|
242
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Do not edit this file, autogenerate it with "rake sources:generate" instead
|
4
|
+
module SelfSDK
|
5
|
+
SOURCE_DATA = {
|
6
|
+
"sources" => {
|
7
|
+
"user_specified" => [
|
8
|
+
"document_number",
|
9
|
+
"display_name",
|
10
|
+
"email_address",
|
11
|
+
"phone_number"
|
12
|
+
],
|
13
|
+
"passport" => [
|
14
|
+
"document_number",
|
15
|
+
"surname",
|
16
|
+
"given_names",
|
17
|
+
"date_of_birth",
|
18
|
+
"date_of_expiration",
|
19
|
+
"sex",
|
20
|
+
"nationality",
|
21
|
+
"country_of_issuance"
|
22
|
+
],
|
23
|
+
"driving_license" => [
|
24
|
+
"document_number",
|
25
|
+
"surname",
|
26
|
+
"given_names",
|
27
|
+
"date_of_birth",
|
28
|
+
"date_of_issuance",
|
29
|
+
"date_of_expiration",
|
30
|
+
"address",
|
31
|
+
"issuing_authority",
|
32
|
+
"place_of_birth"
|
33
|
+
],
|
34
|
+
"identity_card" => [
|
35
|
+
"document_number",
|
36
|
+
"surname",
|
37
|
+
"given_names",
|
38
|
+
"date_of_birth",
|
39
|
+
"date_of_expiration",
|
40
|
+
"sex",
|
41
|
+
"nationality",
|
42
|
+
"country_of_issuance"
|
43
|
+
],
|
44
|
+
"twitter" => [
|
45
|
+
"account_id",
|
46
|
+
"nickname"
|
47
|
+
],
|
48
|
+
"linkedin" => [
|
49
|
+
"account_id",
|
50
|
+
"nickname"
|
51
|
+
],
|
52
|
+
"facebook" => [
|
53
|
+
"account_id",
|
54
|
+
"nickname"
|
55
|
+
],
|
56
|
+
"live" => [
|
57
|
+
"selfie_verification"
|
58
|
+
]
|
59
|
+
}
|
60
|
+
}
|
61
|
+
end
|
data/lib/sources.rb
CHANGED
@@ -3,66 +3,12 @@
|
|
3
3
|
# frozen_string_literal: true
|
4
4
|
|
5
5
|
require "json"
|
6
|
+
require_relative "source_definition.rb"
|
7
|
+
|
6
8
|
module SelfSDK
|
7
9
|
class Sources
|
8
10
|
def initialize(sources_file)
|
9
|
-
|
10
|
-
"sources": {
|
11
|
-
"user_specified": [
|
12
|
-
"document_number",
|
13
|
-
"display_name",
|
14
|
-
"email_address",
|
15
|
-
"phone_number"
|
16
|
-
],
|
17
|
-
"passport": [
|
18
|
-
"document_number",
|
19
|
-
"surname",
|
20
|
-
"given_names",
|
21
|
-
"date_of_birth",
|
22
|
-
"date_of_expiration",
|
23
|
-
"sex",
|
24
|
-
"nationality",
|
25
|
-
"country_of_issuance"
|
26
|
-
],
|
27
|
-
"driving_license": [
|
28
|
-
"document_number",
|
29
|
-
"surname",
|
30
|
-
"given_names",
|
31
|
-
"date_of_birth",
|
32
|
-
"date_of_issuance",
|
33
|
-
"date_of_expiration",
|
34
|
-
"address",
|
35
|
-
"issuing_authority",
|
36
|
-
"place_of_birth"
|
37
|
-
],
|
38
|
-
"identity_card": [
|
39
|
-
"document_number",
|
40
|
-
"surname",
|
41
|
-
"given_names",
|
42
|
-
"date_of_birth",
|
43
|
-
"date_of_expiration",
|
44
|
-
"sex",
|
45
|
-
"nationality",
|
46
|
-
"country_of_issuance"
|
47
|
-
],
|
48
|
-
"twitter": [
|
49
|
-
"account_id",
|
50
|
-
"nickname"
|
51
|
-
],
|
52
|
-
"linkedin": [
|
53
|
-
"account_id",
|
54
|
-
"nickname"
|
55
|
-
],
|
56
|
-
"facebook": [
|
57
|
-
"account_id",
|
58
|
-
"nickname"
|
59
|
-
],
|
60
|
-
"live": [
|
61
|
-
"selfie_verification"
|
62
|
-
]
|
63
|
-
}
|
64
|
-
}')
|
65
|
-
@sources = data["sources"]
|
11
|
+
@sources = SOURCE_DATA["sources"]
|
66
12
|
@facts = []
|
67
13
|
@sources.each do |source, facts|
|
68
14
|
@facts.push(*facts)
|
@@ -92,9 +38,7 @@ module SelfSDK
|
|
92
38
|
end
|
93
39
|
|
94
40
|
def message_type(s)
|
95
|
-
types = {
|
96
|
-
authentication_response: SelfSDK::Messages::AuthenticationResp::MSG_TYPE,
|
97
|
-
fact_request: SelfSDK::Messages::FactRequest::MSG_TYPE,
|
41
|
+
types = { fact_request: SelfSDK::Messages::FactRequest::MSG_TYPE,
|
98
42
|
fact_response: SelfSDK::Messages::FactResponse::MSG_TYPE,
|
99
43
|
chat_message: SelfSDK::Messages::ChatMessage::MSG_TYPE,
|
100
44
|
chat_message_deivered: SelfSDK::Messages::ChatMessageDelivered::MSG_TYPE,
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: selfsdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.197
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aldgate Ventures
|
@@ -334,9 +334,6 @@ files:
|
|
334
334
|
- lib/jwt_service.rb
|
335
335
|
- lib/log.rb
|
336
336
|
- lib/messages/attestation.rb
|
337
|
-
- lib/messages/authentication_message.rb
|
338
|
-
- lib/messages/authentication_req.rb
|
339
|
-
- lib/messages/authentication_resp.rb
|
340
337
|
- lib/messages/base.rb
|
341
338
|
- lib/messages/chat.rb
|
342
339
|
- lib/messages/chat_invite.rb
|
@@ -359,7 +356,9 @@ files:
|
|
359
356
|
- lib/services/facts.rb
|
360
357
|
- lib/services/identity.rb
|
361
358
|
- lib/services/messaging.rb
|
359
|
+
- lib/services/requester.rb
|
362
360
|
- lib/signature_graph.rb
|
361
|
+
- lib/source_definition.rb
|
363
362
|
- lib/sources.rb
|
364
363
|
homepage: https://www.joinself.com/
|
365
364
|
licenses:
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# Copyright 2020 Self Group Ltd. All Rights Reserved.
|
2
|
-
|
3
|
-
# frozen_string_literal: true
|
4
|
-
|
5
|
-
require_relative 'base'
|
6
|
-
require_relative '../ntptime'
|
7
|
-
|
8
|
-
module SelfSDK
|
9
|
-
module Messages
|
10
|
-
class AuthenticationMessage < Base
|
11
|
-
|
12
|
-
def parse(input, envelope=nil)
|
13
|
-
@input = input
|
14
|
-
@typ = @typ
|
15
|
-
@payload = get_payload input
|
16
|
-
@id = payload[:cid]
|
17
|
-
@from = payload[:iss]
|
18
|
-
@to = payload[:sub]
|
19
|
-
@audience = payload[:aud]
|
20
|
-
@from_device = payload[:device_id]
|
21
|
-
@expires = ::Time.parse(payload[:exp])
|
22
|
-
@issued = ::Time.parse(payload[:iat])
|
23
|
-
@status = payload[:status]
|
24
|
-
if envelope
|
25
|
-
issuer = envelope.sender.split(":")
|
26
|
-
@from_device = issuer.last
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,55 +0,0 @@
|
|
1
|
-
# Copyright 2020 Self Group Ltd. All Rights Reserved.
|
2
|
-
|
3
|
-
# frozen_string_literal: true
|
4
|
-
|
5
|
-
require 'self_msgproto'
|
6
|
-
require_relative 'base'
|
7
|
-
require_relative '../ntptime'
|
8
|
-
require_relative 'authentication_message'
|
9
|
-
|
10
|
-
module SelfSDK
|
11
|
-
module Messages
|
12
|
-
class AuthenticationReq < AuthenticationMessage
|
13
|
-
MSG_TYPE = "identities.authenticate.req"
|
14
|
-
DEFAULT_EXP_TIMEOUT = 300
|
15
|
-
|
16
|
-
def initialize(messaging)
|
17
|
-
@typ = MSG_TYPE
|
18
|
-
super
|
19
|
-
end
|
20
|
-
|
21
|
-
def populate(selfid, opts)
|
22
|
-
@id = SecureRandom.uuid
|
23
|
-
@from = @client.jwt.id
|
24
|
-
@to = selfid
|
25
|
-
|
26
|
-
@id = opts[:cid] if opts.include?(:cid)
|
27
|
-
@description = opts.include?(:description) ? opts[:description] : nil
|
28
|
-
@exp_timeout = opts.fetch(:exp_timeout, DEFAULT_EXP_TIMEOUT)
|
29
|
-
end
|
30
|
-
|
31
|
-
def body
|
32
|
-
{ typ: MSG_TYPE,
|
33
|
-
iss: @jwt.id,
|
34
|
-
sub: @to,
|
35
|
-
aud: @to,
|
36
|
-
iat: SelfSDK::Time.now.strftime('%FT%TZ'),
|
37
|
-
exp: (SelfSDK::Time.now + @exp_timeout).strftime('%FT%TZ'),
|
38
|
-
cid: @id,
|
39
|
-
jti: SecureRandom.uuid }
|
40
|
-
end
|
41
|
-
|
42
|
-
protected
|
43
|
-
|
44
|
-
def proto(to_device)
|
45
|
-
m = SelfMsg::Message.new
|
46
|
-
m.id = @id
|
47
|
-
m.sender = "#{@jwt.id}:#{@messaging.device_id}"
|
48
|
-
m.recipient = "#{@to}:#{to_device}"
|
49
|
-
m.ciphertext = encrypt_message(@jwt.prepare(body), [{ id: @to, device_id: to_device }])
|
50
|
-
m
|
51
|
-
end
|
52
|
-
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
# Copyright 2020 Self Group Ltd. All Rights Reserved.
|
2
|
-
|
3
|
-
# frozen_string_literal: true
|
4
|
-
|
5
|
-
require_relative 'base'
|
6
|
-
require_relative '../ntptime'
|
7
|
-
require_relative 'authentication_message'
|
8
|
-
|
9
|
-
module SelfSDK
|
10
|
-
module Messages
|
11
|
-
class AuthenticationResp < AuthenticationMessage
|
12
|
-
MSG_TYPE = "identities.authenticate.resp"
|
13
|
-
def initialize(messaging)
|
14
|
-
@typ = MSG_TYPE
|
15
|
-
super
|
16
|
-
end
|
17
|
-
|
18
|
-
protected
|
19
|
-
|
20
|
-
def proto(to_device)
|
21
|
-
nil
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|