kryptonite 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -0
- data/MIT-LICENSE +20 -0
- data/PUBLIC_VERSION.yml +4 -0
- data/README.rdoc +209 -0
- data/Rakefile +40 -0
- data/app/controllers/kryptonite/kryptonite_controller.rb +72 -0
- data/app/controllers/kryptonite/password_resets_controller.rb +66 -0
- data/app/controllers/kryptonite/user_sessions_controller.rb +40 -0
- data/app/controllers/kryptonite/users_controller.rb +102 -0
- data/app/helpers/kryptonite/kryptonite_helper.rb +200 -0
- data/app/mailers/kryptonite/kryptonite_notification.rb +39 -0
- data/app/models/kryptonite/user.rb +55 -0
- data/app/models/kryptonite/user_session.rb +8 -0
- data/app/views/kryptonite/kryptonite/blank.html.erb +1 -0
- data/app/views/kryptonite/kryptonite_notification/generate_new_password.erb +12 -0
- data/app/views/kryptonite/kryptonite_notification/new_user_information.erb +12 -0
- data/app/views/kryptonite/kryptonite_notification/password_reset_instructions.erb +11 -0
- data/app/views/kryptonite/password_resets/edit.html.erb +48 -0
- data/app/views/kryptonite/user_sessions/new.html.erb +66 -0
- data/app/views/kryptonite/users/index.html.erb +35 -0
- data/app/views/kryptonite/users/new.html.erb +46 -0
- data/app/views/kryptonite/users/show.html.erb +94 -0
- data/app/views/layouts/kryptonite_auth.html.erb +24 -0
- data/app/views/layouts/kryptonite_main.html.erb +67 -0
- data/config/routes.rb +20 -0
- data/lib/generators/kryptonite/install/USAGE +1 -0
- data/lib/generators/kryptonite/install/install_generator.rb +37 -0
- data/lib/generators/kryptonite/install/templates/app/helpers/kryptonite/config_helper.rb +46 -0
- data/lib/generators/kryptonite/install/templates/app/views/kryptonite/layouts/_left_navigation.html.erb +2 -0
- data/lib/generators/kryptonite/install/templates/app/views/kryptonite/layouts/_right_navigation.html.erb +1 -0
- data/lib/generators/kryptonite/install/templates/db/migrate/kryptonite_create_users.rb +30 -0
- data/lib/generators/kryptonite/install/templates/public/casein/javascripts/custom.js +2 -0
- data/lib/generators/kryptonite/install/templates/public/casein/stylesheets/custom.css +2 -0
- data/lib/generators/kryptonite/install/templates/public/robots.txt +5 -0
- data/lib/generators/kryptonite/scaffold/USAGE +1 -0
- data/lib/generators/kryptonite/scaffold/scaffold_generator.rb +99 -0
- data/lib/generators/kryptonite/scaffold/templates/controller.rb +60 -0
- data/lib/generators/kryptonite/scaffold/templates/migration.rb +13 -0
- data/lib/generators/kryptonite/scaffold/templates/model.rb +3 -0
- data/lib/generators/kryptonite/scaffold/templates/views/_form.html.erb +9 -0
- data/lib/generators/kryptonite/scaffold/templates/views/_table.html.erb +17 -0
- data/lib/generators/kryptonite/scaffold/templates/views/index.html.erb +11 -0
- data/lib/generators/kryptonite/scaffold/templates/views/new.html.erb +18 -0
- data/lib/generators/kryptonite/scaffold/templates/views/show.html.erb +18 -0
- data/lib/generators/kryptonite/update/USAGE +1 -0
- data/lib/generators/kryptonite/update/templates/public/kryptonite/images/casein.png +0 -0
- data/lib/generators/kryptonite/update/templates/public/kryptonite/images/header.png +0 -0
- data/lib/generators/kryptonite/update/templates/public/kryptonite/images/icons/add.png +0 -0
- data/lib/generators/kryptonite/update/templates/public/kryptonite/images/icons/delete.png +0 -0
- data/lib/generators/kryptonite/update/templates/public/kryptonite/images/icons/table.png +0 -0
- data/lib/generators/kryptonite/update/templates/public/kryptonite/images/login/alertBg.png +0 -0
- data/lib/generators/kryptonite/update/templates/public/kryptonite/images/login/background.png +0 -0
- data/lib/generators/kryptonite/update/templates/public/kryptonite/images/login/bottom.png +0 -0
- data/lib/generators/kryptonite/update/templates/public/kryptonite/images/login/loginBoxBg.png +0 -0
- data/lib/generators/kryptonite/update/templates/public/kryptonite/images/login/loginBoxBottom.png +0 -0
- data/lib/generators/kryptonite/update/templates/public/kryptonite/images/login/loginBoxTop.png +0 -0
- data/lib/generators/kryptonite/update/templates/public/kryptonite/images/login/loginSubmit.png +0 -0
- data/lib/generators/kryptonite/update/templates/public/kryptonite/images/login/recoverSubmit.png +0 -0
- data/lib/generators/kryptonite/update/templates/public/kryptonite/images/login/top.png +0 -0
- data/lib/generators/kryptonite/update/templates/public/kryptonite/images/nav.png +0 -0
- data/lib/generators/kryptonite/update/templates/public/kryptonite/images/rightNav.png +0 -0
- data/lib/generators/kryptonite/update/templates/public/kryptonite/images/rightNavButton.png +0 -0
- data/lib/generators/kryptonite/update/templates/public/kryptonite/images/visitSiteNav.png +0 -0
- data/lib/generators/kryptonite/update/templates/public/kryptonite/javascripts/jquery.js +154 -0
- data/lib/generators/kryptonite/update/templates/public/kryptonite/javascripts/kryptonite.js +25 -0
- data/lib/generators/kryptonite/update/templates/public/kryptonite/javascripts/login.js +24 -0
- data/lib/generators/kryptonite/update/templates/public/kryptonite/javascripts/rails.js +132 -0
- data/lib/generators/kryptonite/update/templates/public/kryptonite/stylesheets/elements.css +307 -0
- data/lib/generators/kryptonite/update/templates/public/kryptonite/stylesheets/login.css +137 -0
- data/lib/generators/kryptonite/update/templates/public/kryptonite/stylesheets/screen.css +224 -0
- data/lib/generators/kryptonite/update/update_generator.rb +40 -0
- data/lib/kryptonite.rb +3 -0
- data/lib/kryptonite/engine.rb +22 -0
- data/lib/railties/tasks.rake +31 -0
- metadata +169 -0
@@ -0,0 +1,102 @@
|
|
1
|
+
module Kryptonite
|
2
|
+
class UsersController < Kryptonite::KryptoniteController
|
3
|
+
|
4
|
+
unloadable
|
5
|
+
|
6
|
+
before_filter :needs_admin, :except => [:show, :destroy, :update, :update_password]
|
7
|
+
before_filter :needs_admin_or_current_user, :only => [:show, :destroy, :update, :update_password]
|
8
|
+
|
9
|
+
def index
|
10
|
+
@kryptonite_page_title = "Users"
|
11
|
+
@users = Kryptonite::User.paginate :order => "login", :page => params[:page]
|
12
|
+
end
|
13
|
+
|
14
|
+
def new
|
15
|
+
@kryptonite_page_title = "Add a new user"
|
16
|
+
@kryptonite_user = Kryptonite::User.new
|
17
|
+
@kryptonite_user.time_zone = Rails.configuration.time_zone
|
18
|
+
end
|
19
|
+
|
20
|
+
def create
|
21
|
+
@kryptonite_user = Kryptonite::User.new params[:kryptonite_user]
|
22
|
+
|
23
|
+
if @kryptonite_user.save
|
24
|
+
flash[:notice] = "An email has been sent to " + @kryptonite_user.name + " with the new account details"
|
25
|
+
redirect_to kryptonite_users_path
|
26
|
+
else
|
27
|
+
flash.now[:warning] = "There were problems when trying to create a new user"
|
28
|
+
render :action => :new
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def show
|
33
|
+
@kryptonite_user = Kryptonite::User.find params[:id]
|
34
|
+
@kryptonite_page_title = @kryptonite_user.name + " | View User"
|
35
|
+
end
|
36
|
+
|
37
|
+
def update
|
38
|
+
@kryptonite_user = Kryptonite::User.find params[:id]
|
39
|
+
@kryptonite_page_title = @kryptonite_user.name + " | Update User"
|
40
|
+
|
41
|
+
if @kryptonite_user.update_attributes params[:kryptonite_user]
|
42
|
+
flash[:notice] = @kryptonite_user.name + " has been updated"
|
43
|
+
else
|
44
|
+
flash.now[:warning] = "There were problems when trying to update this user"
|
45
|
+
render :action => :show
|
46
|
+
return
|
47
|
+
end
|
48
|
+
|
49
|
+
if @session_user.is_admin?
|
50
|
+
redirect_to kryptonite_users_path
|
51
|
+
else
|
52
|
+
redirect_to :controller => :kryptonite, :action => :index
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def update_password
|
57
|
+
@kryptonite_user = Kryptonite::User.find params[:id]
|
58
|
+
@kryptonite_page_title = @kryptonite_user.name + " | Update Password"
|
59
|
+
|
60
|
+
if @kryptonite_user.valid_password? params[:form_current_password]
|
61
|
+
if @kryptonite_user.update_attributes params[:kryptonite_user]
|
62
|
+
flash.now[:notice] = "Your password has been changed"
|
63
|
+
else
|
64
|
+
flash.now[:warning] = "There were problems when trying to change the password"
|
65
|
+
end
|
66
|
+
else
|
67
|
+
flash.now[:warning] = "The current password is incorrect"
|
68
|
+
end
|
69
|
+
|
70
|
+
render :action => :show
|
71
|
+
end
|
72
|
+
|
73
|
+
def reset_password
|
74
|
+
@kryptonite_user = Kryptonite::User.find params[:id]
|
75
|
+
@kryptonite_page_title = @kryptonite_user.name + " | Reset Password"
|
76
|
+
|
77
|
+
@kryptonite_user.notify_of_new_password = true unless @kryptonite_user.id == @session_user.id
|
78
|
+
|
79
|
+
if @kryptonite_user.update_attributes params[:kryptonite_user]
|
80
|
+
if @kryptonite_user.id == @session_user.id
|
81
|
+
flash.now[:notice] = "Your password has been reset"
|
82
|
+
else
|
83
|
+
flash.now[:notice] = "Password has been reset and " + @kryptonite_user.name + " has been notified by email"
|
84
|
+
end
|
85
|
+
|
86
|
+
else
|
87
|
+
flash.now[:warning] = "There were problems when trying to reset this user's password"
|
88
|
+
end
|
89
|
+
render :action => :show
|
90
|
+
end
|
91
|
+
|
92
|
+
def destroy
|
93
|
+
user = Kryptonite::User.find params[:id]
|
94
|
+
if user.is_admin? == false || Kryptonite::User.has_more_than_one_admin
|
95
|
+
user.destroy
|
96
|
+
flash[:notice] = user.name + " has been deleted"
|
97
|
+
end
|
98
|
+
redirect_to kryptonite_users_path
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,200 @@
|
|
1
|
+
module Kryptonite
|
2
|
+
module KryptoniteHelper
|
3
|
+
|
4
|
+
def kryptonite_get_version_info
|
5
|
+
YAML::load_file File.join(File.dirname(__FILE__), '..', '..', '..', 'PUBLIC_VERSION.yml')
|
6
|
+
end
|
7
|
+
|
8
|
+
def kryptonite_get_full_version_string
|
9
|
+
version_info = kryptonite_get_version_info
|
10
|
+
"v.#{version_info['major']}.#{version_info['minor']}.#{version_info['patch']}"
|
11
|
+
end
|
12
|
+
|
13
|
+
def kryptonite_get_short_version_string
|
14
|
+
version_info = kryptonite_get_version_info
|
15
|
+
"v.#{version_info['major']}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def kryptonite_generate_page_title
|
19
|
+
|
20
|
+
if @kryptonite_page_title.nil?
|
21
|
+
return kryptonite_config_website_name
|
22
|
+
end
|
23
|
+
|
24
|
+
@kryptonite_page_title + " > " + kryptonite_config_website_name
|
25
|
+
end
|
26
|
+
|
27
|
+
def kryptonite_get_access_level_text level
|
28
|
+
case level
|
29
|
+
when $KRYPTONITE_USER_ACCESS_LEVEL_ADMIN
|
30
|
+
return "Administrator"
|
31
|
+
when $KRYPTONITE_USER_ACCESS_LEVEL_USER
|
32
|
+
return "User"
|
33
|
+
else
|
34
|
+
return "Unknown"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def kryptonite_get_access_level_array
|
39
|
+
[["Administrator", $KRYPTONITE_USER_ACCESS_LEVEL_ADMIN], ["User", $KRYPTONITE_USER_ACCESS_LEVEL_USER]]
|
40
|
+
end
|
41
|
+
|
42
|
+
def kryptonite_table_cell_link contents, link, options = {}
|
43
|
+
|
44
|
+
if options.key? :kryptonite_truncate
|
45
|
+
contents = truncate(contents, :length => options[:kryptonite_truncate], :omission => "...")
|
46
|
+
end
|
47
|
+
|
48
|
+
link_to "#{contents}".html_safe, link, options
|
49
|
+
end
|
50
|
+
|
51
|
+
def kryptonite_table_cell_no_link contents, options = {}
|
52
|
+
|
53
|
+
if options.key? :kryptonite_truncate
|
54
|
+
contents = truncate(contents, :length => options[:kryptonite_truncate], :omission => "...")
|
55
|
+
end
|
56
|
+
|
57
|
+
"<div class='noLink'>#{contents}</div>".html_safe
|
58
|
+
end
|
59
|
+
|
60
|
+
def kryptonite_show_icon icon_name
|
61
|
+
"<div class='icon'><img src='/kryptonite/images/icons/#{icon_name}.png' alt='' /></div>".html_safe
|
62
|
+
end
|
63
|
+
|
64
|
+
def kryptonite_show_row_icon icon_name
|
65
|
+
"<div class='iconRow'><img src='/kryptonite/images/icons/#{icon_name}.png' alt='' /></div>".html_safe
|
66
|
+
end
|
67
|
+
|
68
|
+
# Styled form tag helpers
|
69
|
+
|
70
|
+
def kryptonite_text_field form, obj, attribute, options = {}
|
71
|
+
kryptonite_form_tag_wrapper(form.text_field(attribute, strip_kryptonite_options(options_hash_with_merged_classes(options, 'kryptoniteTextField'))), form, obj, attribute, options).html_safe
|
72
|
+
end
|
73
|
+
|
74
|
+
def kryptonite_password_field form, obj, attribute, options = {}
|
75
|
+
kryptonite_form_tag_wrapper(form.password_field(attribute, strip_kryptonite_options(options_hash_with_merged_classes(options, 'kryptoniteTextField'))), form, obj, attribute, options).html_safe
|
76
|
+
end
|
77
|
+
|
78
|
+
def kryptonite_text_area form, obj, attribute, options = {}
|
79
|
+
kryptonite_form_tag_wrapper(form.text_area(attribute, strip_kryptonite_options(options_hash_with_merged_classes(options, 'kryptoniteTextArea'))), form, obj, attribute, options).html_safe
|
80
|
+
end
|
81
|
+
|
82
|
+
def kryptonite_text_area_big form, obj, attribute, options = {}
|
83
|
+
kryptonite_form_tag_wrapper(form.text_area(attribute, strip_kryptonite_options(options_hash_with_merged_classes(options, 'kryptoniteTextAreaBig'))), form, obj, attribute, options).html_safe
|
84
|
+
end
|
85
|
+
|
86
|
+
def kryptonite_check_box form, obj, attribute, options = {}
|
87
|
+
form_tag = form.check_box(attribute, strip_kryptonite_options(options))
|
88
|
+
|
89
|
+
if options.key? :kryptonite_box_label
|
90
|
+
form_tag = "<div>" + form_tag + "<span class=\"rcText\">#{options[:kryptonite_box_label]}</span></div>".html_safe
|
91
|
+
end
|
92
|
+
|
93
|
+
kryptonite_form_tag_wrapper(form_tag, form, obj, attribute, options).html_safe
|
94
|
+
end
|
95
|
+
|
96
|
+
def kryptonite_check_box_group form, obj, check_boxes = {}
|
97
|
+
form_tags = ""
|
98
|
+
|
99
|
+
for check_box in check_boxes
|
100
|
+
form_tags += kryptonite_check_box form, obj, check_box[0], check_box[1]
|
101
|
+
end
|
102
|
+
|
103
|
+
kryptonite_form_tag_wrapper form_tag, form, obj, attribute, options
|
104
|
+
end
|
105
|
+
|
106
|
+
def kryptonite_radio_button form, obj, attribute, tag_value, options = {}
|
107
|
+
form_tag = form.radio_button(obj, attribute, tag_value, strip_kryptonite_options(options))
|
108
|
+
|
109
|
+
if options.key? :kryptonite_button_label
|
110
|
+
form_tag = "<div>" + form_tag + "<span class=\"rcText\">#{options[:kryptonite_button_label]}</span></div>".html_safe
|
111
|
+
end
|
112
|
+
|
113
|
+
kryptonite_form_tag_wrapper(form_tag, form, obj, attribute, options).html_safe
|
114
|
+
end
|
115
|
+
|
116
|
+
def kryptonite_radio_button_group form, obj, radio_buttons = {}
|
117
|
+
form_tags = ""
|
118
|
+
|
119
|
+
for radio_button in radio_buttons
|
120
|
+
form_tags += kryptonite_radio_button form, obj, check_box[0], check_box[1], check_box[2]
|
121
|
+
end
|
122
|
+
|
123
|
+
kryptonite_form_tag_wrapper(form_tag, form, obj, attribute, options).html_safe
|
124
|
+
end
|
125
|
+
|
126
|
+
def kryptonite_select form, obj, attribute, option_tags, options = {}
|
127
|
+
kryptonite_form_tag_wrapper(form.select(attribute, option_tags, strip_kryptonite_options(options), merged_class_hash(options, 'kryptoniteSelect')), form, obj, attribute, options).html_safe
|
128
|
+
end
|
129
|
+
|
130
|
+
def kryptonite_time_zone_select form, obj, attribute, option_tags, options = {}
|
131
|
+
kryptonite_form_tag_wrapper(form.time_zone_select(attribute, option_tags, strip_kryptonite_options(options), merged_class_hash(options, 'kryptoniteSelect')), form, obj, attribute, options).html_safe
|
132
|
+
end
|
133
|
+
|
134
|
+
def kryptonite_collection_select form, obj, object, attribute, collection, value_method, text_method, options = {}
|
135
|
+
kryptonite_form_tag_wrapper(collection_select(object, attribute, collection, value_method, text_method, strip_kryptonite_options(options), merged_class_hash(options, 'kryptoniteSelect')), form, obj, attribute, options).html_safe
|
136
|
+
end
|
137
|
+
|
138
|
+
def kryptonite_date_select form, obj, attribute, options = {}
|
139
|
+
kryptonite_form_tag_wrapper(form.date_select(attribute, strip_kryptonite_options(options), merged_class_hash(options, 'kryptoniteDateTimeSelect')), form, obj, attribute, options).html_safe
|
140
|
+
end
|
141
|
+
|
142
|
+
def kryptonite_time_select form, obj, attribute, options = {}
|
143
|
+
kryptonite_form_tag_wrapper(form.time_select(attribute, strip_kryptonite_options(options), merged_class_hash(options, 'kryptoniteDateTimeSelect')), form, obj, attribute, options).html_safe
|
144
|
+
end
|
145
|
+
|
146
|
+
def kryptonite_datetime_select form, obj, attribute, options = {}
|
147
|
+
kryptonite_form_tag_wrapper(form.datetime_select(attribute, strip_kryptonite_options(options), merged_class_hash(options, 'kryptoniteDateTimeSelect')), form, obj, attribute, options).html_safe
|
148
|
+
end
|
149
|
+
|
150
|
+
def kryptonite_file_field form, obj, object_name, attribute, options = {}
|
151
|
+
class_hash = merged_class_hash(options, 'kryptoniteFileFieldContainer')
|
152
|
+
contents = "<div class='#{class_hash[:class]}'>" + file_field(object_name, attribute, strip_kryptonite_options(options)) + '</div>'
|
153
|
+
kryptonite_form_tag_wrapper(contents, form, obj, attribute, options).html_safe
|
154
|
+
end
|
155
|
+
|
156
|
+
def kryptonite_hidden_field form, obj, attribute, options = {}
|
157
|
+
form.hidden_field(attribute, strip_kryptonite_options(options)).html_safe
|
158
|
+
end
|
159
|
+
|
160
|
+
protected
|
161
|
+
|
162
|
+
def strip_kryptonite_options options
|
163
|
+
options.reject {|key, value| key.to_s.include? "kryptonite_" }
|
164
|
+
end
|
165
|
+
|
166
|
+
def merged_class_hash options, new_class
|
167
|
+
if options.key? :class
|
168
|
+
new_class += " #{options[:class]}"
|
169
|
+
end
|
170
|
+
|
171
|
+
{:class => new_class}
|
172
|
+
end
|
173
|
+
|
174
|
+
def options_hash_with_merged_classes options, new_class
|
175
|
+
if options.key? :class
|
176
|
+
new_class += " #{options[:class]}"
|
177
|
+
end
|
178
|
+
options[:class] = new_class
|
179
|
+
options
|
180
|
+
end
|
181
|
+
|
182
|
+
def kryptonite_form_tag_wrapper form_tag, form, obj, attribute, options = {}
|
183
|
+
unless options.key? :kryptonite_label
|
184
|
+
human_attribute_name = attribute.to_s.humanize
|
185
|
+
else
|
186
|
+
human_attribute_name = options[:kryptonite_label]
|
187
|
+
end
|
188
|
+
|
189
|
+
html = "<p>"
|
190
|
+
|
191
|
+
if obj && obj.errors[attribute].any?
|
192
|
+
html += "<span class='formError'>#{human_attribute_name} #{obj.errors[attribute].first}</span>".html_safe
|
193
|
+
else
|
194
|
+
html += form.label(attribute, human_attribute_name)
|
195
|
+
end
|
196
|
+
|
197
|
+
html += "</p>\n<p>#{form_tag}</p>"
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Kryptonite
|
2
|
+
|
3
|
+
class KryptoniteNotification < ActionMailer::Base
|
4
|
+
|
5
|
+
self.prepend_view_path File.join(File.dirname(__FILE__), '..', 'views', 'kryptonite')
|
6
|
+
|
7
|
+
def generate_new_password from, kryptonite_user, host, pass
|
8
|
+
@name = kryptonite_user.name
|
9
|
+
@host = host
|
10
|
+
@login = kryptonite_user.login
|
11
|
+
@pass = pass
|
12
|
+
@from_text = kryptonite_config_website_name
|
13
|
+
|
14
|
+
mail(:to => kryptonite_user.email, :from => from, :subject => "[#{kryptonite_config_website_name}] New password")
|
15
|
+
end
|
16
|
+
|
17
|
+
def new_user_information from, kryptonite_user, host, pass
|
18
|
+
@name = kryptonite_user.name
|
19
|
+
@host = host
|
20
|
+
@login = kryptonite_user.login
|
21
|
+
@pass = pass
|
22
|
+
@from_text = kryptonite_config_website_name
|
23
|
+
|
24
|
+
mail(:to => kryptonite_user.email, :from => from, :subject => "[#{kryptonite_config_website_name}] New user account")
|
25
|
+
end
|
26
|
+
|
27
|
+
def password_reset_instructions from, kryptonite_user, host
|
28
|
+
ActionMailer::Base.default_url_options[:host] = host.gsub("http://", "")
|
29
|
+
@name = kryptonite_user.name
|
30
|
+
@host = host
|
31
|
+
@login = kryptonite_user.login
|
32
|
+
@reset_password_url = edit_kryptonite_password_reset_url + "/?token=#{kryptonite_user.perishable_token}"
|
33
|
+
@from_text = kryptonite_config_website_name
|
34
|
+
|
35
|
+
mail(:to => kryptonite_user.email, :from => from, :subject => "[#{kryptonite_config_website_name}] Password reset instructions")
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
include Kryptonite::ConfigHelper
|
2
|
+
|
3
|
+
$KRYPTONITE_USER_ACCESS_LEVEL_ADMIN = 0
|
4
|
+
$KRYPTONITE_USER_ACCESS_LEVEL_USER = 10
|
5
|
+
|
6
|
+
module Kryptonite
|
7
|
+
class User < ActiveRecord::Base
|
8
|
+
|
9
|
+
def self.table_name
|
10
|
+
self.to_s.gsub("::", "_").tableize
|
11
|
+
end
|
12
|
+
|
13
|
+
acts_as_authentic { |c| c.validate_email_field = false }
|
14
|
+
|
15
|
+
attr_accessor :notify_of_new_password
|
16
|
+
|
17
|
+
after_create :send_create_notification
|
18
|
+
after_update :send_update_notification
|
19
|
+
before_validation :check_time_zone
|
20
|
+
|
21
|
+
validates_presence_of :login, :name, :email
|
22
|
+
validates_uniqueness_of :login
|
23
|
+
validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i
|
24
|
+
validates_presence_of :time_zone
|
25
|
+
|
26
|
+
def self.has_more_than_one_admin
|
27
|
+
Kryptonite::User.where(:access_level => $KRYPTONITE_USER_ACCESS_LEVEL_ADMIN).count > 1
|
28
|
+
end
|
29
|
+
|
30
|
+
def send_create_notification
|
31
|
+
Kryptonite::KryptoniteNotification.new_user_information(kryptonite_config_email_from_address, self, kryptonite_config_hostname, @password).deliver
|
32
|
+
end
|
33
|
+
|
34
|
+
def send_update_notification
|
35
|
+
if notify_of_new_password
|
36
|
+
notify_of_new_password = false
|
37
|
+
Kryptonite::KryptoniteNotification.generate_new_password(kryptonite_config_email_from_address, self, kryptonite_config_hostname, @password).deliver
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def send_password_reset_instructions
|
42
|
+
reset_perishable_token!
|
43
|
+
Kryptonite::KryptoniteNotification.password_reset_instructions(kryptonite_config_email_from_address, self, kryptonite_config_hostname).deliver
|
44
|
+
end
|
45
|
+
|
46
|
+
def check_time_zone
|
47
|
+
self.time_zone = Rails.configuration.time_zone unless self.time_zone
|
48
|
+
end
|
49
|
+
|
50
|
+
def is_admin?
|
51
|
+
access_level == $KRYPTONITE_USER_ACCESS_LEVEL_ADMIN
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<h2>Welcome to the <%= kryptonite_config_website_name %> administration system</h2>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
Dear <%= @name %>,<br />
|
2
|
+
<br />
|
3
|
+
Your password has been reset by an administrator for your account at:<br />
|
4
|
+
<br />
|
5
|
+
<%= @host %>/kryptonite<br />
|
6
|
+
<br />
|
7
|
+
Login: <%= @login %><br />
|
8
|
+
New password: <%= @pass %><br />
|
9
|
+
<br />
|
10
|
+
From<br />
|
11
|
+
<br />
|
12
|
+
<%= @from_text %>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Dear <%= @name %>,<br />
|
2
|
+
<br />
|
3
|
+
A request to reset the password for login '<%= @login %>' has been made.<br />
|
4
|
+
If you did not make this request, simply ignore this email.<br />
|
5
|
+
Otherwise, click the link below to proceed:<br />
|
6
|
+
<br />
|
7
|
+
<%= @reset_password_url %><br />
|
8
|
+
<br />
|
9
|
+
From<br />
|
10
|
+
<br />
|
11
|
+
<%= @from_text %>
|