From 79387262e3d2f48100720329f1f5bebf1a96831a Mon Sep 17 00:00:00 2001
From: the-djmaze <>
Date: Fri, 21 Oct 2022 16:10:07 +0200
Subject: [PATCH] Cleanup Nextcloud code
---
.../snappymail/lib/AppInfo/Application.php | 2 +-
.../nextcloud/snappymail/templates/empty.php | 1 -
.../snappymail/templates/index-empty.php | 3 -
.../snappymail/templates/personal.php | 8 -
plugins/nextcloud/index.php | 12 -
plugins/nextcloud/js/webdav.js | 212 ++++++++----------
6 files changed, 92 insertions(+), 146 deletions(-)
delete mode 100755 integrations/nextcloud/snappymail/templates/empty.php
delete mode 100755 integrations/nextcloud/snappymail/templates/index-empty.php
delete mode 100755 integrations/nextcloud/snappymail/templates/personal.php
diff --git a/integrations/nextcloud/snappymail/lib/AppInfo/Application.php b/integrations/nextcloud/snappymail/lib/AppInfo/Application.php
index ba7674101..9203a62da 100644
--- a/integrations/nextcloud/snappymail/lib/AppInfo/Application.php
+++ b/integrations/nextcloud/snappymail/lib/AppInfo/Application.php
@@ -96,7 +96,7 @@ class Application extends App implements IBootstrap
});
$userSession->listen('\OC\User', 'logout', function($user) {
- $oSession = \OC::$server->getSession()['snappymail-password'] = '';
+ \OC::$server->getSession()['snappymail-password'] = '';
SnappyMailHelper::loadApp();
\RainLoop\Api::LogoutCurrentLogginedUser();
});
diff --git a/integrations/nextcloud/snappymail/templates/empty.php b/integrations/nextcloud/snappymail/templates/empty.php
deleted file mode 100755
index fa0c45f25..000000000
--- a/integrations/nextcloud/snappymail/templates/empty.php
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/integrations/nextcloud/snappymail/templates/index-empty.php b/integrations/nextcloud/snappymail/templates/index-empty.php
deleted file mode 100755
index e95b0cd88..000000000
--- a/integrations/nextcloud/snappymail/templates/index-empty.php
+++ /dev/null
@@ -1,3 +0,0 @@
-
- t('SnappyMail Webmail is not configured yet.')); ?>
-
diff --git a/integrations/nextcloud/snappymail/templates/personal.php b/integrations/nextcloud/snappymail/templates/personal.php
deleted file mode 100755
index ccaf65de2..000000000
--- a/integrations/nextcloud/snappymail/templates/personal.php
+++ /dev/null
@@ -1,8 +0,0 @@
-getContainer()->query(PersonalSettings::class);
-return $controller->getForm()->render();
-
diff --git a/plugins/nextcloud/index.php b/plugins/nextcloud/index.php
index 157163a77..d46028558 100644
--- a/plugins/nextcloud/index.php
+++ b/plugins/nextcloud/index.php
@@ -49,18 +49,6 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
/*
\OC::$server->getCalendarManager();
\OC::$server->getLDAPProvider();
-
- $oFiles = \OCP\Files::getStorage('files');
- if ($oFiles and $oFiles->is_dir('/')) {
- $dh = $oFiles->opendir('/');
- if (\is_resource($dh)) {
- while (($file = \readdir($dh)) !== false) {
- if ($file != '.' && $file != '..') {
- // DO THINGS
- }
- }
- }
- }
*/
public function NextcloudAttachFile() : array
diff --git a/plugins/nextcloud/js/webdav.js b/plugins/nextcloud/js/webdav.js
index eba7b7410..722a7ce55 100644
--- a/plugins/nextcloud/js/webdav.js
+++ b/plugins/nextcloud/js/webdav.js
@@ -1,36 +1,25 @@
(rl => {
- const
- namespace = 'DAV:',
+const
+ namespace = 'DAV:',
- propertyRequestBody = `
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- `,
+ propfindBody = `
+
+
+
+
+
+
+`,
- xmlParser = new DOMParser(),
- pathRegex = /.*\/remote.php\/dav\/files\/[^/]+/g,
+ xmlParser = new DOMParser(),
+ pathRegex = /.*\/remote.php\/dav\/files\/[^/]+/g,
- getDavElementsByTagName = (parent, localName) => parent.getElementsByTagNameNS(namespace, localName),
- getDavElementByTagName = (parent, localName) => getDavElementsByTagName(parent, localName)?.item(0),
- getElementByTagName = (parent, localName) => +parent.getElementsByTagName(localName)?.item(0);
+ getDavElementsByTagName = (parent, localName) => parent.getElementsByTagNameNS(namespace, localName),
+ getDavElementByTagName = (parent, localName) => getDavElementsByTagName(parent, localName)?.item(0),
+ getElementByTagName = (parent, localName) => +parent.getElementsByTagName(localName)?.item(0),
- function davFetch(path, options)
- {
+ davFetch = (path, options) => {
if (!parent.OC.requestToken) {
return Promise.reject(new Error('OC.requestToken missing'));
}
@@ -44,17 +33,11 @@
}, options);
options.headers.requesttoken = parent.OC.requestToken;
return fetch(cfg.WebDAV + '/files/' + cfg.UID + path, options);
- }
+ },
- function createDirectory(path)
- {
- return davFetch(path, {
- method: 'MKCOL'
- });
- }
+ createDirectory = path => davFetch(path, { method: 'MKCOL' }),
- function fetchFiles(xml, path)
- {
+ fetchFiles = path => {
if (!parent.OC.requestToken) {
return Promise.reject(new Error('OC.requestToken missing'));
}
@@ -63,7 +46,7 @@
headers: {
'Content-Type': 'application/xml; charset=utf-8'
},
- body: xml
+ body: propfindBody
})
.then(response => (response.status < 400) ? response.text() : Promise.reject(new Error({ response })))
.then(text => {
@@ -78,11 +61,9 @@
const
e = responseList.item(i),
elem = {
- id: parseInt(getElementByTagName(e, 'oc:fileid')?.innerHTML ?? 0),
name: decodeURIComponent(getDavElementByTagName(e, 'href').innerHTML)
.replace(pathRegex, '').replace(/\/$/, ''),
- isFile: false,
- lastmod: getDavElementByTagName(e, 'getlastmodified').innerHTML
+ isFile: false
}
if (getDavElementsByTagName(getDavElementByTagName(e, 'resourcetype'), 'collection').length) {
// skip current directory
@@ -91,22 +72,16 @@
}
} else {
elem.isFile = true;
- elem.mime = getDavElementByTagName(e, 'getcontenttype').innerHTML;
- elem.etag = getDavElementByTagName(e, 'getetag').innerHTML;
- elem.size = getDavElementByTagName(e, 'getcontentlength')?.innerHTML;
- if (!elem.size) {
- elem.size = getElementByTagName(e, 'oc:size')?.innerHTML;
- }
- elem.haspreview = getElementByTagName(e, 'nc:has-preview')?.innerHTML === 'true';
+ elem.size = getDavElementByTagName(e, 'getcontentlength')?.innerHTML
+ || getElementByTagName(e, 'oc:size')?.innerHTML;
}
elemList.push(elem);
}
return Promise.resolve(elemList);
});
- }
+ },
- function buildTree(view, parent, items, path)
- {
+ buildTree = (view, parent, items, path) => {
if (items.length) {
items.forEach(item => {
if (!item.isFile) {
@@ -116,7 +91,7 @@
ul = document.createElement('ul');
details.addEventListener('toggle', () => {
ul.children.length
- || fetchFiles(propertyRequestBody, item.name).then(items => buildTree(view, ul, items, item.name));
+ || fetchFiles(item.name).then(items => buildTree(view, ul, items, item.name));
});
summary.textContent = item.name.replace(/^.*\/([^/]+)$/, '$1');
summary.dataset.icon = '📁';
@@ -168,86 +143,81 @@
li.append(btn);
parent.append(li);
}
+ };
+
+class NextcloudFilesPopupView extends rl.pluginPopupView {
+ constructor() {
+ super('NextcloudFiles');
+ this.addObservables({
+ files: false
+ });
}
- class NextcloudFilesPopupView extends rl.pluginPopupView {
- constructor() {
- super('NextcloudFiles');
- this.addObservables({
- files: false
- });
- }
-
- onBuild(dom) {
- this.tree = dom.querySelector('#sm-nc-files-tree');
- this.tree.addEventListener('click', event => {
- let el = event.target;
- if (el.matches('button')) {
- if ('select' == el.name) {
- this.select = this.files() ? [el.item] : el.item_name;
- this.close();
- } else if ('create' == el.name) {
- let name = el.input.value.replace(/[|\\?*<":>+[]\/&\s]/g, '');
- if (name.length) {
- name = el.item_name + '/' + name;
- createDirectory(name).then(response => {
- if (response.status == 201) {
- this.select = name;
- this.close();
- }
- });
- }
+ onBuild(dom) {
+ this.tree = dom.querySelector('#sm-nc-files-tree');
+ this.tree.addEventListener('click', event => {
+ let el = event.target;
+ if (el.matches('button')) {
+ if ('select' == el.name) {
+ this.select = this.files() ? [el.item] : el.item_name;
+ this.close();
+ } else if ('create' == el.name) {
+ let name = el.input.value.replace(/[|\\?*<":>+[]\/&\s]/g, '');
+ if (name.length) {
+ name = el.item_name + '/' + name;
+ createDirectory(name).then(response => {
+ if (response.status == 201) {
+ this.select = name;
+ this.close();
+ }
+ });
}
}
- });
- }
+ }
+ });
+ }
- // Happens after showModal()
- beforeShow(files, fResolve) {
- this.select = '';
- this.files(!!files);
- this.fResolve = fResolve;
+ // Happens after showModal()
+ beforeShow(files, fResolve) {
+ this.select = '';
+ this.files(!!files);
+ this.fResolve = fResolve;
- this.tree.innerHTML = '';
- fetchFiles(propertyRequestBody, '/').then(items => {
- buildTree(this, this.tree, items, '/');
- }).catch(err => console.error(err))
- }
+ this.tree.innerHTML = '';
+ fetchFiles('/').then(items => {
+ buildTree(this, this.tree, items, '/');
+ }).catch(err => console.error(err))
+ }
- onHide() {
- this.fResolve(this.select);
- }
+ onHide() {
+ this.fResolve(this.select);
+ }
/*
- onShow() {} // Happens after showModal()
- beforeShow() {} // Happens before showModal()
- afterShow() {} // Happens after showModal() animation transitionend
- onHide() {} // Happens before animation transitionend
- afterHide() {} // Happens after animation transitionend
- close() {}
+beforeShow() {} // Happens before showModal()
+onShow() {} // Happens after showModal()
+afterShow() {} // Happens after showModal() animation transitionend
+onHide() {} // Happens before animation transitionend
+afterHide() {} // Happens after animation transitionend
+close() {}
*/
- }
+}
- rl.ncFiles = new class {
- async getDirectoryContents(path) {
- return await fetchFiles(propertyRequestBody, path);
- }
+rl.ncFiles = {
+ selectFolder: () =>
+ new Promise(resolve => {
+ NextcloudFilesPopupView.showModal([
+ false,
+ folder => resolve(folder),
+ ]);
+ }),
- selectFolder() {
- return new Promise(resolve => {
- NextcloudFilesPopupView.showModal([
- false,
- folder => resolve(folder),
- ]);
- });
- }
+ selectFiles: () =>
+ new Promise(resolve => {
+ NextcloudFilesPopupView.showModal([
+ true,
+ files => resolve(files),
+ ]);
+ })
+};
- selectFiles() {
- return new Promise(resolve => {
- NextcloudFilesPopupView.showModal([
- true,
- files => resolve(files),
- ]);
- });
- }
- }
})(window.rl);