challah 1.5.0 → 2.0.0.beta2

Sign up to get free protection for your applications and to get access to all the features.
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: []