'use strict'; const Path = require('path'); const PassThrough = require('stream').PassThrough; const express = require('express'); const bodyParser = require('body-parser'); const cookieParser = require('cookie-parser'); const session = require('express-session'); const Unifile = require('../lib/'); const app = express(); const unifile = new Unifile(); app.use(bodyParser.json()); app.use(cookieParser()); app.use(session({ secret: 'unifile', resave: false, saveUninitialized: false })); // Configure connectors const ghconnector = new Unifile.GitHubConnector({ clientId: 'b4e46028bf36d871f68d', clientSecret: 'c39806c4d0906cfeaac932012996a1919475cc78' }); const dbxconnector = new Unifile.DropboxConnector({ clientId: '37mo489tld3rdi2', clientSecret: 'kqfzd11vamre6xr', redirectUri: 'http://localhost:6805/dropbox/oauth-callback' }); const ftpconnector = new Unifile.FtpConnector({redirectUri: 'http://localhost:6805/ftp/signin'}); //const wdconnector = new Unifile.WebDavConnector({redirectUri: 'http://localhost:6805/webdav/signin'}); const rsconnector = new Unifile.RemoteStorageConnector({redirectUri: 'http://localhost:6805/remotestorage/callback'}); const fsconnector = new Unifile.FsConnector({showHiddenFile: true}); const sftpconnector = new Unifile.SftpConnector({redirectUri: 'http://localhost:6805/sftp/signin'}); // Register connectors unifile.use(ghconnector); unifile.use(dbxconnector); unifile.use(ftpconnector); unifile.use(rsconnector); //unifile.use(wdconnector); unifile.use(fsconnector); unifile.use(sftpconnector); // Expose connector methods app.post('/:connector/authorize', function(req, res) { if(req.body != null) { if(req.session.unifile.remotestorage) req.session.unifile.remotestorage.userAddress = req.body.userAddress; else req.session.unifile.remotestorage = req.body; } unifile.getAuthorizeURL(req.session.unifile, req.params.connector) .catch((err) => { console.error('Error while authorizing Unifile', err); res.statusCode = 400; res.end(); }) .then((result) => res.end(result)); }); // Search for a old session token in the cookies app.get('/', function(req, res) { // Init unifile session in Express req.session.unifile = req.session.unifile || {}; let response; if(req.cookies.unifile_github) response = unifile.setAccessToken(req.session.unifile, 'github', req.cookies.unifile_github); if(req.cookies.unifile_dropbox) response = unifile.setAccessToken(req.session.unifile, 'dropbox', req.cookies.unifile_dropbox); if(response) response.then(() => res.sendFile(Path.join(__dirname, 'public', 'index.html'))); else res.sendFile(Path.join(__dirname, 'public', 'index.html')); }); // List files and folders app.get(/\/(.*)\/ls\/(.*)/, function(req, res) { unifile.readdir(req.session.unifile, req.params[0], req.params[1]) .then(function(result) { res.send(result); }) .catch(function(err) { console.error(err); res.status(400).send(err); }); }); app.put(/\/(.*)\/mkdir\/(.*)/, function(req, res) { unifile.mkdir(req.session.unifile, req.params[0], req.params[1]) .then(function(result) { res.send(result); }) .catch(function(err) { console.error(err); res.status(400).send(err); }); }); app.put(/\/(.*)\/put\/(.*)/, function(req, res) { unifile.writeFile(req.session.unifile, req.params[0], req.params[1], req.body.content) .then(function(result) { res.send(result); }) .catch(function(err) { console.error(err); res.status(400).send(err); }); }); app.get(/\/(.*)\/get\/(.*)/, function(req, res) { unifile.readFile(req.session.unifile, req.params[0], req.params[1]) .then(function(result) { res.send(result); }) .catch(function(err) { console.error(err); res.status(400).send(err); }); }); app.patch(/\/(.*)\/mv\/(.*)/, function(req, res) { unifile.rename(req.session.unifile, req.params[0], req.params[1], req.body.destination) .then(function(result) { res.send(result); }) .catch(function(err) { console.error(err); res.status(400).send(err); }); }); app.delete(/\/(.*)\/rm\/(.*)/, function(req, res) { unifile.unlink(req.session.unifile, req.params[0], req.params[1]) .then(function(result) { res.send(result); }) .catch(function(err) { console.error(err); res.status(400).send(err); }); }); app.delete(/\/(.*)\/rmdir\/(.*)/, function(req, res) { unifile.rmdir(req.session.unifile, req.params[0], req.params[1]) .then(function(result) { res.send(result); }) .catch(function(err) { console.error(err); res.status(400).send(err); }); }); app.post(/\/(.*)\/cp\/(.*)/, function(req, res) { let stream = unifile.createReadStream(req.session.unifile, req.params[0], req.params[1]); // Use PassThrough to prevent request from copying headers between requests if(req.params[0] !== 'webdav' && req.params[0] !== 'fs') stream = stream.pipe(new PassThrough()); stream.pipe(unifile.createWriteStream(req.session.unifile, req.params[0], req.body.destination)) .pipe(res); }); app.post(/\/(.*)\/batch\/(.*)/, function(req, res) { const path = req.params[1]; const batch = [ {name: 'mkdir', path: path}, {name: 'writeFile', path: path + '/test.txt', content: 'Hello world'}, {name: 'writeFile', path: path + '/test2.txt', content: 'Hello world too'}, {name: 'rename', path: path + '/test.txt', destination: path + '/test_old.txt'}, {name: 'unlink', path: path + '/test2.txt'}, {name: 'rmdir', path: path} ]; unifile.batch(req.session.unifile, req.params[0], batch) .then((result) => { res.send(result); }) .catch((err) => { console.error(err); res.status(400).send(err); }); }); app.get(/\/(.*)\/stat\/(.*)/, function(req, res) { unifile.stat(req.session.unifile, req.params[0], req.params[1]) .then((result) => { res.send(result); }) .catch((err) => { res.status(400).send(err.message); }); }); // register callback url app.get('/:connector/oauth-callback', function(req, res) { if('error' in req.query) { res.status(500).send(req.query); } else { unifile.login(req.session.unifile, req.params.connector, req.query) .then(function(result) { res.cookie('unifile_' + req.params.connector, result); res.end(''); }) .catch(function(err) { console.error('ERROR', err); res.status(500).send(err); }); } }); app.get('/remotestorage/callback', function(req, res) { // Return a script that get the hash and redirect to oauth-callback res.end(''); }); app.get('/:connector/signin', function(req, res) { res.sendFile(Path.join(__dirname, 'public', req.params.connector + '_login.html')); }); // server 'loop' const port = process.env.PORT || 6805; // 6805 is the date of sexual revolution started in paris france 8-) app.listen(port, function() { console.log('Listening on ' + port); });