Cleanup Nextcloud code

This commit is contained in:
the-djmaze 2022-10-21 16:10:07 +02:00
parent c7833d622a
commit 79387262e3
6 changed files with 92 additions and 146 deletions

View file

@ -96,7 +96,7 @@ class Application extends App implements IBootstrap
}); });
$userSession->listen('\OC\User', 'logout', function($user) { $userSession->listen('\OC\User', 'logout', function($user) {
$oSession = \OC::$server->getSession()['snappymail-password'] = ''; \OC::$server->getSession()['snappymail-password'] = '';
SnappyMailHelper::loadApp(); SnappyMailHelper::loadApp();
\RainLoop\Api::LogoutCurrentLogginedUser(); \RainLoop\Api::LogoutCurrentLogginedUser();
}); });

View file

@ -1 +0,0 @@
<!-- empty -->

View file

@ -1,3 +0,0 @@
<div style="margin: 20px">
<?php p($l->t('SnappyMail Webmail is not configured yet.')); ?>
</div>

View file

@ -1,8 +0,0 @@
<?php
use OCA\SnappyMail\Settings\PersonalSettings;
$app = new \OCA\SnappyMail\AppInfo\Application();
$controller = $app->getContainer()->query(PersonalSettings::class);
return $controller->getForm()->render();

View file

@ -49,18 +49,6 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
/* /*
\OC::$server->getCalendarManager(); \OC::$server->getCalendarManager();
\OC::$server->getLDAPProvider(); \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 public function NextcloudAttachFile() : array

View file

@ -1,36 +1,25 @@
(rl => { (rl => {
const const
namespace = 'DAV:', namespace = 'DAV:',
propertyRequestBody = `<?xml version="1.0"?> propfindBody = `<?xml version="1.0"?>
<d:propfind xmlns:d="DAV:" xmlns:oc="http://owncloud.org/ns" xmlns:nc="http://nextcloud.org/ns"> <d:propfind xmlns:d="DAV:" xmlns:oc="http://owncloud.org/ns" xmlns:nc="http://nextcloud.org/ns">
<d:prop> <d:prop>
<d:getlastmodified /> <d:resourcetype />
<d:getetag /> <oc:size />
<d:getcontenttype /> <d:getcontentlength />
<d:resourcetype /> </d:prop>
<oc:fileid /> </d:propfind>`,
<oc:permissions />
<oc:size />
<d:getcontentlength />
<nc:has-preview />
<oc:favorite />
<oc:comments-unread />
<oc:owner-display-name />
<oc:share-types />
</d:prop>
</d:propfind>`,
xmlParser = new DOMParser(), xmlParser = new DOMParser(),
pathRegex = /.*\/remote.php\/dav\/files\/[^/]+/g, pathRegex = /.*\/remote.php\/dav\/files\/[^/]+/g,
getDavElementsByTagName = (parent, localName) => parent.getElementsByTagNameNS(namespace, localName), getDavElementsByTagName = (parent, localName) => parent.getElementsByTagNameNS(namespace, localName),
getDavElementByTagName = (parent, localName) => getDavElementsByTagName(parent, localName)?.item(0), getDavElementByTagName = (parent, localName) => getDavElementsByTagName(parent, localName)?.item(0),
getElementByTagName = (parent, localName) => +parent.getElementsByTagName(localName)?.item(0); getElementByTagName = (parent, localName) => +parent.getElementsByTagName(localName)?.item(0),
function davFetch(path, options) davFetch = (path, options) => {
{
if (!parent.OC.requestToken) { if (!parent.OC.requestToken) {
return Promise.reject(new Error('OC.requestToken missing')); return Promise.reject(new Error('OC.requestToken missing'));
} }
@ -44,17 +33,11 @@
}, options); }, options);
options.headers.requesttoken = parent.OC.requestToken; options.headers.requesttoken = parent.OC.requestToken;
return fetch(cfg.WebDAV + '/files/' + cfg.UID + path, options); return fetch(cfg.WebDAV + '/files/' + cfg.UID + path, options);
} },
function createDirectory(path) createDirectory = path => davFetch(path, { method: 'MKCOL' }),
{
return davFetch(path, {
method: 'MKCOL'
});
}
function fetchFiles(xml, path) fetchFiles = path => {
{
if (!parent.OC.requestToken) { if (!parent.OC.requestToken) {
return Promise.reject(new Error('OC.requestToken missing')); return Promise.reject(new Error('OC.requestToken missing'));
} }
@ -63,7 +46,7 @@
headers: { headers: {
'Content-Type': 'application/xml; charset=utf-8' 'Content-Type': 'application/xml; charset=utf-8'
}, },
body: xml body: propfindBody
}) })
.then(response => (response.status < 400) ? response.text() : Promise.reject(new Error({ response }))) .then(response => (response.status < 400) ? response.text() : Promise.reject(new Error({ response })))
.then(text => { .then(text => {
@ -78,11 +61,9 @@
const const
e = responseList.item(i), e = responseList.item(i),
elem = { elem = {
id: parseInt(getElementByTagName(e, 'oc:fileid')?.innerHTML ?? 0),
name: decodeURIComponent(getDavElementByTagName(e, 'href').innerHTML) name: decodeURIComponent(getDavElementByTagName(e, 'href').innerHTML)
.replace(pathRegex, '').replace(/\/$/, ''), .replace(pathRegex, '').replace(/\/$/, ''),
isFile: false, isFile: false
lastmod: getDavElementByTagName(e, 'getlastmodified').innerHTML
} }
if (getDavElementsByTagName(getDavElementByTagName(e, 'resourcetype'), 'collection').length) { if (getDavElementsByTagName(getDavElementByTagName(e, 'resourcetype'), 'collection').length) {
// skip current directory // skip current directory
@ -91,22 +72,16 @@
} }
} else { } else {
elem.isFile = true; elem.isFile = true;
elem.mime = getDavElementByTagName(e, 'getcontenttype').innerHTML; elem.size = getDavElementByTagName(e, 'getcontentlength')?.innerHTML
elem.etag = getDavElementByTagName(e, 'getetag').innerHTML; || getElementByTagName(e, 'oc:size')?.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';
} }
elemList.push(elem); elemList.push(elem);
} }
return Promise.resolve(elemList); return Promise.resolve(elemList);
}); });
} },
function buildTree(view, parent, items, path) buildTree = (view, parent, items, path) => {
{
if (items.length) { if (items.length) {
items.forEach(item => { items.forEach(item => {
if (!item.isFile) { if (!item.isFile) {
@ -116,7 +91,7 @@
ul = document.createElement('ul'); ul = document.createElement('ul');
details.addEventListener('toggle', () => { details.addEventListener('toggle', () => {
ul.children.length 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.textContent = item.name.replace(/^.*\/([^/]+)$/, '$1');
summary.dataset.icon = '📁'; summary.dataset.icon = '📁';
@ -168,86 +143,81 @@
li.append(btn); li.append(btn);
parent.append(li); parent.append(li);
} }
};
class NextcloudFilesPopupView extends rl.pluginPopupView {
constructor() {
super('NextcloudFiles');
this.addObservables({
files: false
});
} }
class NextcloudFilesPopupView extends rl.pluginPopupView { onBuild(dom) {
constructor() { this.tree = dom.querySelector('#sm-nc-files-tree');
super('NextcloudFiles'); this.tree.addEventListener('click', event => {
this.addObservables({ let el = event.target;
files: false if (el.matches('button')) {
}); if ('select' == el.name) {
} this.select = this.files() ? [el.item] : el.item_name;
this.close();
onBuild(dom) { } else if ('create' == el.name) {
this.tree = dom.querySelector('#sm-nc-files-tree'); let name = el.input.value.replace(/[|\\?*<":>+[]\/&\s]/g, '');
this.tree.addEventListener('click', event => { if (name.length) {
let el = event.target; name = el.item_name + '/' + name;
if (el.matches('button')) { createDirectory(name).then(response => {
if ('select' == el.name) { if (response.status == 201) {
this.select = this.files() ? [el.item] : el.item_name; this.select = name;
this.close(); 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() // Happens after showModal()
beforeShow(files, fResolve) { beforeShow(files, fResolve) {
this.select = ''; this.select = '';
this.files(!!files); this.files(!!files);
this.fResolve = fResolve; this.fResolve = fResolve;
this.tree.innerHTML = ''; this.tree.innerHTML = '';
fetchFiles(propertyRequestBody, '/').then(items => { fetchFiles('/').then(items => {
buildTree(this, this.tree, items, '/'); buildTree(this, this.tree, items, '/');
}).catch(err => console.error(err)) }).catch(err => console.error(err))
} }
onHide() { onHide() {
this.fResolve(this.select); this.fResolve(this.select);
} }
/* /*
onShow() {} // Happens after showModal() beforeShow() {} // Happens before showModal()
beforeShow() {} // Happens before showModal() onShow() {} // Happens after showModal()
afterShow() {} // Happens after showModal() animation transitionend afterShow() {} // Happens after showModal() animation transitionend
onHide() {} // Happens before animation transitionend onHide() {} // Happens before animation transitionend
afterHide() {} // Happens after animation transitionend afterHide() {} // Happens after animation transitionend
close() {} close() {}
*/ */
} }
rl.ncFiles = new class { rl.ncFiles = {
async getDirectoryContents(path) { selectFolder: () =>
return await fetchFiles(propertyRequestBody, path); new Promise(resolve => {
} NextcloudFilesPopupView.showModal([
false,
folder => resolve(folder),
]);
}),
selectFolder() { selectFiles: () =>
return new Promise(resolve => { new Promise(resolve => {
NextcloudFilesPopupView.showModal([ NextcloudFilesPopupView.showModal([
false, true,
folder => resolve(folder), files => resolve(files),
]); ]);
}); })
} };
selectFiles() {
return new Promise(resolve => {
NextcloudFilesPopupView.showModal([
true,
files => resolve(files),
]);
});
}
}
})(window.rl); })(window.rl);