Comparing changes

v1.3.0 v1.4.0
32 commits 14 files changed

Commits

e631d98 chore: release 1.4.0 mo khan 2025-03-26 20:49:21
4ec57be chore: reorder dependencies mo khan 2025-03-26 20:17:32
90a2138 chore: add missing gem dependencies mo khan 2025-03-26 20:16:04
af44044 chore: Upgrade min ruby to 3.1 mo khan 2025-03-26 20:07:25
d35241c docs: update CHANGELOG mo khan 2025-03-26 19:43:59
1270301 chore: fix failing specs mo khan 2025-03-26 19:40:26
20b70e3 feat: add lookup for Assertion mo khan 2025-03-26 19:18:50
789ffa1 docs: remove logo mo khan 2025-03-26 18:46:11
652c5cf chore: update version of Bundler mo khan 2025-03-26 18:35:27
9144b31 chore(deps): bump activemodel from 7.0.3 to 7.0.4 dependabot[bot] 2022-09-12 15:34:24
65d112b chore(deps-dev): bump webmock from 3.16.0 to 3.18.1 dependabot[bot] 2022-08-18 21:08:03
10e986f chore(deps-dev): bump webmock from 3.14.0 to 3.16.0 dependabot[bot] 2022-08-02 21:05:30
c8e11fe chore(deps): bump xml-kit from 0.5.0 to 0.6.0 dependabot[bot] 2022-05-23 21:09:06
7cd45f3 chore(deps): bump activemodel from 7.0.2.4 to 7.0.3 dependabot[bot] 2022-05-09 21:08:38
073b0af chore(deps-dev): bump ffaker from 2.20.0 to 2.21.0 dependabot[bot] 2022-04-08 21:05:52
e291a89 chore(deps): bump activemodel from 6.1.5 to 7.0.2.3 dependabot[bot] 2022-03-31 21:08:01
.github/workflows/ci.yml
@@ -8,7 +8,7 @@ jobs:
     runs-on: ubuntu-latest
     strategy:
       matrix:
-        ruby-version: ['2.7', '3.0', '3.1']
+        ruby-version: ['3.1', '3.2', '3.3', '3.4']
     steps:
       - uses: actions/checkout@v2
       - uses: ruby/setup-ruby@v1
@@ -22,7 +22,7 @@ jobs:
       - uses: actions/checkout@v2
       - uses: ruby/setup-ruby@v1
         with:
-          ruby-version: '2.7'
+          ruby-version: '3.1'
           bundler-cache: true
       - run: sh bin/style
   audit:
@@ -31,6 +31,6 @@ jobs:
       - uses: actions/checkout@v2
       - uses: ruby/setup-ruby@v1
         with:
-          ruby-version: '2.7'
+          ruby-version: '3.1'
           bundler-cache: true
       - run: sh bin/audit
lib/saml/kit/document.rb
@@ -53,12 +53,14 @@ module Saml
 
       class << self
         CONSTRUCTORS = {
+          'Assertion' => -> { Saml::Kit::Assertion },
           'AuthnRequest' => -> { Saml::Kit::AuthenticationRequest },
           'LogoutRequest' => -> { Saml::Kit::LogoutRequest },
           'LogoutResponse' => -> { Saml::Kit::LogoutResponse },
           'Response' => -> { Saml::Kit::Response },
         }.freeze
         XPATH = [
+          '/saml:Assertion',
           '/samlp:AuthnRequest',
           '/samlp:LogoutRequest',
           '/samlp:LogoutResponse',
@@ -71,7 +73,10 @@ module Saml
         # @param configuration [Saml::Kit::Configuration] configuration to use
         # for unpacking the document.
         def to_saml_document(xml, configuration: Saml::Kit.configuration)
-          namespaces = { samlp: Namespaces::PROTOCOL }
+          namespaces = {
+            saml: Namespaces::ASSERTION,
+            samlp: Namespaces::PROTOCOL,
+          }
           element = Nokogiri::XML(xml).at_xpath(XPATH, namespaces)
           constructor = CONSTRUCTORS[element.name].try(:call) || InvalidDocument
           constructor.new(xml, configuration: configuration)
lib/saml/kit/version.rb
@@ -2,6 +2,6 @@
 
 module Saml
   module Kit
-    VERSION = '1.3.0'
+    VERSION = '1.4.0'
   end
 end
spec/examples/saml-kit.gif
Binary file
spec/saml/kit/configuration_spec.rb
@@ -57,7 +57,9 @@ RSpec.describe Saml::Kit::Configuration do
       before do
         subject.add_key_pair(active_certificate.to_pem, private_key.export, use: :signing)
         subject.add_key_pair(expired_certificate.to_pem, private_key.export, use: :signing)
-        subject.add_key_pair(unsigned_certificate.to_pem, private_key.export, use: :signing)
+        if Gem::Version.new('3.1.0') > Gem::Version.new(RUBY_VERSION)
+          subject.add_key_pair(unsigned_certificate.to_pem, private_key.export, use: :signing)
+        end
       end
 
       specify do
@@ -71,7 +73,9 @@ RSpec.describe Saml::Kit::Configuration do
       before do
         subject.add_key_pair(active_certificate.to_pem, private_key.export, use: :encryption)
         subject.add_key_pair(expired_certificate.to_pem, private_key.export, use: :encryption)
-        subject.add_key_pair(unsigned_certificate.to_pem, private_key.export, use: :encryption)
+        if Gem::Version.new('3.1.0') > Gem::Version.new(RUBY_VERSION)
+          subject.add_key_pair(unsigned_certificate.to_pem, private_key.export, use: :encryption)
+        end
       end
 
       specify do
@@ -112,7 +116,9 @@ RSpec.describe Saml::Kit::Configuration do
       before do
         subject.add_key_pair(active_certificate.to_pem, private_key.export, use: :signing)
         subject.add_key_pair(expired_certificate.to_pem, private_key.export, use: :signing)
-        subject.add_key_pair(unsigned_certificate.to_pem, private_key.export, use: :signing)
+        if Gem::Version.new('3.1.0') > Gem::Version.new(RUBY_VERSION)
+          subject.add_key_pair(unsigned_certificate.to_pem, private_key.export, use: :signing)
+        end
       end
 
       specify { expect(subject.key_pairs.count).to be(1) }
spec/saml/kit/document_spec.rb
@@ -50,6 +50,12 @@ RSpec.describe Saml::Kit::Document do
       expect(result).to be_instance_of(Saml::Kit::LogoutRequest)
     end
 
+    it 'returns an Assertion' do
+      xml = Saml::Kit::Response.build(user, request).assertion.to_xml
+      result = subject.to_saml_document(xml)
+      expect(result).to be_instance_of(Saml::Kit::Assertion)
+    end
+
     it 'returns an invalid document' do
       xml = <<-XML
       <html>
spec/saml/kit/response_spec.rb
@@ -486,7 +486,9 @@ RSpec.describe Saml::Kit::Response do
       public_key = OpenSSL::X509::Certificate.new(certificate_pem).public_key
       private_key = OpenSSL::PKey::RSA.new(private_key_pem, password)
 
-      allow(Saml::Kit.configuration).to receive(:private_keys).with(use: :encryption).and_return([private_key])
+      allow(Saml::Kit.configuration).to receive(:private_keys)
+        .with(hash_including(use: :encryption))
+        .and_return([private_key])
 
       cipher = OpenSSL::Cipher.new('AES-128-CBC')
       cipher.encrypt
spec/spec_helper.rb
@@ -9,6 +9,7 @@ require 'saml/kit'
 require 'saml/kit/rspec'
 require 'active_support/core_ext/string/strip'
 require 'active_support/testing/time_helpers'
+require 'erb'
 require 'ffaker'
 require 'webmock/rspec'
 
.rubocop.yml
@@ -1,7 +1,7 @@
 inherit_from: .rubocop_todo.yml
 
-require:
-  - rubocop/cop/internal_affairs
+plugins:
+  - rubocop-internal_affairs
   - rubocop-rspec
 
 AllCops:
@@ -12,7 +12,7 @@ AllCops:
     - 'spec/examples/**/*'
     - 'tmp/**/*'
     - 'vendor/**/*'
-  TargetRubyVersion: 2.7
+  TargetRubyVersion: 3.1
 
 Layout/ArgumentAlignment:
   EnforcedStyle: with_fixed_indentation
@@ -47,6 +47,13 @@ Layout/FirstArrayElementIndentation:
 Layout/HeredocIndentation:
   EnforcedStyle: active_support
 
+Layout/LineLength:
+  Exclude:
+    - 'lib/saml/kit/builders/templates/*.builder'
+    - 'spec/**/*.rb'
+  IgnoredPatterns:
+    - '^#*'
+
 Layout/MultilineMethodCallIndentation:
   Enabled: true
   EnforcedStyle: indented
@@ -71,13 +78,6 @@ Metrics/ModuleLength:
   Exclude:
     - 'spec/**/*.rb'
 
-Metrics/LineLength:
-  Exclude:
-    - 'lib/saml/kit/builders/templates/*.builder'
-    - 'spec/**/*.rb'
-  IgnoredPatterns:
-    - '^#*'
-
 Naming/FileName:
   Exclude:
     - 'lib/saml-kit.rb'
.rubocop_todo.yml
@@ -1,21 +1,164 @@
 # This configuration was generated by
 # `rubocop --auto-gen-config`
-# on 2018-03-16 13:38:09 -0600 using RuboCop version 0.53.0.
+# on 2025-03-26 20:04:33 UTC using RuboCop version 1.75.1.
 # The point is for the user to remove these configuration records
 # one by one as the offenses are removed from the code base.
 # Note that changes in the inspected code, or installation of new
 # versions of RuboCop, may require this file to be generated again.
 
+# Offense count: 1
+# This cop supports safe autocorrection (--autocorrect).
+# Configuration parameters: EnforcedStyleAlignWith, Severity.
+# SupportedStylesAlignWith: start_of_line, begin
+Layout/BeginEndAlignment:
+  Exclude:
+    - 'exe/saml-kit-decode-http-redirect'
+
+# Offense count: 3
+# This cop supports unsafe autocorrection (--autocorrect-all).
+# Configuration parameters: Categories, ExpectedOrder.
+# ExpectedOrder: module_inclusion, constants, public_class_methods, initializer, public_methods, protected_methods, private_methods
+Layout/ClassStructure:
+  Exclude:
+    - 'lib/saml/kit/identity_provider_metadata.rb'
+    - 'lib/saml/kit/metadata.rb'
+    - 'lib/saml/kit/service_provider_metadata.rb'
+
+# Offense count: 4
+# This cop supports safe autocorrection (--autocorrect).
+# Configuration parameters: AllowAliasSyntax, AllowedMethods.
+# AllowedMethods: alias_method, public, protected, private
+Layout/EmptyLinesAroundAttributeAccessor:
+  Exclude:
+    - 'lib/saml/kit/builders/encrypted_assertion.rb'
+    - 'lib/saml/kit/builders/identity_provider_metadata.rb'
+    - 'lib/saml/kit/builders/service_provider_metadata.rb'
+    - 'lib/saml/kit/document.rb'
+
+# Offense count: 1
+# This cop supports safe autocorrection (--autocorrect).
+Layout/RescueEnsureAlignment:
+  Exclude:
+    - 'exe/saml-kit-decode-http-redirect'
+
+# Offense count: 15
+# This cop supports safe autocorrection (--autocorrect).
+Lint/DeprecatedOpenSSLConstant:
+  Exclude:
+    - 'lib/saml/kit/bindings/http_redirect.rb'
+    - 'lib/saml/kit/bindings/url_builder.rb'
+    - 'spec/saml/kit/authentication_request_spec.rb'
+    - 'spec/saml/kit/bindings/url_builder_spec.rb'
+    - 'spec/saml/kit/configuration_spec.rb'
+    - 'spec/saml/kit/signature_spec.rb'
+
 # Offense count: 2
+# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
 Metrics/AbcSize:
   Max: 19
 
-# Offense count: 11
-# Configuration parameters: CountComments.
+# Offense count: 5
+# Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns.
 Metrics/MethodLength:
   Max: 13
 
 # Offense count: 1
-Style/DateTime:
+# This cop supports safe autocorrection (--autocorrect).
+# Configuration parameters: EnforcedStyle.
+# SupportedStyles: be, be_nil
+RSpec/BeNil:
+  Exclude:
+    - 'spec/saml/kit/kit_spec.rb'
+
+# Offense count: 2
+RSpec/IdenticalEqualityAssertion:
+  Exclude:
+    - 'spec/saml/kit/bindings/http_post_spec.rb'
+    - 'spec/saml/kit/logout_response_spec.rb'
+
+# Offense count: 39
+# This cop supports safe autocorrection (--autocorrect).
+RSpec/MatchArray:
+  Exclude:
+    - 'spec/saml/kit/assertion_spec.rb'
+    - 'spec/saml/kit/builders/identity_provider_metadata_spec.rb'
+    - 'spec/saml/kit/builders/service_provider_metadata_spec.rb'
+    - 'spec/saml/kit/composite_metadata_spec.rb'
+    - 'spec/saml/kit/configuration_spec.rb'
+    - 'spec/saml/kit/default_registry_spec.rb'
+    - 'spec/saml/kit/identity_provider_metadata_spec.rb'
+    - 'spec/saml/kit/response_spec.rb'
+    - 'spec/saml/kit/service_provider_metadata_spec.rb'
+    - 'spec/saml/kit/signature_spec.rb'
+
+# Offense count: 4
+# This cop supports unsafe autocorrection (--autocorrect-all).
+RSpec/ReceiveMessages:
+  Exclude:
+    - 'spec/saml/kit/logout_request_spec.rb'
+
+# Offense count: 1
+# Configuration parameters: Include, CustomTransform, IgnoreMethods, IgnoreMetadata.
+# Include: **/*_spec.rb
+RSpec/SpecFilePathFormat:
+  Exclude:
+    - '**/spec/routing/**/*'
+    - 'spec/saml/kit/kit_spec.rb'
+
+# Offense count: 1
+RSpec/SubjectDeclaration:
+  Exclude:
+    - 'spec/saml/kit/identity_provider_metadata_spec.rb'
+
+# Offense count: 19
+# This cop supports safe autocorrection (--autocorrect).
+# Configuration parameters: EnforcedStyle.
+# SupportedStyles: separated, grouped
+Style/AccessorGrouping:
+  Exclude:
+    - 'lib/saml/kit/builders/assertion.rb'
+    - 'lib/saml/kit/builders/authentication_request.rb'
+    - 'lib/saml/kit/builders/identity_provider_metadata.rb'
+    - 'lib/saml/kit/builders/logout_response.rb'
+    - 'lib/saml/kit/builders/metadata.rb'
+    - 'lib/saml/kit/builders/service_provider_metadata.rb'
+
+# Offense count: 3
+# This cop supports safe autocorrection (--autocorrect).
+Style/ExplicitBlockArgument:
+  Exclude:
+    - 'lib/saml/kit/concerns/validatable.rb'
+    - 'lib/saml/kit/default_registry.rb'
+    - 'spec/support/ruby_prof.rb'
+
+# Offense count: 4
+# This cop supports unsafe autocorrection (--autocorrect-all).
+Style/GlobalStdStream:
+  Exclude:
+    - 'exe/saml-kit-create-self-signed-certificate'
+    - 'exe/saml-kit-decode-http-post'
+    - 'exe/saml-kit-decode-http-redirect'
+    - 'lib/saml/kit/configuration.rb'
+
+# Offense count: 1
+# This cop supports safe autocorrection (--autocorrect).
+Style/IfUnlessModifier:
+  Exclude:
+    - 'lib/saml/kit/builders/authentication_request.rb'
+
+# Offense count: 26
+# This cop supports unsafe autocorrection (--autocorrect-all).
+# Configuration parameters: EnforcedStyle.
+# SupportedStyles: literals, strict
+Style/MutableConstant:
+  Exclude:
+    - 'lib/saml/kit/bindings.rb'
+    - 'lib/saml/kit/namespaces.rb'
+
+# Offense count: 1
+# This cop supports unsafe autocorrection (--autocorrect-all).
+# Configuration parameters: EnforcedStyle.
+# SupportedStyles: forbid_for_all_comparison_operators, forbid_for_equality_operators_only, require_for_all_comparison_operators, require_for_equality_operators_only
+Style/YodaCondition:
   Exclude:
-    - 'lib/saml/kit/conditions.rb'
+    - 'lib/saml/kit/concerns/respondable.rb'
CHANGELOG.md
@@ -1,4 +1,4 @@
-Version 1.3.0
+Version 1.4.0
 
 # Changelog
 All notable changes to this project will be documented in this file.
@@ -8,6 +8,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ## [Unreleased]
 
+## [1.4.0] - 2025-03-26
+### Added
+- Add support for converting `Assertion` xml to `Saml::Document`
+
+### Removed
+- Drop support for ruby 2.7
+- Drop support for ruby 3.0
+
 ## [1.3.0] - 2022-03-30
 ### Removed
 
@@ -98,7 +106,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ### Removed
 - Removed optional SessionNotOnOrAfter attribute from AuthnStatement.
 
-[Unreleased]: https://github.com/xlgmokha/saml-kit/compare/v1.3.0...HEAD
+[Unreleased]: https://github.com/xlgmokha/saml-kit/compare/v1.4.0...HEAD
+[1.4.0]: https://github.com/xlgmokha/saml-kit/compare/v1.3.0...v1.4.0
 [1.3.0]: https://github.com/xlgmokha/saml-kit/compare/v1.2.0...v1.3.0
 [1.2.0]: https://github.com/xlgmokha/saml-kit/compare/v1.1.0...v1.2.0
 [1.1.0]: https://github.com/xlgmokha/saml-kit/compare/v1.0.31...v1.1.0
Gemfile.lock
@@ -1,114 +1,167 @@
 PATH
   remote: .
   specs:
-    saml-kit (1.3.0)
-      activemodel (>= 5.1, < 8.0)
-      net-hippie (>= 0.1, < 2.0)
+    saml-kit (1.4.0)
+      activemodel (>= 5.1)
+      base64 (~> 0.1)
+      cgi (~> 0.1)
+      forwardable (~> 1.0)
+      logger (~> 1.0)
+      net-hippie (~> 1.0)
+      nokogiri (~> 1.0)
+      securerandom (~> 0.1)
+      uri (~> 1.0)
       xml-kit (~> 0.4)
 
 GEM
   remote: https://rubygems.org/
   specs:
-    activemodel (6.1.5)
-      activesupport (= 6.1.5)
-    activesupport (6.1.5)
-      concurrent-ruby (~> 1.0, >= 1.0.2)
+    activemodel (7.2.2.1)
+      activesupport (= 7.2.2.1)
+    activesupport (7.2.2.1)
+      base64
+      benchmark (>= 0.3)
+      bigdecimal
+      concurrent-ruby (~> 1.0, >= 1.3.1)
+      connection_pool (>= 2.2.5)
+      drb
       i18n (>= 1.6, < 2)
+      logger (>= 1.4.2)
       minitest (>= 5.1)
-      tzinfo (~> 2.0)
-      zeitwerk (~> 2.3)
-    addressable (2.8.0)
-      public_suffix (>= 2.0.2, < 5.0)
-    ast (2.4.2)
+      securerandom (>= 0.3)
+      tzinfo (~> 2.0, >= 2.0.5)
+    addressable (2.8.7)
+      public_suffix (>= 2.0.2, < 7.0)
+    ast (2.4.3)
+    base64 (0.2.0)
+    benchmark (0.4.0)
     benchmark-malloc (0.2.0)
     benchmark-perf (0.6.0)
     benchmark-trend (0.4.0)
-    builder (3.2.4)
-    bundler-audit (0.9.0.1)
+    bigdecimal (3.1.9)
+    builder (3.3.0)
+    bundler-audit (0.9.2)
       bundler (>= 1.2.0, < 3)
       thor (~> 1.0)
-    concurrent-ruby (1.1.10)
-    crack (0.4.5)
+    cgi (0.4.2)
+    concurrent-ruby (1.3.5)
+    connection_pool (2.5.0)
+    crack (1.0.0)
+      bigdecimal
       rexml
-    diff-lcs (1.5.0)
-    docile (1.3.5)
-    ffaker (2.20.0)
-    hashdiff (1.0.1)
-    i18n (1.10.0)
+    date (3.4.1)
+    diff-lcs (1.6.1)
+    docile (1.4.1)
+    drb (2.2.1)
+    erb (4.0.4)
+      cgi (>= 0.3.3)
+    ffaker (2.24.0)
+    forwardable (1.3.3)
+    hashdiff (1.1.2)
+    i18n (1.14.7)
       concurrent-ruby (~> 1.0)
-    mini_portile2 (2.8.0)
-    minitest (5.15.0)
-    net-hippie (1.1.1)
-    nokogiri (1.13.3)
-      mini_portile2 (~> 2.8.0)
+    io-console (0.8.0)
+    irb (1.15.1)
+      pp (>= 0.6.0)
+      rdoc (>= 4.0.0)
+      reline (>= 0.4.2)
+    json (2.10.2)
+    language_server-protocol (3.17.0.4)
+    lint_roller (1.1.0)
+    logger (1.6.6)
+    mini_portile2 (2.8.8)
+    minitest (5.25.5)
+    net-hippie (1.2.0)
+      logger (~> 1.0)
+    nokogiri (1.18.6)
+      mini_portile2 (~> 2.8.2)
       racc (~> 1.4)
-    parallel (1.20.1)
-    parser (3.0.0.0)
+    parallel (1.26.3)
+    parser (3.3.7.3)
       ast (~> 2.4.1)
-    public_suffix (4.0.6)
-    racc (1.6.0)
-    rainbow (3.0.0)
-    rake (13.0.6)
-    regexp_parser (2.0.3)
-    rexml (3.2.5)
-    rspec (3.11.0)
-      rspec-core (~> 3.11.0)
-      rspec-expectations (~> 3.11.0)
-      rspec-mocks (~> 3.11.0)
+      racc
+    pp (0.6.2)
+      prettyprint
+    prettyprint (0.2.0)
+    prism (1.4.0)
+    psych (5.2.3)
+      date
+      stringio
+    public_suffix (6.0.1)
+    racc (1.8.1)
+    rainbow (3.1.1)
+    rake (13.2.1)
+    rdoc (6.13.0)
+      psych (>= 4.0.0)
+    regexp_parser (2.10.0)
+    reline (0.6.0)
+      io-console (~> 0.5)
+    rexml (3.4.1)
+    rspec (3.13.0)
+      rspec-core (~> 3.13.0)
+      rspec-expectations (~> 3.13.0)
+      rspec-mocks (~> 3.13.0)
     rspec-benchmark (0.6.0)
       benchmark-malloc (~> 0.2)
       benchmark-perf (~> 0.6)
       benchmark-trend (~> 0.4)
       rspec (>= 3.0)
-    rspec-core (3.11.0)
-      rspec-support (~> 3.11.0)
-    rspec-expectations (3.11.0)
+    rspec-core (3.13.3)
+      rspec-support (~> 3.13.0)
+    rspec-expectations (3.13.3)
       diff-lcs (>= 1.2.0, < 2.0)
-      rspec-support (~> 3.11.0)
-    rspec-mocks (3.11.0)
+      rspec-support (~> 3.13.0)
+    rspec-mocks (3.13.2)
       diff-lcs (>= 1.2.0, < 2.0)
-      rspec-support (~> 3.11.0)
-    rspec-support (3.11.0)
-    rubocop (0.93.1)
+      rspec-support (~> 3.13.0)
+    rspec-support (3.13.2)
+    rubocop (1.75.1)
+      json (~> 2.3)
+      language_server-protocol (~> 3.17.0.2)
+      lint_roller (~> 1.1.0)
       parallel (~> 1.10)
-      parser (>= 2.7.1.5)
+      parser (>= 3.3.0.2)
       rainbow (>= 2.2.2, < 4.0)
-      regexp_parser (>= 1.8)
-      rexml
-      rubocop-ast (>= 0.6.0)
+      regexp_parser (>= 2.9.3, < 3.0)
+      rubocop-ast (>= 1.43.0, < 2.0)
       ruby-progressbar (~> 1.7)
-      unicode-display_width (>= 1.4.0, < 2.0)
-    rubocop-ast (1.4.1)
-      parser (>= 2.7.1.5)
-    rubocop-rspec (1.44.1)
-      rubocop (~> 0.87)
-      rubocop-ast (>= 0.7.1)
-    ruby-prof (1.4.3)
-    ruby-progressbar (1.11.0)
-    simplecov (0.21.2)
+      unicode-display_width (>= 2.4.0, < 4.0)
+    rubocop-ast (1.43.0)
+      parser (>= 3.3.7.2)
+      prism (~> 1.4)
+    rubocop-rspec (3.5.0)
+      lint_roller (~> 1.1)
+      rubocop (~> 1.72, >= 1.72.1)
+    ruby-prof (1.7.1)
+    ruby-progressbar (1.13.0)
+    securerandom (0.4.1)
+    simplecov (0.22.0)
       docile (~> 1.1)
       simplecov-html (~> 0.11)
       simplecov_json_formatter (~> 0.1)
-    simplecov-html (0.12.3)
-    simplecov_json_formatter (0.1.2)
-    thor (1.1.0)
-    tilt (2.0.10)
-    tzinfo (2.0.4)
+    simplecov-html (0.13.1)
+    simplecov_json_formatter (0.1.4)
+    stringio (3.1.6)
+    thor (1.3.2)
+    tilt (2.6.0)
+    tzinfo (2.0.6)
       concurrent-ruby (~> 1.0)
-    unicode-display_width (1.7.0)
-    webmock (3.14.0)
+    unicode-display_width (3.1.4)
+      unicode-emoji (~> 4.0, >= 4.0.4)
+    unicode-emoji (4.0.4)
+    uri (1.0.3)
+    webmock (3.25.1)
       addressable (>= 2.8.0)
       crack (>= 0.3.2)
       hashdiff (>= 0.4.0, < 2.0.0)
-    xml-kit (0.5.0)
+    xml-kit (0.6.0)
       activemodel (>= 4.2.0)
       builder (~> 3.2)
       nokogiri (~> 1.10)
       tilt (>= 1.4.1)
       xmldsig (~> 0.6)
-    xmldsig (0.6.6)
+    xmldsig (0.7.0)
       nokogiri (>= 1.6.8, < 2.0.0)
-    zeitwerk (2.5.4)
 
 PLATFORMS
   ruby
@@ -116,16 +169,18 @@ PLATFORMS
 DEPENDENCIES
   bundler (~> 2.0)
   bundler-audit (~> 0.6)
+  erb (~> 4.0)
   ffaker (~> 2.7)
+  irb (~> 1.0)
   rake (~> 13.0)
   rspec (~> 3.0)
   rspec-benchmark (~> 0.3)
-  rubocop (~> 0.52)
-  rubocop-rspec (~> 1.22)
+  rubocop (~> 1.0)
+  rubocop-rspec (~> 3.0)
   ruby-prof
   saml-kit!
   simplecov (~> 0.15)
   webmock (~> 3.1)
 
 BUNDLED WITH
-   2.1.4
+   2.6.6
README.md
@@ -1,9 +1,3 @@
-![SAML-Kit](https://github.com/xlgmokha/saml-kit/raw/main/spec/examples/saml-kit.gif)
-
-*Logo courtesy of [@speasley](https://github.com/speasley)*
-
-[![Gem Version](https://badge.fury.io/rb/saml-kit.svg)](https://rubygems.org/gems/saml-kit)
-
 Saml::Kit is a library with the purpose of creating and consuming SAML
 documents. It supports the HTTP Post and HTTP Redirect bindings. It can
 create Service Provider Metadata, Identity Provider Metadata,
saml-kit.gemspec
@@ -14,7 +14,7 @@ Gem::Specification.new do |spec|
   spec.description   = 'A simple toolkit for working with SAML.'
   spec.homepage      = 'https://github.com/xlgmokha/saml-kit'
   spec.license       = 'MIT'
-  spec.required_ruby_version = '>= 2.7.0'
+  spec.required_ruby_version = '>= 3.1.0'
 
   spec.files = `git ls-files -z`.split("\x0").reject do |f|
     (
@@ -28,17 +28,26 @@ Gem::Specification.new do |spec|
   spec.executables   = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
   spec.require_paths = ['lib']
 
-  spec.add_dependency 'activemodel', '>= 5.1', '< 8.0'
-  spec.add_dependency 'net-hippie', '>= 0.1', '< 2.0'
+  spec.add_dependency 'activemodel', '>= 5.1'
+  spec.add_dependency 'base64', '~> 0.1'
+  spec.add_dependency 'cgi', '~> 0.1'
+  spec.add_dependency 'forwardable', '~> 1.0'
+  spec.add_dependency 'logger', '~> 1.0'
+  spec.add_dependency 'net-hippie', '~> 1.0'
+  spec.add_dependency 'nokogiri', '~> 1.0'
+  spec.add_dependency 'securerandom', '~> 0.1'
+  spec.add_dependency 'uri', '~> 1.0'
   spec.add_dependency 'xml-kit', '~> 0.4'
   spec.add_development_dependency 'bundler', '~> 2.0'
   spec.add_development_dependency 'bundler-audit', '~> 0.6'
+  spec.add_development_dependency 'erb', '~> 4.0'
   spec.add_development_dependency 'ffaker', '~> 2.7'
+  spec.add_development_dependency 'irb', '~> 1.0'
   spec.add_development_dependency 'rake', '~> 13.0'
   spec.add_development_dependency 'rspec', '~> 3.0'
   spec.add_development_dependency 'rspec-benchmark', '~> 0.3'
-  spec.add_development_dependency 'rubocop', '~> 0.52'
-  spec.add_development_dependency 'rubocop-rspec', '~> 1.22'
+  spec.add_development_dependency 'rubocop', '~> 1.0'
+  spec.add_development_dependency 'rubocop-rspec', '~> 3.0'
   spec.add_development_dependency 'ruby-prof'
   spec.add_development_dependency 'simplecov', '~> 0.15'
   spec.add_development_dependency 'webmock', '~> 3.1'