class JSONRepo

Constants

EMPTY_REPO

Public Class Methods

new(json_filename) click to toggle source
# File lib/wafer/json_repo.rb, line 55
def initialize(json_filename)
    unless File.exist?(json_filename)
        File.open(json_filename, "w") { |f| f.print(JSON.pretty_generate EMPTY_REPO) }
    end
    @contents = JSON.load(File.read json_filename)
end

Public Instance Methods

is_hash_ok(uid, hash) click to toggle source
# File lib/wafer/json_repo.rb, line 191
def is_hash_ok(uid, hash)
    user = user_by_id(uid)
    return [false, "NO SUCH USER"] unless user

    STDERR.puts "Checking md5 hash: #{hash.inspect}"

    keycode = user["keycode"]["keycode"]
    real_hash = Digest::MD5.hexdigest(user["name"] + keycode + "NONE")

    STDERR.puts "  Real hash: #{real_hash.inspect}"

    # Skip the check and just always say it's fine.
    #if real_hash == hash
        return [true, ""]
    #else
    #    return [false, "BAD HASH"]
    #end
end
is_keycode_ok(uid, code) click to toggle source
# File lib/wafer/json_repo.rb, line 170
def is_keycode_ok(uid, code)
    return [false, "BAD KEYCODE"] unless code

    # Keycode handling here is insultingly trivial and intentionally insecure.

    return [true, ""]
end
is_password_ok(uid, pass) click to toggle source

In thin-auth, this uses PHP's built-in password hashing.

# File lib/wafer/json_repo.rb, line 179
def is_password_ok(uid, pass)
    user = user_by_id(uid)

    return [false, "NO SUCH USER"] unless user

    if user["password"] == pass
        [true, ""]
    else
        [false, "BAD PASSWORD"]
    end
end
is_user_ok(uid) click to toggle source
# File lib/wafer/json_repo.rb, line 156
def is_user_ok(uid)
    user = user_by_id(uid)

    if !user
        return [false, "NO SUCH USER"]
    elsif user["flags"].include?("deleted")
        return [false, "NO SUCH USER"]
    elsif user["flags"].include?("banned")
        return [false, "ACCOUNT BLOCKED"]
    end

    return [true, ""]
end
uid_by_name(name) click to toggle source
# File lib/wafer/json_repo.rb, line 66
def uid_by_name(name)
    user = user_by_name(name)
    user && user["id"]
end
user_account_status(uid) click to toggle source

Note: we ignore “freebie” users. We don't have that.

# File lib/wafer/json_repo.rb, line 110
def user_account_status(uid)
    user = user_by_id(uid)
    return nil unless user

    (user["flags"] + user["access"]).join(" ")
end
user_account_type(uid) click to toggle source
# File lib/wafer/json_repo.rb, line 104
def user_account_type(uid)
    user = user_by_id(uid)
    user ? user["account_type"] : nil
end
user_by_field(field, value) click to toggle source
# File lib/wafer/json_repo.rb, line 79
def user_by_field(field, value)
    @contents["users"].detect { |u| u[field] == value }
end
user_by_id(id) click to toggle source
# File lib/wafer/json_repo.rb, line 75
def user_by_id(id)
    user_by_field("id", id)
end
user_by_name(name) click to toggle source
# File lib/wafer/json_repo.rb, line 71
def user_by_name(name)
    user_by_field("name", name)
end
user_has_access?(uid, game) click to toggle source
# File lib/wafer/json_repo.rb, line 83
def user_has_access?(uid, game)
    user = user_by_id(uid)
    user && user["access"].include?(game)
end
user_has_tos?(uid) click to toggle source
# File lib/wafer/json_repo.rb, line 88
def user_has_tos?(uid)
    user = user_by_id(uid)
    user && user["flags"].include?("terms-of-service")
end
user_has_verified_email?(uid) click to toggle source

We don't do email pings

# File lib/wafer/json_repo.rb, line 94
def user_has_verified_email?(uid)
    user = user_by_id(uid)
    !!user
end
user_is_paid?(uid) click to toggle source
# File lib/wafer/json_repo.rb, line 151
def user_is_paid?(uid)
    user = user_by_id(uid)
    user && true
end
user_keycode(uid) click to toggle source
# File lib/wafer/json_repo.rb, line 135
def user_keycode(uid)
    user = user_by_id(uid)
    user && new_random_keycode
end
user_names() click to toggle source
# File lib/wafer/json_repo.rb, line 62
def user_names
    @contents["users"].map { |u| u["name"] }
end
user_next_stamp(uid) click to toggle source

Miraculously, every user's next stamp is awhile in the future.

# File lib/wafer/json_repo.rb, line 147
def user_next_stamp(uid)
    Time.now.to_i + 3600 * 24 * 20
end
user_set_email(uid, email) click to toggle source
# File lib/wafer/json_repo.rb, line 99
def user_set_email(uid, email)
    user = user_by_id(uid)
    user && user["email"] = email
end
user_set_flag(uid, flag) click to toggle source
# File lib/wafer/json_repo.rb, line 117
def user_set_flag(uid, flag)
    user = user_by_id(uid)
    user && user["flags"] |= [flag]
end
user_set_keycode(uid) click to toggle source
# File lib/wafer/json_repo.rb, line 140
def user_set_keycode(uid)
    user = user_by_id(uid)
    raise "No such user!" unless user
    user["keycode"] = { "keycode" => new_random_keycode, "stamp" => Time.now }
end
user_unset_flag(uid, flag) click to toggle source
# File lib/wafer/json_repo.rb, line 122
def user_unset_flag(uid, flag)
    user = user_by_id(uid)
    user && user["flags"] -= [flag]
end

Private Instance Methods

new_random_keycode() click to toggle source
# File lib/wafer/json_repo.rb, line 129
def new_random_keycode
    rand(1 << 27)
end