Skip to content

Commit 45817c0

Browse files
Initial commit
0 parents  commit 45817c0

File tree

774 files changed

+111886
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

774 files changed

+111886
-0
lines changed

index.js

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
'use strict'
2+
3+
/**
4+
* Module dependencies.
5+
*/
6+
7+
const express = require('express')
8+
const hash = require('pbkdf2-password')()
9+
const path = require('path');
10+
const session = require('express-session');
11+
12+
var app = module.exports = express();
13+
14+
// config
15+
16+
app.set('view engine', 'ejs');
17+
app.set('views', path.join(__dirname, 'views'));
18+
19+
// middleware
20+
21+
app.use(express.urlencoded({ extended: false }))
22+
app.use(session({
23+
resave: false, // don't save session if unmodified
24+
saveUninitialized: false, // don't create session until something stored
25+
secret: 'shhhh, very secret'
26+
}));
27+
28+
// Session-persisted message middleware
29+
30+
app.use(function(req, res, next){
31+
var err = req.session.error;
32+
var msg = req.session.success;
33+
delete req.session.error;
34+
delete req.session.success;
35+
res.locals.message = '';
36+
if (err) res.locals.message = '<p class="msg error">' + err + '</p>';
37+
if (msg) res.locals.message = '<p class="msg success">' + msg + '</p>';
38+
next();
39+
});
40+
41+
// dummy database
42+
43+
var users = {
44+
user1: { name: 'user1'},
45+
user2: { name: 'user2'}
46+
};
47+
48+
// when you create a user, generate a salt
49+
// and hash the password ('foobar' is the pass here)
50+
51+
hash({ password: 'foobar' }, function (err, pass, salt, hash) {
52+
if (err) throw err;
53+
// store the salt & hash in the "db"
54+
users.user1.salt = salt;
55+
users.user1.hash = hash;
56+
users.user2.salt = salt;
57+
users.user2.hash = hash;
58+
});
59+
60+
61+
// Authenticate using our plain-object database of doom!
62+
63+
function authenticate(name, pass, fn) {
64+
if (!module.parent) console.log('authenticating %s:%s', name, pass);
65+
var user = users[name];
66+
// query the db for the given username
67+
if (!user) return fn(null, null)
68+
// apply the same algorithm to the POSTed password, applying
69+
// the hash against the pass / salt, if there is a match we
70+
// found the user
71+
hash({ password: pass, salt: user.salt }, function (err, pass, salt, hash) {
72+
if (err) return fn(err);
73+
if (hash === user.hash) return fn(null, user)
74+
fn(null, null)
75+
});
76+
}
77+
78+
function restrict(req, res, next) {
79+
if (req.session.user) {
80+
next();
81+
} else {
82+
req.session.returnTo = req.originalUrl;
83+
req.session.error = 'Access denied!';
84+
res.redirect('/login');
85+
}
86+
}
87+
88+
app.get('/', function(req, res){
89+
res.redirect('/login');
90+
});
91+
92+
app.get('/restricted', restrict, function(req, res){
93+
res.send('Wahoo! restricted area, click to <a href="/logout">logout</a>');
94+
});
95+
96+
app.get('/logout', function(req, res){
97+
// destroy the user's session to log them out
98+
// will be re-created next request
99+
req.session.destroy(function(){
100+
res.redirect('/');
101+
});
102+
});
103+
104+
app.get('/login', function(req, res){
105+
res.render('login');
106+
});
107+
108+
app.post('/login', function (req, res, next) {
109+
authenticate(req.body.username, req.body.password, function(err, user){
110+
if (err) return next(err)
111+
if (user) {
112+
// Regenerate session when signing in
113+
// to prevent fixation
114+
var returnTo = req.session.returnTo;
115+
req.session.regenerate(function(){
116+
// Store the user's primary key
117+
// in the session store to be retrieved,
118+
// or in this case the entire user object
119+
req.session.user = user;
120+
req.session.success = 'Authenticated as ' + user.name
121+
+ ' click to <a href="/logout">logout</a>. '
122+
+ ' You may now access <a href="/restricted">/restricted</a>.';
123+
//res.redirect('back');
124+
res.redirect(returnTo || '/');
125+
delete req.session.returnTo;
126+
});
127+
} else {
128+
req.session.error = 'Authentication failed, please check your '
129+
+ ' username and password.'
130+
+ ' (use "user1" or "user" and password "foobar")';
131+
res.redirect('/login');
132+
}
133+
});
134+
});
135+
136+
/* istanbul ignore next */
137+
if (!module.parent) {
138+
app.listen(3000);
139+
console.log('Express started on port 3000');
140+
}

node_modules/.bin/ejs

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

node_modules/.bin/jake

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

node_modules/.bin/mime

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)