diff options
author | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2013-09-17 02:31:25 +0300 |
---|---|---|
committer | Kaarle Ritvanen <kaarle.ritvanen@datakunkku.fi> | 2013-09-17 02:31:25 +0300 |
commit | 3cddbe8043e3e8aad410594c7e4466e7caeb8b41 (patch) | |
tree | c2971117e1a7dfa6f9e8174d4f41cc1239e06b77 /acf | |
parent | 5467f2ddadeaaf74dfb2109d53c4d5be9f275f20 (diff) | |
download | aconf-3cddbe8043e3e8aad410594c7e4466e7caeb8b41.tar.bz2 aconf-3cddbe8043e3e8aad410594c7e4466e7caeb8b41.tar.xz |
hashed passwords
Diffstat (limited to 'acf')
-rw-r--r-- | acf/model/aaa.lua | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/acf/model/aaa.lua b/acf/model/aaa.lua index d51c10f..8dea542 100644 --- a/acf/model/aaa.lua +++ b/acf/model/aaa.lua @@ -4,18 +4,50 @@ See LICENSE file for license details --]] local M = require('acf.model') +local object = require('acf.object') + +local digest = require('crypto').digest + Role = M.new() Role.permissions = M.Set{type=M.Reference{scope='../../../permissions'}} +local function hash_password(algorithm, salt, password) + return algorithm..'$'..salt..'$'..digest(algorithm, salt..password) +end + +local hash_pattern = '^(%w+)%$(%w+)%$%x+$' + + +local Password = object.class(M.String) + +function Password:_validate(context, value) + value = object.super(self, M.String):_validate(context, value) + if value:find(hash_pattern) then return value end + + local salt = '' + for i = 1,12 do + local c = math.random(48, 109) + if c > 57 then c = c + 7 end + if c > 90 then c = c + 6 end + salt = salt..string.char(c) + end + return hash_password('sha256', salt, value) +end + + User = M.new() -User.password = M.String +User.password = Password User['real-name'] = M.String User.superuser = M.Boolean{default=false} User.roles = M.Set{type=M.Reference{scope='../../../roles'}} -function User:check_password(password) return password == self.password end +function User:check_password(password) + local _, _, algorithm, salt = self.password:find(hash_pattern) + if not salt then return false end + return hash_password(algorithm, salt, password) == self.password +end function User:check_permission(permission) -- TODO audit trail |