diff options
Diffstat (limited to 'apps/files_sharing')
47 files changed, 816 insertions, 145 deletions
diff --git a/apps/files_sharing/lib/api.php b/apps/files_sharing/api/local.php index 8556036f118..d9291c29f61 100644 --- a/apps/files_sharing/lib/api.php +++ b/apps/files_sharing/api/local.php @@ -1,6 +1,6 @@ <?php /** - * ownCloud + * ownCloud - OCS API for local shares * * @author Bjoern Schiessle * @copyright 2013 Bjoern Schiessle schiessle@owncloud.com @@ -20,9 +20,9 @@ * */ -namespace OCA\Files\Share; +namespace OCA\Files_Sharing\API; -class Api { +class Local { /** * get all shares diff --git a/apps/files_sharing/api/server2server.php b/apps/files_sharing/api/server2server.php new file mode 100644 index 00000000000..2949e2dd09c --- /dev/null +++ b/apps/files_sharing/api/server2server.php @@ -0,0 +1,224 @@ +<?php +/** + * ownCloud - OCS API for server-to-server shares + * + * @copyright (C) 2014 ownCloud, Inc. + * + * @author Bjoern Schiessle <schiessle@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Files_Sharing\API; + +class Server2Server { + + /** + * create a new share + * + * @param array $params + * @return \OC_OCS_Result + */ + public function createShare($params) { + + if (!$this->isS2SEnabled(true)) { + return \OC_OCS_Result(null, 503, 'Server does not support server-to-server sharing'); + } + + $remote = isset($_POST['remote']) ? $_POST['remote'] : null; + $token = isset($_POST['token']) ? $_POST['token'] : null; + $name = isset($_POST['name']) ? $_POST['name'] : null; + $owner = isset($_POST['owner']) ? $_POST['owner'] : null; + $shareWith = isset($_POST['shareWith']) ? $_POST['shareWith'] : null; + $remoteId = isset($_POST['remote_id']) ? (int)$_POST['remote_id'] : null; + + if ($remote && $token && $name && $owner && $remoteId && $shareWith) { + + if(!\OCP\Util::isValidFileName($name)) { + return new \OC_OCS_Result(null, 400, 'The mountpoint name contains invalid characters.'); + } + + if (!\OCP\User::userExists($shareWith)) { + return new \OC_OCS_Result(null, 400, 'User does not exists'); + } + + \OC_Util::setupFS($shareWith); + + $mountPoint = \OC\Files\Filesystem::normalizePath('/' . $name); + $name = \OCP\Files::buildNotExistingFileName('/', $name); + + try { + \OCA\Files_Sharing\Helper::addServer2ServerShare($remote, $token, $name, $mountPoint, $owner, $shareWith, '', $remoteId); + + \OC::$server->getActivityManager()->publishActivity( + 'files_sharing', \OCA\Files_Sharing\Activity::SUBJECT_REMOTE_SHARE_RECEIVED, array($owner), '', array(), + '', '', $shareWith, \OCA\Files_Sharing\Activity::TYPE_REMOTE_SHARE, \OCA\Files_Sharing\Activity::PRIORITY_LOW); + + return new \OC_OCS_Result(); + } catch (\Exception $e) { + return new \OC_OCS_Result(null, 500, 'server can not add remote share, ' . $e->getMessage()); + } + } + + return new \OC_OCS_Result(null, 400, 'server can not add remote share, missing parameter'); + } + + /** + * accept server-to-server share + * + * @param array $params + * @return \OC_OCS_Result + */ + public function acceptShare($params) { + + if (!$this->isS2SEnabled()) { + return \OC_OCS_Result(null, 503, 'Server does not support server-to-server sharing'); + } + + $id = $params['id']; + $token = isset($_POST['token']) ? $_POST['token'] : null; + $share = self::getShare($id, $token); + + if ($share) { + list($file, $link) = self::getFile($share['uid_owner'], $share['file_source']); + + \OC::$server->getActivityManager()->publishActivity( + 'files_sharing', \OCA\Files_Sharing\Activity::SUBJECT_REMOTE_SHARE_ACCEPTED, array($share['share_with'], basename($file)), '', array(), + $file, $link, $share['uid_owner'], \OCA\Files_Sharing\Activity::TYPE_REMOTE_SHARE, \OCA\Files_Sharing\Activity::PRIORITY_LOW); + } + + return new \OC_OCS_Result(); + } + + /** + * decline server-to-server share + * + * @param array $params + * @return \OC_OCS_Result + */ + public function declineShare($params) { + + if (!$this->isS2SEnabled()) { + return \OC_OCS_Result(null, 503, 'Server does not support server-to-server sharing'); + } + + $id = $params['id']; + $token = isset($_POST['token']) ? $_POST['token'] : null; + + $share = $this->getShare($id, $token); + + if ($share) { + // userId must be set to the user who unshares + \OCP\Share::unshare($share['item_type'], $share['item_source'], $share['share_type'], null, $share['uid_owner']); + + list($file, $link) = $this->getFile($share['uid_owner'], $share['file_source']); + + \OC::$server->getActivityManager()->publishActivity( + 'files_sharing', \OCA\Files_Sharing\Activity::SUBJECT_REMOTE_SHARE_DECLINED, array($share['share_with'], basename($file)), '', array(), + $file, $link, $share['uid_owner'], \OCA\Files_Sharing\Activity::TYPE_REMOTE_SHARE, \OCA\Files_Sharing\Activity::PRIORITY_LOW); + } + + return new \OC_OCS_Result(); + } + + /** + * remove server-to-server share if it was unshared by the owner + * + * @param array $params + * @return \OC_OCS_Result + */ + public function unshare($params) { + + if (!$this->isS2SEnabled()) { + return \OC_OCS_Result(null, 503, 'Server does not support server-to-server sharing'); + } + + $id = $params['id']; + $token = isset($_POST['token']) ? $_POST['token'] : null; + + $query = \OCP\DB::prepare('SELECT * FROM `*PREFIX*share_external` WHERE `remote_id` = ? AND `share_token` = ?'); + $query->execute(array($id, $token)); + $share = $query->fetchRow(); + + if ($token && $id && !empty($share)) { + + $owner = $share['owner'] . '@' . $share['remote']; + $mountpoint = $share['mountpoint']; + $user = $share['user']; + + $query = \OCP\DB::prepare('DELETE FROM `*PREFIX*share_external` WHERE `remote_id` = ? AND `share_token` = ?'); + $query->execute(array($id, $token)); + + \OC::$server->getActivityManager()->publishActivity( + 'files_sharing', \OCA\Files_Sharing\Activity::SUBJECT_REMOTE_SHARE_DECLINED, array($owner, $mountpoint), '', array(), + '', '', $user, \OCA\Files_Sharing\Activity::TYPE_REMOTE_SHARE, \OCA\Files_Sharing\Activity::PRIORITY_MEDIUM); + } + + return new \OC_OCS_Result(); + } + + /** + * get share + * + * @param int $id + * @param string $token + * @return array + */ + private function getShare($id, $token) { + $query = \OCP\DB::prepare('SELECT * FROM `*PREFIX*share` WHERE `id` = ? AND `token` = ? AND `share_type` = ?'); + $query->execute(array($id, $token, \OCP\Share::SHARE_TYPE_REMOTE)); + $share = $query->fetchRow(); + + return $share; + } + + /** + * get file + * + * @param string $user + * @param int $fileSource + * @return array with internal path of the file and a absolute link to it + */ + private function getFile($user, $fileSource) { + \OC_Util::setupFS($user); + + $file = \OC\Files\Filesystem::getPath($fileSource); + $args = \OC\Files\Filesystem::is_dir($file) ? array('dir' => $file) : array('dir' => dirname($file), 'scrollto' => $file); + $link = \OCP\Util::linkToAbsolute('files', 'index.php', $args); + + return array($file, $link); + + } + + /** + * check if server-to-server sharing is enabled + * + * @param bool $incoming + * @return bool + */ + private function isS2SEnabled($incoming = false) { + + $result = \OCP\App::isEnabled('files_sharing'); + + if ($incoming) { + $result = $result && \OCA\Files_Sharing\Helper::isIncomingServer2serverShareEnabled(); + } else { + $result = $result && \OCA\Files_Sharing\Helper::isOutgoingServer2serverShareEnabled(); + } + + return $result; + } + +} diff --git a/apps/files_sharing/appinfo/app.php b/apps/files_sharing/appinfo/app.php index a01f8d98c7d..36d148dce96 100644 --- a/apps/files_sharing/appinfo/app.php +++ b/apps/files_sharing/appinfo/app.php @@ -8,7 +8,6 @@ OC::$CLASSPATH['OC\Files\Cache\Shared_Cache'] = 'files_sharing/lib/cache.php'; OC::$CLASSPATH['OC\Files\Cache\Shared_Permissions'] = 'files_sharing/lib/permissions.php'; OC::$CLASSPATH['OC\Files\Cache\Shared_Updater'] = 'files_sharing/lib/updater.php'; OC::$CLASSPATH['OC\Files\Cache\Shared_Watcher'] = 'files_sharing/lib/watcher.php'; -OC::$CLASSPATH['OCA\Files\Share\Api'] = 'files_sharing/lib/api.php'; OC::$CLASSPATH['OCA\Files\Share\Maintainer'] = 'files_sharing/lib/maintainer.php'; OC::$CLASSPATH['OCA\Files\Share\Proxy'] = 'files_sharing/lib/proxy.php'; @@ -28,6 +27,10 @@ OCP\Util::addScript('files_sharing', 'external'); OC_FileProxy::register(new OCA\Files\Share\Proxy()); +\OC::$server->getActivityManager()->registerExtension(function() { + return new \OCA\Files_Sharing\Activity(); +}); + $config = \OC::$server->getConfig(); if ($config->getAppValue('core', 'shareapi_enabled', 'yes') === 'yes') { @@ -52,14 +55,17 @@ if ($config->getAppValue('core', 'shareapi_enabled', 'yes') === 'yes') { "name" => $l->t('Shared with others') ) ); - \OCA\Files\App::getNavigationManager()->add( - array( - "id" => 'sharinglinks', - "appname" => 'files_sharing', - "script" => 'list.php', - "order" => 20, - "name" => $l->t('Shared by link') - ) - ); + // Check if sharing by link is enabled + if ($config->getAppValue('core', 'shareapi_allow_links', 'yes') === 'yes') { + \OCA\Files\App::getNavigationManager()->add( + array( + "id" => 'sharinglinks', + "appname" => 'files_sharing', + "script" => 'list.php', + "order" => 20, + "name" => $l->t('Shared by link') + ) + ); + } } } diff --git a/apps/files_sharing/appinfo/database.xml b/apps/files_sharing/appinfo/database.xml index 73d64c527b7..38718ab0773 100644 --- a/apps/files_sharing/appinfo/database.xml +++ b/apps/files_sharing/appinfo/database.xml @@ -23,6 +23,12 @@ <comments>Url of the remove owncloud instance</comments> </field> <field> + <name>remote_id</name> + <type>integer</type> + <notnull>true</notnull> + <length>4</length> + </field> + <field> <name>share_token</name> <type>text</type> <notnull>true</notnull> @@ -32,7 +38,7 @@ <field> <name>password</name> <type>text</type> - <notnull>true</notnull> + <notnull>false</notnull> <length>64</length> <comments>Optional password for the public share</comments> </field> @@ -71,6 +77,13 @@ <length>32</length> <comments>md5 hash of the mountpoint</comments> </field> + <field> + <name>accepted</name> + <type>integer</type> + <default>0</default> + <notnull>true</notnull> + <length>4</length> + </field> <index> <name>sh_external_user</name> <field> diff --git a/apps/files_sharing/appinfo/routes.php b/apps/files_sharing/appinfo/routes.php index 68f33d94995..41bdf554fc5 100644 --- a/apps/files_sharing/appinfo/routes.php +++ b/apps/files_sharing/appinfo/routes.php @@ -22,25 +22,25 @@ $this->create('sharing_external_test_remote', '/testremote') OC_API::register('get', '/apps/files_sharing/api/v1/shares', - array('\OCA\Files\Share\Api', 'getAllShares'), + array('\OCA\Files_Sharing\API\Local', 'getAllShares'), 'files_sharing'); OC_API::register('post', '/apps/files_sharing/api/v1/shares', - array('\OCA\Files\Share\Api', 'createShare'), + array('\OCA\Files_Sharing\API\Local', 'createShare'), 'files_sharing'); OC_API::register('get', '/apps/files_sharing/api/v1/shares/{id}', - array('\OCA\Files\Share\Api', 'getShare'), + array('\OCA\Files_Sharing\API\Local', 'getShare'), 'files_sharing'); OC_API::register('put', '/apps/files_sharing/api/v1/shares/{id}', - array('\OCA\Files\Share\Api', 'updateShare'), + array('\OCA\Files_Sharing\API\Local', 'updateShare'), 'files_sharing'); OC_API::register('delete', '/apps/files_sharing/api/v1/shares/{id}', - array('\OCA\Files\Share\Api', 'deleteShare'), + array('\OCA\Files_Sharing\API\Local', 'deleteShare'), 'files_sharing'); diff --git a/apps/files_sharing/appinfo/version b/apps/files_sharing/appinfo/version index be14282b7ff..7d8568351b4 100644 --- a/apps/files_sharing/appinfo/version +++ b/apps/files_sharing/appinfo/version @@ -1 +1 @@ -0.5.3 +0.5.4 diff --git a/apps/files_sharing/js/app.js b/apps/files_sharing/js/app.js index 1314304c567..ff6997ab12f 100644 --- a/apps/files_sharing/js/app.js +++ b/apps/files_sharing/js/app.js @@ -30,6 +30,7 @@ OCA.Sharing.App = { this._inFileList = new OCA.Sharing.FileList( $el, { + id: 'shares.self', scrollContainer: $('#app-content'), sharedWithUser: true, fileActions: this._createFileActions() @@ -49,6 +50,7 @@ OCA.Sharing.App = { this._outFileList = new OCA.Sharing.FileList( $el, { + id: 'shares.others', scrollContainer: $('#app-content'), sharedWithUser: false, fileActions: this._createFileActions() @@ -68,6 +70,7 @@ OCA.Sharing.App = { this._linkFileList = new OCA.Sharing.FileList( $el, { + id: 'shares.link', scrollContainer: $('#app-content'), linksOnly: true, fileActions: this._createFileActions() diff --git a/apps/files_sharing/js/public.js b/apps/files_sharing/js/public.js index 0627ed6ab54..2ddcd84d4c1 100644 --- a/apps/files_sharing/js/public.js +++ b/apps/files_sharing/js/public.js @@ -53,6 +53,7 @@ OCA.Sharing.PublicApp = { this.fileList = new OCA.Files.FileList( $el, { + id: 'files.public', scrollContainer: $(window), dragOptions: dragOptions, folderDropOptions: folderDropOptions, @@ -61,6 +62,9 @@ OCA.Sharing.PublicApp = { ); this.files = OCA.Files.Files; this.files.initialize(); + // TODO: move to PublicFileList.initialize() once + // the code was split into a separate class + OC.Plugins.attach('OCA.Sharing.PublicFileList', this.fileList); } var mimetype = $('#mimetype').val(); diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js index 8474c66d4b8..bbd107e070e 100644 --- a/apps/files_sharing/js/share.js +++ b/apps/files_sharing/js/share.js @@ -17,46 +17,47 @@ */ OCA.Sharing.Util = { /** - * Initialize the sharing app overrides of the default - * file list. + * Initialize the sharing plugin. * * Registers the "Share" file action and adds additional * DOM attributes for the sharing file info. * - * @param {OCA.Files.FileActions} fileActions file actions to extend + * @param {OCA.Files.FileList} fileList file list to be extended */ - initialize: function(fileActions) { - if (OCA.Files.FileList) { - var oldCreateRow = OCA.Files.FileList.prototype._createRow; - OCA.Files.FileList.prototype._createRow = function(fileData) { - var tr = oldCreateRow.apply(this, arguments); - var sharePermissions = fileData.permissions; - if (fileData.mountType && fileData.mountType === "external-root"){ - // for external storages we cant use the permissions of the mountpoint - // instead we show all permissions and only use the share permissions from the mountpoint to handle resharing - sharePermissions = sharePermissions | (OC.PERMISSION_ALL & ~OC.PERMISSION_SHARE); - } - if (fileData.type === 'file') { - // files can't be shared with delete permissions - sharePermissions = sharePermissions & ~OC.PERMISSION_DELETE; - } - tr.attr('data-share-permissions', sharePermissions); - if (fileData.shareOwner) { - tr.attr('data-share-owner', fileData.shareOwner); - // user should always be able to rename a mount point - if (fileData.isShareMountPoint) { - tr.attr('data-permissions', fileData.permissions | OC.PERMISSION_UPDATE); - } - } - if (fileData.recipientsDisplayName) { - tr.attr('data-share-recipients', fileData.recipientsDisplayName); - } - return tr; - }; + attach: function(fileList) { + if (fileList.id === 'trashbin') { + return; } + var fileActions = fileList.fileActions; + var oldCreateRow = fileList._createRow; + fileList._createRow = function(fileData) { + var tr = oldCreateRow.apply(this, arguments); + var sharePermissions = fileData.permissions; + if (fileData.mountType && fileData.mountType === "external-root"){ + // for external storages we cant use the permissions of the mountpoint + // instead we show all permissions and only use the share permissions from the mountpoint to handle resharing + sharePermissions = sharePermissions | (OC.PERMISSION_ALL & ~OC.PERMISSION_SHARE); + } + if (fileData.type === 'file') { + // files can't be shared with delete permissions + sharePermissions = sharePermissions & ~OC.PERMISSION_DELETE; + } + tr.attr('data-share-permissions', sharePermissions); + if (fileData.shareOwner) { + tr.attr('data-share-owner', fileData.shareOwner); + // user should always be able to rename a mount point + if (fileData.isShareMountPoint) { + tr.attr('data-permissions', fileData.permissions | OC.PERMISSION_UPDATE); + } + } + if (fileData.recipientsDisplayName) { + tr.attr('data-share-recipients', fileData.recipientsDisplayName); + } + return tr; + }; // use delegate to catch the case with multiple file lists - $('#content').delegate('#fileList', 'fileActionsReady', function(ev){ + fileList.$el.on('fileActionsReady', function(ev){ var fileList = ev.fileList; var $files = ev.$files; @@ -198,12 +199,5 @@ }; })(); -$(document).ready(function() { - // FIXME: HACK: do not init when running unit tests, need a better way - if (!window.TESTING) { - if (!_.isUndefined(OC.Share) && !_.isUndefined(OCA.Files)) { - OCA.Sharing.Util.initialize(OCA.Files.fileActions); - } - } -}); +OC.Plugins.register('OCA.Files.FileList', OCA.Sharing.Util); diff --git a/apps/files_sharing/js/sharedfilelist.js b/apps/files_sharing/js/sharedfilelist.js index 7a7c24993c0..2c7d6c7d43a 100644 --- a/apps/files_sharing/js/sharedfilelist.js +++ b/apps/files_sharing/js/sharedfilelist.js @@ -38,6 +38,7 @@ _sharedWithUser: false, _linksOnly: false, _clientSideSort: true, + _allowSelection: false, /** * @private @@ -55,6 +56,7 @@ if (options && options.linksOnly) { this._linksOnly = true; } + OC.Plugins.attach('OCA.Sharing.FileList', this); }, _renderRow: function() { diff --git a/apps/files_sharing/l10n/cs_CZ.js b/apps/files_sharing/l10n/cs_CZ.js index 6b2c05b4dfb..bace06b0c41 100644 --- a/apps/files_sharing/l10n/cs_CZ.js +++ b/apps/files_sharing/l10n/cs_CZ.js @@ -19,6 +19,8 @@ OC.L10N.register( "No ownCloud installation found at {remote}" : "Nebyla nalezena instalace ownCloud na {remote}", "Invalid ownCloud url" : "Neplatná ownCloud url", "Shared by" : "Sdílí", + "A file or folder was shared from <strong>another server</strong>" : "Soubor nebo složka byla nasdílena z <strong>jiného serveru</strong>", + "You received a new remote share from %s" : "Obdrželi jste nové vzdálené sdílení z %s", "This share is password-protected" : "Toto sdílení je chráněno heslem", "The password is wrong. Try again." : "Heslo není správné. Zkuste to znovu.", "Password" : "Heslo", diff --git a/apps/files_sharing/l10n/cs_CZ.json b/apps/files_sharing/l10n/cs_CZ.json index 276887c770f..3071cd251d3 100644 --- a/apps/files_sharing/l10n/cs_CZ.json +++ b/apps/files_sharing/l10n/cs_CZ.json @@ -17,6 +17,8 @@ "No ownCloud installation found at {remote}" : "Nebyla nalezena instalace ownCloud na {remote}", "Invalid ownCloud url" : "Neplatná ownCloud url", "Shared by" : "Sdílí", + "A file or folder was shared from <strong>another server</strong>" : "Soubor nebo složka byla nasdílena z <strong>jiného serveru</strong>", + "You received a new remote share from %s" : "Obdrželi jste nové vzdálené sdílení z %s", "This share is password-protected" : "Toto sdílení je chráněno heslem", "The password is wrong. Try again." : "Heslo není správné. Zkuste to znovu.", "Password" : "Heslo", diff --git a/apps/files_sharing/l10n/da.js b/apps/files_sharing/l10n/da.js index de8c6102993..76ab4a877f7 100644 --- a/apps/files_sharing/l10n/da.js +++ b/apps/files_sharing/l10n/da.js @@ -19,6 +19,8 @@ OC.L10N.register( "No ownCloud installation found at {remote}" : "Der blev ikke fundet en ownCloud-installation på {remote}", "Invalid ownCloud url" : "Ugyldig ownCloud-URL", "Shared by" : "Delt af", + "A file or folder was shared from <strong>another server</strong>" : "En fil eller mappe blev delt fra <strong>en anden server</strong>", + "You received a new remote share from %s" : "Du modtog en ny ekstern deling fra %s", "This share is password-protected" : "Delingen er beskyttet af kodeord", "The password is wrong. Try again." : "Kodeordet er forkert. Prøv igen.", "Password" : "Kodeord", diff --git a/apps/files_sharing/l10n/da.json b/apps/files_sharing/l10n/da.json index 996d45436c6..316c66f5d35 100644 --- a/apps/files_sharing/l10n/da.json +++ b/apps/files_sharing/l10n/da.json @@ -17,6 +17,8 @@ "No ownCloud installation found at {remote}" : "Der blev ikke fundet en ownCloud-installation på {remote}", "Invalid ownCloud url" : "Ugyldig ownCloud-URL", "Shared by" : "Delt af", + "A file or folder was shared from <strong>another server</strong>" : "En fil eller mappe blev delt fra <strong>en anden server</strong>", + "You received a new remote share from %s" : "Du modtog en ny ekstern deling fra %s", "This share is password-protected" : "Delingen er beskyttet af kodeord", "The password is wrong. Try again." : "Kodeordet er forkert. Prøv igen.", "Password" : "Kodeord", diff --git a/apps/files_sharing/l10n/de.js b/apps/files_sharing/l10n/de.js index c3160792e1c..81ebd86723d 100644 --- a/apps/files_sharing/l10n/de.js +++ b/apps/files_sharing/l10n/de.js @@ -19,6 +19,8 @@ OC.L10N.register( "No ownCloud installation found at {remote}" : "Keine OwnCloud-Installation auf {remote} gefunden", "Invalid ownCloud url" : "Ungültige OwnCloud-URL", "Shared by" : "Geteilt von ", + "A file or folder was shared from <strong>another server</strong>" : "Eine Datei oder Ordner wurde von <strong>einem anderen Server</strong> geteilt", + "You received a new remote share from %s" : "Du hast eine neue Remotefreigabe von %s erhalten", "This share is password-protected" : "Diese Freigabe ist durch ein Passwort geschützt", "The password is wrong. Try again." : "Bitte überprüfe Dein Passwort und versuche es erneut.", "Password" : "Passwort", diff --git a/apps/files_sharing/l10n/de.json b/apps/files_sharing/l10n/de.json index 62a74cf445b..ceae453aa66 100644 --- a/apps/files_sharing/l10n/de.json +++ b/apps/files_sharing/l10n/de.json @@ -17,6 +17,8 @@ "No ownCloud installation found at {remote}" : "Keine OwnCloud-Installation auf {remote} gefunden", "Invalid ownCloud url" : "Ungültige OwnCloud-URL", "Shared by" : "Geteilt von ", + "A file or folder was shared from <strong>another server</strong>" : "Eine Datei oder Ordner wurde von <strong>einem anderen Server</strong> geteilt", + "You received a new remote share from %s" : "Du hast eine neue Remotefreigabe von %s erhalten", "This share is password-protected" : "Diese Freigabe ist durch ein Passwort geschützt", "The password is wrong. Try again." : "Bitte überprüfe Dein Passwort und versuche es erneut.", "Password" : "Passwort", diff --git a/apps/files_sharing/l10n/de_DE.js b/apps/files_sharing/l10n/de_DE.js index e50a15dd29e..ec97bcba393 100644 --- a/apps/files_sharing/l10n/de_DE.js +++ b/apps/files_sharing/l10n/de_DE.js @@ -19,6 +19,8 @@ OC.L10N.register( "No ownCloud installation found at {remote}" : "Keine OwnCloud-Installation auf {remote} gefunden", "Invalid ownCloud url" : "Ungültige OwnCloud-Adresse", "Shared by" : "Geteilt von", + "A file or folder was shared from <strong>another server</strong>" : "Eine Datei oder Ordner wurde von <strong>einem anderen Server</strong> geteilt", + "You received a new remote share from %s" : "Sie haben eine neue Remotefreigabe von %s erhalten", "This share is password-protected" : "Diese Freigabe ist durch ein Passwort geschützt", "The password is wrong. Try again." : "Das Passwort ist falsch. Bitte versuchen Sie es erneut.", "Password" : "Passwort", diff --git a/apps/files_sharing/l10n/de_DE.json b/apps/files_sharing/l10n/de_DE.json index 129769939e5..2dd35e35310 100644 --- a/apps/files_sharing/l10n/de_DE.json +++ b/apps/files_sharing/l10n/de_DE.json @@ -17,6 +17,8 @@ "No ownCloud installation found at {remote}" : "Keine OwnCloud-Installation auf {remote} gefunden", "Invalid ownCloud url" : "Ungültige OwnCloud-Adresse", "Shared by" : "Geteilt von", + "A file or folder was shared from <strong>another server</strong>" : "Eine Datei oder Ordner wurde von <strong>einem anderen Server</strong> geteilt", + "You received a new remote share from %s" : "Sie haben eine neue Remotefreigabe von %s erhalten", "This share is password-protected" : "Diese Freigabe ist durch ein Passwort geschützt", "The password is wrong. Try again." : "Das Passwort ist falsch. Bitte versuchen Sie es erneut.", "Password" : "Passwort", diff --git a/apps/files_sharing/l10n/en_GB.js b/apps/files_sharing/l10n/en_GB.js index 07cc91c6621..c5dfd1a7674 100644 --- a/apps/files_sharing/l10n/en_GB.js +++ b/apps/files_sharing/l10n/en_GB.js @@ -19,6 +19,8 @@ OC.L10N.register( "No ownCloud installation found at {remote}" : "No ownCloud installation found at {remote}", "Invalid ownCloud url" : "Invalid ownCloud URL", "Shared by" : "Shared by", + "A file or folder was shared from <strong>another server</strong>" : "A file or folder was shared from <strong>another server</strong>", + "You received a new remote share from %s" : "You received a new remote share from %s", "This share is password-protected" : "This share is password-protected", "The password is wrong. Try again." : "The password is wrong. Try again.", "Password" : "Password", diff --git a/apps/files_sharing/l10n/en_GB.json b/apps/files_sharing/l10n/en_GB.json index f0e6f5b5bed..a145d68425c 100644 --- a/apps/files_sharing/l10n/en_GB.json +++ b/apps/files_sharing/l10n/en_GB.json @@ -17,6 +17,8 @@ "No ownCloud installation found at {remote}" : "No ownCloud installation found at {remote}", "Invalid ownCloud url" : "Invalid ownCloud URL", "Shared by" : "Shared by", + "A file or folder was shared from <strong>another server</strong>" : "A file or folder was shared from <strong>another server</strong>", + "You received a new remote share from %s" : "You received a new remote share from %s", "This share is password-protected" : "This share is password-protected", "The password is wrong. Try again." : "The password is wrong. Try again.", "Password" : "Password", diff --git a/apps/files_sharing/l10n/es.js b/apps/files_sharing/l10n/es.js index 922c52aeaa0..d7bfe45928f 100644 --- a/apps/files_sharing/l10n/es.js +++ b/apps/files_sharing/l10n/es.js @@ -19,6 +19,7 @@ OC.L10N.register( "No ownCloud installation found at {remote}" : "No se encontró una instalación de ownCloud en {remote}", "Invalid ownCloud url" : "URL de ownCloud inválido", "Shared by" : "Compartido por", + "A file or folder was shared from <strong>another server</strong>" : "Se ha compartido un archivo o carpeta desde <strong>otro servidor</strong>", "This share is password-protected" : "Este elemento compartido esta protegido por contraseña", "The password is wrong. Try again." : "La contraseña introducida es errónea. Inténtelo de nuevo.", "Password" : "Contraseña", diff --git a/apps/files_sharing/l10n/es.json b/apps/files_sharing/l10n/es.json index 8339a435be0..d7d3331ab22 100644 --- a/apps/files_sharing/l10n/es.json +++ b/apps/files_sharing/l10n/es.json @@ -17,6 +17,7 @@ "No ownCloud installation found at {remote}" : "No se encontró una instalación de ownCloud en {remote}", "Invalid ownCloud url" : "URL de ownCloud inválido", "Shared by" : "Compartido por", + "A file or folder was shared from <strong>another server</strong>" : "Se ha compartido un archivo o carpeta desde <strong>otro servidor</strong>", "This share is password-protected" : "Este elemento compartido esta protegido por contraseña", "The password is wrong. Try again." : "La contraseña introducida es errónea. Inténtelo de nuevo.", "Password" : "Contraseña", diff --git a/apps/files_sharing/l10n/fi_FI.js b/apps/files_sharing/l10n/fi_FI.js index bb02376e115..ad455736d86 100644 --- a/apps/files_sharing/l10n/fi_FI.js +++ b/apps/files_sharing/l10n/fi_FI.js @@ -19,6 +19,8 @@ OC.L10N.register( "No ownCloud installation found at {remote}" : "ownCloud-asennusta ei löytynyt kohteesta {remote}", "Invalid ownCloud url" : "Virheellinen ownCloud-osoite", "Shared by" : "Jakanut", + "A file or folder was shared from <strong>another server</strong>" : "Tiedosto tai kansio jaettiin <strong>toiselta palvelimelta</strong>", + "You received a new remote share from %s" : "Vastaanotit uuden etäjaon käyttäjältä %s", "This share is password-protected" : "Tämä jako on suojattu salasanalla", "The password is wrong. Try again." : "Väärä salasana. Yritä uudelleen.", "Password" : "Salasana", diff --git a/apps/files_sharing/l10n/fi_FI.json b/apps/files_sharing/l10n/fi_FI.json index 84b681252dc..83423ae1bcd 100644 --- a/apps/files_sharing/l10n/fi_FI.json +++ b/apps/files_sharing/l10n/fi_FI.json @@ -17,6 +17,8 @@ "No ownCloud installation found at {remote}" : "ownCloud-asennusta ei löytynyt kohteesta {remote}", "Invalid ownCloud url" : "Virheellinen ownCloud-osoite", "Shared by" : "Jakanut", + "A file or folder was shared from <strong>another server</strong>" : "Tiedosto tai kansio jaettiin <strong>toiselta palvelimelta</strong>", + "You received a new remote share from %s" : "Vastaanotit uuden etäjaon käyttäjältä %s", "This share is password-protected" : "Tämä jako on suojattu salasanalla", "The password is wrong. Try again." : "Väärä salasana. Yritä uudelleen.", "Password" : "Salasana", diff --git a/apps/files_sharing/l10n/fr.js b/apps/files_sharing/l10n/fr.js index 98f1a46627d..734f1091f75 100644 --- a/apps/files_sharing/l10n/fr.js +++ b/apps/files_sharing/l10n/fr.js @@ -19,6 +19,8 @@ OC.L10N.register( "No ownCloud installation found at {remote}" : "Aucune installation ownCloud n'a été trouvée sur {remote}", "Invalid ownCloud url" : "URL ownCloud invalide", "Shared by" : "Partagé par", + "A file or folder was shared from <strong>another server</strong>" : "Un fichier ou un répertoire a été partagé depuis <strong>un autre serveur</strong>", + "You received a new remote share from %s" : "Vous avez reçu un partage distant de %s", "This share is password-protected" : "Ce partage est protégé par un mot de passe", "The password is wrong. Try again." : "Le mot de passe est incorrect. Veuillez réessayer.", "Password" : "Mot de passe", diff --git a/apps/files_sharing/l10n/fr.json b/apps/files_sharing/l10n/fr.json index c7145f92e98..5fbdc5da72b 100644 --- a/apps/files_sharing/l10n/fr.json +++ b/apps/files_sharing/l10n/fr.json @@ -17,6 +17,8 @@ "No ownCloud installation found at {remote}" : "Aucune installation ownCloud n'a été trouvée sur {remote}", "Invalid ownCloud url" : "URL ownCloud invalide", "Shared by" : "Partagé par", + "A file or folder was shared from <strong>another server</strong>" : "Un fichier ou un répertoire a été partagé depuis <strong>un autre serveur</strong>", + "You received a new remote share from %s" : "Vous avez reçu un partage distant de %s", "This share is password-protected" : "Ce partage est protégé par un mot de passe", "The password is wrong. Try again." : "Le mot de passe est incorrect. Veuillez réessayer.", "Password" : "Mot de passe", diff --git a/apps/files_sharing/l10n/ja.js b/apps/files_sharing/l10n/ja.js index c0626abb222..42bb76958ec 100644 --- a/apps/files_sharing/l10n/ja.js +++ b/apps/files_sharing/l10n/ja.js @@ -19,6 +19,8 @@ OC.L10N.register( "No ownCloud installation found at {remote}" : "{remote} にはownCloudがインストールされていません", "Invalid ownCloud url" : "無効なownCloud URL です", "Shared by" : "共有者:", + "A file or folder was shared from <strong>another server</strong>" : "ファイルまたはフォルダーは <strong>他のサーバー</strong>から共有されました", + "You received a new remote share from %s" : "%sからリモート共有のリクエストは\n届きました。", "This share is password-protected" : "この共有はパスワードで保護されています", "The password is wrong. Try again." : "パスワードが間違っています。再試行してください。", "Password" : "パスワード", diff --git a/apps/files_sharing/l10n/ja.json b/apps/files_sharing/l10n/ja.json index 1a199b9e6dc..87128114d7c 100644 --- a/apps/files_sharing/l10n/ja.json +++ b/apps/files_sharing/l10n/ja.json @@ -17,6 +17,8 @@ "No ownCloud installation found at {remote}" : "{remote} にはownCloudがインストールされていません", "Invalid ownCloud url" : "無効なownCloud URL です", "Shared by" : "共有者:", + "A file or folder was shared from <strong>another server</strong>" : "ファイルまたはフォルダーは <strong>他のサーバー</strong>から共有されました", + "You received a new remote share from %s" : "%sからリモート共有のリクエストは\n届きました。", "This share is password-protected" : "この共有はパスワードで保護されています", "The password is wrong. Try again." : "パスワードが間違っています。再試行してください。", "Password" : "パスワード", diff --git a/apps/files_sharing/l10n/nl.js b/apps/files_sharing/l10n/nl.js index e997a1167f4..e566b2618b2 100644 --- a/apps/files_sharing/l10n/nl.js +++ b/apps/files_sharing/l10n/nl.js @@ -19,6 +19,8 @@ OC.L10N.register( "No ownCloud installation found at {remote}" : "Geen ownCloud installatie gevonden op {remote}", "Invalid ownCloud url" : "Ongeldige ownCloud url", "Shared by" : "Gedeeld door", + "A file or folder was shared from <strong>another server</strong>" : "Een bestand of map werd gedeeld vanaf <strong>een andere server</strong>", + "You received a new remote share from %s" : "U ontving een nieuwe externe share van %s", "This share is password-protected" : "Deze share is met een wachtwoord beveiligd", "The password is wrong. Try again." : "Wachtwoord ongeldig. Probeer het nogmaals.", "Password" : "Wachtwoord", diff --git a/apps/files_sharing/l10n/nl.json b/apps/files_sharing/l10n/nl.json index 9d6fd9c37ca..a386c43fe9c 100644 --- a/apps/files_sharing/l10n/nl.json +++ b/apps/files_sharing/l10n/nl.json @@ -17,6 +17,8 @@ "No ownCloud installation found at {remote}" : "Geen ownCloud installatie gevonden op {remote}", "Invalid ownCloud url" : "Ongeldige ownCloud url", "Shared by" : "Gedeeld door", + "A file or folder was shared from <strong>another server</strong>" : "Een bestand of map werd gedeeld vanaf <strong>een andere server</strong>", + "You received a new remote share from %s" : "U ontving een nieuwe externe share van %s", "This share is password-protected" : "Deze share is met een wachtwoord beveiligd", "The password is wrong. Try again." : "Wachtwoord ongeldig. Probeer het nogmaals.", "Password" : "Wachtwoord", diff --git a/apps/files_sharing/l10n/pt_BR.js b/apps/files_sharing/l10n/pt_BR.js index 57d2018282c..d7cb4df4dbe 100644 --- a/apps/files_sharing/l10n/pt_BR.js +++ b/apps/files_sharing/l10n/pt_BR.js @@ -19,6 +19,8 @@ OC.L10N.register( "No ownCloud installation found at {remote}" : "Nenhuma instalação ownCloud encontrada em {remote}", "Invalid ownCloud url" : "Url invalida para ownCloud", "Shared by" : "Compartilhado por", + "A file or folder was shared from <strong>another server</strong>" : "Um arquivo ou pasta foi compartilhada a partir de <strong>outro servidor</strong>", + "You received a new remote share from %s" : "Você recebeu um novo compartilhamento remoto de %s", "This share is password-protected" : "Este compartilhamento esta protegido por senha", "The password is wrong. Try again." : "Senha incorreta. Tente novamente.", "Password" : "Senha", diff --git a/apps/files_sharing/l10n/pt_BR.json b/apps/files_sharing/l10n/pt_BR.json index 1587aca9832..73be570ebd0 100644 --- a/apps/files_sharing/l10n/pt_BR.json +++ b/apps/files_sharing/l10n/pt_BR.json @@ -17,6 +17,8 @@ "No ownCloud installation found at {remote}" : "Nenhuma instalação ownCloud encontrada em {remote}", "Invalid ownCloud url" : "Url invalida para ownCloud", "Shared by" : "Compartilhado por", + "A file or folder was shared from <strong>another server</strong>" : "Um arquivo ou pasta foi compartilhada a partir de <strong>outro servidor</strong>", + "You received a new remote share from %s" : "Você recebeu um novo compartilhamento remoto de %s", "This share is password-protected" : "Este compartilhamento esta protegido por senha", "The password is wrong. Try again." : "Senha incorreta. Tente novamente.", "Password" : "Senha", diff --git a/apps/files_sharing/l10n/ru.js b/apps/files_sharing/l10n/ru.js index f8a73755cd1..ad639cc5bcc 100644 --- a/apps/files_sharing/l10n/ru.js +++ b/apps/files_sharing/l10n/ru.js @@ -19,6 +19,8 @@ OC.L10N.register( "No ownCloud installation found at {remote}" : "Не найдено ownCloud на {remote}", "Invalid ownCloud url" : "Неверный адрес ownCloud", "Shared by" : "Опубликовано", + "A file or folder was shared from <strong>another server</strong>" : "Файл или папка, опубликованная на <strong>другом сервере</strong>", + "You received a new remote share from %s" : "Вы получили новую публикацию от %s", "This share is password-protected" : "Для доступа к информации необходимо ввести пароль", "The password is wrong. Try again." : "Неверный пароль. Попробуйте еще раз.", "Password" : "Пароль", diff --git a/apps/files_sharing/l10n/ru.json b/apps/files_sharing/l10n/ru.json index ab20e0c3e92..21607bc8163 100644 --- a/apps/files_sharing/l10n/ru.json +++ b/apps/files_sharing/l10n/ru.json @@ -17,6 +17,8 @@ "No ownCloud installation found at {remote}" : "Не найдено ownCloud на {remote}", "Invalid ownCloud url" : "Неверный адрес ownCloud", "Shared by" : "Опубликовано", + "A file or folder was shared from <strong>another server</strong>" : "Файл или папка, опубликованная на <strong>другом сервере</strong>", + "You received a new remote share from %s" : "Вы получили новую публикацию от %s", "This share is password-protected" : "Для доступа к информации необходимо ввести пароль", "The password is wrong. Try again." : "Неверный пароль. Попробуйте еще раз.", "Password" : "Пароль", diff --git a/apps/files_sharing/l10n/tr.js b/apps/files_sharing/l10n/tr.js index 7bbeefc9622..1b0082f6c1f 100644 --- a/apps/files_sharing/l10n/tr.js +++ b/apps/files_sharing/l10n/tr.js @@ -36,6 +36,6 @@ OC.L10N.register( "Direct link" : "Doğrudan bağlantı", "Server-to-Server Sharing" : "Sunucu-Sunucu Paylaşımı", "Allow users on this server to send shares to other servers" : "Bu sunucudaki kullanıcıların diğer sunuculara paylaşım göndermelerine izin ver", - "Allow users on this server to receive shares from other servers" : "Bu sunucudaki kullanıcıların diğer sunucularda paylaşım almalarına izin ver" + "Allow users on this server to receive shares from other servers" : "Bu sunucudaki kullanıcıların diğer sunuculardan paylaşım almalarına izin ver" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/files_sharing/l10n/tr.json b/apps/files_sharing/l10n/tr.json index f91ab02288b..b9b4e46569e 100644 --- a/apps/files_sharing/l10n/tr.json +++ b/apps/files_sharing/l10n/tr.json @@ -34,6 +34,6 @@ "Direct link" : "Doğrudan bağlantı", "Server-to-Server Sharing" : "Sunucu-Sunucu Paylaşımı", "Allow users on this server to send shares to other servers" : "Bu sunucudaki kullanıcıların diğer sunuculara paylaşım göndermelerine izin ver", - "Allow users on this server to receive shares from other servers" : "Bu sunucudaki kullanıcıların diğer sunucularda paylaşım almalarına izin ver" + "Allow users on this server to receive shares from other servers" : "Bu sunucudaki kullanıcıların diğer sunuculardan paylaşım almalarına izin ver" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/files_sharing/lib/activity.php b/apps/files_sharing/lib/activity.php new file mode 100644 index 00000000000..979df1c1da6 --- /dev/null +++ b/apps/files_sharing/lib/activity.php @@ -0,0 +1,196 @@ +<?php +/** + * ownCloud - publish activities + * + * @copyright (c) 2014, ownCloud Inc. + * + * @author Bjoern Schiessle <schiessle@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + */ + +namespace OCA\Files_Sharing; + +class Activity implements \OCP\Activity\IExtension { + + const TYPE_REMOTE_SHARE = 'remote_share'; + const SUBJECT_REMOTE_SHARE_RECEIVED = 'remote_share_received'; + const SUBJECT_REMOTE_SHARE_ACCEPTED = 'remote_share_accepted'; + const SUBJECT_REMOTE_SHARE_DECLINED = 'remote_share_declined'; + const SUBJECT_REMOTE_SHARE_UNSHARED = 'remote_share_unshared'; + + /** + * The extension can return an array of additional notification types. + * If no additional types are to be added false is to be returned + * + * @param string $languageCode + * @return array|false + */ + public function getNotificationTypes($languageCode) { + $l = \OC::$server->getL10N('files_sharing', $languageCode); + return array(self::TYPE_REMOTE_SHARE => $l->t('A file or folder was shared from <strong>another server</strong>')); + } + + /** + * The extension can filter the types based on the filter if required. + * In case no filter is to be applied false is to be returned unchanged. + * + * @param array $types + * @param string $filter + * @return array|false + */ + public function filterNotificationTypes($types, $filter) { + return $types; + } + + /** + * For a given method additional types to be displayed in the settings can be returned. + * In case no additional types are to be added false is to be returned. + * + * @param string $method + * @return array|false + */ + public function getDefaultTypes($method) { + if ($method === 'stream') { + return array(self::TYPE_REMOTE_SHARE); + } + + return false; + } + + /** + * The extension can translate a given message to the requested languages. + * If no translation is available false is to be returned. + * + * @param string $app + * @param string $text + * @param array $params + * @param boolean $stripPath + * @param boolean $highlightParams + * @param string $languageCode + * @return string|false + */ + public function translate($app, $text, $params, $stripPath, $highlightParams, $languageCode) { + + $l = \OC::$server->getL10N('files_sharing', $languageCode); + + if (!$text) { + return ''; + } + + if ($app === 'files_sharing') { + switch ($text) { + case self::SUBJECT_REMOTE_SHARE_RECEIVED: + return $l->t('You received a new remote share from %s', $params)->__toString(); + case self::SUBJECT_REMOTE_SHARE_ACCEPTED: + return $l->t('%1$s accepted remote share %2$s', $params)->__toString(); + case self::SUBJECT_REMOTE_SHARE_DECLINED: + return $l->t('%1$s declined remote share %2$s', $params)->__toString(); + case self::SUBJECT_REMOTE_SHARE_UNSHARED: + return $l->t('%1$s unshared %2$s', $params)->__toString(); + } + } + } + + /** + * The extension can define the type of parameters for translation + * + * Currently known types are: + * * file => will strip away the path of the file and add a tooltip with it + * * username => will add the avatar of the user + * + * @param string $app + * @param string $text + * @return array|false + */ + public function getSpecialParameterList($app, $text) { + if ($app === 'files_sharing') { + switch ($text) { + case self::SUBJECT_REMOTE_SHARE_RECEIVED: + return array( + 0 => '',// We can not use 'username' since the user is in a different ownCloud + ); + case self::SUBJECT_REMOTE_SHARE_ACCEPTED: + case self::SUBJECT_REMOTE_SHARE_DECLINED: + case self::SUBJECT_REMOTE_SHARE_UNSHARED: + return array( + 0 => '',// We can not use 'username' since the user is in a different ownCloud + 1 => 'file', + ); + } + } + + return false; + } + + /** + * A string naming the css class for the icon to be used can be returned. + * If no icon is known for the given type false is to be returned. + * + * @param string $type + * @return string|false + */ + public function getTypeIcon($type) { + return 'icon-share'; + } + + /** + * The extension can define the parameter grouping by returning the index as integer. + * In case no grouping is required false is to be returned. + * + * @param array $activity + * @return integer|false + */ + public function getGroupParameter($activity) { + return false; + } + + /** + * The extension can define additional navigation entries. The array returned has to contain two keys 'top' + * and 'apps' which hold arrays with the relevant entries. + * If no further entries are to be added false is no be returned. + * + * @return array|false + */ + public function getNavigation() { + return false; + } + + /** + * The extension can check if a customer filter (given by a query string like filter=abc) is valid or not. + * + * @param string $filterValue + * @return boolean + */ + public function isFilterValid($filterValue) { + return false; + } + + /** + * For a given filter the extension can specify the sql query conditions including parameters for that query. + * In case the extension does not know the filter false is to be returned. + * The query condition and the parameters are to be returned as array with two elements. + * E.g. return array('`app` = ? and `message` like ?', array('mail', 'ownCloud%')); + * + * @param string $filter + * @return array|false + */ + public function getQueryForFilter($filter) { + if ($filter === 'shares') { + return array('`app` = ? and `type` = ?', array('files_sharing', self::TYPE_REMOTE_SHARE)); + } + return false; + } + +} diff --git a/apps/files_sharing/lib/cache.php b/apps/files_sharing/lib/cache.php index 270ed704bbd..e3bee145876 100644 --- a/apps/files_sharing/lib/cache.php +++ b/apps/files_sharing/lib/cache.php @@ -89,16 +89,18 @@ class Shared_Cache extends Cache { $cache = $this->getSourceCache($file); if ($cache) { $data = $cache->get($this->files[$file]); - $data['displayname_owner'] = \OC_User::getDisplayName($this->storage->getSharedFrom()); - $data['path'] = $file; - if ($file === '') { - $data['is_share_mount_point'] = true; - } - $data['uid_owner'] = $this->storage->getOwner($file); - if (isset($data['permissions'])) { - $data['permissions'] &= $this->storage->getPermissions($file); - } else { - $data['permissions'] = $this->storage->getPermissions($file); + if ($data) { + $data['displayname_owner'] = \OC_User::getDisplayName($this->storage->getSharedFrom()); + $data['path'] = $file; + if ($file === '') { + $data['is_share_mount_point'] = true; + } + $data['uid_owner'] = $this->storage->getOwner($file); + if (isset($data['permissions'])) { + $data['permissions'] &= $this->storage->getPermissions($file); + } else { + $data['permissions'] = $this->storage->getPermissions($file); + } } return $data; } @@ -343,6 +345,46 @@ class Shared_Cache extends Cache { } /** + * search for files by tag + * + * @param string|int $tag tag to search for + * @param string $userId owner of the tags + * @return array file data + */ + public function searchByTag($tag, $userId) { + // TODO: inject this + $tagger = \OC::$server->getTagManager()->load('files', null, null, $userId); + $result = array(); + $exploreDirs = array(''); + // FIXME: this is so wrong and unefficient, need to replace with actual DB queries + while (count($exploreDirs) > 0) { + $dir = array_pop($exploreDirs); + $files = $this->getFolderContents($dir); + // no results? + if (!$files) { + // maybe it's a single shared file + $file = $this->get(''); + $tags = $tagger->getTagsForObjects(array((int)$file['fileid'])); + if (!empty($tags) && in_array($tag, current($tags))) { + $result[] = $file; + } + continue; + } + foreach ($files as $file) { + if ($file['mimetype'] === 'httpd/unix-directory') { + $exploreDirs[] = ltrim($dir . '/' . $file['name'], '/'); + } else { + $tags = $tagger->getTagsForObjects(array((int)$file['fileid'])); + if (!empty($tags) && in_array($tag, current($tags))) { + $result[] = $file; + } + } + } + } + return $result; + } + + /** * get the size of a folder and set it in the cache * * @param string $path diff --git a/apps/files_sharing/lib/external/manager.php b/apps/files_sharing/lib/external/manager.php index 8176302a86a..b52e1a5044e 100644 --- a/apps/files_sharing/lib/external/manager.php +++ b/apps/files_sharing/lib/external/manager.php @@ -24,7 +24,7 @@ class Manager { private $mountManager; /** - * @var \OC\Files\Storage\Loader + * @var \OC\Files\Storage\StorageFactory */ private $storageLoader; @@ -37,10 +37,10 @@ class Manager { * @param \OCP\IDBConnection $connection * @param \OC\Files\Mount\Manager $mountManager * @param \OC\User\Session $userSession - * @param \OC\Files\Storage\Loader $storageLoader + * @param \OC\Files\Storage\StorageFactory $storageLoader */ public function __construct(\OCP\IDBConnection $connection, \OC\Files\Mount\Manager $mountManager, - \OC\Files\Storage\Loader $storageLoader, \OC\User\Session $userSession) { + \OC\Files\Storage\StorageFactory $storageLoader, \OC\User\Session $userSession) { $this->connection = $connection; $this->mountManager = $mountManager; $this->userSession = $userSession; @@ -50,14 +50,8 @@ class Manager { public function addShare($remote, $token, $password, $name, $owner) { $user = $this->userSession->getUser(); if ($user) { - $query = $this->connection->prepare(' - INSERT INTO `*PREFIX*share_external` - (`remote`, `share_token`, `password`, `name`, `owner`, `user`, `mountpoint`, `mountpoint_hash`) - VALUES (?, ?, ?, ?, ?, ?, ?, ?) - '); $mountPoint = Filesystem::normalizePath('/' . $name); - $hash = md5($mountPoint); - $query->execute(array($remote, $token, $password, $name, $owner, $user->getUID(), $mountPoint, $hash)); + \OCA\Files_Sharing\Helper::addServer2ServerShare($remote, $token, $name, $mountPoint, $owner, $user->getUID(), $password, -1, true); $options = array( 'remote' => $remote, @@ -81,9 +75,9 @@ class Manager { $query = $this->connection->prepare(' SELECT `remote`, `share_token`, `password`, `mountpoint`, `owner` FROM `*PREFIX*share_external` - WHERE `user` = ? + WHERE `user` = ? AND `accepted` = ? '); - $query->execute(array($user->getUID())); + $query->execute(array($user->getUID(), 1)); while ($row = $query->fetch()) { $row['manager'] = $this; diff --git a/apps/files_sharing/lib/external/mount.php b/apps/files_sharing/lib/external/mount.php index e564dded69a..6fd9882cb2a 100644 --- a/apps/files_sharing/lib/external/mount.php +++ b/apps/files_sharing/lib/external/mount.php @@ -8,9 +8,10 @@ namespace OCA\Files_Sharing\External; +use OC\Files\Mount\MountPoint; use OC\Files\Mount\MoveableMount; -class Mount extends \OC\Files\Mount\Mount implements MoveableMount { +class Mount extends MountPoint implements MoveableMount { /** * @var \OCA\Files_Sharing\External\Manager @@ -22,7 +23,7 @@ class Mount extends \OC\Files\Mount\Mount implements MoveableMount { * @param string $mountpoint * @param array $options * @param \OCA\Files_Sharing\External\Manager $manager - * @param \OC\Files\Storage\Loader $loader + * @param \OC\Files\Storage\StorageFactory $loader */ public function __construct($storage, $mountpoint, $options, $manager, $loader = null) { parent::__construct($storage, $mountpoint, $options, $loader); diff --git a/apps/files_sharing/lib/helper.php b/apps/files_sharing/lib/helper.php index f7204a8db8f..c83debe952f 100644 --- a/apps/files_sharing/lib/helper.php +++ b/apps/files_sharing/lib/helper.php @@ -21,6 +21,30 @@ class Helper { } /** + * add server-to-server share to database + * + * @param string $remote + * @param string $token + * @param string $name + * @param string $mountPoint + * @param string $owner + * @param string $user + * @param string $password + * @param int $remoteId + * @param bool $accepted + */ + public static function addServer2ServerShare($remote, $token, $name, $mountPoint, $owner, $user, $password='', $remoteId=-1, $accepted = false) { + $accepted = $accepted ? 1 : 0; + $query = \OCP\DB::prepare(' + INSERT INTO `*PREFIX*share_external` + (`remote`, `share_token`, `password`, `name`, `owner`, `user`, `mountpoint`, `mountpoint_hash`, `accepted`, `remote_id`) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + '); + $hash = md5($mountPoint); + $query->execute(array($remote, $token, $password, $name, $owner, $user, $mountPoint, $hash, $accepted, $remoteId)); + } + + /** * Sets up the filesystem and user for public sharing * @param string $token string share token * @param string $relativePath optional path relative to the share diff --git a/apps/files_sharing/lib/sharedmount.php b/apps/files_sharing/lib/sharedmount.php index a93ecfb3b1b..d16dbf89ccf 100644 --- a/apps/files_sharing/lib/sharedmount.php +++ b/apps/files_sharing/lib/sharedmount.php @@ -8,13 +8,13 @@ namespace OCA\Files_Sharing; -use OC\Files\Mount\Mount; +use OC\Files\Mount\MountPoint; use OC\Files\Mount\MoveableMount; /** * Shared mount points can be moved by the user */ -class SharedMount extends Mount implements MoveableMount { +class SharedMount extends MountPoint implements MoveableMount { /** * @var \OC\Files\Storage\Shared $storage */ diff --git a/apps/files_sharing/tests/api.php b/apps/files_sharing/tests/api.php index 1259197423b..dd6de15010f 100644 --- a/apps/files_sharing/tests/api.php +++ b/apps/files_sharing/tests/api.php @@ -76,7 +76,7 @@ class Test_Files_Sharing_Api extends TestCase { $_POST['shareWith'] = \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2; $_POST['shareType'] = \OCP\Share::SHARE_TYPE_USER; - $result = Share\Api::createShare(array()); + $result = \OCA\Files_Sharing\API\Local::createShare(array()); $this->assertTrue($result->succeeded()); $data = $result->getData(); @@ -93,7 +93,7 @@ class Test_Files_Sharing_Api extends TestCase { $_POST['path'] = $this->folder; $_POST['shareType'] = \OCP\Share::SHARE_TYPE_LINK; - $result = Share\Api::createShare(array()); + $result = \OCA\Files_Sharing\API\Local::createShare(array()); // check if API call was successful $this->assertTrue($result->succeeded()); @@ -129,7 +129,7 @@ class Test_Files_Sharing_Api extends TestCase { $_POST['shareType'] = \OCP\Share::SHARE_TYPE_LINK; - $result = Share\Api::createShare(array()); + $result = \OCA\Files_Sharing\API\Local::createShare(array()); $this->assertFalse($result->succeeded()); @@ -138,7 +138,7 @@ class Test_Files_Sharing_Api extends TestCase { $_POST['shareType'] = \OCP\Share::SHARE_TYPE_LINK; $_POST['password'] = ''; - $result = Share\Api::createShare(array()); + $result = \OCA\Files_Sharing\API\Local::createShare(array()); $this->assertFalse($result->succeeded()); // share with password should succeed @@ -146,7 +146,7 @@ class Test_Files_Sharing_Api extends TestCase { $_POST['shareType'] = \OCP\Share::SHARE_TYPE_LINK; $_POST['password'] = 'foo'; - $result = Share\Api::createShare(array()); + $result = \OCA\Files_Sharing\API\Local::createShare(array()); $this->assertTrue($result->succeeded()); $data = $result->getData(); @@ -157,7 +157,7 @@ class Test_Files_Sharing_Api extends TestCase { $params['_put'] = array(); $params['_put']['password'] = 'bar'; - $result = Share\Api::updateShare($params); + $result = \OCA\Files_Sharing\API\Local::updateShare($params); $this->assertTrue($result->succeeded()); // removing password should fail @@ -166,7 +166,7 @@ class Test_Files_Sharing_Api extends TestCase { $params['_put'] = array(); $params['_put']['password'] = ''; - $result = Share\Api::updateShare($params); + $result = \OCA\Files_Sharing\API\Local::updateShare($params); $this->assertFalse($result->succeeded()); // cleanup @@ -187,7 +187,7 @@ class Test_Files_Sharing_Api extends TestCase { $_POST['shareWith'] = \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2; $_POST['shareType'] = \OCP\Share::SHARE_TYPE_USER; - $result = Share\Api::createShare(array()); + $result = \OCA\Files_Sharing\API\Local::createShare(array()); $this->assertTrue($result->succeeded()); $data = $result->getData(); @@ -213,7 +213,7 @@ class Test_Files_Sharing_Api extends TestCase { $_POST['shareWith'] = \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2; $_POST['shareType'] = \OCP\Share::SHARE_TYPE_USER; - $result = Share\Api::createShare(array()); + $result = \OCA\Files_Sharing\API\Local::createShare(array()); $this->assertTrue($result->succeeded()); $data = $result->getData(); @@ -238,7 +238,7 @@ class Test_Files_Sharing_Api extends TestCase { $_POST['shareWith'] = \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2; $_POST['shareType'] = \OCP\Share::SHARE_TYPE_USER; - $result = Share\Api::createShare(array()); + $result = \OCA\Files_Sharing\API\Local::createShare(array()); $this->assertFalse($result->succeeded()); @@ -259,7 +259,7 @@ class Test_Files_Sharing_Api extends TestCase { \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER, \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2, 31); - $result = Share\Api::getAllShares(array()); + $result = \OCA\Files_Sharing\API\Local::getAllShares(array()); $this->assertTrue($result->succeeded()); @@ -286,7 +286,7 @@ class Test_Files_Sharing_Api extends TestCase { $_GET['path'] = $this->filename; - $result = Share\Api::getAllShares(array()); + $result = \OCA\Files_Sharing\API\Local::getAllShares(array()); $this->assertTrue($result->succeeded()); @@ -323,7 +323,7 @@ class Test_Files_Sharing_Api extends TestCase { $_GET['path'] = $this->filename; - $result = Share\Api::getAllShares(array()); + $result = \OCA\Files_Sharing\API\Local::getAllShares(array()); $this->assertTrue($result->succeeded()); @@ -333,7 +333,7 @@ class Test_Files_Sharing_Api extends TestCase { // now also ask for the reshares $_GET['reshares'] = 'true'; - $result = Share\Api::getAllShares(array()); + $result = \OCA\Files_Sharing\API\Local::getAllShares(array()); $this->assertTrue($result->succeeded()); @@ -378,7 +378,7 @@ class Test_Files_Sharing_Api extends TestCase { // call getShare() with share ID $params = array('id' => $share['id']); - $result = Share\Api::getShare($params); + $result = \OCA\Files_Sharing\API\Local::getShare($params); $this->assertTrue($result->succeeded()); @@ -413,7 +413,7 @@ class Test_Files_Sharing_Api extends TestCase { $_GET['path'] = $this->folder; $_GET['subfiles'] = 'true'; - $result = Share\Api::getAllShares(array()); + $result = \OCA\Files_Sharing\API\Local::getAllShares(array()); $this->assertTrue($result->succeeded()); @@ -470,7 +470,7 @@ class Test_Files_Sharing_Api extends TestCase { $_GET['path'] = $value['query']; $_GET['subfiles'] = 'true'; - $result = Share\Api::getAllShares(array()); + $result = \OCA\Files_Sharing\API\Local::getAllShares(array()); $this->assertTrue($result->succeeded()); @@ -521,7 +521,7 @@ class Test_Files_Sharing_Api extends TestCase { $_GET['path'] = '/'; $_GET['subfiles'] = 'true'; - $result = Share\Api::getAllShares(array()); + $result = \OCA\Files_Sharing\API\Local::getAllShares(array()); $this->assertTrue($result->succeeded()); @@ -583,7 +583,7 @@ class Test_Files_Sharing_Api extends TestCase { $_GET['path'] = '/'; $_GET['subfiles'] = 'true'; - $result = Share\Api::getAllShares(array()); + $result = \OCA\Files_Sharing\API\Local::getAllShares(array()); $this->assertTrue($result->succeeded()); @@ -652,7 +652,7 @@ class Test_Files_Sharing_Api extends TestCase { $expectedPath1 = $this->subfolder; $_GET['path'] = $expectedPath1; - $result1 = Share\Api::getAllShares(array()); + $result1 = \OCA\Files_Sharing\API\Local::getAllShares(array()); $this->assertTrue($result1->succeeded()); @@ -664,7 +664,7 @@ class Test_Files_Sharing_Api extends TestCase { $expectedPath2 = $this->folder . $this->subfolder; $_GET['path'] = $expectedPath2; - $result2 = Share\Api::getAllShares(array()); + $result2 = \OCA\Files_Sharing\API\Local::getAllShares(array()); $this->assertTrue($result2->succeeded()); @@ -734,7 +734,7 @@ class Test_Files_Sharing_Api extends TestCase { $_GET['path'] = '/'; $_GET['subfiles'] = 'true'; - $result = Share\Api::getAllShares(array()); + $result = \OCA\Files_Sharing\API\Local::getAllShares(array()); $this->assertTrue($result->succeeded()); @@ -771,7 +771,7 @@ class Test_Files_Sharing_Api extends TestCase { $params = array('id' => 0); - $result = Share\Api::getShare($params); + $result = \OCA\Files_Sharing\API\Local::getShare($params); $this->assertEquals(404, $result->getStatusCode()); $meta = $result->getMeta(); @@ -831,7 +831,7 @@ class Test_Files_Sharing_Api extends TestCase { $params['_put'] = array(); $params['_put']['permissions'] = 1; - $result = Share\Api::updateShare($params); + $result = \OCA\Files_Sharing\API\Local::updateShare($params); $meta = $result->getMeta(); $this->assertTrue($result->succeeded(), $meta['message']); @@ -859,7 +859,7 @@ class Test_Files_Sharing_Api extends TestCase { $params['_put'] = array(); $params['_put']['password'] = 'foo'; - $result = Share\Api::updateShare($params); + $result = \OCA\Files_Sharing\API\Local::updateShare($params); $this->assertTrue($result->succeeded()); @@ -919,7 +919,7 @@ class Test_Files_Sharing_Api extends TestCase { $params['_put'] = array(); $params['_put']['publicUpload'] = 'true'; - $result = Share\Api::updateShare($params); + $result = \OCA\Files_Sharing\API\Local::updateShare($params); $this->assertTrue($result->succeeded()); @@ -977,7 +977,7 @@ class Test_Files_Sharing_Api extends TestCase { $params['_put'] = array(); $params['_put']['expireDate'] = $dateWithinRange->format('Y-m-d'); - $result = Share\Api::updateShare($params); + $result = \OCA\Files_Sharing\API\Local::updateShare($params); $this->assertTrue($result->succeeded()); @@ -995,7 +995,7 @@ class Test_Files_Sharing_Api extends TestCase { $params['_put'] = array(); $params['_put']['expireDate'] = $dateOutOfRange->format('Y-m-d'); - $result = Share\Api::updateShare($params); + $result = \OCA\Files_Sharing\API\Local::updateShare($params); $this->assertFalse($result->succeeded()); @@ -1033,7 +1033,7 @@ class Test_Files_Sharing_Api extends TestCase { $this->assertEquals(2, count($items)); foreach ($items as $item) { - $result = Share\Api::deleteShare(array('id' => $item['id'])); + $result = \OCA\Files_Sharing\API\Local::deleteShare(array('id' => $item['id'])); $this->assertTrue($result->succeeded()); } @@ -1072,7 +1072,7 @@ class Test_Files_Sharing_Api extends TestCase { $this->assertEquals(1, count($items)); $item = reset($items); - $result3 = Share\Api::deleteShare(array('id' => $item['id'])); + $result3 = \OCA\Files_Sharing\API\Local::deleteShare(array('id' => $item['id'])); $this->assertTrue($result3->succeeded()); diff --git a/apps/files_sharing/tests/cache.php b/apps/files_sharing/tests/cache.php index aec1983bad3..b60bba73db8 100644 --- a/apps/files_sharing/tests/cache.php +++ b/apps/files_sharing/tests/cache.php @@ -204,6 +204,40 @@ class Test_Files_Sharing_Cache extends TestCase { $this->verifyFiles($check, $results); } + /** + * Test searching by tag + */ + function testSearchByTag() { + $userId = \OC::$server->getUserSession()->getUser()->getUId(); + $id1 = $this->sharedCache->get('bar.txt')['fileid']; + $id2 = $this->sharedCache->get('subdir/another too.txt')['fileid']; + $id3 = $this->sharedCache->get('subdir/not a text file.xml')['fileid']; + $id4 = $this->sharedCache->get('subdir/another.txt')['fileid']; + $tagManager = \OC::$server->getTagManager()->load('files', null, null, $userId); + $tagManager->tagAs($id1, 'tag1'); + $tagManager->tagAs($id1, 'tag2'); + $tagManager->tagAs($id2, 'tag1'); + $tagManager->tagAs($id3, 'tag1'); + $tagManager->tagAs($id4, 'tag2'); + $results = $this->sharedStorage->getCache()->searchByTag('tag1', $userId); + $check = array( + array( + 'name' => 'bar.txt', + 'path' => 'bar.txt' + ), + array( + 'name' => 'another too.txt', + 'path' => 'subdir/another too.txt' + ), + array( + 'name' => 'not a text file.xml', + 'path' => 'subdir/not a text file.xml' + ), + ); + $this->verifyFiles($check, $results); + $tagManager->delete(array('tag1', 'tag2')); + } + function testGetFolderContentsInRoot() { $results = $this->user2View->getDirectoryContent('/'); diff --git a/apps/files_sharing/tests/js/shareSpec.js b/apps/files_sharing/tests/js/shareSpec.js index 2cf5dc47b63..e5b5de314d7 100644 --- a/apps/files_sharing/tests/js/shareSpec.js +++ b/apps/files_sharing/tests/js/shareSpec.js @@ -9,7 +9,6 @@ */ describe('OCA.Sharing.Util tests', function() { - var oldFileListPrototype; var fileList; var testFiles; @@ -24,10 +23,6 @@ describe('OCA.Sharing.Util tests', function() { } beforeEach(function() { - // back up prototype, as it will be extended by - // the sharing code - oldFileListPrototype = _.extend({}, OCA.Files.FileList.prototype); - var $content = $('<div id="content"></div>'); $('#testArea').append($content); // dummy file list @@ -41,12 +36,12 @@ describe('OCA.Sharing.Util tests', function() { $('#content').append($div); var fileActions = new OCA.Files.FileActions(); - OCA.Sharing.Util.initialize(fileActions); fileList = new OCA.Files.FileList( $div, { fileActions : fileActions } ); + OCA.Sharing.Util.attach(fileList); testFiles = [{ id: 1, @@ -67,7 +62,6 @@ describe('OCA.Sharing.Util tests', function() { }; }); afterEach(function() { - OCA.Files.FileList.prototype = oldFileListPrototype; delete OCA.Sharing.sharesLoaded; delete OC.Share.droppedDown; fileList.destroy(); @@ -105,7 +99,7 @@ describe('OCA.Sharing.Util tests', function() { $action = $tr.find('.action-share'); expect($action.hasClass('permanent')).toEqual(false); expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg'); - expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder.svg'); + expect(OC.basename(getImageUrl($tr.find('.filename .thumbnail')))).toEqual('folder.svg'); expect($action.find('img').length).toEqual(1); }); it('shows simple share text with share icon', function() { @@ -125,7 +119,7 @@ describe('OCA.Sharing.Util tests', function() { expect($action.hasClass('permanent')).toEqual(true); expect($action.find('>span').text()).toEqual('Shared'); expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg'); - expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder-shared.svg'); + expect(OC.basename(getImageUrl($tr.find('.filename .thumbnail')))).toEqual('folder-shared.svg'); expect($action.find('img').length).toEqual(1); }); it('shows simple share text with public icon when shared with link', function() { @@ -146,7 +140,7 @@ describe('OCA.Sharing.Util tests', function() { expect($action.hasClass('permanent')).toEqual(true); expect($action.find('>span').text()).toEqual('Shared'); expect(OC.basename($action.find('img').attr('src'))).toEqual('public.svg'); - expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder-public.svg'); + expect(OC.basename(getImageUrl($tr.find('.filename .thumbnail')))).toEqual('folder-public.svg'); expect($action.find('img').length).toEqual(1); }); it('shows owner name when owner is available', function() { @@ -167,7 +161,7 @@ describe('OCA.Sharing.Util tests', function() { expect($action.hasClass('permanent')).toEqual(true); expect($action.find('>span').text()).toEqual('User One'); expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg'); - expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder-shared.svg'); + expect(OC.basename(getImageUrl($tr.find('.filename .thumbnail')))).toEqual('folder-shared.svg'); }); it('shows recipients when recipients are available', function() { var $action, $tr; @@ -187,7 +181,7 @@ describe('OCA.Sharing.Util tests', function() { expect($action.hasClass('permanent')).toEqual(true); expect($action.find('>span').text()).toEqual('Shared with User One, User Two'); expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg'); - expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder-shared.svg'); + expect(OC.basename(getImageUrl($tr.find('.filename .thumbnail')))).toEqual('folder-shared.svg'); expect($action.find('img').length).toEqual(1); }); it('shows static share text when file shared with user that has no share permission', function() { @@ -209,7 +203,7 @@ describe('OCA.Sharing.Util tests', function() { expect($action.hasClass('permanent')).toEqual(true); expect($action.find('>span').text().trim()).toEqual('User One'); expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg'); - expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder-shared.svg'); + expect(OC.basename(getImageUrl($tr.find('.filename .thumbnail')))).toEqual('folder-shared.svg'); expect($action.find('img').length).toEqual(1); }); }); diff --git a/apps/files_sharing/tests/js/sharedfilelistSpec.js b/apps/files_sharing/tests/js/sharedfilelistSpec.js index dc6931af6e8..7fdc6345e38 100644 --- a/apps/files_sharing/tests/js/sharedfilelistSpec.js +++ b/apps/files_sharing/tests/js/sharedfilelistSpec.js @@ -9,8 +9,7 @@ */ describe('OCA.Sharing.FileList tests', function() { - var testFiles, alertStub, notificationStub, fileList, fileActions; - var oldFileListPrototype; + var testFiles, alertStub, notificationStub, fileList; beforeEach(function() { alertStub = sinon.stub(OC.dialogs, 'alert'); @@ -46,18 +45,11 @@ describe('OCA.Sharing.FileList tests', function() { '<div id="emptycontent">Empty content message</div>' + '</div>' ); - // back up prototype, as it will be extended by - // the sharing code - oldFileListPrototype = _.extend({}, OCA.Files.FileList.prototype); - fileActions = new OCA.Files.FileActions(); - OCA.Sharing.Util.initialize(fileActions); }); afterEach(function() { - OCA.Files.FileList.prototype = oldFileListPrototype; testFiles = undefined; fileList.destroy(); fileList = undefined; - fileActions = undefined; notificationStub.restore(); alertStub.restore(); @@ -72,6 +64,7 @@ describe('OCA.Sharing.FileList tests', function() { sharedWithUser: true } ); + OCA.Sharing.Util.attach(fileList); fileList.reload(); @@ -193,6 +186,7 @@ describe('OCA.Sharing.FileList tests', function() { sharedWithUser: false } ); + OCA.Sharing.Util.attach(fileList); fileList.reload(); @@ -433,6 +427,7 @@ describe('OCA.Sharing.FileList tests', function() { linksOnly: true } ); + OCA.Sharing.Util.attach(fileList); fileList.reload(); @@ -575,11 +570,8 @@ describe('OCA.Sharing.FileList tests', function() { '</div>'); $('#content').append($div); - fileList = new OCA.Files.FileList( - $div, { - fileActions: fileActions - } - ); + fileList = new OCA.Files.FileList($div); + OCA.Sharing.Util.attach(fileList); }); it('external storage root folder', function () { diff --git a/apps/files_sharing/tests/server2server.php b/apps/files_sharing/tests/server2server.php new file mode 100644 index 00000000000..7aec0c4951f --- /dev/null +++ b/apps/files_sharing/tests/server2server.php @@ -0,0 +1,102 @@ +<?php +/** + * ownCloud - test server-to-server OCS API + * + * @copyright (c) ownCloud, Inc. + * + * @author Bjoern Schiessle <schiessle@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +use OCA\Files_Sharing\Tests\TestCase; + +/** + * Class Test_Files_Sharing_Api + */ +class Test_Files_Sharing_S2S_OCS_API extends TestCase { + + const TEST_FOLDER_NAME = '/folder_share_api_test'; + + private $s2s; + + protected function setUp() { + parent::setUp(); + + self::loginHelper(self::TEST_FILES_SHARING_API_USER1); + \OCP\Share::registerBackend('test', 'Test_Share_Backend'); + + $this->s2s = new \OCA\Files_Sharing\API\Server2Server(); + } + + protected function tearDown() { + $query = \OCP\DB::prepare('DELETE FROM `*PREFIX*share_external`'); + $query->execute(); + + parent::tearDown(); + } + + /** + * @medium + */ + function testCreateShare() { + // simulate a post request + $_POST['remote'] = 'localhost'; + $_POST['token'] = 'token'; + $_POST['name'] = 'name'; + $_POST['owner'] = 'owner'; + $_POST['shareWith'] = self::TEST_FILES_SHARING_API_USER2; + $_POST['remote_id'] = 1; + + $result = $this->s2s->createShare(null); + + $this->assertTrue($result->succeeded()); + + $query = \OCP\DB::prepare('SELECT * FROM `*PREFIX*share_external` WHERE `remote_id` = ?'); + $result = $query->execute(array('1')); + $data = $result->fetchRow(); + + $this->assertSame('localhost', $data['remote']); + $this->assertSame('token', $data['share_token']); + $this->assertSame('/name', $data['name']); + $this->assertSame('owner', $data['owner']); + $this->assertSame(self::TEST_FILES_SHARING_API_USER2, $data['user']); + $this->assertSame(1, (int)$data['remote_id']); + $this->assertSame(0, (int)$data['accepted']); + } + + + function testDeclineShare() { + $dummy = \OCP\DB::prepare(' + INSERT INTO `*PREFIX*share` + (`share_type`, `uid_owner`, `item_type`, `item_source`, `item_target`, `file_source`, `file_target`, `permissions`, `stime`, `token`) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + '); + $dummy->execute(array(\OCP\Share::SHARE_TYPE_REMOTE, self::TEST_FILES_SHARING_API_USER1, 'test', '1', '/1', '1', '/test.txt', '1', time(), 'token')); + + $verify = \OCP\DB::prepare('SELECT * FROM `*PREFIX*share`'); + $result = $verify->execute(); + $data = $result->fetchAll(); + $this->assertSame(1, count($data)); + + $_POST['token'] = 'token'; + $this->s2s->declineShare(array('id' => $data[0]['id'])); + + $verify = \OCP\DB::prepare('SELECT * FROM `*PREFIX*share`'); + $result = $verify->execute(); + $data = $result->fetchAll(); + $this->assertEmpty($data); + } +} |