Geniální software

This commit is contained in:
2025-11-23 19:28:16 +01:00
commit a54be48212
7 changed files with 1286 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
.env
.DS_Store
node_modules

3
README.md Normal file
View File

@@ -0,0 +1,3 @@
# Shitty registration UI
Purpose-built. I suppose you could use this to let your friends register on your DMS instance. The UI is in Czech.

69
index.js Normal file
View File

@@ -0,0 +1,69 @@
import dotenv from "dotenv";
import e from "express";
import z from "zod";
import { execa } from "execa";
dotenv.config();
const PORT = process.env.PORT || 3000;
const CONTAINER = process.env.CONTAINER || "mailserver";
const INVITE_CODE = process.env.INVITE_CODE;
const DOMAIN = process.env.DOMAIN;
const RegisterSchema = z.object({
invite: z.literal(INVITE_CODE, "ŠPATNÝ KÓD, GÓJI."),
username: z
.string()
.trim()
.regex(
/^[a-zA-Z0-9]([a-zA-Z0-9._-]{0,62}[a-zA-Z0-9])?$/,
"Neplatný formát jména."
)
.transform((s) => s.toLowerCase()),
password: z
.string()
.trim()
.min(8, "Heslo by mělo mít aspoň 8 znaků.")
.regex(/^[^\s]+$/, "Heslo prosím bez mezer."),
});
const app = e();
app.use(e.urlencoded({ extended: true }));
app.use(e.static("public"));
app.post("/register", async (req, res) => {
const result = RegisterSchema.safeParse(req.body);
if (!result.success) {
return res
.status(400)
.send(`Tvůj požadavek je neplatný: ${result.error.issues[0].message}`);
}
const email = `${result.data.username}@${DOMAIN}`;
const password = result.data.password;
try {
await execa(
"docker",
["exec", "-i", CONTAINER, "setup", "email", "add", email, password],
{ timeout: 10000 }
);
res.send(
`VÍTEJ V TAJNÉM ELITNÍM KLUBU. Tvůj nový profesionální e-mail je ${email}.`
);
} catch (err) {
console.error("CHYBA:", err.stderr || err.message);
res
.status(500)
.send(
"Buď se něco rozbilo nebo tento e-mail už existuje. Kdyžtak si postěžuj sneedNEGROVI."
);
}
});
app.listen(PORT);

1134
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

22
package.json Normal file
View File

@@ -0,0 +1,22 @@
{
"name": "shitty-registration-ui",
"version": "1.0.0",
"description": "A shitty ad hoc UI to create an account on my amazing mail server.",
"repository": {
"type": "git",
"url": "https://git.czchan.org/sneedmaster/shitty-registration-ui"
},
"license": "AGPL-3.0-only",
"author": "sneedmaster <sneedmaster@czchan.org>",
"type": "module",
"main": "index.js",
"scripts": {
"test": "echo \"Meds.\""
},
"dependencies": {
"dotenv": "^17.2.3",
"execa": "^9.6.0",
"express": "^5.1.0",
"zod": "^4.1.12"
}
}

52
public/index.html Normal file
View File

@@ -0,0 +1,52 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="./style.css" />
<title>Registrace</title>
</head>
<body>
<h1>REGISTRACE DO TAJNÉHO ELITNÍHO KLUBU</h1>
<form method="post" action="/register">
<table>
<tbody>
<tr>
<td>
<label for="invite">Kód pozvánky</label>
</td>
<td>
<input id="invite" name="invite" type="text" />
</td>
</tr>
<tr>
<td>
<label for="username">Uživatelské jméno</label>
<br>
<small>(Část emailu před zavináčem)</small>
</td>
<td>
<input id="username" name="username" type="text" />
</td>
</tr>
<tr>
<td>
<label for="password">Heslo</label>
</td>
<td>
<input id="password" name="password" type="password" />
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="Registrovat" />
</td>
</tr>
</tbody>
</table>
</form>
</body>
</html>

3
public/style.css Normal file
View File

@@ -0,0 +1,3 @@
:root {
font-family: sans-serif;
}