Finalize user signin and session backend
This commit is contained in:
@@ -36,3 +36,9 @@ Metrics/PerceivedComplexity:
|
|||||||
|
|
||||||
Metrics/CyclomaticComplexity:
|
Metrics/CyclomaticComplexity:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
|
Layout/CaseIndentation:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Layout/EndAlignment:
|
||||||
|
Enabled: false
|
||||||
|
135
main.rb
135
main.rb
@@ -1,7 +1,142 @@
|
|||||||
require "sinatra"
|
require "sinatra"
|
||||||
|
require "json"
|
||||||
|
|
||||||
|
require_relative "players"
|
||||||
|
require_relative "session"
|
||||||
|
|
||||||
|
json_path = File.expand_path("db.json")
|
||||||
|
signed_in_users = JSON.parse(File.read(json_path))["signed_in_users"]
|
||||||
|
|
||||||
set :public_folder, "public"
|
set :public_folder, "public"
|
||||||
|
|
||||||
get "/" do
|
get "/" do
|
||||||
send_file "index.html"
|
send_file "index.html"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
get "/debug" do
|
||||||
|
return get_session_all(request, response).inspect
|
||||||
|
end
|
||||||
|
|
||||||
|
post "/new_player" do
|
||||||
|
data = JSON.parse(request.body.read)
|
||||||
|
if data["email"].nil? || data["pass"].nil? || data["username"].nil?
|
||||||
|
status 400
|
||||||
|
return '{"message": "Bad request made!"}'
|
||||||
|
end
|
||||||
|
player = Players.mk_player(data["username"], data["email"], data["pass"])
|
||||||
|
case player
|
||||||
|
when "Successfully registered!"
|
||||||
|
hash = XXhash.xxh64(data["email"] + Time.now.to_s, 1234)
|
||||||
|
code = ""
|
||||||
|
while hash.positive?
|
||||||
|
code << ALPHANUM[hash % 64]
|
||||||
|
hash /= 64
|
||||||
|
end
|
||||||
|
code = code.reverse.rjust(12, "0")
|
||||||
|
set_session(request, response, "user", code)
|
||||||
|
signed_in_users[code] = data["email"]
|
||||||
|
json = JSON.parse(File.read(json_path))
|
||||||
|
json["signed_in_users"] = signed_in_users.clone
|
||||||
|
File.write(json_path, JSON.pretty_generate(json))
|
||||||
|
status 200
|
||||||
|
else
|
||||||
|
status 400
|
||||||
|
end
|
||||||
|
return "{\"message\": \"#{player}\"}"
|
||||||
|
end
|
||||||
|
|
||||||
|
get "/verify/:code" do
|
||||||
|
if Players.verify(params[:code])
|
||||||
|
status 200
|
||||||
|
return "{\"message\": \"Verified successfully!\"}"
|
||||||
|
else
|
||||||
|
status 400
|
||||||
|
return "{\"message\": \"Used or Invalid code!\"}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
post "/login" do
|
||||||
|
data = JSON.parse(request.body.read)
|
||||||
|
player = Players.authorized?(data["email"], data["pass"])
|
||||||
|
if player
|
||||||
|
hash = XXhash.xxh64(data["email"] + Time.now.to_s, 1234)
|
||||||
|
code = ""
|
||||||
|
while hash.positive?
|
||||||
|
code << ALPHANUM[hash % 64]
|
||||||
|
hash /= 64
|
||||||
|
end
|
||||||
|
code = code.reverse.rjust(12, "0")
|
||||||
|
set_session(request, response, "user", code)
|
||||||
|
signed_in_users[code] = data["email"]
|
||||||
|
json = JSON.parse(File.read(json_path))
|
||||||
|
json["signed_in_users"] = signed_in_users.clone
|
||||||
|
File.write(json_path, JSON.pretty_generate(json))
|
||||||
|
status 200
|
||||||
|
return "{\"message\": \"Remember to verify your email!\"}" unless Players.verified?(data["email"])
|
||||||
|
return "{\"message\": \"Signed in successfully!\"}"
|
||||||
|
else
|
||||||
|
status 400
|
||||||
|
return "{\"message\": \"Email or password incorrect!\"}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
post "/logout" do
|
||||||
|
uid = get_session(request, response, "user")
|
||||||
|
if signed_in_users[uid].nil?
|
||||||
|
status 400
|
||||||
|
return "{\"message\":\"Not signed in!\"}"
|
||||||
|
end
|
||||||
|
signed_in_users.delete(uid)
|
||||||
|
rm_session(request, response, "user")
|
||||||
|
json = JSON.parse(File.read(json_path))
|
||||||
|
json["signed_in_users"] = signed_in_users.clone
|
||||||
|
File.write(json_path, JSON.pretty_generate(json))
|
||||||
|
status 200
|
||||||
|
return "{\"message\":\"Signed out!\"}"
|
||||||
|
end
|
||||||
|
|
||||||
|
post "/forgot_password" do
|
||||||
|
data = JSON.parse(request.body.read)
|
||||||
|
if data["email"].nil?
|
||||||
|
status 400
|
||||||
|
return "{\"message\":\"Bad request made!\"}"
|
||||||
|
end
|
||||||
|
Players.pass_req(data["email"])
|
||||||
|
status 200
|
||||||
|
return "{\"message\":\"Password reset email sent!\"}"
|
||||||
|
end
|
||||||
|
|
||||||
|
post "/reset_password/:code" do
|
||||||
|
data = JSON.parse(request.body.read)
|
||||||
|
if data["pass"].nil? || params[:code].nil?
|
||||||
|
status 400
|
||||||
|
return "{\"message\":\"Bad request made!\"}"
|
||||||
|
end
|
||||||
|
if Players.pass_reset(data["pass"], params[:code])
|
||||||
|
status 200
|
||||||
|
return "{\"message\":\"Password reset successfully!\"}"
|
||||||
|
else
|
||||||
|
status 400
|
||||||
|
return "{\"message\":\"Couldn\'t reset password!\"}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
delete "/rm_player" do
|
||||||
|
uid = get_session(request, response, "user")
|
||||||
|
if uid.nil? || signed_in_users[uid].nil?
|
||||||
|
status 400
|
||||||
|
return '{"message": "Not signed in!"}'
|
||||||
|
end
|
||||||
|
if Players.rm_player(signed_in_users[uid])
|
||||||
|
status 200
|
||||||
|
signed_in_users.delete(uid)
|
||||||
|
rm_session(request, response, "user")
|
||||||
|
json = JSON.parse(File.read(json_path))
|
||||||
|
json["signed_in_users"] = signed_in_users.clone
|
||||||
|
File.write(json_path, JSON.pretty_generate(json))
|
||||||
|
return '{"message": "Sorry to see you go.."}'
|
||||||
|
else
|
||||||
|
status 500
|
||||||
|
return '{"message": "Couldn\'t delete!"}'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
21
players.rb
21
players.rb
@@ -14,7 +14,7 @@ module Players
|
|||||||
end
|
end
|
||||||
|
|
||||||
def self.rm_player(email)
|
def self.rm_player(email)
|
||||||
DB["delete from Players where email = ?", email].delete
|
DB["delete from Players where email = ?", email].delete != 0
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.mk_player(username, email, pass)
|
def self.mk_player(username, email, pass)
|
||||||
@@ -46,10 +46,6 @@ module Players
|
|||||||
].insert
|
].insert
|
||||||
|
|
||||||
send_email(:new, email, username, code)
|
send_email(:new, email, username, code)
|
||||||
Thread.new do
|
|
||||||
sleep 24 * 60 * 60
|
|
||||||
rm_player(email) unless verified?(email)
|
|
||||||
end
|
|
||||||
|
|
||||||
"Successfully registered!"
|
"Successfully registered!"
|
||||||
rescue ArgumentError => e
|
rescue ArgumentError => e
|
||||||
@@ -62,7 +58,12 @@ module Players
|
|||||||
DB["update Players set activation_code = ? where code = ?", "!", code].update != 0
|
DB["update Players set activation_code = ? where code = ?", "!", code].update != 0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.unverified
|
||||||
|
DB["select * from Players where activation_code <> ?", "!"].all
|
||||||
|
end
|
||||||
|
|
||||||
def self.pass_req(email)
|
def self.pass_req(email)
|
||||||
|
return unless self[email]
|
||||||
path = File.expand_path("db.json")
|
path = File.expand_path("db.json")
|
||||||
json = File.exist?(path) ? JSON.parse(File.read(path)) : {}
|
json = File.exist?(path) ? JSON.parse(File.read(path)) : {}
|
||||||
json["pass_num"] ||= 0
|
json["pass_num"] ||= 0
|
||||||
@@ -83,7 +84,8 @@ module Players
|
|||||||
end
|
end
|
||||||
|
|
||||||
def self.pass_reset(new_pass, code)
|
def self.pass_reset(new_pass, code)
|
||||||
DB["update Players set pass = ? where new_pass_code = ?", new_pass, code].update != 0
|
digest = XXhash.xxh32(new_pass, 1234)
|
||||||
|
DB["update Players set digest = ? where new_pass_code = ?", digest, code].update != 0
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.[](email)
|
def self.[](email)
|
||||||
@@ -104,4 +106,11 @@ module Players
|
|||||||
player = self[email]
|
player = self[email]
|
||||||
player && player[:code] == "!"
|
player && player[:code] == "!"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Thread.new do
|
||||||
|
sleep 60 * 60
|
||||||
|
unverified.each do |player|
|
||||||
|
rm_player(player[:email]) if player[:created_at] + 24 * 60 * 60 < Time.now
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@@ -4,5 +4,6 @@ CREATE TABLE Players (
|
|||||||
digest BLOB,
|
digest BLOB,
|
||||||
data BLOB,
|
data BLOB,
|
||||||
activation_code TEXT,
|
activation_code TEXT,
|
||||||
new_pass_code TEXT
|
new_pass_code TEXT,
|
||||||
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||||
);
|
);
|
||||||
|
49
session.rb
Normal file
49
session.rb
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
require "base64"
|
||||||
|
require "json"
|
||||||
|
|
||||||
|
def set_session(request, response, key, val)
|
||||||
|
session = request.cookies["session"]
|
||||||
|
session = "e30=\n" if session.nil?
|
||||||
|
session = JSON.parse(Base64.decode64(session))
|
||||||
|
session[key] = val
|
||||||
|
session = Base64.encode64(JSON.generate(session))
|
||||||
|
response.set_cookie("session",
|
||||||
|
value: session,
|
||||||
|
path: "/",
|
||||||
|
expires: Time.now + 360 * 24 * 60 * 60)
|
||||||
|
rescue JSON::ParserError
|
||||||
|
response.delete_cookie("session")
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_session(request, response, key)
|
||||||
|
session = request.cookies["session"]
|
||||||
|
session = "{}" if session.nil?
|
||||||
|
session = JSON.parse(Base64.decode64(session))
|
||||||
|
session[key]
|
||||||
|
rescue JSON::ParserError
|
||||||
|
response.delete_cookie("session")
|
||||||
|
""
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_session_all(request, response)
|
||||||
|
session = request.cookies["session"]
|
||||||
|
session = "{}" if session.nil?
|
||||||
|
JSON.parse(Base64.decode64(session))
|
||||||
|
rescue JSON::ParserError
|
||||||
|
response.delete_cookie("session")
|
||||||
|
""
|
||||||
|
end
|
||||||
|
|
||||||
|
def rm_session(request, response, key)
|
||||||
|
session = request.cookies["session"]
|
||||||
|
session = "{}" if session.nil?
|
||||||
|
session = JSON.parse(Base64.decode64(session))
|
||||||
|
session.delete(key)
|
||||||
|
session = Base64.encode64(JSON.generate(session))
|
||||||
|
response.set_cookie("session",
|
||||||
|
value: session,
|
||||||
|
path: "/",
|
||||||
|
expires: Time.now + 360 * 24 * 60 * 60)
|
||||||
|
rescue JSON::ParserError
|
||||||
|
response.delete_cookie("session")
|
||||||
|
end
|
Reference in New Issue
Block a user