'use strict'; const express = require('express'); const next = require('next'); const fs = require('fs'); const path = require('path'); const sqlite3 = require('sqlite3').verbose(); const repositoryDirectory = './user-content-access/'; const dbFile = './gitcub.db'; const dev = process.env.NODE_ENV !== 'production'; const port = 3000; const app = next({ dev }); const handle = app.getRequestHandler(); const directoryExists = (path) => fs.existsSync(path) ? fs.statSync(path).isDirectory() : false; const repositoryExists = (name, rows) => ( directoryExists(repositoryDirectory + name) && rows.some((x) => x.name === name) ); const pathIsValid = (pathArray, rows) => { if (pathArray.length > 0) { if (repositoryExists(pathArray[0], rows)) { if (directoryExists(repositoryDirectory + pathArray.join('/'))) { return true; } else return false; } else return false; } else return false; } const sendAPIResult = (req, res, rows) => { if (req.originalUrl.indexOf('\0') === -1) { const pathNormalized = path.normalize(req.path); const pathArray = pathNormalized.split('/').filter((x) => x.length > 0); // remove 'api' pathArray.shift(); if (pathArray.length > 0) { if (repositoryExists(pathArray[0], rows)) { if (pathIsValid(pathArray, rows)) { const dirList = fs.readdirSync( repositoryDirectory + pathArray.join('/'), (err, files) => { if (err) { console.log(err); } else return files; } ); const APIResult = { resultType: 'data', resultContent: dirList, } res.json(APIResult); } else { const APIResult = { resultType: 'error', resultContent: 'Directory does not exist.', } res.json(APIResult); } } else { const APIResult = { resultType: 'error', resultContent: 'Repository does not exist.', } res.json(APIResult); } } else { const APIResult = { resultType: 'error', resultContent: 'Repository not specified.', } // note, this case is not yet reachable res.json(APIResult); } } else { const APIResult = { resultType: 'error', resultContent: 'Null byte found in url. Nice try :)', } res.json(APIResult); } } app.prepare() .then(() => { const server = express(); const db = new sqlite3.Database(dbFile, sqlite3.OPEN_READWRITE); server.get('/api/*', (req, res) => { db.all('select name from repositories', (err, rows) => { sendAPIResult(req, res, rows); }); }); server.get('*', (req, res) => { return handle(req, res); }); server.listen(port, () => { console.log(`Example app listening on port ${port}`); }); }) .catch((ex) => { console.error(ex.stack); process.exit(1); });