-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathtagServer.js
More file actions
124 lines (99 loc) · 2.95 KB
/
tagServer.js
File metadata and controls
124 lines (99 loc) · 2.95 KB
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
var exec = require('child_process').exec;
var express = require('express');
var bodyParser = require('body-parser');
var fs = require('fs');
var https = require('https');
var http = require('http');
var exphbs = require('express-handlebars');
var config = require('./client_config.json');
// Setup data!
var logger = new (require('./logger'))('./logs.json');
var Users = new (require('./users'))('./users.json');
var ADMIN_PASSWORD = process.env.ADMIN_PASSWORD;
// Needed for self-signed root CA's
if (config.useHTTPS) {
require('ssl-root-cas')
.inject()
.addFile('./keys/private-root-ca.crt.pem');
}
// Configure https
var httpsOptions;
if (config.useHTTPS) {
httpsOptions = {
key: fs.readFileSync('./keys/server.key.pem'),
cert: fs.readFileSync('./keys/server.crt.pem')
};
}
/**
* App Setup & Middleware
*
*/
var app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.engine('handlebars', exphbs({defaultLayout: 'main'}));
app.set('view engine', 'handlebars');
/**
* Main Routes!
* =============================================================================
*/
// Main page just to check things are working
app.get('/', function(req, res) {
return res.render('home');
});
app.get('/add', function(req, res) {
return res.render('add');
});
// Add a user to the list of users
app.post('/add', function(req, res) {
if (!ADMIN_PASSWORD) {
logger.log('No admin password set, cannot add users');
return res.redirect('/');
}
if (req.body.pass !== ADMIN_PASSWORD) {
logger.log('Add attempted with incorrect admin password');
return res.redirect('/');
}
var user = Users.add(req.body);
if (user) logger.log('Added user ' + user.name);
return res.redirect('/');
});
// Access here!
app.post('/:location/check', function(req, res) {
var code = req.body.rfid;
var location = req.params.location;
var user = Users.get(code);
if (!user) {
logger.log({code: code}, 'Access attempted at ' + location + ' with invalid code');
return res.status(403).send({authorized: false});
}
logger.log(user.name + ' opened ' + req.params.location);
//let them in
exec(config.openDoorScript + ' ' + config.relays[location], function (error, stdout, stderr) {
if (stdout) {
console.log({timestamp: Date.now(), message: stdout});
}
});
return res.send({authorized: true});
});
// Display the logs from the service
app.get('/logs', function(req, res) {
var admin = (req.query.pass === ADMIN_PASSWORD);
var logs = logger.get(50);
if (!admin) {
logs = logs.map(function(l) {
return {timestamp: l.timestamp, message: l.message};
});
}
res.send(logs);
});
/**
* Start listening
* =============================================================================
*/
if (config.useHTTPS) {
https.createServer(httpsOptions, app).listen(config.serverPort);
} else {
http.createServer(app).listen(config.serverPort);
}
logger.log('Starting door server');