const methods = require('../functions/methods') const async = require('async') const mailer = require('../config/mailer') const constants = require('../config/const') // pwd encryption const crypto = require('crypto') const bcrypt = require('bcryptjs') const saltRounds = 10 const salt = 64 module.exports = function (app, config, lang) { // ================== NEW USERS REGISTRATION ====================== app.get('/registration', function(req, res) { res.render(lang+'/account/registration') }) app.post('/registration', function(req, res) { // user data var curDate = new Date() var userData = { salutation: req.body.inputSalutation, title: req.body.inputTitle, firstname: req.body.inputFirstname, lastname: req.body.inputLastname, email: req.body.inputEmail, organisation: req.body.inputOrganisation, industry: req.body.inputIndustry, speciality: req.body.inputSpeciality, createdDate: curDate.toISOString().slice(0,10) } var userEmail = userData.email var pos = userEmail.indexOf('@') var emailLength = userEmail.length var emailDomain = userEmail.slice(pos, emailLength); if ( emailDomain.toLowerCase() == "@hft-stuttgart.de") { res.flash('error', "Fehlgeschlagen: HFT-Account") res.redirect('/account/registration') } else { let token async.waterfall([ function(done) { crypto.randomBytes(20, function(err, buf) { token = buf.toString('hex'); done(err, token); }); }, // encrypt password function(token, done) { bcrypt.genSalt(saltRounds, function(err, salt) { bcrypt.hash(req.body.inputPassword, salt, function(err, hash) { var newAccount = { profile: userData, password: hash, verificationToken: token } done(err, newAccount) }); }); }, // save data function(newAccount, err) { methods.registerNewUser(newAccount, function(err){ if (err) { res.flash('error', "Fehlgeschlagen") } else { // send email var emailSubject = "Bitte bestätigen Sie Ihr M4_LAB Benutzerkonto" var emailContent = '
Lieber Nutzer,

' + '

vielen Dank für Ihre Anmeldung am Transferportal der HFT Stuttgart.
' + 'Um Ihre Anmeldung zu bestätigen, klicken Sie bitte diesen Link ' + '

' + 'Ohne Bestätigung Ihres Kontos müssen wir Ihr Konto leider nach 7 Tagen löschen.


' + constants.mailSignature + '
'; mailer.options.to = req.body.inputEmail; mailer.options.subject = emailSubject; mailer.options.html = emailContent; mailer.transport.sendMail(mailer.options, function(err) { if (err) { console.error('cannot send email') throw err } }) // user feedback res.flash('success', 'Vielen Dank für Ihre Registrierung!'+'\r\n\r\n'+ 'Wir haben Ihnen eine E-Mail an Ihre verwendete Adresse gesendet. Diese enthält einen Link zur Bestätigung Ihres Accounts.'+'\r\n'+ 'Wenn Sie die Mail nicht in ihrem Postfach vorfinden, prüfen Sie bitte auch Ihren Spam-Ordner.') } res.redirect('/account/registration') }) } ]) } }) // =================== USERS VERIFICATION ========================= app.get("/verifyAccount", async function(req, res){ let userId = await methods.getUserIdByVerificationToken(req.query.token) if (!userId) { // no user found res.render(lang+'/account/verification', { status: null }) } else { // a user found, verify the account let userData = { id: userId, verificationStatus: 1 } methods.verifyUserAccount(userData, async function(err){ if (err) { console.log("Error: "+err) res.render(lang+'/account/verification', { status: false }); } else { // send welcome email after successful account verification let userEmail = await methods.getUserEmailById(userId) if (!userEmail) { res.render(lang+'/account/verification', { status: false }) } else { // send email var emailSubject = "Herzlich willkommen" var emailContent = '
Lieber Nutzer,

' + '

herzlich willkommen beim Transferportal der HFT Stuttgart!
' + 'Sie können nun alle Dienste des Portals nutzen.


' + constants.mailSignature; mailer.options.to = userEmail mailer.options.subject = emailSubject mailer.options.html = emailContent mailer.transport.sendMail(mailer.options, function(err) { if (err) { console.log('cannot send email') throw err } }) res.render(lang+'/account/verification', { status: true }) } } }) } }) // ==================== FORGOT PASSWORD =========================== app.get('/forgotPwd', function (req, res) { res.render(lang+'/account/forgotPwd', { user: req.user }) }) app.post('/forgotPwd', function(req, res) { let emailAddress = req.body.inputEmail async.waterfall([ function(done) { crypto.randomBytes(20, function(err, buf) { var token = buf.toString('hex') done(err, token) }) }, async function(token) { let user = await methods.checkUserEmail(emailAddress) if (!user) { console.log('no user found') } else { var emailSubject = "Ihre Passwort-Anfrage an das Transferportal der HFT Stuttgart"; var emailContent = '

Lieber Nutzer,

' + '

wir haben Ihre Anfrage zur Erneuerung Ihres Passwortes erhalten. Falls Sie diese Anfrage nicht gesendet haben, ignorieren Sie bitte diese E-Mail.

' + 'Sie können Ihr Passwort mit dem Klick auf diesen Link ändern: '+config.app.host+'/reset/' + token + '
' + 'Dieser Link ist aus Sicherheitsgründen nur für 1 Stunde gültig.

' + constants.mailSignature + '
' var credentialData = { user_id: user.id, resetPasswordToken: token, resetPasswordExpires: Date.now() + 3600000 // 1 hour } methods.updateCredential(credentialData, function(err) { if (err) { console.error(err) } }) // send email mailer.options.to = emailAddress mailer.options.subject = emailSubject mailer.options.html = emailContent mailer.transport.sendMail(mailer.options, function(err) { if (err) { console.error(err) } }) } } ], function(err) { if (err) { res.flash('error', 'Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut.') } else { res.flash('success', 'Wenn Ihre E-Mail-Adresse registriert ist, wurde eine E-Mail mit dem weiteren Vorgehen an ' + emailAddress + ' versendet.') } res.redirect('/account/forgotPwd') }) }) // reset app.get('/reset/:token', async function(req, res) { let user = await methods.getUserByToken(req.params.token) if (!user) { res.flash('error', 'Der Schlüssel zum zurücksetzen des Passworts ist ungültig oder abgelaufen.') res.redirect('/account/forgotPwd') } else { res.render(lang+'/account/reset') } }) app.post('/reset/:token', async function(req, res) { var newPwd = req.body.inputNewPwd let user = await methods.getUserByToken(req.params.token) if (!user) { res.flash('error', "User not found.") res.redirect('/login') } else { // encrypt password bcrypt.genSalt(saltRounds, function(err, salt) { bcrypt.hash(newPwd, salt, function(err, hash) { var credentialData = { password: hash, user_id: user.user_id } // update password methods.updateCredential(credentialData, function(err){ if (err) { res.flash('error', "Datenbankfehler: Passwort kann nicht geändert werden.") throw err } else { res.flash('success', "Passwort aktualisiert!") // send notifiaction email mailer.options.to = user.email mailer.options.subject = constants.updatePasswordMailSubject mailer.options.html = constants.updatePasswordMailContent+'
'+constants.mailSignature+'
' mailer.transport.sendMail(mailer.options, function(err) { if (err) { console.log(err) } }) res.redirect('/login') } }) }); }); } }) // ======================= CONTACT FORM =========================== app.get('/contact', function (req, res) { res.render(lang+'/account/contact', { user: req.user }) }) app.post('/contact', function(req, res, next) { //methods.currentDate(); let emailAddress = req.body.inputEmail; let supportAddress = "support-transfer@hft-stuttgart.de"; let inputName = req.body.name; let inputContent = req.body.message; let emailContent = "Es wurde eine Anfrage an das Transferportal gestellt: \n\n NAME: " + inputName + "\n NACHRICHT:\n "+ inputContent; let emailSubject = "Ihre Anfrage an das Transferportal"; async.waterfall([ function(done) { // send email mailer.options.to = supportAddress; mailer.options.cc = emailAddress; mailer.options.subject = emailSubject; mailer.options.text = emailContent; mailer.transport.sendMail(mailer.options, function(err) { done(err, 'done'); }); } ], function(err) { if (err) { console.error(err) res.flash('error', 'Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut.'); } else { res.flash('success', 'Vielen Dank für Ihre Anfrage. Wir melden uns baldmöglichst bei Ihnen. Eine Kopie Ihrer Anfrage wurde an ' + emailAddress + ' versandt.'); } res.redirect('/account/contact') }) }) }