]> git.immae.eu Git - perso/Immae/Projets/Nodejs/Surfer.git/commitdiff
Make folder listing a global setting
authorJohannes Zellner <johannes@cloudron.io>
Thu, 17 May 2018 13:49:40 +0000 (15:49 +0200)
committerJohannes Zellner <johannes@cloudron.io>
Thu, 17 May 2018 13:49:40 +0000 (15:49 +0200)
.gitignore
frontend/404.html [new file with mode: 0644]
frontend/js/app.js
frontend/welcome.html
server.js

index 7efeed8ea680ecb4c231c4948cb77861a3a5f2fe..a34adba741cce7e014a6e22d9dd853c57b0bebbc 100644 (file)
@@ -1,3 +1,4 @@
 node_modules/
 files/
 .users.json
+.config.json
diff --git a/frontend/404.html b/frontend/404.html
new file mode 100644 (file)
index 0000000..21fd6b4
--- /dev/null
@@ -0,0 +1,19 @@
+<html>
+<head>
+  <title> Surfer - File not found</title>
+
+  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
+
+  <link rel="stylesheet" href="/_admin/css/style.css">
+</head>
+<body>
+
+<div class="wrapper">
+  <div class="content">
+    <h2> Surfer </h2>
+    <p>File not found</p>
+  </div>
+</div>
+
+</body>
+</html>
index 57b831eeca698423a3e25bafcde72900fdf0d87c..e9d469be99d400656e7107259265c8f2503ece1d 100644 (file)
@@ -211,7 +211,9 @@ var app = new Vue({
         },
         onOptionsMenu: function (command) {
             if (command === 'folderListing') {
-                console.log('Not implemented');
+                superagent.put('/api/settings').send({ folderListingEnabled: this.folderListingEnabled }).query({ access_token: localStorage.accessToken }).end(function (error) {
+                    if (error) console.error(error);
+                });
             } else if (command === 'about') {
                 this.$msgbox({
                     title: 'About Surfer',
@@ -337,6 +339,12 @@ getProfile(localStorage.accessToken, function (error) {
     if (error) return console.error(error);
 
     loadDirectory(window.location.hash.slice(1));
+
+    superagent.get('/api/settings').query({ access_token: localStorage.accessToken }).end(function (error, result) {
+        if (error) console.error(error);
+
+        app.folderListingEnabled = !!result.body.folderListingEnabled;
+    });
 });
 
 $(window).on('hashchange', function () {
index d16dcefdf30e7c0ebdc0c3578e0773288247f379..ddc9c366243b2b3a58de820c519730ae357dcfb3 100644 (file)
@@ -1,9 +1,10 @@
 <html>
 <head>
-    <title> Surfer </title>
+    <title> Surfer - Welcome</title>
 
-    <link rel="stylesheet" href="/_admin/css/style.css">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
 
+    <link rel="stylesheet" href="/_admin/css/style.css">
 </head>
 <body>
 
index f9dd4f54984f8c580a3d6499fadf2031106a10c2..4a8bfe5af89ef9d6a469192b6c3cfb653476874a 100755 (executable)
--- a/server.js
+++ b/server.js
@@ -7,17 +7,58 @@ var express = require('express'),
     morgan = require('morgan'),
     passport = require('passport'),
     path = require('path'),
+    fs = require('fs'),
     compression = require('compression'),
     session = require('express-session'),
     bodyParser = require('body-parser'),
     cookieParser = require('cookie-parser'),
     lastMile = require('connect-lastmile'),
+    HttpError = require('connect-lastmile').HttpError,
+    HttpSuccess = require('connect-lastmile').HttpSuccess,
     multipart = require('./src/multipart'),
     mkdirp = require('mkdirp'),
     auth = require('./src/auth.js'),
     serveIndex = require('serve-index'),
     files = require('./src/files.js')(path.resolve(__dirname, process.argv[2] || 'files'));
 
+
+var rootFolder = path.resolve(__dirname, process.argv[2] || 'files');
+var configFile = path.resolve(__dirname, process.argv[3] || './config.json');
+
+// Ensure the root folder exists
+mkdirp.sync(rootFolder);
+
+var config = {
+    folderListingEnabled: true
+};
+
+function getSettings(req, res, next) {
+    res.send({ folderListingEnabled: !!config.folderListingEnabled });
+}
+
+function setSettings(req, res, next) {
+    if (typeof req.body.folderListingEnabled === 'undefined') return next(new HttpError(400, 'missing folderListingEnabled boolean'));
+
+    config.folderListingEnabled = !!req.body.folderListingEnabled;
+
+    fs.writeFile(configFile, JSON.stringify(config), function (error) {
+        if (error) return next(new HttpError(500, 'unable to save settings'));
+
+        next(new HttpSuccess(201, {}));
+    });
+}
+
+// Load the config file
+try {
+    config = require(configFile);
+} catch (e) {
+    if (e.code === 'MODULE_NOT_FOUND') console.log(`Config file ${configFile} not found`);
+    else console.log(`Cannot load config file ${configFile}`, e);
+}
+
+if (typeof config.folderListingEnabled === 'undefined') config.folderListingEnabled = true;
+
+// Setup the express server and routes
 var app = express();
 var router = new express.Router();
 
@@ -25,6 +66,8 @@ var multipart = multipart({ maxFieldsSize: 2 * 1024, limit: '512mb', timeout: 3
 
 router.post  ('/api/login', auth.login);
 router.post  ('/api/logout', auth.verify, auth.logout);
+router.get   ('/api/settings', auth.verify, getSettings);
+router.put   ('/api/settings', auth.verify, setSettings);
 router.get   ('/api/profile', auth.verify, auth.getProfile);
 router.get   ('/api/files/*', auth.verify, files.get);
 router.post  ('/api/files/*', auth.verify, multipart, files.post);
@@ -32,14 +75,6 @@ router.put   ('/api/files/*', auth.verify, files.put);
 router.delete('/api/files/*', auth.verify, files.del);
 router.get   ('/api/healthcheck', function (req, res) { res.status(200).send(); });
 
-// welcome screen in case / does not serve up any file yet
-function welcomePage(req, res, next) {
-    if (req.path !== '/') return next();
-    res.status(200).sendFile(path.join(__dirname, '/frontend/welcome.html'));
-}
-
-var rootFolder = path.resolve(__dirname, process.argv[2] || 'files');
-
 app.use(morgan('dev'));
 app.use(compression());
 app.use('/api', bodyParser.json());
@@ -51,7 +86,14 @@ app.use('/api', passport.session());
 app.use(router);
 app.use('/_admin', express.static(__dirname + '/frontend'));
 app.use('/', express.static(rootFolder));
-app.use('/', welcomePage);
+app.use('/', function welcomePage(req, res, next) {
+    if (req.path !== '/') return next();
+    res.status(200).sendFile(path.join(__dirname, '/frontend/welcome.html'));
+});
+app.use('/', function (req, res, next) {
+    if (config.folderListingEnabled) return next();
+    res.sendFile(__dirname + '/frontend/404.html');
+});
 app.use('/', serveIndex(rootFolder, { icons: true }));
 app.use(lastMile());
 
@@ -59,9 +101,6 @@ var server = app.listen(3000, function () {
     var host = server.address().address;
     var port = server.address().port;
 
-    var basePath = path.resolve(__dirname, process.argv[2] || 'files');
-    mkdirp.sync(basePath);
-
-    console.log('Surfer listening at http://%s:%s', host, port);
-    console.log('Using base path', basePath);
+    console.log('Surfer listening on http://%s:%s', host, port);
+    console.log('Using base path', rootFolder);
 });