kryptonite 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. data/Gemfile +1 -0
  2. data/MIT-LICENSE +20 -0
  3. data/PUBLIC_VERSION.yml +4 -0
  4. data/README.rdoc +209 -0
  5. data/Rakefile +40 -0
  6. data/app/controllers/kryptonite/kryptonite_controller.rb +72 -0
  7. data/app/controllers/kryptonite/password_resets_controller.rb +66 -0
  8. data/app/controllers/kryptonite/user_sessions_controller.rb +40 -0
  9. data/app/controllers/kryptonite/users_controller.rb +102 -0
  10. data/app/helpers/kryptonite/kryptonite_helper.rb +200 -0
  11. data/app/mailers/kryptonite/kryptonite_notification.rb +39 -0
  12. data/app/models/kryptonite/user.rb +55 -0
  13. data/app/models/kryptonite/user_session.rb +8 -0
  14. data/app/views/kryptonite/kryptonite/blank.html.erb +1 -0
  15. data/app/views/kryptonite/kryptonite_notification/generate_new_password.erb +12 -0
  16. data/app/views/kryptonite/kryptonite_notification/new_user_information.erb +12 -0
  17. data/app/views/kryptonite/kryptonite_notification/password_reset_instructions.erb +11 -0
  18. data/app/views/kryptonite/password_resets/edit.html.erb +48 -0
  19. data/app/views/kryptonite/user_sessions/new.html.erb +66 -0
  20. data/app/views/kryptonite/users/index.html.erb +35 -0
  21. data/app/views/kryptonite/users/new.html.erb +46 -0
  22. data/app/views/kryptonite/users/show.html.erb +94 -0
  23. data/app/views/layouts/kryptonite_auth.html.erb +24 -0
  24. data/app/views/layouts/kryptonite_main.html.erb +67 -0
  25. data/config/routes.rb +20 -0
  26. data/lib/generators/kryptonite/install/USAGE +1 -0
  27. data/lib/generators/kryptonite/install/install_generator.rb +37 -0
  28. data/lib/generators/kryptonite/install/templates/app/helpers/kryptonite/config_helper.rb +46 -0
  29. data/lib/generators/kryptonite/install/templates/app/views/kryptonite/layouts/_left_navigation.html.erb +2 -0
  30. data/lib/generators/kryptonite/install/templates/app/views/kryptonite/layouts/_right_navigation.html.erb +1 -0
  31. data/lib/generators/kryptonite/install/templates/db/migrate/kryptonite_create_users.rb +30 -0
  32. data/lib/generators/kryptonite/install/templates/public/casein/javascripts/custom.js +2 -0
  33. data/lib/generators/kryptonite/install/templates/public/casein/stylesheets/custom.css +2 -0
  34. data/lib/generators/kryptonite/install/templates/public/robots.txt +5 -0
  35. data/lib/generators/kryptonite/scaffold/USAGE +1 -0
  36. data/lib/generators/kryptonite/scaffold/scaffold_generator.rb +99 -0
  37. data/lib/generators/kryptonite/scaffold/templates/controller.rb +60 -0
  38. data/lib/generators/kryptonite/scaffold/templates/migration.rb +13 -0
  39. data/lib/generators/kryptonite/scaffold/templates/model.rb +3 -0
  40. data/lib/generators/kryptonite/scaffold/templates/views/_form.html.erb +9 -0
  41. data/lib/generators/kryptonite/scaffold/templates/views/_table.html.erb +17 -0
  42. data/lib/generators/kryptonite/scaffold/templates/views/index.html.erb +11 -0
  43. data/lib/generators/kryptonite/scaffold/templates/views/new.html.erb +18 -0
  44. data/lib/generators/kryptonite/scaffold/templates/views/show.html.erb +18 -0
  45. data/lib/generators/kryptonite/update/USAGE +1 -0
  46. data/lib/generators/kryptonite/update/templates/public/kryptonite/images/casein.png +0 -0
  47. data/lib/generators/kryptonite/update/templates/public/kryptonite/images/header.png +0 -0
  48. data/lib/generators/kryptonite/update/templates/public/kryptonite/images/icons/add.png +0 -0
  49. data/lib/generators/kryptonite/update/templates/public/kryptonite/images/icons/delete.png +0 -0
  50. data/lib/generators/kryptonite/update/templates/public/kryptonite/images/icons/table.png +0 -0
  51. data/lib/generators/kryptonite/update/templates/public/kryptonite/images/login/alertBg.png +0 -0
  52. data/lib/generators/kryptonite/update/templates/public/kryptonite/images/login/background.png +0 -0
  53. data/lib/generators/kryptonite/update/templates/public/kryptonite/images/login/bottom.png +0 -0
  54. data/lib/generators/kryptonite/update/templates/public/kryptonite/images/login/loginBoxBg.png +0 -0
  55. data/lib/generators/kryptonite/update/templates/public/kryptonite/images/login/loginBoxBottom.png +0 -0
  56. data/lib/generators/kryptonite/update/templates/public/kryptonite/images/login/loginBoxTop.png +0 -0
  57. data/lib/generators/kryptonite/update/templates/public/kryptonite/images/login/loginSubmit.png +0 -0
  58. data/lib/generators/kryptonite/update/templates/public/kryptonite/images/login/recoverSubmit.png +0 -0
  59. data/lib/generators/kryptonite/update/templates/public/kryptonite/images/login/top.png +0 -0
  60. data/lib/generators/kryptonite/update/templates/public/kryptonite/images/nav.png +0 -0
  61. data/lib/generators/kryptonite/update/templates/public/kryptonite/images/rightNav.png +0 -0
  62. data/lib/generators/kryptonite/update/templates/public/kryptonite/images/rightNavButton.png +0 -0
  63. data/lib/generators/kryptonite/update/templates/public/kryptonite/images/visitSiteNav.png +0 -0
  64. data/lib/generators/kryptonite/update/templates/public/kryptonite/javascripts/jquery.js +154 -0
  65. data/lib/generators/kryptonite/update/templates/public/kryptonite/javascripts/kryptonite.js +25 -0
  66. data/lib/generators/kryptonite/update/templates/public/kryptonite/javascripts/login.js +24 -0
  67. data/lib/generators/kryptonite/update/templates/public/kryptonite/javascripts/rails.js +132 -0
  68. data/lib/generators/kryptonite/update/templates/public/kryptonite/stylesheets/elements.css +307 -0
  69. data/lib/generators/kryptonite/update/templates/public/kryptonite/stylesheets/login.css +137 -0
  70. data/lib/generators/kryptonite/update/templates/public/kryptonite/stylesheets/screen.css +224 -0
  71. data/lib/generators/kryptonite/update/update_generator.rb +40 -0
  72. data/lib/kryptonite.rb +3 -0
  73. data/lib/kryptonite/engine.rb +22 -0
  74. data/lib/railties/tasks.rake +31 -0
  75. 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,8 @@
1
+ module Kryptonite
2
+ class UserSession < ::Authlogic::Session::Base
3
+ include ActiveModel::Conversion
4
+ def persisted?
5
+ false
6
+ end
7
+ end
8
+ 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,12 @@
1
+ Dear <%= @name %>,<br />
2
+ <br />
3
+ A new user account has been created for you at:<br />
4
+ <br />
5
+ <%= @host %>/kryptonite<br />
6
+ <br />
7
+ Login: <%= @login %><br />
8
+ 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 %>