routes-account.js 39.7 KB
Newer Older
1
2
3
4
const fs = require('fs')
const SamlStrategy = require('passport-saml').Strategy
const dbconn = require('./dbconn')
const methods = require('./methods')
Rosanny Sihombing's avatar
Rosanny Sihombing committed
5
const gitlab = require('./gitlab')
Rosanny Sihombing's avatar
Rosanny Sihombing committed
6
// pwd encryption
7
8
9
const bcrypt = require('bcryptjs');
const saltRounds = 10;
const salt = 64; // salt length
Rosanny Sihombing's avatar
Rosanny Sihombing committed
10
// forgot pwd
11
12
const async = require('async')
const crypto = require('crypto')
13
const mailer = require('./mailer')
Rosanny Sihombing's avatar
Rosanny Sihombing committed
14
const axios = require('axios')
15
16
const logoDir = 'public/upload/'
const tpGitlabURL = 'https://transfer.hft-stuttgart.de/gitlab/'
Rosanny Sihombing's avatar
Rosanny Sihombing committed
17

18
19
20
const portalUser = require('../classes/user')
const projectInformation = require('../classes/website')
const projectRepo = require('../classes/repo')
Rosanny Sihombing's avatar
Rosanny Sihombing committed
21

22
module.exports = function (app, config, passport, i18n) {
Rosanny Sihombing's avatar
Rosanny Sihombing committed
23

24
25
  var loggedInUser

Rosanny Sihombing's avatar
Rosanny Sihombing committed
26
27
28
29
30
31
32
33
34
  // =========== PASSPORT =======
  passport.serializeUser(function (user, done) {
    done(null, user);
  });

  passport.deserializeUser(function (user, done) {
    done(null, user);
  });

Varun Srivastava's avatar
Varun Srivastava committed
35
36
37
38
  const mailSignature = 'Mit den besten Grüßen,<br/>das Transferportal-Team der HFT Stuttgart<br/><br/>' +
    'Transferportal der Hochschule für Technik Stuttgart<br/>' +
    'Schellingstr. 24   70174 Stuttgart<br/>' +
    'm4lab@hft-stuttgart.de<br/>' +
Rosanny Sihombing's avatar
Rosanny Sihombing committed
39
    '<a href="https://transfer.hft-stuttgart.de">https://transfer.hft-stuttgart.de</a><br/>' +
40
41
42
43
44
    '<a href="http://www.hft-stuttgart.de/Aktuell/"><img border="0" alt="HFT" src="https://m4lab.hft-stuttgart.de/img/signature/hft_logo.png" width="30" height="30"></a>  &nbsp;' +
    '<a href="http://www.facebook.com/hftstuttgart"><img border="0" alt="Facebook" src="https://m4lab.hft-stuttgart.de/img/signature/fb_bw.png" width="30" height="30"></a>  &nbsp;' +
    '<a href="https://www.instagram.com/hft_stuttgart/"><img border="0" alt="Instagram" src="https://m4lab.hft-stuttgart.de/img/signature/instagram_bw.png" width="30" height="30"></a>  &nbsp;' +
    '<a href="https://twitter.com/hft_presse"><img border="0" alt="Twitter" src="https://m4lab.hft-stuttgart.de/img/signature/twitter_bw.png" width="30" height="30"></a>  &nbsp;' +
    '<a href="https://www.youtube.com/channel/UCi0_JfF2qMZbOhOnNH5PyHA"><img border="0" alt="Youtube" src="https://m4lab.hft-stuttgart.de/img/signature/youtube_bw.png" width="30" height="30"></a>  &nbsp;' +
Varun Srivastava's avatar
Varun Srivastava committed
45
    '<a href="http://www.hft-stuttgart.de/Aktuell/Presse-Marketing/SocialMedia/Snapcode HFT_Stuttgart.jpg/photo_view">' +
46
47
    '<img border="0" alt="Snapchat" src="https://m4lab.hft-stuttgart.de/img/signature/snapchat_bw.png" width="30" height="30"></a>' +
    '<br/><img border="0" src="https://m4lab.hft-stuttgart.de/img/signature/inno_bw.png" width="150" height="100">'
Varun Srivastava's avatar
Varun Srivastava committed
48

Rosanny Sihombing's avatar
Rosanny Sihombing committed
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
  var samlStrategy = new SamlStrategy({
      // URL that goes from the Identity Provider -> Service Provider
      callbackUrl: config.passport.saml.path,
      // Base address to call logout requests
      logoutUrl: config.passport.saml.logoutUrl,
      
      entryPoint: config.passport.saml.entryPoint,
      issuer: config.passport.saml.issuer,
      identifierFormat: null,
      
      // Service Provider private key
      decryptionPvk: fs.readFileSync(__dirname + '/cert/key.pem', 'utf8'),
      // Service Provider Certificate
      privateCert: fs.readFileSync(__dirname + '/cert/key.pem', 'utf8'),
      // Identity Provider's public key
      cert: fs.readFileSync(__dirname + '/cert/cert_idp.pem', 'utf8'),
      
      validateInResponseTo: false,
      disableRequestedAuthnContext: true
68
69
70
71
72
73
74
75
  },
  function (profile, done) {
    return done(null, {
      id: profile.nameID,
      idFormat: profile.nameIDFormat,
      email: profile.email,
      firstName: profile.givenName,
      lastName: profile.sn
Rosanny Sihombing's avatar
Rosanny Sihombing committed
76
    });
77
  });
Rosanny Sihombing's avatar
Rosanny Sihombing committed
78
79
  
  passport.use(samlStrategy);
80
81
82
83
84

  // ============= SAML ==============
  app.post(config.passport.saml.path,
    passport.authenticate(config.passport.strategy,
      {
85
        failureRedirect: '/account/',
86
87
88
        failureFlash: true
      }),
    function (req, res) {
89
      res.redirect('/account/');
90
91
92
93
    }
  );

  // to generate Service Provider's XML metadata
94
  app.get('/saml/metadata',
95
96
97
98
99
100
    function(req, res) {
      res.type('application/xml');
      var spMetadata = samlStrategy.generateServiceProviderMetadata(fs.readFileSync(__dirname + '/cert/cert.pem', 'utf8'));
      res.status(200).send(spMetadata);
    }
  );
Wolfgang Knopki's avatar
Wolfgang Knopki committed
101
102
103
104
105
106
107

  // ================ test i18n ==================
  i18n.setLocale('de');
  app.get('/de', function(req, res) {
    var greeting = i18n.__('Hello World')
    res.send(greeting)
  });
108

Wolfgang Knopki's avatar
Wolfgang Knopki committed
109
  var lang = 'DE'
Rosanny Sihombing's avatar
DE    
Rosanny Sihombing committed
110

Wolfgang Knopki's avatar
Wolfgang Knopki committed
111
  // ======== APP ROUTES - ACCOUNT ====================
Rosanny Sihombing's avatar
DE    
Rosanny Sihombing committed
112
  var updatePasswordMailSubject = "Ihr Passwort für das Transferportal wurde gespeichert."
Varun Srivastava's avatar
Varun Srivastava committed
113
  var updatePasswordMailContent = '<div>Lieber Nutzer,<br/><br/>Ihr Passwort wurde erfolgreich geändert.<br/><br/>' + mailSignature + '</div>';
Rosanny Sihombing's avatar
DE    
Rosanny Sihombing committed
114

Rosanny Sihombing's avatar
Rosanny Sihombing committed
115
  app.get('/', function (req, res) {
116
117
118
    if (req.isAuthenticated()) {
      methods.getUserByEmail(req.user.email, function(data, err){
        if (!err) {
Rosanny Sihombing's avatar
Rosanny Sihombing committed
119
120
          // Initialize user
          if (!loggedInUser) {
121
122
123
            loggedInUser = new portalUser(
              data.id, req.user.email, data.salutation, data.title, data.firstname, data.lastname, data.industry, data.organisation, data.speciality, data.m4lab_idp, null, data.verificationStatus
            )
Rosanny Sihombing's avatar
Rosanny Sihombing committed
124
125
            methods.getGitlabId(data.id, function(gitlabUserId, err){
              if(!err) {
126
                loggedInUser.setGitlabUserId(gitlabUserId)
Rosanny Sihombing's avatar
Rosanny Sihombing committed
127
128
129
130
              }
            })
          }
          
131
132
133
134
          let userData = {
            fullName: loggedInUser.getFullName(),
            m4lab_idp: loggedInUser.getIdpStatus(),
            verificationStatus: loggedInUser.getVerificationStatus()}
Rosanny Sihombing's avatar
Rosanny Sihombing committed
135
          res.render(lang+'/account/home', {
136
            user: userData
137
138
139
140
          });
        }
      })
    } else {
141
142
      res.redirect('/login'); // localhost
    }
Rosanny Sihombing's avatar
Rosanny Sihombing committed
143
144
  });

Rosanny Sihombing's avatar
Rosanny Sihombing committed
145
  app.get('/login',
Rosanny Sihombing's avatar
Rosanny Sihombing committed
146
147
148
149
150
    passport.authenticate(config.passport.strategy, {
      successRedirect: '/',
      failureRedirect: '/login'
    })
  )
Rosanny Sihombing's avatar
Rosanny Sihombing committed
151

152
153
  app.get('/logout', function (req, res) {
    if (req.user == null) {
154
      return res.redirect('/');
Rosanny Sihombing's avatar
Rosanny Sihombing committed
155
    }
Wolfgang Knopki's avatar
Wolfgang Knopki committed
156

157
158
159
160
    req.user.nameID = req.user.id;
    req.user.nameIDFormat = req.user.idFormat;
    return samlStrategy.logout(req, function(err, uri) {
      req.logout();
161

162
163
164
165
166
167
168
      if ( req.session ) {
        req.session.destroy((err) => {
          if(err) {
              return console.log(err);
          }
        });
      }
169

170
171
172
      return res.redirect(uri);
    });
  });
Rosanny Sihombing's avatar
Rosanny Sihombing committed
173
174

  app.get('/profile', function (req, res) {
175
    if (req.isAuthenticated()) {
176
177
      // RS: to be updated = get data from loggedinuser
      console.log(loggedInUser)
178
179
      methods.getUserByEmail(req.user.email, function(data, err){
        if (!err) {
180
181
182
183
184
185
186
187
188
189
190
191
          if (data.verificationStatus == 1) {
            console.log(data)
            res.render(lang+'/account/profile', {
              user: data,
              email: req.user.email
            })
          }
          else {
            res.render(lang+'/account/home', {
              user: data
            });
          }
192
193
        }
      })
Rosanny Sihombing's avatar
Rosanny Sihombing committed
194
    } else {
195
      res.redirect('/login');
Rosanny Sihombing's avatar
Rosanny Sihombing committed
196
197
198
    }
  });

199
200
201
202
203
204
205
206
207
208
209
210
211
  app.get('/services', function(req, res){
    if(!req.isAuthenticated() && !loggedInUser) {
      res.redirect('/login')
    } else {
      let userData = {
        fullName: loggedInUser.getFullName(),
        m4lab_idp: loggedInUser.getIdpStatus()}

      if(loggedInUser.getVerificationStatus() != 1) {
        res.render(lang+'/account/home', {
          user: userData
        })
      } else {
Rosanny Sihombing's avatar
Rosanny Sihombing committed
212
213
214
        let gitlabReposArr = []
        let gitlabPagesArr = []
        
215
        if(loggedInUser.getGitlabUserId()) {
Rosanny Sihombing's avatar
Rosanny Sihombing committed
216
217
218
219
          async.waterfall([
            // check projects in runners
            function(callback) {
              let gitlabRunnersProjectIdsArr
220
              gitlab.getProjectIdsFromRunners(loggedInUser.getGitlabUserId(), function(data){
Rosanny Sihombing's avatar
Rosanny Sihombing committed
221
222
223
224
225
226
227
228
                if(data.error)
                  return res.status(500).send(data.data)
                gitlabRunnersProjectIdsArr = data.data
                callback(null, gitlabRunnersProjectIdsArr)
              })
            }
          ], function(err, gitlabRunnersProjectIdsArr) {
            // get user projects
229
            gitlab.getUserProjects (loggedInUser.getGitlabUserId(), function(data){
Rosanny Sihombing's avatar
Rosanny Sihombing committed
230
231
232
233
234
235
236
              if (data.error)
                return res.status(500).send(data.data)
              let gitlabData = data.data
              for(let i = 0; i < gitlabData.length; i++){
                if (gitlabData[i].tag_list.includes('website')) {
                  let idxRunners = gitlabRunnersProjectIdsArr.indexOf(gitlabData[i].id)
                  let isWebsitePublished = false
237
                  //let isWebsitePublished = true
Rosanny Sihombing's avatar
Rosanny Sihombing committed
238
239
240
                  if (idxRunners > 0) {
                    isWebsitePublished = true
                  }
241
242
                  let page = new projectInformation(loggedInUser.getGitlabUserId(), gitlabData[i].id, gitlabData[i].name, gitlabData[i].description, 
                    gitlabData[i].avatar_url, null, null, isWebsitePublished)
Rosanny Sihombing's avatar
Rosanny Sihombing committed
243
244
                  gitlabPagesArr.push(page)
                } else {
245
                  let repo = new projectRepo(loggedInUser.getGitlabUserId(), gitlabData[i].id, gitlabData[i].name, gitlabData[i].description, gitlabData[i].avatar_url)
Rosanny Sihombing's avatar
Rosanny Sihombing committed
246
                  gitlabReposArr.push(repo)
247
248
                }
              }
Rosanny Sihombing's avatar
Rosanny Sihombing committed
249
250
251
252
253
254
              
              res.render(lang+'/account/services', {
                user: userData,
                gitlabRepos: gitlabReposArr,
                gitlabPages: gitlabPagesArr
              })
255
            })
Rosanny Sihombing's avatar
Rosanny Sihombing committed
256
257
          })
        } else {
258
          // ========== to do next ===================
Rosanny Sihombing's avatar
Rosanny Sihombing committed
259
260
261
262
263
264
265
266
267
          gitlab.getUserIdByEmail(req.user.email, function(data){
            if (!data.error) {
              let gitlabActivationData = {
                user_id: loggedInUser.id,
                gitlab_userId: data.data}
              methods.addGitlabUser(gitlabActivationData, function(err){
                if(!err) {
                  loggedInUser.gitlabUserId = gitlabActivationData.gitlab_userId
                  res.redirect('/services')
268
                }
Rosanny Sihombing's avatar
Rosanny Sihombing committed
269
270
271
272
273
274
275
              })
            } else {
              res.render(lang+'/account/services', {
                user: userData
              })
            }
          })
Rosanny Sihombing's avatar
Rosanny Sihombing committed
276
        }
Rosanny Sihombing's avatar
Rosanny Sihombing committed
277
      }
Rosanny Sihombing's avatar
Rosanny Sihombing committed
278
    }
Rosanny Sihombing's avatar
Rosanny Sihombing committed
279
  })
Rosanny Sihombing's avatar
Rosanny Sihombing committed
280
281
282

  app.get('/security', function (req, res) {
    if (req.isAuthenticated()) {
283
      // RS: to be updated = get data from loggedinuser
284
285
      methods.getUserByEmail(req.user.email, function(data, err){
        if (!err) {
286
          if (data.verificationStatus == 1 && data.m4lab_idp == 1) {
287
288
289
290
291
292
293
294
295
296
297
            res.render(lang+'/account/security', {
              user: data
            })
          }
          else {
            res.render(lang+'/account/home', {
              user: data
            });
          }
        }        
      })
Rosanny Sihombing's avatar
Rosanny Sihombing committed
298
    } else {
299
      res.redirect('/login');
Rosanny Sihombing's avatar
Rosanny Sihombing committed
300
301
302
303
304
    }
  });

  app.post('/updateProfile', function (req, res) {
    var userData = {
Rosanny Sihombing's avatar
DE    
Rosanny Sihombing committed
305
      salutation: req.body.inputSalutation,
Rosanny Sihombing's avatar
Rosanny Sihombing committed
306
307
308
309
310
311
312
313
      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,
    }
314

Rosanny Sihombing's avatar
Rosanny Sihombing committed
315
316
    if (req.isAuthenticated()) {
      if (userData.email) {
Rosanny Sihombing's avatar
Rosanny Sihombing committed
317
        dbconn.user.query('UPDATE user SET ? WHERE email = "' +userData.email+'"', userData, function (err, rows, fields) {
Rosanny Sihombing's avatar
Rosanny Sihombing committed
318
            if (err) {
319
              res.flash('error', "Failed")
Rosanny Sihombing's avatar
Rosanny Sihombing committed
320
321
            }
            else {
322
              res.flash('success', 'Ihr Benutzerprofil wurde aktualisiert!')
Rosanny Sihombing's avatar
Rosanny Sihombing committed
323
            }
Wolfgang Knopki's avatar
Wolfgang Knopki committed
324
            res.redirect('/account/profile');
325
            // RS: to be updated = update loggedinuser
Rosanny Sihombing's avatar
Rosanny Sihombing committed
326
327
328
        })
      }
    } else {
329
      res.redirect('/login');
Rosanny Sihombing's avatar
Rosanny Sihombing committed
330
331
    }
  });
332

Rosanny Sihombing's avatar
Rosanny Sihombing committed
333
334
335
336
337
338
  app.post('/changePwd', function (req, res) {
    if (req.isAuthenticated()) {
      var currPwd = req.body.inputCurrPwd
      var newPwd = req.body.inputNewPwd
      var retypePwd = req.body.inputConfirm

339
      // RS: to be updated = get data from loggedinuser
340
341
342
343
344
      methods.getUserIdByEmail(req.user.email, function(userId, err) {
        if (!err) {
          // Load hashed passwd from DB
          dbconn.user.query('SELECT password FROM credential WHERE user_id='+userId, function (err, rows, fields) {
            if (err) {
Rosanny Sihombing's avatar
Rosanny Sihombing committed
345
              console.error(err)
Rosanny Sihombing's avatar
Rosanny Sihombing committed
346
347
348
              res.status(500).render(lang+'/500', {
                error: err
              })
Rosanny Sihombing's avatar
Rosanny Sihombing committed
349
            }
350
351
352
353
354
            var userPwd = rows[0].password

            // check if the password is correct
            bcrypt.compare(currPwd, userPwd, function(err, isMatch) {
              if (err) {
Rosanny Sihombing's avatar
Rosanny Sihombing committed
355
                console.error(err)
Rosanny Sihombing's avatar
Rosanny Sihombing committed
356
357
358
                res.status(500).render(lang+'/500', {
                  error: err
                })
359
360
              }
              else if (!isMatch) {
361
362
                //res.flash('error', "Sorry, your password was incorrect. Please double-check your password.")
                res.flash('error', "Das Passwort ist leider falsch. Bitte überprüfen Sie Ihre Eingabe.")
363
                //res.redirect('/security')
Wolfgang Knopki's avatar
Wolfgang Knopki committed
364
                res.redirect('/account/security')
365
366
367
              }
              else {
                if ( newPwd != retypePwd ) {
368
369
                  //res.flash('error', "Passwords do no match. Please make sure you re-type your new password correctly.")
                  res.flash('error', 'Passwörter stimmen nicht überein. Bitte stellen Sie sicher, dass Sie das Passwort beide Male genau gleich eingeben.')
Wolfgang Knopki's avatar
Wolfgang Knopki committed
370
                  res.redirect('/account/security')
371
372
373
374
375
376
377
378
379
380
381
                }
                else {
                  // update password
                  bcrypt.genSalt(saltRounds, function(err, salt) {
                    bcrypt.hash(newPwd, salt, function(err, hash) {
                      var credentialData = {
                        password: hash,
                        user_id: userId
                      }
                      methods.updateCredential(credentialData, function(err){
                        if (err) {
382
383
                          //res.flash('error', "Database error: Password cannot be modified.")
                          res.flash('error', "Datenbankfehler: Passwort kann nicht geändert werden.")
384
385
386
                          throw err
                        }
                        else {
387
388
                          //res.flash('success', "Pasword updated!")
                          res.flash('success', "Passwort aktualisiert!")
389
                          mailer.options.to = req.user.email
Rosanny Sihombing's avatar
DE    
Rosanny Sihombing committed
390
                          //mailOptions.subject = "Your M4_LAB Password has been updated."
391
                          mailer.options.subject = updatePasswordMailSubject
Varun Srivastava's avatar
Varun Srivastava committed
392
                          mailer.options.html = updatePasswordMailContent
393
                          mailer.transport.sendMail(mailer.options, function(err) {
394
395
396
397
                            if (err) {
                              console.log(err)
                            }
                          });
398
                        }
Wolfgang Knopki's avatar
Wolfgang Knopki committed
399
                        res.redirect('/account/security')
400
401
402
403
404
                      })
                    });
                  });
                }
              }
405
          })
Rosanny Sihombing's avatar
Rosanny Sihombing committed
406
        })
407
        }
408
      })
409
410
    }
    else {
411
      res.redirect('/login');
Rosanny Sihombing's avatar
Rosanny Sihombing committed
412
413
414
415
    }
  });

  app.get('/forgotPwd', function (req, res) {
Rosanny Sihombing's avatar
Rosanny Sihombing committed
416
    res.render(lang+'/account/forgotPwd', {
Rosanny Sihombing's avatar
Rosanny Sihombing committed
417
418
419
420
421
422
      user: req.user
    });
  });

  app.post('/forgotPwd', function(req, res, next) {
    //methods.currentDate();
423

Rosanny Sihombing's avatar
Rosanny Sihombing committed
424
    var emailAddress = req.body.inputEmail;
425
  /*  var emailContent = "Hi there,\n\n"+
Rosanny Sihombing's avatar
Rosanny Sihombing committed
426
427
      "we've received a request to reset your password. However, this email address is not on our database of registered users.\n\n"+
      "Thanks,\nM4_LAB Team";
428
    var emailSubject = "Account Access Attempted"; */
429

Rosanny Sihombing's avatar
Rosanny Sihombing committed
430
431
432
433
434
435
436
437
438
439
440
    async.waterfall([
      function(done) {
        crypto.randomBytes(20, function(err, buf) {
          var token = buf.toString('hex');
          done(err, token);
        });
      },
      function(token, done) {
        methods.checkUserEmail(emailAddress, function(err, user){
          if (user) {
            console.log("email: user found");
Rosanny Sihombing's avatar
DE    
Rosanny Sihombing committed
441
442
443
            //var emailSubject = "M4_LAB Password Reset";
            var emailSubject = "Ihre Passwort-Anfrage an das Transferportal der HFT Stuttgart";
            /* var emailContent = "Hi User,\n\n"+
Rosanny Sihombing's avatar
Rosanny Sihombing committed
444
              "we've received a request to reset your password. If you didn't make the request, just ignore this email.\n\n"+
445
              "Otherwise, you can reset your password using this link: http://m4lab.hft-stuttgart.de/account/reset/" + token + "\n" +
Rosanny Sihombing's avatar
Rosanny Sihombing committed
446
              "This password reset is only valid for 1 hour.\n\n"+
Rosanny Sihombing's avatar
DE    
Rosanny Sihombing committed
447
              "Thanks,\nM4_LAB Team" */
Varun Srivastava's avatar
Varun Srivastava committed
448
449
450
451
452
453
454
455
456
457
458
            // var emailContent = "Lieber Nutzer,\n\n"+
            //   "wir haben Ihre Anfrage zur Erneuerung Ihres Passwortes erhalten. Falls Sie diese Anfrage nicht gesendet haben, ignorieren Sie bitte diese E-Mail.\n\n"+
            //   "Sie können Ihr Passwort mit dem Klick auf diesen Link ändern: http://m4lab.hft-stuttgart.de/account/reset/" + token + "\n" + // test server
            //   //"Sie können Ihr Passwort mit dem Klick auf diesen Link ändern: http://localhost:9989/reset/" + token + "\n" + // localhost
            //   "Dieser Link ist aus Sicherheitsgründen nur für 1 Stunde gültig.\n\n"+mailSignature

            var emailContent = '<div>Lieber Nutzer, Varun<br/><br/>' +
              '<p>wir haben Ihre Anfrage zur Erneuerung Ihres Passwortes erhalten. Falls Sie diese Anfrage nicht gesendet haben, ignorieren Sie bitte diese E-Mail.<br/><br/>' +
              'Sie können Ihr Passwort mit dem Klick auf diesen Link ändern: http://m4lab.hft-stuttgart.de/account/reset/' + token + '<br/>' + // test server
              'Dieser Link ist aus Sicherheitsgründen nur für 1 Stunde gültig.<br/></p>' + mailSignature + '</div>';
            
459
460
461
462
463
464
            var credentialData = {
              user_id: user.id,
              resetPasswordToken: token,
              resetPasswordExpires: Date.now() + 3600000 // 1 hour
            }
            methods.updateCredential(credentialData, function(err) {
Rosanny Sihombing's avatar
Rosanny Sihombing committed
465
466
              done(err, token, user);
            });
467
468

            // send email
469
470
            mailer.options.to = emailAddress;
            mailer.options.subject = emailSubject;
Varun Srivastava's avatar
Varun Srivastava committed
471
            mailer.options.html = emailContent;
472
            mailer.transport.sendMail(mailer.options, function(err) {
473
474
              done(err, 'done');
            });
Rosanny Sihombing's avatar
Rosanny Sihombing committed
475
476
          }
          else {
477
478
            //done(err, null, null);
            done(err, 'no user found');
Rosanny Sihombing's avatar
Rosanny Sihombing committed
479
480
481
482
483
          }
        });
      }
    ], function(err) {
      if (err) {
484
485
        //res.flash('error', 'An error occured. Please try again.');
        res.flash('error', 'Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut.');
Rosanny Sihombing's avatar
Rosanny Sihombing committed
486
487
      }
      else {
488
489
        //res.flash('success', 'If your email is registered, an e-mail has been sent to ' + emailAddress + ' with further instructions.');
        res.flash('success', 'Wenn Ihre E-Mail-Adresse registriert ist, wurde eine E-Mail mit dem weiteren Vorgehen an ' + emailAddress + ' versendet.');
Rosanny Sihombing's avatar
Rosanny Sihombing committed
490
      }
491
      //res.redirect('/forgotPwd'); // deployment
Wolfgang Knopki's avatar
Wolfgang Knopki committed
492
      res.redirect('/account/forgotPwd'); // localhost
Rosanny Sihombing's avatar
Rosanny Sihombing committed
493
494
495
496
    });
  });

  app.get('/reset/:token', function(req, res) {
497
    methods.getUserByToken(req.params.token, function(err, user){
Rosanny Sihombing's avatar
Rosanny Sihombing committed
498
      if (!user) {
499
500
        //res.flash('error', 'Password reset token is invalid or has expired.');
        res.flash('error', 'Der Schlüssel zum zurücksetzen des Passworts ist ungültig oder abgelaufen.');
501
        //res.redirect('/forgotPwd'); // deployment
Wolfgang Knopki's avatar
Wolfgang Knopki committed
502
        res.redirect('/account/forgotPwd'); // deployment
Rosanny Sihombing's avatar
Rosanny Sihombing committed
503
504
      }
      else {
Rosanny Sihombing's avatar
Rosanny Sihombing committed
505
        res.render(lang+'/account/reset');
Rosanny Sihombing's avatar
Rosanny Sihombing committed
506
507
508
509
510
      }
    });
  });

  app.post('/reset/:token', function(req, res) {
511
    var newPwd = req.body.inputNewPwd
512
    methods.getUserByToken(req.params.token, function(err, user){
Rosanny Sihombing's avatar
Rosanny Sihombing committed
513
      if (user) {
514
        // encrypt password
Rosanny Sihombing's avatar
Rosanny Sihombing committed
515
        bcrypt.genSalt(saltRounds, function(err, salt) {
Wolfgang Knopki's avatar
Wolfgang Knopki committed
516
          bcrypt.hash(newPwd, salt, function(err, hash) {
517
518
519
520
521
522
            var credentialData = {
              password: hash,
              user_id: user.user_id
            }
            // update password
            methods.updateCredential(credentialData, function(err){
Rosanny Sihombing's avatar
Rosanny Sihombing committed
523
              if (err) {
524
525
                //res.flash('error', "Database error: Password cannot be modified.")
                res.flash('error', "Datenbankfehler: Passwort kann nicht geändert werden.")
Rosanny Sihombing's avatar
Rosanny Sihombing committed
526
527
528
                throw err
              }
              else {
529
530
                //res.flash('success', "Your pasword has been updated.")
                res.flash('success', "Passwort aktualisiert!")
531
                // send notifiaction email
532
533
                mailer.options.to = user.email
                mailer.options.subject = updatePasswordMailSubject
Varun Srivastava's avatar
Varun Srivastava committed
534
                mailer.options.html = updatePasswordMailContent
535
                mailer.transport.sendMail(mailer.options, function(err) {
536
537
538
539
540
                  if (err) {
                    console.log(err)
                  }
                });
                // redirect to login page
541
                res.redirect('/login')
Rosanny Sihombing's avatar
Rosanny Sihombing committed
542
543
544
545
546
547
              }
            })
          });
        });
      }
      else {
548
        res.flash('error', "User not found.")
549
        res.redirect('/login')
Rosanny Sihombing's avatar
Rosanny Sihombing committed
550
551
      }
    });
552

Rosanny Sihombing's avatar
Rosanny Sihombing committed
553
554
  });

Rosanny Sihombing's avatar
Rosanny Sihombing committed
555
  // ============= NEW GITLAB PAGES ===========================
556
557
558
559
560
  
  app.get('/newInformation', function(req, res){
    if (!req.isAuthenticated() && !loggedInUser) {
      res.redirect('/login')
    } else {
Rosanny Sihombing's avatar
Rosanny Sihombing committed
561
      let userData = {
562
563
        fullName: loggedInUser.getFullName(),
        m4lab_idp: loggedInUser.getIdpStatus()
Rosanny Sihombing's avatar
Rosanny Sihombing committed
564
      }
565
566
      res.render(lang+'/account/newInformation', {
        user: userData
Rosanny Sihombing's avatar
Rosanny Sihombing committed
567
568
      })
    }
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
  })
  app.post('/newInformation', function(req, res) {
    if(!req.isAuthenticated() && !loggedInUser) {
      res.redirect('/login')
    } else {
      if (!req.body.name && !req.body.description) {
        res.flash('error', 'Please provide the required data')
        //res.redirect('/account/newInformation')
        res.redirect('/newInformation')
      } else {
        let projectName = req.body.name.toLowerCase().replace(/\s/g, '-')
        let projectDesc = req.body.description
        let newInformation = new projectInformation(loggedInUser.getGitlabUserId(), null, projectName, projectDesc, null, null, null, false)
            
        if (!req.files) {
          res.flash('error', 'Please choose a project logo')
          //res.redirect('/account/newInformation')
          res.redirect('/newInformation')
        } else {
          let newLogoFile = req.files.logo
          async.waterfall([
            function(callback){ // upload logo
              newLogoFile.mv(logoDir + newLogoFile.name, function(err) {
                newLogoFile = logoDir+newLogoFile.name
                callback(err, newLogoFile)
              })
            },
            function(newLogoFile, callback){ // create a new GitLab Page
              gitlab.createNewPages(newInformation, newLogoFile, function(data){
                let result = data.data
                if (data.error) {
                  if(result.message.name == "has already been taken") {
                    res.flash("error", "Project name '"+newInformation.getName()+"' has already been taken, please choose another name.")
                  } else {
                    res.flash("error", "Something went wrong. Please try again.")
                  }
                  //res.redirect('/account/newInformation')
                  res.redirect('/newInformation')
                } else {
                  newInformation.setId(result.id)
                  newInformation.setLogo(result.avatar_url)
                  newInformation.setSettingUrl(tpGitlabURL+result.namespace.path+'/'+result.name+'/-/edit/master/public/settings.js')
                  newInformation.setKontaktUrl(tpGitlabURL+result.namespace.path+'/'+result.name+'/-/edit/master/public/kontakt.html')
                  
                  res.flash("success", "Your website has been created, but not published yet. Please continue to Step 2 and Step 3 to have your new website published.")
                  //res.redirect('/account/updateInformation?id='+newInformation.getId())
                  res.redirect('/updateInformation?id='+newInformation.getId())
                }
                callback(null)
              })
            }
          ], function (err) {
            if(err) console.log(err)
            // remove logo
            fs.unlink(newLogoFile, (err) => {
              if(err) console.log(err)
            })
          })
        }
      }
Rosanny Sihombing's avatar
Rosanny Sihombing committed
629
630
631
    }
  })

632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
  app.get('/updateInformation', function(req, res){
    if(!req.isAuthenticated() && !loggedInUser) {
      res.redirect('/login')
    } else {
      let userData = {
        fullName: loggedInUser.getFullName(),
        m4lab_idp: loggedInUser.getIdpStatus()}

      if(!req.query.id) {
        res.redirect('/account/services')
      } else {
        gitlab.getUserProjects(loggedInUser.getGitlabUserId(), function(data){
          if (data.error) {
            res.status(500).render(lang+'/500', {
              error: data.data
            })
          } else {
            // quick way to decide whether a website is already published or not
            let informationStatus
            if(req.query.s != "y" && req.query.s != "n") {
              res.redirect('/account/services')
            } else {
              if(req.query.s == "y") {
                informationStatus = true
              } else if(req.query.s == "n") {
                informationStatus = false
              }
              let gitlabData = data.data
              let curInformation = new projectInformation(loggedInUser.getGitlabUserId(), req.query.id, null, null, null, null, null, informationStatus)
              for(let i = 0; i < gitlabData.length; i++){
                if (gitlabData[i].id == req.query.id) {
                  curInformation.setName(gitlabData[i].name)
                  curInformation.setDesc(gitlabData[i].description)
                  curInformation.setLogo(gitlabData[i].avatar_url)
                  curInformation.setSettingUrl(tpGitlabURL+gitlabData[i].namespace.path+'/'+gitlabData[i].name+'/-/edit/master/public/settings.js')
                  curInformation.setKontaktUrl(tpGitlabURL+gitlabData[i].namespace.path+'/'+gitlabData[i].name+'/-/edit/master/public/kontakt.html')
                  
                  break
                }
              }
              res.render(lang+'/account/updateInformation', {
                user: userData,
                information: curInformation
              })
            }            
          }
        })
      }
    }
  })
  app.post('/updateInformation', function(req, res){
    if(!req.isAuthenticated() && !loggedInUser) {
      res.redirect('/login')
    } else {
      if (!req.body.name && !req.body.description) {
        res.flash('error', 'Please provide the required data')
        //res.redirect('/account/updateInformation')
        res.redirect('/updateInformation')
      } else {
Rosanny Sihombing's avatar
Rosanny Sihombing committed
691
692
        let projectName = req.body.name.toLowerCase().replace(/\s/g, '-')
        let projectDesc = req.body.description
693
        let updatedInformation = new projectInformation(loggedInUser.getGitlabUserId(), req.query.id, projectName, projectDesc, null, null, null, req.body.isPublished)
Rosanny Sihombing's avatar
Rosanny Sihombing committed
694

695
        let newLogoFile
Rosanny Sihombing's avatar
Rosanny Sihombing committed
696
        async.waterfall([
697
698
699
700
701
702
703
704
705
706
          function(callback){ // upload logo
            if(!req.files) {
              callback(null, newLogoFile)
            } else {
              newLogoFile = req.files.logo
              newLogoFile.mv(logoDir + newLogoFile.name, function(err) {
                newLogoFile = logoDir + newLogoFile.name
                callback(err, newLogoFile)
              })
            }
Rosanny Sihombing's avatar
Rosanny Sihombing committed
707
          },
708
709
710
711
712
713
714
715
          function(newLogoFile, callback){ // update gitlab page
            gitlab.updateProject(updatedInformation, newLogoFile, function(data){
              let result = data.data
              if (data.error) {
                if(result.message.name == "has already been taken") {
                  res.flash("error", "Project name has already been taken, please choose another name.")
                } else {
                  res.flash("error", "Something went wrong. Please try again.")
Rosanny Sihombing's avatar
Rosanny Sihombing committed
716
                }
717
718
719
720
721
              } else {
                updatedInformation.setLogo(result.avatar_url)
                updatedInformation.setSettingUrl(tpGitlabURL+result.namespace.path+'/'+result.name+'/-/edit/master/public/settings.js')
                updatedInformation.setKontaktUrl(tpGitlabURL+result.namespace.path+'/'+result.name+'/-/edit/master/public/kontakt.html')
                res.flash("success", "Your website has been updated")
Rosanny Sihombing's avatar
Rosanny Sihombing committed
722
              }
723
724
725
726
              //res.redirect('/account/updateInformation?id='+updatedInformation.getId())
              res.redirect('/updateInformation?id='+updatedInformation.getId())

              callback(null)
Rosanny Sihombing's avatar
Rosanny Sihombing committed
727
            })
728
729
730
731
732
733
          }
        ], function (err) {
          if(err) console.log(err)
          if(newLogoFile){ // remove logo
            fs.unlink(newLogoFile, (err) => {
              if(err) console.log(err)
Rosanny Sihombing's avatar
Rosanny Sihombing committed
734
735
            })
          }
736
        })
Rosanny Sihombing's avatar
Rosanny Sihombing committed
737
738
      }
    }
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
  })

  // RS: delete projektInformation?

  app.post('/sendPublishRequest', function(req, res) {
    if (!req.isAuthenticated() && loggedInUser) {
      res.redirect('/login')
    } else {
      let emailAddress = loggedInUser.getEmail()
      let supportAddress = "support-transfer@hft-stuttgart.de"
      //let supportAddress = "rosanny.sihombing@hft-stuttgart.de"
      let projectName = req.body.projectName
      let emailContent = "Guten Tag, \n\nhiermit beantrage Ich die Freischaltung einer Webseite auf dem Transferportal für folgendes Projekt: \n"
        +projectName+"\n\nVielen Dank,\n"+loggedInUser.getFullName()
      let emailSubject = "M4_LAB New Website Publish Request"
      async.waterfall([
        function(done) {
            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.log(err)
          res.send('Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut.')
        }
        else {
          res.send('Vielen Dank für Ihre Anfrage. Eine Kopie Ihrer Anfrage wurde an ' + emailAddress + ' versandt.')
        }
      })
Rosanny Sihombing's avatar
Rosanny Sihombing committed
773
774
    }
  })
775

776
  // ============= NEW USERS REGISTRATION ===========================
777
  app.get('/registration', function(req, res) {
Rosanny Sihombing's avatar
Rosanny Sihombing committed
778
    res.render(lang+'/account/registration')
779
780
781
782
783
  })
  app.post('/registration', function(req, res) {
    // user data
    var curDate = new Date()
    var userData = {
Rosanny Sihombing's avatar
DE    
Rosanny Sihombing committed
784
      salutation: req.body.inputSalutation,
785
786
787
788
789
790
791
792
      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)
Rosanny Sihombing's avatar
Rosanny Sihombing committed
793
    }
794

795
796
797
798
799
800
    var userEmail = userData.email
    var pos = userEmail.indexOf('@')
    var emailLength = userEmail.length
    var emailDomain = userEmail.slice(pos, emailLength);

    if ( emailDomain.toLowerCase() == "@hft-stuttgart.de") {
801
802
        res.flash('error', "Fehlgeschlagen: HFT-Account")
        res.redirect('/account/registration')
803
804
805
806
807
808
809
810
    }
    else {
      let token
      async.waterfall([
        function(done) {
          crypto.randomBytes(20, function(err, buf) {
            token = buf.toString('hex');
            done(err, token);
811
          });
812
813
814
815
816
817
818
819
820
        },
        // 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
821
              }
822
823
824
825
826
827
828
829
              done(err, newAccount)
            });
          });
        },
        // save data
        function(newAccount, err) {
          methods.registerNewUser(newAccount, function(err){
            if (err) {
830
              res.flash('error', "Fehlgeschlagen")
831
832
833
834
            }
            else {
              // send email
              var emailSubject = "Bitte bestätigen Sie Ihr M4_LAB Benutzerkonto"
Varun Srivastava's avatar
Varun Srivastava committed
835
836
837
838
839
840
841
842
843
844
845
              // var emailContent = "Lieber Nutzer,\n\n"+
              //     "vielen Dank für Ihre Anmeldung am Transferportal der HFT Stuttgart.\n"+
              //     "Um Ihre Anmeldung zu bestätigen, klicken Sie bitte diesen Link: "+config.app.host+"/verifyAccount?token="+token+"\n"+
              //     "Ohne Bestätigung Ihres Kontos müssen wir Ihr Konto leider nach 7 Tagen löschen.\n\n"+
              //     "Sollten Sie sich selbst nicht mit Ihren Daten am Transferportal registriert haben, ignorieren Sie diese E-Mail bitte.\n\n"+mailSignature
              var emailContent = '<div>Lieber Nutzer,<br/><br/>' +
                '<p>vielen Dank für Ihre Anmeldung am Transferportal der HFT Stuttgart. <br/>' +
                'Um Ihre Anmeldung zu bestätigen, klicken Sie bitte diesen Link: ' + config.app.host + '/verifyAccount?token=' + token +
                '<br/><br/>' +
                'Ohne Bestätigung Ihres Kontos müssen wir Ihr Konto leider nach 7 Tagen löschen.</p><br/>' + mailSignature +
                '</div>';
846
847
              mailer.options.to = req.body.inputEmail;
              mailer.options.subject = emailSubject;
Varun Srivastava's avatar
Varun Srivastava committed
848
              mailer.options.html = emailContent;
849
850
851
852
853
854
855
              mailer.transport.sendMail(mailer.options, function(err) {
                if (err) {
                  console.log('cannot send email')
                  throw err
                }
              })
              // user feedback
856
              res.flash('success', 'Vielen Dank für Ihre Registrierung!'+'\r\n\r\n'+
857
858
859
860
861
862
863
864
                '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')
          })
        }
      ])
    }
865
866
867
  })

  // ============= USER VERIFICATION ================================
868
  // RS: update loggedInUser status after successfull verification?
869
  app.get("/verifyAccount", function(req, res){
870
    console.log(req.query)
871
872
873
874
875
876
877
878
879
880
881
882
883
884
    methods.getUserIdByVerificationToken(req.query.token, function(userId, err){
      if (userId) {
        let userData = {
          id: userId,
          verificationStatus: 1
        }
        methods.verifyUserAccount(userData, function(err){
          if (err) {
            console.log("Error: "+err)
            res.render(lang+'/account/verification', {
              status: false
            });
          }
          else {
885
886
887
888
889
890
891
892
            // send welcome email after successful account verification
            methods.getUserById(userId, function(data, err){
              if (err) {
                console.log("Error: "+err)
              }
              else {
                // send email
                var emailSubject = "Herzlich willkommen"
Varun Srivastava's avatar
Varun Srivastava committed
893
894
895
896
897
898
                // var emailContent = "Lieber Nutzer,\n\n"+
                //     "herzlich willkommen beim Transferportal der HFT Stuttgart!\n"+ 
                //     "Sie können nun alle Dienste des Portals nutzen.\n\n"+mailSignature
                var emailContent = '<div>Lieber Nutzer,<br/><br/>' +
                  '<p>herzlich willkommen beim Transferportal der HFT Stuttgart!<br/>' +
                  'Sie können nun alle Dienste des Portals nutzen.<p/><br/>' + mailSignature;
899
900
                mailer.options.to = data.email;
                mailer.options.subject = emailSubject;
Varun Srivastava's avatar
Varun Srivastava committed
901
                mailer.options.html = emailContent;
902
903
904
905
906
907
908
909
910
                mailer.transport.sendMail(mailer.options, function(err) {
                  if (err) {
                    console.log('cannot send email')
                    throw err
                  }
                })
              }
            })

911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
            res.render(lang+'/account/verification', {
              status: true
            });
          }
        })
      }
      else {
        res.render(lang+'/account/verification', {
          status: null
        });
      }
    })
  })
  app.get("/resendVerificationEmail", function(req, res){
    if (req.isAuthenticated()) {
      var emailAddress = req.user.email
      
      methods.getUserIdByEmail(req.user.email, function(userId, err) {
        if (!err) {
          // get token
          methods.getVerificationTokenByUserId(userId, function(token, err){
            if (!err) {
              if (token) {
                // send email
                var emailSubject = "Bitte bestätigen Sie Ihr M4_LAB Benutzerkonto"
Varun Srivastava's avatar
Varun Srivastava committed
936
937
938
939
940
941
942
943
944
945
                // var emailContent = "Lieber Nutzer,\n\n"+
                //     "vielen Dank für Ihre Anmeldung am Transferportal der HFT Stuttgart. "+ 
                //     "\nUm Ihre Anmeldung zu bestätigen, klicken Sie bitte diesen Link: "+config.app.host+"/verifyAccount?token="+token+
                //     "\n\nOhne Bestätigung Ihres Kontos müssen wir Ihr Konto leider nach 7 Tagen löschen.\n\n"+mailSignature
                var emailContent = '<div>Lieber Nutzer,<br/><br/>' +
                  '<p>vielen Dank für Ihre Anmeldung am Transferportal der HFT Stuttgart. <br/>' +
                  'Um Ihre Anmeldung zu bestätigen, klicken Sie bitte diesen Link: ' + config.app.host + '/verifyAccount?token=' + token +
                  '<br/><br/>' +
                  'Ohne Bestätigung Ihres Kontos müssen wir Ihr Konto leider nach 7 Tagen löschen.</p><br/>' + mailSignature +
                  '</div>';
946
947
                mailer.options.to = emailAddress;
                mailer.options.subject = emailSubject;
Varun Srivastava's avatar
Varun Srivastava committed
948
                mailer.options.html = emailContent;
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
                mailer.transport.sendMail(mailer.options, function(err) {
                  if (err) {
                    console.log('cannot send email')
                    throw err
                  }
                })
                res.send(true)
              }
              else {
                res.send(false)
              }
            }
            else {
              console.log(err)
            }
          })
        }
      })
    }
968
  })
Rosanny Sihombing's avatar
Rosanny Sihombing committed
969

970
971
972
973
974
975
976
977
978
979
980
981
  app.get('/email/:email', function(req, res) {
    methods.checkUserEmail(req.params.email, function(err, user){
      if (!err) {
        if (user) {
          res.send(false)
        }
        else {
          res.send(true)
        }  
      }
    })
  })
Wolfgang Knopki's avatar
Wolfgang Knopki committed
982
983

  app.get('/contact', function (req, res) {
984
985
986
987
    res.render(lang+'/account/contact', {
      user: req.user
    })
  })
Wolfgang Knopki's avatar
Wolfgang Knopki committed
988

Rosanny Sihombing's avatar
Rosanny Sihombing committed
989
  app.post('/contact', function(req, res, next) {
Wolfgang Knopki's avatar
Wolfgang Knopki committed
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
      //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) {
1010
          res.flash('error', 'Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut.');
Wolfgang Knopki's avatar
Wolfgang Knopki committed
1011
1012
        }
        else {
1013
          res.flash('success', 'Vielen Dank für Ihre Anfrage. Wir melden uns baldmöglichst bei Ihnen. Eine Kopie Ihrer Anfrage wurde an ' + emailAddress + ' versandt.');
Wolfgang Knopki's avatar
Wolfgang Knopki committed
1014
1015
1016
        }
        //res.redirect('/forgotPwd'); // deployment
        res.redirect('/account/contact'); // localhost
1017
1018
1019
1020
      })
  })

}