mirror of
https://github.com/the-djmaze/snappymail.git
synced 2024-09-20 15:45:55 +08:00
Cleanup Nextcloud code
This commit is contained in:
parent
c7833d622a
commit
79387262e3
|
@ -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();
|
||||||
});
|
});
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
<!-- empty -->
|
|
|
@ -1,3 +0,0 @@
|
||||||
<div style="margin: 20px">
|
|
||||||
<?php p($l->t('SnappyMail Webmail is not configured yet.')); ?>
|
|
||||||
</div>
|
|
|
@ -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();
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue