authentasaurus 0.7.3 → 0.8.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. data/TODO +3 -0
  2. data/app/controllers/areas_controller.rb +1 -1
  3. data/app/controllers/groups_controller.rb +1 -1
  4. data/app/controllers/permissions_controller.rb +1 -1
  5. data/app/controllers/recoveries_controller.rb +1 -1
  6. data/app/controllers/registrations_controller.rb +1 -1
  7. data/app/controllers/sessions_controller.rb +1 -1
  8. data/app/controllers/user_invitations_controller.rb +1 -1
  9. data/app/controllers/users_controller.rb +1 -1
  10. data/app/controllers/validations_controller.rb +1 -1
  11. data/app/models/area.rb +1 -1
  12. data/app/models/group.rb +1 -1
  13. data/app/models/permission.rb +1 -1
  14. data/app/models/recovery.rb +1 -1
  15. data/app/models/session.rb +1 -1
  16. data/app/models/user_invitation.rb +1 -1
  17. data/app/models/validation.rb +1 -1
  18. data/lib/authentasaurus.rb +22 -36
  19. data/lib/authentasaurus/ac/acts_as_overrider.rb +47 -0
  20. data/lib/authentasaurus/ac/controllers/areas_controller.rb +80 -0
  21. data/lib/authentasaurus/ac/controllers/groups_controller.rb +81 -0
  22. data/lib/authentasaurus/ac/controllers/permissions_controller.rb +81 -0
  23. data/lib/authentasaurus/ac/controllers/recoveries_controller.rb +72 -0
  24. data/lib/authentasaurus/ac/controllers/registrations_controller.rb +45 -0
  25. data/lib/authentasaurus/ac/controllers/sessions_controller.rb +58 -0
  26. data/lib/authentasaurus/ac/controllers/user_invitations_controller.rb +50 -0
  27. data/lib/authentasaurus/ac/controllers/users_controller.rb +80 -0
  28. data/lib/authentasaurus/ac/controllers/validations_controller.rb +53 -0
  29. data/lib/authentasaurus/ac/routing.rb +90 -0
  30. data/lib/authentasaurus/ar/acts_as_authenticatable.rb +113 -0
  31. data/lib/authentasaurus/ar/acts_as_authenticatable_validatable.rb +38 -0
  32. data/lib/authentasaurus/ar/acts_as_overrider.rb +51 -0
  33. data/lib/authentasaurus/ar/authenticatable.rb +66 -0
  34. data/lib/authentasaurus/ar/migrations.rb +173 -0
  35. data/lib/authentasaurus/{models → ar/models}/recovery.rb +3 -3
  36. data/lib/authentasaurus/{models → ar/models}/session.rb +1 -1
  37. data/lib/authentasaurus/{models → ar/models}/user_invitation.rb +1 -1
  38. data/lib/authentasaurus/{models → ar/models}/validation.rb +1 -1
  39. data/lib/authentasaurus/arel/acts_as_authenticatable.rb +72 -0
  40. data/lib/authentasaurus/arel/authenticatable.rb +25 -0
  41. data/lib/authentasaurus/authorization.rb +341 -0
  42. data/lib/authentasaurus/railtie.rb +4 -4
  43. data/lib/generators/authentasaurus/install/templates/initializer.rb +1 -1
  44. data/rdoc/apple-touch-icon.png +0 -0
  45. data/rdoc/classes/Authentasaurus.html +65 -0
  46. data/rdoc/classes/Authentasaurus/Ac.html +72 -0
  47. data/rdoc/classes/Authentasaurus/Ac/ActsAsOverrider.html +104 -0
  48. data/rdoc/classes/Authentasaurus/Ac/ActsAsOverrider/ClassMethods.html +397 -0
  49. data/rdoc/classes/Authentasaurus/Ac/Routing.html +61 -0
  50. data/rdoc/classes/Authentasaurus/Ac/Routing/InstanceMethods.html +390 -0
  51. data/rdoc/classes/Authentasaurus/Ar.html +77 -0
  52. data/rdoc/classes/Authentasaurus/Ar/ActsAsAuthenticatable.html +107 -0
  53. data/rdoc/classes/Authentasaurus/Ar/ActsAsAuthenticatable/ClassMethods.html +168 -0
  54. data/rdoc/classes/Authentasaurus/Ar/ActsAsAuthenticatable/InstanceMethods.html +357 -0
  55. data/rdoc/classes/Authentasaurus/Ar/ActsAsAuthenticatableValidatable.html +109 -0
  56. data/rdoc/classes/Authentasaurus/Ar/ActsAsAuthenticatableValidatable/ClassMethods.html +113 -0
  57. data/rdoc/classes/Authentasaurus/Ar/ActsAsAuthenticatableValidatable/InstanceMethods.html +54 -0
  58. data/rdoc/classes/Authentasaurus/Ar/ActsAsOverrider.html +104 -0
  59. data/rdoc/classes/Authentasaurus/Ar/ActsAsOverrider/ClassMethods.html +320 -0
  60. data/rdoc/classes/Authentasaurus/Ar/Authenticatable.html +104 -0
  61. data/rdoc/classes/Authentasaurus/Ar/Authenticatable/ClassMethods.html +182 -0
  62. data/rdoc/classes/Authentasaurus/Ar/Migrations.html +63 -0
  63. data/rdoc/classes/Authentasaurus/Ar/Migrations/Columns.html +68 -0
  64. data/rdoc/classes/Authentasaurus/Ar/Migrations/Columns/InstanceMethods.html +106 -0
  65. data/rdoc/classes/Authentasaurus/Ar/Migrations/Tables.html +68 -0
  66. data/rdoc/classes/Authentasaurus/Ar/Migrations/Tables/InstanceMethods.html +703 -0
  67. data/rdoc/classes/Authentasaurus/Arel.html +65 -0
  68. data/rdoc/classes/Authentasaurus/Arel/ActsAsAuthenticatable.html +107 -0
  69. data/rdoc/classes/Authentasaurus/Arel/ActsAsAuthenticatable/ClassMethods.html +139 -0
  70. data/rdoc/classes/Authentasaurus/Arel/ActsAsAuthenticatable/InstanceMethods.html +113 -0
  71. data/rdoc/classes/Authentasaurus/Arel/Authenticatable.html +105 -0
  72. data/rdoc/classes/Authentasaurus/Arel/Authenticatable/ClassMethods.html +119 -0
  73. data/rdoc/classes/Authentasaurus/Authorization.html +230 -0
  74. data/rdoc/classes/Authentasaurus/Authorization/ActionController.html +63 -0
  75. data/rdoc/classes/Authentasaurus/Authorization/ActionController/ClassMethods.html +263 -0
  76. data/rdoc/classes/Authentasaurus/Authorization/ActionController/InstanceMethods.html +54 -0
  77. data/rdoc/classes/Authentasaurus/Authorization/ActionView.html +54 -0
  78. data/rdoc/classes/Authentasaurus/Authorization/CommonInstanceMethods.html +240 -0
  79. data/rdoc/created.rid +1 -0
  80. data/rdoc/css/main.css +278 -0
  81. data/rdoc/css/panel.css +383 -0
  82. data/rdoc/css/reset.css +53 -0
  83. data/rdoc/favicon.ico +0 -0
  84. data/rdoc/files/README_rdoc.html +366 -0
  85. data/rdoc/files/TODO.html +64 -0
  86. data/rdoc/files/lib/authentasaurus/ac/acts_as_overrider_rb.html +52 -0
  87. data/rdoc/files/lib/authentasaurus/ac/routing_rb.html +60 -0
  88. data/rdoc/files/lib/authentasaurus/ar/acts_as_authenticatable_rb.html +52 -0
  89. data/rdoc/files/lib/authentasaurus/ar/acts_as_authenticatable_validatable_rb.html +52 -0
  90. data/rdoc/files/lib/authentasaurus/ar/acts_as_overrider_rb.html +52 -0
  91. data/rdoc/files/lib/authentasaurus/ar/authenticatable_rb.html +52 -0
  92. data/rdoc/files/lib/authentasaurus/ar/migrations_rb.html +52 -0
  93. data/rdoc/files/lib/authentasaurus/arel/acts_as_authenticatable_rb.html +52 -0
  94. data/rdoc/files/lib/authentasaurus/arel/authenticatable_rb.html +72 -0
  95. data/rdoc/files/lib/authentasaurus/authorization_rb.html +208 -0
  96. data/rdoc/i/arrows.png +0 -0
  97. data/rdoc/i/results_bg.png +0 -0
  98. data/rdoc/i/tree_bg.png +0 -0
  99. data/rdoc/index.html +15 -0
  100. data/rdoc/js/jquery-1.3.2.min.js +19 -0
  101. data/rdoc/js/jquery-effect.js +593 -0
  102. data/rdoc/js/main.js +22 -0
  103. data/rdoc/js/searchdoc.js +628 -0
  104. data/rdoc/panel/index.html +71 -0
  105. data/rdoc/panel/search_index.js +1 -0
  106. data/rdoc/panel/tree.js +1 -0
  107. metadata +92 -44
  108. data/lib/action_controller/authorization.rb +0 -215
  109. data/lib/action_view/authorization.rb +0 -52
  110. data/lib/active_record/acts_as_authenticatable.rb +0 -111
  111. data/lib/active_record/acts_as_authenticatable_validatable.rb +0 -36
  112. data/lib/active_record/authenticatable.rb +0 -64
  113. data/lib/active_resource/acts_as_authenticatable.rb +0 -70
  114. data/lib/active_resource/authenticatable.rb +0 -24
  115. data/lib/authentasaurus/areas_controller.rb +0 -78
  116. data/lib/authentasaurus/groups_controller.rb +0 -79
  117. data/lib/authentasaurus/models/area.rb +0 -21
  118. data/lib/authentasaurus/models/group.rb +0 -19
  119. data/lib/authentasaurus/models/permission.rb +0 -24
  120. data/lib/authentasaurus/permissions_controller.rb +0 -79
  121. data/lib/authentasaurus/recoveries_controller.rb +0 -70
  122. data/lib/authentasaurus/registrations_controller.rb +0 -43
  123. data/lib/authentasaurus/sessions_controller.rb +0 -56
  124. data/lib/authentasaurus/user_invitations_controller.rb +0 -48
  125. data/lib/authentasaurus/users_controller.rb +0 -78
  126. data/lib/authentasaurus/validations_controller.rb +0 -51
  127. data/lib/helpers/migrations.rb +0 -171
  128. data/lib/helpers/routing.rb +0 -87
@@ -0,0 +1,72 @@
1
+ module Authentasaurus::Ac::Controllers
2
+ module RecoveriesController
3
+ def self.included(base) # :nodoc:
4
+ base.send :extend, ClassMethods
5
+ base.send :include, InstanceMethods
6
+ end
7
+
8
+ module ClassMethods
9
+ end
10
+
11
+ module InstanceMethods
12
+ def new
13
+ @recovery = Recovery.new
14
+
15
+ respond_to do |format|
16
+ format.html
17
+ end
18
+ end
19
+
20
+ def create
21
+ @recovery = Recovery.find_or_initialize_by_email :email => params[:email]
22
+
23
+ if @recovery.new_record?
24
+ @recovery.user = User.find_by_email @recovery.email
25
+ end
26
+
27
+ respond_to do |format|
28
+ if @recovery.save
29
+ @recovery.touch
30
+ format.html { redirect_to new_session_path, :notice => t(:recovery_email_sent, :scope => [:authentasaurus, :messages, :recoveries], :email => @recovery.email) }
31
+ else
32
+ format.html {render :new}
33
+ end
34
+ end
35
+ end
36
+
37
+ def edit
38
+ @recovery = Recovery.valid.find_by_token(params[:token])
39
+
40
+ respond_to do |format|
41
+ unless @recovery.nil?
42
+ @user = @recovery.user
43
+ format.html
44
+ else
45
+ format.html { redirect_to new_session_path, :alert => t(:recovery_failed, :scope => [:authentasaurus, :messages, :recoveries], :email => params[:email]) }
46
+ end
47
+ end
48
+ end
49
+
50
+ def destroy
51
+ @recovery = Recovery.find_by_token params[:token]
52
+ @user = @recovery.user
53
+
54
+ respond_to do |format|
55
+ empty_fields = params[:user].select { |key, value| value.blank? }
56
+ if !empty_fields.empty?
57
+ empty_fields.each do |f|
58
+ @user.errors.add_to_base t(:recovery_field_blank, :scope => [:authentasaurus, :messages, :recoveries], :field => f.first.humanize)
59
+ end
60
+ format.html { render :edit }
61
+ elsif @user.update_attributes params[:user]
62
+ @recovery.destroy
63
+ format.html { redirect_to new_session_path, :notice => t(:recovery_successful, :scope => [:authentasaurus, :messages, :recoveries], :email => params[:email]) }
64
+ else
65
+ flash.now[:alert] = t(:recovery_failed, :scope => [:authentasaurus, :messages, :recoveries], :email => params[:email])
66
+ format.html { render :edit }
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,45 @@
1
+ module Authentasaurus::Ac::Controllers
2
+ module RegistrationsController
3
+ def self.included(base) # :nodoc:
4
+ base.send :extend, ClassMethods
5
+ base.send :include, InstanceMethods
6
+ end
7
+
8
+ module ClassMethods
9
+ end
10
+
11
+ module InstanceMethods
12
+ def new
13
+ @user = User.new
14
+ @user_invitation = UserInvitation.find_by_token params[:token]
15
+
16
+ respond_to do |format|
17
+ if @user_invitation.nil?
18
+ format.html {redirect_to new_session_path, :alert => t(:invalid_invitation_token, :scope => [:authentasaurus, :messages, :user_invitations])}
19
+ else
20
+ @user.email = @user_invitation.email
21
+ format.html
22
+ end
23
+ end
24
+ end
25
+
26
+ def create
27
+ @user = User.new params[:user]
28
+ user_invitation = UserInvitation.find_by_token params[:token]
29
+
30
+ respond_to do |format|
31
+ unless user_invitation.nil?
32
+ if @user.save
33
+ format.html {redirect_to new_session_path}
34
+ else
35
+ format.html {render :new}
36
+ end
37
+ else
38
+ flash.now[:alert] = t(:invalid_invitation_token, :scope => [:authentasaurus, :messages, :user_invitations])
39
+ format.html {render :new}
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,58 @@
1
+ module Authentasaurus::Ac::Controllers
2
+ module SessionsController
3
+ def self.included(base) # :nodoc:
4
+ base.send :extend, ClassMethods
5
+ base.send :include, InstanceMethods
6
+
7
+ base.send :before_filter, :check_is_logged_in, :except => [:destroy, :no_access]
8
+ end
9
+
10
+ module ClassMethods
11
+ end
12
+
13
+ module InstanceMethods
14
+ def new
15
+ @session = Session.new
16
+
17
+ respond_to do |format|
18
+ format.html
19
+ end
20
+ end
21
+
22
+ def create
23
+ @session = Session.new params[:session]
24
+
25
+ respond_to do |format|
26
+ if @session.save
27
+ if @session.remember == "1"
28
+ cookies.signed.permanent[:remember_me_token] = @session.user.remember_me_token
29
+ end
30
+ session[:user_id] = @session.user.id
31
+ session[:user_permissions] = {:read => @session.user.permissions.collect{|per| per.area.name if per.read}, :write => @session.user.permissions.collect{|per| per.area.name if per.write}}
32
+ format.html { redirect_to session[:original_url] || (defined?(signin_redirect_path).nil? ? root_path : signin_redirect_path) }
33
+ else
34
+ format.html { render :action => :new }
35
+ end
36
+ end
37
+
38
+ end
39
+
40
+ def destroy
41
+ session[:user_id] = nil
42
+ session[:user_permissions] = nil
43
+ cookies.delete :remember_me_token
44
+
45
+ respond_to do |format|
46
+ format.html { redirect_to :action => :new }
47
+ end
48
+ end
49
+
50
+ private
51
+ def check_is_logged_in
52
+ if is_logged_in?
53
+ redirect_to defined?(signin_redirect_path).nil? ? root_path : signin_redirect_path
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,50 @@
1
+ module Authentasaurus::Ac::Controllers
2
+ module UserInvitationsController
3
+ def self.included(base) # :nodoc:
4
+ base.send :extend, ClassMethods
5
+ base.send :include, InstanceMethods
6
+ end
7
+
8
+ module ClassMethods
9
+ end
10
+
11
+ module InstanceMethods
12
+ def index
13
+ @invitations = UserInvitation.find :all
14
+
15
+ respond_to do |format|
16
+ format.html
17
+ end
18
+ end
19
+
20
+ def new
21
+ @invitation = UserInvitation.new
22
+
23
+ respond_to do |format|
24
+ format.html
25
+ end
26
+ end
27
+
28
+ def create
29
+ @invitation = UserInvitation.new params[:user_invitation]
30
+
31
+ respond_to do |format|
32
+ if @invitation.save
33
+ format.html { redirect_to :action => :index }
34
+ else
35
+ format.html {render :new}
36
+ end
37
+ end
38
+ end
39
+
40
+ def destroy
41
+ invitation = UserInvitation.find params[:id]
42
+ invitation.destroy
43
+
44
+ respond_to do |format|
45
+ format.html { redirect_to :action => :index }
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,80 @@
1
+ module Authentasaurus::Ac::Controllers
2
+ module UsersController
3
+ def self.included(base) # :nodoc:
4
+ base.send :extend, ClassMethods
5
+ base.send :include, InstanceMethods
6
+ end
7
+
8
+ module ClassMethods
9
+ end
10
+
11
+ module InstanceMethods
12
+ def index
13
+ @users = User.all
14
+
15
+ respond_to do |format|
16
+ format.html
17
+ end
18
+ end
19
+
20
+ def show
21
+ @user = User.find(params[:id])
22
+
23
+ respond_to do |format|
24
+ format.html
25
+ end
26
+ end
27
+
28
+ def new
29
+ @user = User.new
30
+
31
+ respond_to do |format|
32
+ format.html
33
+ end
34
+ end
35
+
36
+ def create
37
+ @user = User.new params[:user]
38
+
39
+ respond_to do |format|
40
+ if @user.save
41
+ format.html { redirect_to :action=>:index, :notice => "User saved successfully" }
42
+ else
43
+ flash.now[:alert] = I18n.t(:create_failed, :scope => [:authentasaurus, :messages, :users])
44
+ format.html { render :new }
45
+ end
46
+ end
47
+ end
48
+
49
+ def edit
50
+ @user = User.find params[:id]
51
+
52
+ respond_to do |format|
53
+ format.html
54
+ end
55
+ end
56
+
57
+ def update
58
+ @user = User.find params[:id]
59
+
60
+ respond_to do |format|
61
+ if @user.update_attributes(params[:user])
62
+ format.html { redirect_to :action => :index, :notice => "User updated" }
63
+ else
64
+ flash.now[:alert] = I18n.t(:update_failed, :scope => [:authentasaurus, :messages, :users])
65
+ format.html { render :edit }
66
+ end
67
+ end
68
+ end
69
+
70
+ def destroy
71
+ @user = User.find params[:id]
72
+ @user.destroy
73
+
74
+ respond_to do |format|
75
+ format.html { redirect_to :action=>:index }
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,53 @@
1
+ module Authentasaurus::Ac::Controllers
2
+ module ValidationsController
3
+ def self.included(base) # :nodoc:
4
+ base.send :extend, ClassMethods
5
+ base.send :include, InstanceMethods
6
+ end
7
+
8
+ module ClassMethods
9
+ end
10
+
11
+ module InstanceMethods
12
+ def validate
13
+ respond_to do |format|
14
+ format.html
15
+ end
16
+ end
17
+
18
+ def activate
19
+ respond_to do |format|
20
+ validation = Validation.find_by_validation_code(params[:vcode])
21
+ if validation
22
+ validation.user.activate
23
+ validation.destroy
24
+ format.html { redirect_to login_url, :notice => I18n.t(:validation_successful, :scope => [:authentasaurus, :messages, :validations])}
25
+ else
26
+ flash.now[:alert] = I18n.t(:validation_failed, :scope => [:authentasaurus, :messages, :validations])
27
+ format.html { render :validate }
28
+ end
29
+ end
30
+ end
31
+
32
+ def resend_validation_email
33
+ respond_to do |format|
34
+ format.html
35
+ end
36
+ end
37
+
38
+ def do_resend_validation_email
39
+ validation = Validation.find_by_email params[:email]
40
+
41
+ respond_to do |format|
42
+ unless validation.nil?
43
+ validation.send_validation
44
+ format.html {redirect_to login_url, :notice => I18n.t(:validation_email_sent, :scope => [:authentasaurus, :messages, :validations])}
45
+ else
46
+ flash.now[:alert] = I18n.t(:validation_email_invalid, :scope => [:authentasaurus, :messages, :validations], :email => params[:email])
47
+ format.html { render :resend_validation_email }
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,90 @@
1
+ ## Authentasaurus routes helper
2
+ module Authentasaurus::Ac
3
+ module Routing
4
+ def self.included(base) # :nodoc:
5
+ base.send :include, InstanceMethods
6
+ end
7
+
8
+ module InstanceMethods
9
+ # TODO: add documentation here
10
+ def authentasaurus_routes(*opts)
11
+ options = opts.extract_options!
12
+
13
+ # Authenticatable
14
+ authentasaurus_sessions options.dup
15
+ authentasaurus_users options.dup
16
+ # Recoverable
17
+ authentasaurus_recoverable
18
+
19
+ # Authorizable
20
+ if opts.include?(:authorization)
21
+ authentasaurus_authorizable options.dup
22
+ end
23
+
24
+ # Validatable
25
+ if opts.include?(:validation)
26
+ authentasaurus_validatable
27
+ end
28
+
29
+ # Invitable
30
+ if opts.include?(:invitation)
31
+ authentasaurus_invitable options.dup
32
+ authentasaurus_invitable_public
33
+ end
34
+ end
35
+
36
+ # TODO: add documentation here
37
+ def authentasaurus_sessions(*opts)
38
+ get "/sessions/sign-in(.:format)" => "sessions#new", :as => :new_session
39
+ post "/sessions(.:format)" => "sessions#create", :as => :sessions
40
+ delete "/sessions/sign-out(.:format)" => "sessions#destroy", :as => :session
41
+ get "/sessions/no-access(.:format)" => "sessions#no_access", :as => :no_access_sessions
42
+ end
43
+
44
+ # TODO: add documentation here
45
+ def authentasaurus_users(*opts)
46
+ options = opts.extract_options!
47
+
48
+ resources :users, options.dup
49
+ end
50
+
51
+ # TODO: add documentation here
52
+ def authentasaurus_authorizable(*opts)
53
+ options = opts.extract_options!
54
+
55
+ resources :groups, options.dup
56
+ resources :areas, options.dup
57
+ resources :permissions, options.dup
58
+ end
59
+
60
+ # TODO: add documentation here
61
+ def authentasaurus_validatable
62
+ match "/validate" => "validations#validate", :as => 'validate'
63
+ match "/activate" => "validations#activate", :as => 'activate'
64
+ match "/resend-validation" => "validations#resend_validation_email", :via => :get, :as => 'recover_password'
65
+ match "/resend-validation" => "validations#do_resend_validation_email", :via => :post, :as => 'do_recover_password'
66
+ end
67
+
68
+ # TODO: add documentation here
69
+ def authentasaurus_invitable(*opts)
70
+ options = opts.extract_options!
71
+
72
+ resources :user_invitations, options.dup.merge({:except => [:show, :edit, :update]})
73
+ end
74
+
75
+ def authentasaurus_invitable_public(*opts)
76
+ options = opts.extract_options!
77
+
78
+ resources :registrations, :only => [:new, :create], :path_prefix => "/:token", :requirements => {:token => /[0-9a-zA-Z]+/}
79
+ end
80
+
81
+ # TODO: add documentation here
82
+ def authentasaurus_recoverable
83
+ match "/forgot-password" => "recoveries#new", :via => :get, :as => 'forgot_password'
84
+ match "/forgot-password" => "recoveries#create", :via => :post, :as => 'do_forgot_password'
85
+ match "/recover-password/:token" => "recoveries#edit", :via => :get, :as => 'recover_password'
86
+ match "/recover-password/:token" => "recoveries#destroy", :via => :delete, :as => 'do_recover_password'
87
+ end
88
+ end
89
+ end
90
+ end