selfsdk 0.0.124

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,138 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Namespace for classes and modules that handle SelfSDK gem
4
+ module SelfSDK
5
+ # Namespace for classes and modules that handle selfsdk-gem public ui
6
+ module Services
7
+ # Self provides this self-hosted verified intermediary.
8
+ DEFAULT_INTERMEDIARY = "self_intermediary"
9
+ # Input class to handle authentication requests on self network.
10
+ class Facts
11
+ # Creates a new facts service.
12
+ # Facts service mainly manages fact requests against self users wanting
13
+ # to share their verified facts with your app.
14
+ #
15
+ # @param messaging [SelfSDK::Messaging] messaging object.
16
+ # @param client [SelfSDK::Client] http client object.
17
+ #
18
+ # @return [SelfSDK::Services::Facts] facts service.
19
+ def initialize(messaging, client)
20
+ @messaging = messaging
21
+ @client = client
22
+ end
23
+
24
+ # Sends a fact request to the specified selfid.
25
+ # An fact request allows your app to access trusted facts of your user with its
26
+ # permission.
27
+ #
28
+ # @overload request(selfid, facts, opts = {}, &block)
29
+ # @param selfid [string] the receiver of the authentication request.
30
+ # @param [Hash] opts the options to authenticate.
31
+ # @option opts [String] :cid The unique identifier of the authentication request.
32
+ # @yield [request] Invokes the block with a street name for each result.
33
+ # @return [Object] SelfSDK:::Messages::FactRequest
34
+ #
35
+ # @overload request(selfid, facts, opts = {})
36
+ # @param selfid [string] the receiver of the authentication request.
37
+ # @param [Hash] opts the options to authenticate.
38
+ # @option opts [String] :cid The unique identifier of the authentication request.
39
+ # @option opts [Integer] :exp_timeout timeout in seconds to expire the request.
40
+ # @return [Object] SelfSDK:::Messages::FactRequest
41
+ def request(selfid, facts, opts = {}, &block)
42
+ SelfSDK.logger.info "authenticating #{selfid}"
43
+
44
+ req = SelfSDK::Messages::FactRequest.new(@messaging)
45
+ req.populate(selfid, prepare_facts(facts), opts)
46
+
47
+ body = @client.jwt.prepare(req.body)
48
+ return body unless opts.fetch(:request, true)
49
+
50
+ # when a block is given the request will always be asynchronous.
51
+ if block_given?
52
+ @messaging.set_observer(req, timeout: req.exp_timeout, &block)
53
+ return req.send_message
54
+ end
55
+
56
+ # Otherwise the request is synchronous
57
+ req.request
58
+ end
59
+
60
+ # Sends a request through an intermediary.
61
+ # An intermediary is an entity trusted by the user and acting as a proxy between you
62
+ # and the recipient of your fact request.
63
+ # Intermediaries usually do not provide the original user facts, but they create its
64
+ # own assertions based on your request and the user's facts.
65
+ #
66
+ # @param selfid [string] the receiver of the authentication request.
67
+ # @param [Hash] opts the options to authenticate.
68
+ # @option opts [String] intermediary an intermediary identity to be used.
69
+ # @return [Object] SelfSDK:::Messages::FactRequest
70
+ def request_via_intermediary(selfid, facts, opts = {}, &block)
71
+ opts[:intermediary] = opts.fetch(:intermediary, DEFAULT_INTERMEDIARY)
72
+ request(selfid, facts, opts, &block)
73
+ end
74
+
75
+ # Adds an observer for a fact response
76
+ # Whenever you receive a fact response registered observers will receive a notification.
77
+ #
78
+ # @yield [request] Invokes the block with a fact response message.
79
+ def subscribe(&block)
80
+ @messaging.subscribe(:fact_response, &block)
81
+ end
82
+
83
+ # Generates a QR code so users can send facts to your app.
84
+ #
85
+ # @param facts [Array] a list of facts to be requested.
86
+ # @option opts [String] :cid The unique identifier of the authentication request.
87
+ # @option opts [String] :options Options you want to share with the identity.
88
+ #
89
+ # @return [String, String] conversation id or encoded body.
90
+ def generate_qr(facts, opts = {})
91
+ opts[:request] = false
92
+ selfid = opts.fetch(:selfid, "-")
93
+ req = request(selfid, facts, opts)
94
+ ::RQRCode::QRCode.new(req, level: 'l')
95
+ end
96
+
97
+ # Generates a deep link to authenticate with self app.
98
+ #
99
+ # @param facts [Array] a list of facts to be requested.
100
+ # @param callback [String] the url you'll be redirected if the app is not installed.
101
+ # @option opts [String] :selfid the user selfid you want to authenticate.
102
+ # @option opts [String] :cid The unique identifier of the authentication request.
103
+ #
104
+ # @return [String, String] conversation id or encoded body.
105
+ def generate_deep_link(facts, callback, opts = {})
106
+ opts[:request] = false
107
+ selfid = opts.fetch(:selfid, "-")
108
+ body = @client.jwt.encode(request(selfid, facts, opts))
109
+
110
+ if @client.env.empty?
111
+ return "https://selfid.page.link/?link=#{callback}%3Fqr=#{body}&apn=net.selfid.app"
112
+ elsif @client.env == 'development'
113
+ return "https://selfid.page.link/?link=#{callback}%3Fqr=#{body}&apn=net.selfid.app.dev"
114
+ end
115
+ "https://selfid.page.link/?link=#{callback}%3Fqr=#{body}&apn=net.selfid.app.#{@client.env}"
116
+ end
117
+
118
+ private
119
+
120
+ # As request facts can accept an array of strings this populates with necessary
121
+ # structure this short fact definitions.
122
+ #
123
+ # @param facts [Array] an array of strings or hashes.
124
+ # @return [Array] a list of hashed facts.
125
+ def prepare_facts(facts)
126
+ fs = []
127
+ facts.each do |f|
128
+ fs << if f.is_a?(Hash)
129
+ f
130
+ else
131
+ { fact: f }
132
+ end
133
+ end
134
+ fs
135
+ end
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Namespace for classes and modules that handle SelfSDK gem
4
+ module SelfSDK
5
+ # Namespace for classes and modules that handle selfsdk-gem public ui
6
+ module Services
7
+ # Input class to request for identities and apps
8
+ class Identity
9
+ # Creates a new identity service.
10
+ # Identity service allows you request information for your connected users / apps.
11
+ #
12
+ # @param [SelfSDK::Client] client http client object.
13
+ #
14
+ # @return [SelfSDK::Services::Identity] facts service.
15
+ def initialize(client)
16
+ @client = client
17
+ end
18
+
19
+ # Gets registered devices for a self identity
20
+ #
21
+ # @param [String] selfid identity/app selfID
22
+ # @return [Array] array of device ids for the given selfid
23
+ def devices(selfid)
24
+ @client.devices(selfid)
25
+ end
26
+
27
+ # Gets an identity public keys
28
+ #
29
+ # @param [String] selfid gets the identity details (app/user)
30
+ # @return [Array] with the identity public keys
31
+ def public_keys(selfid)
32
+ @client.public_keys(selfid)
33
+ end
34
+
35
+ # Gets an app/identity details
36
+ #
37
+ # @param [String] selfid gets the identity details (app/user)
38
+ # @return [Hash] with identity details
39
+ def get(selfid)
40
+ @client.entity(selfid)
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Namespace for classes and modules that handle SelfSDK gem
4
+ module SelfSDK
5
+ # Namespace for classes and modules that handle selfsdk-gem public ui
6
+ module Services
7
+ # Input class to interact with self network messaging.
8
+ class Messaging
9
+ # TODO : we should try to remove this accessor.
10
+ # @attr_accessor [SelfSDK::Messaging] internal messaging client.
11
+ attr_accessor :client
12
+
13
+ # Creates a new messaging service.
14
+ # Messaging service basically allows you to subscribe to certain types of messages,
15
+ # and manage who can send you messages or not.
16
+ #
17
+ # @param client [SelfSDK::Messaging] messaging object.
18
+ #
19
+ # @return [SelfSDK::Services::Messaging] authentication service.
20
+ def initialize(client)
21
+ @client = client
22
+ end
23
+
24
+ # Subscribes to a specific message type and attaches the given observer
25
+ # which will be executed when a meeting criteria message is received.
26
+ #
27
+ # @param [String] type message type (ex: SelfSDK::Messages::AuthenticationResp.MSG_TYPE
28
+ # @yield [SelfSDK::Messages::Message] receives incoming message.
29
+ def subscribe(type, &block)
30
+ @client.subscribe(type, &block)
31
+ end
32
+
33
+ # Permits incoming messages from the a identity.
34
+ #
35
+ # @param [String] selfid to be allowed.
36
+ # @return [Boolean] success / failure
37
+ def permit_connection(selfid)
38
+ acl.allow selfid
39
+ end
40
+
41
+ # Lists app allowed connections.
42
+ # @return [Array] array of self ids allowed to connect to your app.
43
+ def allowed_connections
44
+ acl.list
45
+ end
46
+
47
+ # Revokes incoming messages from the given identity.
48
+ #
49
+ # @param [String] selfid to be denied
50
+ # @return [Boolean] success / failure
51
+ def revoke_connection(selfid)
52
+ acl.deny selfid
53
+ end
54
+
55
+ # Gets the device id for the authenticated app.
56
+ #
57
+ # @return [String] device_id of the running app.
58
+ def device_id
59
+ @client.device_id
60
+ end
61
+
62
+ # Get the observer by uuid
63
+ #
64
+ # @param [String] cid conversation id
65
+ def observer(cid)
66
+ @client.uuid_observer[cid]
67
+ end
68
+
69
+
70
+ # Send custom mmessage
71
+ #
72
+ # @param recipient [string] recipient for the message
73
+ # @param type [string] message type
74
+ # @param request [hash] message to be sent
75
+ def send(recipient, request)
76
+ request[:jti] = SecureRandom.uuid
77
+ request[:iss] = @client.jwt.id
78
+ request[:sub] = recipient
79
+ request[:iat] = SelfSDK::Time.now.strftime('%FT%TZ'),
80
+ request[:exp] = (SelfSDK::Time.now + 300).strftime('%FT%TZ'),
81
+ request[:cid] = SecureRandom.uuid unless request.include? :cid
82
+
83
+ @client.send_custom(recipient, request)
84
+ end
85
+
86
+ def notify(recipient, message)
87
+ send recipient, {
88
+ typ: 'identities.notify',
89
+ description: message
90
+ }
91
+ end
92
+
93
+ private
94
+
95
+ def acl
96
+ @acl ||= ACL.new(@client)
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SelfSDK
4
+ FACT_EMAIL = "email_address"
5
+ FACT_PHONE = "phone_number"
6
+ FACT_DISPLAY_NAME = "display_name"
7
+ FACT_DOCUMENT_NUMBER = "document_number"
8
+ FACT_GIVEN_NAMES = "given_names"
9
+ FACT_SURNAME = "surname"
10
+ FACT_SEX = "sex"
11
+ FACT_ISSUING_AUTHORITY = "issuing_authority"
12
+ FACT_NATIONALITY = "nationality"
13
+ FACT_ADDRESS = "address"
14
+ FACT_PLACE_OF_BIRTH = "place_of_birth"
15
+ FACT_DATE_OF_BIRTH = "date_of_birth"
16
+ FACT_DATE_OF_ISSUANCE = "date_of_issuance"
17
+ FACT_DATE_OF_EXPIRATION = "date_of_expiration"
18
+
19
+ SOURCE_USER_SPECIFIED = "user_specified"
20
+ SOURCE_PASSPORT = "passport"
21
+ SOURCE_DRIVING_LICENSE = "driving_license"
22
+
23
+ class << self
24
+ def message_type(s)
25
+ types = { authentication_request: SelfSDK::Messages::AuthenticationReq::MSG_TYPE,
26
+ authentication_response: SelfSDK::Messages::AuthenticationResp::MSG_TYPE,
27
+ fact_request: SelfSDK::Messages::FactRequest::MSG_TYPE,
28
+ fact_response: SelfSDK::Messages::FactResponse::MSG_TYPE }
29
+ raise "invalid message type" unless types.key? s
30
+ return types[s]
31
+ end
32
+
33
+ def operator(input)
34
+ operators = { equals: '==',
35
+ different: '!=',
36
+ great_or_equal_than: '>=',
37
+ less_or_equal: '<=',
38
+ great_than: '>',
39
+ less_than: '<' }
40
+ get(operators, input, "operator")
41
+ end
42
+
43
+ def fact_name(input)
44
+ facts = { email_address: FACT_EMAIL,
45
+ phone_number: FACT_PHONE,
46
+ display_name: FACT_DISPLAY_NAME,
47
+ document_number: FACT_DOCUMENT_NUMBER,
48
+ given_names: FACT_GIVEN_NAMES,
49
+ surname: FACT_SURNAME,
50
+ sex: FACT_SEX,
51
+ issuing_authority: FACT_ISSUING_AUTHORITY,
52
+ nationality: FACT_NATIONALITY,
53
+ address: FACT_ADDRESS,
54
+ place_of_birth: FACT_PLACE_OF_BIRTH,
55
+ date_of_birth: FACT_DATE_OF_BIRTH,
56
+ date_of_issuance: FACT_DATE_OF_ISSUANCE,
57
+ date_of_expiration: FACT_DATE_OF_EXPIRATION }
58
+ get(facts, input, "fact")
59
+ end
60
+
61
+ def source(input)
62
+ sources = { user_specified: SOURCE_USER_SPECIFIED,
63
+ passport: SOURCE_PASSPORT,
64
+ driving_license: SOURCE_DRIVING_LICENSE }
65
+ get(sources, input, "source")
66
+ end
67
+
68
+ def get(options, input, option_type)
69
+ if input.is_a? Symbol
70
+ raise "invalid #{option_type} '#{input.to_s}'" unless options.key? input
71
+ return options[input]
72
+ end
73
+ raise "invalid #{option_type} '#{input}'" unless options.values.include? input
74
+ input
75
+ end
76
+
77
+ end
78
+ end
metadata ADDED
@@ -0,0 +1,354 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: selfsdk
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.124
5
+ platform: ruby
6
+ authors:
7
+ - Aldgate Ventures
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2011-09-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: async
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: ed25519
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: eventmachine
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: faye-websocket
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: google-protobuf
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: httparty
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: logger
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: net-ntp
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rqrcode
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: jwt
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: bundler
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '1.12'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '1.12'
167
+ - !ruby/object:Gem::Dependency
168
+ name: minitest
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: pry
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: rake
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '12.3'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '12.3'
209
+ - !ruby/object:Gem::Dependency
210
+ name: rubocop
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - "~>"
214
+ - !ruby/object:Gem::Version
215
+ version: '0.49'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: '0.49'
223
+ - !ruby/object:Gem::Dependency
224
+ name: timecop
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - ">="
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ">="
235
+ - !ruby/object:Gem::Version
236
+ version: '0'
237
+ - !ruby/object:Gem::Dependency
238
+ name: webmock
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - ">="
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ type: :development
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - ">="
249
+ - !ruby/object:Gem::Version
250
+ version: '0'
251
+ - !ruby/object:Gem::Dependency
252
+ name: rspec
253
+ requirement: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - ">="
256
+ - !ruby/object:Gem::Version
257
+ version: '0'
258
+ type: :development
259
+ prerelease: false
260
+ version_requirements: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - ">="
263
+ - !ruby/object:Gem::Version
264
+ version: '0'
265
+ - !ruby/object:Gem::Dependency
266
+ name: simplecov
267
+ requirement: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - ">="
270
+ - !ruby/object:Gem::Version
271
+ version: '0'
272
+ type: :development
273
+ prerelease: false
274
+ version_requirements: !ruby/object:Gem::Requirement
275
+ requirements:
276
+ - - ">="
277
+ - !ruby/object:Gem::Version
278
+ version: '0'
279
+ - !ruby/object:Gem::Dependency
280
+ name: semantic
281
+ requirement: !ruby/object:Gem::Requirement
282
+ requirements:
283
+ - - ">="
284
+ - !ruby/object:Gem::Version
285
+ version: '0'
286
+ type: :development
287
+ prerelease: false
288
+ version_requirements: !ruby/object:Gem::Requirement
289
+ requirements:
290
+ - - ">="
291
+ - !ruby/object:Gem::Version
292
+ version: '0'
293
+ description:
294
+ email:
295
+ executables: []
296
+ extensions: []
297
+ extra_rdoc_files: []
298
+ files:
299
+ - lib/acl.rb
300
+ - lib/authenticated.rb
301
+ - lib/client.rb
302
+ - lib/jwt_service.rb
303
+ - lib/log.rb
304
+ - lib/messages/attestation.rb
305
+ - lib/messages/authentication_message.rb
306
+ - lib/messages/authentication_req.rb
307
+ - lib/messages/authentication_resp.rb
308
+ - lib/messages/base.rb
309
+ - lib/messages/fact.rb
310
+ - lib/messages/fact_request.rb
311
+ - lib/messages/fact_response.rb
312
+ - lib/messages/message.rb
313
+ - lib/messaging.rb
314
+ - lib/ntptime.rb
315
+ - lib/proto/acl_pb.rb
316
+ - lib/proto/aclcommand_pb.rb
317
+ - lib/proto/auth_pb.rb
318
+ - lib/proto/errtype_pb.rb
319
+ - lib/proto/header_pb.rb
320
+ - lib/proto/message_pb.rb
321
+ - lib/proto/msgtype_pb.rb
322
+ - lib/proto/notification_pb.rb
323
+ - lib/selfsdk.rb
324
+ - lib/services/auth.rb
325
+ - lib/services/facts.rb
326
+ - lib/services/identity.rb
327
+ - lib/services/messaging.rb
328
+ - lib/sources.rb
329
+ homepage: https://www.joinself.com/
330
+ licenses: []
331
+ metadata: {}
332
+ post_install_message:
333
+ rdoc_options: []
334
+ require_paths:
335
+ - lib
336
+ - lib/proto
337
+ - lib/messages
338
+ - lib/services
339
+ required_ruby_version: !ruby/object:Gem::Requirement
340
+ requirements:
341
+ - - ">="
342
+ - !ruby/object:Gem::Version
343
+ version: '0'
344
+ required_rubygems_version: !ruby/object:Gem::Requirement
345
+ requirements:
346
+ - - ">="
347
+ - !ruby/object:Gem::Version
348
+ version: '0'
349
+ requirements: []
350
+ rubygems_version: 3.0.3
351
+ signing_key:
352
+ specification_version: 4
353
+ summary: self id gem
354
+ test_files: []