123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 |
- "use strict";
- const DOCROOT = __dirname + "/www",
- https = require("https"),
- fs = require("fs"),
- nedb = require("@yetzt/nedb"),
- {
- PORT, SERVER, ERR404, MIME, PWD, SALT, SALTPIN,
- ADMIN, KEYPATH, CERTPATH, CAPATH
- } = require("./config"),
- api = require("./api"),
- captGen = require("./api/captchaGen"),
- httpsOpt = {
- key: fs.readFileSync(__dirname + "/ssl/" + KEYPATH),
- cert: fs.readFileSync(__dirname + "/ssl/" + CERTPATH)
- };
- if (CAPATH) httpsOpt.ca = CAPATH;
- global.salt = SALT;
- global.saltpin = SALTPIN;
- global.admPwd = PWD;
- const dbTables = [
- "staff", "pupils", "curric", "distrib", "grades", "spravki", "topics",
- "authlog", "notes"
- ];
- global.db = {};
- for (let dbN of dbTables) db[dbN] =
- new nedb({filename: `${__dirname}/db/${dbN}.db`, autoload: true});
- const putlog = (ip, reqMeth, pathname, kodOtv, lengthOtv) => {
- let
- now = new Date(),
- y = now.getFullYear(),
- m = (now.getMonth() + 1).toString().padStart(2, '0'),
- d = now.getDate().toString().padStart(2, '0'),
- h = now.getHours().toString().padStart(2, '0'),
- i = now.getMinutes().toString().padStart(2, '0'),
- s = now. getSeconds().toString().padStart(2, '0'),
- dt = `${y}-${m}-${d}`,
- tm = `${h}:${i}:${s}`;
-
-
- fs.appendFile(
- __dirname + `/logs/${dt}.log`,
- `${ip} [${tm}] ${reqMeth} ${pathname} ${kodOtv} ${lengthOtv}\n`,
- e => {}
- )
-
-
- if (pathname.includes(" login]") && lengthOtv > 5) {
- let loginArr = pathname.replace(/[\[\], ]/g, '').replace("login", '')
- . split('_'),
- login = loginArr[0],
- categ = loginArr[1] || "root";
- db.authlog.insert({d: `${dt} ${tm}`, l: login, c: categ, ip: ip});
- }
- };
- global.captNumGen = str => {
- let captNum = '', s, h = 0;
- for (let j = 0; j < 6; j++) {
- s = global.salt + j + str;
- for (let i=0; i<s.length; i++) h = ((h << 5) - h) + s.charCodeAt(i);
- captNum += Math.abs(h) % 10;
- }
- return captNum;
- }
- global.dbFind = (collectionName, objFind) => {
- return new Promise((resolve, reject) => {
- db[collectionName].find(objFind, (err, docs) => {
- if (err) reject(err);
- else resolve(docs);
- })
- })
- };
- global.hash = (str, slt) => {
- let
- alph = "0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz",
- char,
- strNew,
- h = 0,
- pass = '';
- for (let j = 0; j < 24; j++) {
- strNew = slt + j + str;
- for (let i = 0; i < strNew.length; i++) {
- char = strNew.charCodeAt(i);
- h = ((h << 5) - h) + char;
- }
- pass += alph[Math.abs(h) % alph.length];
- }
- return pass;
- }
- const sendOtvet = (otvet, kod, contType, content) => {
- otvet.writeHead(kod, {
- "Content-Type": contType, "Server": SERVER,
- "Strict-Transport-Security": "max-age=32000000",
- "Access-Control-Allow-Origin": "*"
- });
- otvet.end(content);
- }
- const captOpt = {
- bkR: 246, bkG: 243, bkB: 240,
- fnR: 214, fnG: 191, fnB: 168,
- }
- global.captchaIdArr = [];
- const CAPTDEATH = 180;
- https.createServer(httpsOpt, (zapros, otvet) => {
-
-
- let url = new URL("http://host" + zapros.url),
- pathname = url.pathname;
- if (!pathname.includes(".")) pathname += "/index.html";
- pathname = pathname.replace("//", '/').replace(/\.\./g, '');
-
- let ADDR = (zapros.socket.remoteAddress || "unknown")
- . replace("::1", "127.0.0.1").replace(/\:.*\:/, '');
-
-
- if (pathname == "/a.a") sendOtvet(otvet, 200, "text/plain", ADMIN);
-
-
- else if (pathname == "/cpt.a") {
- let tm = Date.now();
-
- captchaIdArr = captchaIdArr.filter(
- x => Number(x) > Number(tm - CAPTDEATH * 1000));
- captchaIdArr.push(tm);
- otvet.writeHead(200, {
- "Content-Type": "image/png", "Server": SERVER, "X-Cpt": tm,
- "Access-Control-Allow-Origin": "*",
- "Access-Control-Expose-Headers": "X-Cpt"
- });
- otvet.end(captGen(captNumGen(tm), captOpt));
- }
-
-
- else if (zapros.method == "GET")
- fs.readFile(DOCROOT + pathname, function(err, cont) {
- let mtip = MIME[pathname.split(".").pop()];
- if (!mtip || err) {
- sendOtvet(otvet, 404, "text/html", ERR404);
- putlog(ADDR, "GET", pathname, 404, ERR404.length);
- }
- else {
- sendOtvet(otvet, 200, mtip, cont);
-
- if (pathname == "/index.html")
- putlog(ADDR, "GET", '/', 200, cont.length);
- }
- });
-
-
- else {
- let postData = '';
- zapros.on("data", dann => postData += dann.toString());
- zapros.on("end", async () => {
- let cont = await api(postData, ADDR);
- sendOtvet(otvet, 200, "text/plain", cont);
-
-
-
-
-
- let logCont = '';
- let logFuncs = [
- "login", "classAdd", "classDel", "subjAdd", "subjEdit", "subjDel",
- "usAddEdit", "usImport", "usSetAdmin", "usBlock", "usChPwd",
- "tutorSet", "distrEdit", "topicEdit", "gradeAdd", "subgrEdit",
- "subgrPups", "sprAdd", "sprDel", "notesAdd", "notesDel",
- "interGroupEdit", "interGroupDel", "interGroupPup", "tabelGenAll",
- "permitAdd", "sprEdit"
- ];
- try {
- let postDataObj = JSON.parse(postData);
- let logLogin = postDataObj.l || "none";
- let logFunc = postDataObj.f || "none";
- let logRole = `_${postDataObj.t}` || "_none";
- if (logLogin == "admin") logRole = '';
- if (logFuncs.includes(logFunc))
- logCont = `[${logLogin}${logRole} ${logFunc}]`;
- }
- catch(e) {;}
- let codeOtv = (cont == "none") ? 403 : 200;
- if (logCont) putlog(ADDR, "POST", logCont, codeOtv, cont.length);
- });
- }
-
- }).listen(PORT);
- const http = require("http");
- http.createServer((zapros, otvet) => {
- try {
- otvet.writeHead(
- 301, {"Location": "https://" + zapros.headers["host"] + zapros.url}
- ); otvet.end();
- }
- catch (e) {
- otvet.writeHead(404, {"Content-Type": "text/html", "Server": SERVER});
- otvet.end(ERR404);
- }
- }).listen(80);
- let now = (new Date()).toString().replace(/ \(.*\)/, '');
- console.info(`${now} ScoleServer стартовал на порту ${PORT}`);
|