mirror of
https://github.com/nextcloud/server.git
synced 2026-06-05 23:06:48 -04:00
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:
parent
7a9cb7fe9f
commit
d7f3dc390b
8 changed files with 195 additions and 181 deletions
|
|
@ -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);
|
||||
|
|
@ -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');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
177
apps/federatedfilesharing/src/external.js
Normal file
177
apps/federatedfilesharing/src/external.js
Normal 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
4
dist/core-common.js
vendored
File diff suppressed because one or more lines are too long
2
dist/core-common.js.map
vendored
2
dist/core-common.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/federatedfilesharing-external.js
vendored
Normal file
2
dist/federatedfilesharing-external.js
vendored
Normal 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
|
||||
1
dist/federatedfilesharing-external.js.map
vendored
Normal file
1
dist/federatedfilesharing-external.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
|
|
@ -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'),
|
||||
},
|
||||
|
|
|
|||
Loading…
Reference in a new issue