openpuzzle-captcha/sandbox/simple-server/server.js

119 lines
2.7 KiB
JavaScript

const fs = require("fs");
const gm = require("./gm");
const app = require("express")();
const tasks = new Object();
app.use((req, res, next) => {
//return next(); // <-- Disable All CORS
res.setHeader("Access-Control-Allow-Origin", "*");
res.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS");
res.setHeader("Access-Control-Allow-Headers", "Content-Type");
if (req.method === "OPTIONS") {
return res.sendStatus(200);
}
next();
});
app.use(require("body-parser").json());
function shuffle(array) {
for (let i = array.length - 1; i > 0; i--) {
let j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
}
function getHash(length = 3) {
return Buffer.from(
[...new Array(length)].map((x) => Math.round(Math.random() * 255)),
).toString("hex");
}
app.post("/test", async (req, res) => {
if (!tasks.test) {
return res.status(400).json({
isError: true,
message: "'test' is unknown task",
});
}
console.log(req.body);
if (!req.body?.answer)
return res.status(400).json({
isError: true,
message: "Empty field 'answer' in JSON-body",
});
const solve = req.body.answer;
if (solve === tasks.test.solve) {
const successCode = tasks.test.solveHash
delete tasks.test;
return res.json({
isError: false,
isSuccess: true,
successCode,
});
} else {
delete tasks.test;
return res.json({
isError: false,
isSuccess: false,
tryAgain: "/test",
});
}
});
app.get("/test", async (req, res) => {
if (tasks.test)
return res.json({
isError: false,
mode: "3x3",
fragments: tasks.test.fragments,
});
//const choosenImage = fs.readFileSync("./images/791082.jpg");
//const choosenImage = fs.readFileSync("./images/f2bc8547eb879cef0b782ff2cda8baaf.jpg");
const choosenImage = fs.readFileSync("./images/5922524_16876101.jpg");
//const choosenImage = fs.readFileSync("./images/g619806.jpg");
//const choosenImage = fs.readFileSync("./images/576746.jpg");
const results = [];
const fragments = new Object();
let solve = "";
const addOps = [];
for (let row = 0; row < 3; row++)
for (let col = 0; col < 3; col++) {
let key;
do {
key = getHash();
} while (!!fragments[key]);
solve += key;
const shardBytes = await gm.repixelise(
await gm.cropImage(choosenImage, 50, 50, col * 50, row * 50),
);
addOps.push(
() =>
(fragments[key] =
`data:image/png;base64,${shardBytes.toString("base64")}`),
);
}
shuffle(addOps);
addOps.forEach((f) => f());
const solveHash = getHash(8);
tasks.test = { fragments, solve, solveHash };
console.log("Required solve:", solve);
res.json({
isError: false,
mode: "3x3",
fragments,
});
});
app.listen(8081, (err) => {
if (err) throw err;
console.info(`Listening: 8081`);
});