owncloud/core

View on GitHub
apps/files_sharing/js/external.js

Summary

Maintainability
B
4 hrs
Test Coverage
/*
 * 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 () {
    /**
     * Shows "add external share" dialog.
     *
     * @param {String} remote remote server URL
     * @param {String} owner owner name
     * @param {String} name name of the shared folder
     * @param {String} token authentication token
     * @param {bool} passwordProtected true if the share is password protected
     */
    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 federated share {name} from {owner}@{remote}?',
                    {name: name, owner: owner, remote: remoteClean}, null, {escape: false}
                ),
                t('files_sharing','Federated share'),
                function (result) {
                    callback(result, share);
                },
                true
            ).then(this._adjustDialog);
        } else {
            OC.dialogs.prompt(
                t(
                    'files_sharing',
                    'Do you want to add the federated share {name} from {owner}@{remote}?',
                    {name: name, owner: owner, remote: remoteClean}, null, {escape: false}
                ),
                t('files_sharing','Federated share'),
                function (result, password) {
                    share.password = password;
                    callback(result, share);
                },
                true,
                t('files_sharing','Federated 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(0).text(t('core', 'Cancel'));
        $buttons.eq(1).text(t('files_sharing', 'Add federated 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.owner && params.name) {

                var callbackAddShare = function(result, share) {
                    var password = share.password || '';
                    if (result) {
                        //$.post(OC.generateUrl('/apps/files_sharing/api/externalShares'), {id: share.id});
                        $.post(OC.generateUrl('apps/files_sharing/external'), {
                            remote: share.remote,
                            token: share.token,
                            owner: share.owner,
                            ownerDisplayName: share.ownerDisplayName || share.owner,
                            name: share.name,
                            password: password}, function(result) {
                            if (result.status === 'error') {
                                OC.Notification.show(t('files_sharing', result.data.message), {type: 'error'});
                            } else {
                                fileList.reload();
                            }
                        });
                    }
                };

                // 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) {
                                let shareType = "user";
                                if (share.hasOwnProperty('share_type') ){
                                    shareType = share.share_type;
                                }
                                if (result) {
                                    // Accept
                                    $.post(OC.generateUrl('/apps/files_sharing/api/externalShares'), {id: share.id, share_type: shareType })
                                        .then(function() {
                                            fileList.reload();
                                        });
                                } else {
                                    // Delete
                                    $.ajax({
                                        url: OC.generateUrl('/apps/files_sharing/api/externalShares/'+share.id+"?share_type="+shareType),
                                        type: 'DELETE'
                                    });
                                }
                            }
                    );
                }

            });

        }
    };
})();

OC.Plugins.register('OCA.Files.App', OCA.Sharing.ExternalShareDialogPlugin);