saml_idp 0.12.0 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 73712903d3949f895e57a13b138c007e0ae74715d7d546b4415f278829e59054
4
- data.tar.gz: fbab7e28d01ea3fc7624e52e20a234f6f997a51643905170e6809cb3f7beeec7
3
+ metadata.gz: 4da444f25fd4d8cb2b53d847ee3ffa44adab3b2c4b64be57a6935c0922acf1a8
4
+ data.tar.gz: ff0beb64e76c37a0bbcb098f0bd5a50b4d15ff124d63d9c01d421f4693f6fa2d
5
5
  SHA512:
6
- metadata.gz: 80a4683963e04b8b7f68051d15b12a5f0a098300cbfba9b72c4ed3940338ab3505c47cda0b091a9a36c1605f4396b5f1732bed7d3356438dd944f83541573a47
7
- data.tar.gz: b01be29f645e31f9987afef74bb8b368ccfc86340b67e29524f582fe139e99b56cd827315d5a4e73d34b69e2c3c5b89d881c89f6d29b68c4b3cd2ff5499a39c3
6
+ metadata.gz: 1fe91e27e817106e66738c73c670ce064c18b18e9528f7aef3c2a4dc87658c9262877b7a62f491c29ff371d39e0306721bc1f97af7ec3fb6fd1d23b8550b32ce
7
+ data.tar.gz: d6ee196976da4fe1af818bca3183632372ef2e1e3059891e75a13dc39caa9fb86c3d312c384d926877f9e14cfbd751d566d517742e72e0bb77e276e446a88aed
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Ruby SAML Identity Provider (IdP)
2
2
 
3
- Forked from https://github.com/lawrencepit/ruby-saml-idp
3
+ Forked from <https://github.com/lawrencepit/ruby-saml-idp>
4
4
 
5
5
  [![Build Status](https://travis-ci.org/saml-idp/saml_idp.svg)](https://travis-ci.org/saml-idp/saml_idp)
6
6
  [![Gem Version](https://badge.fury.io/rb/saml_idp.svg)](http://badge.fury.io/rb/saml_idp)
@@ -13,13 +13,15 @@ protocol. It provides a means for managing authentication requests and confirmat
13
13
  This was originally setup by @lawrencepit to test SAML Clients. I took it closer to a real
14
14
  SAML IDP implementation.
15
15
 
16
- # Installation and Usage
16
+ ## Installation and Usage
17
17
 
18
18
  Add this to your Gemfile:
19
19
 
20
+ ```ruby
20
21
  gem 'saml_idp'
22
+ ```
21
23
 
22
- ## Not using rails?
24
+ ### Not using rails?
23
25
 
24
26
  Include `SamlIdp::Controller` and see the examples that use rails. It should be straightforward for you.
25
27
 
@@ -27,57 +29,24 @@ Basically you call `decode_request(params[:SAMLRequest])` on an incoming request
27
29
  `saml_acs_url` to determine the source for which you need to authenticate a user. How you authenticate
28
30
  a user is entirely up to you.
29
31
 
30
- Once a user has successfully authenticated on your system send the Service Provider a SAMLReponse by
32
+ Once a user has successfully authenticated on your system send the Service Provider a SAMLResponse by
31
33
  posting to `saml_acs_url` the parameter `SAMLResponse` with the return value from a call to
32
34
  `encode_response(user_email)`.
33
35
 
34
- ## Using rails?
36
+ ### Using rails?
35
37
 
36
- Add to your `routes.rb` file, for example:
37
-
38
- ```ruby
39
- get '/saml/auth' => 'saml_idp#new'
40
- get '/saml/metadata' => 'saml_idp#show'
41
- post '/saml/auth' => 'saml_idp#create'
42
- match '/saml/logout' => 'saml_idp#logout', via: [:get, :post, :delete]
43
- ```
38
+ Check out our Wiki page for Rails integration
39
+ [Rails Integration guide](https://github.com/saml-idp/saml_idp/wiki/Rails_Integration)
44
40
 
45
- Create a controller that looks like this, customize to your own situation:
46
-
47
- ```ruby
48
- class SamlIdpController < SamlIdp::IdpController
49
- def idp_authenticate(email, password) # not using params intentionally
50
- user = User.by_email(email).first
51
- user && user.valid_password?(password) ? user : nil
52
- end
53
- private :idp_authenticate
54
-
55
- def idp_make_saml_response(found_user) # not using params intentionally
56
- # NOTE encryption is optional
57
- encode_response found_user, encryption: {
58
- cert: saml_request.service_provider.cert,
59
- block_encryption: 'aes256-cbc',
60
- key_transport: 'rsa-oaep-mgf1p'
61
- }
62
- end
63
- private :idp_make_saml_response
64
-
65
- def idp_logout
66
- user = User.by_email(saml_request.name_id)
67
- user.logout
68
- end
69
- private :idp_logout
70
- end
71
- ```
72
-
73
- ## Configuration
41
+ ### Configuration
74
42
 
75
43
  #### Signed assertions and Signed Response
76
44
 
77
- By default SAML Assertion will be signed with an algorithm which defined to `config.algorithm`. Because SAML assertions contain secure information used for authentication such as NameID.
45
+ By default SAML Assertion will be signed with an algorithm which defined to `config.algorithm`, because SAML assertions contain secure information used for authentication such as NameID.
46
+ Besides that, signing assertions could be optional and can be defined with `config.signed_assertion` option. Setting this configuration flag to `false` will add raw assertions on the response instead of signed ones. If the response is encrypted the `config.signed_assertion` will be ignored and all assertions will be signed.
78
47
 
79
48
  Signing SAML Response is optional, but some security perspective SP services might require Response message itself must be signed.
80
- For that, you can enable it with `config.signed_message` option. [More about SAML spec](https://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf#page=68)
49
+ For that, you can enable it with `signed_message: true` option for `encode_response(user_email, signed_message: true)` method. [More about SAML spec](https://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf#page=68)
81
50
 
82
51
  #### Signing algorithm
83
52
 
@@ -117,7 +86,9 @@ CERT
117
86
  # config.attribute_service_location = "#{base}/saml/attributes"
118
87
  # config.single_service_post_location = "#{base}/saml/auth"
119
88
  # config.session_expiry = 86400 # Default: 0 which means never
120
- # config.signed_message = true # Default: false which means unsigned SAML Response
89
+ # config.signed_assertion = false # Default: true which means signed assertions on the SAML Response
90
+ # config.compress = true # Default: false which means the SAML Response is not being compressed
91
+ # config.logger = ::Logger.new($stdout) # Default: if in Rails context - Rails.logger, else ->(msg) { puts msg }. Works with either a Ruby Logger or a lambda
121
92
 
122
93
  # Principal (e.g. User) is passed in when you `encode_response`
123
94
  #
@@ -230,7 +201,7 @@ CERT
230
201
  end
231
202
  ```
232
203
 
233
- # Keys and Secrets
204
+ ## Keys and Secrets
234
205
 
235
206
  To generate the SAML Response it uses a default X.509 certificate and secret key... which isn't so secret.
236
207
  You can find them in `SamlIdp::Default`. The X.509 certificate is valid until year 2032.
@@ -241,31 +212,31 @@ and `SamlIdp.config.secret_key` properties.
241
212
 
242
213
  The fingerprint to use, if you use the default X.509 certificate of this gem, is:
243
214
 
244
- ```
245
- 9E:65:2E:03:06:8D:80:F2:86:C7:6C:77:A1:D9:14:97:0A:4D:F4:4D
215
+ ```bash
216
+ 9E:65:2E:03:06:8D:80:F2:86:C7:6C:77:A1:D9:14:97:0A:4D:F4:4D
246
217
  ```
247
218
 
248
- # Fingerprint
219
+ ## Fingerprint
249
220
 
250
221
  The gem provides an helper to generate a fingerprint for a X.509 certificate.
251
222
  The second parameter is optional and default to your configuration `SamlIdp.config.algorithm`
252
223
 
253
224
  ```ruby
254
- Fingerprint.certificate_digest(x509_cert, :sha512)
225
+ SamlIdp::Fingerprint.certificate_digest(x509_cert, :sha512)
255
226
  ```
256
227
 
257
- # Service Providers
228
+ ## Service Providers
258
229
 
259
230
  To act as a Service Provider which generates SAML Requests and can react to SAML Responses use the
260
231
  excellent [ruby-saml](https://github.com/onelogin/ruby-saml) gem.
261
232
 
262
- # Author
233
+ ## Author
263
234
 
264
235
  Jon Phenow, jon@jphenow.com, jphenow.com, @jphenow
265
236
 
266
237
  Lawrence Pit, lawrence.pit@gmail.com, lawrencepit.com, @lawrencepit
267
238
 
268
- # Copyright
239
+ ## Copyright
269
240
 
270
241
  Copyright (c) 2012 Sport Ngin.
271
242
  Portions Copyright (c) 2010 OneLogin, LLC
@@ -16,10 +16,26 @@ module SamlIdp
16
16
  attr_accessor :expiry
17
17
  attr_accessor :encryption_opts
18
18
  attr_accessor :session_expiry
19
+ attr_accessor :name_id_formats_opts
20
+ attr_accessor :asserted_attributes_opts
19
21
 
20
22
  delegate :config, to: :SamlIdp
21
23
 
22
- def initialize(reference_id, issuer_uri, principal, audience_uri, saml_request_id, saml_acs_url, raw_algorithm, authn_context_classref, expiry=60*60, encryption_opts=nil, session_expiry=nil)
24
+ def initialize(
25
+ reference_id,
26
+ issuer_uri,
27
+ principal,
28
+ audience_uri,
29
+ saml_request_id,
30
+ saml_acs_url,
31
+ raw_algorithm,
32
+ authn_context_classref,
33
+ expiry=60*60,
34
+ encryption_opts=nil,
35
+ session_expiry=nil,
36
+ name_id_formats_opts = nil,
37
+ asserted_attributes_opts = nil
38
+ )
23
39
  self.reference_id = reference_id
24
40
  self.issuer_uri = issuer_uri
25
41
  self.principal = principal
@@ -31,6 +47,8 @@ module SamlIdp
31
47
  self.expiry = expiry
32
48
  self.encryption_opts = encryption_opts
33
49
  self.session_expiry = session_expiry.nil? ? config.session_expiry : session_expiry
50
+ self.name_id_formats_opts = name_id_formats_opts
51
+ self.asserted_attributes_opts = asserted_attributes_opts
34
52
  end
35
53
 
36
54
  def fresh
@@ -98,7 +116,9 @@ module SamlIdp
98
116
  end
99
117
 
100
118
  def asserted_attributes
101
- if principal.respond_to?(:asserted_attributes)
119
+ if asserted_attributes_opts.present? && !asserted_attributes_opts.empty?
120
+ asserted_attributes_opts
121
+ elsif principal.respond_to?(:asserted_attributes)
102
122
  principal.send(:asserted_attributes)
103
123
  elsif !config.attributes.nil? && !config.attributes.empty?
104
124
  config.attributes
@@ -139,10 +159,15 @@ module SamlIdp
139
159
  private :name_id_getter
140
160
 
141
161
  def name_id_format
142
- @name_id_format ||= NameIdFormatter.new(config.name_id.formats).chosen
162
+ @name_id_format ||= NameIdFormatter.new(name_id_formats).chosen
143
163
  end
144
164
  private :name_id_format
145
165
 
166
+ def name_id_formats
167
+ @name_id_formats ||= (name_id_formats_opts || config.name_id.formats)
168
+ end
169
+ private :name_id_formats
170
+
146
171
  def reference_string
147
172
  "_#{reference_id}"
148
173
  end
@@ -22,6 +22,7 @@ module SamlIdp
22
22
  attr_accessor :service_provider
23
23
  attr_accessor :assertion_consumer_service_hosts
24
24
  attr_accessor :session_expiry
25
+ attr_accessor :logger
25
26
 
26
27
  def initialize
27
28
  self.x509_certificate = Default::X509_CERTIFICATE
@@ -34,6 +35,7 @@ module SamlIdp
34
35
  self.service_provider.persisted_metadata_getter = ->(id, service_provider) { }
35
36
  self.session_expiry = 0
36
37
  self.attributes = {}
38
+ self.logger = defined?(::Rails) ? Rails.logger : ->(msg) { puts msg }
37
39
  end
38
40
 
39
41
  # formats
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  require 'openssl'
3
2
  require 'base64'
4
3
  require 'time'
@@ -36,13 +35,8 @@ module SamlIdp
36
35
  def validate_saml_request(raw_saml_request = params[:SAMLRequest])
37
36
  decode_request(raw_saml_request)
38
37
  return true if valid_saml_request?
39
- if defined?(::Rails)
40
- if Rails::VERSION::MAJOR >= 4
41
- head :forbidden
42
- else
43
- render nothing: true, status: :forbidden
44
- end
45
- end
38
+
39
+ head :forbidden if defined?(::Rails)
46
40
  false
47
41
  end
48
42
 
@@ -64,7 +58,13 @@ module SamlIdp
64
58
  expiry = opts[:expiry] || 60*60
65
59
  session_expiry = opts[:session_expiry]
66
60
  encryption_opts = opts[:encryption] || nil
61
+ name_id_formats_opts = opts[:name_id_formats] || nil
62
+ asserted_attributes_opts = opts[:attributes] || nil
67
63
  signed_message_opts = opts[:signed_message] || false
64
+ name_id_formats_opts = opts[:name_id_formats] || nil
65
+ asserted_attributes_opts = opts[:attributes] || nil
66
+ signed_assertion_opts = opts[:signed_assertion] || true
67
+ compress_opts = opts[:compress] || false
68
68
 
69
69
  SamlResponse.new(
70
70
  reference_id,
@@ -79,11 +79,15 @@ module SamlIdp
79
79
  expiry,
80
80
  encryption_opts,
81
81
  session_expiry,
82
- signed_message_opts
82
+ name_id_formats_opts,
83
+ asserted_attributes_opts,
84
+ signed_assertion_opts,
85
+ signed_message_opts,
86
+ compress_opts
83
87
  ).build
84
88
  end
85
89
 
86
- def encode_logout_response(principal, opts = {})
90
+ def encode_logout_response(_principal, opts = {})
87
91
  SamlIdp::LogoutResponseBuilder.new(
88
92
  get_saml_response_id,
89
93
  (opts[:issuer_uri] || issuer_uri),
@@ -61,7 +61,6 @@ module SamlIdp
61
61
  key_info.EncryptedKey Id: 'EK', xmlns: 'http://www.w3.org/2001/04/xmlenc#' do |enc_key|
62
62
  enc_key.EncryptionMethod Algorithm: key_transport_ns
63
63
  enc_key.tag! 'ds:KeyInfo', 'xmlns:ds' => 'http://www.w3.org/2000/09/xmldsig#' do |key_info2|
64
- key_info2.tag! 'ds:KeyName'
65
64
  key_info2.tag! 'ds:X509Data' do |x509_data|
66
65
  x509_data.tag! 'ds:X509Certificate' do |x509_cert|
67
66
  x509_cert << cert.to_s.gsub(/-+(BEGIN|END) CERTIFICATE-+/, '')
@@ -1,5 +1,6 @@
1
1
  require 'saml_idp/xml_security'
2
2
  require 'saml_idp/service_provider'
3
+ require 'logger'
3
4
  module SamlIdp
4
5
  class Request
5
6
  def self.from_deflated_request(raw)
@@ -77,10 +78,10 @@ module SamlIdp
77
78
  end
78
79
 
79
80
  def log(msg)
80
- if defined?(::Rails) && Rails.logger
81
- Rails.logger.info msg
81
+ if config.logger.class <= ::Logger
82
+ config.logger.info msg
82
83
  else
83
- puts msg
84
+ config.logger.call msg
84
85
  end
85
86
  end
86
87
 
@@ -23,21 +23,21 @@ module SamlIdp
23
23
  self.raw_algorithm = raw_algorithm
24
24
  end
25
25
 
26
- def encoded(signed_message: false)
27
- @encoded ||= signed_message ? encode_signed_message : encode_raw_message
26
+ def encoded(signed_message: false, compress: false)
27
+ @encoded ||= signed_message ? encode_signed_message(compress) : encode_raw_message(compress)
28
28
  end
29
29
 
30
30
  def raw
31
31
  build
32
32
  end
33
33
 
34
- def encode_raw_message
35
- Base64.strict_encode64(raw)
34
+ def encode_raw_message(compress)
35
+ Base64.strict_encode64(compress ? deflate(raw) : raw)
36
36
  end
37
37
  private :encode_raw_message
38
38
 
39
- def encode_signed_message
40
- Base64.strict_encode64(signed)
39
+ def encode_signed_message(compress)
40
+ Base64.strict_encode64(compress ? deflate(signed) : signed)
41
41
  end
42
42
  private :encode_signed_message
43
43
 
@@ -66,11 +66,17 @@ module SamlIdp
66
66
  def response_id_string
67
67
  "_#{response_id}"
68
68
  end
69
+ alias_method :reference_id, :response_id
69
70
  private :response_id_string
70
71
 
71
72
  def now_iso
72
73
  Time.now.utc.iso8601
73
74
  end
74
75
  private :now_iso
76
+
77
+ def deflate(inflated)
78
+ Zlib::Deflate.deflate(inflated, 9)[2..-5]
79
+ end
80
+ private :deflate
75
81
  end
76
82
  end
@@ -1,8 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'saml_idp/assertion_builder'
2
4
  require 'saml_idp/response_builder'
3
5
  module SamlIdp
4
6
  class SamlResponse
5
- attr_accessor :assertion_with_signature
6
7
  attr_accessor :reference_id
7
8
  attr_accessor :response_id
8
9
  attr_accessor :issuer_uri
@@ -17,22 +18,32 @@ module SamlIdp
17
18
  attr_accessor :expiry
18
19
  attr_accessor :encryption_opts
19
20
  attr_accessor :session_expiry
21
+ attr_accessor :name_id_formats_opts
22
+ attr_accessor :asserted_attributes_opts
20
23
  attr_accessor :signed_message_opts
24
+ attr_accessor :signed_assertion_opts
25
+ attr_accessor :compression_opts
26
+
27
+ def initialize(
28
+ reference_id,
29
+ response_id,
30
+ issuer_uri,
31
+ principal,
32
+ audience_uri,
33
+ saml_request_id,
34
+ saml_acs_url,
35
+ algorithm,
36
+ authn_context_classref,
37
+ expiry = 60 * 60,
38
+ encryption_opts = nil,
39
+ session_expiry = 0,
40
+ name_id_formats_opts = nil,
41
+ asserted_attributes_opts = nil,
42
+ signed_message_opts = false,
43
+ signed_assertion_opts = true,
44
+ compression_opts = false
45
+ )
21
46
 
22
- def initialize(reference_id,
23
- response_id,
24
- issuer_uri,
25
- principal,
26
- audience_uri,
27
- saml_request_id,
28
- saml_acs_url,
29
- algorithm,
30
- authn_context_classref,
31
- expiry=60*60,
32
- encryption_opts=nil,
33
- session_expiry=0,
34
- signed_message_opts
35
- )
36
47
  self.reference_id = reference_id
37
48
  self.response_id = response_id
38
49
  self.issuer_uri = issuer_uri
@@ -48,26 +59,34 @@ module SamlIdp
48
59
  self.encryption_opts = encryption_opts
49
60
  self.session_expiry = session_expiry
50
61
  self.signed_message_opts = signed_message_opts
62
+ self.name_id_formats_opts = name_id_formats_opts
63
+ self.asserted_attributes_opts = asserted_attributes_opts
64
+ self.signed_assertion_opts = signed_assertion_opts
65
+ self.name_id_formats_opts = name_id_formats_opts
66
+ self.asserted_attributes_opts = asserted_attributes_opts
67
+ self.compression_opts = compression_opts
51
68
  end
52
69
 
53
70
  def build
54
- @built ||= encoded_message
71
+ @build ||= encoded_message
55
72
  end
56
73
 
57
74
  def signed_assertion
58
75
  if encryption_opts
59
76
  assertion_builder.encrypt(sign: true)
60
- else
77
+ elsif signed_assertion_opts
61
78
  assertion_builder.signed
79
+ else
80
+ assertion_builder.raw
62
81
  end
63
82
  end
64
83
  private :signed_assertion
65
84
 
66
85
  def encoded_message
67
86
  if signed_message_opts
68
- response_builder.encoded(signed_message: true)
87
+ response_builder.encoded(signed_message: true, compress: compression_opts)
69
88
  else
70
- response_builder.encoded(signed_message: false)
89
+ response_builder.encoded(signed_message: false, compress: compression_opts)
71
90
  end
72
91
  end
73
92
  private :encoded_message
@@ -78,17 +97,20 @@ module SamlIdp
78
97
  private :response_builder
79
98
 
80
99
  def assertion_builder
81
- @assertion_builder ||= AssertionBuilder.new reference_id,
82
- issuer_uri,
83
- principal,
84
- audience_uri,
85
- saml_request_id,
86
- saml_acs_url,
87
- algorithm,
88
- authn_context_classref,
89
- expiry,
90
- encryption_opts,
91
- session_expiry
100
+ @assertion_builder ||=
101
+ AssertionBuilder.new SecureRandom.uuid,
102
+ issuer_uri,
103
+ principal,
104
+ audience_uri,
105
+ saml_request_id,
106
+ saml_acs_url,
107
+ algorithm,
108
+ authn_context_classref,
109
+ expiry,
110
+ encryption_opts,
111
+ session_expiry,
112
+ name_id_formats_opts,
113
+ asserted_attributes_opts
92
114
  end
93
115
  private :assertion_builder
94
116
  end
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  module SamlIdp
3
- VERSION = '0.12.0'
3
+ VERSION = '0.15.0'
4
4
  end
data/lib/saml_idp.rb CHANGED
@@ -9,7 +9,7 @@ module SamlIdp
9
9
  require 'saml_idp/metadata_builder'
10
10
  require 'saml_idp/version'
11
11
  require 'saml_idp/fingerprint'
12
- require 'saml_idp/engine' if defined?(::Rails) && Rails::VERSION::MAJOR > 2
12
+ require 'saml_idp/engine' if defined?(::Rails)
13
13
 
14
14
  def self.config
15
15
  @config ||= SamlIdp::Configurator.new
data/saml_idp.gemspec CHANGED
@@ -1,61 +1,62 @@
1
1
  # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "saml_idp/version"
2
+
3
+ $LOAD_PATH.push File.expand_path('lib', __dir__)
4
+ require 'saml_idp/version'
4
5
 
5
6
  Gem::Specification.new do |s|
6
7
  s.name = %q{saml_idp}
7
8
  s.version = SamlIdp::VERSION
8
9
  s.platform = Gem::Platform::RUBY
9
- s.authors = ["Jon Phenow"]
10
+ s.authors = ['Jon Phenow']
10
11
  s.email = 'jon.phenow@sportngin.com'
11
12
  s.homepage = 'https://github.com/saml-idp/saml_idp'
12
13
  s.summary = 'SAML Indentity Provider for Ruby'
13
14
  s.description = 'SAML IdP (Identity Provider) Library for Ruby'
14
- s.date = Time.now.utc.strftime("%Y-%m-%d")
15
- s.files = Dir['app/**/*', 'lib/**/*', 'LICENSE', 'README.md', 'Gemfile', 'saml_idp.gemspec']
16
- s.required_ruby_version = '>= 2.2'
15
+ s.date = Time.now.utc.strftime('%Y-%m-%d')
16
+ s.files = Dir['lib/**/*', 'LICENSE', 'README.md', 'Gemfile', 'saml_idp.gemspec']
17
+ s.required_ruby_version = '>= 2.5'
17
18
  s.license = 'MIT'
18
19
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
20
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
- s.require_paths = ["lib"]
21
+ s.require_paths = ['lib']
21
22
  s.rdoc_options = ['--charset=UTF-8']
22
23
  s.metadata = {
23
- 'homepage_uri' => 'https://github.com/saml-idp/saml_idp',
24
- 'source_code_uri' => 'https://github.com/saml-idp/saml_idp',
25
- 'bug_tracker_uri' => 'https://github.com/saml-idp/saml_idp/issues',
24
+ 'homepage_uri' => 'https://github.com/saml-idp/saml_idp',
25
+ 'source_code_uri' => 'https://github.com/saml-idp/saml_idp',
26
+ 'bug_tracker_uri' => 'https://github.com/saml-idp/saml_idp/issues',
26
27
  'documentation_uri' => "http://rdoc.info/gems/saml_idp/#{SamlIdp::VERSION}"
27
28
  }
28
29
 
29
30
  s.post_install_message = <<-INST
30
- If you're just recently updating saml_idp - please be aware we've changed the default
31
- certificate. See the PR and a description of why we've done this here:
32
- https://github.com/saml-idp/saml_idp/pull/29
33
-
34
- If you just need to see the certificate `bundle open saml_idp` and go to
35
- `lib/saml_idp/default.rb`
31
+ If you're just recently updating saml_idp - please be aware we've changed the default
32
+ certificate. See the PR and a description of why we've done this here:
33
+ https://github.com/saml-idp/saml_idp/pull/29
36
34
 
37
- Similarly, please see the README about certificates - you should avoid using the
38
- defaults in a Production environment. Post any issues you to github.
35
+ If you just need to see the certificate `bundle open saml_idp` and go to
36
+ `lib/saml_idp/default.rb`
39
37
 
40
- ** New in Version 0.3.0 **
38
+ Similarly, please see the README about certificates - you should avoid using the
39
+ defaults in a Production environment. Post any issues you to github.
41
40
 
42
- Encrypted Assertions require the xmlenc gem. See the example in the Controller
43
- section of the README.
41
+ ** New in Version 0.3.0 **
42
+ Encrypted Assertions require the xmlenc gem. See the example in the Controller
43
+ section of the README.
44
44
  INST
45
45
 
46
- s.add_dependency('activesupport', '>= 3.2')
46
+ s.add_dependency('activesupport', '>= 5.2')
47
47
  s.add_dependency('builder', '>= 3.0')
48
48
  s.add_dependency('nokogiri', '>= 1.6.2')
49
+ s.add_dependency('rexml')
50
+ s.add_dependency('xmlenc', '>= 0.7.1')
49
51
 
52
+ s.add_development_dependency('activeresource', '>= 5.1')
53
+ s.add_development_dependency('appraisal')
54
+ s.add_development_dependency('byebug')
55
+ s.add_development_dependency('capybara', '>= 2.16')
56
+ s.add_development_dependency('rails', '>= 5.2')
50
57
  s.add_development_dependency('rake')
51
- s.add_development_dependency('simplecov')
52
58
  s.add_development_dependency('rspec', '>= 3.7.0')
53
59
  s.add_development_dependency('ruby-saml', '>= 1.7.2')
54
- s.add_development_dependency('rails', '>= 3.2')
55
- s.add_development_dependency('activeresource', '>= 3.2')
56
- s.add_development_dependency('capybara', '>= 2.16')
60
+ s.add_development_dependency('simplecov')
57
61
  s.add_development_dependency('timecop', '>= 0.8')
58
- s.add_development_dependency('xmlenc', '>= 0.6.4')
59
- s.add_development_dependency('appraisal')
60
- s.add_development_dependency('byebug')
61
62
  end