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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b5767ac6b96b624e2098faa01e7cda512ca5f1530d6331c0a95c8f57a262da3d
4
- data.tar.gz: 0ec39dbe4697fd2617770be2937ec062d5a9336ef5365dd3c3b028e541670903
3
+ metadata.gz: 760341bd66c313c36150f7cb31d741c84252ffe726ecd5bc838928b5f656832f
4
+ data.tar.gz: 6df1c1af21e5fbadc3eb242dc84973251ddc8dd6849606a2bd213ea57ffd9d89
5
5
  SHA512:
6
- metadata.gz: c471b814bc6310ca41f60947df7a5097c738bb79e89720c3e7da0b7e331949b244bb0e030162363eb00bce411d3b2d6735615f3b529cd7e42815a4cee769b828
7
- data.tar.gz: 3beaf6ab15820fb61473811d63da3f0bbd58653d62e58f193dd5709dd8e5e7b54914f420dbec61af557dcb9afd8da571ae0ab007ba39f7b19d48324084f30df7
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
 
@@ -37,7 +37,7 @@ module Linzer
37
37
  end
38
38
  end
39
39
 
40
- def headers
40
+ def header(name)
41
41
  raise Linzer::Error, "Sub-classes are required to implement this method!"
42
42
  end
43
43
 
@@ -5,8 +5,8 @@ module Linzer
5
5
  module Adapter
6
6
  module HTTPGem
7
7
  class Request < Linzer::Message::Adapter::NetHTTP::Request
8
- def headers
9
- @operation.headers.to_h
8
+ def header(name)
9
+ @operation[name]
10
10
  end
11
11
 
12
12
  private
@@ -14,8 +14,8 @@ module Linzer
14
14
  freeze
15
15
  end
16
16
 
17
- def headers
18
- @operation.headers
17
+ def header(name)
18
+ @operation[name]
19
19
  end
20
20
 
21
21
  # XXX: this implementation is incomplete, e.g.: ;tr parameter is not supported yet
@@ -12,8 +12,8 @@ module Linzer
12
12
  freeze
13
13
  end
14
14
 
15
- def headers
16
- @operation.each_header.to_h
15
+ def header(name)
16
+ @operation[name]
17
17
  end
18
18
 
19
19
  def attach!(signature)
@@ -13,8 +13,8 @@ module Linzer
13
13
  freeze
14
14
  end
15
15
 
16
- def headers
17
- @operation.each_header.to_h
16
+ def header(name)
17
+ @operation[name]
18
18
  end
19
19
 
20
20
  # XXX: this implementation is incomplete, e.g.: ;tr parameter is not supported yet
@@ -74,11 +74,9 @@ module Linzer
74
74
  if has_tr
75
75
  value = tr(name)
76
76
  else
77
- if request?
78
- rack_header_name = rack_header_name(name.value.to_s)
79
- value = @operation.env[rack_header_name]
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
@@ -13,8 +13,8 @@ module Linzer
13
13
  freeze
14
14
  end
15
15
 
16
- def headers
17
- rack_request_headers(@operation)
16
+ def header(name)
17
+ @operation.get_header(rack_header_name(name))
18
18
  end
19
19
 
20
20
  def attach!(signature)
@@ -16,12 +16,14 @@ module Linzer
16
16
  freeze
17
17
  end
18
18
 
19
- def headers
20
- @operation.headers
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 { |h, v| @operation[h] = v }
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
@@ -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, :headers, :field?, :[]
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 Error.new msg % "value" if message.nil?
31
- raise Error.new msg % "key" if key.nil?
32
- raise Error.new msg % "component" if components.nil?
33
-
34
- validate_components message, components
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)
@@ -19,26 +19,35 @@ module Linzer
19
19
  private
20
20
 
21
21
  def validate(message, key, signature, no_older_than: nil)
22
- raise Error.new "Message to verify cannot be null" if message.nil?
23
- raise Error.new "Key to verify signature cannot be null" if key.nil?
24
- raise Error.new "Signature to verify cannot be null" if signature.nil?
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 Error.new "Signature is invalid"
27
+ raise VerifyError, "Signature is invalid"
28
28
  end
29
29
 
30
- raise Error.new "Signature raw value to cannot be null" if signature.value.nil?
31
- raise Error.new "Components cannot be null" if signature.components.nil?
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
- validate_components message, signature.components
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
- raise Error.new "Signature created more than #{no_older_than} seconds ago" if signature.older_than?(no_older_than.to_i)
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 Error.new "Failed to verify message: Invalid signature."
50
+ raise VerifyError, "Failed to verify message: Invalid signature."
42
51
  end
43
52
  end
44
53
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Linzer
4
- VERSION = "0.7.0"
4
+ VERSION = "0.7.2"
5
5
  end
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
- signature = Signature.build(message.headers.slice("signature", "signature-input"))
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
@@ -67,7 +67,12 @@ module Rack
67
67
  signature_opts[:label] = label if label
68
68
 
69
69
  @message = Linzer::Message.new(request)
70
- signature = Linzer::Signature.build(@message.headers, **signature_opts)
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
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: linzer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miguel Landaeta