linzer 0.7.0 → 0.7.2
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/CHANGELOG.md +16 -0
- data/Rakefile +6 -0
- data/lib/linzer/http.rb +3 -0
- data/lib/linzer/message/adapter/abstract.rb +1 -1
- data/lib/linzer/message/adapter/http_gem/request.rb +2 -2
- data/lib/linzer/message/adapter/http_gem/response.rb +2 -2
- data/lib/linzer/message/adapter/net_http/request.rb +2 -2
- data/lib/linzer/message/adapter/net_http/response.rb +2 -2
- data/lib/linzer/message/adapter/rack/common.rb +3 -5
- data/lib/linzer/message/adapter/rack/request.rb +2 -2
- data/lib/linzer/message/adapter/rack/response.rb +5 -3
- data/lib/linzer/message.rb +1 -1
- data/lib/linzer/signer.rb +9 -5
- data/lib/linzer/verifier.rb +18 -9
- data/lib/linzer/version.rb +1 -1
- data/lib/linzer.rb +10 -1
- data/lib/rack/auth/signature.rb +6 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 760341bd66c313c36150f7cb31d741c84252ffe726ecd5bc838928b5f656832f
|
4
|
+
data.tar.gz: 6df1c1af21e5fbadc3eb242dc84973251ddc8dd6849606a2bd213ea57ffd9d89
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 899a41a945b59b368110befe463d300445d605483ef64020e1e35c12e71e0945f3b6aeb1774155cbc4919246f88fc0b77175fe16d2f4270e4bc57f861983f145
|
7
|
+
data.tar.gz: 8af02940869d0e451a8c45738f943cb32bdc515347d325121cafbb9c49e6e1e601d897749e2a5f9453f7c1f6a98acff59e778a5489ed70a60476f0086ab4bace
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,21 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
+
## [0.7.2] - 2025-05-21
|
4
|
+
|
5
|
+
- Add a few integration tests against CloudFlare test server.
|
6
|
+
|
7
|
+
- Fix bug when accessing headers in http adapter classes.
|
8
|
+
Pull request [#14](https://github.com/nomadium/linzer/pull/14)
|
9
|
+
by [oneiros](https://github.com/oneiros).
|
10
|
+
|
11
|
+
## [0.7.1] - 2025-05-18
|
12
|
+
|
13
|
+
- Introduce specific exception classes for message signing errors
|
14
|
+
and signature verification exceptions (i.e. Linzer::SigningError
|
15
|
+
and Linzer::VerifyError)
|
16
|
+
|
17
|
+
- Fix bug in Linzer::HTTP client that prevented it from working with https URLs.
|
18
|
+
|
3
19
|
## [0.7.0] - 2025-05-17
|
4
20
|
|
5
21
|
(No changes since the last beta release, this new stable release just
|
data/Rakefile
CHANGED
@@ -7,4 +7,10 @@ RSpec::Core::RakeTask.new(:spec)
|
|
7
7
|
|
8
8
|
require "standard/rake"
|
9
9
|
|
10
|
+
desc "Run RSpec integration examples"
|
11
|
+
task :integration do
|
12
|
+
sh "bundle exec rspec -t integration spec/integration/**"
|
13
|
+
end
|
14
|
+
|
10
15
|
task default: %i[spec standard]
|
16
|
+
task all: %i[integration default]
|
data/lib/linzer/http.rb
CHANGED
@@ -33,6 +33,8 @@ module Linzer
|
|
33
33
|
|
34
34
|
req_uri = URI(uri)
|
35
35
|
http = Net::HTTP.new(req_uri.host, req_uri.port)
|
36
|
+
|
37
|
+
http.use_ssl = req_uri.scheme == "https"
|
36
38
|
http.set_debug_output($stderr) if options[:debug]
|
37
39
|
|
38
40
|
headers = build_headers(options[:headers] || {})
|
@@ -63,6 +65,7 @@ module Linzer
|
|
63
65
|
end
|
64
66
|
|
65
67
|
def build_headers(headers)
|
68
|
+
return headers if headers.transform_keys(&:downcase).key?("user-agent")
|
66
69
|
headers.merge({"user-agent" => "Linzer/#{Linzer::VERSION}"})
|
67
70
|
end
|
68
71
|
|
@@ -74,11 +74,9 @@ module Linzer
|
|
74
74
|
if has_tr
|
75
75
|
value = tr(name)
|
76
76
|
else
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
end
|
81
|
-
value = @operation.headers[name.value.to_s] if response?
|
77
|
+
rack_header_name = rack_header_name(name.value.to_s)
|
78
|
+
value = @operation.env[rack_header_name] if request?
|
79
|
+
value = @operation.get_header(rack_header_name) if response?
|
82
80
|
end
|
83
81
|
value.dup&.strip
|
84
82
|
end
|
@@ -16,12 +16,14 @@ module Linzer
|
|
16
16
|
freeze
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
20
|
-
@operation.
|
19
|
+
def header(name)
|
20
|
+
@operation.get_header(rack_header_name(name))
|
21
21
|
end
|
22
22
|
|
23
23
|
def attach!(signature)
|
24
|
-
signature.to_h.each
|
24
|
+
signature.to_h.each do |h, v|
|
25
|
+
@operation.set_header(rack_header_name(h), v)
|
26
|
+
end
|
25
27
|
@operation
|
26
28
|
end
|
27
29
|
end
|
data/lib/linzer/message.rb
CHANGED
@@ -15,7 +15,7 @@ module Linzer
|
|
15
15
|
def_delegators :@adapter, :request?, :response?, :attached_request?
|
16
16
|
|
17
17
|
# fields look up
|
18
|
-
def_delegators :@adapter, :
|
18
|
+
def_delegators :@adapter, :header, :field?, :[]
|
19
19
|
|
20
20
|
# to attach a signature to the underlying HTTP message
|
21
21
|
def_delegators :@adapter, :attach!
|
data/lib/linzer/signer.rb
CHANGED
@@ -27,11 +27,15 @@ module Linzer
|
|
27
27
|
|
28
28
|
def validate(key, message, components)
|
29
29
|
msg = "Message cannot be signed with null %s"
|
30
|
-
raise
|
31
|
-
raise
|
32
|
-
raise
|
33
|
-
|
34
|
-
|
30
|
+
raise SigningError, msg % "value" if message.nil?
|
31
|
+
raise SigningError, msg % "key" if key.nil?
|
32
|
+
raise SigningError, msg % "component" if components.nil?
|
33
|
+
|
34
|
+
begin
|
35
|
+
validate_components message, components
|
36
|
+
rescue Error => ex
|
37
|
+
raise SigningError, ex.message, cause: ex
|
38
|
+
end
|
35
39
|
end
|
36
40
|
|
37
41
|
def populate_parameters(key, options)
|
data/lib/linzer/verifier.rb
CHANGED
@@ -19,26 +19,35 @@ module Linzer
|
|
19
19
|
private
|
20
20
|
|
21
21
|
def validate(message, key, signature, no_older_than: nil)
|
22
|
-
raise
|
23
|
-
raise
|
24
|
-
raise
|
22
|
+
raise VerifyError, "Message to verify cannot be null" if message.nil?
|
23
|
+
raise VerifyError, "Key to verify signature cannot be null" if key.nil?
|
24
|
+
raise VerifyError, "Signature to verify cannot be null" if signature.nil?
|
25
25
|
|
26
26
|
if !signature.respond_to?(:value) || !signature.respond_to?(:components)
|
27
|
-
raise
|
27
|
+
raise VerifyError, "Signature is invalid"
|
28
28
|
end
|
29
29
|
|
30
|
-
raise
|
31
|
-
raise
|
30
|
+
raise VerifyError, "Signature raw value to cannot be null" if signature.value.nil?
|
31
|
+
raise VerifyError, "Components cannot be null" if signature.components.nil?
|
32
32
|
|
33
|
-
|
33
|
+
begin
|
34
|
+
validate_components message, signature.components
|
35
|
+
rescue Error => ex
|
36
|
+
raise VerifyError, ex.message, cause: ex
|
37
|
+
end
|
34
38
|
|
35
39
|
return unless no_older_than
|
36
|
-
|
40
|
+
old_sig_msg = "Signature created more than #{no_older_than} seconds ago"
|
41
|
+
begin
|
42
|
+
raise VerifyError, old_sig_msg if signature.older_than?(no_older_than.to_i)
|
43
|
+
rescue Error => ex
|
44
|
+
raise VerifyError, ex.message, cause: ex
|
45
|
+
end
|
37
46
|
end
|
38
47
|
|
39
48
|
def verify_or_fail(key, signature, data)
|
40
49
|
return true if key.verify(signature, data)
|
41
|
-
raise
|
50
|
+
raise VerifyError, "Failed to verify message: Invalid signature."
|
42
51
|
end
|
43
52
|
end
|
44
53
|
end
|
data/lib/linzer/version.rb
CHANGED
data/lib/linzer.rb
CHANGED
@@ -29,6 +29,10 @@ require_relative "rack/auth/signature"
|
|
29
29
|
module Linzer
|
30
30
|
class Error < StandardError; end
|
31
31
|
|
32
|
+
class VerifyError < Error; end
|
33
|
+
|
34
|
+
class SigningError < Error; end
|
35
|
+
|
32
36
|
class << self
|
33
37
|
include Key::Helper
|
34
38
|
|
@@ -55,7 +59,12 @@ module Linzer
|
|
55
59
|
|
56
60
|
def verify!(request_or_response, key: nil, no_older_than: 900)
|
57
61
|
message = Message.new(request_or_response)
|
58
|
-
|
62
|
+
signature_headers = {}
|
63
|
+
%w[signature-input signature].each do |name|
|
64
|
+
value = message.header(name)
|
65
|
+
signature_headers[name] = value if value
|
66
|
+
end
|
67
|
+
signature = Signature.build(signature_headers)
|
59
68
|
keyid = signature.parameters["keyid"]
|
60
69
|
raise Linzer::Error, "key not found" if !key && !keyid
|
61
70
|
verify_key = block_given? ? (yield keyid) : key
|
data/lib/rack/auth/signature.rb
CHANGED
@@ -67,7 +67,12 @@ module Rack
|
|
67
67
|
signature_opts[:label] = label if label
|
68
68
|
|
69
69
|
@message = Linzer::Message.new(request)
|
70
|
-
|
70
|
+
signature_headers = {}
|
71
|
+
%w[signature-input signature].each do |name|
|
72
|
+
value = @message.header(name)
|
73
|
+
signature_headers[name] = value if value
|
74
|
+
end
|
75
|
+
signature = Linzer::Signature.build(signature_headers, **signature_opts)
|
71
76
|
request.env["rack.signature"] = signature
|
72
77
|
signature
|
73
78
|
end
|