updates and cleanup.

This commit is contained in:
2026-09-24 18:49:34 +01:00
parent 1e27d7629f
commit 8823fa808a
9 changed files with 115 additions and 71 deletions
+43 -52
View File
@@ -3,6 +3,36 @@ class Sessions
def initialize(request, response)
@request = request
@response = response
@session = load_session
end
def save
compressed = Zlib::Deflate.deflate(JSON.generate(@session))
encoded = Base64.strict_encode64(compressed)
@response.set_cookie(
"session",
value: encoded,
path: "/",
expires: Time.now + 360 * 24 * 60 * 60,
httponly: true,
secure: ENV["ENV"] == "prod",
samesite: :strict
)
uid = @session["user"]
if uid
DB["UPDATE SignedInUsers SET last_used_at = CURRENT_TIMESTAMP WHERE code = ?", uid].update
end
rescue Sequel::Error => e
Logman.log "DB Error: #{e.message} when updating last_used_at for #{uid}"
end
def load_session
cookie = @request.cookies["session"]
return {} unless cookie
JSON.parse(Zlib::Inflate.inflate(Base64.strict_decode64(cookie)))
rescue JSON::ParserError, Zlib::Error, ArgumentError
@response.delete_cookie("session")
{}
end
def signed_in?
@@ -35,38 +65,21 @@ class Sessions
return [200, "Remember to verify your email!"] unless Players.verified?(username)
[200, "Signed in successfully!"]
else
[200, "Couldn't sign you in (Username or password incorrect)!"]
[401, "Couldn't sign you in (Username or password incorrect)!"]
end
end
def []=(key, val)
session = all
session[key] = val
Logman.log "Updated: #{key} to #{val}"
compressed = Zlib::Deflate.deflate(JSON.generate(session))
encoded = Base64.encode64(compressed)
@response.set_cookie("session",
value: encoded,
path: "/",
expires: Time.now + 360 * 24 * 60 * 60,
httponly: true,
secure: ENV_HASH["ENV"] == "prod",
samesite: :strict)
uid = session["user"]
DB["UPDATE SignedInUsers SET last_used_at = CURRENT_TIMESTAMP WHERE code = ?", uid].update if uid
rescue Sequel::Error => e
Logman.log "DB Error: #{e.message} when updating last_used_at for #{uid}"
end
def [](key)
session = all
begin
uid = session["user"]
DB["UPDATE SignedInUsers SET last_used_at = CURRENT_TIMESTAMP WHERE code = ?", uid].update if uid
rescue Sequel::Error => e
Logman.log "DB Error: #{e.message} when updating last_used_at for #{uid}"
end
session[key]
@session[key]
end
def []=(key, val)
@session[key] = val
save
end
def all
@session
end
def message=(val)
@@ -86,31 +99,9 @@ class Sessions
@request.env["HTTP_X_CSRF_TOKEN"] == self["csrf_token"]
end
def all
session = @request.cookies["session"]
session = session.nil? ? "{}" : Zlib::Inflate.inflate(Base64.decode64(session))
JSON.parse(session)
rescue JSON::ParserError, Zlib::Error
@response.delete_cookie("session")
{}
end
def delete(key)
session = all
session.delete(key)
Logman.log "Deleted: #{key}"
Logman.log session.inspect
compressed = Zlib::Deflate.deflate(JSON.generate(session))
encoded = Base64.encode64(compressed)
@response.set_cookie("session",
value: encoded,
path: "/",
expires: Time.now + 360 * 24 * 60 * 60,
httponly: true,
secure: ENV["ENV"] == "prod",
samesite: :strict)
rescue JSON::ParserError, Zlib::Error
@response.delete_cookie("session")
@session.delete(key)
save
end
Thread.new do