import crypto from 'crypto'; export class _Crypto { constructor(User, Password) { this.salt = 'H$44Q3RVCd9X8Ef63tB4'; this.secret = 'mYFUZX9NSx7K74r7Jh@O'; this.pepper = String.fromCharCode(this.getRandomInt(65, 90)); this.password = Password; this.user = User; this.algorithm = 'aes-192-cbc'; } get Hash() // to use on register { return this.hash() } hash(p) { return crypto.createHmac('sha256', this.secret).update(this.user+this.password+this.salt + (p?p:this.pepper) ).digest('hex'); } eHash(Email) { return new Buffer.from(Email).toString('base64'); } decrypt(eHash) { return new Buffer.from(eHash, 'base64').toString('utf8'); } getRandomInt(min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min)) + min; } //TODO: compare(hash) //Get hash from db run through the peper possibilties and see if there is a match. //return hash if true, null if false } export class Epoch { /** * * @param {Number} Days - Must be and integer. */ constructor(Days) { this.Days = (Days*(24*60*60)); this.epoch = this.epocher(); } epocher() { return Math.floor(this.Days + Date.now()/1000) } /** * @param {String} time - Must follow the format of '18:12'. */ sEpoch(time) { let hours = time.split(':')[0]; let minutes = time.split(':')[1]; return Math.floor(this.next(hours, minutes)/1000); } /** * @param {Number} time - Must be and integer. */ toDate(time) { //console.log('classes:toDate:', time) const d = new Date(time*1000); return d.getHours()+':'+ d.getMinutes(); } /** * Returns the next possible time for the command to be sent. Meaning if the hours inputed by the user * have already gone past this day then the epoch will be set for the next. * If not the epoch will be created like usual. * * @param {Number} hours * @param {Number} minutes */ next(hours, minutes) { var d= new Date(); var payload = new Date(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate(), hours, minutes, 0, 0).getTime(); //console.log('Classes:Next:',hours, minutes, payload) return payload; } } /** * Use it to transform an hour value into miliseconds. * @param {Number} Hours - Hours to transform */ function hours(Hours) { return Hours*60*60*1000; } /** * This function writes a cookie on the client side. * Primary use: Store users Hash for every other page. * @argument {Response} res - Response: express response object. * @argument {String} name - Name of the cookie. * @argument {*} value - Value of the cookie. */ export function baker(res, name, value) { return new Promise((resolve,reject)=> { try { res.cookie(name, '',{maxAge:0}); res.cookie(name, value, {maxAge:hours(2),path:'/',secure:false,httpOnly:false}); resolve(); } catch (e) { reject(e) } }) } /** * Hash used on register to check if there is already a user with the same credentials. * @param {String} user - User's email * @param {String} password - User's Password * @param {String} hash - User's identifying hash */ export function bouncer (user, password, hash) { return new Promise((resolve, reject)=> { //!Crypto compare needs to be reworked so this is legacy code not supposed to work // new _Crypto(user, password).compare().then(m=> // { // if(hash) // { // if(m==hash) // { // resolve(m) // } // else // { // reject('You are on a different account.') // } // } // else // { // resolve(m) // } // }).catch(m=> // { // reject(m) // }) }) } export function cookieSlicer(cookie, id) { cookie = cookie.split(';'); var result = new Map(); for(var item of cookie) { let aux = item.split('='); result.set(aux[0], aux[1]); } return id?result.get(id):result; }