liquid_feedback_frontend
diff model/session.lua @ 1309:32cc544d5a5b
Cumulative patch for upcoming frontend version 4
author | bsw/jbe |
---|---|
date | Sun Jul 15 14:07:29 2018 +0200 (2018-07-15) |
parents | aefef1556d55 |
children | 3e9b0f1adec3 |
line diff
1.1 --- a/model/session.lua Thu Jun 23 03:30:57 2016 +0200 1.2 +++ b/model/session.lua Sun Jul 15 14:07:29 2018 +0200 1.3 @@ -10,21 +10,57 @@ 1.4 ref = 'member', 1.5 } 1.6 1.7 -local function random_string() 1.8 +Session:add_reference{ 1.9 + mode = 'm1', 1.10 + to = "Member", 1.11 + this_key = 'real_member_id', 1.12 + that_key = 'id', 1.13 + ref = 'real_member', 1.14 +} 1.15 + 1.16 +local secret_length = 24 1.17 +local secret_alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' 1.18 +local secret_purposes = { "oauth", "csrf", "_other" } 1.19 +for idx, purpose in ipairs(secret_purposes) do 1.20 + secret_purposes[purpose] = idx 1.21 +end 1.22 + 1.23 +local function random_string(length_multiplier) 1.24 return multirand.string( 1.25 - 32, 1.26 - '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' 1.27 + secret_length * (length_multiplier or 1), 1.28 + secret_alphabet 1.29 ) 1.30 end 1.31 1.32 function Session:new() 1.33 local session = self.prototype.new(self) -- super call 1.34 session.ident = random_string() 1.35 - session.additional_secret = random_string() 1.36 - session:save() 1.37 + session.additional_secret = random_string(#secret_purposes) 1.38 + session:save() 1.39 return session 1.40 end 1.41 1.42 +function Session.object:additional_secret_for(purpose) 1.43 + local use_hash = false 1.44 + local idx = secret_purposes[purpose] 1.45 + if not idx then 1.46 + idx = assert(secret_purposes._other, "No other secrets supported") 1.47 + use_hash = true 1.48 + end 1.49 + local from_pos = secret_length * (idx-1) + 1 1.50 + local to_pos = from_pos + secret_length - 1 1.51 + local secret = string.sub(self.additional_secret, from_pos, to_pos) 1.52 + if #secret ~= secret_length then 1.53 + self:destroy() 1.54 + error("Session state invalid") 1.55 + end 1.56 + if use_hash then 1.57 + local moonhash = require "moonhash" -- TODO: auto loader for libraries in WebMCP? 1.58 + secret = moonhash.shake256(secret .. "\0" .. purpose, secret_length, secret_alphabet) 1.59 + end 1.60 + return secret 1.61 +end 1.62 + 1.63 function Session:by_ident(ident) 1.64 local selector = self:new_selector() 1.65 selector:add_where{ 'ident = ?', ident }