##// END OF EJS Templates
Hooked up on the fly OpenID user creation....
Eric Davis -
r2382:0310f43126ac
parent child
Show More
@@ -1,235 +1,235
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2008 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class AccountController < ApplicationController
19 19 helper :custom_fields
20 20 include CustomFieldsHelper
21 21
22 22 # prevents login action to be filtered by check_if_login_required application scope filter
23 23 skip_before_filter :check_if_login_required, :only => [:login, :lost_password, :register, :activate]
24 24
25 25 # Show user's account
26 26 def show
27 27 @user = User.active.find(params[:id])
28 28 @custom_values = @user.custom_values
29 29
30 30 # show only public projects and private projects that the logged in user is also a member of
31 31 @memberships = @user.memberships.select do |membership|
32 32 membership.project.is_public? || (User.current.member_of?(membership.project))
33 33 end
34 34
35 35 events = Redmine::Activity::Fetcher.new(User.current, :author => @user).events(nil, nil, :limit => 10)
36 36 @events_by_day = events.group_by(&:event_date)
37 37
38 38 rescue ActiveRecord::RecordNotFound
39 39 render_404
40 40 end
41 41
42 42 # Login request and validation
43 43 def login
44 44 if request.get?
45 45 # Logout user
46 46 self.logged_user = nil
47 47 else
48 48 # Authenticate user
49 49 unless using_open_id?
50 50 password_authentication
51 51 else
52 52 open_id_authenticate(params[:openid_url])
53 53 end
54 54 end
55 55 end
56 56
57 57 # Log out current user and redirect to welcome page
58 58 def logout
59 59 cookies.delete :autologin
60 60 Token.delete_all(["user_id = ? AND action = ?", User.current.id, 'autologin']) if User.current.logged?
61 61 self.logged_user = nil
62 62 redirect_to home_url
63 63 end
64 64
65 65 # Enable user to choose a new password
66 66 def lost_password
67 67 redirect_to(home_url) && return unless Setting.lost_password?
68 68 if params[:token]
69 69 @token = Token.find_by_action_and_value("recovery", params[:token])
70 70 redirect_to(home_url) && return unless @token and !@token.expired?
71 71 @user = @token.user
72 72 if request.post?
73 73 @user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation]
74 74 if @user.save
75 75 @token.destroy
76 76 flash[:notice] = l(:notice_account_password_updated)
77 77 redirect_to :action => 'login'
78 78 return
79 79 end
80 80 end
81 81 render :template => "account/password_recovery"
82 82 return
83 83 else
84 84 if request.post?
85 85 user = User.find_by_mail(params[:mail])
86 86 # user not found in db
87 87 flash.now[:error] = l(:notice_account_unknown_email) and return unless user
88 88 # user uses an external authentification
89 89 flash.now[:error] = l(:notice_can_t_change_password) and return if user.auth_source_id
90 90 # create a new token for password recovery
91 91 token = Token.new(:user => user, :action => "recovery")
92 92 if token.save
93 93 Mailer.deliver_lost_password(token)
94 94 flash[:notice] = l(:notice_account_lost_email_sent)
95 95 redirect_to :action => 'login'
96 96 return
97 97 end
98 98 end
99 99 end
100 100 end
101 101
102 102 # User self-registration
103 103 def register
104 104 redirect_to(home_url) && return unless Setting.self_registration? || session[:auth_source_registration]
105 105 if request.get?
106 106 session[:auth_source_registration] = nil
107 107 @user = User.new(:language => Setting.default_language)
108 108 else
109 109 @user = User.new(params[:user])
110 110 @user.admin = false
111 111 @user.status = User::STATUS_REGISTERED
112 112 if session[:auth_source_registration]
113 113 @user.status = User::STATUS_ACTIVE
114 114 @user.login = session[:auth_source_registration][:login]
115 115 @user.auth_source_id = session[:auth_source_registration][:auth_source_id]
116 116 if @user.save
117 117 session[:auth_source_registration] = nil
118 118 self.logged_user = @user
119 119 flash[:notice] = l(:notice_account_activated)
120 120 redirect_to :controller => 'my', :action => 'account'
121 121 end
122 122 else
123 123 @user.login = params[:user][:login]
124 124 @user.password, @user.password_confirmation = params[:password], params[:password_confirmation]
125 125 case Setting.self_registration
126 126 when '1'
127 127 # Email activation
128 128 token = Token.new(:user => @user, :action => "register")
129 129 if @user.save and token.save
130 130 Mailer.deliver_register(token)
131 131 flash[:notice] = l(:notice_account_register_done)
132 132 redirect_to :action => 'login'
133 133 end
134 134 when '3'
135 135 # Automatic activation
136 136 @user.status = User::STATUS_ACTIVE
137 137 if @user.save
138 138 self.logged_user = @user
139 139 flash[:notice] = l(:notice_account_activated)
140 140 redirect_to :controller => 'my', :action => 'account'
141 141 end
142 142 else
143 143 # Manual activation by the administrator
144 144 if @user.save
145 145 # Sends an email to the administrators
146 146 Mailer.deliver_account_activation_request(@user)
147 147 flash[:notice] = l(:notice_account_pending)
148 148 redirect_to :action => 'login'
149 149 end
150 150 end
151 151 end
152 152 end
153 153 end
154 154
155 155 # Token based account activation
156 156 def activate
157 157 redirect_to(home_url) && return unless Setting.self_registration? && params[:token]
158 158 token = Token.find_by_action_and_value('register', params[:token])
159 159 redirect_to(home_url) && return unless token and !token.expired?
160 160 user = token.user
161 161 redirect_to(home_url) && return unless user.status == User::STATUS_REGISTERED
162 162 user.status = User::STATUS_ACTIVE
163 163 if user.save
164 164 token.destroy
165 165 flash[:notice] = l(:notice_account_activated)
166 166 end
167 167 redirect_to :action => 'login'
168 168 end
169 169
170 170 private
171 171 def logged_user=(user)
172 172 if user && user.is_a?(User)
173 173 User.current = user
174 174 session[:user_id] = user.id
175 175 else
176 176 User.current = User.anonymous
177 177 session[:user_id] = nil
178 178 end
179 179 end
180 180
181 181 def password_authentication
182 182 user = User.try_to_login(params[:username], params[:password])
183 183 if user.nil?
184 184 # Invalid credentials
185 185 flash.now[:error] = l(:notice_account_invalid_creditentials)
186 186 elsif user.new_record?
187 187 # Onthefly creation failed, display the registration form to fill/fix attributes
188 188 @user = user
189 189 session[:auth_source_registration] = {:login => user.login, :auth_source_id => user.auth_source_id }
190 190 render :action => 'register'
191 191 else
192 192 # Valid user
193 193 successful_authentication(user)
194 194 end
195 195 end
196 196
197 197
198 198 def open_id_authenticate(openid_url)
199 user = nil
200 199 authenticate_with_open_id(openid_url, :required => [:nickname, :fullname, :email], :return_to => signin_url) do |result, identity_url, registration|
201 200 if result.successful?
202 201 user = User.find_or_initialize_by_identity_url(identity_url)
203 202 if user.new_record?
204 203 # Create on the fly
205 # TODO: name
206 204 user.login = registration['nickname']
207 205 user.mail = registration['email']
208 user.save
209 end
210
211 user.reload
212 if user.new_record?
206 user.firstname, user.lastname = registration['fullname'].split(' ')
207 user.random_password
208 if user.save
209 successful_authentication(user)
210 else
213 211 # Onthefly creation failed, display the registration form to fill/fix attributes
214 212 @user = user
215 213 session[:auth_source_registration] = {:login => user.login, :identity_url => identity_url }
216 214 render :action => 'register'
215 end
217 216 else
217 # Existing record
218 218 successful_authentication(user)
219 219 end
220 220 end
221 221 end
222 222 end
223 223
224 224 def successful_authentication(user)
225 225 # Valid user
226 226 self.logged_user = user
227 227 # generate a key and set cookie if autologin
228 228 if params[:autologin] && Setting.autologin?
229 229 token = Token.create(:user => user, :action => 'autologin')
230 230 cookies[:autologin] = { :value => token.value, :expires => 1.year.from_now }
231 231 end
232 232 redirect_back_or_default :controller => 'my', :action => 'page'
233 233 end
234 234
235 235 end
@@ -1,294 +1,306
1 1 # redMine - project management software
2 2 # Copyright (C) 2006-2007 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 require "digest/sha1"
19 19
20 20 class User < ActiveRecord::Base
21 21
22 22 # Account statuses
23 23 STATUS_ANONYMOUS = 0
24 24 STATUS_ACTIVE = 1
25 25 STATUS_REGISTERED = 2
26 26 STATUS_LOCKED = 3
27 27
28 28 USER_FORMATS = {
29 29 :firstname_lastname => '#{firstname} #{lastname}',
30 30 :firstname => '#{firstname}',
31 31 :lastname_firstname => '#{lastname} #{firstname}',
32 32 :lastname_coma_firstname => '#{lastname}, #{firstname}',
33 33 :username => '#{login}'
34 34 }
35 35
36 36 has_many :memberships, :class_name => 'Member', :include => [ :project, :role ], :conditions => "#{Project.table_name}.status=#{Project::STATUS_ACTIVE}", :order => "#{Project.table_name}.name"
37 37 has_many :members, :dependent => :delete_all
38 38 has_many :projects, :through => :memberships
39 39 has_many :issue_categories, :foreign_key => 'assigned_to_id', :dependent => :nullify
40 40 has_many :changesets, :dependent => :nullify
41 41 has_one :preference, :dependent => :destroy, :class_name => 'UserPreference'
42 42 has_one :rss_token, :dependent => :destroy, :class_name => 'Token', :conditions => "action='feeds'"
43 43 belongs_to :auth_source
44 44
45 45 # Active non-anonymous users scope
46 46 named_scope :active, :conditions => "#{User.table_name}.status = #{STATUS_ACTIVE}"
47 47
48 48 acts_as_customizable
49 49
50 50 attr_accessor :password, :password_confirmation
51 51 attr_accessor :last_before_login_on
52 52 # Prevents unauthorized assignments
53 53 attr_protected :login, :admin, :password, :password_confirmation, :hashed_password
54 54
55 55 validates_presence_of :login, :firstname, :lastname, :mail, :if => Proc.new { |user| !user.is_a?(AnonymousUser) }
56 56 validates_uniqueness_of :login, :if => Proc.new { |user| !user.login.blank? }
57 57 validates_uniqueness_of :mail, :if => Proc.new { |user| !user.mail.blank? }, :case_sensitive => false
58 58 # Login must contain lettres, numbers, underscores only
59 59 validates_format_of :login, :with => /^[a-z0-9_\-@\.]*$/i
60 60 validates_length_of :login, :maximum => 30
61 61 validates_format_of :firstname, :lastname, :with => /^[\w\s\'\-\.]*$/i
62 62 validates_length_of :firstname, :lastname, :maximum => 30
63 63 validates_format_of :mail, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i, :allow_nil => true
64 64 validates_length_of :mail, :maximum => 60, :allow_nil => true
65 65 validates_length_of :password, :minimum => 4, :allow_nil => true
66 66 validates_confirmation_of :password, :allow_nil => true
67 67
68 68 def before_create
69 69 self.mail_notification = false
70 70 true
71 71 end
72 72
73 73 def before_save
74 74 # update hashed_password if password was set
75 75 self.hashed_password = User.hash_password(self.password) if self.password
76 76 end
77 77
78 78 def reload(*args)
79 79 @name = nil
80 80 super
81 81 end
82 82
83 83 # Returns the user that matches provided login and password, or nil
84 84 def self.try_to_login(login, password)
85 85 # Make sure no one can sign in with an empty password
86 86 return nil if password.to_s.empty?
87 87 user = find(:first, :conditions => ["login=?", login])
88 88 if user
89 89 # user is already in local database
90 90 return nil if !user.active?
91 91 if user.auth_source
92 92 # user has an external authentication method
93 93 return nil unless user.auth_source.authenticate(login, password)
94 94 else
95 95 # authentication with local password
96 96 return nil unless User.hash_password(password) == user.hashed_password
97 97 end
98 98 else
99 99 # user is not yet registered, try to authenticate with available sources
100 100 attrs = AuthSource.authenticate(login, password)
101 101 if attrs
102 102 user = new(*attrs)
103 103 user.login = login
104 104 user.language = Setting.default_language
105 105 if user.save
106 106 user.reload
107 107 logger.info("User '#{user.login}' created from the LDAP") if logger
108 108 end
109 109 end
110 110 end
111 111 user.update_attribute(:last_login_on, Time.now) if user && !user.new_record?
112 112 user
113 113 rescue => text
114 114 raise text
115 115 end
116 116
117 117 # Return user's full name for display
118 118 def name(formatter = nil)
119 119 if formatter
120 120 eval('"' + (USER_FORMATS[formatter] || USER_FORMATS[:firstname_lastname]) + '"')
121 121 else
122 122 @name ||= eval('"' + (USER_FORMATS[Setting.user_format] || USER_FORMATS[:firstname_lastname]) + '"')
123 123 end
124 124 end
125 125
126 126 def active?
127 127 self.status == STATUS_ACTIVE
128 128 end
129 129
130 130 def registered?
131 131 self.status == STATUS_REGISTERED
132 132 end
133 133
134 134 def locked?
135 135 self.status == STATUS_LOCKED
136 136 end
137 137
138 138 def check_password?(clear_password)
139 139 User.hash_password(clear_password) == self.hashed_password
140 140 end
141 141
142 # Generate and set a random password. Useful for automated user creation
143 # Based on Token#generate_token_value
144 #
145 def random_password
146 chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a
147 password = ''
148 40.times { |i| password << chars[rand(chars.size-1)] }
149 self.password = password
150 self.password_confirmation = password
151 self
152 end
153
142 154 def pref
143 155 self.preference ||= UserPreference.new(:user => self)
144 156 end
145 157
146 158 def time_zone
147 159 @time_zone ||= (self.pref.time_zone.blank? ? nil : ActiveSupport::TimeZone[self.pref.time_zone])
148 160 end
149 161
150 162 def wants_comments_in_reverse_order?
151 163 self.pref[:comments_sorting] == 'desc'
152 164 end
153 165
154 166 # Return user's RSS key (a 40 chars long string), used to access feeds
155 167 def rss_key
156 168 token = self.rss_token || Token.create(:user => self, :action => 'feeds')
157 169 token.value
158 170 end
159 171
160 172 # Return an array of project ids for which the user has explicitly turned mail notifications on
161 173 def notified_projects_ids
162 174 @notified_projects_ids ||= memberships.select {|m| m.mail_notification?}.collect(&:project_id)
163 175 end
164 176
165 177 def notified_project_ids=(ids)
166 178 Member.update_all("mail_notification = #{connection.quoted_false}", ['user_id = ?', id])
167 179 Member.update_all("mail_notification = #{connection.quoted_true}", ['user_id = ? AND project_id IN (?)', id, ids]) if ids && !ids.empty?
168 180 @notified_projects_ids = nil
169 181 notified_projects_ids
170 182 end
171 183
172 184 def self.find_by_rss_key(key)
173 185 token = Token.find_by_value(key)
174 186 token && token.user.active? ? token.user : nil
175 187 end
176 188
177 189 def self.find_by_autologin_key(key)
178 190 token = Token.find_by_action_and_value('autologin', key)
179 191 token && (token.created_on > Setting.autologin.to_i.day.ago) && token.user.active? ? token.user : nil
180 192 end
181 193
182 194 # Makes find_by_mail case-insensitive
183 195 def self.find_by_mail(mail)
184 196 find(:first, :conditions => ["LOWER(mail) = ?", mail.to_s.downcase])
185 197 end
186 198
187 199 # Sort users by their display names
188 200 def <=>(user)
189 201 self.to_s.downcase <=> user.to_s.downcase
190 202 end
191 203
192 204 def to_s
193 205 name
194 206 end
195 207
196 208 def logged?
197 209 true
198 210 end
199 211
200 212 def anonymous?
201 213 !logged?
202 214 end
203 215
204 216 # Return user's role for project
205 217 def role_for_project(project)
206 218 # No role on archived projects
207 219 return nil unless project && project.active?
208 220 if logged?
209 221 # Find project membership
210 222 membership = memberships.detect {|m| m.project_id == project.id}
211 223 if membership
212 224 membership.role
213 225 else
214 226 @role_non_member ||= Role.non_member
215 227 end
216 228 else
217 229 @role_anonymous ||= Role.anonymous
218 230 end
219 231 end
220 232
221 233 # Return true if the user is a member of project
222 234 def member_of?(project)
223 235 role_for_project(project).member?
224 236 end
225 237
226 238 # Return true if the user is allowed to do the specified action on project
227 239 # action can be:
228 240 # * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit')
229 241 # * a permission Symbol (eg. :edit_project)
230 242 def allowed_to?(action, project, options={})
231 243 if project
232 244 # No action allowed on archived projects
233 245 return false unless project.active?
234 246 # No action allowed on disabled modules
235 247 return false unless project.allows_to?(action)
236 248 # Admin users are authorized for anything else
237 249 return true if admin?
238 250
239 251 role = role_for_project(project)
240 252 return false unless role
241 253 role.allowed_to?(action) && (project.is_public? || role.member?)
242 254
243 255 elsif options[:global]
244 256 # authorize if user has at least one role that has this permission
245 257 roles = memberships.collect {|m| m.role}.uniq
246 258 roles.detect {|r| r.allowed_to?(action)} || (self.logged? ? Role.non_member.allowed_to?(action) : Role.anonymous.allowed_to?(action))
247 259 else
248 260 false
249 261 end
250 262 end
251 263
252 264 def self.current=(user)
253 265 @current_user = user
254 266 end
255 267
256 268 def self.current
257 269 @current_user ||= User.anonymous
258 270 end
259 271
260 272 def self.anonymous
261 273 anonymous_user = AnonymousUser.find(:first)
262 274 if anonymous_user.nil?
263 275 anonymous_user = AnonymousUser.create(:lastname => 'Anonymous', :firstname => '', :mail => '', :login => '', :status => 0)
264 276 raise 'Unable to create the anonymous user.' if anonymous_user.new_record?
265 277 end
266 278 anonymous_user
267 279 end
268 280
269 281 private
270 282 # Return password digest
271 283 def self.hash_password(clear_password)
272 284 Digest::SHA1.hexdigest(clear_password || "")
273 285 end
274 286 end
275 287
276 288 class AnonymousUser < User
277 289
278 290 def validate_on_create
279 291 # There should be only one AnonymousUser in the database
280 292 errors.add_to_base 'An anonymous user already exists.' if AnonymousUser.find(:first)
281 293 end
282 294
283 295 def available_custom_fields
284 296 []
285 297 end
286 298
287 299 # Overrides a few properties
288 300 def logged?; false end
289 301 def admin; false end
290 302 def name; 'Anonymous' end
291 303 def mail; nil end
292 304 def time_zone; nil end
293 305 def rss_key; nil end
294 306 end
@@ -1,180 +1,187
1 1 # redMine - project management software
2 2 # Copyright (C) 2006 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 require File.dirname(__FILE__) + '/../test_helper'
19 19
20 20 class UserTest < Test::Unit::TestCase
21 21 fixtures :users, :members, :projects
22 22
23 23 def setup
24 24 @admin = User.find(1)
25 25 @jsmith = User.find(2)
26 26 @dlopper = User.find(3)
27 27 end
28 28
29 29 def test_truth
30 30 assert_kind_of User, @jsmith
31 31 end
32 32
33 33 def test_create
34 34 user = User.new(:firstname => "new", :lastname => "user", :mail => "newuser@somenet.foo")
35 35
36 36 user.login = "jsmith"
37 37 user.password, user.password_confirmation = "password", "password"
38 38 # login uniqueness
39 39 assert !user.save
40 40 assert_equal 1, user.errors.count
41 41
42 42 user.login = "newuser"
43 43 user.password, user.password_confirmation = "passwd", "password"
44 44 # password confirmation
45 45 assert !user.save
46 46 assert_equal 1, user.errors.count
47 47
48 48 user.password, user.password_confirmation = "password", "password"
49 49 assert user.save
50 50 end
51 51
52 52 def test_mail_uniqueness_should_not_be_case_sensitive
53 53 u = User.new(:firstname => "new", :lastname => "user", :mail => "newuser@somenet.foo")
54 54 u.login = 'newuser1'
55 55 u.password, u.password_confirmation = "password", "password"
56 56 assert u.save
57 57
58 58 u = User.new(:firstname => "new", :lastname => "user", :mail => "newUser@Somenet.foo")
59 59 u.login = 'newuser2'
60 60 u.password, u.password_confirmation = "password", "password"
61 61 assert !u.save
62 62 assert_equal 'activerecord_error_taken', u.errors.on(:mail)
63 63 end
64 64
65 65 def test_update
66 66 assert_equal "admin", @admin.login
67 67 @admin.login = "john"
68 68 assert @admin.save, @admin.errors.full_messages.join("; ")
69 69 @admin.reload
70 70 assert_equal "john", @admin.login
71 71 end
72 72
73 73 def test_destroy
74 74 User.find(2).destroy
75 75 assert_nil User.find_by_id(2)
76 76 assert Member.find_all_by_user_id(2).empty?
77 77 end
78 78
79 79 def test_validate
80 80 @admin.login = ""
81 81 assert !@admin.save
82 82 assert_equal 1, @admin.errors.count
83 83 end
84 84
85 85 def test_password
86 86 user = User.try_to_login("admin", "admin")
87 87 assert_kind_of User, user
88 88 assert_equal "admin", user.login
89 89 user.password = "hello"
90 90 assert user.save
91 91
92 92 user = User.try_to_login("admin", "hello")
93 93 assert_kind_of User, user
94 94 assert_equal "admin", user.login
95 95 assert_equal User.hash_password("hello"), user.hashed_password
96 96 end
97 97
98 98 def test_name_format
99 99 assert_equal 'Smith, John', @jsmith.name(:lastname_coma_firstname)
100 100 Setting.user_format = :firstname_lastname
101 101 assert_equal 'John Smith', @jsmith.reload.name
102 102 Setting.user_format = :username
103 103 assert_equal 'jsmith', @jsmith.reload.name
104 104 end
105 105
106 106 def test_lock
107 107 user = User.try_to_login("jsmith", "jsmith")
108 108 assert_equal @jsmith, user
109 109
110 110 @jsmith.status = User::STATUS_LOCKED
111 111 assert @jsmith.save
112 112
113 113 user = User.try_to_login("jsmith", "jsmith")
114 114 assert_equal nil, user
115 115 end
116 116
117 117 def test_create_anonymous
118 118 AnonymousUser.delete_all
119 119 anon = User.anonymous
120 120 assert !anon.new_record?
121 121 assert_kind_of AnonymousUser, anon
122 122 end
123 123
124 124 def test_rss_key
125 125 assert_nil @jsmith.rss_token
126 126 key = @jsmith.rss_key
127 127 assert_equal 40, key.length
128 128
129 129 @jsmith.reload
130 130 assert_equal key, @jsmith.rss_key
131 131 end
132 132
133 133 def test_role_for_project
134 134 # user with a role
135 135 role = @jsmith.role_for_project(Project.find(1))
136 136 assert_kind_of Role, role
137 137 assert_equal "Manager", role.name
138 138
139 139 # user with no role
140 140 assert !@dlopper.role_for_project(Project.find(2)).member?
141 141 end
142 142
143 143 def test_mail_notification_all
144 144 @jsmith.mail_notification = true
145 145 @jsmith.notified_project_ids = []
146 146 @jsmith.save
147 147 @jsmith.reload
148 148 assert @jsmith.projects.first.recipients.include?(@jsmith.mail)
149 149 end
150 150
151 151 def test_mail_notification_selected
152 152 @jsmith.mail_notification = false
153 153 @jsmith.notified_project_ids = [1]
154 154 @jsmith.save
155 155 @jsmith.reload
156 156 assert Project.find(1).recipients.include?(@jsmith.mail)
157 157 end
158 158
159 159 def test_mail_notification_none
160 160 @jsmith.mail_notification = false
161 161 @jsmith.notified_project_ids = []
162 162 @jsmith.save
163 163 @jsmith.reload
164 164 assert !@jsmith.projects.first.recipients.include?(@jsmith.mail)
165 165 end
166 166
167 167 def test_comments_sorting_preference
168 168 assert !@jsmith.wants_comments_in_reverse_order?
169 169 @jsmith.pref.comments_sorting = 'asc'
170 170 assert !@jsmith.wants_comments_in_reverse_order?
171 171 @jsmith.pref.comments_sorting = 'desc'
172 172 assert @jsmith.wants_comments_in_reverse_order?
173 173 end
174 174
175 175 def test_find_by_mail_should_be_case_insensitive
176 176 u = User.find_by_mail('JSmith@somenet.foo')
177 177 assert_not_nil u
178 178 assert_equal 'jsmith@somenet.foo', u.mail
179 179 end
180
181 def test_random_password
182 u = User.new
183 u.random_password
184 assert !u.password.blank?
185 assert !u.password_confirmation.blank?
186 end
180 187 end
General Comments 0
You need to be logged in to leave comments. Login now