selfsdk 0.0.124
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/acl.rb +52 -0
- data/lib/authenticated.rb +26 -0
- data/lib/client.rb +95 -0
- data/lib/jwt_service.rb +91 -0
- data/lib/log.rb +15 -0
- data/lib/messages/attestation.rb +53 -0
- data/lib/messages/authentication_message.rb +25 -0
- data/lib/messages/authentication_req.rb +52 -0
- data/lib/messages/authentication_resp.rb +23 -0
- data/lib/messages/base.rb +89 -0
- data/lib/messages/fact.rb +55 -0
- data/lib/messages/fact_request.rb +112 -0
- data/lib/messages/fact_response.rb +91 -0
- data/lib/messages/message.rb +39 -0
- data/lib/messaging.rb +441 -0
- data/lib/ntptime.rb +51 -0
- data/lib/proto/acl_pb.rb +19 -0
- data/lib/proto/aclcommand_pb.rb +16 -0
- data/lib/proto/auth_pb.rb +19 -0
- data/lib/proto/errtype_pb.rb +19 -0
- data/lib/proto/header_pb.rb +16 -0
- data/lib/proto/message_pb.rb +22 -0
- data/lib/proto/msgtype_pb.rb +18 -0
- data/lib/proto/notification_pb.rb +19 -0
- data/lib/selfsdk.rb +109 -0
- data/lib/services/auth.rb +163 -0
- data/lib/services/facts.rb +138 -0
- data/lib/services/identity.rb +44 -0
- data/lib/services/messaging.rb +100 -0
- data/lib/sources.rb +78 -0
- metadata +354 -0
@@ -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
|
data/lib/sources.rb
ADDED
@@ -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: []
|