selfsdk 0.0.124
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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: []
|