kryptonite 0.0.1

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.
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 %>