X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/d6e9200cc35411f3f27426b608bcfdef9348e6d3..c4d23d02ec5a26d09d389dcf7b8928ecd5798ccc:/filters/simple-authentication.lua diff --git a/filters/simple-authentication.lua b/filters/simple-authentication.lua index 4cd4983..596c041 100644 --- a/filters/simple-authentication.lua +++ b/filters/simple-authentication.lua @@ -12,17 +12,27 @@ -- -- +-- A list of password protected repositories along with the users who can access them. local protected_repos = { glouglou = { laurent = true, jason = true }, qt = { jason = true, bob = true } } +-- Please note that, in production, you'll want to replace this simple lookup +-- table with either a table of salted and hashed passwords (using something +-- smart like scrypt), or replace this table lookup with an external support, +-- such as consulting your system's pam / shadow system, or an external +-- database, or an external validating web service. For testing, or for +-- extremely low-security usage, you may be able, however, to get away with +-- compromising on hardcoding the passwords in cleartext, as we have done here. local users = { jason = "secretpassword", laurent = "s3cr3t", bob = "ilikelua" } +-- All cookies will be authenticated based on this secret. Make it something +-- totally random and impossible to guess. It should be large. local secret = "BE SURE TO CUSTOMIZE THIS STRING TO SOMETHING BIG AND RANDOM" @@ -33,15 +43,28 @@ local secret = "BE SURE TO CUSTOMIZE THIS STRING TO SOMETHING BIG AND RANDOM" -- -- --- Sets HTTP cookie headers based on post +-- Sets HTTP cookie headers based on post and sets up redirection. function authenticate_post() local password = users[post["username"]] - -- TODO: Implement time invariant string comparison function to mitigate against timing attack. + local redirect = validate_value("redirect", post["redirect"]) + + if redirect == nil then + not_found() + return 0 + end + + redirect_to(redirect) + + -- Lua hashes strings, so these comparisons are time invariant. if password == nil or password ~= post["password"] then - construct_cookie("", "cgitauth") + set_cookie("cgitauth", "") else - construct_cookie(post["username"], "cgitauth") + -- One week expiration time + local username = secure_value("username", post["username"], os.time() + 604800) + set_cookie("cgitauth", username) end + + html("\n") return 0 end @@ -54,8 +77,8 @@ function authenticate_cookie() return 1 end - local username = validate_cookie(get_cookie(http["cookie"], "cgitauth")) - if username == nil or not accepted_users[username] then + local username = validate_value("username", get_cookie(http["cookie"], "cgitauth")) + if username == nil or not accepted_users[username:lower()] then return 0 else return 1 @@ -68,6 +91,9 @@ function body() html("