From b3b86ecd9ade0a9600c54beb1aeddde45021f2e2 Mon Sep 17 00:00:00 2001 From: Syed Daanish Date: Sun, 22 Jun 2025 15:47:32 +0300 Subject: [PATCH] Fixes --- .gitignore | 1 + .rubocop.yml | 9 + Gemfile | 4 + Gemfile.lock | 10 + index.html | 57 +++++- logman.rb | 10 + mailer.rb | 31 ++++ main.rb | 145 ++++++--------- players.rb | 56 +++--- public/src/assets/fonts/changa.woff | Bin 0 -> 65864 bytes .../img/{logo_large.png => logo_lg.png} | Bin public/src/assets/style.css | 56 ++++++ public/src/js/accounts.js | 44 +++++ public/src/js/{index.js => game.js} | 0 public/src/js/game_renderer.js | 2 +- public/src/js/ui_renderer.js | 2 +- schema.sql | 6 +- session.rb | 171 ++++++++++++------ 18 files changed, 422 insertions(+), 182 deletions(-) create mode 100644 logman.rb create mode 100644 mailer.rb create mode 100644 public/src/assets/fonts/changa.woff rename public/src/assets/img/{logo_large.png => logo_lg.png} (100%) create mode 100644 public/src/js/accounts.js rename public/src/js/{index.js => game.js} (100%) diff --git a/.gitignore b/.gitignore index 11d8cc2..4424173 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.db tmp.* *.log +.env diff --git a/.rubocop.yml b/.rubocop.yml index ece38e3..b15522c 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -16,6 +16,15 @@ Style/TrailingCommaInArrayLiteral: Style/FrozenStringLiteralComment: Enabled: false +Style/GlobalVars: + Enabled: false + +Style/MutableConstant: + Enabled: false + +Style/StringLiteralsInInterpolation: + Enabled: false + Layout/SpaceAroundOperators: Enabled: false diff --git a/Gemfile b/Gemfile index f1f87c4..c58a71b 100644 --- a/Gemfile +++ b/Gemfile @@ -11,3 +11,7 @@ gem "json" gem "base64" gem "zlib" + +gem "uri" + +gem "net-http" diff --git a/Gemfile.lock b/Gemfile.lock index b4f6a62..227a410 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -3,9 +3,12 @@ GEM specs: base64 (0.3.0) bigdecimal (3.2.2) + json (2.12.2) logger (1.7.0) mustermann (3.0.3) ruby2_keywords (~> 0.0.1) + net-http (0.6.0) + uri rack (3.1.16) rack-protection (4.1.1) base64 (>= 0.1.0) @@ -25,16 +28,23 @@ GEM rack-session (>= 2.0.0, < 3) tilt (~> 2.0) tilt (2.6.0) + uri (1.0.3) xxhash (0.6.0) + zlib (3.2.1) PLATFORMS ruby x86_64-linux DEPENDENCIES + base64 + json + net-http sequel sinatra + uri xxhash + zlib BUNDLED WITH 2.6.9 diff --git a/index.html b/index.html index 0eab6ad..50d74b5 100644 --- a/index.html +++ b/index.html @@ -1,16 +1,69 @@ - Infinsweeper + InfinSweeper + +
+ + + +
+ + +
+
- + + diff --git a/logman.rb b/logman.rb new file mode 100644 index 0000000..ee250fb --- /dev/null +++ b/logman.rb @@ -0,0 +1,10 @@ +# module for logging +module Logman + def self.log(log) + File.write("log/main.log", "[#{Time.now}] #{log}\n", mode: "a") + end + + def self.imp(log) + File.write("log/imp.log", "[#{Time.now}] #{log}\n", mode: "a") + end +end diff --git a/mailer.rb b/mailer.rb new file mode 100644 index 0000000..3632423 --- /dev/null +++ b/mailer.rb @@ -0,0 +1,31 @@ +# Mailer module +module Mail + def send(to, subject, body) + from_email = "noreply@infinsweeper.syedm.dev" + from_name = "InfinSweeper" + to = Array(to).map { |addr| { email_address: { address: addr, name: "" } } } + + payload = { + from: { + address: from_email, + name: from_name, + }, + to: to, + subject: subject, + htmlbody: body, + } + + uri = URI("https://api.zeptomail.com/v1.1/email") + req = Net::HTTP::Post.new(uri) + req["Authorization"] = "Zoho-enczapikey #{ENV_HASH["ZOHO_PASS"]}" + req["Content-Type"] = "application/json" + req.body = payload.to_json + + http = Net::HTTP.new(uri.host, uri.port) + http.use_ssl = true + response = http.request(req) + + return if response.is_a?(Net::HTTPSuccess) + Logman.imp "[ZeptoMail ERROR] #{response.body}" + end +end diff --git a/main.rb b/main.rb index 2448fca..47e4b13 100644 --- a/main.rb +++ b/main.rb @@ -1,123 +1,93 @@ require "sinatra" require "json" - -require_relative "players" -require_relative "session" +require "base64" +require "zlib" +require "sequel" +require "xxhash" +require "net/http" +require "uri" ALPHANUM = [*"0".."9", *"A".."Z", *"a".."z", "-", "_"].freeze +env_data = File.read(".env") +ENV_HASH = {} + +env_data.each_line do |line| + if (match = line.match(/^([A-Z_][A-Z0-9_]*)=(.*)$/)) + _, key, val = match + ENV_HASH[key] = val + end +end + +CODE_ENV = :dev + db_file = File.expand_path("infinsweeper.db") DB = Sequel.connect("sqlite:///#{db_file}", single_threaded: false) DB.run("PRAGMA foreign_keys = ON;") +$active_users = DB[:SignedInUsers].all.map { |x| [x[:code], x[:player]] }.to_h -signed_in_users = DB[:SignedInUsers].all.map { |x| [x[:code], x[:player]] }.to_h - -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 - File.write("log/main.log", - "[#{Time.now}] Thread DB error: #{e.message} on #{session[:code]} for #{session[:player]}\n", - mode: "a") - end - signed_in_users.delete(session[:code]) - puts "Auto-logged out: #{session[:player]} (expired session)" - end - rescue StandardError => e - File.write("log/main.log", "[#{Time.now}] Thread error: #{e.message}\n", mode: "a") - ensure - sleep 60 * 60 * 24 - end -end +load "logman.rb" +load "mailer.rb" +load "players.rb" +load "session.rb" set :public_folder, "public" get "/" do + session = Sessions.new request, response + Logman.log session["message"] send_file "index.html" end get "/debug" do - return get_session_all(request, response).inspect + content_type :json + (Sessions.new request, response).all.to_json end -post "/new_player" do +post "/signup" do + session = Sessions.new request, response data = JSON.parse(request.body.read) if data["email"].nil? || data["pass"].nil? || data["username"].nil? status 400 return { "message" => "Bad request made!" }.to_json end - player = Players.mk_player(data["username"], data["email"], data["pass"]) - case player - when "Successfully registered!" - code = Array.new(24) { ALPHANUM.sample }.join - set_session(request, response, "user", code, code) - signed_in_users[code] = data["email"] - begin - DB["insert into SignedInUsers (code, player) values (?, ?)", code, data["email"]].insert - rescue Sequel::Error => e - File.write("log/main.log", "DB Error: #{e.message}\n", mode: "a") - status 500 - return { "message" => "Internal server error when signing you in!" }.to_json - end - status 200 - else - status 400 + signup_status = Players.mk_player(data["username"], data["email"], data["pass"]) + if signup_status[0] == 200 + login_status = session.login(data["username"], data["pass"]) + status login_status[0] + return { "message" => login_status[1] }.to_json end - return { "message" => player }.to_json + status signup_status[0] + return { "message" => signup_status[1] }.to_json end get "/verify/:code" do - if Players.verify(params[:code]) - status 200 - return { "message" => "Verified successfully!" }.to_json - else - status 400 - return { "message" => "Couldn't verify!" } - end + session = Sessions.new request, response + session["message"] = Players.verify(params[:code]) ? "Verified successfully!" : "Verification failed!" + redirect "/" end post "/login" do data = JSON.parse(request.body.read) - player = Players.authorized?(data["email"], data["pass"]) - if player - code = Array.new(24) { ALPHANUM.sample }.join - set_session(request, response, "user", code, code) - signed_in_users[code] = data["email"] - begin - DB["insert into SignedInUsers (code, player) values (?, ?)", code, data["email"]].insert - rescue Sequel::Error => e - File.write("log/main.log", "DB Error: #{e.message}\n", mode: "a") - status 500 - return { "message" => "Internal server error when signing you in!" }.to_json - end - status 200 - return { "message" => "Remember to verify your email!" }.to_json unless Players.verified?(data["email"]) - return { "message" => "Signed in successfully!" }.to_json - else - status 400 - return { "message" => "Couldn't sign you in!" }.to_json + session = Sessions.new request, response + uid = session["user"] + if $active_users[uid] && !session.logout(uid) + status 500 + return { "message" => "Internal server error when signing the existing session out!" }.to_json end + login_status = session.login(data["username"], data["pass"]) + status login_status[0] + return { "message" => login_status[1] }.to_json end post "/logout" do - uid = get_session(request, response, "user") - if signed_in_users[uid].nil? + session = Sessions.new request, response + uid = session["user"] + if $active_users[uid].nil? status 400 return { "message" => "Not signed in!" }.to_json end - signed_in_users.delete(uid) - rm_session(request, response, "user") - begin - DB["delete from SignedInUsers where code = ?", uid].delete - rescue Sequel::Error => e - File.write("log/main.log", "DB Error: #{e.message}\n", mode: "a") + unless session.logout(uid) status 500 return { "message" => "Internal server error when signing you out!" }.to_json end @@ -136,6 +106,10 @@ post "/forgot_password" do return { "message" => "Email sent successfully!" }.to_json end +get "/reset_password/:code" do + redirect "/?reset_code=#{params[:code]}" +end + post "/reset_password/:code" do data = JSON.parse(request.body.read) if data["pass"].nil? || params[:code].nil? @@ -152,14 +126,13 @@ post "/reset_password/:code" do end delete "/rm_player" do - uid = get_session(request, response, "user") - if uid.nil? || signed_in_users[uid].nil? + session = Sessions.new request, response + uid = session["user"] + if uid.nil? || $active_users[uid].nil? status 400 return { "message" => "Not signed in!" }.to_json end - if Players.rm_player(signed_in_users[uid]) - signed_in_users.delete(uid) - rm_session(request, response, "user") + if session.logout(uid) && Players.rm_player($active_users[uid]) status 200 return { "message" => "Sorry to see you go.." }.to_json else diff --git a/players.rb b/players.rb index 4b33596..4524a2c 100644 --- a/players.rb +++ b/players.rb @@ -1,21 +1,11 @@ -require "xxhash" -require "sequel" -require "json" - -ALPHANUM = [*"0".."9", *"A".."Z", *"a".."z", "-", "_"].freeze - # DataBase handler module module Players - db_file = File.expand_path("infinsweeper.db") - DB = Sequel.connect("sqlite:///#{db_file}", single_threaded: false) - DB.run("PRAGMA foreign_keys = ON;") - def self.list DB["select * from Players"].all end - def self.rm_player(email) - DB["delete from Players where email = ?", email].delete != 0 + def self.rm_player(username) + DB["delete from Players where username = ?", username].delete != 0 end def self.mk_player(username, email, pass) @@ -26,25 +16,24 @@ module Players pass.match?(/\A[a-zA-Z0-9_.!?@#$%^&*()+=-]+\z/) && pass.length >= 8 digest = XXhash.xxh32(pass, 1234) - - code = Array.new(24) { ALPHANUM.sample }.join + code = CODE_ENV == :prod ? Array.new(24) { ALPHANUM.sample }.join : "!" DB[ - "insert into Players (email, digest, username, activation_code) values (?, ?, ?, ?)", - email, digest, username, code + "insert into Players (username, digest, email, activation_code) values (?, ?, ?, ?)", + username, digest, email, code ].insert - send_email(:new, email, username, code) + send_email(:new, email, username, code) if CODE_ENV == :prod - "Successfully registered!" + [200, "Successfully signed up!"] rescue ArgumentError => e - e.message + [400, e.message] rescue Sequel::UniqueConstraintViolation - "Account already exists with this email or username!" + [400, "Account already exists with this username or username!"] end def self.verify(code) - DB["update Players set activation_code = ? where code = ?", "!", code].update != 0 + DB["update Players set activation_code = ? where activation_code = ?", "!", code].update != 0 end def self.unverified @@ -62,35 +51,36 @@ module Players def self.pass_reset(new_pass, code) digest = XXhash.xxh32(new_pass, 1234) - DB["update Players set digest = ? where new_pass_code = ?", digest, code].update != 0 + DB["update Players set digest = ?, new_pass_code = ? where new_pass_code = ?", digest, "", code].update != 0 end - def self.[](email) - DB["select * from Players where email = ?", email].first + def self.[](username) + DB["select * from Players where username = ?", username].first end - def self.[]=(email, data) - DB["update Players set data = ? where email = ?", data, email].update + def self.[]=(username, data) + DB["update Players set data = ? where username = ?", data, username].update end - def self.authorized?(email, pass) + def self.authorized?(username, pass) digest = XXhash.xxh32(pass, 1234) - player = self[email] + player = self[username] player && player[:digest].to_i == digest.to_i ? player : false end - def self.verified?(email) - player = self[email] - player && player[:code] == "!" + def self.verified?(username) + player = self[username] + Logger.log "Verified: #{player.inspect}\n" + player && player[:activation_code] == "!" end Thread.new do loop do unverified.each do |player| - rm_player(player[:email]) if player[:created_at] + 24 * 60 * 60 < Time.now + rm_player(player[:username]) if player[:created_at] + 24 * 60 * 60 < Time.now end rescue StandardError => e - File.write("log/main.log", "Thread error: #{e.message}\n", mode: "a") + Logger.log "Thread error: #{e.message}\n" ensure sleep 60 * 60 end diff --git a/public/src/assets/fonts/changa.woff b/public/src/assets/fonts/changa.woff new file mode 100644 index 0000000000000000000000000000000000000000..e41b363103c85c6cdde88aeaaf47d83d2dbcab5d GIT binary patch literal 65864 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 { + document.getElementById("login").style.display = "block"; +}; + +login_form.onsubmit = async (e) => { + e.preventDefault(); + const username = login_form.username.value; + const pass = login_form.pass.value; + let response = await fetch("/login", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ username, pass }), + }); + response = await response.json(); + document.getElementById("login-info").innerText = response.message; +}; + +const signup_form = document.getElementById("signup-form"); +const signup_button = document.getElementById("signup-button"); + +signup_button.onclick = () => { + document.getElementById("signup").style.display = "block"; +}; + +signup_form.onsubmit = async (e) => { + e.preventDefault(); + const username = signup_form.username.value; + const email = signup_form.email.value; + const pass = signup_form.pass.value; + let response = await fetch("/signup", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ username, email, pass }), + }); + response = await response.json(); + document.getElementById("signup-info").innerText = response.message; +}; diff --git a/public/src/js/index.js b/public/src/js/game.js similarity index 100% rename from public/src/js/index.js rename to public/src/js/game.js diff --git a/public/src/js/game_renderer.js b/public/src/js/game_renderer.js index d78c89b..949f565 100644 --- a/public/src/js/game_renderer.js +++ b/public/src/js/game_renderer.js @@ -39,7 +39,7 @@ export default class GameRenderer { /** @type {HTMLCanvasElement} */ this.canvas = document.getElementById(CANVAS_ID); this.canvas.width = window.innerWidth; - this.canvas.height = window.innerHeight; + this.canvas.height = window.innerHeight - 90; /** @type {CanvasRenderingContext2D} */ this.ctx = this.canvas.getContext("2d"); this.ctx.imageSmoothingEnabled = false; diff --git a/public/src/js/ui_renderer.js b/public/src/js/ui_renderer.js index 2a2d310..f5ad28d 100644 --- a/public/src/js/ui_renderer.js +++ b/public/src/js/ui_renderer.js @@ -83,7 +83,7 @@ export default class UIRenderer extends GameRenderer { */ resize() { this.canvas.width = window.innerWidth; - this.canvas.height = window.innerHeight; + this.canvas.height = window.innerHeight - 90; this.ctx.imageSmoothingEnabled = false; } /** diff --git a/schema.sql b/schema.sql index e0e1cc6..8681d21 100644 --- a/schema.sql +++ b/schema.sql @@ -1,6 +1,6 @@ CREATE TABLE IF NOT EXISTS Players ( - email TEXT PRIMARY KEY, - username TEXT UNIQUE, + username TEXT PRIMARY KEY, + email TEXT UNIQUE, digest BLOB, data BLOB, activation_code TEXT, @@ -13,5 +13,5 @@ CREATE TABLE IF NOT EXISTS SignedInUsers ( player TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, last_used_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (player) REFERENCES Players (email) ON DELETE CASCADE + FOREIGN KEY (player) REFERENCES Players (username) ON DELETE CASCADE ); diff --git a/session.rb b/session.rb index f46e36e..d2ee380 100644 --- a/session.rb +++ b/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