devise_password_expirable 0.0.1 → 0.0.2
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 +5 -5
- data/.document +5 -0
- data/Gemfile +1 -1
- data/app/controllers/devise/password_expired_controller.rb +6 -8
- data/app/views/devise/password_expired/show.html.erb +1 -0
- data/devise_password_expirable.gemspec +3 -3
- data/lib/devise_password_expirable.rb +4 -2
- data/lib/devise_password_expirable/controllers/helpers.rb +5 -5
- data/lib/devise_password_expirable/hooks/password_expirable.rb +1 -1
- data/lib/devise_password_expirable/models/password_expirable.rb +37 -31
- data/lib/devise_password_expirable/orm/active_record.rb +20 -0
- data/lib/devise_password_expirable/rails.rb +2 -2
- data/lib/devise_password_expirable/routes.rb +2 -2
- data/lib/devise_password_expirable/version.rb +1 -1
- data/lib/generators/devise_password_expirable/install_generator.rb +39 -0
- metadata +8 -6
- data/lib/generators/devise_expire_passwords/install_generator.rb +0 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
SHA1:
|
3
|
-
data.tar.gz: 580d34c38ff0183b3a09f42988a1c77441df2945
|
4
|
-
metadata.gz: 55c8b247f7f7a72167a97d4d5320bbc86d05271d
|
5
2
|
SHA512:
|
6
|
-
|
7
|
-
|
3
|
+
metadata.gz: 1b378548f93783f04fe45db7e8b412e1f7f3f90a55274e90a83e200a74eb4b1a86b3413816f8694a4ca5384d6d93db751d01d403ec28aebda9ad65c54f3918cf
|
4
|
+
data.tar.gz: ba579f4edb72e39cbbba04566202580767517fdba43be23bba69ca43fef50863dcb4e583a5e61d59f5413a75bfeb00477fd170b5cbdfcc072ba562d2a7c7ff34
|
5
|
+
SHA1:
|
6
|
+
metadata.gz: 07c5709271f496dd1c5aa31c7680245be5bd5f59
|
7
|
+
data.tar.gz: 90cdcb77894e11dd20e9e8159f6826cce7502158
|
data/.document
ADDED
data/Gemfile
CHANGED
@@ -1,31 +1,29 @@
|
|
1
|
-
class Devise::PasswordExpiredController <
|
1
|
+
class Devise::PasswordExpiredController < ApplicationController
|
2
2
|
skip_before_filter :handle_password_change
|
3
3
|
prepend_before_filter :authenticate_scope!, :only => [:show, :update]
|
4
|
+
include Devise::Controllers::InternalHelpers
|
4
5
|
|
5
6
|
def show
|
6
7
|
if not resource.nil? and resource.need_change_password?
|
7
|
-
|
8
|
+
render_with_scope :show
|
8
9
|
else
|
9
10
|
redirect_to :root
|
10
11
|
end
|
11
12
|
end
|
12
13
|
|
13
14
|
def update
|
14
|
-
if resource.update_with_password(
|
15
|
+
if resource.update_with_password(params[resource_name])
|
15
16
|
warden.session(scope)[:password_expired] = false
|
16
17
|
set_flash_message :notice, :updated
|
17
|
-
sign_in scope, resource
|
18
|
+
sign_in scope, resource
|
18
19
|
redirect_to stored_location_for(scope) || :root
|
19
20
|
else
|
20
21
|
clean_up_passwords(resource)
|
21
|
-
|
22
|
+
render_with_scope :show
|
22
23
|
end
|
23
24
|
end
|
24
25
|
|
25
26
|
private
|
26
|
-
def resource_params
|
27
|
-
params.require(resource_name).permit!
|
28
|
-
end
|
29
27
|
|
30
28
|
def scope
|
31
29
|
resource_name.to_sym
|
@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
|
|
10
10
|
s.homepage = "https://github.com/jenjaina/devise_password_expirable"
|
11
11
|
s.licenses = ["MIT"]
|
12
12
|
s.summary = %q{Expire passwords plugin for devise}
|
13
|
-
s.description = "
|
13
|
+
s.description = "A plugin to devise that will expire user passwords after a set amount of time and prompt them to update their password."
|
14
14
|
|
15
15
|
# s.rubyforge_project = "devise_password_expirable"
|
16
16
|
|
@@ -19,8 +19,8 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
20
|
s.require_paths = ["lib"]
|
21
21
|
|
22
|
-
s.add_runtime_dependency 'rails', '3.0.20'
|
23
|
-
s.add_runtime_dependency 'devise', '1.1.3'
|
22
|
+
s.add_runtime_dependency 'rails', '>= 3.0.20'
|
23
|
+
s.add_runtime_dependency 'devise', '>= 1.1.3'
|
24
24
|
|
25
25
|
s.add_development_dependency 'bundler'
|
26
26
|
end
|
@@ -1,11 +1,12 @@
|
|
1
1
|
require 'devise_password_expirable/version'
|
2
|
-
require 'active_record'
|
2
|
+
require 'active_record/connection_adapters/abstract/schema_definitions'
|
3
3
|
require 'active_support/core_ext/integer'
|
4
4
|
require 'active_support/ordered_hash'
|
5
5
|
require 'active_support/concern'
|
6
6
|
require 'devise'
|
7
7
|
|
8
|
-
module Devise
|
8
|
+
module Devise # :nodoc:
|
9
|
+
|
9
10
|
# Should the password expire (e.g 3.months)
|
10
11
|
mattr_accessor :expire_password_after
|
11
12
|
@@expire_password_after = 3.months
|
@@ -30,3 +31,4 @@ Devise.add_module :password_expirable, :controller => :password_expirable, :mode
|
|
30
31
|
# requires
|
31
32
|
require 'devise_password_expirable/routes'
|
32
33
|
require 'devise_password_expirable/rails'
|
34
|
+
require 'devise_password_expirable/orm/active_record'
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module DevisePasswordExpirable
|
2
|
-
module Controllers
|
3
|
-
module Helpers
|
2
|
+
module Controllers # :nodoc:
|
3
|
+
module Helpers # :nodoc:
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
6
|
included do
|
@@ -8,14 +8,14 @@ module DevisePasswordExpirable
|
|
8
8
|
end
|
9
9
|
|
10
10
|
# controller instance methods
|
11
|
-
|
11
|
+
module InstanceMethods
|
12
12
|
private
|
13
13
|
|
14
14
|
# lookup if an password change needed
|
15
15
|
def handle_password_change
|
16
16
|
if not devise_controller? and not ignore_password_expire? and not request.format.nil? and request.format.html?
|
17
17
|
Devise.mappings.keys.flatten.any? do |scope|
|
18
|
-
if signed_in?(scope) and warden.session(scope)[
|
18
|
+
if signed_in?(scope) and warden.session(scope)[:password_expired]
|
19
19
|
session["#{scope}_return_to"] = request.path if request.get?
|
20
20
|
redirect_for_password_change scope
|
21
21
|
return
|
@@ -43,7 +43,7 @@ module DevisePasswordExpirable
|
|
43
43
|
false
|
44
44
|
end
|
45
45
|
|
46
|
-
|
46
|
+
end
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
Warden::Manager.after_authentication do |record, warden, options|
|
2
2
|
if record.respond_to?(:need_change_password?)
|
3
|
-
warden.session(options[:scope])[
|
3
|
+
warden.session(options[:scope])[:password_expired] = record.need_change_password?
|
4
4
|
end
|
5
5
|
end
|
@@ -1,57 +1,63 @@
|
|
1
|
-
require '
|
1
|
+
require 'devise_security_extension/hooks/password_expirable'
|
2
2
|
|
3
|
-
module Devise
|
4
|
-
module Models
|
3
|
+
module Devise # :nodoc:
|
4
|
+
module Models # :nodoc:
|
5
5
|
|
6
6
|
# PasswordExpirable takes care of change password after
|
7
7
|
module PasswordExpirable
|
8
|
-
extend ActiveSupport::Concern
|
9
8
|
|
10
|
-
included
|
11
|
-
|
12
|
-
end
|
9
|
+
def self.included(base) # :nodoc:
|
10
|
+
base.extend ClassMethods
|
13
11
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
self.last_password_reset.nil? or self.last_password_reset < self.class.expire_password_after.ago
|
18
|
-
else
|
19
|
-
false
|
12
|
+
base.class_eval do
|
13
|
+
before_save :update_password_changed
|
14
|
+
include InstanceMethods
|
20
15
|
end
|
21
16
|
end
|
22
17
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
self.
|
18
|
+
module InstanceMethods # :nodoc:
|
19
|
+
|
20
|
+
# is an password change required?
|
21
|
+
def need_change_password?
|
22
|
+
if self.class.expire_password_after.is_a? Fixnum
|
23
|
+
self.last_password_reset.nil? or self.last_password_reset < self.class.expire_password_after.ago
|
24
|
+
else
|
25
|
+
false
|
26
|
+
end
|
28
27
|
end
|
29
|
-
end
|
30
28
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
29
|
+
# set a fake datetime so a password change is needed and save the record
|
30
|
+
def need_change_password!
|
31
|
+
if self.class.expire_password_after.is_a? Fixnum
|
32
|
+
need_change_password
|
33
|
+
self.save(:validate => false)
|
34
|
+
end
|
35
35
|
end
|
36
36
|
|
37
|
-
#
|
38
|
-
need_change_password
|
37
|
+
# set a fake datetime so a password change is needed
|
38
|
+
def need_change_password
|
39
|
+
if self.class.expire_password_after.is_a? Fixnum
|
40
|
+
self.last_password_reset = self.class.expire_password_after.ago
|
41
|
+
end
|
39
42
|
|
40
|
-
|
41
|
-
|
43
|
+
# is date not set it will set default to need set new password next login
|
44
|
+
need_change_password if self.last_password_reset.nil?
|
42
45
|
|
43
|
-
|
46
|
+
self.last_password_reset
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
44
50
|
|
45
51
|
# is password changed then update password_cahanged_at
|
46
52
|
def update_password_changed
|
47
53
|
self.last_password_reset = Time.now if (self.new_record? or self.encrypted_password_changed?) and not self.last_password_reset_changed?
|
48
54
|
end
|
55
|
+
end
|
49
56
|
|
50
|
-
module ClassMethods
|
57
|
+
module ClassMethods #:nodoc:
|
51
58
|
::Devise::Models.config(self, :expire_password_after)
|
52
59
|
end
|
53
60
|
end
|
54
|
-
|
55
61
|
end
|
56
62
|
|
57
|
-
end
|
63
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module DevisePasswordExpirable
|
2
|
+
module Orm
|
3
|
+
# This module contains some helpers and handle schema (migrations):
|
4
|
+
#
|
5
|
+
# create_table :accounts do |t|
|
6
|
+
# t.password_expirable
|
7
|
+
# end
|
8
|
+
#
|
9
|
+
module ActiveRecord
|
10
|
+
module Schema
|
11
|
+
include DevisePasswordExpirable::Schema
|
12
|
+
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
ActiveRecord::ConnectionAdapters::Table.send :include, DevisePasswordExpirable::Orm::ActiveRecord::Schema
|
20
|
+
ActiveRecord::ConnectionAdapters::TableDefinition.send :include, DevisePasswordExpirable::Orm::ActiveRecord::Schema
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module DevisePasswordExpirable
|
2
|
+
module Generators # :nodoc:
|
3
|
+
# Install Generator
|
4
|
+
class InstallGenerator < Rails::Generators::Base
|
5
|
+
source_root File.expand_path("../../templates", __FILE__)
|
6
|
+
|
7
|
+
desc "Install the devise password expirable extension"
|
8
|
+
|
9
|
+
def add_configs
|
10
|
+
devise_initializer_path = "config/initializers/devise.rb"
|
11
|
+
if File.exist?(devise_initializer_path)
|
12
|
+
old_content = File.read(devise_initializer_path)
|
13
|
+
|
14
|
+
if old_content.match(Regexp.new(/^\s# ==> Password Expirable Extension\n/))
|
15
|
+
false
|
16
|
+
else
|
17
|
+
inject_into_file(devise_initializer_path, :before => " # ==> Configuration for :confirmable\n") do
|
18
|
+
<<-CONTENT
|
19
|
+
# ==> Password Expirable Extension
|
20
|
+
# Configure expire passwords extension for devise
|
21
|
+
|
22
|
+
# Should the password expire (e.g 3.months)
|
23
|
+
# config.expire_password_after = false
|
24
|
+
|
25
|
+
# Need 1 char of A-Z, a-z and 0-9
|
26
|
+
# config.password_regex = /(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])/
|
27
|
+
|
28
|
+
CONTENT
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def copy_locale
|
35
|
+
copy_file "../../../config/locales/en.yml", "config/locales/devise.password_expirable.en.yml"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: devise_password_expirable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jenni Kissinger
|
@@ -9,14 +9,14 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2014-10-
|
12
|
+
date: 2014-10-22 00:00:00 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
16
16
|
prerelease: false
|
17
17
|
requirement: &id001 !ruby/object:Gem::Requirement
|
18
18
|
requirements:
|
19
|
-
- - "
|
19
|
+
- - ">="
|
20
20
|
- !ruby/object:Gem::Version
|
21
21
|
version: 3.0.20
|
22
22
|
type: :runtime
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
prerelease: false
|
27
27
|
requirement: &id002 !ruby/object:Gem::Requirement
|
28
28
|
requirements:
|
29
|
-
- - "
|
29
|
+
- - ">="
|
30
30
|
- !ruby/object:Gem::Version
|
31
31
|
version: 1.1.3
|
32
32
|
type: :runtime
|
@@ -42,7 +42,7 @@ dependencies:
|
|
42
42
|
version: "0"
|
43
43
|
type: :development
|
44
44
|
version_requirements: *id003
|
45
|
-
description:
|
45
|
+
description: A plugin to devise that will expire user passwords after a set amount of time and prompt them to update their password.
|
46
46
|
email:
|
47
47
|
- jkissinger@carekinesis.com
|
48
48
|
executables: []
|
@@ -52,6 +52,7 @@ extensions: []
|
|
52
52
|
extra_rdoc_files: []
|
53
53
|
|
54
54
|
files:
|
55
|
+
- .document
|
55
56
|
- .gitignore
|
56
57
|
- Gemfile
|
57
58
|
- README.md
|
@@ -64,11 +65,12 @@ files:
|
|
64
65
|
- lib/devise_password_expirable/controllers/helpers.rb
|
65
66
|
- lib/devise_password_expirable/hooks/password_expirable.rb
|
66
67
|
- lib/devise_password_expirable/models/password_expirable.rb
|
68
|
+
- lib/devise_password_expirable/orm/active_record.rb
|
67
69
|
- lib/devise_password_expirable/rails.rb
|
68
70
|
- lib/devise_password_expirable/routes.rb
|
69
71
|
- lib/devise_password_expirable/schema.rb
|
70
72
|
- lib/devise_password_expirable/version.rb
|
71
|
-
- lib/generators/
|
73
|
+
- lib/generators/devise_password_expirable/install_generator.rb
|
72
74
|
homepage: https://github.com/jenjaina/devise_password_expirable
|
73
75
|
licenses:
|
74
76
|
- MIT
|
@@ -1,23 +0,0 @@
|
|
1
|
-
module DevisePasswordExpirable
|
2
|
-
module Generators
|
3
|
-
# Install Generator
|
4
|
-
class InstallGenerator < Rails::Generators::Base
|
5
|
-
source_root File.expand_path("../../templates", __FILE__)
|
6
|
-
|
7
|
-
desc "Install the devise password expirable extension"
|
8
|
-
|
9
|
-
def add_configs
|
10
|
-
inject_into_file "config/initializers/devise.rb", "\n # ==> Password Expirable Extension\n # Configure expire passwords extension for devise\n\n" +
|
11
|
-
" # Should the password expire (e.g 3.months)\n" +
|
12
|
-
" # config.expire_password_after = false\n\n" +
|
13
|
-
" # Need 1 char of A-Z, a-z and 0-9\n" +
|
14
|
-
" # config.password_regex = /(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])/\n\n" +
|
15
|
-
"", :before => /end[ |\n|]+\Z/
|
16
|
-
end
|
17
|
-
|
18
|
-
def copy_locale
|
19
|
-
copy_file "../../../config/locales/en.yml", "config/locales/devise.password_expirable.en.yml"
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|