lyrebird 1.0.0 → 1.0.1
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/README.md +5 -1
- data/lib/lyrebird/assertion.rb +1 -1
- data/lib/lyrebird/certificate.rb +0 -4
- data/lib/lyrebird/response.rb +1 -1
- data/lib/lyrebird/signature.rb +6 -7
- data/lib/lyrebird/version.rb +1 -1
- data/lib/lyrebird.rb +0 -2
- data/test/lyrebird/assertion_test.rb +5 -0
- data/test/lyrebird/certificate_test.rb +0 -7
- data/test/lyrebird/response_test.rb +8 -0
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a2c22dc89d09728d25d5563a9db0c136b144865ddea516ea71bd1806a4bf0ce2
|
|
4
|
+
data.tar.gz: 002da134ef786dd04b2f61a3b2f01a2fe43ec4e772081b9d76dd4b4f5788e839
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: dc069741583e5940e825df140b405fe9c5710632c38927d2fb0baa80c52a4dafcb06170ac72a82259b9708f651e83e2ca11ee1d758d0031c1502f2d068faba57
|
|
7
|
+
data.tar.gz: 78a80065561c35f30b81a588a9584c173b044064a9b73266385a6708109f0b02952e0acbcbc1d6768d1750ea47ebdcbf346f42dbc7b9e151e0731a43316c995a
|
data/README.md
CHANGED
|
@@ -15,6 +15,10 @@ gem "lyrebird", group: :test
|
|
|
15
15
|
```ruby
|
|
16
16
|
# test/integration/saml_test.rb
|
|
17
17
|
class SAMLTest < ActionDispatch::IntegrationTest
|
|
18
|
+
setup do
|
|
19
|
+
@idp_cert = Lyrebird::Certificate.build
|
|
20
|
+
end
|
|
21
|
+
|
|
18
22
|
test "consume creates a session" do
|
|
19
23
|
user = users(:alice)
|
|
20
24
|
|
|
@@ -24,6 +28,7 @@ class SAMLTest < ActionDispatch::IntegrationTest
|
|
|
24
28
|
r.recipient = saml_consume_url
|
|
25
29
|
r.audience = root_url
|
|
26
30
|
r.name_id = user.email
|
|
31
|
+
r.sign_with = @idp_cert
|
|
27
32
|
|
|
28
33
|
r.attributes do |a|
|
|
29
34
|
a.email = user.email
|
|
@@ -168,7 +173,6 @@ cert.key # OpenSSL::PKey::RSA private key
|
|
|
168
173
|
cert.x509 # OpenSSL::X509::Certificate object
|
|
169
174
|
cert.key_pem # PEM-encoded private key
|
|
170
175
|
cert.x509_pem # PEM-encoded certificate
|
|
171
|
-
cert.sign(data) # Sign data with RSA-SHA256
|
|
172
176
|
cert.base64 # Base64-encoded certificate (for SAML metadata)
|
|
173
177
|
cert.fingerprint # SHA256 fingerprint
|
|
174
178
|
```
|
data/lib/lyrebird/assertion.rb
CHANGED
data/lib/lyrebird/certificate.rb
CHANGED
data/lib/lyrebird/response.rb
CHANGED
|
@@ -39,7 +39,7 @@ module Lyrebird
|
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
def document
|
|
42
|
-
Nokogiri::XML::Document.new.tap do |doc|
|
|
42
|
+
@document ||= Nokogiri::XML::Document.new.tap do |doc|
|
|
43
43
|
doc.root = build_response(doc)
|
|
44
44
|
sign_assertion(doc) if @sign_with && !@encrypt_with
|
|
45
45
|
sign_response(doc) if @sign_with
|
data/lib/lyrebird/signature.rb
CHANGED
|
@@ -13,6 +13,7 @@ module Lyrebird
|
|
|
13
13
|
def sign!
|
|
14
14
|
issuer = @element.at_xpath("saml:Issuer", "saml" => SAML_ASSERTION_NS)
|
|
15
15
|
issuer.add_next_sibling(build_signature)
|
|
16
|
+
populate_signature_value
|
|
16
17
|
self
|
|
17
18
|
end
|
|
18
19
|
|
|
@@ -52,16 +53,14 @@ module Lyrebird
|
|
|
52
53
|
def build_signature_value
|
|
53
54
|
@doc.create_element("SignatureValue").tap do |sv|
|
|
54
55
|
sv.namespace = @ds
|
|
55
|
-
|
|
56
|
-
sig = @certificate.sign(canonical)
|
|
57
|
-
sv.content = Base64.strict_encode64(sig)
|
|
56
|
+
@signature_value = sv
|
|
58
57
|
end
|
|
59
58
|
end
|
|
60
59
|
|
|
61
|
-
def
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
60
|
+
def populate_signature_value
|
|
61
|
+
canonical = @signed_info.canonicalize(C14N_EXCLUSIVE)
|
|
62
|
+
sig = @certificate.key.sign("SHA256", canonical)
|
|
63
|
+
@signature_value.content = Base64.strict_encode64(sig)
|
|
65
64
|
end
|
|
66
65
|
|
|
67
66
|
def build_key_info
|
data/lib/lyrebird/version.rb
CHANGED
data/lib/lyrebird.rb
CHANGED
|
@@ -33,6 +33,11 @@ module Lyrebird
|
|
|
33
33
|
assert_equal "saml", @root.namespace.prefix
|
|
34
34
|
end
|
|
35
35
|
|
|
36
|
+
def test_document_is_memoized
|
|
37
|
+
assertion = Assertion.new
|
|
38
|
+
assert_same assertion.document, assertion.document
|
|
39
|
+
end
|
|
40
|
+
|
|
36
41
|
def test_root_namespace
|
|
37
42
|
assert_equal SAML_ASSERTION_NS, @root.namespace.href
|
|
38
43
|
end
|
|
@@ -53,13 +53,6 @@ module Lyrebird
|
|
|
53
53
|
assert @certificate.x509.verify(@certificate.key)
|
|
54
54
|
end
|
|
55
55
|
|
|
56
|
-
def test_sign
|
|
57
|
-
data = "test"
|
|
58
|
-
signature = @certificate.sign(data)
|
|
59
|
-
public_key = @certificate.x509.public_key
|
|
60
|
-
assert public_key.verify("SHA256", signature, data)
|
|
61
|
-
end
|
|
62
|
-
|
|
63
56
|
def test_x509_with_custom_subject
|
|
64
57
|
certificate = Certificate.build(cn: "Test", o: "Acme")
|
|
65
58
|
subject = certificate.x509.subject.to_s
|
|
@@ -100,6 +100,14 @@ module Lyrebird
|
|
|
100
100
|
assert decoded.include?("<saml:Assertion")
|
|
101
101
|
end
|
|
102
102
|
|
|
103
|
+
def test_document_is_memoized
|
|
104
|
+
assert_same @response.document, @response.document
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def test_mimic_is_stable
|
|
108
|
+
assert_equal @response.mimic, @response.mimic
|
|
109
|
+
end
|
|
110
|
+
|
|
103
111
|
def test_root_name
|
|
104
112
|
assert_equal "Response", @root.name
|
|
105
113
|
assert_equal "samlp", @root.namespace.prefix
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: lyrebird
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.
|
|
4
|
+
version: 1.0.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Josh
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-
|
|
11
|
+
date: 2026-05-01 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: base64
|