mirror of
https://github.com/kmc7468/arkvault.git
synced 2026-03-22 07:16:55 +09:00
51 lines
1.3 KiB
TypeScript
51 lines
1.3 KiB
TypeScript
import { encodeToBase64, decryptChallenge, signMessageRSA } from "$lib/modules/crypto";
|
|
import { trpc, isTRPCClientError } from "$trpc/client";
|
|
|
|
export const requestSessionUpgrade = async (
|
|
encryptKeyBase64: string,
|
|
decryptKey: CryptoKey,
|
|
verifyKeyBase64: string,
|
|
signKey: CryptoKey,
|
|
force = false,
|
|
) => {
|
|
let id, challenge;
|
|
try {
|
|
({ id, challenge } = await trpc().auth.upgrade.mutate({
|
|
encPubKey: encryptKeyBase64,
|
|
sigPubKey: verifyKeyBase64,
|
|
}));
|
|
} catch (e) {
|
|
if (isTRPCClientError(e) && e.data?.code === "FORBIDDEN") {
|
|
return [false, "Unregistered client"] as const;
|
|
}
|
|
return [false] as const;
|
|
}
|
|
const answer = await decryptChallenge(challenge, decryptKey);
|
|
const answerSig = await signMessageRSA(answer, signKey);
|
|
|
|
try {
|
|
await trpc().auth.verifyUpgrade.mutate({
|
|
id,
|
|
answerSig: encodeToBase64(answerSig),
|
|
force,
|
|
});
|
|
} catch (e) {
|
|
if (isTRPCClientError(e) && e.data?.code === "CONFLICT") {
|
|
return [false, "Already logged in"] as const;
|
|
}
|
|
return [false] as const;
|
|
}
|
|
|
|
return [true] as const;
|
|
};
|
|
|
|
export const requestLogout = async () => {
|
|
try {
|
|
await trpc().auth.logout.mutate();
|
|
return true;
|
|
} catch {
|
|
// TODO: Error Handling
|
|
return false;
|
|
}
|
|
};
|