module.exports = function (RED) { const dav = require('dav') const webdav = require('webdav') const fs = require('fs') const https = require('https') const rootCas = require('ssl-root-cas').create(); process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0'; function NextcloudWebDavList(config) { RED.nodes.createNode(this, config) this.server = RED.nodes.getNode(config.server) this.directory = config.directory const node = this node.on('input', (msg) => { const webDavUri = node.server.address + '/remote.php/webdav/' const client = webdav(webDavUri, node.server.credentials.user, node.server.credentials.pass) let directory = '' if (msg.directory) { directory = '/' + msg.directory } else if (node.directory && node.directory.length) { directory = '/' + node.directory } directory = directory.replace('//', '/') // check option for self signed certs const option = {} if (node.server.insecure) { option.agent = new https.Agent({ rejectUnauthorized: false }) } client.getDirectoryContents(directory, option) .then(function (contents) { node.send({ 'payload': contents }) }, function (error) { node.error('Nextcloud:WebDAV -> get directory content went wrong.' + JSON.stringify(error)) }) }) } RED.nodes.registerType('nextcloud-webdav-list', NextcloudWebDavList) function NextcloudWebDavOut(config) { RED.nodes.createNode(this, config) this.server = RED.nodes.getNode(config.server) this.filename = config.filename const node = this node.on('input', (msg) => { const webDavUri = node.server.address + '/remote.php/webdav/' const client = webdav(webDavUri, node.server.credentials.user, node.server.credentials.pass) let filename = '' if (msg.filename) { filename = '/' + msg.filename } else if (node.filename && node.filename.length) { filename = '/' + node.filename } else { node.error('Nextcloud:WebDAV -> no filename specified.') return } filename = filename.replace('//', '/') // check option for self signed certs const option = {} if (node.server.insecure) { option.agent = new https.Agent({ rejectUnauthorized: false }) } client.getFileContents(filename, option) .then(function (contents) { node.send({ 'payload': contents }) }, function (error) { node.error('Nextcloud:WebDAV -> get file went wrong.' + JSON.stringify(error)) }) }) } RED.nodes.registerType('nextcloud-webdav-out', NextcloudWebDavOut) function NextcloudWebDavIn(config) { RED.nodes.createNode(this, config) this.server = RED.nodes.getNode(config.server) this.directory = config.directory this.filename = config.filename const node = this node.on('input', (msg) => { // Read upload file let filename = node.filename if (msg.filename) { filename = msg.filename; } const name = filename.substr((filename.lastIndexOf('/') + 1), filename.length) const file = msg.payload; // Set upload directory let directory = '/' if (msg.directory) { directory += msg.directory + '/' } else if (node.directory && node.directory.length) { directory += node.directory + '/' } directory = directory.replace('//', '/') // check option for self signed certs const option = {} if (node.server.insecure) { option.agent = new https.Agent({ rejectUnauthorized: false }) } const webDavUri = node.server.address + '/remote.php/webdav/' const client = webdav(webDavUri, node.server.credentials.user, node.server.credentials.pass) client.putFileContents(directory + name, file, { format: 'binary' }, option) .then(function (contents) { console.log(contents) node.send({ 'payload': JSON.parse(contents) }) }, function (e) { console.error(e); node.error('Nextcloud:WebDAV -> send file went wrong.') }) }) } RED.nodes.registerType('nextcloud-webdav-in', NextcloudWebDavIn) }