Class User
In: app/models/user.rb
Parent: ActiveRecord::Base

ユーザーのモデル this model expects a certain database layout and its based on the name/login pattern.

Methods

Constants

PasswordDigestClass = Digest::SHA512
CHANGEABLE_FIELDS = []

External Aliases

mail_address -> email

Attributes

password  [RW] 
password_confirmation  [RW] 
password_needs_confirmation  [RW] 

Public Class methods

現在のユーザーがシステム管理者かどうかを判定する。

[Source]

     # File app/models/user.rb, line 199
199:   def self.admin?
200:     if current
201:       return current.admin?
202:     else
203:       return false
204:     end
205:   end

loginpass による認証を行う。 成功した場合は nil でない値、失敗した場合は nil を返す。

[Source]

     # File app/models/user.rb, line 85
 85:   def self.authenticate(login, pass, update_failed_login_count=false)
 86:     User.transaction do
 87:       u = find( :first, :conditions => ["login = ? AND verified = ? AND deleted = ?", login, true, false])
 88:       return nil if u.nil?
 89:       return nil if u.lockout?
 90:       ret = find( :first, :conditions => ["login = ? AND salted_password = ? AND verified = ?", login, salted_password(u.salt, hashed(pass)), true])
 91:       if update_failed_login_count
 92:         if ret
 93:           if u.failed_login_count != 0
 94:             u.failed_login_count = 0
 95:             u.save!
 96:           end
 97:         else
 98:           u.failed_login_count += 1
 99:           u.save!
100:         end
101:       end
102:       return ret
103:     end
104:   end

idtoken による認証を行う。 成功した場合は nil でない値、失敗した場合は nil を返す。

[Source]

     # File app/models/user.rb, line 108
108:   def self.authenticate_by_token(id, token)
109:     # Allow logins for deleted accounts, but only via this method (and
110:     # not the regular authenticate call)
111:     logger.info "Attempting authorization of #{id} with #{token}"
112:     u = find( :first, :conditions => ["id = ? AND security_token = ?", id, token])
113:     if u
114:       logger.info "Authenticated by token: #{u.inspect}"
115:     else
116:       logger.info "Not authenticated" if u.nil?
117:     end
118:     return nil if (u.nil? or u.token_expired?)
119:     u.update_attributes :verified => true, :token_expiry => Clock.now
120:     return u
121:   end

現在のユーザーを返す。

[Source]

     # File app/models/user.rb, line 180
180:   def self.current
181:     CacheEachRequest.current[:user]
182:   end

現在のユーザーを代入する。

[Source]

     # File app/models/user.rb, line 185
185:   def self.current=(u)
186:     CacheEachRequest.current[:user] = u
187:   end

現在のユーザーIDを返す。

[Source]

     # File app/models/user.rb, line 190
190:   def self.current_id
191:     if current
192:       return current.id
193:     else
194:       return nil
195:     end
196:   end

現在のページごとの個数の既定値を返す。

[Source]

     # File app/models/user.rb, line 208
208:   def self.list_default_per_page
209:     return current.list_default_per_page
210:   rescue
211:     return columns_hash["list_default_per_page"].default
212:   end

現在の行ごとの個数の既定値を返す。

[Source]

     # File app/models/user.rb, line 215
215:   def self.list_header_per_line
216:     return current.list_header_per_line
217:   rescue
218:     return columns_hash["list_header_per_line"].default
219:   end

現在のメニュー履歴の最大値を返す。

[Source]

     # File app/models/user.rb, line 222
222:   def self.menu_history_max
223:     return current.menu_history_max
224:   rescue
225:     return columns_hash["menu_history_max"].default
226:   end

[Source]

    # File app/models/user.rb, line 73
73:   def initialize(attributes = nil)
74:     super
75:     @password_needs_confirmation = false
76:   end

Protected Class methods

email からユーザーを探す。

[Source]

     # File app/models/user.rb, line 279
279:   def self.find_by_email(email)
280:     person = Person.find_by_mail_address(email, :include => [:user])
281:     if person
282:       return person.user
283:     else
284:       return nil
285:     end
286:   end

str をハッシュ化する。

[Source]

     # File app/models/user.rb, line 251
251:   def self.hashed(str)
252:     return PasswordDigestClass.hexdigest("#{UserSystem::CONFIG[:password_hash_prefix]}--#{str}--")[0,128]
253:   end

salthashed_password をハッシュ化する。

[Source]

     # File app/models/user.rb, line 274
274:   def self.salted_password(salt, hashed_password)
275:     hashed(salt + hashed_password)
276:   end

Public Instance methods

パスワードを pass に変更する。

[Source]

     # File app/models/user.rb, line 139
139:   def change_password(pass, confirm = nil)
140:     self.password = pass
141:     self.password_confirmation = confirm.nil? ? pass : confirm
142:     @password_needs_confirmation = true
143:   end

token を生成する。

[Source]

     # File app/models/user.rb, line 129
129:   def generate_security_token
130:     if self.security_token.nil? or self.token_expiry.nil? or (Clock.now.to_i + token_lifetime / 2) >= self.token_expiry.to_i
131:       token = new_security_token
132:       return token
133:     else
134:       return self.security_token
135:     end
136:   end

ユーザの言語のコード。

[Source]

     # File app/models/user.rb, line 229
229:   def lang
230:     code = GetText.locale.to_s[0,2]
231:     code ||= person.last_language
232:     code ||= Language.default_code
233:     return code
234:   end

ログイン資格が失効していれば true、さもなくば false を返す。

[Source]

     # File app/models/user.rb, line 174
174:   def lockout?
175:     return false unless config_password.enable_lockout?
176:     return failed_login_count >= config_password.lockout_threshold
177:   end

パスワードの有効期限が切れていれば true、さもなくば false を返す。

[Source]

     # File app/models/user.rb, line 163
163:   def password_expire?
164:     unless config_password
165:       raise ArgumentError, s_("ArgumentError|invalid domain")
166:     end
167:     if config_password.enable_max_age?
168:       return Date.today >= password_updated_on + config_password.max_age
169:     end
170:     return false
171:   end

パスワードが更新された時刻を返す。

[Source]

     # File app/models/user.rb, line 151
151:   def password_updated_on
152:     str = read_attribute("password_updated_on")
153:     if /\A(\d{4})(\d\d)(\d\d)\z/ =~ str
154:       return Date.new(*$~.captures.map(&:to_i))
155:     elsif str.nil?
156:       return nil
157:     else
158:       raise ArgumentError, "invalid password_updated_on #{str.inspect}"
159:     end
160:   end

文字列として login を返す。

[Source]

    # File app/models/user.rb, line 79
79:   def to_s
80:     login
81:   end

token が期限切れかどうかを判定する。

[Source]

     # File app/models/user.rb, line 124
124:   def token_expired?
125:     self.security_token and self.token_expiry and (Clock.now >= self.token_expiry)
126:   end

token の生存時間を秒単位で返す。

[Source]

     # File app/models/user.rb, line 146
146:   def token_lifetime
147:     UserSystem::CONFIG[:security_token_life_hours] * 60 * 60
148:   end

ユーザーの言語の翻訳のクラス。

[Source]

     # File app/models/user.rb, line 237
237:   def translation_class
238:     "PoTranslation#{lang.camelize}".constantize
239:   end

Protected Instance methods

パスワードを暗号化する。

[Source]

     # File app/models/user.rb, line 256
256:   def crypt_password
257:     if @password_needs_confirmation
258:       write_attribute("salt", self.class.hashed("salt-#{Clock.now}.#{Clock.now.usec}"))
259:       write_attribute("salted_password", self.class.salted_password(salt, self.class.hashed(@password)))
260:       write_attribute("password_updated_on", Time.now.utc.strftime("%Y%m%d"))
261:     end
262:   end

新しい token を返す。

[Source]

     # File app/models/user.rb, line 265
265:   def new_security_token
266:     expiry = Time.at(Clock.now.to_i + token_lifetime)
267:     write_attribute('security_token', self.class.hashed(self.salted_password + Clock.now.to_i.to_s + rand.to_s))
268:     write_attribute('token_expiry', expiry)
269:     update_without_callbacks
270:     return self.security_token
271:   end

パスワードを検証する必要があるかどうかを返す。

[Source]

     # File app/models/user.rb, line 246
246:   def validate_password?
247:     @password_needs_confirmation
248:   end

[Validate]