-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.js
202 lines (150 loc) · 6.3 KB
/
server.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
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
/*
This is the "main file" for the application. This is the file which should
be run from the command line as "node server.js" to start an application
server. This module sets up global variables and data structures, applies
configurations to the Express application, and instantiates route handling.
*/
/*###################################
# REQUIRES AND GLOBALS #
###################################*/
var bodyParser = require('body-parser');
var connect = require('connect');
var cookie = require('cookie');
var cookieParser = require('cookie-parser');
var ECT = require('ect');
var express = require('express');
var expressSession = require('express-session');
var http = require('http');
var multer = require('multer');
var path = require('path');
var socketIO = require('socket.io');
var sqlite3 = require('sqlite3').verbose();
var SQLiteStore = require('connect-sqlite3')(expressSession);
global.__base = __dirname;
global.__localModules = path.join(__base, 'localModules');
var locals = require(__localModules);
var config = require(locals.config);
global.getDatastoreConnection = function() {
return new sqlite3.Database(config.DATA_DB_FILENAME, sqlite3.OPEN_READWRITE);
}
global.getSessionStoreConnection = function() {
return new sqlite3.Database(config.SESSION_DB_FILENAME, sqlite3.OPEN_READWRITE);
}
var getcookie = require(locals.lib.getcookie);
var clientdir = require(locals.lib.ClientDirectory);
var report = require(locals.lib.report);
var security = require(locals.server.security);
var errorHandler = require(locals.server.error);
/*###################################
# CONFIGURATION #
###################################*/
var port = process.env.PORT || 8080;
var app = express();
// initialize the persistent storage for client sessions
var sessionStore = new SQLiteStore({ table: config.SESSION_DB_TABLENAME });
// initialize the ECT template engine
var ectEngine = ECT({ watch: true, root: path.join(__dirname, 'client', 'templates'), ext: '.html' });
var server = http.createServer(app);
var io = socketIO(server);
// tell Express to run .html files through ECT template parser
app.engine('html', ectEngine.render);
app.set('view engine', 'html');
// tell Express where to find templates
app.set('views', path.join(__dirname, 'client', 'templates'));
app.use(express.static(path.join(__dirname, 'client')));
// tell Express to use cookies to maintain client sessions
app.use(cookieParser(config.COOKIE_SIGN_SECRET));
app.use(expressSession({
name: config.COOKIE_SESSION_KEY,
secret: config.COOKIE_SIGN_SECRET,
store: sessionStore,
saveUninitialized: false,
resave: false
}));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
// tell Express to use multer to handle file uploads
app.use(multer({ dest: config.LOCAL_UPLOAD_PATH }));
// instantiate the in-memory ClientDirectory
var clientDirectory = io.sockets.clientDirectory = new clientdir.ClientDirectory();
clientDirectory.syncToDB(function() {
server.listen(port, function() {
console.log("LISTENING on port " + port);
});
});
/*###################################
# SOCKET IO #
###################################*/
// tell Socket.io to use the same cookies for session management as the Express app
io.use(function(socket, next) {
var sessionId = getcookie.getcookie(socket.request, config.COOKIE_SESSION_KEY, config.COOKIE_SIGN_SECRET);
sessionStore.get(sessionId, function(storeError, session) {
if (!session) {
next(new Error("Not authorized"));
}
socket.session = session;
next();
});
});
var Sockets = require(locals.server.Sockets)(io, clientDirectory);
var page = require(locals.server.routes.page)(clientDirectory);
var ajax = require(locals.server.routes.ajax)(clientDirectory, Sockets);
/*###################################
# AJAX HANDLERS #
###################################*/
// get updated json of the messages for a given room
app.get('/rooms/:roomID/data.json', ajax.get.dataJSON);
// get updated json of the messages for a given room
app.get('/rooms/:roomID/archive/messages.json', ajax.get.messageJSON);
// get updated json of the messages for a given room
app.get('/rooms/:roomID/archive/tasks.json', ajax.get.taskJSON);
app.get('/tags.json', ajax.get.tagJSON);
// post a message in the given room
app.post('/rooms/:roomID/send_message', ajax.post.sendMessage);
// create a new room
app.post('/create_room', ajax.post.createRoom);
// delete a room
app.post('/delete_room', ajax.post.deleteRoom);
// rename a room
app.post('/rename_room', ajax.post.renameRoom);
app.post('/create_channel', ajax.post.createChannel);
app.post('/delete_channel', ajax.post.deleteChannel);
app.post('/rename_channel', ajax.post.renameChannel);
// create a new task
app.post('/add_task/:roomID', ajax.post.addTask);
// signin with given username and password
app.post('/signin', ajax.post.signin);
app.post('/signup', ajax.post.signup);
/*###################################
# PAGE HANDLERS #
###################################*/
app.get('/uploads/:filepath', page.get.uploadedFile);
// get the page for the given room
app.get('/rooms/:roomID', page.get.room);
// get the message archive page for the given room
app.get('/rooms/:roomID/archive/messages', page.get.messageArchive);
// get the task adding page
app.get('/add_task/:roomID', page.get.addTask);
app.get('/manage_rooms', page.get.manageRooms);
// get the room index page
app.get('/index', page.get.index);
// get the signup page
app.get('/signup', page.get.signup);
// get the signin page
app.get('/signin', page.get.signin);
// mark session inactive and redirect to signin
app.get('/signout', page.get.signout);
// get the signin page if no active session, index otherwise
app.get('/', function(request, response) {
errorHandler.reportRequest(request);
if(!security.sessionValid(request.session)) {
response.redirect('/signin');
} else { // else go to the rooms index
response.redirect('/index');
}
});
/*###################################
# ERROR-HANDLING MIDDLEWARE #
###################################*/
app.use(errorHandler.send404);
app.use(errorHandler.send500);