import async from 'async' import bcrypt from 'bcryptjs' import methods from '../functions/methods' import mailer from '../config/mailer' import constants from '../config/const' const saltRounds:number = 10 const salt:number = 64 export = function (app:any, config:any, lang:string) { // ================== NEW USERS REGISTRATION ====================== app.get('/registration', function(req:any, res:any) { res.render(lang+'/account/registration') }) app.post('/registration', function(req:any, res:any) { // user data let curDate:Date = new Date() let userData:any = { 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) } let userEmail:any = userData.email let pos:number = userEmail.indexOf('@') let emailLength:number = userEmail.length let emailDomain:any = userEmail.slice(pos, emailLength); if ( emailDomain.toLowerCase() == "@hft-stuttgart.de") { res.flash('error', "Fehlgeschlagen: HFT-Account") res.redirect('/account/registration') } else { async.waterfall([ function(done:any) { // generate token let token:string = ''; let randomChars:string = 'abcdefghijklmnopqrstuvwxyz0123456789'; for ( let i = 0; i<40; i++ ) { token += randomChars.charAt(Math.floor(Math.random() * randomChars.length)); } // encrypt password bcrypt.genSalt(saltRounds, function(err, salt) { bcrypt.hash(req.body.inputPassword, salt, function(err:any, hash:any) { let newAccount:any = { profile: userData, password: hash, verificationToken: token } done(err, newAccount) }); }); }, // save data function(newAccount:any, err:any) { methods.registerNewUser(newAccount, function(err:any){ if (err) { res.flash('error', "Fehlgeschlagen") } else { // send email let emailSubject = "Bitte bestätigen Sie Ihr M4_LAB Benutzerkonto" let 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.transporter.sendMail(mailer.options, function(err:any) { if (err) { console.error('Cannot send email. [Error] '+err) 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') }) } ]) } }) // to check whether or not an account is already exist app.get('/email/:email', async function(req:any, res:any) { let user = await methods.checkUserEmail(req.params.email) if (!user) { console.log('No user found: '+req.params.email) res.send(true) } else { console.log('User found: '+req.params.email) res.send(false) } }) // =================== USERS VERIFICATION ========================= app.get("/verifyAccount", async function(req:any, res:any){ let userId:number = 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:any = { id: userId, verificationStatus: 1 } methods.verifyUserAccount(userData, async function(err:any){ if (err) { console.log("Error: "+err) res.render(lang+'/account/verification', { status: false }); } else { // send welcome email after successful account verification let userEmail:string = await methods.getUserEmailById(userId) if (!userEmail) { res.render(lang+'/account/verification', { status: false }) } else { // send email let emailSubject = "Herzlich willkommen"; let 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.transporter.sendMail(mailer.options, function(err:any) { if (err) { console.log('cannot send email'); throw err; } }) res.render(lang+'/account/verification', { status: true }) } } }) } }) // ==================== FORGOT PASSWORD =========================== app.get('/forgotPwd', function (req:any, res:any) { res.render(lang+'/account/forgotPwd', { user: req.user }) }) app.post('/forgotPwd', function(req:any, res:any) { let emailAddress = req.body.inputEmail async.waterfall([ async function(done:any) { let user = await methods.checkUserEmail(emailAddress) if (!user) { console.log('No user found: '+emailAddress) } else { // generate token let token:string = ''; let randomChars:string = 'abcdefghijklmnopqrstuvwxyz0123456789'; for ( let i = 0; i<40; i++ ) { token += randomChars.charAt(Math.floor(Math.random() * randomChars.length)); } let emailSubject = "Ihre Passwort-Anfrage an das Transferportal der HFT Stuttgart"; let 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 + '
' let credentialData = { user_id: user.id, resetPasswordToken: token, resetPasswordExpires: Date.now() + 3600000 // 1 hour } let result = await methods.updateCredential(credentialData) if (!result) { console.log('failed to update credential') } else { // send email mailer.options.to = emailAddress mailer.options.subject = emailSubject mailer.options.html = emailContent mailer.transporter.sendMail(mailer.options, function(err:any) { if (err) { console.error(err) } }) } } done(null) } ], function(err:any) { 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:any, res:any) { 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:any, res:any) { let 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, async function(err:any, hash) { let credentialData = { password: hash, user_id: user.user_id, resetPasswordToken: null, resetPasswordExpires: null } // update password let result = await methods.updateCredential(credentialData) if (!result) { console.log('Failed to reset password') res.flash('error', "Datenbankfehler: Passwort kann nicht geändert werden.") } else { res.flash('success', "Passwort aktualisiert!") // send notification email mailer.options.to = user.email mailer.options.subject = constants.updatePasswordMailSubject mailer.options.html = constants.updatePasswordMailContent+'
'+constants.mailSignature+'
' mailer.transporter.sendMail(mailer.options, function(err:any) { if (err) { console.log(err) } }) } res.redirect('/login') }); }); } }) // ======================= CONTACT FORM =========================== app.get('/contact', function (req:any, res:any) { res.render(lang+'/account/contact', { user: req.user }) }) app.post('/contact', function(req:any, res:any, next:any) { //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 emailSubject = "Ihre Anfrage an das Transferportal"; let emailContent = "Es wurde eine Anfrage an das Transferportal gestellt: \n\n NAME: " + inputName + "\n NACHRICHT:\n "+ inputContent; async.waterfall([ function(done:any) { // send email mailer.options.to = supportAddress; mailer.options.cc = emailAddress; mailer.options.subject = emailSubject; mailer.options.html = emailContent; mailer.transporter.sendMail(mailer.options, function(err:any) { done(err, 'done'); }); } ], function(err:any) { 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') }) }) }