-
Notifications
You must be signed in to change notification settings - Fork 3
/
utils.js
93 lines (84 loc) · 2.83 KB
/
utils.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// Copyright (c) 2017 NewRedo Ltd.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
"use strict";
const cookieSignature = require('cookie-signature');
const base64url = require("base64url");
const assert = require("assert");
const moment = require("moment");
const zlib = require("zlib");
function renewCookie(req, res) {
const expires = moment.utc().add(1, "hour");
var data = {
expires: expires.toISOString(),
user: req.user
};
res.cookie(
"user",
data, {
expires: expires.toDate(),
signed: true,
secure: req.secure,
sameSite: true
}
);
return req, res;
}
function encodeToken(data, secret, ttlMinutes) {
assert(secret);
assert(data);
ttlMinutes = ttlMinutes || 60;
var payload = {
data,
expires: moment().add(ttlMinutes, "minutes").toISOString()
};
payload = JSON.stringify(payload);
payload = cookieSignature.sign(payload, secret);
payload = zlib.deflateRawSync(payload);
payload = base64url.encode(payload);
return payload;
}
function decodeToken(token, secret) {
assert(secret);
assert(token);
var payload = base64url.toBuffer(token);
payload = zlib.inflateRawSync(payload).toString();
payload = cookieSignature.unsign(payload, secret);
if (payload == null) return null;
payload = JSON.parse(payload);
var expiry = moment(payload.expires, moment.ISO_8601);
if (expiry.isBefore(moment())) return null;
return payload.data;
}
function setUser(req, user) {
// Derive the displayName
user.displayName = [
user.name.givenName,
user.name.familyName
].join(" ");
// Remove the password
delete user.bcryptedPassword;
req.user = user;
}
module.exports = {
renewCookie,
encodeToken,
decodeToken,
setUser
};