UNPKG

hfs

Version:
68 lines (67 loc) 3.14 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.basicWeb = basicWeb; exports.detectBasicAgent = detectBasicAgent; const auth_1 = require("./auth"); const cross_const_1 = require("./cross-const"); const config_1 = require("./config"); const vfs_1 = require("./vfs"); const misc_1 = require("./misc"); const lodash_1 = __importDefault(require("lodash")); const adminApis_1 = require("./adminApis"); const customHtml_1 = require("./customHtml"); const autoBasic = (0, config_1.defineConfig)('auto_basic', true); function basicWeb(ctx, node) { const { get } = ctx.query; if (get === 'login') { if ((0, auth_1.getCurrentUsername)(ctx)) ctx.redirect(ctx.get('referer')); else { ctx.set('WWW-Authenticate', 'Basic'); ctx.status = cross_const_1.HTTP_UNAUTHORIZED; } return true; } if (get === 'logout') { ctx.body = `<script>location = ${JSON.stringify(ctx.get('referer'))}</script>`; (0, auth_1.setLoggedIn)(ctx, false); ctx.status = cross_const_1.HTTP_UNAUTHORIZED; // not effective on firefox52, but the redirection is return true; } const forced = get === 'basic'; const goBasic = forced || detectBasicAgent(ctx) && get !== 'nobasic'; if (!goBasic) return; ctx.type = 'html'; const force = forced ? '?get=basic' : ''; const walker = (0, vfs_1.walkNode)(node, { ctx, depth: 0 }); const stream = (0, misc_1.asyncGeneratorToReadable)((0, misc_1.filterMapGenerator)(walker, async (el) => { const isFolder = await (0, vfs_1.nodeIsDirectory)(el); const name = (0, vfs_1.getNodeName)(el) + (isFolder ? '/' : ''); return `<li>${a((0, misc_1.pathEncode)(name) + (isFolder && !await (0, vfs_1.hasDefaultFile)(el, ctx) ? force : ''), name)}\n`; })); ctx.body = stream; stream.push(`<meta name="viewport" content="width=device-width" />`); stream.push(`<style>body { font-size: 16pt; }</style>`); stream.push(`<title>${adminApis_1.title.get()}</title><body>`); stream.push((0, customHtml_1.getSection)('basicHeader')); const u = (0, auth_1.getCurrentUsername)(ctx); const links = u ? { [`//LOGOUT%00:@${ctx.host}/?get=logout`]: `Logout (${u})` } : { '/?get=login': "Login" }; stream.push(lodash_1.default.map(links, (v, k) => a(k, v)).join(' ') + '\n<ul>\n'); if (ctx.state.originalPath.length > 1) stream.push('<li>' + a('..' + force, '..') + '\n'); stream.on('ending', () => stream.push('</ul>\n' + (0, customHtml_1.getSection)('basicFooter'))); return true; function a(href, label) { return `<a href='${href}'>${label}</a>`; } } function detectBasicAgent(ctx) { const ua = ctx.get('user-agent'); const v = autoBasic.get(); return v && (/^$|Mozilla\/4|WebKit\/([234]\d\d|5[012]\d|53[0123456])[. ]|Trident|Lynx|curl|Firefox\/(\d|[1234]\d)\./.test(ua) || lodash_1.default.isString(v) && ua.includes(v)); }