Minor fixes.
This commit is contained in:
@@ -30,15 +30,28 @@
|
|||||||
mkdir -p $out
|
mkdir -p $out
|
||||||
cp -r . $out/
|
cp -r . $out/
|
||||||
'';
|
'';
|
||||||
postFixup = ''
|
};
|
||||||
substituteInPlace $out/bin/infinsweeper \
|
|
||||||
--replace-fail '#!/usr/bin/env ruby' '#!${ruby}/bin/ruby'
|
server = pkgs.writeShellApplication {
|
||||||
|
name = "infinsweeper";
|
||||||
|
runtimeInputs = [ ruby ];
|
||||||
|
text = ''
|
||||||
|
set -euo pipefail
|
||||||
|
data_dir="''${INFINSWEEPER_DATA_DIR:-/var/lib/infinsweeper}"
|
||||||
|
DB="$data_dir/infinsweeper.db"
|
||||||
|
mkdir -p "$data_dir"
|
||||||
|
exec ruby ${app}/main.rb
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
packages.${system}.default = app;
|
packages.${system}.default = app;
|
||||||
|
|
||||||
|
apps.${system}.default = {
|
||||||
|
type = "app";
|
||||||
|
program = "${server}/bin/infinsweeper";
|
||||||
|
};
|
||||||
|
|
||||||
devShells.${system}.default = pkgs.mkShell {
|
devShells.${system}.default = pkgs.mkShell {
|
||||||
packages = [
|
packages = [
|
||||||
ruby
|
ruby
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
require "xxhash"
|
|
||||||
|
|
||||||
# Game logic main class
|
# Game logic main class
|
||||||
class GameLogic
|
class GameLogic
|
||||||
attr_reader :pos
|
attr_reader :pos
|
||||||
|
|||||||
@@ -2,10 +2,10 @@
|
|||||||
module Logman
|
module Logman
|
||||||
def self.log(log)
|
def self.log(log)
|
||||||
file, line = caller(1, 1)[0].split(":")
|
file, line = caller(1, 1)[0].split(":")
|
||||||
File.write("log/main.log", "[#{Time.now}] {#{file}:#{line}} #{log}\n", mode: "a") if ENV_HASH["ENV"] == "dev"
|
File.write("log/main.log", "[#{Time.now}] {#{file}:#{line}} #{log}\n", mode: "a") if ENV["ENV"] == "dev"
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.imp(log)
|
def self.imp(log)
|
||||||
File.write("log/imp.log", "[#{Time.now}] #{log}\n", mode: "a") if ENV_HASH["ENV"] == "dev"
|
File.write("log/imp.log", "[#{Time.now}] #{log}\n", mode: "a") if ENV["ENV"] == "dev"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,7 +1,12 @@
|
|||||||
# Mailer module
|
# Mailer module
|
||||||
|
|
||||||
|
# Not to actually be used. proof of concept.
|
||||||
|
|
||||||
module Mail
|
module Mail
|
||||||
def send(to, subject, body)
|
def send(to, subject, body)
|
||||||
from_email = "infinsweeper@syedm.dev"
|
raise "Can't send email."
|
||||||
|
|
||||||
|
from_email = "infinsweeper@domain.com"
|
||||||
from_name = "InfinSweeper"
|
from_name = "InfinSweeper"
|
||||||
to = Array(to).map { |addr| { email_address: { address: addr, name: "" } } }
|
to = Array(to).map { |addr| { email_address: { address: addr, name: "" } } }
|
||||||
|
|
||||||
@@ -17,7 +22,7 @@ module Mail
|
|||||||
|
|
||||||
uri = URI("https://api.zeptomail.com/v1.1/email")
|
uri = URI("https://api.zeptomail.com/v1.1/email")
|
||||||
req = Net::HTTP::Post.new(uri)
|
req = Net::HTTP::Post.new(uri)
|
||||||
req["Authorization"] = "Zoho-enczapikey #{ENV_HASH["ZOHO_PASS"]}"
|
req["Authorization"] = "Zoho-enczapikey #{ENV["ZOHO_PASS"]}"
|
||||||
req["Content-Type"] = "application/json"
|
req["Content-Type"] = "application/json"
|
||||||
req.body = payload.to_json
|
req.body = payload.to_json
|
||||||
|
|
||||||
|
|||||||
@@ -10,17 +10,16 @@ require "zlib"
|
|||||||
ALPHANUM = [*"0".."9", *"A".."Z", *"a".."z", "-", "_"].freeze
|
ALPHANUM = [*"0".."9", *"A".."Z", *"a".."z", "-", "_"].freeze
|
||||||
|
|
||||||
env_data = File.exist?(".env") ? File.read(".env") : ""
|
env_data = File.exist?(".env") ? File.read(".env") : ""
|
||||||
ENV_HASH = {}
|
|
||||||
|
|
||||||
env_data.each_line do |line|
|
env_data.each_line do |line|
|
||||||
next unless (match = line.match(/^([A-Z_][A-Z0-9_]*)=(.*)$/))
|
next unless (match = line.match(/^([A-Z_][A-Z0-9_]*)=(.*)$/))
|
||||||
ENV_HASH[match[1]] = match[2]
|
ENV[match[1]] = match[2]
|
||||||
end
|
end
|
||||||
|
|
||||||
load "logman.rb"
|
load "logman.rb"
|
||||||
# Logman.log ENV_HASH.inspect
|
# Logman.log ENV.inspect
|
||||||
|
|
||||||
db_file = File.expand_path("infinsweeper.db", __dir__)
|
db_file = ENV.fetch("INFINSWEEPER_DB", File.expand_path("infinsweeper.db", __dir__))
|
||||||
DB = Sequel.connect("sqlite:///#{db_file}", single_threaded: false)
|
DB = Sequel.connect("sqlite:///#{db_file}", single_threaded: false)
|
||||||
DB.run("PRAGMA foreign_keys = ON;")
|
DB.run("PRAGMA foreign_keys = ON;")
|
||||||
DB.create_table? :Players do
|
DB.create_table? :Players do
|
||||||
|
|||||||
+7
-7
@@ -18,15 +18,15 @@ module Players
|
|||||||
raise ArgumentError, "Password must be at least 8 characters and of valid format." unless
|
raise ArgumentError, "Password must be at least 8 characters and of valid format." unless
|
||||||
pass.match?(/\A[a-zA-Z0-9_.!?@#$%^&*()+=-]+\z/) && pass.length >= 8
|
pass.match?(/\A[a-zA-Z0-9_.!?@#$%^&*()+=-]+\z/) && pass.length >= 8
|
||||||
|
|
||||||
digest = Zlib.crc32(pass, ENV_HASH["SALT"])
|
digest = Zlib.crc32(pass, ENV["SALT"])
|
||||||
code = ENV_HASH["ENV"] == "prod" ? Array.new(24) { ALPHANUM.sample }.join : "!"
|
code = ENV["ENV"] == "prod" ? Array.new(24) { ALPHANUM.sample }.join : "!"
|
||||||
|
|
||||||
DB[
|
DB[
|
||||||
"insert into Players (username, digest, email, activation_code) values (?, ?, ?, ?)",
|
"insert into Players (username, digest, email, activation_code) values (?, ?, ?, ?)",
|
||||||
username, digest, email, code
|
username, digest, email, code
|
||||||
].insert
|
].insert
|
||||||
|
|
||||||
send_email(:new, email, username, code) if ENV_HASH["ENV"] == "prod"
|
send_email(:new, email, username, code) if ENV["ENV"] == "prod"
|
||||||
|
|
||||||
[200, "Successfully signed up!"]
|
[200, "Successfully signed up!"]
|
||||||
rescue ArgumentError => e
|
rescue ArgumentError => e
|
||||||
@@ -53,11 +53,11 @@ module Players
|
|||||||
|
|
||||||
true
|
true
|
||||||
|
|
||||||
# send_email(:pass_req, email, code)
|
send_email(:pass_req, email, code)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.pass_reset(new_pass, code)
|
def self.pass_reset(pass, code)
|
||||||
digest = XXhash.xxh32(new_pass, ENV_HASH["SALT"])
|
digest = Zlib.crc32(pass, ENV["SALT"])
|
||||||
DB["update Players set digest = ?, new_pass_code = ? 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
|
end
|
||||||
|
|
||||||
@@ -78,7 +78,7 @@ module Players
|
|||||||
end
|
end
|
||||||
|
|
||||||
def self.authorized?(username, pass)
|
def self.authorized?(username, pass)
|
||||||
digest = Zlib.crc32(pass, ENV_HASH["SALT"])
|
digest = Zlib.crc32(pass, ENV["SALT"])
|
||||||
Logman.log "Authorized: #{username} & #{digest}"
|
Logman.log "Authorized: #{username} & #{digest}"
|
||||||
player = self[username]
|
player = self[username]
|
||||||
player && player[:digest].to_i == digest.to_i ? player : false
|
player && player[:digest].to_i == digest.to_i ? player : false
|
||||||
|
|||||||
+6
-19
@@ -21,7 +21,6 @@ class Sessions
|
|||||||
end
|
end
|
||||||
|
|
||||||
def login(username, pass)
|
def login(username, pass)
|
||||||
Logman.log "Logging in: #{username} & #{pass} #{ENV_HASH["SALT"]}"
|
|
||||||
player = Players.authorized?(username, pass)
|
player = Players.authorized?(username, pass)
|
||||||
if player
|
if player
|
||||||
code = Array.new(24) { ALPHANUM.sample }.join
|
code = Array.new(24) { ALPHANUM.sample }.join
|
||||||
@@ -40,11 +39,8 @@ class Sessions
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: Use .all here
|
|
||||||
def []=(key, val)
|
def []=(key, val)
|
||||||
session = @request.cookies["session"]
|
session = all
|
||||||
session = session.nil? ? "{}" : Zlib::Inflate.inflate(Base64.decode64(session))
|
|
||||||
session = JSON.parse(session)
|
|
||||||
session[key] = val
|
session[key] = val
|
||||||
Logman.log "Updated: #{key} to #{val}"
|
Logman.log "Updated: #{key} to #{val}"
|
||||||
compressed = Zlib::Deflate.deflate(JSON.generate(session))
|
compressed = Zlib::Deflate.deflate(JSON.generate(session))
|
||||||
@@ -58,16 +54,12 @@ class Sessions
|
|||||||
samesite: :strict)
|
samesite: :strict)
|
||||||
uid = session["user"]
|
uid = session["user"]
|
||||||
DB["UPDATE SignedInUsers SET last_used_at = CURRENT_TIMESTAMP WHERE code = ?", uid].update if uid
|
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
|
rescue Sequel::Error => e
|
||||||
Logman.log "DB Error: #{e.message} when updating last_used_at for #{uid}"
|
Logman.log "DB Error: #{e.message} when updating last_used_at for #{uid}"
|
||||||
end
|
end
|
||||||
|
|
||||||
def [](key)
|
def [](key)
|
||||||
session = @request.cookies["session"]
|
session = all
|
||||||
session = session.nil? ? "{}" : Zlib::Inflate.inflate(Base64.decode64(session))
|
|
||||||
session = JSON.parse(session)
|
|
||||||
begin
|
begin
|
||||||
uid = session["user"]
|
uid = session["user"]
|
||||||
DB["UPDATE SignedInUsers SET last_used_at = CURRENT_TIMESTAMP WHERE code = ?", uid].update if uid
|
DB["UPDATE SignedInUsers SET last_used_at = CURRENT_TIMESTAMP WHERE code = ?", uid].update if uid
|
||||||
@@ -75,9 +67,6 @@ class Sessions
|
|||||||
Logman.log "DB Error: #{e.message} when updating last_used_at for #{uid}"
|
Logman.log "DB Error: #{e.message} when updating last_used_at for #{uid}"
|
||||||
end
|
end
|
||||||
session[key]
|
session[key]
|
||||||
rescue JSON::ParserError, Zlib::Error
|
|
||||||
@response.delete_cookie("session")
|
|
||||||
""
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def message=(val)
|
def message=(val)
|
||||||
@@ -85,7 +74,7 @@ class Sessions
|
|||||||
value: val,
|
value: val,
|
||||||
path: "/",
|
path: "/",
|
||||||
expires: Time.now + 360 * 24 * 60 * 60,
|
expires: Time.now + 360 * 24 * 60 * 60,
|
||||||
secure: ENV_HASH["ENV"] == "prod",
|
secure: ENV["ENV"] == "prod",
|
||||||
samesite: :strict)
|
samesite: :strict)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -107,9 +96,7 @@ class Sessions
|
|||||||
end
|
end
|
||||||
|
|
||||||
def delete(key)
|
def delete(key)
|
||||||
session = @request.cookies["session"]
|
session = all
|
||||||
session = session.nil? ? "{}" : Zlib::Inflate.inflate(Base64.decode64(session))
|
|
||||||
session = JSON.parse(session)
|
|
||||||
session.delete(key)
|
session.delete(key)
|
||||||
Logman.log "Deleted: #{key}"
|
Logman.log "Deleted: #{key}"
|
||||||
Logman.log session.inspect
|
Logman.log session.inspect
|
||||||
@@ -120,7 +107,7 @@ class Sessions
|
|||||||
path: "/",
|
path: "/",
|
||||||
expires: Time.now + 360 * 24 * 60 * 60,
|
expires: Time.now + 360 * 24 * 60 * 60,
|
||||||
httponly: true,
|
httponly: true,
|
||||||
secure: ENV_HASH["ENV"] == "prod",
|
secure: ENV["ENV"] == "prod",
|
||||||
samesite: :strict)
|
samesite: :strict)
|
||||||
rescue JSON::ParserError, Zlib::Error
|
rescue JSON::ParserError, Zlib::Error
|
||||||
@response.delete_cookie("session")
|
@response.delete_cookie("session")
|
||||||
@@ -140,7 +127,7 @@ class Sessions
|
|||||||
Logman.log "Thread DB error: #{e.message} on #{session[:code]} for #{session[:player]}"
|
Logman.log "Thread DB error: #{e.message} on #{session[:code]} for #{session[:player]}"
|
||||||
end
|
end
|
||||||
$active_users.delete(session[:code])
|
$active_users.delete(session[:code])
|
||||||
puts "Auto-logged out: #{session[:player]} (expired session)"
|
Logman.log "Auto-logged out: #{session[:player]} (expired session)"
|
||||||
end
|
end
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
Logman.log "Thread error: #{e.message}"
|
Logman.log "Thread error: #{e.message}"
|
||||||
|
|||||||
Reference in New Issue
Block a user