]>
Commit | Line | Data |
---|---|---|
ca2d3b4d JZ |
1 | #!/usr/bin/env node |
2 | ||
3 | 'use strict'; | |
4 | ||
fb372a32 | 5 | |
ca2d3b4d JZ |
6 | var express = require('express'), |
7 | morgan = require('morgan'), | |
591ad40c | 8 | passport = require('passport'), |
8c3ae071 | 9 | path = require('path'), |
552d44bb | 10 | fs = require('fs'), |
ca2d3b4d | 11 | compression = require('compression'), |
591ad40c | 12 | session = require('express-session'), |
ca2d3b4d | 13 | bodyParser = require('body-parser'), |
591ad40c | 14 | cookieParser = require('cookie-parser'), |
ca2d3b4d | 15 | lastMile = require('connect-lastmile'), |
552d44bb JZ |
16 | HttpError = require('connect-lastmile').HttpError, |
17 | HttpSuccess = require('connect-lastmile').HttpSuccess, | |
ca2d3b4d | 18 | multipart = require('./src/multipart'), |
7bb99aff | 19 | mkdirp = require('mkdirp'), |
591ad40c | 20 | auth = require('./src/auth.js'), |
490f71d7 | 21 | serveIndex = require('serve-index'), |
fb372a32 | 22 | files = require('./src/files.js')(path.resolve(__dirname, process.argv[2] || 'files')); |
ca2d3b4d | 23 | |
552d44bb JZ |
24 | |
25 | var rootFolder = path.resolve(__dirname, process.argv[2] || 'files'); | |
26 | var configFile = path.resolve(__dirname, process.argv[3] || './config.json'); | |
27 | ||
28 | // Ensure the root folder exists | |
29 | mkdirp.sync(rootFolder); | |
30 | ||
31 | var config = { | |
32 | folderListingEnabled: true | |
33 | }; | |
34 | ||
35 | function getSettings(req, res, next) { | |
36 | res.send({ folderListingEnabled: !!config.folderListingEnabled }); | |
37 | } | |
38 | ||
39 | function setSettings(req, res, next) { | |
40 | if (typeof req.body.folderListingEnabled === 'undefined') return next(new HttpError(400, 'missing folderListingEnabled boolean')); | |
41 | ||
42 | config.folderListingEnabled = !!req.body.folderListingEnabled; | |
43 | ||
44 | fs.writeFile(configFile, JSON.stringify(config), function (error) { | |
45 | if (error) return next(new HttpError(500, 'unable to save settings')); | |
46 | ||
47 | next(new HttpSuccess(201, {})); | |
48 | }); | |
49 | } | |
50 | ||
51 | // Load the config file | |
52 | try { | |
53 | config = require(configFile); | |
54 | } catch (e) { | |
55 | if (e.code === 'MODULE_NOT_FOUND') console.log(`Config file ${configFile} not found`); | |
56 | else console.log(`Cannot load config file ${configFile}`, e); | |
57 | } | |
58 | ||
59 | if (typeof config.folderListingEnabled === 'undefined') config.folderListingEnabled = true; | |
60 | ||
61 | // Setup the express server and routes | |
ca2d3b4d JZ |
62 | var app = express(); |
63 | var router = new express.Router(); | |
64 | ||
65 | var multipart = multipart({ maxFieldsSize: 2 * 1024, limit: '512mb', timeout: 3 * 60 * 1000 }); | |
66 | ||
4a27fce7 JZ |
67 | router.post ('/api/login', auth.login); |
68 | router.post ('/api/logout', auth.verify, auth.logout); | |
552d44bb JZ |
69 | router.get ('/api/settings', auth.verify, getSettings); |
70 | router.put ('/api/settings', auth.verify, setSettings); | |
4a27fce7 | 71 | router.get ('/api/profile', auth.verify, auth.getProfile); |
3d716d9e | 72 | router.get ('/api/files/*', auth.verify, files.get); |
e628921a JZ |
73 | router.post ('/api/files/*', auth.verify, multipart, files.post); |
74 | router.put ('/api/files/*', auth.verify, files.put); | |
3d716d9e | 75 | router.delete('/api/files/*', auth.verify, files.del); |
1a8d99e4 | 76 | router.get ('/api/healthcheck', function (req, res) { res.status(200).send(); }); |
ca2d3b4d JZ |
77 | |
78 | app.use(morgan('dev')); | |
79 | app.use(compression()); | |
74c0064c JZ |
80 | app.use('/api', bodyParser.json()); |
81 | app.use('/api', bodyParser.urlencoded({ extended: false, limit: '100mb' })); | |
82 | app.use('/api', cookieParser()); | |
83 | app.use('/api', session({ secret: 'surfin surfin', resave: false, saveUninitialized: false })); | |
84 | app.use('/api', passport.initialize()); | |
85 | app.use('/api', passport.session()); | |
ca2d3b4d | 86 | app.use(router); |
74c0064c JZ |
87 | app.use('/_admin', express.static(__dirname + '/frontend')); |
88 | app.use('/', express.static(rootFolder)); | |
552d44bb JZ |
89 | app.use('/', function welcomePage(req, res, next) { |
90 | if (req.path !== '/') return next(); | |
91 | res.status(200).sendFile(path.join(__dirname, '/frontend/welcome.html')); | |
92 | }); | |
93 | app.use('/', function (req, res, next) { | |
94 | if (config.folderListingEnabled) return next(); | |
95 | res.sendFile(__dirname + '/frontend/404.html'); | |
96 | }); | |
74c0064c | 97 | app.use('/', serveIndex(rootFolder, { icons: true })); |
ca2d3b4d JZ |
98 | app.use(lastMile()); |
99 | ||
100 | var server = app.listen(3000, function () { | |
101 | var host = server.address().address; | |
102 | var port = server.address().port; | |
103 | ||
552d44bb JZ |
104 | console.log('Surfer listening on http://%s:%s', host, port); |
105 | console.log('Using base path', rootFolder); | |
5c6f8c0a | 106 | }); |