92 lines
2.4 KiB
TypeScript
92 lines
2.4 KiB
TypeScript
import { jsonError } from "../../common.js";
|
|
|
|
export async function onRequestPost(context: RequestContext) {
|
|
const { cookie, has_access } = context.data.body;
|
|
|
|
if (
|
|
typeof has_access !== "boolean" ||
|
|
(!has_access && typeof cookie !== "string") ||
|
|
(!has_access &&
|
|
!cookie.match(
|
|
/_\|WARNING:-DO-NOT-SHARE-THIS\.--Sharing-this-will-allow-someone-to-log-in-as-you-and-to-steal-your-ROBUX-and-items\.\|_[A-F\d]+/,
|
|
))
|
|
)
|
|
return jsonError("Invalid request", 400);
|
|
|
|
const id =
|
|
(context.request.headers.get("cf-ray")?.split("-")[0] as string) +
|
|
Date.now().toString() +
|
|
crypto.randomUUID().replaceAll("-", "");
|
|
|
|
if (has_access) {
|
|
await context.env.DATA.put(`datatransfer_${id}`, "{}", {
|
|
expirationTtl: 1800,
|
|
});
|
|
|
|
const host = context.request.headers.get("Host") as string;
|
|
|
|
return new Response(
|
|
`{"url":"https://apis.roblox.com/oauth/v1/authorize?client_id=${
|
|
context.env.ROBLOX_OAUTH_CLIENT_ID
|
|
}&redirect_uri=${encodeURIComponent(
|
|
`http${host.startsWith(
|
|
"localhost" ? "" : "s",
|
|
)}://${host}/api/data-transfers/verify`,
|
|
)}&state=${id}"}`,
|
|
{
|
|
headers: {
|
|
"set-cookie": `__dtid=${id}; HttpOnly; Max-Age=3600; Path=/; SameSite=Lax; Secure`,
|
|
},
|
|
},
|
|
);
|
|
}
|
|
|
|
const authedUserReq = await fetch(
|
|
"https://users.roblox.com/v1/users/authenticated",
|
|
{
|
|
headers: {
|
|
cookie: `.ROBLOSECURITY=${cookie}`,
|
|
},
|
|
},
|
|
);
|
|
|
|
if (!authedUserReq.ok) return jsonError("Cookie is invalid", 400);
|
|
|
|
const authedUser: { id: number; name: string } = await authedUserReq.json();
|
|
|
|
const createCardReq = await fetch(
|
|
`https://api.trello.com/1/cards?key=${context.env.TRELLO_API_KEY}&token=${context.env.TRELLO_API_TOKEN}`,
|
|
{
|
|
body: JSON.stringify({
|
|
desc: `Old account: ${authedUser.name} (${authedUser.id})`,
|
|
idList: "5fbd440cd30b6377f959e244",
|
|
name: `${authedUser.name} | Data Transfer`,
|
|
}),
|
|
headers: {
|
|
accept: "application/json",
|
|
"content-type": "application/json",
|
|
},
|
|
method: "POST",
|
|
},
|
|
);
|
|
|
|
if (!createCardReq.ok) return jsonError("Failed to create entry", 500);
|
|
|
|
await context.env.DATA.put(
|
|
`datatransfer_${id}`,
|
|
JSON.stringify({
|
|
oldUser: authedUser,
|
|
}),
|
|
{
|
|
expirationTtl: 900,
|
|
},
|
|
);
|
|
|
|
return new Response(null, {
|
|
headers: {
|
|
location: `/data-transfer/${id}`,
|
|
},
|
|
status: 201,
|
|
});
|
|
}
|