XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 0 Star 0
UTF-8
import { IAccountCreation } from "@/src/types/customTypes";
import { IDatabaseAccount } from "@/src/types/loginTypes";
import crypto from "crypto";
import { isString, parseEmail, parseString } from "../general";

const getWhirlpoolHash = (rawPassword: string): string => {
    const whirlpool = crypto.createHash("whirlpool");
    const data = whirlpool.update(rawPassword, "utf8");
    const hash = data.digest("hex");
    return hash;
};

const parsePassword = (passwordCandidate: unknown): string => {
    // a different function could be called that checks whether the password has a certain shape
    if (!isString(passwordCandidate)) {
        throw new Error("incorrect password format");
    }
    return passwordCandidate;
};

const toAccountCreation = (accountCreation: unknown): IAccountCreation => {
    if (!accountCreation || typeof accountCreation !== "object") {
        throw new Error("incorrect or missing account creation data");
    }

    if (
        "email" in accountCreation &&
        "password" in accountCreation &&
        "DisplayName" in accountCreation &&
        "CountryCode" in accountCreation
    ) {
        const rawPassword = parsePassword(accountCreation.password);
        return {
            email: parseEmail(accountCreation.email),
            password: getWhirlpoolHash(rawPassword),
            CountryCode: parseString(accountCreation.CountryCode),
            DisplayName: parseString(accountCreation.DisplayName)
        };
    }
    throw new Error("incorrect account creation data: incorrect properties");
};

const toDatabaseAccount = (createAccount: IAccountCreation): IDatabaseAccount => {
    return {
        ...createAccount,
        Nonce: 0
    } satisfies IDatabaseAccount;
};

export { toDatabaseAccount, toAccountCreation as toCreateAccount };