|
- import * as fs from 'fs';
- import { v2 as webdav } from 'webdav-server';
-
- function getConfig(name: string) : any {
- let config = {};
- let base = "./config/" + name;
- let debug = base + '.debug.json';
- let prod = base + '.json';
- let path = fs.existsSync(debug) ? debug : prod;
- if (fs.existsSync(path)) {
- try {
- config = JSON.parse(fs.readFileSync(path, 'utf8'));
- }
- catch (err) {
- }
- }
- return config;
- }
-
- const config = getConfig('srvconfig');
- const users = getConfig('users');
-
- if (typeof config.port === undefined)
- config.port = 8080;
- if (typeof config.realm === undefined)
- config.realm = "WebDAV";
-
- let mountNames : string[] = [];
- for (let mount in config['mounts']) {
- if (!!config['mounts'][mount] && fs.existsSync(config['mounts'][mount]))
- mountNames.push(mount);
- }
-
- // User manager (tells who are the users)
- const userManager: webdav.SimpleUserManager = new webdav.SimpleUserManager();
- const privilegeManager: webdav.SimplePathPrivilegeManager = new webdav.SimplePathPrivilegeManager();
- for (let nuser = 0 ; nuser < users.length; nuser++) {
- let isAdmin = !!users[nuser]['isAdmin'];
- const user = userManager.addUser(users[nuser]['username'], users[nuser]['password'], isAdmin);
- if (isAdmin) {
- privilegeManager.setRights(user, '/', [ 'all' ]);
- }
- else {
- if (!!users[nuser]['access']) {
- for (let userMount in users[nuser]['access']) {
- if (mountNames.includes(userMount) && !!users[nuser]['access'][userMount]) {
- privilegeManager.setRights(user, '/' + userMount, users[nuser]['access'][userMount]);
- }
- }
- }
- }
- console.log(user);
- }
-
- const httpAuthentication = new webdav.HTTPBasicAuthentication(userManager);
-
- const serverOptions: webdav.WebDAVServerOptions = {
- port: config.port || 8080,
- requireAuthentification: true,
- httpAuthentication,
- privilegeManager,
- };
- //serverOptions['userManager'] = userManager;
-
- const server = new webdav.WebDAVServer(serverOptions);
-
- let nMount = 0;
-
- //@ts-ignore
- function mountAndStart() : void {
- if (nMount < mountNames.length) {
- let fsEntry = mountNames[nMount];
- let realPath = config['mounts'][fsEntry];
- nMount++;
- console.log(`FileSystem ${fsEntry} -> ${realPath}`)
- server.setFileSystem(
- '/' + fsEntry, new webdav.PhysicalFileSystem(realPath), (_success) => {mountAndStart();});
- }
- else {
- server.start(httpServer => {
- console.log('Server started with success on the port : ' + httpServer.address()['port']);
- });
- }
- }
- mountAndStart();
|