challah 1.5.0 → 2.0.0.beta2

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.
Files changed (47) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +32 -0
  3. data/README.md +6 -39
  4. data/VERSION +1 -1
  5. data/app/controllers/sessions_controller.rb +11 -10
  6. data/app/models/authorization.rb +2 -0
  7. data/lib/challah/audit.rb +38 -36
  8. data/lib/challah/authenticators/api_key.rb +4 -2
  9. data/lib/challah/authenticators/password.rb +3 -1
  10. data/lib/challah/authenticators.rb +5 -3
  11. data/lib/challah/concerns/authorizeable.rb +4 -0
  12. data/lib/challah/concerns/user/attributeable.rb +37 -29
  13. data/lib/challah/concerns/user/authenticateable.rb +4 -2
  14. data/lib/challah/concerns/user/authorizable.rb +16 -12
  15. data/lib/challah/concerns/user/findable.rb +13 -10
  16. data/lib/challah/concerns/user/passwordable.rb +5 -3
  17. data/lib/challah/concerns/user/provideable.rb +22 -20
  18. data/lib/challah/concerns/user/statusable.rb +3 -21
  19. data/lib/challah/concerns/user/validateable.rb +3 -1
  20. data/lib/challah/concerns/userable.rb +1 -3
  21. data/lib/challah/controller.rb +69 -65
  22. data/lib/challah/cookie_store.rb +7 -5
  23. data/lib/challah/encrypter.rb +4 -2
  24. data/lib/challah/engine.rb +5 -18
  25. data/lib/challah/providers/password_provider.rb +9 -7
  26. data/lib/challah/providers.rb +3 -1
  27. data/lib/challah/random.rb +6 -4
  28. data/lib/challah/routes.rb +6 -6
  29. data/lib/challah/session.rb +27 -25
  30. data/lib/challah/signup.rb +5 -3
  31. data/lib/challah/simple_cookie_store.rb +82 -80
  32. data/lib/challah/techniques/api_key_technique.rb +2 -2
  33. data/lib/challah/techniques/password_technique.rb +2 -1
  34. data/lib/challah/techniques/token_technique.rb +3 -1
  35. data/lib/challah/techniques.rb +2 -0
  36. data/lib/challah/test.rb +6 -0
  37. data/lib/challah/validators/email_validator.rb +2 -0
  38. data/lib/challah/validators/password_validator.rb +5 -3
  39. data/lib/challah/version.rb +3 -1
  40. data/lib/challah.rb +2 -5
  41. data/lib/generators/challah_generator.rb +17 -0
  42. data/lib/generators/templates/migration.erb +39 -0
  43. data/lib/tasks/setup.rake +7 -3
  44. metadata +63 -26
  45. data/db/migrate/20120127150433_create_users.rb +0 -29
  46. data/db/migrate/20121116210759_create_authorizations.rb +0 -22
  47. data/lib/challah/plugins.rb +0 -54
@@ -4,6 +4,7 @@ module Challah
4
4
  # To use a different storage method for persisting a session, just create
5
5
  # a new class that responds to +read+, +save+ and +destroy+
6
6
  class SimpleCookieStore
7
+
7
8
  def initialize(session)
8
9
  @session = session
9
10
  end
@@ -13,7 +14,7 @@ module Challah
13
14
  end
14
15
 
15
16
  def inspect
16
- "#<SimpleCookieStore:0x#{object_id.to_s(16)} valid=#{existing?}>"
17
+ "#<SimpleCookieStore:0x#{ object_id.to_s(16) } valid=#{ existing? }>"
17
18
  end
18
19
 
19
20
  def read
@@ -29,107 +30,108 @@ module Challah
29
30
 
30
31
  private
31
32
 
32
- def clear
33
- cookies.delete(session_cookie_name, domain: domain)
34
- cookies.delete(validation_cookie_name, domain: domain)
35
- end
33
+ def clear
34
+ cookies.delete(session_cookie_name, domain: domain)
35
+ cookies.delete(validation_cookie_name, domain: domain)
36
+ end
36
37
 
37
- def cookie_values
38
- session_cookie && session_cookie.to_s.split(joiner)
39
- end
38
+ def cookie_values
39
+ session_cookie && session_cookie.to_s.split(joiner)
40
+ end
40
41
 
41
- def cookies
42
- request.cookie_jar
43
- end
42
+ def cookies
43
+ request.cookie_jar
44
+ end
44
45
 
45
- def default_cookie_prefix
46
- Challah.options[:cookie_prefix]
47
- end
46
+ def default_cookie_prefix
47
+ Challah.options[:cookie_prefix]
48
+ end
48
49
 
49
- def domain
50
- request.session_options[:domain]
51
- end
50
+ def domain
51
+ request.session_options[:domain]
52
+ end
52
53
 
53
- # Do the cookies exist, and are they valid?
54
- def existing?
55
- exists = false
54
+ # Do the cookies exist, and are they valid?
55
+ def existing?
56
+ exists = false
56
57
 
57
- if session_cookie and validation_cookie
58
- session_tmp = session_cookie.to_s
59
- validation_tmp = validation_cookie.to_s
58
+ if session_cookie && validation_cookie
59
+ session_tmp = session_cookie.to_s
60
+ validation_tmp = validation_cookie.to_s
60
61
 
61
- if validation_tmp == validation_cookie_value(session_tmp)
62
- exists = true
62
+ if validation_tmp == validation_cookie_value(session_tmp)
63
+ exists = true
64
+ end
63
65
  end
66
+
67
+ exists
64
68
  end
65
69
 
66
- exists
67
- end
70
+ def expiration
71
+ @expiration ||= 1.month.from_now
72
+ end
68
73
 
69
- def expiration
70
- @expiration ||= 1.month.from_now
71
- end
74
+ def joiner
75
+ "@"
76
+ end
72
77
 
73
- def joiner
74
- '@'
75
- end
78
+ def prefix
79
+ @prefix ||= [ default_cookie_prefix, user_model_id ].compact.join("-")
80
+ end
76
81
 
77
- def prefix
78
- @prefix ||= [ default_cookie_prefix, user_model_id ].compact.join('-')
79
- end
82
+ def request
83
+ raise "No Request Provided" unless @session && @session.request
84
+ @session.request
85
+ end
80
86
 
81
- def request
82
- raise "No Request Provided" unless @session and @session.request
83
- @session.request
84
- end
87
+ def session_cookie
88
+ cookies[session_cookie_name]
89
+ end
85
90
 
86
- def session_cookie
87
- cookies[session_cookie_name]
88
- end
91
+ def session_cookie_name
92
+ "#{ prefix }-s"
93
+ end
89
94
 
90
- def session_cookie_name
91
- "#{prefix}-s"
92
- end
95
+ def session_cookie_value
96
+ "#@token#{ joiner }#@user_id"
97
+ end
93
98
 
94
- def session_cookie_value
95
- "#@token#{joiner}#@user_id"
96
- end
99
+ def user_model_id
100
+ if @session && @session.user_model && @session.user_model.table_name != "users"
101
+ Encrypter.md5(@session.user_model.table_name).slice(0..5)
102
+ end
103
+ end
97
104
 
98
- def user_model_id
99
- if @session && @session.user_model && @session.user_model.table_name != 'users'
100
- Encrypter.md5(@session.user_model.table_name).slice(0..5)
105
+ def validation_cookie
106
+ cookies[validation_cookie_name]
101
107
  end
102
- end
103
108
 
104
- def validation_cookie
105
- cookies[validation_cookie_name]
106
- end
109
+ def validation_cookie_name
110
+ "#{ prefix }-v"
111
+ end
107
112
 
108
- def validation_cookie_name
109
- "#{prefix}-v"
110
- end
113
+ def validation_cookie_value(value = nil)
114
+ value = session_cookie_value unless value
115
+ Encrypter.md5(value)
116
+ end
111
117
 
112
- def validation_cookie_value(value = nil)
113
- value = session_cookie_value unless value
114
- Encrypter.md5(value)
115
- end
118
+ def write_cookies!
119
+ cookies[session_cookie_name] = {
120
+ value: session_cookie_value,
121
+ expires: expiration,
122
+ secure: false,
123
+ httponly: true,
124
+ domain: domain
125
+ }
126
+
127
+ cookies[validation_cookie_name] = {
128
+ value: validation_cookie_value,
129
+ expires: expiration,
130
+ secure: false,
131
+ httponly: true,
132
+ domain: domain
133
+ }
134
+ end
116
135
 
117
- def write_cookies!
118
- cookies[session_cookie_name] = {
119
- value: session_cookie_value,
120
- expires: expiration,
121
- secure: false,
122
- httponly: true,
123
- domain: domain
124
- }
125
-
126
- cookies[validation_cookie_name] = {
127
- value: validation_cookie_value,
128
- expires: expiration,
129
- secure: false,
130
- httponly: true,
131
- domain: domain
132
- }
133
- end
134
136
  end
135
137
  end
@@ -5,7 +5,7 @@ module Challah
5
5
  attr_accessor :user_model
6
6
 
7
7
  def initialize(session)
8
- @key = session.key? ? session.key : nil
8
+ @key = session.key? ? session.key : nil
9
9
  end
10
10
 
11
11
  def authenticate
@@ -16,7 +16,7 @@ module Challah
16
16
  unless @key.to_s.blank?
17
17
  user = user_model.find_by_api_key(@key)
18
18
 
19
- if user and user.valid_session?
19
+ if user && user.valid_session?
20
20
  return user
21
21
  end
22
22
  end
@@ -12,7 +12,7 @@ module Challah
12
12
 
13
13
  # if we can successfully authenticate, return a User instance, otherwise nil
14
14
  def authenticate
15
- if username? and password?
15
+ if username? && password?
16
16
  user = user_model.find_for_session(username)
17
17
 
18
18
  if user
@@ -49,5 +49,6 @@ module Challah
49
49
  def username
50
50
  @username
51
51
  end
52
+
52
53
  end
53
54
  end
@@ -18,6 +18,8 @@ module Challah
18
18
  # This is turned off by default and must be manually enabled for security reasons.
19
19
  return nil unless Challah.options[:token_enabled]
20
20
 
21
+ return nil unless token.present?
22
+
21
23
  if user = user_model.where(api_key: token).first
22
24
  if user.valid_session?
23
25
  return user
@@ -41,7 +43,7 @@ module Challah
41
43
 
42
44
  private
43
45
 
44
- attr_reader :token
46
+ attr_reader :token
45
47
 
46
48
  end
47
49
  end
@@ -54,6 +54,7 @@ module Challah
54
54
  # +ApiKeyTechnique+.
55
55
  #
56
56
  module Techniques
57
+
57
58
  # Register a new technique class. Pass in a name as an identifier, and the class to use
58
59
  # when attempting to authenticate.
59
60
  def register_technique(name, klass)
@@ -69,5 +70,6 @@ module Challah
69
70
  def techniques
70
71
  @techniques.dup
71
72
  end
73
+
72
74
  end
73
75
  end
data/lib/challah/test.rb CHANGED
@@ -1,7 +1,9 @@
1
1
  module Challah
2
+
2
3
  # Used to persist session data in test mode instead of using cookies. Stores the session
3
4
  # data lazily in a global var, accessible across the testing environment.
4
5
  class TestSessionStore
6
+
5
7
  def initialize(session = nil)
6
8
  @session = session
7
9
  end
@@ -22,6 +24,7 @@ module Challah
22
24
  $challah_test_session = "#{ token }@#{ user_id }"
23
25
  true
24
26
  end
27
+
25
28
  end
26
29
 
27
30
  module Testing
@@ -39,17 +42,20 @@ module Challah
39
42
  alias_method :logout, :signout
40
43
 
41
44
  end
45
+
42
46
  end
43
47
 
44
48
  if defined?(ActionController::TestCase)
45
49
  Challah.options[:storage_class] = Challah::TestSessionStore
46
50
 
47
51
  class ActionController::TestCase
52
+
48
53
  include Challah::Testing
49
54
 
50
55
  setup do
51
56
  $challah_test_session = nil
52
57
  end
58
+
53
59
  end
54
60
  end
55
61
 
@@ -6,6 +6,7 @@ module Challah
6
6
  # validates :email, :presence => true, :email => true
7
7
  # end
8
8
  class EmailValidator < ActiveModel::EachValidator
9
+
9
10
  # Called automatically by ActiveModel validation..
10
11
  def validate_each(record, attribute, value)
11
12
  unless value =~ EmailValidator.pattern
@@ -17,5 +18,6 @@ module Challah
17
18
  def self.pattern
18
19
  /\b[A-Z0-9._%a-z\-]+@(?:[A-Z0-9a-z\-]+\.)+[A-Za-z]{2,}\z/
19
20
  end
21
+
20
22
  end
21
23
  end
@@ -1,9 +1,10 @@
1
1
  module Challah
2
2
  class PasswordValidator < ActiveModel::Validator
3
+
3
4
  # Check to make sure a valid password and confirmation were set
4
5
  def validate(record)
5
- if record.password_provider? or options[:force]
6
- if record.new_record? and record.password.to_s.blank? and !record.password_changed?
6
+ if record.password_provider? || options[:force]
7
+ if record.new_record? && record.password.to_s.blank? && !record.password_changed?
7
8
  record.errors.add :password, :blank
8
9
  elsif record.password_changed?
9
10
  if record.password.to_s.size < 4
@@ -14,5 +15,6 @@ module Challah
14
15
  end
15
16
  end
16
17
  end
18
+
17
19
  end
18
- end
20
+ end
@@ -1,5 +1,7 @@
1
1
  module Challah
2
+
2
3
  unless defined?(Challah::VERSION)
3
- VERSION = File.read(File.expand_path('../../../VERSION', __FILE__)).strip.freeze
4
+ VERSION = File.read(File.expand_path("../../../VERSION", __FILE__)).strip.freeze
4
5
  end
6
+
5
7
  end
data/lib/challah.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require "challah/version"
2
2
 
3
3
  module Challah
4
+
4
5
  autoload :Audit, "challah/audit"
5
6
 
6
7
  autoload :CookieStore, "challah/cookie_store"
@@ -9,7 +10,6 @@ module Challah
9
10
  autoload :Authenticators, "challah/authenticators"
10
11
  autoload :Controller, "challah/controller"
11
12
  autoload :Encrypter, "challah/encrypter"
12
- autoload :Plugins, "challah/plugins"
13
13
  autoload :Providers, "challah/providers"
14
14
  autoload :Random, "challah/random"
15
15
  autoload :Session, "challah/session"
@@ -74,10 +74,6 @@ module Challah
74
74
  register_technique :password, PasswordTechnique
75
75
  register_technique :token, TokenTechnique
76
76
 
77
- # Set up plugin registering capability
78
- extend Plugins
79
- @plugins ||= {}
80
-
81
77
  # Set up authenticators
82
78
  extend Authenticators
83
79
  @authenticators ||= {}
@@ -91,6 +87,7 @@ module Challah
91
87
  @providers ||= {}
92
88
 
93
89
  register_provider :password, PasswordProvider
90
+
94
91
  end
95
92
 
96
93
  require "challah/engine" if defined?(Rails)
@@ -0,0 +1,17 @@
1
+ require "rails/generators/active_record"
2
+
3
+ class ChallahGenerator < Rails::Generators::Base
4
+
5
+ include ActiveRecord::Generators::Migration
6
+
7
+ source_root File.expand_path("../templates", __FILE__)
8
+
9
+ def copy_migration
10
+ migration_template "migration.erb", "db/migrate/challah_create_users.rb", migration_version: migration_version
11
+ end
12
+
13
+ def migration_version
14
+ "[#{ Rails::VERSION::MAJOR }.#{ Rails::VERSION::MINOR }]"
15
+ end
16
+
17
+ end
@@ -0,0 +1,39 @@
1
+ class ChallahCreateUsers < ActiveRecord::Migration<%= migration_version %>
2
+ def change
3
+ create_table :users do |t|
4
+ t.string :first_name
5
+ t.string :last_name
6
+ t.string :email
7
+ t.string :email_hash
8
+ t.string :persistence_token
9
+ t.string :api_key
10
+ t.datetime :last_session_at
11
+ t.integer :session_count, default: 0
12
+ t.integer :failed_auth_count, default: 0
13
+ t.bigint :created_by, default: 0
14
+ t.bigint :updated_by, default: 0
15
+ t.integer :status, default: 0 # defaults to :active
16
+ t.timestamps null: true
17
+ end
18
+
19
+ add_index :users, :first_name
20
+ add_index :users, :last_name
21
+ add_index :users, :email
22
+ add_index :users, :api_key
23
+
24
+ create_table :authorizations do |t|
25
+ t.references :user
26
+ t.string :provider, limit: 50
27
+ t.string :uid
28
+ t.string :token, limit: 500
29
+ t.datetime :expires_at
30
+ t.datetime :last_session_at
31
+ t.integer :session_count, default: 0
32
+ t.timestamps null: true
33
+ end
34
+
35
+ add_index :authorizations, [ :user_id, :provider ]
36
+ add_index :authorizations, :uid
37
+ add_index :authorizations, :token
38
+ end
39
+ end
data/lib/tasks/setup.rake CHANGED
@@ -3,6 +3,10 @@ namespace :challah do
3
3
  task :setup => [ "challah:setup:migrations", "challah:unpack:user", "db:migrate", "challah:banner" ]
4
4
 
5
5
  task :banner do
6
+ is_rails5 = Rails.version.start_with? "5"
7
+
8
+ cmd = is_rails5 ? "rails" : "rake"
9
+
6
10
  banner = <<-str
7
11
 
8
12
  ==========================================================================
@@ -15,7 +19,7 @@ namespace :challah do
15
19
 
16
20
  If you want to create a new user now, just run:
17
21
 
18
- rails challah:users:create
22
+ #{ cmd } challah:users:create
19
23
 
20
24
  ==========================================================================
21
25
 
@@ -26,8 +30,8 @@ namespace :challah do
26
30
 
27
31
  namespace :setup do
28
32
  task :migrations do
29
- puts "Copying migrations..."
30
- Rake::Task["challah_engine:install:migrations"].invoke
33
+ puts "Setting up migrations..."
34
+ sh "rails generate challah"
31
35
  end
32
36
  end
33
37
  end
metadata CHANGED
@@ -1,51 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: challah
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 2.0.0.beta2
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Tornow
8
8
  - Phillip Ridlen
9
9
  - Nathaniel Watts
10
- autorequire:
10
+ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2017-01-04 00:00:00.000000000 Z
13
+ date: 2022-01-07 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: highline
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
- - - "~>"
20
- - !ruby/object:Gem::Version
21
- version: '1.7'
22
19
  - - ">="
23
20
  - !ruby/object:Gem::Version
24
21
  version: 1.7.1
22
+ - - "<"
23
+ - !ruby/object:Gem::Version
24
+ version: '3'
25
25
  type: :runtime
26
26
  prerelease: false
27
27
  version_requirements: !ruby/object:Gem::Requirement
28
28
  requirements:
29
- - - "~>"
30
- - !ruby/object:Gem::Version
31
- version: '1.7'
32
29
  - - ">="
33
30
  - !ruby/object:Gem::Version
34
31
  version: 1.7.1
32
+ - - "<"
33
+ - !ruby/object:Gem::Version
34
+ version: '3'
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: rails
37
37
  requirement: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - ">="
40
40
  - !ruby/object:Gem::Version
41
- version: 4.2.0
41
+ version: 5.2.0
42
+ - - "<"
43
+ - !ruby/object:Gem::Version
44
+ version: '8'
42
45
  type: :runtime
43
46
  prerelease: false
44
47
  version_requirements: !ruby/object:Gem::Requirement
45
48
  requirements:
46
49
  - - ">="
47
50
  - !ruby/object:Gem::Version
48
- version: 4.2.0
51
+ version: 5.2.0
52
+ - - "<"
53
+ - !ruby/object:Gem::Version
54
+ version: '8'
49
55
  - !ruby/object:Gem::Dependency
50
56
  name: rake
51
57
  requirement: !ruby/object:Gem::Requirement
@@ -80,28 +86,28 @@ dependencies:
80
86
  requirements:
81
87
  - - "~>"
82
88
  - !ruby/object:Gem::Version
83
- version: '3.4'
89
+ version: '4.0'
84
90
  type: :development
85
91
  prerelease: false
86
92
  version_requirements: !ruby/object:Gem::Requirement
87
93
  requirements:
88
94
  - - "~>"
89
95
  - !ruby/object:Gem::Version
90
- version: '3.4'
96
+ version: '4.0'
91
97
  - !ruby/object:Gem::Dependency
92
- name: factory_girl_rails
98
+ name: factory_bot_rails
93
99
  requirement: !ruby/object:Gem::Requirement
94
100
  requirements:
95
101
  - - "~>"
96
102
  - !ruby/object:Gem::Version
97
- version: '4.6'
103
+ version: '6.1'
98
104
  type: :development
99
105
  prerelease: false
100
106
  version_requirements: !ruby/object:Gem::Requirement
101
107
  requirements:
102
108
  - - "~>"
103
109
  - !ruby/object:Gem::Version
104
- version: '4.6'
110
+ version: '6.1'
105
111
  - !ruby/object:Gem::Dependency
106
112
  name: sqlite3
107
113
  requirement: !ruby/object:Gem::Requirement
@@ -116,7 +122,35 @@ dependencies:
116
122
  - - "~>"
117
123
  - !ruby/object:Gem::Version
118
124
  version: '1.3'
119
- description: A simple gem for authorization and session management in Rails.
125
+ - !ruby/object:Gem::Dependency
126
+ name: rspec_junit_formatter
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '0.2'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '0.2'
139
+ - !ruby/object:Gem::Dependency
140
+ name: appraisal
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description: Authorization and session management for Rails apps
120
154
  email:
121
155
  - john@johntornow.com
122
156
  - p@rdln.net
@@ -134,8 +168,6 @@ files:
134
168
  - app/views/sessions/access_denied.html.erb
135
169
  - app/views/sessions/new.html.erb
136
170
  - config/locales/en.yml
137
- - db/migrate/20120127150433_create_users.rb
138
- - db/migrate/20121116210759_create_authorizations.rb
139
171
  - lib/challah.rb
140
172
  - lib/challah/audit.rb
141
173
  - lib/challah/authenticators.rb
@@ -155,7 +187,6 @@ files:
155
187
  - lib/challah/cookie_store.rb
156
188
  - lib/challah/encrypter.rb
157
189
  - lib/challah/engine.rb
158
- - lib/challah/plugins.rb
159
190
  - lib/challah/providers.rb
160
191
  - lib/challah/providers/password_provider.rb
161
192
  - lib/challah/random.rb
@@ -171,14 +202,21 @@ files:
171
202
  - lib/challah/validators/email_validator.rb
172
203
  - lib/challah/validators/password_validator.rb
173
204
  - lib/challah/version.rb
205
+ - lib/generators/challah_generator.rb
206
+ - lib/generators/templates/migration.erb
174
207
  - lib/tasks/crud.rake
175
208
  - lib/tasks/setup.rake
176
209
  - lib/tasks/unpack.rake
177
210
  homepage: https://github.com/jdtornow/challah
178
211
  licenses:
179
212
  - MIT
180
- metadata: {}
181
- post_install_message:
213
+ metadata:
214
+ bug_tracker_uri: https://github.com/jdtornow/challah/issues
215
+ changelog_uri: https://github.com/jdtornow/challah/releases
216
+ homepage_uri: https://github.com/jdtornow/challah
217
+ source_code_uri: https://github.com/jdtornow/challah
218
+ wiki_uri: https://github.com/jdtornow/challah/wiki
219
+ post_install_message:
182
220
  rdoc_options: []
183
221
  require_paths:
184
222
  - lib
@@ -186,16 +224,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
186
224
  requirements:
187
225
  - - ">="
188
226
  - !ruby/object:Gem::Version
189
- version: 2.2.2
227
+ version: 2.5.0
190
228
  required_rubygems_version: !ruby/object:Gem::Requirement
191
229
  requirements:
192
230
  - - ">="
193
231
  - !ruby/object:Gem::Version
194
232
  version: 1.8.11
195
233
  requirements: []
196
- rubyforge_project:
197
- rubygems_version: 2.5.2
198
- signing_key:
234
+ rubygems_version: 3.2.32
235
+ signing_key:
199
236
  specification_version: 4
200
237
  summary: Rails authentication and sessions
201
238
  test_files: []