sessions.js 2 KB
Newer Older
mntmn's avatar
mntmn committed
1
2
3
"use strict";

var config = require('config');
4
const db = require('../../models/db');
mntmn's avatar
mntmn committed
5

Martin Guether's avatar
Martin Guether committed
6
var bcrypt = require('bcryptjs');
7
var crypto = require('crypto');
8
var URL = require('url').URL;
mntmn's avatar
mntmn committed
9
10
11
12
13
14

var express = require('express');
var router = express.Router();

router.post('/', function(req, res) {
  var data = req.body;
15
16
17
18
19
20
21
  if (!data.email || !data.password) {
    res.status(400).json({});
    return;
  }
  
  var email = req.body.email.toLowerCase();
  var password = req.body["password"];
mntmn's avatar
mntmn committed
22

23
24
25
26
27
  db.User.findOne({where: {email: email}})
    .error(err => {
      res.sendStatus(404);
    })
    .then(user => {
28
29
30
31
      if (!user) {
        res.sendStatus(404);
      }
      else if (bcrypt.compareSync(password, user.password_hash)) {
32
33
        crypto.randomBytes(48, function(ex, buf) {
          var token = buf.toString('hex');
mntmn's avatar
mntmn committed
34

35
36
37
38
39
40
41
          var session = {
            user_id: user._id,
            token: token,
            ip: req.ip,
            device: "web",
            created_at: new Date()
          };
mntmn's avatar
mntmn committed
42

43
44
45
46
47
48
          db.Session.create(session)
            .error(err => {
              console.error("Error creating Session:",err);
              res.sendStatus(500);
            })
            .then(() => {
49
              var domain = (process.env.NODE_ENV == "production") ? new URL(config.get('endpoint')).hostname : req.headers.hostname;
50
51
              res.cookie('sdsession', token, { domain: domain, httpOnly: true });
              res.status(201).json(session);
mntmn's avatar
mntmn committed
52
            });
53
54
55
        });
      } else {
        res.sendStatus(403);
mntmn's avatar
mntmn committed
56
      }
57
    });
mntmn's avatar
mntmn committed
58
59
});

Wolfgang Knopki's avatar
Wolfgang Knopki committed
60

mntmn's avatar
mntmn committed
61
62
router.delete('/current', function(req, res, next) {
  if (req.user) {
63
64
65
66
67
68
69
70
    var token = req.cookies['sdsession'];
    db.Session.findOne({where: {token: token}})
      .then(session => {
        session.destroy();
      });
    var domain = (process.env.NODE_ENV == "production") ? new URL(config.get('endpoint')).hostname : req.headers.hostname;
    res.clearCookie('sdsession', { domain: domain });
    res.sendStatus(204);
mntmn's avatar
mntmn committed
71
72
73
74
75
76
  } else {
    res.sendStatus(404);
  }
});

module.exports = router;