-
-
Notifications
You must be signed in to change notification settings - Fork 3
/
register.js
110 lines (91 loc) · 3.7 KB
/
register.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
const bcrypt = require('bcrypt');
const readlineSync = require('readline-sync');
const jwt = require('jsonwebtoken');
const fs = require('fs');
const path = require('path');
const sqlite3 = require('sqlite3').verbose();
const clc = require('cli-color');
require('dotenv').config();
const { JWT_TOKEN } = process.env;
const DBfolderPath = './db';
if (process.env.ALLOW_METRICS === 'true') {
const Sentry = require("@sentry/node");
const { CaptureConsole } = require('@sentry/integrations');
Sentry.init({
dsn: "https://e7956175a50159561a2fcb0999ac56ce@o937824.ingest.sentry.io/4505795835658240",
tracesSampleRate: 0.4,
integrations: [
new CaptureConsole({
levels: ['error']
})
],
});
}
if (!fs.existsSync(DBfolderPath)) {
fs.mkdirSync(DBfolderPath);
console.log(clc.green('[INFO] | » Datenbank-Ordner wurde erstellt.'));
} else {
console.log(clc.yellow('[INFO] | » Datenbank-Ordner existiert bereits.'));
}
const db = new sqlite3.Database('./db/datenbank.sqlite');
const uploadsFolderPath = path.join(__dirname, 'uploads');
try {
if (!fs.existsSync(uploadsFolderPath)) {
fs.mkdirSync(uploadsFolderPath);
console.log(clc.yellow('[INFO] | » Uploads-Ordner wurde erstellt oder bereits vorhanden.'));
}
db.serialize(() => {
const createTableQuery = `
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL,
password TEXT NOT NULL,
token TEXT NOT NULL,
role TEXT NOT NULL DEFAULT 'mitglied'
)
`;
db.run(createTableQuery);
console.log(clc.yellow('[INFO] | » Tabelle "users" erfolgreich erstellt oder bereits vorhanden.'));
const generateToken = (id, username, role) => {
const payload = {
id,
username,
role
};
const token = jwt.sign(payload, JWT_TOKEN);
return token;
};
console.log(clc.whiteBright('\nBitte geben Sie die folgenden Informationen ein, um einen neuen Benutzer zu erstellen.\nNutze beim Passwort keine Sonderzeichen!\n'));
const username = readlineSync.question('Benutzername: ');
const existingUserQuery = 'SELECT * FROM users WHERE username = ?';
const existingUserValues = [username];
db.get(existingUserQuery, existingUserValues, (error, existingUser) => {
if (error) {
console.error(clc.red('\n[ERROR] | » Fehler beim Überprüfen des Benutzernamens:', error.message));
return;
}
if (existingUser) {
console.log(clc.red('\nDieser Benutzername ist bereits vergeben.\nBitte versuche es mit einem anderen Benutzernamen.\n'));
} else {
const password = readlineSync.question('Passwort: ', { hideEchoBack: true });
const isAdmin = readlineSync.question('Ist der Benutzer ein Administrator? (Ja/Nein): ');
const hashedPassword = bcrypt.hashSync(password, 10);
const role = isAdmin.toLowerCase() === 'ja' ? 'admin' : 'mitglied';
const token = generateToken(1, username, role);
const insertUserQuery = 'INSERT INTO users (username, password, token, role) VALUES (?, ?, ?, ?)';
const insertUserValues = [username, hashedPassword, token, role];
db.run(insertUserQuery, insertUserValues, (error) => {
if (error) {
console.error(clc.red('\n[ERROR] | » Fehler beim Einfügen des Benutzers:', error.message));
return;
}
const userFolderPath = path.join(__dirname, 'uploads', username);
fs.mkdirSync(userFolderPath);
console.log(clc.whiteBright(`\nBenutzer erstellt!\nDein Token lautet: ${token}\n`));
});
}
});
});
} catch (error) {
console.error(clc.red('[ERROR] | » Fehler:', error.message));
}