Fixes
This commit is contained in:
171
session.rb
171
session.rb
@@ -1,62 +1,121 @@
|
||||
require "base64"
|
||||
require "zlib"
|
||||
require "json"
|
||||
|
||||
def set_session(request, response, key, val, uid = nil)
|
||||
session = request.cookies["session"]
|
||||
session = session.nil? ? "{}" : Zlib::Inflate.inflate(Base64.decode64(session))
|
||||
session = JSON.parse(session)
|
||||
session[key] = 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)
|
||||
begin
|
||||
DB["UPDATE SignedInUsers SET last_used_at = CURRENT_TIMESTAMP WHERE code = ?", uid].update if uid
|
||||
rescue Sequel::Error => e
|
||||
File.write("log/main.log", "DB Error: #{e.message} when updating last_used_at for #{uid}\n", mode: "a")
|
||||
# class Sessions
|
||||
class Sessions
|
||||
def initialize(request, response)
|
||||
@request = request
|
||||
@response = response
|
||||
end
|
||||
rescue JSON::ParserError, Zlib::Error
|
||||
response.delete_cookie("session")
|
||||
end
|
||||
|
||||
def get_session(request, response, key, uid = nil)
|
||||
session = request.cookies["session"]
|
||||
session = session.nil? ? "{}" : Zlib::Inflate.inflate(Base64.decode64(session))
|
||||
session = JSON.parse(session)
|
||||
begin
|
||||
DB["UPDATE SignedInUsers SET last_used_at = CURRENT_TIMESTAMP WHERE code = ?", uid].update if uid
|
||||
rescue Sequel::Error => e
|
||||
File.write("log/main.log", "DB Error: #{e.message} when updating last_used_at for #{uid}\n", mode: "a")
|
||||
def signed_in?(code)
|
||||
signed_in_users[code]
|
||||
end
|
||||
session[key]
|
||||
rescue JSON::ParserError, Zlib::Error
|
||||
response.delete_cookie("session")
|
||||
""
|
||||
end
|
||||
|
||||
def get_session_all(request, response)
|
||||
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 logout(uid)
|
||||
signed_in_users.delete(uid)
|
||||
delete("user")
|
||||
DB["delete from SignedInUsers where code = ?", uid].delete
|
||||
true
|
||||
rescue Sequel::Error => e
|
||||
Logger.log "DB Error: #{e.message}\n"
|
||||
false
|
||||
end
|
||||
|
||||
def rm_session(request, response, key)
|
||||
session = request.cookies["session"]
|
||||
session = session.nil? ? "{}" : Zlib::Inflate.inflate(Base64.decode64(session))
|
||||
session = JSON.parse(session)
|
||||
session.delete(key)
|
||||
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)
|
||||
rescue JSON::ParserError, Zlib::Error
|
||||
response.delete_cookie("session")
|
||||
def login(username, pass)
|
||||
player = Players.authorized?(username, pass)
|
||||
if player
|
||||
code = Array.new(24) { ALPHANUM.sample }.join
|
||||
self["user", code] = code
|
||||
signed_in_users[code] = username
|
||||
begin
|
||||
DB["insert into SignedInUsers (code, player) values (?, ?)", code, username].insert
|
||||
rescue Sequel::Error => e
|
||||
Logger.log "DB Error: #{e.message}\n"
|
||||
return [500, "Internal server error when signing you in!"]
|
||||
end
|
||||
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)!"]
|
||||
end
|
||||
end
|
||||
|
||||
def []=(key, uid, val)
|
||||
session = @request.cookies["session"]
|
||||
session = session.nil? ? "{}" : Zlib::Inflate.inflate(Base64.decode64(session))
|
||||
session = JSON.parse(session)
|
||||
session[key] = 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)
|
||||
DB["UPDATE SignedInUsers SET last_used_at = CURRENT_TIMESTAMP WHERE code = ?", uid].update if uid
|
||||
rescue JSON::ParserError, Zlib::Error
|
||||
@response.delete_cookie("session")
|
||||
rescue Sequel::Error => e
|
||||
Logger.log "DB Error: #{e.message} when updating last_used_at for #{uid}\n"
|
||||
end
|
||||
|
||||
def [](key, uid: nil)
|
||||
session = @request.cookies["session"]
|
||||
session = session.nil? ? "{}" : Zlib::Inflate.inflate(Base64.decode64(session))
|
||||
session = JSON.parse(session)
|
||||
begin
|
||||
DB["UPDATE SignedInUsers SET last_used_at = CURRENT_TIMESTAMP WHERE code = ?", uid].update if uid
|
||||
rescue Sequel::Error => e
|
||||
Logger.log "DB Error: #{e.message} when updating last_used_at for #{uid}\n"
|
||||
end
|
||||
session[key]
|
||||
rescue JSON::ParserError, Zlib::Error
|
||||
@response.delete_cookie("session")
|
||||
""
|
||||
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 = @request.cookies["session"]
|
||||
session = session.nil? ? "{}" : Zlib::Inflate.inflate(Base64.decode64(session))
|
||||
session = JSON.parse(session)
|
||||
session.delete(key)
|
||||
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)
|
||||
rescue JSON::ParserError, Zlib::Error
|
||||
@response.delete_cookie("session")
|
||||
end
|
||||
|
||||
Thread.new do
|
||||
loop do
|
||||
now = Time.now
|
||||
fifteen_days_ago = now - (60 * 60 * 24 * 15)
|
||||
six_days_ago = now - (60 * 60 * 24 * 6)
|
||||
old_sessions = (DB[:SignedInUsers].where { created_at < fifteen_days_ago }.all +
|
||||
DB[:SignedInUsers].where { last_used_at < six_days_ago }.all).uniq { |s| s[:code] }
|
||||
old_sessions.each do |session|
|
||||
begin
|
||||
DB[:SignedInUsers].where(code: session[:code]).delete
|
||||
rescue StandardError => e
|
||||
Logger.log "Thread DB error: #{e.message} on #{session[:code]} for #{session[:player]}\n"
|
||||
end
|
||||
signed_in_users.delete(session[:code])
|
||||
puts "Auto-logged out: #{session[:player]} (expired session)"
|
||||
end
|
||||
rescue StandardError => e
|
||||
Logger.log "Thread error: #{e.message}\n"
|
||||
ensure
|
||||
sleep 60 * 60 * 24
|
||||
Logger.log "Thread sleeping\n"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
Reference in New Issue
Block a user