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

admin? authenticate authenticate_by_token change_password crypt_password current current= current_id find_by_email generate_security_token hashed lang list_default_per_page list_header_per_line lockout? menu_history_max new new_security_token password_expire? password_updated_on salted_password to_s token_expired? token_lifetime translation_class validate_password?

### Constants

PasswordDigestClass | = | Digest::SHA512
CHANGEABLE_FIELDS | = | []

### External Aliases

mail_address | -> | email

### Attributes

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

### Public Class methods

admin?()

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

[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

authenticate(login, pass, update_failed_login_count=false)

login と pass による認証を行う。 成功した場合は `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

authenticate_by_token(id, token)

id と token による認証を行う。 成功した場合は `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

current()

現在のユーザーを返す。

[Source]

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

current=(u)

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

[Source]

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

current_id()

現在のユーザー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

list_default_per_page()

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

[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

list_header_per_line()

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

[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

menu_history_max()

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

[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

new(attributes = nil)

[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

find_by_email(email)

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

hashed(str)

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

salted_password(salt, hashed_password)

salt と hashed_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

change_password(pass, confirm = nil)

パスワードを 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

generate_security_token()

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

lang()

ユーザの言語のコード。

[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

lockout?()

ログイン資格が失効していれば 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

password_expire?()

パスワードの有効期限が切れていれば 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

password_updated_on()

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

[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

to_s()

文字列として `login` を返す。

[Source]

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

token_expired?()

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_lifetime()

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

[Source]

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

translation_class()

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

[Source]

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

### Protected Instance methods

crypt_password()

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

[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

new_security_token()

新しい 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

validate_password?()

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

[Source]

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

[Validate]