serge 0.2.0 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dd9ed2d4820a6121a5f0b4539ade121e54d55af302a42144879f91c15bff1375
4
- data.tar.gz: 251d4173c7836cdf85f5d0dfe56585dc93937f26018a5c08d88c2b9faf8776db
3
+ metadata.gz: 1ddf846378e4991b3739c64cb37257ad0d584212e963a14feb991ac2922219c2
4
+ data.tar.gz: db98af509011dcf2955601d39cc691e9723e701432bbf8ac36c1c842a343ecf5
5
5
  SHA512:
6
- metadata.gz: a25124728926af3ddf194e6b1d869f7b1e8a8aec009db2cd667c0ff848b6b2cadd99b091ad1cfd3eaf7aabd852cebe41846e2eb06e561de79bc32e328c38eea7
7
- data.tar.gz: 99b41d570a88802bc638da8df1529baa9f0ff999eee33ed2c57c45dbbf6b3f62478aeea3e882974f0fda25aa7ce122123e5ae9d14674214c87a1b0b765e5ebba
6
+ metadata.gz: b5b9bb3afa094e3383a676be914c7e716079f4aca68c883e7c04028bf78712b5eb2bff8f69b0731653ec9f5c1f3c4a863ff29760f6e9f7494d75130d874a66c5
7
+ data.tar.gz: f7479060ea773d8bf07e6e40c2a2871a046fbf7eee4a70be288ba61ba850f96d4efb007a80dcf182b352cf7606878feea730854fc88c0e4a88fbf3e2bbcaeb53
data/README.md CHANGED
@@ -39,6 +39,24 @@ rescue Serge::SignatureVerificationError => e
39
39
  end
40
40
  ```
41
41
 
42
+ For outgoing message headers, both legacy and RFC 9421 share the same API method:
43
+
44
+ ```ruby
45
+ headers = {}
46
+ # given legacy_signature which is true or false
47
+ klass = legacy_signature ? Serge::FediSignature : Serge::MessageSignature
48
+
49
+ headers.merge!(
50
+ klass.headers(
51
+ method: method_string,
52
+ url: target_url,
53
+ body: body,
54
+ public_key_id: public_key_url,
55
+ private_key: private_key
56
+ )
57
+ )
58
+ ```
59
+
42
60
  You can also set the logger in a Rails initializer like `config/initializers/serge.rb`:
43
61
 
44
62
  ```ruby
@@ -2,6 +2,33 @@ module Serge
2
2
  class FediSignature
3
3
  ALGORITHM = 'rsa-sha256'
4
4
 
5
+ def self.headers(method:, url:, body:, public_key_id:, private_key:)
6
+ signature_headers = {}
7
+
8
+ date = Time.now.utc.httpdate
9
+ signature_headers['Date'] = date
10
+
11
+ header_names = ['(request-target)', 'host', 'date']
12
+ if body.present?
13
+ header_names << 'digest'
14
+ digest = "SHA-256=#{Digest::SHA256.base64digest(body)}"
15
+ signature_headers['Digest'] = digest
16
+ end
17
+
18
+ header_values = {
19
+ '(request-target)' => "#{method} #{url.path}",
20
+ 'host' => url.host,
21
+ 'date' => date,
22
+ 'digest' => digest,
23
+ }
24
+
25
+ signing_string = signing_string(header_names) { |name| header_values[name] }
26
+
27
+ signature = sign(signing_string, private_key)
28
+
29
+ signature_headers.merge({'Signature' => build_header(public_key_id, signature, header_names)})
30
+ end
31
+
5
32
  def self.signing_string(header_names)
6
33
  header_names.map { |name| "#{name}: #{yield(name)}" }.join("\n")
7
34
  end
@@ -67,6 +67,8 @@ module Serge
67
67
  end
68
68
 
69
69
  result
70
+ rescue OpenSSL::PKey::PKeyError => e
71
+ raise Serge::SignatureVerificationError, "Invalid public key: #{e.message}"
70
72
  end
71
73
 
72
74
  def verified?(public_key)
@@ -69,6 +69,8 @@ module Serge
69
69
  Linzer.verify!(Rack::Request.new(@request.env), key:)
70
70
  rescue Linzer::VerifyError
71
71
  false
72
+ rescue OpenSSL::PKey::PKeyError => e
73
+ raise Serge::SignatureVerificationError, "Invalid public key: #{e.message}"
72
74
  end
73
75
 
74
76
  private
data/lib/serge/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Serge
4
- VERSION = "0.2.0"
4
+ VERSION = "0.3.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: serge
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Brown
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2026-10-24 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: activesupport
@@ -86,7 +85,6 @@ licenses:
86
85
  - MIT
87
86
  metadata:
88
87
  homepage_uri: https://github.com/herestomwiththeweather/serge
89
- post_install_message:
90
88
  rdoc_options: []
91
89
  require_paths:
92
90
  - lib
@@ -101,8 +99,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
101
99
  - !ruby/object:Gem::Version
102
100
  version: '0'
103
101
  requirements: []
104
- rubygems_version: 3.5.22
105
- signing_key:
102
+ rubygems_version: 4.0.23
106
103
  specification_version: 4
107
104
  summary: Ruby HTTP Signature for Fedi Inbox Deliveries
108
105
  test_files: []