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