From fe78962db06e4b21b1e581d1bff0b0573c95b0e6 Mon Sep 17 00:00:00 2001 From: Ambrose Chua Date: Mon, 12 Mar 2018 00:33:41 +0900 Subject: [PATCH] Refactor tabs to spaces --- assets/login.js | 88 +-- assets/multi.js | 34 +- assets/shell.js | 2 +- assets/upload.js | 36 +- index.js | 833 ++++++++++---------- views/layouts/main.handlebars | 38 +- views/list.handlebars | 46 +- views/login.handlebars | 24 +- views/partials/dialogue-cmd.handlebars | 44 +- views/partials/dialogue-delete.handlebars | 46 +- views/partials/dialogue-download.handlebars | 46 +- views/partials/dialogue-mkdir.handlebars | 44 +- views/partials/dialogue-upload.handlebars | 64 +- views/partials/navbar.handlebars | 2 +- 14 files changed, 676 insertions(+), 671 deletions(-) diff --git a/assets/login.js b/assets/login.js index e107936..9e0ccc4 100644 --- a/assets/login.js +++ b/assets/login.js @@ -1,53 +1,53 @@ /* jshint esversion: 6 */ $(document).ready(() => { - let $inputs = $(".input-group-digits"); - $inputs.each((i, input) => { - let cleanup = () => { - $(input).find("input").each((i, ele) => { - let cleaned = $(ele).val().replace(/[^0-9]/, ""); - $(ele).val(cleaned); - }); - }; - let update = (e) => { - $digits = $(input).find("input"); + let $inputs = $(".input-group-digits"); + $inputs.each((i, input) => { + let cleanup = () => { + $(input).find("input").each((i, ele) => { + let cleaned = $(ele).val().replace(/[^0-9]/, ""); + $(ele).val(cleaned); + }); + }; + let update = (e) => { + $digits = $(input).find("input"); - // Cleanup - cleanup(); + // Cleanup + cleanup(); - // Shift characters - let excess = ""; - $digits.each((i, ele) => { - let now = excess + $(ele).val(); - $(ele).val(now.charAt(0)); - excess = now.substr(1); - }); + // Shift characters + let excess = ""; + $digits.each((i, ele) => { + let now = excess + $(ele).val(); + $(ele).val(now.charAt(0)); + excess = now.substr(1); + }); - // Move cursor to empty - $digits.each((i, ele) => { - if (!$(ele).val()) { - $(ele).focus(); - if (e.which == 8) { - $(ele).prev().focus().val(""); - } - return false; - } - }); + // Move cursor to empty + $digits.each((i, ele) => { + if (!$(ele).val()) { + $(ele).focus(); + if (e.which == 8) { + $(ele).prev().focus().val(""); + } + return false; + } + }); - // Submit if last digit is filled - if ($($digits[$digits.length - 1]).val()) { - let token = $.map( - $digits, - d => $(d).val() - ).join(""); - let $value = $(input).parent().find("#login-token-value"); - $value.val(token); - $value.closest("form").submit(); - } - }; + // Submit if last digit is filled + if ($($digits[$digits.length - 1]).val()) { + let token = $.map( + $digits, + d => $(d).val() + ).join(""); + let $value = $(input).parent().find("#login-token-value"); + $value.val(token); + $value.closest("form").submit(); + } + }; - $digits = $(input).find("input"); - $digits.on("keyup", update); - $digits.on("change", update); - }); + $digits = $(input).find("input"); + $digits.on("keyup", update); + $digits.on("change", update); + }); }); diff --git a/assets/multi.js b/assets/multi.js index 4cdd5ba..097f007 100644 --- a/assets/multi.js +++ b/assets/multi.js @@ -1,30 +1,30 @@ /* jshint esversion: 6 */ $(document).ready(() => { - let $select = $(".multi-select"); + let $select = $(".multi-select"); - let setSelected = (files) => { - $(".multi-files-value").val(JSON.stringify(files.map(f => f.name))); - $(".multi-files").html( - files.map(f => { - return `
  • ${f.name} ${f.size}
  • `; - }).join("") - ); - }; + let setSelected = (files) => { + $(".multi-files-value").val(JSON.stringify(files.map(f => f.name))); + $(".multi-files").html( + files.map(f => { + return `
  • ${f.name} ${f.size}
  • `; + }).join("") + ); + }; let updateSelected = () => { - let $selected = $(".multi-select:checked"); - let files = []; - $selected.each((i, ele) => { - files.push({ + let $selected = $(".multi-select:checked"); + let files = []; + $selected.each((i, ele) => { + files.push({ name: $(ele).data("select"), size: $(ele).data("select-size") }); - }); + }); - setSelected(files); - } + setSelected(files); + } - $select.on("change", updateSelected); + $select.on("change", updateSelected); updateSelected(); }); diff --git a/assets/shell.js b/assets/shell.js index aa9a37b..dc5ee8b 100644 --- a/assets/shell.js +++ b/assets/shell.js @@ -1,7 +1,7 @@ /* jshint esversion: 6 */ $(document).ready(() => { - let $shell = $("#shell"); + let $shell = $("#shell"); if (!$shell) { return; } diff --git a/assets/upload.js b/assets/upload.js index e16f060..4cf0a0a 100644 --- a/assets/upload.js +++ b/assets/upload.js @@ -1,24 +1,24 @@ /* jshint esversion: 6 */ $(document).ready(() => { - let $form = $("form[action='@upload']"); - let $file = $("#upload-file"); - - $(".upload-unhide").fadeOut(); - - $file.on("change", () => { - let file = $file[0].files[0]; - let fnElement = $file.parent().find(".custom-file-label"); - fnElement.addClass("file-selected"); - fnElement.text(file.name); + let $form = $("form[action='@upload']"); + let $file = $("#upload-file"); + + $(".upload-unhide").fadeOut(); + + $file.on("change", () => { + let file = $file[0].files[0]; + let fnElement = $file.parent().find(".custom-file-label"); + fnElement.addClass("file-selected"); + fnElement.text(file.name); - $form.find("#upload-file-size").val(filesize(file.size)); - $form.find("[name=saveas]").val(file.name); - $(".upload-unhide").fadeIn(); - }); + $form.find("#upload-file-size").val(filesize(file.size)); + $form.find("[name=saveas]").val(file.name); + $(".upload-unhide").fadeIn(); + }); - $form.on("submit", () => { - let putresource = $form.find("[name=saveas]").val(); - // TODO: do XHR to PUT at putresource - }); + $form.on("submit", () => { + let putresource = $form.find("[name=saveas]").val(); + // TODO: do XHR to PUT at putresource + }); }); diff --git a/index.js b/index.js index b348ab1..02f19df 100755 --- a/index.js +++ b/index.js @@ -26,28 +26,28 @@ let http = app.listen(process.env.PORT || 8080); app.set("views", path.join(__dirname, "views")); app.engine("handlebars", hbs({ - partialsDir: path.join(__dirname, "views", "partials"), - layoutsDir: path.join(__dirname, "views", "layouts"), - defaultLayout: "main", - helpers: { - eachpath: (path, options) => { - if (typeof path != "string") { - return ""; - } - let out = ""; - path = path.split("/"); - path.splice(path.length - 1, 1); - path.unshift(""); - path.forEach((folder, index) => { - out += options.fn({ - name: folder + "/", - path: "/" + path.slice(1, index + 1).join("/"), - current: index === path.length - 1 - }); - }); - return out; - } - } + partialsDir: path.join(__dirname, "views", "partials"), + layoutsDir: path.join(__dirname, "views", "layouts"), + defaultLayout: "main", + helpers: { + eachpath: (path, options) => { + if (typeof path != "string") { + return ""; + } + let out = ""; + path = path.split("/"); + path.splice(path.length - 1, 1); + path.unshift(""); + path.forEach((folder, index) => { + out += options.fn({ + name: folder + "/", + path: "/" + path.slice(1, index + 1).join("/"), + current: index === path.length - 1 + }); + }); + return out; + } + } })); app.set("view engine", "handlebars"); @@ -58,7 +58,7 @@ app.use("/filesize", express.static(path.join(__dirname, "node_modules/filesize/ app.use("/assets", express.static(path.join(__dirname, "assets"))); app.use(session({ - secret: "meowmeow" + secret: "meowmeow" })); app.use(flash()); app.use(busboy()); @@ -69,462 +69,467 @@ app.use(bodyparser.urlencoded()); const KEY = process.env.KEY ? base32.decode(process.env.KEY.replace(/ /g, "")) : null; app.get("/@logout", (req, res) => { - if (KEY) { - req.session.login = false; - req.flash("success", "Signed out."); - res.redirect("/@login"); - return - } - req.flash("error", "You were never logged in..."); - res.redirect("back"); + if (KEY) { + req.session.login = false; + req.flash("success", "Signed out."); + res.redirect("/@login"); + return + } + req.flash("error", "You were never logged in..."); + res.redirect("back"); }); app.get("/@login", (req, res) => { - res.render("login", flashify(req, {})); + res.render("login", flashify(req, {})); }); app.post("/@login", (req, res) => { - let pass = notp.totp.verify(req.body.token.replace(" ", ""), KEY); - console.log(pass, req.body.token.replace(" ", "")); - if (pass) { - req.session.login = true; - res.redirect("/"); - return; - } - req.flash("error", "Bad token."); - res.redirect("/@login"); + let pass = notp.totp.verify(req.body.token.replace(" ", ""), KEY); + console.log(pass, req.body.token.replace(" ", "")); + if (pass) { + req.session.login = true; + res.redirect("/"); + return; + } + req.flash("error", "Bad token."); + res.redirect("/@login"); }); app.use((req, res, next) => { - if (!KEY) { - return next(); - } - if (req.session.login === true) { - return next(); - } - req.flash("error", "Please sign in."); - res.redirect("/@login"); + if (!KEY) { + return next(); + } + if (req.session.login === true) { + return next(); + } + req.flash("error", "Please sign in."); + res.redirect("/@login"); }); function relative(...paths) { - return paths.reduce((a, b) => path.join(a, b), process.cwd()); + return paths.reduce((a, b) => path.join(a, b), process.cwd()); } function flashify(req, obj) { - let error = req.flash("error"); - if (error && error.length > 0) { - if (!obj.errors) { - obj.errors = []; - } - obj.errors.push(error); - } - let success = req.flash("success"); - if (success && success.length > 0) { - if (!obj.successes) { - obj.successes = []; - } - obj.successes.push(success); - } - obj.isloginenabled = !!KEY; - return obj; + let error = req.flash("error"); + if (error && error.length > 0) { + if (!obj.errors) { + obj.errors = []; + } + obj.errors.push(error); + } + let success = req.flash("success"); + if (success && success.length > 0) { + if (!obj.successes) { + obj.successes = []; + } + obj.successes.push(success); + } + obj.isloginenabled = !!KEY; + return obj; } app.all("/*", (req, res, next) => { - res.filename = req.params[0]; + res.filename = req.params[0]; - let fileExists = new Promise((resolve, reject) => { - // check if file exists - fs.stat(relative(res.filename), (err, stats) => { - if (err) { - return reject(err); - } - return resolve(stats); - }); - }); + let fileExists = new Promise((resolve, reject) => { + // check if file exists + fs.stat(relative(res.filename), (err, stats) => { + if (err) { + return reject(err); + } + return resolve(stats); + }); + }); - fileExists.then((stats) => { - res.stats = stats; - next(); - }).catch((err) => { - res.stats = { error: err }; - next(); - }); + fileExists.then((stats) => { + res.stats = stats; + next(); + }).catch((err) => { + res.stats = { error: err }; + next(); + }); }); // currently unused app.put("/*", (req, res) => { - if (res.stats.error) { - req.busboy.on("file", (key, file, filename) => { - if (key == "file") { - let save = fs.createWriteStream(relative(res.filename)); - file.pipe(save); - save.on("close", () => { - res.flash("success", "File saved. "); - res.redirect("back"); - }); - save.on("error", (err) => { - res.flash("error", err); - res.redirect("back"); - }); - } - }); - req.busboy.on("field", (key, value) => { + if (res.stats.error) { + req.busboy.on("file", (key, file, filename) => { + if (key == "file") { + let save = fs.createWriteStream(relative(res.filename)); + file.pipe(save); + save.on("close", () => { + res.flash("success", "File saved. "); + res.redirect("back"); + }); + save.on("error", (err) => { + res.flash("error", err); + res.redirect("back"); + }); + } + }); + req.busboy.on("field", (key, value) => { - }); - req.pipe(req.busboy); - } - else { - req.flash("error", "File exists, cannot overwrite. "); - res.redirect("back"); - } + }); + req.pipe(req.busboy); + } + else { + req.flash("error", "File exists, cannot overwrite. "); + res.redirect("back"); + } }); app.post("/*@upload", (req, res) => { - res.filename = req.params[0]; + res.filename = req.params[0]; - let buff = null; - let saveas = null; - req.busboy.on("file", (key, stream, filename) => { - if (key == "file") { - let buffs = []; - stream.on("data", (d) => { - buffs.push(d); - }); - stream.on("end", () => { - buff = Buffer.concat(buffs); - buffs = null; - }); - } - }); - req.busboy.on("field", (key, value) => { - if (key == "saveas") { - saveas = value; - } - }); - req.busboy.on("finish", () => { - if (!buff || !saveas) { - return res.status(400).end(); - } - let fileExists = new Promise((resolve, reject) => { - // check if file exists - fs.stat(relative(res.filename, saveas), (err, stats) => { - if (err) { - return reject(err); - } - return resolve(stats); - }); - }); + let buff = null; + let saveas = null; + req.busboy.on("file", (key, stream, filename) => { + if (key == "file") { + let buffs = []; + stream.on("data", (d) => { + buffs.push(d); + }); + stream.on("end", () => { + buff = Buffer.concat(buffs); + buffs = null; + }); + } + }); + req.busboy.on("field", (key, value) => { + if (key == "saveas") { + saveas = value; + } + }); + req.busboy.on("finish", () => { + if (!buff || !saveas) { + return res.status(400).end(); + } + let fileExists = new Promise((resolve, reject) => { + // check if file exists + fs.stat(relative(res.filename, saveas), (err, stats) => { + if (err) { + return reject(err); + } + return resolve(stats); + }); + }); - fileExists.then((stats) => { - req.flash("error", "File exists, cannot overwrite. "); - res.redirect("back"); - }).catch((err) => { - console.log("saving"); - let save = fs.createWriteStream(relative(res.filename, saveas)); - save.on("close", () => { - if (buff.length === 0) { - req.flash("success", "File saved. Warning: empty file."); - } - else { - buff = null; - req.flash("success", "File saved. "); - } - res.redirect("back"); - }); - save.on("error", (err) => { - req.flash("error", err); - res.redirect("back"); - }); - save.write(buff); - save.end(); - }); - }); - req.pipe(req.busboy); + fileExists.then((stats) => { + req.flash("error", "File exists, cannot overwrite. "); + res.redirect("back"); + }).catch((err) => { + console.log("saving"); + let save = fs.createWriteStream(relative(res.filename, saveas)); + save.on("close", () => { + if (buff.length === 0) { + req.flash("success", "File saved. Warning: empty file."); + } + else { + buff = null; + req.flash("success", "File saved. "); + } + res.redirect("back"); + }); + save.on("error", (err) => { + req.flash("error", err); + res.redirect("back"); + }); + save.write(buff); + save.end(); + }); + }); + req.pipe(req.busboy); }); app.post("/*@mkdir", (req, res) => { - res.filename = req.params[0]; + res.filename = req.params[0]; - let folder = req.body.folder; - if (!folder || folder.length < 1) { - return res.status(400).end(); - } + let folder = req.body.folder; + if (!folder || folder.length < 1) { + return res.status(400).end(); + } - let fileExists = new Promise((resolve, reject) => { - // Check if file exists - fs.stat(relative(res.filename, folder), (err, stats) => { - if (err) { - return reject(err); - } - return resolve(stats); - }); - }); + let fileExists = new Promise((resolve, reject) => { + // Check if file exists + fs.stat(relative(res.filename, folder), (err, stats) => { + if (err) { + return reject(err); + } + return resolve(stats); + }); + }); - fileExists.then((stats) => { - req.flash("error", "Folder exists, cannot overwrite. "); - res.redirect("back"); - }).catch((err) => { - fs.mkdir(relative(res.filename, folder), (err) => { - if (err) { - req.flash("error", err); - res.redirect("back"); - return; - } - req.flash("success", "Folder created. "); - res.redirect("back"); - }); - }); + fileExists.then((stats) => { + req.flash("error", "Folder exists, cannot overwrite. "); + res.redirect("back"); + }).catch((err) => { + fs.mkdir(relative(res.filename, folder), (err) => { + if (err) { + req.flash("error", err); + res.redirect("back"); + return; + } + req.flash("success", "Folder created. "); + res.redirect("back"); + }); + }); }); app.post("/*@delete", (req, res) => { - res.filename = req.params[0]; + res.filename = req.params[0]; - let files = JSON.parse(req.body.files); - if (!files || !files.map) { - req.flash("error", "No files selected."); - res.redirect("back"); - return; // res.status(400).end(); - } + let files = JSON.parse(req.body.files); + if (!files || !files.map) { + req.flash("error", "No files selected."); + res.redirect("back"); + return; // res.status(400).end(); + } - let promises = files.map(f => { - return new Promise((resolve, reject) => { - fs.stat(relative(res.filename, f), (err, stats) => { - if (err) { - return reject(err); - } - resolve({ - name: f, - isdirectory: stats.isDirectory(), - isfile: stats.isFile() - }); - }); - }); - }); - Promise.all(promises).then((files) => { - let promises = files.map(f => { - return new Promise((resolve, reject) => { - let op = null; - if (f.isdirectory) { - op = fs.rmdir; - } - else if (f.isfile) { - op = fs.unlink; - } - if (op) { - op(relative(res.filename, f.name), (err) => { - if (err) { - return reject(err); - } - resolve(); - }); - } - }); - }); - Promise.all(promises).then(() => { - req.flash("success", "Files deleted. "); - res.redirect("back"); - }).catch((err) => { // TODO: recursive rmdir https://github.com/isaacs/rimraf - req.flash("error", "Unable to delete some files: " + err); - res.redirect("back"); - }); - }).catch((err) => { - req.flash("error", err); - res.redirect("back"); - }); + let promises = files.map(f => { + return new Promise((resolve, reject) => { + fs.stat(relative(res.filename, f), (err, stats) => { + if (err) { + return reject(err); + } + resolve({ + name: f, + isdirectory: stats.isDirectory(), + isfile: stats.isFile() + }); + }); + }); + }); + Promise.all(promises).then((files) => { + let promises = files.map(f => { + return new Promise((resolve, reject) => { + let op = null; + if (f.isdirectory) { + op = fs.rmdir; + } + else if (f.isfile) { + op = fs.unlink; + } + if (op) { + op(relative(res.filename, f.name), (err) => { + if (err) { + return reject(err); + } + resolve(); + }); + } + }); + }); + Promise.all(promises).then(() => { + req.flash("success", "Files deleted. "); + res.redirect("back"); + }).catch((err) => { // TODO: recursive rmdir https://github.com/isaacs/rimraf + req.flash("error", "Unable to delete some files: " + err); + res.redirect("back"); + }); + }).catch((err) => { + req.flash("error", err); + res.redirect("back"); + }); }); app.get("/*@download", (req, res) => { - res.filename = req.params[0]; - - let files = null; - try { - files = JSON.parse(req.query.files); - } catch (e) {} - if (!files || !files.map) { - req.flash("error", "No files selected."); - res.redirect("back"); - return; // res.status(400).end(); - } - - let promises = files.map(f => { - return new Promise((resolve, reject) => { - fs.stat(relative(res.filename, f), (err, stats) => { - if (err) { - return reject(err); - } - resolve({ - name: f, - isdirectory: stats.isDirectory(), - isfile: stats.isFile() - }); - }); - }); - }); - Promise.all(promises).then((files) => { - let zip = archiver.create("zip", {}); - zip.on("error", function(err) { - res.status(500).send({ - error: err.message - }); - }); + res.filename = req.params[0]; + + let files = null; + try { + files = JSON.parse(req.query.files); + } catch (e) {} + if (!files || !files.map) { + req.flash("error", "No files selected."); + res.redirect("back"); + return; // res.status(400).end(); + } + + let promises = files.map(f => { + return new Promise((resolve, reject) => { + fs.stat(relative(res.filename, f), (err, stats) => { + if (err) { + return reject(err); + } + resolve({ + name: f, + isdirectory: stats.isDirectory(), + isfile: stats.isFile() + }); + }); + }); + }); + Promise.all(promises).then((files) => { + let zip = archiver.create("zip", {}); + zip.on("error", function(err) { + res.status(500).send({ + error: err.message + }); + }); - files.filter(f => f.isfile).forEach((f) => { - zip.file(relative(res.filename, f.name), { name: f.name }); - }); - files.filter(f => f.isdirectory).forEach((f) => { - zip.directory(relative(res.filename, f.name), f.name); - }); + files.filter(f => f.isfile).forEach((f) => { + zip.file(relative(res.filename, f.name), { name: f.name }); + }); + files.filter(f => f.isdirectory).forEach((f) => { + zip.directory(relative(res.filename, f.name), f.name); + }); - res.attachment("Archive.zip"); - zip.pipe(res); + res.attachment("Archive.zip"); + zip.pipe(res); - zip.finalize(); - }).catch((err) => { - console.log(err); - req.flash("error", err); - res.redirect("back"); - }); + zip.finalize(); + }).catch((err) => { + console.log(err); + req.flash("error", err); + res.redirect("back"); + }); }); const shellable = process.env.SHELL != "false" && process.env.SHELL; -if (shellable) { - const exec = process.env.SHELL == "login" ? "/usr/bin/env" : process.env.SHELL; - const args = process.env.SHELL == "login" ? ["login"] : []; +const cmdable = process.env.CMD != "false" && process.env.CMD; +if (shellable || cmdable) { + const exec = process.env.SHELL == "login" ? "/usr/bin/env" : process.env.SHELL; + const args = process.env.SHELL == "login" ? ["login"] : []; - const child_process = require("child_process"); + const child_process = require("child_process"); // currently unused - app.post("/*@cmd", (req, res) => { - res.filename = req.params[0]; + app.post("/*@cmd", (req, res) => { + res.filename = req.params[0]; - let cmd = req.body.cmd; - if (!cmd || cmd.length < 1) { - return res.status(400).end(); - } + let cmd = req.body.cmd; + if (!cmd || cmd.length < 1) { + return res.status(400).end(); + } - child_process.exec(cmd, { - shell: shell, - cwd: res.filename, - timeout: 60 * 1000, - }, (err, stdout, stderr) => { - if (err) { - req.flash("error", "Command failed due to non-zero exit code"); - } - res.render("cmd", flashify(req, { - path: res.filename, - cmd: cmd, - stdout: stdout, - stderr: stderr, - })); - }); - }); - - const pty = require("pty.js"); - const io = require("socket.io")(http); + child_process.exec(cmd, { + shell: shell, + cwd: res.filename, + timeout: 60 * 1000, + }, (err, stdout, stderr) => { + if (err) { + req.flash("error", "Command failed due to non-zero exit code"); + } + res.render("cmd", flashify(req, { + path: res.filename, + cmd: cmd, + stdout: stdout, + stderr: stderr, + })); + }); + }); + + const pty = require("pty.js"); + const io = require("socket.io")(http); - app.get("/*@shell", (req, res) => { - res.filename = req.params[0]; + app.get("/*@shell", (req, res) => { + res.filename = req.params[0]; - res.render("shell", flashify(req, { - path: res.filename, - })); - }); + res.render("shell", flashify(req, { + path: res.filename, + })); + }); - io.on("connection", (socket) => { - let cwd = socket.handshake.query.path; + io.on("connection", (socket) => { + let cwd = socket.handshake.query.path; - let term = pty.spawn(exec, args, { - name: "xterm-256color", - cols: 80, - rows: 30, - cwd: cwd, - }); + let term = pty.spawn(exec, args, { + name: "xterm-256color", + cols: 80, + rows: 30, + cwd: cwd, + }); console.log("pid " + term.pid + " shell " + process.env.SHELL + " started in " + cwd); - term.on("data", (data) => { - socket.emit("output", data); - }); - term.on("exit", (code) => { - console.log("pid " + term.pid + " ended") + term.on("data", (data) => { + socket.emit("output", data); + }); + term.on("exit", (code) => { + console.log("pid " + term.pid + " ended") socket.disconnect(); - }); - socket.on("resize", (data) => { - term.resize(data.col, data.row); - }); - socket.on("input", (data) => { - term.write(data); - }); - socket.on("disconnect", () => { - term.end(); - }); - }); + }); + socket.on("resize", (data) => { + term.resize(data.col, data.row); + }); + socket.on("input", (data) => { + term.write(data); + }); + socket.on("disconnect", () => { + term.end(); + }); + }); } app.get("/*", (req, res) => { - if (res.stats.error) { - res.render("list", flashify(req, { - shellable: shellable, - path: res.filename, - errors: [ - res.stats.error - ] - })); - } - else if (res.stats.isDirectory()) { - if (!req.url.endsWith("/")) { - return res.redirect(req.url + "/"); - } + if (res.stats.error) { + res.render("list", flashify(req, { + shellable: shellable, + cmdable: cmdable, + path: res.filename, + errors: [ + res.stats.error + ] + })); + } + else if (res.stats.isDirectory()) { + if (!req.url.endsWith("/")) { + return res.redirect(req.url + "/"); + } - let readDir = new Promise((resolve, reject) => { - fs.readdir(relative(res.filename), (err, filenames) => { - if (err) { - return reject(err); - } - return resolve(filenames); - }); - }); + let readDir = new Promise((resolve, reject) => { + fs.readdir(relative(res.filename), (err, filenames) => { + if (err) { + return reject(err); + } + return resolve(filenames); + }); + }); - readDir.then((filenames) => { - let promises = filenames.map(f => { - return new Promise((resolve, reject) => { - fs.stat(relative(res.filename, f), (err, stats) => { - if (err) { - return reject(err); - } - resolve({ - name: f, - isdirectory: stats.isDirectory(), - size: filesize(stats.size) - }); - }); - }); - }); + readDir.then((filenames) => { + let promises = filenames.map(f => { + return new Promise((resolve, reject) => { + fs.stat(relative(res.filename, f), (err, stats) => { + if (err) { + return reject(err); + } + resolve({ + name: f, + isdirectory: stats.isDirectory(), + size: filesize(stats.size) + }); + }); + }); + }); - Promise.all(promises).then((files) => { - res.render("list", flashify(req, { - shellable: shellable, - path: res.filename, - files: files, - })); - }).catch((err) => { - res.render("list", flashify(req, { - shellable: shellable, - path: res.filename, - errors: [ - err - ] - })); - }); - }).catch((err) => { - res.render("list", flashify(req, { - shellable: shellable, - path: res.filename, - errors: [ - err - ] - })); - }); - } - else if (res.stats.isFile()) { - res.download(relative(res.filename)); - } + Promise.all(promises).then((files) => { + res.render("list", flashify(req, { + shellable: shellable, + cmdable: cmdable, + path: res.filename, + files: files, + })); + }).catch((err) => { + res.render("list", flashify(req, { + shellable: shellable, + cmdable: cmdable, + path: res.filename, + errors: [ + err + ] + })); + }); + }).catch((err) => { + res.render("list", flashify(req, { + shellable: shellable, + cmdable: cmdable, + path: res.filename, + errors: [ + err + ] + })); + }); + } + else if (res.stats.isFile()) { + res.download(relative(res.filename)); + } }); diff --git a/views/layouts/main.handlebars b/views/layouts/main.handlebars index cffe619..e2657ef 100644 --- a/views/layouts/main.handlebars +++ b/views/layouts/main.handlebars @@ -1,29 +1,29 @@ - - - File Manager - - - - - - - - - - - - - - - + + + File Manager + + + + + + + + + + + + + + + - {{{body}}} + {{{body}}} diff --git a/views/list.handlebars b/views/list.handlebars index b54fe85..7e4aa90 100644 --- a/views/list.handlebars +++ b/views/list.handlebars @@ -2,21 +2,21 @@
    - {{#each errors as |error|}} - - {{/each}} - {{#each successes as |success|}} - - {{/each}} -
      - {{#each files}} -
    • -
      - + {{#each errors as |error|}} + + {{/each}} + {{#each successes as |success|}} + + {{/each}} +
        + {{#each files}} +
      • +
        + -
        -
      • - {{else}} -
      • - No files -
      • - {{/each}} -
      +
      +
    • + {{else}} +
    • + No files +
    • + {{/each}} +
    diff --git a/views/login.handlebars b/views/login.handlebars index 53ef32f..896887d 100644 --- a/views/login.handlebars +++ b/views/login.handlebars @@ -2,17 +2,17 @@
    -
    diff --git a/views/partials/dialogue-cmd.handlebars b/views/partials/dialogue-cmd.handlebars index 8b5e712..23a6bb1 100644 --- a/views/partials/dialogue-cmd.handlebars +++ b/views/partials/dialogue-cmd.handlebars @@ -1,24 +1,24 @@
    - +
    diff --git a/views/partials/dialogue-delete.handlebars b/views/partials/dialogue-delete.handlebars index 7c8ad0b..119847d 100644 --- a/views/partials/dialogue-delete.handlebars +++ b/views/partials/dialogue-delete.handlebars @@ -1,25 +1,25 @@
    - +
    diff --git a/views/partials/dialogue-download.handlebars b/views/partials/dialogue-download.handlebars index 509a53d..155df4d 100644 --- a/views/partials/dialogue-download.handlebars +++ b/views/partials/dialogue-download.handlebars @@ -1,25 +1,25 @@
    - +
    diff --git a/views/partials/dialogue-mkdir.handlebars b/views/partials/dialogue-mkdir.handlebars index 70b42de..fd220ac 100644 --- a/views/partials/dialogue-mkdir.handlebars +++ b/views/partials/dialogue-mkdir.handlebars @@ -1,24 +1,24 @@
    - +
    diff --git a/views/partials/dialogue-upload.handlebars b/views/partials/dialogue-upload.handlebars index c11bf9f..14acbec 100644 --- a/views/partials/dialogue-upload.handlebars +++ b/views/partials/dialogue-upload.handlebars @@ -1,34 +1,34 @@
    - +
    diff --git a/views/partials/navbar.handlebars b/views/partials/navbar.handlebars index c85c0ae..556eb93 100644 --- a/views/partials/navbar.handlebars +++ b/views/partials/navbar.handlebars @@ -1,5 +1,5 @@