siwe 0.1.5 → 1.0.0
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 +4 -4
- data/Gemfile.lock +7 -7
- data/lib/siwe/exceptions.rb +24 -0
- data/lib/siwe/message.rb +16 -23
- data/lib/siwe/version.rb +1 -1
- data/lib/siwe.rb +3 -0
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3ee917f6a6a6cfe1877f32dd8c70cd2628b745c6a941f7d6bcaebd1e0c19c592
|
4
|
+
data.tar.gz: 4162a2428f5a0efce7d190a1ca1bbff06c3574447853fa9dfae183301f084ab7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 648ec9080c223f0ffea368c522f4a29aa5f9b3203fe91a090133ca4143d7d637bd9b7f586de5883a2ed3e9a06473aaedb8e57ff94aa67ffc45462681cb259500
|
7
|
+
data.tar.gz: e3212a3795f6dd22d584d77d59eacfa3150aa0ddf284f30f85ea129253f1f3d77afe4c1d049df8f655f50f3dafbe2748ce0df7468af562aa9f69768dd858da9d
|
data/Gemfile.lock
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
siwe (0.
|
5
|
-
eth (~> 0.5.
|
4
|
+
siwe (1.0.0)
|
5
|
+
eth (~> 0.5.1)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
@@ -12,17 +12,17 @@ GEM
|
|
12
12
|
benchmark (0.2.0)
|
13
13
|
diff-lcs (1.5.0)
|
14
14
|
e2mmap (0.1.0)
|
15
|
-
eth (0.5.
|
15
|
+
eth (0.5.1)
|
16
16
|
keccak (~> 1.3)
|
17
17
|
konstructor (~> 1.0)
|
18
|
-
openssl (~>
|
18
|
+
openssl (~> 2.2)
|
19
19
|
rbsecp256k1 (~> 5.1)
|
20
|
-
rlp (~> 0.7)
|
21
20
|
scrypt (~> 3.0)
|
22
21
|
ffi (1.15.5)
|
23
22
|
ffi-compiler (1.0.1)
|
24
23
|
ffi (>= 1.0.0)
|
25
24
|
rake
|
25
|
+
ipaddr (1.2.3)
|
26
26
|
jaro_winkler (1.5.4)
|
27
27
|
keccak (1.3.0)
|
28
28
|
konstructor (1.0.2)
|
@@ -33,7 +33,8 @@ GEM
|
|
33
33
|
mini_portile2 (2.7.1)
|
34
34
|
nokogiri (1.13.1-x86_64-linux)
|
35
35
|
racc (~> 1.4)
|
36
|
-
openssl (
|
36
|
+
openssl (2.2.1)
|
37
|
+
ipaddr
|
37
38
|
parallel (1.21.0)
|
38
39
|
parser (3.1.0.0)
|
39
40
|
ast (~> 2.4.1)
|
@@ -49,7 +50,6 @@ GEM
|
|
49
50
|
reverse_markdown (2.1.1)
|
50
51
|
nokogiri
|
51
52
|
rexml (3.2.5)
|
52
|
-
rlp (0.7.3)
|
53
53
|
rspec (3.10.0)
|
54
54
|
rspec-core (~> 3.10.0)
|
55
55
|
rspec-expectations (~> 3.10.0)
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Siwe
|
4
|
+
# Used when the message is already expired. (Expires At < Time.now)
|
5
|
+
class ExpiredMessage < StandardError
|
6
|
+
def initialize(msg = "Message expired.")
|
7
|
+
super
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
# Used when the message is not yet valid. (Not Before > Time.now)
|
12
|
+
class NotValidMessage < StandardError
|
13
|
+
def initialize(msg = "Message not yet valid.")
|
14
|
+
super
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# Used when the signature doesn't correspond to the address of the message.
|
19
|
+
class InvalidSignature < StandardError
|
20
|
+
def initialize(msg = "Signature doesn't match message.")
|
21
|
+
super
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/siwe/message.rb
CHANGED
@@ -74,9 +74,6 @@ module Siwe
|
|
74
74
|
# expressed as RFC 3986 URIs separated by `\n- `.
|
75
75
|
attr_accessor :resources
|
76
76
|
|
77
|
-
# Signature of the message signed by the wallet.
|
78
|
-
attr_accessor :signature
|
79
|
-
|
80
77
|
def initialize(domain, address, uri, version, options = {})
|
81
78
|
@domain = domain
|
82
79
|
@address = address
|
@@ -91,13 +88,11 @@ module Siwe
|
|
91
88
|
@not_before = options.fetch :not_before, ""
|
92
89
|
@request_id = options.fetch :request_id, ""
|
93
90
|
@resources = options.fetch :resources, []
|
94
|
-
@signature = options.fetch :signature, ""
|
95
|
-
validate(true)
|
96
91
|
end
|
97
92
|
|
98
93
|
def self.from_message(msg)
|
99
94
|
if (message = msg.match SIWE_MESSAGE)
|
100
|
-
|
95
|
+
new(
|
101
96
|
message[:domain],
|
102
97
|
message[:address],
|
103
98
|
message[:uri],
|
@@ -113,8 +108,7 @@ module Siwe
|
|
113
108
|
resources: message[:resources]&.split("\n- ")&.drop(1) || []
|
114
109
|
}
|
115
110
|
)
|
116
|
-
|
117
|
-
msg
|
111
|
+
|
118
112
|
else
|
119
113
|
throw "Invalid message input."
|
120
114
|
end
|
@@ -133,15 +127,14 @@ module Siwe
|
|
133
127
|
expiration_time: @expiration_time,
|
134
128
|
not_before: @not_before,
|
135
129
|
request_id: @request_id,
|
136
|
-
resources: @resources
|
137
|
-
signature: @signature
|
130
|
+
resources: @resources
|
138
131
|
}
|
139
132
|
obj.to_json
|
140
133
|
end
|
141
134
|
|
142
135
|
def self.from_json_string(str)
|
143
136
|
obj = JSON.parse str, { symbolize_names: true }
|
144
|
-
|
137
|
+
Siwe::Message.new(
|
145
138
|
obj[:domain],
|
146
139
|
obj[:address],
|
147
140
|
obj[:uri],
|
@@ -153,30 +146,30 @@ module Siwe
|
|
153
146
|
expiration_time: obj[:expiration_time],
|
154
147
|
not_before: obj[:not_before],
|
155
148
|
request_id: obj[:request_id],
|
156
|
-
resources: obj[:resources]
|
157
|
-
signature: obj[:signature]
|
149
|
+
resources: obj[:resources]
|
158
150
|
}
|
159
151
|
)
|
160
|
-
msg.validate(true)
|
161
|
-
msg
|
162
152
|
end
|
163
153
|
|
164
|
-
def validate(
|
165
|
-
raise
|
166
|
-
raise
|
154
|
+
def validate(signature)
|
155
|
+
raise Siwe::ExpiredMessage if !@expiration_time.empty? && Time.now.utc > Time.parse(@expiration_time)
|
156
|
+
raise Siwe::NotValidMessage if !@not_before.empty? && Time.now.utc < Time.parse(@not_before)
|
167
157
|
|
168
|
-
|
169
|
-
raise "Missing signature field." if @signature.empty?
|
158
|
+
raise Siwe::InvalidSignature if signature.empty?
|
170
159
|
|
171
|
-
|
160
|
+
begin
|
161
|
+
pub_key = Eth::Signature.personal_recover prepare_message, signature
|
172
162
|
signature_address = Eth::Util.public_key_to_address pub_key
|
173
|
-
|
163
|
+
rescue StandardError
|
164
|
+
raise Siwe::InvalidSignature
|
174
165
|
end
|
175
166
|
|
167
|
+
raise Siwe::InvalidSignature unless signature_address.to_s.downcase.eql? @address.to_s.downcase
|
168
|
+
|
176
169
|
true
|
177
170
|
end
|
178
171
|
|
179
|
-
def
|
172
|
+
def prepare_message
|
180
173
|
greeting = "#{@domain} wants you to sign in with your Ethereum account:"
|
181
174
|
address = @address
|
182
175
|
statement = "\n#{@statement}\n"
|
data/lib/siwe/version.rb
CHANGED
data/lib/siwe.rb
CHANGED
@@ -6,6 +6,9 @@ require_relative "siwe/version"
|
|
6
6
|
module Siwe
|
7
7
|
autoload :Message, "siwe/message"
|
8
8
|
autoload :Util, "siwe/util"
|
9
|
+
autoload :ExpiredMessage, "siwe/exceptions"
|
10
|
+
autoload :NotValidMessage, "siwe/exceptions"
|
11
|
+
autoload :InvalidSignature, "siwe/exceptions"
|
9
12
|
|
10
13
|
class Error < StandardError; end
|
11
14
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: siwe
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Spruce Systems Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-02-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: eth
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.5.
|
19
|
+
version: 0.5.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.5.
|
26
|
+
version: 0.5.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -101,6 +101,7 @@ files:
|
|
101
101
|
- bin/console
|
102
102
|
- bin/setup
|
103
103
|
- lib/siwe.rb
|
104
|
+
- lib/siwe/exceptions.rb
|
104
105
|
- lib/siwe/message.rb
|
105
106
|
- lib/siwe/util.rb
|
106
107
|
- lib/siwe/version.rb
|