123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- "use strict";
- module.exports = async (tip, login, pwd, cptId, capt, addr) => {
- try {
-
- const pattLogin = /^[a-z0-9]+$/;
- if (!pattLogin.test(login)) return 0;
-
-
- const captCheck = () => {
- let cptIdIndex = captchaIdArr.indexOf(Number(cptId));
- if (cptIdIndex > -1) {
- captchaIdArr.splice(cptIdIndex, 1);
- if (captNumGen(cptId) != capt) return 1;
- else return 1;
- }
- else return 1;
- }
-
-
- let resp = {};
-
-
-
- const collect = {"staff": "staff", "pupil": "pupils", "par": "pupils"};
- const uRoles = {"staff": "teacher", "pupil": "pupil", "par": "parent"};
-
-
- let dt = ~~(Date.now()/(1000 * 3600 * 24));
-
- let tokenTrue = '¤' + hash(dt+addr+login, salt);
-
-
- if (login == "admin") {
-
- if (pwd[0] == '¤') {
- if (pwd == tokenTrue) resp.roles = ["root"];
- else return 0;
- }
-
- else {
-
- if (!captCheck()) return 0;
-
- if (hash(pwd, 'z') == admPwd) resp.roles = ["root"];
- else return 0;
-
- resp.token = '¤' + hash(dt+addr+login, salt);
- }
- }
-
-
- else {
-
- if (!collect[tip]) return 0;
- let uRecord = await dbFind(collect[tip], {Ulogin: login});
- if (!uRecord.length) return 0;
-
-
- if (uRecord[0].block) return 0;
-
-
- if (pwd[0] == '¤') {
- if (pwd == tokenTrue) resp.roles = [uRoles[tip]];
- else return 0;
- }
-
-
- else {
- if (!captCheck()) return 0;
- let userHash = hash(pwd, salt);
-
-
- if (tip == "par") {
- let parHash = hash('p' + pwd, salt);
- if (uRecord[0].UpwdPar == parHash) resp.roles = ["parent"];
- else return 0;
- }
-
- else {
- if (uRecord[0].Upwd == userHash) resp.roles = [uRoles[tip]];
- else return 0;
- }
-
- resp.token = '¤' + hash(dt+addr+login, salt);
- }
-
-
- if (tip == "staff" && uRecord[0].admin) resp.roles.push("admin");
-
-
-
- let tutCl = [];
- let clListArr = await dbFind("curric", {type: "class"});
- for (let currDoc of clListArr)
- if (currDoc.tutor)
- if (currDoc.tutor == login) tutCl.push(currDoc.className);
- if (tutCl.length) {
- resp.roles.push("tutor");
- resp.tutClss = tutCl;
- }
-
-
-
- resp.teachLoad = {};
- let uDistrArr = await dbFind("distrib", {tLogin: login});
- if (uDistrArr.length) {
- let uDistrObj = uDistrArr[0].tLoad;
- for (let subj of Object.keys(uDistrObj)) {
- for(let clName of uDistrObj[subj]) {
- if (resp.teachLoad[clName]) resp.teachLoad[clName].push(subj);
- else resp.teachLoad[clName] = [subj];
- }
- }
- }
- }
- return JSON.stringify(resp);
- }
- catch(e) {return 0;}
- }
|