fix(federatedfilesharing): import external federated share script

Signed-off-by: skjnldsv <skjnldsv@protonmail.com>
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
This commit is contained in:
skjnldsv 2024-05-31 15:26:39 +02:00 committed by nextcloud-command
parent 7a9cb7fe9f
commit d7f3dc390b
8 changed files with 195 additions and 181 deletions

View file

@ -1,173 +0,0 @@
/**
* Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
(function() {
OCA.Sharing = OCA.Sharing || {}
/**
* Shows "add external share" dialog.
*
* @param {Object} share the share
* @param {String} share.remote remote server URL
* @param {String} share.owner owner name
* @param {String} share.name name of the shared folder
* @param {String} share.token authentication token
* @param {boolean} passwordProtected true if the share is password protected
* @param {Function} callback the callback
*/
OCA.Sharing.showAddExternalDialog = function(share, passwordProtected, callback) {
var remote = share.remote;
var owner = share.ownerDisplayName || share.owner;
var name = share.name;
var remoteClean = (remote.substr(0, 8) === 'https://') ? remote.substr(8) : remote.substr(7);
if (!passwordProtected) {
OC.dialogs.confirm(
t(
'files_sharing',
'Do you want to add the remote share {name} from {owner}@{remote}?',
{ name: name, owner: owner, remote: remoteClean }
),
t('files_sharing', 'Remote share'),
function(result) {
callback(result, share);
},
true
).then(this._adjustDialog);
} else {
OC.dialogs.prompt(
t(
'files_sharing',
'Do you want to add the remote share {name} from {owner}@{remote}?',
{ name: name, owner: owner, remote: remoteClean }
),
t('files_sharing', 'Remote share'),
function(result, password) {
share.password = password;
callback(result, share);
},
true,
t('files_sharing', 'Remote share password'),
true
).then(this._adjustDialog);
}
};
OCA.Sharing._adjustDialog = function() {
var $dialog = $('.oc-dialog:visible');
var $buttons = $dialog.find('button');
// hack the buttons
$dialog.find('.ui-icon').remove();
$buttons.eq(1).text(t('core', 'Cancel'));
$buttons.eq(2).text(t('files_sharing', 'Add remote share'));
};
OCA.Sharing.ExternalShareDialogPlugin = {
filesApp: null,
attach: function(filesApp) {
var self = this;
this.filesApp = filesApp;
this.processIncomingShareFromUrl();
if (!$('#header').find('div.notifications').length) {
// No notification app, display the modal
this.processSharesToConfirm();
}
$('body').on('OCA.Notification.Action', function(e) {
if (e.notification.app === 'files_sharing' && e.notification.object_type === 'remote_share' && e.action.type === 'POST') {
// User accepted a remote share reload
self.filesApp.fileList.reload();
}
});
},
/**
* Process incoming remote share that might have been passed
* through the URL
*/
processIncomingShareFromUrl: function() {
var fileList = this.filesApp.fileList;
var params = OC.Util.History.parseUrlQuery();
// manually add server-to-server share
if (params.remote && params.token && params.name) {
var callbackAddShare = function(result, share) {
var password = share.password || '';
if (result) {
$.post(
OC.generateUrl('apps/federatedfilesharing/askForFederatedShare'),
{
remote: share.remote,
token: share.token,
owner: share.owner,
ownerDisplayName: share.ownerDisplayName || share.owner,
name: share.name,
password: password
}
).done(function(data) {
if (data.hasOwnProperty('legacyMount')) {
fileList.reload();
} else {
OC.Notification.showTemporary(data.message);
}
}).fail(function(data) {
OC.Notification.showTemporary(JSON.parse(data.responseText).message);
});
}
};
// clear hash, it is unlikely that it contain any extra parameters
location.hash = '';
params.passwordProtected = parseInt(params.protected, 10) === 1;
OCA.Sharing.showAddExternalDialog(
params,
params.passwordProtected,
callbackAddShare
);
}
},
/**
* Retrieve a list of remote shares that need to be approved
*/
processSharesToConfirm: function() {
var fileList = this.filesApp.fileList;
// check for new server-to-server shares which need to be approved
$.get(OC.generateUrl('/apps/files_sharing/api/externalShares'), {}, function(shares) {
var index;
for (index = 0; index < shares.length; ++index) {
OCA.Sharing.showAddExternalDialog(
shares[index],
false,
function(result, share) {
if (result) {
// Accept
$.post(OC.generateUrl('/apps/files_sharing/api/externalShares'), {id: share.id})
.then(function() {
fileList.reload();
});
} else {
// Delete
$.ajax({
url: OC.generateUrl('/apps/files_sharing/api/externalShares/'+share.id),
type: 'DELETE'
});
}
}
);
}});
}
};
})(OC, OCA);
OC.Plugins.register('OCA.Files.App', OCA.Sharing.ExternalShareDialogPlugin);

View file

@ -27,15 +27,20 @@ namespace OCA\FederatedFileSharing\Listeners;
use OCA\FederatedFileSharing\FederatedShareProvider;
use OCA\Files\Event\LoadAdditionalScriptsEvent;
use OCP\App\IAppManager;
use OCP\AppFramework\Services\IInitialState;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
class LoadAdditionalScriptsListener implements IEventListener {
/** @var FederatedShareProvider */
protected $federatedShareProvider;
public function __construct(FederatedShareProvider $federatedShareProvider) {
public function __construct(
private FederatedShareProvider $federatedShareProvider,
private IInitialState $initialState,
private IAppManager $appManager,
) {
$this->federatedShareProvider = $federatedShareProvider;
$this->initialState = $initialState;
$this->appManager = $appManager;
}
public function handle(Event $event): void {
@ -44,7 +49,8 @@ class LoadAdditionalScriptsListener implements IEventListener {
}
if ($this->federatedShareProvider->isIncomingServer2serverShareEnabled()) {
\OCP\Util::addScript('federatedfilesharing', 'external');
$this->initialState->provideInitialState('notificationsEnabled', $this->appManager->isEnabledForUser('notifications'));
\OCP\Util::addInitScript('federatedfilesharing', 'external');
}
}
}

View file

@ -0,0 +1,177 @@
/**
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2014-2016 ownCloud, Inc.
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { loadState } from '@nextcloud/initial-state'
import { generateUrl } from '@nextcloud/router'
window.OCA.Sharing = window.OCA.Sharing || {}
/**
* Shows "add external share" dialog.
*
* @param {object} share the share
* @param {string} share.remote remote server URL
* @param {string} share.owner owner name
* @param {string} share.name name of the shared folder
* @param {string} share.token authentication token
* @param {boolean} passwordProtected true if the share is password protected
* @param {Function} callback the callback
*/
window.OCA.Sharing.showAddExternalDialog = function(share, passwordProtected, callback) {
const remote = share.remote
const owner = share.ownerDisplayName || share.owner
const name = share.name
// Clean up the remote URL for display
const remoteClean = remote
.replace(/^https?:\/\//, '') // remove http:// or https://
.replace(/\/$/, '') // remove trailing slash
if (!passwordProtected) {
window.OC.dialogs.confirm(
t(
'files_sharing',
'Do you want to add the remote share {name} from {owner}@{remote}?',
{ name, owner, remote: remoteClean },
),
t('files_sharing', 'Remote share'),
function(result) {
callback(result, share)
},
true,
).then(this._adjustDialog)
} else {
window.OC.dialogs.prompt(
t(
'files_sharing',
'Do you want to add the remote share {name} from {owner}@{remote}?',
{ name, owner, remote: remoteClean },
),
t('files_sharing', 'Remote share'),
function(result, password) {
share.password = password
callback(result, share)
},
true,
t('files_sharing', 'Remote share password'),
true,
).then(this._adjustDialog)
}
}
window.OCA.Sharing._adjustDialog = function() {
const $dialog = $('.oc-dialog:visible')
const $buttons = $dialog.find('button')
// hack the buttons
$dialog.find('.ui-icon').remove()
$buttons.eq(1).text(t('core', 'Cancel'))
$buttons.eq(2).text(t('files_sharing', 'Add remote share'))
}
const reloadFilesList = function() {
if (!window?.OCP?.Files?.Router?.goToRoute) {
// No router, just reload the page
window.location.reload()
return
}
// Let's redirect to the root as any accepted share would be there
window.OCP.Files.Router.goToRoute(
null,
{ ...window.OCP.Files.Router.params, fileid: undefined },
{ ...window.OCP.Files.Router.query, dir: '/', openfile: undefined },
)
}
/**
* Process incoming remote share that might have been passed
* through the URL
*/
const processIncomingShareFromUrl = function() {
const params = window.OC.Util.History.parseUrlQuery()
// manually add server-to-server share
if (params.remote && params.token && params.name) {
const callbackAddShare = function(result, share) {
const password = share.password || ''
if (result) {
$.post(
generateUrl('apps/federatedfilesharing/askForFederatedShare'),
{
remote: share.remote,
token: share.token,
owner: share.owner,
ownerDisplayName: share.ownerDisplayName || share.owner,
name: share.name,
password,
},
).done(function(data) {
if (data.hasOwnProperty('legacyMount')) {
reloadFilesList()
} else {
window.OC.Notification.showTemporary(data.message)
}
}).fail(function(data) {
window.OC.Notification.showTemporary(JSON.parse(data.responseText).message)
})
}
}
// clear hash, it is unlikely that it contain any extra parameters
location.hash = ''
params.passwordProtected = parseInt(params.protected, 10) === 1
window.OCA.Sharing.showAddExternalDialog(
params,
params.passwordProtected,
callbackAddShare,
)
}
}
/**
* Retrieve a list of remote shares that need to be approved
*/
const processSharesToConfirm = function() {
// check for new server-to-server shares which need to be approved
$.get(generateUrl('/apps/files_sharing/api/externalShares'), {}, function(shares) {
let index
for (index = 0; index < shares.length; ++index) {
window.OCA.Sharing.showAddExternalDialog(
shares[index],
false,
function(result, share) {
if (result) {
// Accept
$.post(generateUrl('/apps/files_sharing/api/externalShares'), { id: share.id })
.then(function() {
reloadFilesList()
})
} else {
// Delete
$.ajax({
url: generateUrl('/apps/files_sharing/api/externalShares/' + share.id),
type: 'DELETE',
})
}
},
)
}
})
}
processIncomingShareFromUrl()
if (loadState('federatedfilesharing', 'notificationsEnabled', true) !== true) {
// No notification app, display the modal
processSharesToConfirm()
}
$('body').on('window.OCA.Notification.Action', function(e) {
if (e.notification.app === 'files_sharing' && e.notification.object_type === 'remote_share' && e.action.type === 'POST') {
// User accepted a remote share reload
reloadFilesList()
}
})

4
dist/core-common.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
dist/federatedfilesharing-external.js vendored Normal file
View file

@ -0,0 +1,2 @@
(()=>{"use strict";var e,o={54878:(e,o,n)=>{var r=n(38613),i=n(99498);window.OCA.Sharing=window.OCA.Sharing||{},window.OCA.Sharing.showAddExternalDialog=function(e,o,n){const r=e.remote,i=e.ownerDisplayName||e.owner,a=e.name,s=r.replace(/^https?:\/\//,"").replace(/\/$/,"");o?window.OC.dialogs.prompt(t("files_sharing","Do you want to add the remote share {name} from {owner}@{remote}?",{name:a,owner:i,remote:s}),t("files_sharing","Remote share"),(function(o,t){e.password=t,n(o,e)}),!0,t("files_sharing","Remote share password"),!0).then(this._adjustDialog):window.OC.dialogs.confirm(t("files_sharing","Do you want to add the remote share {name} from {owner}@{remote}?",{name:a,owner:i,remote:s}),t("files_sharing","Remote share"),(function(o){n(o,e)}),!0).then(this._adjustDialog)},window.OCA.Sharing._adjustDialog=function(){const e=$(".oc-dialog:visible"),o=e.find("button");e.find(".ui-icon").remove(),o.eq(1).text(t("core","Cancel")),o.eq(2).text(t("files_sharing","Add remote share"))};const a=function(){var e;null!==(e=window)&&void 0!==e&&null!==(e=e.OCP)&&void 0!==e&&null!==(e=e.Files)&&void 0!==e&&null!==(e=e.Router)&&void 0!==e&&e.goToRoute?window.OCP.Files.Router.goToRoute(null,{...window.OCP.Files.Router.params,fileid:void 0},{...window.OCP.Files.Router.query,dir:"/",openfile:void 0}):window.location.reload()};!function(){const e=window.OC.Util.History.parseUrlQuery();if(e.remote&&e.token&&e.name){const o=function(e,o){const n=o.password||"";e&&$.post((0,i.Jv)("apps/federatedfilesharing/askForFederatedShare"),{remote:o.remote,token:o.token,owner:o.owner,ownerDisplayName:o.ownerDisplayName||o.owner,name:o.name,password:n}).done((function(e){e.hasOwnProperty("legacyMount")?a():window.OC.Notification.showTemporary(e.message)})).fail((function(e){window.OC.Notification.showTemporary(JSON.parse(e.responseText).message)}))};location.hash="",e.passwordProtected=1===parseInt(e.protected,10),window.OCA.Sharing.showAddExternalDialog(e,e.passwordProtected,o)}}(),!0!==(0,r.C)("federatedfilesharing","notificationsEnabled",!0)&&$.get((0,i.Jv)("/apps/files_sharing/api/externalShares"),{},(function(e){let o;for(o=0;o<e.length;++o)window.OCA.Sharing.showAddExternalDialog(e[o],!1,(function(e,o){e?$.post((0,i.Jv)("/apps/files_sharing/api/externalShares"),{id:o.id}).then((function(){a()})):$.ajax({url:(0,i.Jv)("/apps/files_sharing/api/externalShares/"+o.id),type:"DELETE"})}))})),$("body").on("window.OCA.Notification.Action",(function(e){"files_sharing"===e.notification.app&&"remote_share"===e.notification.object_type&&"POST"===e.action.type&&a()}))}},n={};function r(e){var t=n[e];if(void 0!==t)return t.exports;var i=n[e]={id:e,loaded:!1,exports:{}};return o[e].call(i.exports,i,i.exports,r),i.loaded=!0,i.exports}r.m=o,e=[],r.O=(o,n,t,i)=>{if(!n){var a=1/0;for(f=0;f<e.length;f++){n=e[f][0],t=e[f][1],i=e[f][2];for(var s=!0,l=0;l<n.length;l++)(!1&i||a>=i)&&Object.keys(r.O).every((e=>r.O[e](n[l])))?n.splice(l--,1):(s=!1,i<a&&(a=i));if(s){e.splice(f--,1);var d=t();void 0!==d&&(o=d)}}return o}i=i||0;for(var f=e.length;f>0&&e[f-1][2]>i;f--)e[f]=e[f-1];e[f]=[n,t,i]},r.n=e=>{var o=e&&e.__esModule?()=>e.default:()=>e;return r.d(o,{a:o}),o},r.d=(e,o)=>{for(var n in o)r.o(o,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:o[n]})},r.e=()=>Promise.resolve(),r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,o)=>Object.prototype.hasOwnProperty.call(e,o),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),r.j=2299,(()=>{r.b=document.baseURI||self.location.href;var e={2299:0};r.O.j=o=>0===e[o];var o=(o,n)=>{var t,i,a=n[0],s=n[1],l=n[2],d=0;if(a.some((o=>0!==e[o]))){for(t in s)r.o(s,t)&&(r.m[t]=s[t]);if(l)var f=l(r)}for(o&&o(n);d<a.length;d++)i=a[d],r.o(e,i)&&e[i]&&e[i][0](),e[i]=0;return r.O(f)},n=self.webpackChunknextcloud=self.webpackChunknextcloud||[];n.forEach(o.bind(null,0)),n.push=o.bind(null,n.push.bind(n))})(),r.nc=void 0;var i=r.O(void 0,[4208],(()=>r(54878)));i=r.O(i)})();
//# sourceMappingURL=federatedfilesharing-external.js.map?v=fc9004d02a7b951c172e

File diff suppressed because one or more lines are too long

View file

@ -81,6 +81,7 @@ module.exports = {
oauth2: path.join(__dirname, 'apps/oauth2/src', 'main.js'),
},
federatedfilesharing: {
'external': path.join(__dirname, 'apps/federatedfilesharing/src', 'external.js'),
'vue-settings-admin': path.join(__dirname, 'apps/federatedfilesharing/src', 'main-admin.js'),
'vue-settings-personal': path.join(__dirname, 'apps/federatedfilesharing/src', 'main-personal.js'),
},