/* * Copyright (c) 2014 * * This file is licensed under the Affero General Public License version 3 * or later. * * See the COPYING-README file. * */ /* global FileActions, Files */ /* global dragOptions, folderDropOptions */ if (!OCA.Sharing) { OCA.Sharing = {}; } if (!OCA.Files) { OCA.Files = {}; } /** * @namespace */ OCA.Sharing.PublicApp = { _initialized: false, /** * Initializes the public share app. * * @param $el container */ initialize: function ($el) { var self = this; var fileActions; if (this._initialized) { return; } fileActions = new OCA.Files.FileActions(); // default actions fileActions.registerDefaultActions(); // legacy actions fileActions.merge(window.FileActions); // regular actions fileActions.merge(OCA.Files.fileActions); // in case apps would decide to register file actions later, // replace the global object with this one OCA.Files.fileActions = fileActions; this._initialized = true; this.initialDir = $('#dir').val(); // file list mode ? if ($el.find('#filestable').length) { this.fileList = new OCA.Files.FileList( $el, { scrollContainer: $(window), dragOptions: dragOptions, folderDropOptions: folderDropOptions, fileActions: fileActions } ); this.files = OCA.Files.Files; this.files.initialize(); } var mimetype = $('#mimetype').val(); var mimetypeIcon = $('#mimetypeIcon').val(); mimetypeIcon = mimetypeIcon.substring(0, mimetypeIcon.length - 3); mimetypeIcon = mimetypeIcon + 'svg'; var previewSupported = $('#previewSupported').val(); if (typeof FileActions !== 'undefined') { // Show file preview if previewer is available, images are already handled by the template if (mimetype.substr(0, mimetype.indexOf('/')) !== 'image' && $('.publicpreview').length === 0) { // Trigger default action if not download TODO var action = FileActions.getDefault(mimetype, 'file', OC.PERMISSION_READ); if (typeof action !== 'undefined') { action($('#filename').val()); } } } // dynamically load image previews var params = { x: $(document).width() * window.devicePixelRatio, y: $(document).height() * window.devicePixelRatio, a: 'true', file: encodeURIComponent(this.initialDir + $('#filename').val()), t: $('#sharingToken').val(), scalingup: 0 }; var img = $(''); if (previewSupported === 'true' || mimetype.substr(0, mimetype.indexOf('/')) === 'image' && mimetype !== 'image/svg+xml') { img.attr('src', OC.filePath('files_sharing', 'ajax', 'publicpreview.php') + '?' + OC.buildQueryString(params)); img.appendTo('#imgframe'); } else if (mimetype.substr(0, mimetype.indexOf('/')) !== 'video') { img.attr('src', OC.Util.replaceSVGIcon(mimetypeIcon)); img.attr('width', 128); img.appendTo('#imgframe'); } if (this.fileList) { // TODO: move this to a separate PublicFileList class that extends OCA.Files.FileList (+ unit tests) this.fileList.getDownloadUrl = function (filename, dir) { if ($.isArray(filename)) { filename = JSON.stringify(filename); } var path = dir || FileList.getCurrentDirectory(); var token = $('#sharingToken').val(); var params = { path: path, files: filename }; return OC.generateUrl('/s/'+token+'/download') + '?' + OC.buildQueryString(params); }; this.fileList.getAjaxUrl = function (action, params) { params = params || {}; params.t = $('#sharingToken').val(); return OC.filePath('files_sharing', 'ajax', action + '.php') + '?' + OC.buildQueryString(params); }; this.fileList.linkTo = function (dir) { var token = $('#sharingToken').val(); var params = { dir: dir }; return OC.generateUrl('/s/'+token+'') + '?' + OC.buildQueryString(params); }; this.fileList.generatePreviewUrl = function (urlSpec) { urlSpec.t = $('#dirToken').val(); return OC.generateUrl('/apps/files_sharing/ajax/publicpreview.php?') + $.param(urlSpec); }; var file_upload_start = $('#file_upload_start'); file_upload_start.on('fileuploadadd', function (e, data) { var fileDirectory = ''; if (typeof data.files[0].relativePath !== 'undefined') { fileDirectory = data.files[0].relativePath; } // Add custom data to the upload handler data.formData = { requesttoken: $('#publicUploadRequestToken').val(), dirToken: $('#dirToken').val(), subdir: data.targetDir || self.fileList.getCurrentDirectory(), file_directory: fileDirectory }; }); // do not allow sharing from the public page delete this.fileList.fileActions.actions.all.Share; this.fileList.changeDirectory(this.initialDir || '/', false, true); // URL history handling this.fileList.$el.on('changeDirectory', _.bind(this._onDirectoryChanged, this)); OC.Util.History.addOnPopStateHandler(_.bind(this._onUrlChanged, this)); } $(document).on('click', '#directLink', function () { $(this).focus(); $(this).select(); }); $('.save-form').submit(function (event) { event.preventDefault(); var remote = $(this).find('input[type="text"]').val(); var token = $('#sharingToken').val(); var owner = $('#save').data('owner'); var name = $('#save').data('name'); var isProtected = $('#save').data('protected') ? 1 : 0; OCA.Sharing.PublicApp._saveToOwnCloud(remote, token, owner, name, isProtected); }); $('#save #save-button').click(function () { $(this).hide(); $('.save-form').css('display', 'inline'); $('#remote_address').focus(); }); // legacy window.FileList = this.fileList; }, _onDirectoryChanged: function (e) { OC.Util.History.pushState({ // arghhhh, why is this not called "dir" !? path: e.dir }); }, _onUrlChanged: function (params) { this.fileList.changeDirectory(params.path || params.dir, false, true); }, _saveToOwnCloud: function(remote, token, owner, name, isProtected) { var location = window.location.protocol + '//' + window.location.host + OC.webroot; var url = remote + '/index.php/apps/files#' + 'remote=' + encodeURIComponent(location) // our location is the remote for the other server + "&token=" + encodeURIComponent(token) + "&owner=" + encodeURIComponent(owner) + "&name=" + encodeURIComponent(name) + "&protected=" + isProtected; if (remote.indexOf('://') > 0) { OC.redirect(url); } else { // if no protocol is specified, we automatically detect it by testing https and http // this check needs to happen on the server due to the Content Security Policy directive $.get(OC.generateUrl('apps/files_sharing/testremote'), {remote: remote}).then(function (protocol) { if (protocol !== 'http' && protocol !== 'https') { OC.dialogs.alert(t('files_sharing', 'No ownCloud installation found at {remote}', {remote: remote}), t('files_sharing', 'Invalid ownCloud url')); } else { OC.redirect(protocol + '://' + url); } }); } } }; $(document).ready(function () { var App = OCA.Sharing.PublicApp; // defer app init, to give a chance to plugins to register file actions _.defer(function () { App.initialize($('#preview')); }); if (window.Files) { // HACK: for oc-dialogs previews that depends on Files: Files.lazyLoadPreview = function (path, mime, ready, width, height, etag) { return App.fileList.lazyLoadPreview({ path: path, mime: mime, callback: ready, width: width, height: height, etag: etag }); }; } });