From 3234c91557a5737e9e14097efa31e723b3ca390b Mon Sep 17 00:00:00 2001 From: Adam Williamson Date: Mon, 10 Nov 2014 12:00:27 -0800 Subject: [PATCH 001/783] google: drop duplicate path trim from opendir() opendir() trims the path passed then calls getDriveFile() - which immediately does the same trim operation. This breaks opendir() on the root directory, which causes the failure of the testStat() test when it checks the ctime of the root dir. --- apps/files_external/lib/google.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/files_external/lib/google.php b/apps/files_external/lib/google.php index 62b0f182e98..d3a665cd53a 100644 --- a/apps/files_external/lib/google.php +++ b/apps/files_external/lib/google.php @@ -228,8 +228,6 @@ class Google extends \OC\Files\Storage\Common { } public function opendir($path) { - // Remove leading and trailing slashes - $path = trim($path, '/'); $folder = $this->getDriveFile($path); if ($folder) { $files = array(); -- GitLab From 874ccbfb817569b6e741af477addb287342145d0 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Tue, 21 Jul 2015 20:40:32 +0200 Subject: [PATCH 002/783] Add custom CSP for Win 10 compatibility The default content-security-policy of ownCloud forbids inline JavaScript for security reasons. IE starting on Windows 10 will however also obey the CSP which will break the event source fallback. As a workaround thus we set a custom policy which allows the execution of inline JavaScript. This fixes https://github.com/owncloud/core/issues/14286 --- lib/private/eventsource.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/private/eventsource.php b/lib/private/eventsource.php index c69671c1a75..e2be808e726 100644 --- a/lib/private/eventsource.php +++ b/lib/private/eventsource.php @@ -59,6 +59,17 @@ class OC_EventSource implements \OCP\IEventSource { $this->fallback = isset($_GET['fallback']) and $_GET['fallback'] == 'true'; if ($this->fallback) { $this->fallBackId = (int)$_GET['fallback_id']; + /** + * FIXME: The default content-security-policy of ownCloud forbids inline + * JavaScript for security reasons. IE starting on Windows 10 will + * however also obey the CSP which will break the event source fallback. + * + * As a workaround thus we set a custom policy which allows the execution + * of inline JavaScript. + * + * @link https://github.com/owncloud/core/issues/14286 + */ + header("Content-Security-Policy: default-src 'none'; script-src 'unsafe-inline'"); header("Content-Type: text/html"); echo str_repeat('' . PHP_EOL, 10); //dummy data to keep IE happy } else { -- GitLab From 7604bcb3cb07389d76e1f4e8b2023003845efbdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Fortier?= Date: Mon, 3 Aug 2015 20:15:22 -0400 Subject: [PATCH 003/783] Properly nest groups when using memberOf to detect group membership, fixes #17759 --- apps/user_ldap/group_ldap.php | 39 ++++++++++++++++++++++++++--- apps/user_ldap/tests/group_ldap.php | 7 +++--- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/apps/user_ldap/group_ldap.php b/apps/user_ldap/group_ldap.php index 1b83817151c..44b0ceac7eb 100644 --- a/apps/user_ldap/group_ldap.php +++ b/apps/user_ldap/group_ldap.php @@ -181,6 +181,39 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface { return $allMembers; } + /** + * @param string $dnGroup + * @param array &$seen + * @return array + */ + private function _getGroupDNsFromMemberOf($DN, &$seen = null) { + if ($seen === null) { + $seen = array(); + } + if (array_key_exists($DN, $seen)) { + // avoid loops + return array(); + } + $seen[$DN] = 1; + $groups = $this->access->readAttribute($DN, 'memberOf'); + if (is_array($groups)) { + $groups = $this->access->groupsMatchFilter($groups); + $allGroups = $groups; + foreach ($groups as $group) { + $nestedGroups = $this->access->connection->ldapNestedGroups; + if (!empty($nestedGroups)) { + $subGroups = $this->_getGroupDNsFromMemberOf($group, $seen); + if ($subGroups) { + $allGroups = array_merge($allGroups, $subGroups); + } + } + } + return $allGroups; + } else { + return array(); + } + } + /** * translates a primary group ID into an ownCloud internal name * @param string $gid as given by primaryGroupID on AD @@ -377,14 +410,14 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface { if(intval($this->access->connection->hasMemberOfFilterSupport) === 1 && intval($this->access->connection->useMemberOfToDetectMembership) === 1 ) { - $groupDNs = $this->access->readAttribute($userDN, 'memberOf'); - + $groupDNs = $this->_getGroupDNsFromMemberOf($userDN); + if (is_array($groupDNs)) { - $groupDNs = $this->access->groupsMatchFilter($groupDNs); foreach ($groupDNs as $dn) { $groups[] = $this->access->dn2groupname($dn); } } + if($primaryGroup !== false) { $groups[] = $primaryGroup; } diff --git a/apps/user_ldap/tests/group_ldap.php b/apps/user_ldap/tests/group_ldap.php index f716618ce48..805238e7d37 100644 --- a/apps/user_ldap/tests/group_ldap.php +++ b/apps/user_ldap/tests/group_ldap.php @@ -395,16 +395,15 @@ class Test_Group_Ldap extends \Test\TestCase { ->method('username2dn') ->will($this->returnValue($dn)); - $access->expects($this->once()) + $access->expects($this->exactly(3)) ->method('readAttribute') - ->with($dn, 'memberOf') - ->will($this->returnValue(['cn=groupA,dc=foobar', 'cn=groupB,dc=foobar'])); + ->will($this->onConsecutiveCalls(['cn=groupA,dc=foobar', 'cn=groupB,dc=foobar'], [], [])); $access->expects($this->exactly(2)) ->method('dn2groupname') ->will($this->returnArgument(0)); - $access->expects($this->once()) + $access->expects($this->exactly(3)) ->method('groupsMatchFilter') ->will($this->returnArgument(0)); -- GitLab From e0469d001384eb9c4125ca16d9babdf673be57ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Fortier?= Date: Tue, 4 Aug 2015 11:19:57 -0400 Subject: [PATCH 004/783] Take review comments into consideration for pr #18042 / issue #17759 --- apps/user_ldap/group_ldap.php | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/apps/user_ldap/group_ldap.php b/apps/user_ldap/group_ldap.php index 44b0ceac7eb..a592913c8f5 100644 --- a/apps/user_ldap/group_ldap.php +++ b/apps/user_ldap/group_ldap.php @@ -182,8 +182,8 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface { } /** - * @param string $dnGroup - * @param array &$seen + * @param string $DN + * @param array|null &$seen * @return array */ private function _getGroupDNsFromMemberOf($DN, &$seen = null) { @@ -196,22 +196,19 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface { } $seen[$DN] = 1; $groups = $this->access->readAttribute($DN, 'memberOf'); - if (is_array($groups)) { - $groups = $this->access->groupsMatchFilter($groups); - $allGroups = $groups; - foreach ($groups as $group) { - $nestedGroups = $this->access->connection->ldapNestedGroups; - if (!empty($nestedGroups)) { - $subGroups = $this->_getGroupDNsFromMemberOf($group, $seen); - if ($subGroups) { - $allGroups = array_merge($allGroups, $subGroups); - } - } - } - return $allGroups; - } else { + if (!is_array($groups)) { return array(); } + $groups = $this->access->groupsMatchFilter($groups); + $allGroups = $groups; + foreach ($groups as $group) { + $nestedGroups = $this->access->connection->ldapNestedGroups; + if (!empty($nestedGroups)) { + $subGroups = $this->_getGroupDNsFromMemberOf($group, $seen); + $allGroups = array_merge($allGroups, $subGroups); + } + } + return $allGroups; } /** -- GitLab From a55f233e9ffac7d492733f50a37343b4243898bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Fortier?= Date: Fri, 7 Aug 2015 08:56:28 -0400 Subject: [PATCH 005/783] fix more review comments for #18042 / #17759 --- apps/user_ldap/group_ldap.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/user_ldap/group_ldap.php b/apps/user_ldap/group_ldap.php index a592913c8f5..3b47eb56b03 100644 --- a/apps/user_ldap/group_ldap.php +++ b/apps/user_ldap/group_ldap.php @@ -201,9 +201,9 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface { } $groups = $this->access->groupsMatchFilter($groups); $allGroups = $groups; - foreach ($groups as $group) { - $nestedGroups = $this->access->connection->ldapNestedGroups; - if (!empty($nestedGroups)) { + $nestedGroups = $this->access->connection->ldapNestedGroups; + if (intval($nestedGroups) === 1) { + foreach ($groups as $group) { $subGroups = $this->_getGroupDNsFromMemberOf($group, $seen); $allGroups = array_merge($allGroups, $subGroups); } @@ -408,7 +408,6 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface { && intval($this->access->connection->useMemberOfToDetectMembership) === 1 ) { $groupDNs = $this->_getGroupDNsFromMemberOf($userDN); - if (is_array($groupDNs)) { foreach ($groupDNs as $dn) { $groups[] = $this->access->dn2groupname($dn); -- GitLab From 6379b1932ff6440865f765a918ff097849ed785f Mon Sep 17 00:00:00 2001 From: Robin McCorkell Date: Fri, 21 Aug 2015 10:30:42 +0100 Subject: [PATCH 006/783] Allow domain to be specified for SMB --- apps/files_external/lib/backend/smb.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/apps/files_external/lib/backend/smb.php b/apps/files_external/lib/backend/smb.php index 3d950a80c31..dc15f6d3dbf 100644 --- a/apps/files_external/lib/backend/smb.php +++ b/apps/files_external/lib/backend/smb.php @@ -42,6 +42,8 @@ class SMB extends Backend { (new DefinitionParameter('share', $l->t('Share'))), (new DefinitionParameter('root', $l->t('Remote subfolder'))) ->setFlag(DefinitionParameter::FLAG_OPTIONAL), + (new DefinitionParameter('domain', $l->t('Domain'))) + ->setFlag(DefinitionParameter::FLAG_OPTIONAL), ]) ->setDependencyCheck('\OC\Files\Storage\SMB::checkDependencies') ->addAuthScheme(AuthMechanism::SCHEME_PASSWORD) @@ -49,4 +51,14 @@ class SMB extends Backend { ; } + /** + * @param StorageConfig $storage + */ + public function manipulateStorageConfig(StorageConfig &$storage) { + $user = $storage->getBackendOption('user'); + if ($domain = $storage->getBackendOption('domain')) { + $storage->setBackendOption('user', $domain.'\\'.$user); + } + } + } -- GitLab From 4e0e2eb22200c4962230f1c8595efe8b88a7c21e Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Mon, 24 Aug 2015 12:12:08 +0200 Subject: [PATCH 007/783] Change log level of debugging logs to debug --- lib/private/share/share.php | 44 ++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/lib/private/share/share.php b/lib/private/share/share.php index 9aea4677b5b..c245f0f88a9 100644 --- a/lib/private/share/share.php +++ b/lib/private/share/share.php @@ -599,7 +599,7 @@ class Share extends Constants { if ($backend->isShareTypeAllowed($shareType) === false) { $message = 'Sharing %s failed, because the backend does not allow shares from type %i'; $message_t = $l->t('Sharing %s failed, because the backend does not allow shares from type %i', array($itemSourceName, $shareType)); - \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareType), \OCP\Util::ERROR); + \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareType), \OCP\Util::DEBUG); throw new \Exception($message_t); } @@ -617,14 +617,14 @@ class Share extends Constants { if (!$path) { $message = 'Sharing %s failed, because the file does not exist'; $message_t = $l->t('Sharing %s failed, because the file does not exist', array($itemSourceName)); - \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName), \OCP\Util::ERROR); + \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName), \OCP\Util::DEBUG); throw new \Exception($message_t); } // verify that the user has share permission if (!\OC\Files\Filesystem::isSharable($path)) { $message = 'You are not allowed to share %s'; $message_t = $l->t('You are not allowed to share %s', array($itemSourceName)); - \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName), \OCP\Util::ERROR); + \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName), \OCP\Util::DEBUG); throw new \Exception($message_t); } } @@ -637,7 +637,7 @@ class Share extends Constants { foreach ($mounts as $mount) { if ($mount->getStorage()->instanceOfStorage('\OCA\Files_Sharing\ISharedStorage')) { $message = 'Sharing "' . $itemSourceName . '" failed, because it contains files shared with you!'; - \OCP\Util::writeLog('OCP\Share', $message, \OCP\Util::ERROR); + \OCP\Util::writeLog('OCP\Share', $message, \OCP\Util::DEBUG); throw new \Exception($message); } @@ -654,13 +654,13 @@ class Share extends Constants { if ($shareWith == $uidOwner) { $message = 'Sharing %s failed, because the user %s is the item owner'; $message_t = $l->t('Sharing %s failed, because the user %s is the item owner', array($itemSourceName, $shareWith)); - \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith), \OCP\Util::ERROR); + \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith), \OCP\Util::DEBUG); throw new \Exception($message_t); } if (!\OC_User::userExists($shareWith)) { $message = 'Sharing %s failed, because the user %s does not exist'; $message_t = $l->t('Sharing %s failed, because the user %s does not exist', array($itemSourceName, $shareWith)); - \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith), \OCP\Util::ERROR); + \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith), \OCP\Util::DEBUG); throw new \Exception($message_t); } if ($shareWithinGroupOnly) { @@ -669,7 +669,7 @@ class Share extends Constants { $message = 'Sharing %s failed, because the user ' .'%s is not a member of any groups that %s is a member of'; $message_t = $l->t('Sharing %s failed, because the user %s is not a member of any groups that %s is a member of', array($itemSourceName, $shareWith, $uidOwner)); - \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith, $uidOwner), \OCP\Util::ERROR); + \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith, $uidOwner), \OCP\Util::DEBUG); throw new \Exception($message_t); } } @@ -682,7 +682,7 @@ class Share extends Constants { if ($checkExists['uid_owner'] != $uidOwner || $checkExists['share_type'] == $shareType) { $message = 'Sharing %s failed, because this item is already shared with %s'; $message_t = $l->t('Sharing %s failed, because this item is already shared with %s', array($itemSourceName, $shareWith)); - \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith), \OCP\Util::ERROR); + \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith), \OCP\Util::DEBUG); throw new \Exception($message_t); } } @@ -690,14 +690,14 @@ class Share extends Constants { if (!\OC_Group::groupExists($shareWith)) { $message = 'Sharing %s failed, because the group %s does not exist'; $message_t = $l->t('Sharing %s failed, because the group %s does not exist', array($itemSourceName, $shareWith)); - \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith), \OCP\Util::ERROR); + \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith), \OCP\Util::DEBUG); throw new \Exception($message_t); } if ($shareWithinGroupOnly && !\OC_Group::inGroup($uidOwner, $shareWith)) { $message = 'Sharing %s failed, because ' .'%s is not a member of the group %s'; $message_t = $l->t('Sharing %s failed, because %s is not a member of the group %s', array($itemSourceName, $uidOwner, $shareWith)); - \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $uidOwner, $shareWith), \OCP\Util::ERROR); + \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $uidOwner, $shareWith), \OCP\Util::DEBUG); throw new \Exception($message_t); } // Check if the item source is already shared with the group, either from the same owner or a different user @@ -710,7 +710,7 @@ class Share extends Constants { if ($checkExists['uid_owner'] != $uidOwner || $checkExists['share_type'] == $shareType) { $message = 'Sharing %s failed, because this item is already shared with %s'; $message_t = $l->t('Sharing %s failed, because this item is already shared with %s', array($itemSourceName, $shareWith)); - \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith), \OCP\Util::ERROR); + \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith), \OCP\Util::DEBUG); throw new \Exception($message_t); } } @@ -750,7 +750,7 @@ class Share extends Constants { if (\OCP\Util::isPublicLinkPasswordRequired() && empty($shareWith)) { $message = 'You need to provide a password to create a public link, only protected links are allowed'; $message_t = $l->t('You need to provide a password to create a public link, only protected links are allowed'); - \OCP\Util::writeLog('OCP\Share', $message, \OCP\Util::ERROR); + \OCP\Util::writeLog('OCP\Share', $message, \OCP\Util::DEBUG); throw new \Exception($message_t); } @@ -779,7 +779,7 @@ class Share extends Constants { } $message = 'Sharing %s failed, because sharing with links is not allowed'; $message_t = $l->t('Sharing %s failed, because sharing with links is not allowed', array($itemSourceName)); - \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName), \OCP\Util::ERROR); + \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName), \OCP\Util::DEBUG); throw new \Exception($message_t); } else if ($shareType === self::SHARE_TYPE_REMOTE) { @@ -790,7 +790,7 @@ class Share extends Constants { $shareWith, $uidOwner, self::FORMAT_NONE, null, 1, true, true)) { $message = 'Sharing %s failed, because this item is already shared with %s'; $message_t = $l->t('Sharing %s failed, because this item is already shared with %s', array($itemSourceName, $shareWith)); - \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith), \OCP\Util::ERROR); + \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith), \OCP\Util::DEBUG); throw new \Exception($message_t); } @@ -819,7 +819,7 @@ class Share extends Constants { // Future share types need to include their own conditions $message = 'Share type %s is not valid for %s'; $message_t = $l->t('Share type %s is not valid for %s', array($shareType, $itemSource)); - \OCP\Util::writeLog('OCP\Share', sprintf($message, $shareType, $itemSource), \OCP\Util::ERROR); + \OCP\Util::writeLog('OCP\Share', sprintf($message, $shareType, $itemSource), \OCP\Util::DEBUG); throw new \Exception($message_t); } @@ -1047,7 +1047,7 @@ class Share extends Constants { $message = 'Setting permissions for %s failed,' .' because the permissions exceed permissions granted to %s'; $message_t = $l->t('Setting permissions for %s failed, because the permissions exceed permissions granted to %s', array($itemSource, \OC_User::getUser())); - \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSource, \OC_User::getUser()), \OCP\Util::ERROR); + \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSource, \OC_User::getUser()), \OCP\Util::DEBUG); throw new \Exception($message_t); } } @@ -1110,7 +1110,7 @@ class Share extends Constants { $message = 'Setting permissions for %s failed, because the item was not found'; $message_t = $l->t('Setting permissions for %s failed, because the item was not found', array($itemSource)); - \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSource), \OCP\Util::ERROR); + \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSource), \OCP\Util::DEBUG); throw new \Exception($message_t); } @@ -2158,7 +2158,7 @@ class Share extends Constants { $message = 'Sharing %s failed, because the user %s is the original sharer'; $message_t = $l->t('Sharing %s failed, because the user %s is the original sharer', array($itemSourceName, $shareWith)); - \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith), \OCP\Util::ERROR); + \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith), \OCP\Util::DEBUG); throw new \Exception($message_t); } } @@ -2170,7 +2170,7 @@ class Share extends Constants { $message = 'Sharing %s failed, because the permissions exceed permissions granted to %s'; $message_t = $l->t('Sharing %s failed, because the permissions exceed permissions granted to %s', array($itemSourceName, $uidOwner)); - \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $uidOwner), \OCP\Util::ERROR); + \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $uidOwner), \OCP\Util::DEBUG); throw new \Exception($message_t); } else { // TODO Don't check if inside folder @@ -2196,7 +2196,7 @@ class Share extends Constants { $message = 'Sharing %s failed, because resharing is not allowed'; $message_t = $l->t('Sharing %s failed, because resharing is not allowed', array($itemSourceName)); - \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName), \OCP\Util::ERROR); + \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName), \OCP\Util::DEBUG); throw new \Exception($message_t); } } else { @@ -2209,7 +2209,7 @@ class Share extends Constants { $message = 'Sharing %s failed, because the sharing backend for ' .'%s could not find its source'; $message_t = $l->t('Sharing %s failed, because the sharing backend for %s could not find its source', array($itemSource, $itemType)); - \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSource, $itemType), \OCP\Util::ERROR); + \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSource, $itemType), \OCP\Util::DEBUG); throw new \Exception($message_t); } if ($backend instanceof \OCP\Share_Backend_File_Dependent) { @@ -2224,7 +2224,7 @@ class Share extends Constants { $message = 'Sharing %s failed, because the file could not be found in the file cache'; $message_t = $l->t('Sharing %s failed, because the file could not be found in the file cache', array($itemSource)); - \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSource), \OCP\Util::ERROR); + \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSource), \OCP\Util::DEBUG); throw new \Exception($message_t); } } else { -- GitLab From 5a6b10ae6fd5a50e2f3dde7f28d5e24faa51383d Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Tue, 25 Aug 2015 18:46:43 +0200 Subject: [PATCH 008/783] only show search icon on desktop, like on mobile --- core/css/header.css | 2 +- core/css/mobile.css | 23 ----------------------- core/css/styles.css | 19 +++++++++++++------ 3 files changed, 14 insertions(+), 30 deletions(-) diff --git a/core/css/header.css b/core/css/header.css index 466022e9f76..5630f96953f 100644 --- a/core/css/header.css +++ b/core/css/header.css @@ -294,7 +294,7 @@ } #expand { display: block; - padding: 7px 30px 6px 22px; + padding: 7px 30px 6px 10px; cursor: pointer; } #expand * { diff --git a/core/css/mobile.css b/core/css/mobile.css index 9008e39b89c..29507a0faa9 100644 --- a/core/css/mobile.css +++ b/core/css/mobile.css @@ -26,35 +26,12 @@ display: none; } -/* compress search box on mobile, expand when focused */ -.searchbox input[type="search"] { - width: 0; - cursor: pointer; - background-color: transparent; - -webkit-transition: all 100ms; - -moz-transition: all 100ms; - -o-transition: all 100ms; - transition: all 100ms; - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; - opacity: .7; -} -.searchbox input[type="search"]:focus, -.searchbox input[type="search"]:active { - width: 155px; - max-width: 50%; - cursor: text; - background-color: #112; - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; - opacity: 1; -} - /* do not show display name on mobile when profile picture is present */ #header .avatardiv.avatardiv-shown + #expandDisplayName { display: none; } #header #expand { display: block; - padding: 7px 30px 6px 7px; } /* do not show update notification on mobile */ diff --git a/core/css/styles.css b/core/css/styles.css index 5ad81fd12aa..3c4c21d4e2c 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -258,21 +258,28 @@ input:disabled+label, input:disabled:hover+label, input:disabled:focus+label { font-size: 1.2em; padding: 3px; padding-left: 25px; - background: #112 url('../img/actions/search-white.svg') no-repeat 6px center; + background: transparent url('../img/actions/search-white.svg') no-repeat 6px center; color: #fff; border: 0; border-radius: 3px; - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=30)"; - opacity: .3; margin-top: 9px; float: right; + width: 0; + cursor: pointer; + -webkit-transition: all 100ms; + -moz-transition: all 100ms; + -o-transition: all 100ms; + transition: all 100ms; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; + opacity: .7; } -.searchbox input[type="search"]:hover, .searchbox input[type="search"]:focus, .searchbox input[type="search"]:active { - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; - opacity: .7; color: #fff; + width: 155px; + max-width: 50%; + cursor: text; + background-color: #112; } input[type="submit"].enabled { -- GitLab From 2458a09ac4fa399f38f54765e4858ae3c8963d87 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Wed, 26 Aug 2015 09:46:47 +0200 Subject: [PATCH 009/783] use same font-size for share action text --- apps/files/css/files.css | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/files/css/files.css b/apps/files/css/files.css index 026713569a1..3945d6211ad 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -499,7 +499,6 @@ table td.filename .uploadtext { .fileactions { position: absolute; right: 0; - font-size: 11px; } .busy .fileactions, .busy .action { -- GitLab From 8d1fb6059f283d4777df6114d8a61ece965c283f Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Wed, 26 Aug 2015 09:47:09 +0200 Subject: [PATCH 010/783] proper padding and whitespace for share and more actions --- apps/files/css/files.css | 7 +++++++ apps/files/css/mobile.css | 8 ++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/apps/files/css/files.css b/apps/files/css/files.css index 3945d6211ad..ba82455c374 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -572,6 +572,13 @@ a.action > img { opacity: 0; display:none; } +#fileList a.action.action-share, +#fileList a.action.action-menu { + padding: 17px 14px; +} +#fileList .fileActionsMenu { + margin-right: 21px; +} .ie8 #fileList a.action img, #fileList tr:hover a.action, diff --git a/apps/files/css/mobile.css b/apps/files/css/mobile.css index 635c24c4168..b43bd3cfce1 100644 --- a/apps/files/css/mobile.css +++ b/apps/files/css/mobile.css @@ -47,15 +47,11 @@ table td.filename .nametext { display: inline !important; } #fileList a.action.action-menu img { - padding-left: 2px; + padding-left: 0; } #fileList .fileActionsMenu { - margin-right: 5px; -} -/* some padding for better clickability */ -#fileList a.action img { - padding: 0 6px 0 12px; + margin-right: 12px; } /* hide text of the share action on mobile */ #fileList a.action-share span { -- GitLab From 6cbb56ac5fb3a1ad0477465ec5708ebd7f6901b5 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Wed, 26 Aug 2015 09:57:50 +0200 Subject: [PATCH 011/783] remove border around bubble menu --- core/css/apps.css | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/core/css/apps.css b/core/css/apps.css index 620c3013829..ee0f7516b1f 100644 --- a/core/css/apps.css +++ b/core/css/apps.css @@ -302,7 +302,6 @@ z-index: 110; margin: -5px 14px 5px 10px; right: 0; - border: 1px solid #bbb; -webkit-filter: drop-shadow(0 0 5px rgba(150, 150, 150, 0.75)); -moz-filter: drop-shadow(0 0 5px rgba(150, 150, 150, 0.75)); -ms-filter: drop-shadow(0 0 5px rgba(150, 150, 150, 0.75)); @@ -320,9 +319,7 @@ /* miraculous border arrow stuff */ .bubble:after, -.bubble:before, -#app-navigation .app-navigation-entry-menu:after, -#app-navigation .app-navigation-entry-menu:before { +#app-navigation .app-navigation-entry-menu:after { bottom: 100%; right: 0; /* change this to adjust the arrow position */ border: solid transparent; @@ -341,14 +338,6 @@ margin-left: -10px; } -.bubble:before, -#app-navigation .app-navigation-entry-menu:before { - border-color: rgba(187, 187, 187, 0); - border-bottom-color: #bbb; - border-width: 11px; - margin-left: -11px; -} - /* list of options for an entry */ #app-navigation .app-navigation-entry-menu ul { display: block !important; -- GitLab From 898243a5ee9a4922a17934419717816a6dd427a0 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Wed, 26 Aug 2015 10:27:55 +0200 Subject: [PATCH 012/783] fix share icons of shared items being placed off on mobile --- core/js/share.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/js/share.js b/core/js/share.js index 7e0d0b7a2d3..cd4a614e9d1 100644 --- a/core/js/share.js +++ b/core/js/share.js @@ -127,7 +127,7 @@ OC.Share={ if (img.attr('src') !== OC.imagePath('core', 'actions/public')) { img.attr('src', image); $(actions[i]).addClass('permanent'); - $(actions[i]).html(' '+t('core', 'Shared')+'').prepend(img); + $(actions[i]).html(' '+t('core', 'Shared')+'').prepend(img); } } for(i = 0; i < files.length; i++) { @@ -276,7 +276,7 @@ OC.Share={ else if (recipients) { message = t('core', 'Shared with {recipients}', {recipients: this._formatShareList(recipients.split(", ")).join(", ")}, 0, {escape: false}); } - action.html(' ' + message + '').prepend(img); + action.html(' ' + message + '').prepend(img); if (owner || recipients) { action.find('.remoteAddress').tipsy({gravity: 's'}); } -- GitLab From 90ed32ebc509edc5bf4978c304db79e6140d2b09 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Wed, 26 Aug 2015 10:30:24 +0200 Subject: [PATCH 013/783] Properly show token errors in ajax/update.php event source --- core/ajax/update.php | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/core/ajax/update.php b/core/ajax/update.php index 14b4f913f76..c25ef1b9084 100644 --- a/core/ajax/update.php +++ b/core/ajax/update.php @@ -28,15 +28,19 @@ set_time_limit(0); require_once '../../lib/base.php'; -\OCP\JSON::callCheck(); +$l = \OC::$server->getL10N('core'); + +$eventSource = \OC::$server->createEventSource(); +// need to send an initial message to force-init the event source, +// which will then trigger its own CSRF check and produces its own CSRF error +// message +$eventSource->send('success', (string)$l->t('Preparing update')); if (OC::checkUpgrade(false)) { // if a user is currently logged in, their session must be ignored to // avoid side effects \OC_User::setIncognitoMode(true); - $l = new \OC_L10N('core'); - $eventSource = \OC::$server->createEventSource(); $logger = \OC::$server->getLogger(); $updater = new \OC\Updater( \OC::$server->getHTTPHelper(), @@ -96,6 +100,10 @@ if (OC::checkUpgrade(false)) { (string)$l->t('Following apps have been disabled: %s', implode(', ', $disabledThirdPartyApps))); } - $eventSource->send('done', ''); - $eventSource->close(); +} else { + $eventSource->send('notice', (string)$l->t('Already up to date')); } + +$eventSource->send('done', ''); +$eventSource->close(); + -- GitLab From ce6045f84b833c35de5b507c4d15b2a753e476b9 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Wed, 26 Aug 2015 10:56:27 +0200 Subject: [PATCH 014/783] Properly show update exception --- core/ajax/update.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/ajax/update.php b/core/ajax/update.php index c25ef1b9084..a693deeb9cf 100644 --- a/core/ajax/update.php +++ b/core/ajax/update.php @@ -89,7 +89,13 @@ if (OC::checkUpgrade(false)) { OC_Config::setValue('maintenance', false); }); - $updater->upgrade(); + try { + $updater->upgrade(); + } catch (\Exception $e) { + $eventSource->send('failure', get_class($e) . ': ' . $e->getMessage()); + $eventSource->close(); + exit(); + } if (!empty($incompatibleApps)) { $eventSource->send('notice', -- GitLab From 23aa44b6b5b456988005559c4617f9a8da4521d3 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Wed, 26 Aug 2015 11:04:39 +0200 Subject: [PATCH 015/783] Make maintenance/update text white Removing the color makes it default to white as defined in the parent style. --- core/css/styles.css | 1 - 1 file changed, 1 deletion(-) diff --git a/core/css/styles.css b/core/css/styles.css index 5ad81fd12aa..b196b4f1b3f 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -680,7 +680,6 @@ label.infield { #body-login .update { width: inherit; text-align: center; - color: #ccc; } #body-login .update .appList { -- GitLab From c11ea056d06be7859071eb3176462a9d4d56964e Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Wed, 26 Aug 2015 11:07:29 +0200 Subject: [PATCH 016/783] properly shade file actions and menu items, don't differentiate between mobile and desktop --- apps/files/css/files.css | 41 +++++++++++++++++++++++++++++++++------ apps/files/css/mobile.css | 16 +-------------- core/css/apps.css | 30 ++++++++++++++++++---------- 3 files changed, 56 insertions(+), 31 deletions(-) diff --git a/apps/files/css/files.css b/apps/files/css/files.css index ba82455c374..f8c1d03b666 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -594,9 +594,9 @@ a.action > img { #fileList tr:focus a.action.disabled:focus, #fileList .name:focus a.action.disabled:focus, #fileList a.action.disabled img { - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; - filter: alpha(opacity=50); - opacity: .5; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=30)"; + filter: alpha(opacity=30); + opacity: .3; display:inline; } .ie8 #fileList a.action:hover img, @@ -606,15 +606,44 @@ a.action > img { #fileList tr:hover a.action:hover, #fileList tr:focus a.action:focus, #fileList .name:focus a.action:focus { - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; - filter: alpha(opacity=100); - opacity: 1; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; + filter: alpha(opacity=70); + opacity: 7; display:inline; } #fileList tr a.action.disabled { background: none; } +/* show share action of shared items darker to distinguish from non-shared */ +#fileList a.action.permanent.shared-style { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)" !important; + filter: alpha(opacity=70) !important; + opacity: .7 !important; +} +/* always show actions on mobile, not only on hover */ +#fileList a.action, +#fileList a.action.action-menu.permanent { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=30)" !important; + filter: alpha(opacity=30) !important; + opacity: .3 !important; + display: inline !important; +} + +/* properly display actions in the popover menu */ +#fileList .fileActionsMenu .action { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)" !important; + filter: alpha(opacity=50) !important; + opacity: .5 !important; +} +#fileList .fileActionsMenu .action:hover, +#fileList .fileActionsMenu .action:focus { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)" !important; + filter: alpha(opacity=100) !important; + opacity: 1 !important; +} + + #selectedActionsList a.download.disabled, #fileList tr a.action.action-download.disabled { color: #000000; diff --git a/apps/files/css/mobile.css b/apps/files/css/mobile.css index b43bd3cfce1..c5507a1e268 100644 --- a/apps/files/css/mobile.css +++ b/apps/files/css/mobile.css @@ -32,26 +32,12 @@ table td.filename .nametext { width: 100%; } -/* show share action of shared items darker to distinguish from non-shared */ -#fileList a.action.permanent.shared-style { - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)" !important; - filter: alpha(opacity=70) !important; - opacity: .7 !important; -} -/* always show actions on mobile, not only on hover */ -#fileList a.action, -#fileList a.action.action-menu.permanent { - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=20)" !important; - filter: alpha(opacity=20) !important; - opacity: .2 !important; - display: inline !important; -} #fileList a.action.action-menu img { padding-left: 0; } #fileList .fileActionsMenu { - margin-right: 12px; + margin-right: 6px; } /* hide text of the share action on mobile */ #fileList a.action-share span { diff --git a/core/css/apps.css b/core/css/apps.css index ee0f7516b1f..17595479ae2 100644 --- a/core/css/apps.css +++ b/core/css/apps.css @@ -292,6 +292,7 @@ list-style-type: none; } +/* menu bubble / popover */ .bubble, #app-navigation .app-navigation-entry-menu { position: absolute; @@ -308,15 +309,6 @@ -o-filter: drop-shadow(0 0 5px rgba(150, 150, 150, 0.75)); filter: drop-shadow(0 0 5px rgba(150, 150, 150, 0.75)); } - -#app-navigation .app-navigation-entry-menu { - display: none; -} - -#app-navigation .app-navigation-entry-menu.open { - display: block; -} - /* miraculous border arrow stuff */ .bubble:after, #app-navigation .app-navigation-entry-menu:after { @@ -329,7 +321,6 @@ position: absolute; pointer-events: none; } - .bubble:after, #app-navigation .app-navigation-entry-menu:after { border-color: rgba(238, 238, 238, 0); @@ -337,6 +328,25 @@ border-width: 10px; margin-left: -10px; } +.bubble .action { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)" !important; + filter: alpha(opacity=50) !important; + opacity: .5 !important; +} +.bubble .action:hover, +.bubble .action:focus { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)" !important; + filter: alpha(opacity=100) !important; + opacity: 1 !important; +} + +#app-navigation .app-navigation-entry-menu { + display: none; +} + +#app-navigation .app-navigation-entry-menu.open { + display: block; +} /* list of options for an entry */ #app-navigation .app-navigation-entry-menu ul { -- GitLab From 202af1e3229278abde5dd4597917ff3c390d5f6f Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Wed, 26 Aug 2015 11:39:22 +0200 Subject: [PATCH 017/783] fix unit tests --- apps/files_sharing/tests/js/shareSpec.js | 16 ++++++++-------- core/js/tests/specs/shareSpec.js | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/apps/files_sharing/tests/js/shareSpec.js b/apps/files_sharing/tests/js/shareSpec.js index 581e15caf93..b6368b901ee 100644 --- a/apps/files_sharing/tests/js/shareSpec.js +++ b/apps/files_sharing/tests/js/shareSpec.js @@ -117,7 +117,7 @@ describe('OCA.Sharing.Util tests', function() { $tr = fileList.$el.find('tbody tr:first'); $action = $tr.find('.action-share'); expect($action.hasClass('permanent')).toEqual(true); - expect($action.find('>span').text()).toEqual('Shared'); + expect($action.find('>span').text().trim()).toEqual('Shared'); expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg'); expect(OC.basename(getImageUrl($tr.find('.filename .thumbnail')))).toEqual('folder-shared.svg'); expect($action.find('img').length).toEqual(1); @@ -138,7 +138,7 @@ describe('OCA.Sharing.Util tests', function() { $tr = fileList.$el.find('tbody tr:first'); $action = $tr.find('.action-share'); expect($action.hasClass('permanent')).toEqual(true); - expect($action.find('>span').text()).toEqual('Shared'); + expect($action.find('>span').text().trim()).toEqual('Shared'); expect(OC.basename($action.find('img').attr('src'))).toEqual('public.svg'); expect(OC.basename(getImageUrl($tr.find('.filename .thumbnail')))).toEqual('folder-public.svg'); expect($action.find('img').length).toEqual(1); @@ -159,7 +159,7 @@ describe('OCA.Sharing.Util tests', function() { $tr = fileList.$el.find('tbody tr:first'); $action = $tr.find('.action-share'); expect($action.hasClass('permanent')).toEqual(true); - expect($action.find('>span').text()).toEqual('User One'); + 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 .thumbnail')))).toEqual('folder-shared.svg'); }); @@ -179,7 +179,7 @@ describe('OCA.Sharing.Util tests', function() { $tr = fileList.$el.find('tbody tr:first'); $action = $tr.find('.action-share'); expect($action.hasClass('permanent')).toEqual(true); - expect($action.find('>span').text()).toEqual('Shared with User One, User Two'); + expect($action.find('>span').text().trim()).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 .thumbnail')))).toEqual('folder-shared.svg'); expect($action.find('img').length).toEqual(1); @@ -275,7 +275,7 @@ describe('OCA.Sharing.Util tests', function() { OC.Share.updateIcon('file', 1); expect($action.hasClass('permanent')).toEqual(true); - expect($action.find('>span').text()).toEqual('Shared with Group One, Group Two, User One, User Two'); + expect($action.find('>span').text().trim()).toEqual('Shared with Group One, Group Two, User One, User Two'); expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg'); }); it('updates share icon after updating shares of a file', function() { @@ -311,7 +311,7 @@ describe('OCA.Sharing.Util tests', function() { OC.Share.updateIcon('file', 1); expect($action.hasClass('permanent')).toEqual(true); - expect($action.find('>span').text()).toEqual('Shared with User One, User Three, User Two'); + expect($action.find('>span').text().trim()).toEqual('Shared with User One, User Three, User Two'); expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg'); }); it('removes share icon after removing all shares from a file', function() { @@ -380,7 +380,7 @@ describe('OCA.Sharing.Util tests', function() { OC.Share.updateIcon('file', 1); expect($action.hasClass('permanent')).toEqual(true); - expect($action.find('>span').text()).toEqual('User One'); + expect($action.find('>span').text().trim()).toEqual('User One'); expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg'); }); it('keep share text after unsharing reshare', function() { @@ -416,7 +416,7 @@ describe('OCA.Sharing.Util tests', function() { OC.Share.updateIcon('file', 1); expect($action.hasClass('permanent')).toEqual(true); - expect($action.find('>span').text()).toEqual('User One'); + expect($action.find('>span').text().trim()).toEqual('User One'); expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg'); }); }); diff --git a/core/js/tests/specs/shareSpec.js b/core/js/tests/specs/shareSpec.js index 3dc25134f59..5a59a117d77 100644 --- a/core/js/tests/specs/shareSpec.js +++ b/core/js/tests/specs/shareSpec.js @@ -1132,7 +1132,7 @@ describe('OC.Share tests', function() { OC.Share.markFileAsShared($file); $action = $file.find('.action-share>span'); - expect($action.text()).toEqual(output); + expect($action.text().trim()).toEqual(output); if (_.isString(title)) { expect($action.find('.remoteAddress').attr('title')).toEqual(title); } else { @@ -1236,7 +1236,7 @@ describe('OC.Share tests', function() { OC.Share.markFileAsShared($file, true); $action = $file.find('.action-share>span'); - expect($action.text()).toEqual(output); + expect($action.text().trim()).toEqual(output); if (_.isString(title)) { expect($action.find('.remoteAddress').attr('title')).toEqual(title); } else if (_.isArray(title)) { -- GitLab From 98301210a9172e6b0a44bcaf43b4ecf4b31f938e Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Sat, 8 Aug 2015 22:15:12 +0200 Subject: [PATCH 018/783] Start of OCS Share API sharees endpoint --- apps/files_sharing/api/sharees.php | 234 ++++++++++++++++++++++++++ apps/files_sharing/appinfo/routes.php | 11 ++ 2 files changed, 245 insertions(+) create mode 100644 apps/files_sharing/api/sharees.php diff --git a/apps/files_sharing/api/sharees.php b/apps/files_sharing/api/sharees.php new file mode 100644 index 00000000000..83acdd086c3 --- /dev/null +++ b/apps/files_sharing/api/sharees.php @@ -0,0 +1,234 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program 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, version 3, + * along with this program. If not, see + * + */ +namespace OCA\Files_Sharing\API; + +use OCP\IGroupManager; +use OCP\IUserManager; +use OCP\IAppConfig; +use OCP\IUserSession; +use OCP\IURLGenerator; + +class Sharees { + + /** @var IGroupManager */ + private $groupManager; + + /** @var IUserManager */ + private $userManager; + + /** @var \OCP\Contacts\IManager */ + private $contactsManager; + + /** @var IAppConfig */ + private $appConfig; + + /** @var IUserSession */ + private $userSession; + + /** @var IURLGenerator */ + private $urlGenerator; + + /** + * @param IGroupManager $groupManager + * @param IUserManager $userManager + * @param \OCP\Contacts\IManager $contactsManager + * @param IAppConfig $appConfig + * @param IUserSession $userSession + */ + public function __construct(IGroupManager $groupManager, + IUserManager $userManager, + \OCP\Contacts\IManager $contactsManager, + IAppConfig $appConfig, + IUserSession $userSession, + IURLGenerator $urlGenerator) { + $this->groupManager = $groupManager; + $this->userManager = $userManager; + $this->contactsManager = $contactsManager; + $this->appConfig = $appConfig; + $this->userSession = $userSession; + $this->urlGenerator = $urlGenerator; + } + + /** + * @param string $search + * @param bool $shareWithGroupOnly + * + * @return array possible sharees + */ + private function getUsers($search, $shareWithGroupOnly) { + $sharees = []; + + $users = []; + if ($shareWithGroupOnly) { + // Search in all the groups this user is part of + $userGroups = $this->groupManager->getUserGroupsIds($this->userSession->getUser()); + foreach ($userGroups as $userGroup) { + $users = array_merge($users, $this->groupManager->displayNamesInGroup($userGroup, $search)); + } + $users = array_unique($users); + } else { + // Search in all users + $users_tmp = $this->userManager->searchDisplayName($search); + + // Put in array that maps uid => displayName + foreach($users_tmp as $user) { + $users[$user->getUID()] = $user->getDisplayName(); + } + } + + + foreach ($users as $uid => $displayName) { + $sharees[] = [ + 'label' => $displayName, + 'value' => [ + 'shareType' => \OCP\Share::SHARE_TYPE_USER, + 'shareWith' => $uid + ] + ]; + } + + return $sharees; + } + + /** + * @param string $search + * @param bool $shareWithGroupOnly + * + * @return array possible sharees + */ + private function getGroups($search, $shareWithGroupOnly) { + $sharees = []; + $groups = $this->groupManager->search($search); + + if ($shareWithGroupOnly) { + // Intersect all the groups that match with the groups this user is a member of + $userGroups = $this->groupManager->getUserGroups($this->userSession->getUser()); + $groups = array_intersect($groups, $userGroups); + } + + foreach ($groups as $group) { + $sharees[] = [ + 'label' => $group->getGID(), + 'value' => [ + 'shareType' => \OCP\Share::SHARE_TYPE_GROUP, + 'shareWith' => $group->getGID() + ] + ]; + } + + return $sharees; + } + + /** + * @param string $search + * + * @return array possible sharees + */ + private function getRemote($search) { + $sharees = []; + + if (substr_count($search, '@') >= 1) { + $sharees[] = [ + 'label' => $search, + 'value' => [ + 'shareType' => \OCP\Share::SHARE_TYPE_REMOTE, + 'shareWith' => $search + ] + ]; + } + + // Search in contacts + $addressBookContacts = $this->contactsManager->search($search, ['CLOUD', 'FN']); + foreach ($addressBookContacts as $contact) { + if (isset($contact['CLOUD'])) { + foreach ($contact['CLOUD'] as $cloudId) { + $sharees[] = [ + 'label' => $contact['FN'] . ' (' . $cloudId . ')', + 'value' => [ + 'shareType' => \OCP\Share::SHARE_TYPE_REMOTE, + 'shareWith' => $cloudId + ] + ]; + } + } + } + + return $sharees; + } + + public function search($params) { + $search = isset($_GET['search']) ? (string)$_GET['search'] : ''; + $item_type = isset($_GET['item_type']) ? (string)$_GET['item_type'] : null; + $share_type = isset($_GET['share_type']) ? intval($_GET['share_type']) : null; + $page = isset($_GET['page']) ? intval($_GET['page']) : 1; + $per_page = isset($_GET['per_page']) ? intval($_GET['per_page']) : 200; + + // Verify arguments + if ($item_type === null) { + return new \OC_OCS_Result(null, 400, 'missing item_type'); + } + + $shareWithGroupOnly = $this->appConfig->getValue('core', 'shareapi_only_share_with_group_members', 'no') === 'yes' ? true : false; + + $sharees = []; + // Get users + if ($share_type === null || $share_type === \OCP\Share::SHARE_TYPE_USER) { + $sharees = array_merge($sharees, $this->getUsers($search, $shareWithGroupOnly)); + } + + // Get groups + if ($share_type === null || $share_type === \OCP\Share::SHARE_TYPE_GROUP) { + $sharees = array_merge($sharees, $this->getGroups($search, $shareWithGroupOnly)); + } + + // Get remote + if (($share_type === null || $share_type === \OCP\Share::SHARE_TYPE_REMOTE) && + \OCP\Share::getBackend($item_type)->isShareTypeAllowed(\OCP\Share::SHARE_TYPE_REMOTE)) { + $sharees = array_merge($sharees, $this->getRemote($search)); + } + + //Pagination + $start = ($page - 1) * $per_page; + $end = $page * $per_page; + $tot = count($sharees); + + $sharees = array_slice($sharees, $start, $per_page); + $response = new \OC_OCS_Result($sharees); + + // FIXME: Do this? + $response->setTotalItems($tot); + $response->setItemsPerPage($per_page); + + // TODO add other link rels + + if ($tot > $end) { + $url = $this->urlGenerator->getAbsoluteURL('/ocs/v1.php/apps/files_sharing/api/v1/sharees?') . + 'search=' . $search . + '&item_type=' . $item_type . + '&share_type=' . $share_type . + '&page=' . ($page + 1) . + '&per_page=' . $per_page; + $response->addHeader('Link', '<' . $url . '> rel="next"'); + } + + return $response; + } +} diff --git a/apps/files_sharing/appinfo/routes.php b/apps/files_sharing/appinfo/routes.php index 184ad29bba4..498b0eb55e9 100644 --- a/apps/files_sharing/appinfo/routes.php +++ b/apps/files_sharing/appinfo/routes.php @@ -102,3 +102,14 @@ API::register('delete', array('\OCA\Files_Sharing\API\Remote', 'declineShare'), 'files_sharing'); +$sharees = new \OCA\Files_Sharing\API\Sharees(\OC::$server->getGroupManager(), + \OC::$server->getUserManager(), + \OC::$server->getContactsManager(), + \OC::$server->getAppConfig(), + \OC::$server->getUserSession(), + \OC::$server->getURLGenerator()); + +API::register('get', + '/apps/files_sharing/api/v1/sharees', + [$sharees, 'search'], + 'files_sharing', API::USER_AUTH); -- GitLab From 8a5c1e6d4d63b2efc2c3e8acca98043973295863 Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Sun, 9 Aug 2015 20:47:49 +0200 Subject: [PATCH 019/783] Sort sharees To ensure that pagination is working properly we need to make sure the shares are always in the same order. Sorting is first done by label (catches most instances) If there is a user and a group with the same label we sort by shareType If there are multiple users with the same label we sort those by shareWith --- apps/files_sharing/api/sharees.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/apps/files_sharing/api/sharees.php b/apps/files_sharing/api/sharees.php index 83acdd086c3..8146c98b01a 100644 --- a/apps/files_sharing/api/sharees.php +++ b/apps/files_sharing/api/sharees.php @@ -205,6 +205,24 @@ class Sharees { $sharees = array_merge($sharees, $this->getRemote($search)); } + + // Sort sharees + usort($sharees, function($a, $b) { + $res = strcmp($a['label'], $b['label']); + + // If labels are equal sort by share type + if ($res === 0) { + $res = $a['value']['shareType'] - $b['value']['shareType']; + } + + // If sharetype is equal compare shareWith + if ($res === 0) { + $res = strcmp($a['value']['shareWith'], $b['value']['shareWith']); + } + + return $res; + }); + //Pagination $start = ($page - 1) * $per_page; $end = $page * $per_page; -- GitLab From b2fbecc39fa5d0538a946244e5b85a7145cb4505 Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Sun, 9 Aug 2015 21:19:35 +0200 Subject: [PATCH 020/783] Empty skeleton for tests --- apps/files_sharing/tests/sharees.php | 50 ++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 apps/files_sharing/tests/sharees.php diff --git a/apps/files_sharing/tests/sharees.php b/apps/files_sharing/tests/sharees.php new file mode 100644 index 00000000000..a9e3350ceb3 --- /dev/null +++ b/apps/files_sharing/tests/sharees.php @@ -0,0 +1,50 @@ + Date: Tue, 11 Aug 2015 14:57:51 +0200 Subject: [PATCH 021/783] Move test file to subdir --- apps/files_sharing/api/sharees.php | 2 +- apps/files_sharing/tests/{ => api}/sharees.php | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename apps/files_sharing/tests/{ => api}/sharees.php (100%) diff --git a/apps/files_sharing/api/sharees.php b/apps/files_sharing/api/sharees.php index 8146c98b01a..5dd0da55de3 100644 --- a/apps/files_sharing/api/sharees.php +++ b/apps/files_sharing/api/sharees.php @@ -54,7 +54,7 @@ class Sharees { * @param IUserSession $userSession */ public function __construct(IGroupManager $groupManager, - IUserManager $userManager, + IUserManager $userManager, \OCP\Contacts\IManager $contactsManager, IAppConfig $appConfig, IUserSession $userSession, diff --git a/apps/files_sharing/tests/sharees.php b/apps/files_sharing/tests/api/sharees.php similarity index 100% rename from apps/files_sharing/tests/sharees.php rename to apps/files_sharing/tests/api/sharees.php -- GitLab From be257bc9cc2330d0e67957525cb66646b346a850 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 11 Aug 2015 15:43:44 +0200 Subject: [PATCH 022/783] Add tests for "getUsers()" --- apps/files_sharing/api/sharees.php | 2 +- apps/files_sharing/tests/api/sharees.php | 229 ++++++++++++++++++++--- 2 files changed, 206 insertions(+), 25 deletions(-) diff --git a/apps/files_sharing/api/sharees.php b/apps/files_sharing/api/sharees.php index 5dd0da55de3..6853bd8a269 100644 --- a/apps/files_sharing/api/sharees.php +++ b/apps/files_sharing/api/sharees.php @@ -79,7 +79,7 @@ class Sharees { $users = []; if ($shareWithGroupOnly) { // Search in all the groups this user is part of - $userGroups = $this->groupManager->getUserGroupsIds($this->userSession->getUser()); + $userGroups = $this->groupManager->getUserGroupIds($this->userSession->getUser()); foreach ($userGroups as $userGroup) { $users = array_merge($users, $this->groupManager->displayNamesInGroup($userGroup, $search)); } diff --git a/apps/files_sharing/tests/api/sharees.php b/apps/files_sharing/tests/api/sharees.php index a9e3350ceb3..30397ba8678 100644 --- a/apps/files_sharing/tests/api/sharees.php +++ b/apps/files_sharing/tests/api/sharees.php @@ -1,50 +1,231 @@ + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program 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, version 3, + * along with this program. If not, see + * + */ + +namespace OCA\Files_Sharing\Tests\API; use OCA\Files_Sharing\API\Sharees; use OCA\Files_sharing\Tests\TestCase; class ShareesTest extends TestCase { + /** @var Sharees */ + protected $sharees; - /** - * Properly mock all injected elements - */ - protected function setup() { + /** @var \OCP\IUserManager|\PHPUnit_Framework_MockObject_MockObject */ + protected $userManager; - } + /** @var \OCP\IGroupManager|\PHPUnit_Framework_MockObject_MockObject */ + protected $groupManager; - public function testArguments() { + /** @var \OCP\IUserSession|\PHPUnit_Framework_MockObject_MockObject */ + protected $session; - } + protected function setUp() { + parent::setUp(); - public function testsOnlyUsers() { + $this->userManager = $this->getMockBuilder('OCP\IUserManager') + ->disableOriginalConstructor() + ->getMock(); - } + $this->groupManager = $this->getMockBuilder('OCP\IGroupManager') + ->disableOriginalConstructor() + ->getMock(); - public function testOnlyGroups() { + $this->session = $this->getMockBuilder('OCP\IUserSession') + ->disableOriginalConstructor() + ->getMock(); + $this->sharees = new Sharees( + $this->groupManager, + $this->userManager, + $this->getMockBuilder('OCP\Contacts\IManager')->disableOriginalConstructor()->getMock(), + $this->getMockBuilder('OCP\IAppConfig')->disableOriginalConstructor()->getMock(), + $this->session, + $this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock() + ); } - public function testRemoteAddress() { + protected function getUserMock($uid, $displayName) { + $user = $this->getMockBuilder('OCP\IUser') + ->disableOriginalConstructor() + ->getMock(); - } + $user->expects($this->any()) + ->method('getUID') + ->willReturn($uid); - public function testRemoteFromContacts() { + $user->expects($this->any()) + ->method('getDisplayName') + ->willReturn($displayName); + return $user; } - public function testAll() { - + public function dataGetUsers() { + return [ + ['test', false, [], [], []], + ['test', true, [], [], []], + [ + 'test', + false, + [], + [ + $this->getUserMock('test1', 'Test One'), + ], + [ + ['label' => 'Test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ] + ], + [ + 'test', + false, + [], + [ + $this->getUserMock('test1', 'Test One'), + $this->getUserMock('test2', 'Test Two'), + ], + [ + ['label' => 'Test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ['label' => 'Test Two', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], + ] + ], + [ + 'test', + true, + ['abc', 'xyz'], + [ + ['abc', 'test', -1, 0, ['test1' => 'Test One']], + ['xyz', 'test', -1, 0, []], + ], + [ + ['label' => 'Test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ] + ], + [ + 'test', + true, + ['abc', 'xyz'], + [ + ['abc', 'test', -1, 0, [ + 'test1' => 'Test One', + 'test2' => 'Test Two', + ]], + ['xyz', 'test', -1, 0, [ + 'test1' => 'Test One', + 'test2' => 'Test Two', + ]], + ], + [ + ['label' => 'Test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ['label' => 'Test Two', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], + ] + ], + [ + 'test', + true, + ['abc', 'xyz'], + [ + ['abc', 'test', -1, 0, [ + 'test1' => 'Test One', + ]], + ['xyz', 'test', -1, 0, [ + 'test2' => 'Test Two', + ]], + ], + [ + ['label' => 'Test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ['label' => 'Test Two', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], + ] + ], + ]; } - public function testSorting() { - - } - - public function testPagination() { - + /** + * @dataProvider dataGetUsers + * + * @param string $searchTerm + * @param bool $shareWithGroupOnly + * @param array $groupResponse + * @param array $userResponse + * @param array $expected + */ + public function testGetUsers($searchTerm, $shareWithGroupOnly, $groupResponse, $userResponse, $expected) { + if (!$shareWithGroupOnly) { + $this->userManager->expects($this->once()) + ->method('searchDisplayName') + ->with($searchTerm) + ->willReturn($userResponse); + } else { + $this->session->expects($this->any()) + ->method('getUser') + ->willReturn($this->getUserMock('admin', 'Administrator')); + + $this->groupManager->expects($this->once()) + ->method('getUserGroupIds') + ->with($this->anything()) + ->willReturn($groupResponse); + + $this->groupManager->expects($this->exactly(sizeof($groupResponse))) + ->method('displayNamesInGroup') + ->with($this->anything(), $searchTerm) + ->willReturnMap($userResponse); + } + + $users = $this->invokePrivate($this->sharees, 'getUsers', [$searchTerm, $shareWithGroupOnly]); + + $this->assertEquals($expected, $users); } - public function testShareWithinGroup() { - - } +// public function testArguments() { +// +// } +// +// public function testsOnlyUsers() { +// +// } +// +// public function testOnlyGroups() { +// +// } +// +// public function testRemoteAddress() { +// +// } +// +// public function testRemoteFromContacts() { +// +// } +// +// public function testAll() { +// +// } +// +// public function testSorting() { +// +// } +// +// public function testPagination() { +// +// } +// +// public function testShareWithinGroup() { +// +// } } -- GitLab From ad450d4f0ed4ebbb5e9e6256750061b0adb950e1 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 11 Aug 2015 16:22:05 +0200 Subject: [PATCH 023/783] Add tests for "getGroups()" --- apps/files_sharing/api/sharees.php | 21 ++++--- apps/files_sharing/tests/api/sharees.php | 72 +++++++++++++++++++++++- 2 files changed, 82 insertions(+), 11 deletions(-) diff --git a/apps/files_sharing/api/sharees.php b/apps/files_sharing/api/sharees.php index 6853bd8a269..7a3555e0a5b 100644 --- a/apps/files_sharing/api/sharees.php +++ b/apps/files_sharing/api/sharees.php @@ -20,6 +20,7 @@ */ namespace OCA\Files_Sharing\API; +use OCP\IGroup; use OCP\IGroupManager; use OCP\IUserManager; use OCP\IAppConfig; @@ -100,8 +101,8 @@ class Sharees { 'label' => $displayName, 'value' => [ 'shareType' => \OCP\Share::SHARE_TYPE_USER, - 'shareWith' => $uid - ] + 'shareWith' => $uid, + ], ]; } @@ -117,20 +118,22 @@ class Sharees { private function getGroups($search, $shareWithGroupOnly) { $sharees = []; $groups = $this->groupManager->search($search); + $groups = array_map(function (IGroup $group) { return $group->getGID(); }, $groups); - if ($shareWithGroupOnly) { + if (!empty($groups) && $shareWithGroupOnly) { // Intersect all the groups that match with the groups this user is a member of $userGroups = $this->groupManager->getUserGroups($this->userSession->getUser()); + $userGroups = array_map(function (IGroup $group) { return $group->getGID(); }, $userGroups); $groups = array_intersect($groups, $userGroups); } - foreach ($groups as $group) { + foreach ($groups as $gid) { $sharees[] = [ - 'label' => $group->getGID(), + 'label' => $gid, 'value' => [ 'shareType' => \OCP\Share::SHARE_TYPE_GROUP, - 'shareWith' => $group->getGID() - ] + 'shareWith' => $gid, + ], ]; } @@ -150,8 +153,8 @@ class Sharees { 'label' => $search, 'value' => [ 'shareType' => \OCP\Share::SHARE_TYPE_REMOTE, - 'shareWith' => $search - ] + 'shareWith' => $search, + ], ]; } diff --git a/apps/files_sharing/tests/api/sharees.php b/apps/files_sharing/tests/api/sharees.php index 30397ba8678..25074e4e8c4 100644 --- a/apps/files_sharing/tests/api/sharees.php +++ b/apps/files_sharing/tests/api/sharees.php @@ -78,6 +78,18 @@ class ShareesTest extends TestCase { return $user; } + protected function getGroupMock($gid) { + $group = $this->getMockBuilder('OCP\IGroup') + ->disableOriginalConstructor() + ->getMock(); + + $group->expects($this->any()) + ->method('getGID') + ->willReturn($gid); + + return $group; + } + public function dataGetUsers() { return [ ['test', false, [], [], []], @@ -173,13 +185,14 @@ class ShareesTest extends TestCase { ->with($searchTerm) ->willReturn($userResponse); } else { + $user = $this->getUserMock('admin', 'Administrator'); $this->session->expects($this->any()) ->method('getUser') - ->willReturn($this->getUserMock('admin', 'Administrator')); + ->willReturn($user); $this->groupManager->expects($this->once()) ->method('getUserGroupIds') - ->with($this->anything()) + ->with($user) ->willReturn($groupResponse); $this->groupManager->expects($this->exactly(sizeof($groupResponse))) @@ -193,6 +206,61 @@ class ShareesTest extends TestCase { $this->assertEquals($expected, $users); } + public function dataGetGroups() { + return [ + ['test', false, [], [], []], + [ + 'test', false, + [$this->getGroupMock('test1')], + [], + [['label' => 'test1', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_GROUP, 'shareWith' => 'test1']]], + ], + ['test', true, [], [], []], + [ + 'test', true, + [ + $this->getGroupMock('test1'), + $this->getGroupMock('test2'), + ], + [$this->getGroupMock('test1')], + [['label' => 'test1', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_GROUP, 'shareWith' => 'test1']]], + ], + ]; + } + + /** + * @dataProvider dataGetGroups + * + * @param string $searchTerm + * @param bool $shareWithGroupOnly + * @param array $groupResponse + * @param array $userGroupsResponse + * @param array $expected + */ + public function testGetGroups($searchTerm, $shareWithGroupOnly, $groupResponse, $userGroupsResponse, $expected) { + $this->groupManager->expects($this->once()) + ->method('search') + ->with($searchTerm) + ->willReturn($groupResponse); + + if ($shareWithGroupOnly) { + $user = $this->getUserMock('admin', 'Administrator'); + $this->session->expects($this->any()) + ->method('getUser') + ->willReturn($user); + + $numGetUserGroupsCalls = empty($groupResponse) ? 0 : 1; + $this->groupManager->expects($this->exactly($numGetUserGroupsCalls)) + ->method('getUserGroups') + ->with($user) + ->willReturn($userGroupsResponse); + } + + $users = $this->invokePrivate($this->sharees, 'getGroups', [$searchTerm, $shareWithGroupOnly]); + + $this->assertEquals($expected, $users); + } + // public function testArguments() { // // } -- GitLab From 16e5c15c283c40fd9c7a3f009f054b825bcadbb7 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 11 Aug 2015 16:31:54 +0200 Subject: [PATCH 024/783] Add tests for "getRemote()" --- apps/files_sharing/tests/api/sharees.php | 85 +++++++++++++++++++++++- 1 file changed, 84 insertions(+), 1 deletion(-) diff --git a/apps/files_sharing/tests/api/sharees.php b/apps/files_sharing/tests/api/sharees.php index 25074e4e8c4..04b8ef50253 100644 --- a/apps/files_sharing/tests/api/sharees.php +++ b/apps/files_sharing/tests/api/sharees.php @@ -34,6 +34,9 @@ class ShareesTest extends TestCase { /** @var \OCP\IGroupManager|\PHPUnit_Framework_MockObject_MockObject */ protected $groupManager; + /** @var \OCP\Contacts\IManager|\PHPUnit_Framework_MockObject_MockObject */ + protected $contactsManager; + /** @var \OCP\IUserSession|\PHPUnit_Framework_MockObject_MockObject */ protected $session; @@ -48,6 +51,10 @@ class ShareesTest extends TestCase { ->disableOriginalConstructor() ->getMock(); + $this->contactsManager = $this->getMockBuilder('OCP\Contacts\IManager') + ->disableOriginalConstructor() + ->getMock(); + $this->session = $this->getMockBuilder('OCP\IUserSession') ->disableOriginalConstructor() ->getMock(); @@ -55,7 +62,7 @@ class ShareesTest extends TestCase { $this->sharees = new Sharees( $this->groupManager, $this->userManager, - $this->getMockBuilder('OCP\Contacts\IManager')->disableOriginalConstructor()->getMock(), + $this->contactsManager, $this->getMockBuilder('OCP\IAppConfig')->disableOriginalConstructor()->getMock(), $this->session, $this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock() @@ -261,6 +268,82 @@ class ShareesTest extends TestCase { $this->assertEquals($expected, $users); } + public function dataGetRemote() { + return [ + ['test', [], []], + [ + 'test@remote', + [], + [ + ['label' => 'test@remote', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_REMOTE, 'shareWith' => 'test@remote']], + ], + ], + [ + 'test', + [ + [ + 'FN' => 'User3 @ Localhost', + ], + [ + 'FN' => 'User2 @ Localhost', + 'CLOUD' => [ + ], + ], + [ + 'FN' => 'User @ Localhost', + 'CLOUD' => [ + 'username@localhost', + ], + ], + ], + [ + ['label' => 'User @ Localhost (username@localhost)', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_REMOTE, 'shareWith' => 'username@localhost']], + ], + ], + [ + 'test@remote', + [ + [ + 'FN' => 'User3 @ Localhost', + ], + [ + 'FN' => 'User2 @ Localhost', + 'CLOUD' => [ + ], + ], + [ + 'FN' => 'User @ Localhost', + 'CLOUD' => [ + 'username@localhost', + ], + ], + ], + [ + ['label' => 'test@remote', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_REMOTE, 'shareWith' => 'test@remote']], + ['label' => 'User @ Localhost (username@localhost)', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_REMOTE, 'shareWith' => 'username@localhost']], + ], + ], + ]; + } + + /** + * @dataProvider dataGetRemote + * + * @param string $searchTerm + * @param array $contacts + * @param array $expected + */ + public function testGetRemote($searchTerm, $contacts, $expected) { + $this->contactsManager->expects($this->any()) + ->method('search') + ->with($searchTerm, ['CLOUD', 'FN']) + ->willReturn($contacts); + + $users = $this->invokePrivate($this->sharees, 'getRemote', [$searchTerm]); + + $this->assertEquals($expected, $users); + } + // public function testArguments() { // // } -- GitLab From 4b08783946c8b2b1e731b3193e581b59bbbb15f5 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 11 Aug 2015 17:24:54 +0200 Subject: [PATCH 025/783] Use SearchResultSorter --- apps/files_sharing/api/sharees.php | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/apps/files_sharing/api/sharees.php b/apps/files_sharing/api/sharees.php index 7a3555e0a5b..120df126a7c 100644 --- a/apps/files_sharing/api/sharees.php +++ b/apps/files_sharing/api/sharees.php @@ -210,21 +210,10 @@ class Sharees { // Sort sharees - usort($sharees, function($a, $b) { - $res = strcmp($a['label'], $b['label']); - - // If labels are equal sort by share type - if ($res === 0) { - $res = $a['value']['shareType'] - $b['value']['shareType']; - } - - // If sharetype is equal compare shareWith - if ($res === 0) { - $res = strcmp($a['value']['shareWith'], $b['value']['shareWith']); - } - - return $res; - }); + $sorter = new \OC\Share\SearchResultSorter($search, + 'label', + \OC::$server->getLogger()); + usort($sharees, array($sorter, 'sort')); //Pagination $start = ($page - 1) * $per_page; @@ -239,7 +228,6 @@ class Sharees { $response->setItemsPerPage($per_page); // TODO add other link rels - if ($tot > $end) { $url = $this->urlGenerator->getAbsoluteURL('/ocs/v1.php/apps/files_sharing/api/v1/sharees?') . 'search=' . $search . -- GitLab From a66aa1fe02038d70bd567cbcdc486441017d3172 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Tue, 11 Aug 2015 18:03:07 +0200 Subject: [PATCH 026/783] Filter the sharees with the existing shares --- apps/files_sharing/api/sharees.php | 94 ++++++++++++++++++++---------- 1 file changed, 64 insertions(+), 30 deletions(-) diff --git a/apps/files_sharing/api/sharees.php b/apps/files_sharing/api/sharees.php index 120df126a7c..a499b0ec6d3 100644 --- a/apps/files_sharing/api/sharees.php +++ b/apps/files_sharing/api/sharees.php @@ -178,33 +178,49 @@ class Sharees { } public function search($params) { - $search = isset($_GET['search']) ? (string)$_GET['search'] : ''; - $item_type = isset($_GET['item_type']) ? (string)$_GET['item_type'] : null; - $share_type = isset($_GET['share_type']) ? intval($_GET['share_type']) : null; - $page = isset($_GET['page']) ? intval($_GET['page']) : 1; - $per_page = isset($_GET['per_page']) ? intval($_GET['per_page']) : 200; + $search = isset($_GET['search']) ? (string) $_GET['search'] : ''; + $itemType = isset($_GET['itemType']) ? (string) $_GET['itemType'] : null; + $existingShares = isset($_GET['existingShares']) ? (array) $_GET['existingShares'] : []; + $shareType = isset($_GET['shareType']) ? intval($_GET['shareType']) : null; + $page = !empty($_GET['page']) ? intval($_GET['page']) : 1; + $perPage = !empty($_GET['limit']) ? intval($_GET['limit']) : 200; + + $sharedUsers = $sharedGroups = []; + if (!empty($existingShares)) { + if (!empty($existingShares[\OCP\Share::SHARE_TYPE_USER]) && + is_array($existingShares[\OCP\Share::SHARE_TYPE_USER])) { + $sharedUsers = $existingShares[\OCP\Share::SHARE_TYPE_USER]; + } + + if (!empty($existingShares[\OCP\Share::SHARE_TYPE_GROUP]) && + is_array($existingShares[\OCP\Share::SHARE_TYPE_GROUP])) { + $sharedGroups = $existingShares[\OCP\Share::SHARE_TYPE_GROUP]; + } + } // Verify arguments - if ($item_type === null) { - return new \OC_OCS_Result(null, 400, 'missing item_type'); + if ($itemType === null) { + return new \OC_OCS_Result(null, 400, 'missing itemType'); } $shareWithGroupOnly = $this->appConfig->getValue('core', 'shareapi_only_share_with_group_members', 'no') === 'yes' ? true : false; $sharees = []; // Get users - if ($share_type === null || $share_type === \OCP\Share::SHARE_TYPE_USER) { - $sharees = array_merge($sharees, $this->getUsers($search, $shareWithGroupOnly)); + if ($shareType === null || $shareType === \OCP\Share::SHARE_TYPE_USER) { + $potentialSharees = $this->getUsers($search, $shareWithGroupOnly); + $sharees = array_merge($sharees, $this->filterSharees($potentialSharees, $sharedUsers)); } // Get groups - if ($share_type === null || $share_type === \OCP\Share::SHARE_TYPE_GROUP) { - $sharees = array_merge($sharees, $this->getGroups($search, $shareWithGroupOnly)); + if ($shareType === null || $shareType === \OCP\Share::SHARE_TYPE_GROUP) { + $potentialSharees = $this->getGroups($search, $shareWithGroupOnly); + $sharees = array_merge($sharees, $this->filterSharees($potentialSharees, $sharedGroups)); } // Get remote - if (($share_type === null || $share_type === \OCP\Share::SHARE_TYPE_REMOTE) && - \OCP\Share::getBackend($item_type)->isShareTypeAllowed(\OCP\Share::SHARE_TYPE_REMOTE)) { + if (($shareType === null || $shareType === \OCP\Share::SHARE_TYPE_REMOTE) && + \OCP\Share::getBackend($itemType)->isShareTypeAllowed(\OCP\Share::SHARE_TYPE_REMOTE)) { $sharees = array_merge($sharees, $this->getRemote($search)); } @@ -216,28 +232,46 @@ class Sharees { usort($sharees, array($sorter, 'sort')); //Pagination - $start = ($page - 1) * $per_page; - $end = $page * $per_page; - $tot = count($sharees); + $start = ($page - 1) * $perPage; + $end = $page * $perPage; + $total = sizeof($sharees); - $sharees = array_slice($sharees, $start, $per_page); - $response = new \OC_OCS_Result($sharees); + $sharees = array_slice($sharees, $start, $perPage); - // FIXME: Do this? - $response->setTotalItems($tot); - $response->setItemsPerPage($per_page); - - // TODO add other link rels - if ($tot > $end) { - $url = $this->urlGenerator->getAbsoluteURL('/ocs/v1.php/apps/files_sharing/api/v1/sharees?') . - 'search=' . $search . - '&item_type=' . $item_type . - '&share_type=' . $share_type . - '&page=' . ($page + 1) . - '&per_page=' . $per_page; + $response = new \OC_OCS_Result($sharees); + $response->setTotalItems($total); + $response->setItemsPerPage($perPage); + + if ($total > $end) { + $params = [ + 'search' => $search, + 'itemType' => $itemType, + 'existingShares' => $existingShares, + 'page' => $page + 1, + 'limit' => $perPage, + ]; + if ($shareType !== null) { + $params['shareType'] = $shareType; + } + $url = $this->urlGenerator->getAbsoluteURL('/ocs/v1.php/apps/files_sharing/api/v1/sharees') . '?' . http_build_query($params); $response->addHeader('Link', '<' . $url . '> rel="next"'); } return $response; } + + /** + * Filter out already existing shares from a list of potential sharees + * + * @param array $potentialSharees + * @param array $existingSharees + * @return array + */ + private function filterSharees($potentialSharees, $existingSharees) { + $sharees = array_map(function ($sharee) use ($existingSharees) { + return in_array($sharee['value']['shareWith'], $existingSharees) ? null : $sharee; + }, $potentialSharees); + + return array_filter($sharees); + } } -- GitLab From 3f64e9423bf190629f867be20f17444a00257f8a Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 12 Aug 2015 14:19:34 +0200 Subject: [PATCH 027/783] Split logic and global usage and add tests for "searchSharees()" --- apps/files_sharing/api/sharees.php | 39 +++- apps/files_sharing/tests/api/sharees.php | 222 +++++++++++++++++++---- 2 files changed, 217 insertions(+), 44 deletions(-) diff --git a/apps/files_sharing/api/sharees.php b/apps/files_sharing/api/sharees.php index a499b0ec6d3..573fd8f2ab1 100644 --- a/apps/files_sharing/api/sharees.php +++ b/apps/files_sharing/api/sharees.php @@ -74,7 +74,7 @@ class Sharees { * * @return array possible sharees */ - private function getUsers($search, $shareWithGroupOnly) { + protected function getUsers($search, $shareWithGroupOnly) { $sharees = []; $users = []; @@ -115,7 +115,7 @@ class Sharees { * * @return array possible sharees */ - private function getGroups($search, $shareWithGroupOnly) { + protected function getGroups($search, $shareWithGroupOnly) { $sharees = []; $groups = $this->groupManager->search($search); $groups = array_map(function (IGroup $group) { return $group->getGID(); }, $groups); @@ -145,7 +145,7 @@ class Sharees { * * @return array possible sharees */ - private function getRemote($search) { + protected function getRemote($search) { $sharees = []; if (substr_count($search, '@') >= 1) { @@ -177,14 +177,37 @@ class Sharees { return $sharees; } + /** + * @param array $params + * @return \OC_OCS_Result + */ public function search($params) { - $search = isset($_GET['search']) ? (string) $_GET['search'] : ''; - $itemType = isset($_GET['itemType']) ? (string) $_GET['itemType'] : null; - $existingShares = isset($_GET['existingShares']) ? (array) $_GET['existingShares'] : []; + $search = isset($_GET['search']) ? (string)$_GET['search'] : ''; + $itemType = isset($_GET['itemType']) ? (string)$_GET['itemType'] : null; + $existingShares = isset($_GET['existingShares']) ? (array)$_GET['existingShares'] : []; $shareType = isset($_GET['shareType']) ? intval($_GET['shareType']) : null; $page = !empty($_GET['page']) ? intval($_GET['page']) : 1; $perPage = !empty($_GET['limit']) ? intval($_GET['limit']) : 200; + $shareWithGroupOnly = $this->appConfig->getValue('core', 'shareapi_only_share_with_group_members', 'no') === 'yes'; + + return $this->searchSharees($search, $itemType, $existingShares, $shareType, $page, $perPage, $shareWithGroupOnly); + } + + /** + * Testable search function that does not need globals + * + * @param string $search + * @param string $itemType + * @param array $existingShares + * @param int $shareType + * @param int $page + * @param int $perPage + * @param bool $shareWithGroupOnly + * @return \OC_OCS_Result + */ + protected function searchSharees($search, $itemType, array $existingShares, $shareType, $page, $perPage, $shareWithGroupOnly) { + $sharedUsers = $sharedGroups = []; if (!empty($existingShares)) { if (!empty($existingShares[\OCP\Share::SHARE_TYPE_USER]) && @@ -203,8 +226,6 @@ class Sharees { return new \OC_OCS_Result(null, 400, 'missing itemType'); } - $shareWithGroupOnly = $this->appConfig->getValue('core', 'shareapi_only_share_with_group_members', 'no') === 'yes' ? true : false; - $sharees = []; // Get users if ($shareType === null || $shareType === \OCP\Share::SHARE_TYPE_USER) { @@ -267,7 +288,7 @@ class Sharees { * @param array $existingSharees * @return array */ - private function filterSharees($potentialSharees, $existingSharees) { + protected function filterSharees($potentialSharees, $existingSharees) { $sharees = array_map(function ($sharee) use ($existingSharees) { return in_array($sharee['value']['shareWith'], $existingSharees) ? null : $sharee; }, $potentialSharees); diff --git a/apps/files_sharing/tests/api/sharees.php b/apps/files_sharing/tests/api/sharees.php index 04b8ef50253..93a8d5c3d7e 100644 --- a/apps/files_sharing/tests/api/sharees.php +++ b/apps/files_sharing/tests/api/sharees.php @@ -344,39 +344,191 @@ class ShareesTest extends TestCase { $this->assertEquals($expected, $users); } -// public function testArguments() { -// -// } -// -// public function testsOnlyUsers() { -// -// } -// -// public function testOnlyGroups() { -// -// } -// -// public function testRemoteAddress() { -// -// } -// -// public function testRemoteFromContacts() { -// -// } -// -// public function testAll() { -// -// } -// -// public function testSorting() { -// -// } -// -// public function testPagination() { -// -// } -// -// public function testShareWithinGroup() { -// -// } + public function dataSearchSharees() { + return [ + ['test', 'folder', [], null, 1, 2, false, [], [], [], [], 0, false], + ['test', 'folder', [0 => ['test1'], 1 => ['test2 group']], null, 1, 2, false, [], [], [], [], 0, false], + // First page with 2 of 3 results + [ + 'test', 'folder', [], null, 1, 2, false, [ + ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ], [ + ['label' => 'testgroup1', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_GROUP, 'shareWith' => 'testgroup1']], + ], [ + ['label' => 'testz@remote', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_REMOTE, 'shareWith' => 'testz@remote']], + ], [ + ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ['label' => 'testgroup1', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_GROUP, 'shareWith' => 'testgroup1']], + ], 3, true, + ], + // Second page with the 3rd result + [ + 'test', 'folder', [], null, 2, 2, false, [ + ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ], [ + ['label' => 'testgroup1', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_GROUP, 'shareWith' => 'testgroup1']], + ], [ + ['label' => 'testz@remote', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_REMOTE, 'shareWith' => 'testz@remote']], + ], [ + ['label' => 'testz@remote', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_REMOTE, 'shareWith' => 'testz@remote']], + ], 3, false, + ], + // Ingnoring already shared user + [ + 'test', 'folder', [\OCP\Share::SHARE_TYPE_USER => ['test1']], null, 1, 2, false, [ + ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ], [ + ['label' => 'testgroup1', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_GROUP, 'shareWith' => 'testgroup1']], + ], [ + ['label' => 'testz@remote', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_REMOTE, 'shareWith' => 'testz@remote']], + ], [ + ['label' => 'testgroup1', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_GROUP, 'shareWith' => 'testgroup1']], + ['label' => 'testz@remote', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_REMOTE, 'shareWith' => 'testz@remote']], + ], 2, false, + ], + // Share type restricted to user - Only one user + [ + 'test', 'folder', [], \OCP\Share::SHARE_TYPE_USER, 1, 2, false, [ + ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ], null, null, [ + ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ], 1, false, + ], + // Share type restricted to user - Multipage result + [ + 'test', 'folder', [], \OCP\Share::SHARE_TYPE_USER, 1, 2, false, [ + ['label' => 'test 1', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ['label' => 'test 2', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], + ['label' => 'test 3', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test3']], + ], null, null, [ + ['label' => 'test 1', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ['label' => 'test 2', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], + ], 3, true, + ], + // Share type restricted to user - Only user already shared + [ + 'test', 'folder', [\OCP\Share::SHARE_TYPE_USER => ['test1']], \OCP\Share::SHARE_TYPE_USER, 1, 2, false, [ + ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ], null, null, [], 0, false, + ], + ]; + } + + /** + * @dataProvider dataSearchSharees + * + * @param string $searchTerm + * @param string $itemType + * @param array $existingShares + * @param int $shareType + * @param int $page + * @param int $perPage + * @param bool $shareWithGroupOnly + * @param array $expected + */ + public function testSearchSharees($searchTerm, $itemType, array $existingShares, $shareType, $page, $perPage, $shareWithGroupOnly, + $mockedUserResult, $mockedGroupsResult, $mockedRemotesResult, $expected, $totalItems, $nextLink) { + /** @var \PHPUnit_Framework_MockObject_MockObject|\OCA\Files_Sharing\API\Sharees $sharees */ + $sharees = $this->getMockBuilder('\OCA\Files_Sharing\API\Sharees') + ->setConstructorArgs([ + $this->groupManager, + $this->userManager, + $this->contactsManager, + $this->getMockBuilder('OCP\IAppConfig')->disableOriginalConstructor()->getMock(), + $this->session, + $this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock() + ]) + ->setMethods(array('getUsers', 'getGroups', 'getRemote')) + ->getMock(); + $sharees->expects(($mockedUserResult === null) ? $this->never() : $this->once()) + ->method('getUsers') + ->with($searchTerm, $shareWithGroupOnly) + ->willReturn($mockedUserResult); + $sharees->expects(($mockedGroupsResult === null) ? $this->never() : $this->once()) + ->method('getGroups') + ->with($searchTerm, $shareWithGroupOnly) + ->willReturn($mockedGroupsResult); + $sharees->expects(($mockedRemotesResult === null) ? $this->never() : $this->once()) + ->method('getRemote') + ->with($searchTerm) + ->willReturn($mockedRemotesResult); + + /** @var \OC_OCS_Result $ocs */ + $ocs = $this->invokePrivate($sharees, 'searchSharees', [$searchTerm, $itemType, $existingShares, $shareType, $page, $perPage, $shareWithGroupOnly]); + + $this->assertEquals($expected, $ocs->getData()); + + // Check number of total results + $meta = $ocs->getMeta(); + $this->assertArrayHasKey('totalitems', $meta); + $this->assertSame($totalItems, $meta['totalitems']); + + // Check if next link is set + if ($nextLink) { + $headers = $ocs->getHeaders(); + $this->assertArrayHasKey('Link', $headers); + $this->assertStringStartsWith('<', $headers['Link']); + $this->assertStringEndsWith('> rel="next"', $headers['Link']); + } + } + + public function testSearchShareesNoItemType() { + /** @var \OC_OCS_Result $ocs */ + $ocs = $this->invokePrivate($this->sharees, 'searchSharees', ['', null, [], null, 0, 0, false]); + + $this->assertSame(400, $ocs->getStatusCode(), 'Expected status code 400'); + $this->assertSame([], $ocs->getData(), 'Expected that no data is send'); + + $meta = $ocs->getMeta(); + $this->assertNotEmpty($meta); + $this->assertArrayHasKey('message', $meta); + $this->assertSame('missing itemType', $meta['message']); + } + + + public function dataFilterSharees() { + return [ + [[], [], []], + [ + [ + ['label' => 'Test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ], + [], + [ + ['label' => 'Test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ], + ], + [ + [ + ['label' => 'Test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ['label' => 'Test Two', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], + ], + ['test1'], + [ + 1 => ['label' => 'Test Two', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], + ], + ], + [ + [ + ['label' => 'Test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ['label' => 'Test Two', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], + ], + ['test2'], + [ + 0 => ['label' => 'Test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ], + ], + ]; + } + + /** + * @dataProvider dataFilterSharees + * + * @param array $potentialSharees + * @param array $existingSharees + * @param array $expectedSharees + */ + public function testFilterSharees($potentialSharees, $existingSharees, $expectedSharees) { + $this->assertEquals($expectedSharees, $this->invokePrivate($this->sharees, 'filterSharees', [$potentialSharees, $existingSharees])); + } } -- GitLab From 327c47a9894cb6f8730e5824e3bda1b5e51db9d5 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 12 Aug 2015 14:23:48 +0200 Subject: [PATCH 028/783] Do not use deprecated method in new code --- apps/files_sharing/api/sharees.php | 17 ++++++++--------- apps/files_sharing/appinfo/routes.php | 2 +- apps/files_sharing/tests/api/sharees.php | 4 ++-- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/apps/files_sharing/api/sharees.php b/apps/files_sharing/api/sharees.php index 573fd8f2ab1..4ae6784c3d9 100644 --- a/apps/files_sharing/api/sharees.php +++ b/apps/files_sharing/api/sharees.php @@ -23,7 +23,7 @@ namespace OCA\Files_Sharing\API; use OCP\IGroup; use OCP\IGroupManager; use OCP\IUserManager; -use OCP\IAppConfig; +use OCP\IConfig; use OCP\IUserSession; use OCP\IURLGenerator; @@ -38,8 +38,8 @@ class Sharees { /** @var \OCP\Contacts\IManager */ private $contactsManager; - /** @var IAppConfig */ - private $appConfig; + /** @var IConfig */ + private $config; /** @var IUserSession */ private $userSession; @@ -51,19 +51,19 @@ class Sharees { * @param IGroupManager $groupManager * @param IUserManager $userManager * @param \OCP\Contacts\IManager $contactsManager - * @param IAppConfig $appConfig + * @param IConfig $config * @param IUserSession $userSession */ public function __construct(IGroupManager $groupManager, IUserManager $userManager, \OCP\Contacts\IManager $contactsManager, - IAppConfig $appConfig, + IConfig $config, IUserSession $userSession, IURLGenerator $urlGenerator) { $this->groupManager = $groupManager; $this->userManager = $userManager; $this->contactsManager = $contactsManager; - $this->appConfig = $appConfig; + $this->config = $config; $this->userSession = $userSession; $this->urlGenerator = $urlGenerator; } @@ -178,10 +178,9 @@ class Sharees { } /** - * @param array $params * @return \OC_OCS_Result */ - public function search($params) { + public function search() { $search = isset($_GET['search']) ? (string)$_GET['search'] : ''; $itemType = isset($_GET['itemType']) ? (string)$_GET['itemType'] : null; $existingShares = isset($_GET['existingShares']) ? (array)$_GET['existingShares'] : []; @@ -189,7 +188,7 @@ class Sharees { $page = !empty($_GET['page']) ? intval($_GET['page']) : 1; $perPage = !empty($_GET['limit']) ? intval($_GET['limit']) : 200; - $shareWithGroupOnly = $this->appConfig->getValue('core', 'shareapi_only_share_with_group_members', 'no') === 'yes'; + $shareWithGroupOnly = $this->config->getAppValue('core', 'shareapi_only_share_with_group_members', 'no') === 'yes'; return $this->searchSharees($search, $itemType, $existingShares, $shareType, $page, $perPage, $shareWithGroupOnly); } diff --git a/apps/files_sharing/appinfo/routes.php b/apps/files_sharing/appinfo/routes.php index 498b0eb55e9..45ea85ff724 100644 --- a/apps/files_sharing/appinfo/routes.php +++ b/apps/files_sharing/appinfo/routes.php @@ -105,7 +105,7 @@ API::register('delete', $sharees = new \OCA\Files_Sharing\API\Sharees(\OC::$server->getGroupManager(), \OC::$server->getUserManager(), \OC::$server->getContactsManager(), - \OC::$server->getAppConfig(), + \OC::$server->getConfig(), \OC::$server->getUserSession(), \OC::$server->getURLGenerator()); diff --git a/apps/files_sharing/tests/api/sharees.php b/apps/files_sharing/tests/api/sharees.php index 93a8d5c3d7e..863dc193ae0 100644 --- a/apps/files_sharing/tests/api/sharees.php +++ b/apps/files_sharing/tests/api/sharees.php @@ -63,7 +63,7 @@ class ShareesTest extends TestCase { $this->groupManager, $this->userManager, $this->contactsManager, - $this->getMockBuilder('OCP\IAppConfig')->disableOriginalConstructor()->getMock(), + $this->getMockBuilder('OCP\IConfig')->disableOriginalConstructor()->getMock(), $this->session, $this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock() ); @@ -434,7 +434,7 @@ class ShareesTest extends TestCase { $this->groupManager, $this->userManager, $this->contactsManager, - $this->getMockBuilder('OCP\IAppConfig')->disableOriginalConstructor()->getMock(), + $this->getMockBuilder('OCP\IConfig')->disableOriginalConstructor()->getMock(), $this->session, $this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock() ]) -- GitLab From 068a81897e0a307b7823aeab48595ed7b6f613b0 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 12 Aug 2015 15:03:50 +0200 Subject: [PATCH 029/783] Add tests for "search()" --- apps/files_sharing/api/sharees.php | 12 +- apps/files_sharing/tests/api/sharees.php | 151 ++++++++++++++++++++++- 2 files changed, 156 insertions(+), 7 deletions(-) diff --git a/apps/files_sharing/api/sharees.php b/apps/files_sharing/api/sharees.php index 4ae6784c3d9..bfde21deb2a 100644 --- a/apps/files_sharing/api/sharees.php +++ b/apps/files_sharing/api/sharees.php @@ -181,12 +181,12 @@ class Sharees { * @return \OC_OCS_Result */ public function search() { - $search = isset($_GET['search']) ? (string)$_GET['search'] : ''; - $itemType = isset($_GET['itemType']) ? (string)$_GET['itemType'] : null; - $existingShares = isset($_GET['existingShares']) ? (array)$_GET['existingShares'] : []; - $shareType = isset($_GET['shareType']) ? intval($_GET['shareType']) : null; - $page = !empty($_GET['page']) ? intval($_GET['page']) : 1; - $perPage = !empty($_GET['limit']) ? intval($_GET['limit']) : 200; + $search = isset($_GET['search']) ? (string) $_GET['search'] : ''; + $itemType = isset($_GET['itemType']) ? (string) $_GET['itemType'] : null; + $existingShares = isset($_GET['existingShares']) ? (array) $_GET['existingShares'] : []; + $shareType = isset($_GET['shareType']) && is_numeric($_GET['shareType']) ? (int) $_GET['shareType'] : null; + $page = !empty($_GET['page']) ? (int) $_GET['page'] : 1; + $perPage = !empty($_GET['limit']) ? (int) $_GET['limit'] : 200; $shareWithGroupOnly = $this->config->getAppValue('core', 'shareapi_only_share_with_group_members', 'no') === 'yes'; diff --git a/apps/files_sharing/tests/api/sharees.php b/apps/files_sharing/tests/api/sharees.php index 863dc193ae0..1a25266fe04 100644 --- a/apps/files_sharing/tests/api/sharees.php +++ b/apps/files_sharing/tests/api/sharees.php @@ -344,6 +344,154 @@ class ShareesTest extends TestCase { $this->assertEquals($expected, $users); } + public function dataSearch() { + return [ + [[], '', '', null, [], null, 1, 200, false], + + // Test itemType + [[ + 'search' => '', + ], '', '', null, [], null, 1, 200, false], + [[ + 'search' => 'foobar', + ], '', 'foobar', null, [], null, 1, 200, false], + [[ + 'search' => 0, + ], '', '0', null, [], null, 1, 200, false], + + // Test itemType + [[ + 'itemType' => '', + ], '', '', '', [], null, 1, 200, false], + [[ + 'itemType' => 'folder', + ], '', '', 'folder', [], null, 1, 200, false], + [[ + 'itemType' => 0, + ], '', '', '0', [], null, 1, 200, false], + + // Test existingShares + [[ + 'existingShares' => [], + ], '', '', null, [], null, 1, 200, false], + [[ + 'existingShares' => [0 => ['test'], 1 => ['foobar']], + ], '', '', null, [0 => ['test'], 1 => ['foobar']], null, 1, 200, false], + + // Test shareType + [[ + ], '', '', null, [], null, 1, 200, false], + [[ + 'shareType' => 0, + ], '', '', null, [], 0, 1, 200, false], + [[ + 'shareType' => '0', + ], '', '', null, [], 0, 1, 200, false], + [[ + 'shareType' => 1, + ], '', '', null, [], 1, 1, 200, false], + [[ + 'shareType' => 10, + ], '', '', null, [], 10, 1, 200, false], + [[ + 'shareType' => 'foobar', + ], '', '', null, [], null, 1, 200, false], + + // Test pagination + [[ + 'page' => 0, + ], '', '', null, [], null, 1, 200, false], + [[ + 'page' => '0', + ], '', '', null, [], null, 1, 200, false], + [[ + 'page' => 1, + ], '', '', null, [], null, 1, 200, false], + [[ + 'page' => 10, + ], '', '', null, [], null, 10, 200, false], + + // Test limit + [[ + 'limit' => 0, + ], '', '', null, [], null, 1, 200, false], + [[ + 'limit' => '0', + ], '', '', null, [], null, 1, 200, false], + [[ + 'limit' => 1, + ], '', '', null, [], null, 1, 1, false], + [[ + 'limit' => 10, + ], '', '', null, [], null, 1, 10, false], + + // Test $shareWithGroupOnly setting + [[], 'no', '', null, [], null, 1, 200, false], + [[], 'yes', '', null, [], null, 1, 200, true], + + ]; + } + + /** + * @dataProvider dataSearch + * + * @param array $getData + * @param string $apiSetting + * @param string $search + * @param string $itemType + * @param array $existingShares + * @param int $shareType + * @param int $page + * @param int $perPage + * @param bool $shareWithGroupOnly + */ + public function testSearch($getData, $apiSetting, $search, $itemType, $existingShares, $shareType, $page, $perPage, $shareWithGroupOnly) { + $oldGet = $_GET; + $_GET = $getData; + + $config = $this->getMockBuilder('OCP\IConfig') + ->disableOriginalConstructor() + ->getMock(); + $config->expects($this->once()) + ->method('getAppValue') + ->with('core', 'shareapi_only_share_with_group_members', 'no') + ->willReturn($apiSetting); + + $sharees = $this->getMockBuilder('\OCA\Files_Sharing\API\Sharees') + ->setConstructorArgs([ + $this->groupManager, + $this->userManager, + $this->contactsManager, + $config, + $this->session, + $this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock() + ]) + ->setMethods(array('searchSharees')) + ->getMock(); + $sharees->expects($this->once()) + ->method('searchSharees') + ->with($search, $itemType, $existingShares, $shareType, $page, $perPage, $shareWithGroupOnly) + ->willReturnCallback(function + ($isearch, $iitemType, $iexistingShares, $ishareType, $ipage, $iperPage, $ishareWithGroupOnly) + use ($search, $itemType, $existingShares, $shareType, $page, $perPage, $shareWithGroupOnly) { + + // We are doing strict comparisons here, so we can differ 0/'' and null on shareType/itemType + $this->assertSame($search, $isearch); + $this->assertSame($itemType, $iitemType); + $this->assertSame($existingShares, $iexistingShares); + $this->assertSame($shareType, $ishareType); + $this->assertSame($page, $ipage); + $this->assertSame($perPage, $iperPage); + $this->assertSame($shareWithGroupOnly, $ishareWithGroupOnly); + return new \OC_OCS_Result([]); + }); + + /** @var \PHPUnit_Framework_MockObject_MockObject|\OCA\Files_Sharing\API\Sharees $sharees */ + $this->assertInstanceOf('\OC_OCS_Result', $sharees->search()); + + $_GET = $oldGet; + } + public function dataSearchSharees() { return [ ['test', 'folder', [], null, 1, 2, false, [], [], [], [], 0, false], @@ -455,6 +603,7 @@ class ShareesTest extends TestCase { /** @var \OC_OCS_Result $ocs */ $ocs = $this->invokePrivate($sharees, 'searchSharees', [$searchTerm, $itemType, $existingShares, $shareType, $page, $perPage, $shareWithGroupOnly]); + $this->assertInstanceOf('\OC_OCS_Result', $ocs); $this->assertEquals($expected, $ocs->getData()); @@ -475,6 +624,7 @@ class ShareesTest extends TestCase { public function testSearchShareesNoItemType() { /** @var \OC_OCS_Result $ocs */ $ocs = $this->invokePrivate($this->sharees, 'searchSharees', ['', null, [], null, 0, 0, false]); + $this->assertInstanceOf('\OC_OCS_Result', $ocs); $this->assertSame(400, $ocs->getStatusCode(), 'Expected status code 400'); $this->assertSame([], $ocs->getData(), 'Expected that no data is send'); @@ -485,7 +635,6 @@ class ShareesTest extends TestCase { $this->assertSame('missing itemType', $meta['message']); } - public function dataFilterSharees() { return [ [[], [], []], -- GitLab From c6ed40c9f891454d8f9ceeb67c45ff3d8ce22537 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 12 Aug 2015 17:05:20 +0200 Subject: [PATCH 030/783] Make shareType an array --- apps/files_sharing/api/sharees.php | 57 +++++++-- apps/files_sharing/tests/api/sharees.php | 145 ++++++++++++++++------- 2 files changed, 144 insertions(+), 58 deletions(-) diff --git a/apps/files_sharing/api/sharees.php b/apps/files_sharing/api/sharees.php index bfde21deb2a..de5f9c8cbf4 100644 --- a/apps/files_sharing/api/sharees.php +++ b/apps/files_sharing/api/sharees.php @@ -184,13 +184,46 @@ class Sharees { $search = isset($_GET['search']) ? (string) $_GET['search'] : ''; $itemType = isset($_GET['itemType']) ? (string) $_GET['itemType'] : null; $existingShares = isset($_GET['existingShares']) ? (array) $_GET['existingShares'] : []; - $shareType = isset($_GET['shareType']) && is_numeric($_GET['shareType']) ? (int) $_GET['shareType'] : null; - $page = !empty($_GET['page']) ? (int) $_GET['page'] : 1; - $perPage = !empty($_GET['limit']) ? (int) $_GET['limit'] : 200; + $page = !empty($_GET['page']) ? max(1, (int) $_GET['page']) : 1; + $perPage = !empty($_GET['limit']) ? max(1, (int) $_GET['limit']) : 200; + + $shareTypes = [ + \OCP\Share::SHARE_TYPE_USER, + \OCP\Share::SHARE_TYPE_GROUP, + \OCP\Share::SHARE_TYPE_REMOTE, + ]; + if (isset($_GET['shareType']) && is_array($_GET['shareType'])) { + $shareTypes = array_intersect($shareTypes, $_GET['shareType']); + sort($shareTypes); + + } else if (isset($_GET['shareType']) && is_numeric($_GET['shareType'])) { + $shareTypes = array_intersect($shareTypes, [(int) $_GET['shareType']]); + sort($shareTypes); + } + + if (in_array(\OCP\Share::SHARE_TYPE_REMOTE, $shareTypes) && !$this->isRemoteSharingAllowed($itemType)) { + // Remove remote shares from type array, because it is not allowed. + $shareTypes = array_diff($shareTypes, [\OCP\Share::SHARE_TYPE_REMOTE]); + } $shareWithGroupOnly = $this->config->getAppValue('core', 'shareapi_only_share_with_group_members', 'no') === 'yes'; - return $this->searchSharees($search, $itemType, $existingShares, $shareType, $page, $perPage, $shareWithGroupOnly); + return $this->searchSharees($search, $itemType, $existingShares, $shareTypes, $page, $perPage, $shareWithGroupOnly); + } + + /** + * Method to get out the static call for better testing + * + * @param string $itemType + * @return bool + */ + protected function isRemoteSharingAllowed($itemType) { + try { + $backend = \OCP\Share::getBackend($itemType); + return $backend->isShareTypeAllowed(\OCP\Share::SHARE_TYPE_REMOTE); + } catch (\Exception $e) { + return false; + } } /** @@ -199,13 +232,13 @@ class Sharees { * @param string $search * @param string $itemType * @param array $existingShares - * @param int $shareType + * @param array $shareTypes * @param int $page * @param int $perPage * @param bool $shareWithGroupOnly * @return \OC_OCS_Result */ - protected function searchSharees($search, $itemType, array $existingShares, $shareType, $page, $perPage, $shareWithGroupOnly) { + protected function searchSharees($search, $itemType, array $existingShares, array $shareTypes, $page, $perPage, $shareWithGroupOnly) { $sharedUsers = $sharedGroups = []; if (!empty($existingShares)) { @@ -227,20 +260,19 @@ class Sharees { $sharees = []; // Get users - if ($shareType === null || $shareType === \OCP\Share::SHARE_TYPE_USER) { + if (in_array(\OCP\Share::SHARE_TYPE_USER, $shareTypes)) { $potentialSharees = $this->getUsers($search, $shareWithGroupOnly); $sharees = array_merge($sharees, $this->filterSharees($potentialSharees, $sharedUsers)); } // Get groups - if ($shareType === null || $shareType === \OCP\Share::SHARE_TYPE_GROUP) { + if (in_array(\OCP\Share::SHARE_TYPE_GROUP, $shareTypes)) { $potentialSharees = $this->getGroups($search, $shareWithGroupOnly); $sharees = array_merge($sharees, $this->filterSharees($potentialSharees, $sharedGroups)); } // Get remote - if (($shareType === null || $shareType === \OCP\Share::SHARE_TYPE_REMOTE) && - \OCP\Share::getBackend($itemType)->isShareTypeAllowed(\OCP\Share::SHARE_TYPE_REMOTE)) { + if (in_array(\OCP\Share::SHARE_TYPE_REMOTE, $shareTypes)) { $sharees = array_merge($sharees, $this->getRemote($search)); } @@ -267,12 +299,11 @@ class Sharees { 'search' => $search, 'itemType' => $itemType, 'existingShares' => $existingShares, + 'shareType' => $shareTypes, 'page' => $page + 1, 'limit' => $perPage, ]; - if ($shareType !== null) { - $params['shareType'] = $shareType; - } + $url = $this->urlGenerator->getAbsoluteURL('/ocs/v1.php/apps/files_sharing/api/v1/sharees') . '?' . http_build_query($params); $response->addHeader('Link', '<' . $url . '> rel="next"'); } diff --git a/apps/files_sharing/tests/api/sharees.php b/apps/files_sharing/tests/api/sharees.php index 1a25266fe04..ec19036bb8f 100644 --- a/apps/files_sharing/tests/api/sharees.php +++ b/apps/files_sharing/tests/api/sharees.php @@ -345,89 +345,109 @@ class ShareesTest extends TestCase { } public function dataSearch() { + $allTypes = [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_REMOTE]; + return [ - [[], '', '', null, [], null, 1, 200, false], + [[], '', true, '', null, [], $allTypes, 1, 200, false], // Test itemType [[ 'search' => '', - ], '', '', null, [], null, 1, 200, false], + ], '', true, '', null, [], $allTypes, 1, 200, false], [[ 'search' => 'foobar', - ], '', 'foobar', null, [], null, 1, 200, false], + ], '', true, 'foobar', null, [], $allTypes, 1, 200, false], [[ 'search' => 0, - ], '', '0', null, [], null, 1, 200, false], + ], '', true, '0', null, [], $allTypes, 1, 200, false], // Test itemType [[ 'itemType' => '', - ], '', '', '', [], null, 1, 200, false], + ], '', true, '', '', [], $allTypes, 1, 200, false], [[ 'itemType' => 'folder', - ], '', '', 'folder', [], null, 1, 200, false], + ], '', true, '', 'folder', [], $allTypes, 1, 200, false], [[ 'itemType' => 0, - ], '', '', '0', [], null, 1, 200, false], + ], '', true, '', '0', [], $allTypes, 1, 200, false], // Test existingShares [[ 'existingShares' => [], - ], '', '', null, [], null, 1, 200, false], + ], '', true, '', null, [], $allTypes, 1, 200, false], [[ 'existingShares' => [0 => ['test'], 1 => ['foobar']], - ], '', '', null, [0 => ['test'], 1 => ['foobar']], null, 1, 200, false], + ], '', true, '', null, [0 => ['test'], 1 => ['foobar']], $allTypes, 1, 200, false], // Test shareType [[ - ], '', '', null, [], null, 1, 200, false], + ], '', true, '', null, [], $allTypes, 1, 200, false], [[ 'shareType' => 0, - ], '', '', null, [], 0, 1, 200, false], + ], '', true, '', null, [], [0], 1, 200, false], [[ 'shareType' => '0', - ], '', '', null, [], 0, 1, 200, false], + ], '', true, '', null, [], [0], 1, 200, false], [[ 'shareType' => 1, - ], '', '', null, [], 1, 1, 200, false], + ], '', true, '', null, [], [1], 1, 200, false], [[ - 'shareType' => 10, - ], '', '', null, [], 10, 1, 200, false], + 'shareType' => 12, + ], '', true, '', null, [], [], 1, 200, false], [[ 'shareType' => 'foobar', - ], '', '', null, [], null, 1, 200, false], + ], '', true, '', null, [], $allTypes, 1, 200, false], + [[ + 'shareType' => [0, 1, 2], + ], '', true, '', null, [], [0, 1], 1, 200, false], + [[ + 'shareType' => [0, 1], + ], '', true, '', null, [], [0, 1], 1, 200, false], + [[ + 'shareType' => $allTypes, + ], '', true, '', null, [], $allTypes, 1, 200, false], + [[ + 'shareType' => $allTypes, + ], '', false, '', null, [], [0, 1], 1, 200, false], // Test pagination [[ 'page' => 0, - ], '', '', null, [], null, 1, 200, false], + ], '', true, '', null, [], $allTypes, 1, 200, false], [[ 'page' => '0', - ], '', '', null, [], null, 1, 200, false], + ], '', true, '', null, [], $allTypes, 1, 200, false], + [[ + 'page' => -1, + ], '', true, '', null, [], $allTypes, 1, 200, false], [[ 'page' => 1, - ], '', '', null, [], null, 1, 200, false], + ], '', true, '', null, [], $allTypes, 1, 200, false], [[ 'page' => 10, - ], '', '', null, [], null, 10, 200, false], + ], '', true, '', null, [], $allTypes, 10, 200, false], // Test limit [[ 'limit' => 0, - ], '', '', null, [], null, 1, 200, false], + ], '', true, '', null, [], $allTypes, 1, 200, false], [[ 'limit' => '0', - ], '', '', null, [], null, 1, 200, false], + ], '', true, '', null, [], $allTypes, 1, 200, false], + [[ + 'limit' => -1, + ], '', true, '', null, [], $allTypes, 1, 1, false], [[ 'limit' => 1, - ], '', '', null, [], null, 1, 1, false], + ], '', true, '', null, [], $allTypes, 1, 1, false], [[ 'limit' => 10, - ], '', '', null, [], null, 1, 10, false], + ], '', true, '', null, [], $allTypes, 1, 10, false], // Test $shareWithGroupOnly setting - [[], 'no', '', null, [], null, 1, 200, false], - [[], 'yes', '', null, [], null, 1, 200, true], + [[], 'no', true, '', null, [], $allTypes, 1, 200, false], + [[], 'yes', true, '', null, [], $allTypes, 1, 200, true], ]; } @@ -437,15 +457,16 @@ class ShareesTest extends TestCase { * * @param array $getData * @param string $apiSetting + * @param bool $remoteSharingEnabled * @param string $search * @param string $itemType * @param array $existingShares - * @param int $shareType + * @param array $shareTypes * @param int $page * @param int $perPage * @param bool $shareWithGroupOnly */ - public function testSearch($getData, $apiSetting, $search, $itemType, $existingShares, $shareType, $page, $perPage, $shareWithGroupOnly) { + public function testSearch($getData, $apiSetting, $remoteSharingEnabled, $search, $itemType, $existingShares, $shareTypes, $page, $perPage, $shareWithGroupOnly) { $oldGet = $_GET; $_GET = $getData; @@ -466,25 +487,29 @@ class ShareesTest extends TestCase { $this->session, $this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock() ]) - ->setMethods(array('searchSharees')) + ->setMethods(array('searchSharees', 'isRemoteSharingAllowed')) ->getMock(); $sharees->expects($this->once()) ->method('searchSharees') - ->with($search, $itemType, $existingShares, $shareType, $page, $perPage, $shareWithGroupOnly) + ->with($search, $itemType, $existingShares, $shareTypes, $page, $perPage, $shareWithGroupOnly) ->willReturnCallback(function - ($isearch, $iitemType, $iexistingShares, $ishareType, $ipage, $iperPage, $ishareWithGroupOnly) - use ($search, $itemType, $existingShares, $shareType, $page, $perPage, $shareWithGroupOnly) { + ($isearch, $iitemType, $iexistingShares, $ishareTypes, $ipage, $iperPage, $ishareWithGroupOnly) + use ($search, $itemType, $existingShares, $shareTypes, $page, $perPage, $shareWithGroupOnly) { // We are doing strict comparisons here, so we can differ 0/'' and null on shareType/itemType $this->assertSame($search, $isearch); $this->assertSame($itemType, $iitemType); $this->assertSame($existingShares, $iexistingShares); - $this->assertSame($shareType, $ishareType); + $this->assertSame($shareTypes, $ishareTypes); $this->assertSame($page, $ipage); $this->assertSame($perPage, $iperPage); $this->assertSame($shareWithGroupOnly, $ishareWithGroupOnly); return new \OC_OCS_Result([]); }); + $sharees->expects($this->any()) + ->method('isRemoteSharingAllowed') + ->with($itemType) + ->willReturn($remoteSharingEnabled); /** @var \PHPUnit_Framework_MockObject_MockObject|\OCA\Files_Sharing\API\Sharees $sharees */ $this->assertInstanceOf('\OC_OCS_Result', $sharees->search()); @@ -492,13 +517,32 @@ class ShareesTest extends TestCase { $_GET = $oldGet; } + public function dataIsRemoteSharingAllowed() { + return [ + ['file', true], + ['folder', true], + ['', false], + ['contacts', false], + ]; + } + + /** + * @dataProvider dataIsRemoteSharingAllowed + * + * @param string $itemType + * @param bool $expected + */ + public function testIsRemoteSharingAllowed($itemType, $expected) { + $this->assertSame($expected, $this->invokePrivate($this->sharees, 'isRemoteSharingAllowed', [$itemType])); + } + public function dataSearchSharees() { return [ - ['test', 'folder', [], null, 1, 2, false, [], [], [], [], 0, false], - ['test', 'folder', [0 => ['test1'], 1 => ['test2 group']], null, 1, 2, false, [], [], [], [], 0, false], + ['test', 'folder', [], [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_REMOTE], 1, 2, false, [], [], [], [], 0, false], + ['test', 'folder', [0 => ['test1'], 1 => ['test2 group']], [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_REMOTE], 1, 2, false, [], [], [], [], 0, false], // First page with 2 of 3 results [ - 'test', 'folder', [], null, 1, 2, false, [ + 'test', 'folder', [], [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_REMOTE], 1, 2, false, [ ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], ], [ ['label' => 'testgroup1', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_GROUP, 'shareWith' => 'testgroup1']], @@ -511,7 +555,7 @@ class ShareesTest extends TestCase { ], // Second page with the 3rd result [ - 'test', 'folder', [], null, 2, 2, false, [ + 'test', 'folder', [], [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_REMOTE], 2, 2, false, [ ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], ], [ ['label' => 'testgroup1', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_GROUP, 'shareWith' => 'testgroup1']], @@ -521,9 +565,20 @@ class ShareesTest extends TestCase { ['label' => 'testz@remote', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_REMOTE, 'shareWith' => 'testz@remote']], ], 3, false, ], + // No groups requested + [ + 'test', 'folder', [], [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_REMOTE], 1, 2, false, [ + ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ], null, [ + ['label' => 'testz@remote', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_REMOTE, 'shareWith' => 'testz@remote']], + ], [ + ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ['label' => 'testz@remote', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_REMOTE, 'shareWith' => 'testz@remote']], + ], 2, false, + ], // Ingnoring already shared user [ - 'test', 'folder', [\OCP\Share::SHARE_TYPE_USER => ['test1']], null, 1, 2, false, [ + 'test', 'folder', [\OCP\Share::SHARE_TYPE_USER => ['test1']], [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_REMOTE], 1, 2, false, [ ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], ], [ ['label' => 'testgroup1', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_GROUP, 'shareWith' => 'testgroup1']], @@ -536,7 +591,7 @@ class ShareesTest extends TestCase { ], // Share type restricted to user - Only one user [ - 'test', 'folder', [], \OCP\Share::SHARE_TYPE_USER, 1, 2, false, [ + 'test', 'folder', [], [\OCP\Share::SHARE_TYPE_USER], 1, 2, false, [ ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], ], null, null, [ ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], @@ -544,7 +599,7 @@ class ShareesTest extends TestCase { ], // Share type restricted to user - Multipage result [ - 'test', 'folder', [], \OCP\Share::SHARE_TYPE_USER, 1, 2, false, [ + 'test', 'folder', [], [\OCP\Share::SHARE_TYPE_USER], 1, 2, false, [ ['label' => 'test 1', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], ['label' => 'test 2', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], ['label' => 'test 3', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test3']], @@ -555,7 +610,7 @@ class ShareesTest extends TestCase { ], // Share type restricted to user - Only user already shared [ - 'test', 'folder', [\OCP\Share::SHARE_TYPE_USER => ['test1']], \OCP\Share::SHARE_TYPE_USER, 1, 2, false, [ + 'test', 'folder', [\OCP\Share::SHARE_TYPE_USER => ['test1']], [\OCP\Share::SHARE_TYPE_USER], 1, 2, false, [ ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], ], null, null, [], 0, false, ], @@ -568,13 +623,13 @@ class ShareesTest extends TestCase { * @param string $searchTerm * @param string $itemType * @param array $existingShares - * @param int $shareType + * @param array $shareTypes * @param int $page * @param int $perPage * @param bool $shareWithGroupOnly * @param array $expected */ - public function testSearchSharees($searchTerm, $itemType, array $existingShares, $shareType, $page, $perPage, $shareWithGroupOnly, + public function testSearchSharees($searchTerm, $itemType, array $existingShares, array $shareTypes, $page, $perPage, $shareWithGroupOnly, $mockedUserResult, $mockedGroupsResult, $mockedRemotesResult, $expected, $totalItems, $nextLink) { /** @var \PHPUnit_Framework_MockObject_MockObject|\OCA\Files_Sharing\API\Sharees $sharees */ $sharees = $this->getMockBuilder('\OCA\Files_Sharing\API\Sharees') @@ -602,7 +657,7 @@ class ShareesTest extends TestCase { ->willReturn($mockedRemotesResult); /** @var \OC_OCS_Result $ocs */ - $ocs = $this->invokePrivate($sharees, 'searchSharees', [$searchTerm, $itemType, $existingShares, $shareType, $page, $perPage, $shareWithGroupOnly]); + $ocs = $this->invokePrivate($sharees, 'searchSharees', [$searchTerm, $itemType, $existingShares, $shareTypes, $page, $perPage, $shareWithGroupOnly]); $this->assertInstanceOf('\OC_OCS_Result', $ocs); $this->assertEquals($expected, $ocs->getData()); @@ -623,7 +678,7 @@ class ShareesTest extends TestCase { public function testSearchShareesNoItemType() { /** @var \OC_OCS_Result $ocs */ - $ocs = $this->invokePrivate($this->sharees, 'searchSharees', ['', null, [], null, 0, 0, false]); + $ocs = $this->invokePrivate($this->sharees, 'searchSharees', ['', null, [], [], 0, 0, false]); $this->assertInstanceOf('\OC_OCS_Result', $ocs); $this->assertSame(400, $ocs->getStatusCode(), 'Expected status code 400'); -- GitLab From a0ab7a257858b305434255df2f33ef4b323ac81d Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Thu, 13 Aug 2015 10:57:08 +0200 Subject: [PATCH 031/783] Add all possible links next, prev, first and last --- apps/files_sharing/api/sharees.php | 54 +++++++++++++++++------- apps/files_sharing/tests/api/sharees.php | 50 +++++++++++++++++++++- 2 files changed, 88 insertions(+), 16 deletions(-) diff --git a/apps/files_sharing/api/sharees.php b/apps/files_sharing/api/sharees.php index de5f9c8cbf4..714b4950c59 100644 --- a/apps/files_sharing/api/sharees.php +++ b/apps/files_sharing/api/sharees.php @@ -285,7 +285,6 @@ class Sharees { //Pagination $start = ($page - 1) * $perPage; - $end = $page * $perPage; $total = sizeof($sharees); $sharees = array_slice($sharees, $start, $perPage); @@ -294,18 +293,16 @@ class Sharees { $response->setTotalItems($total); $response->setItemsPerPage($perPage); - if ($total > $end) { - $params = [ - 'search' => $search, - 'itemType' => $itemType, - 'existingShares' => $existingShares, - 'shareType' => $shareTypes, - 'page' => $page + 1, - 'limit' => $perPage, - ]; + $links = $this->getPaginationLinks($page, $total, [ + 'search' => $search, + 'itemType' => $itemType, + 'existingShares' => $existingShares, + 'shareType' => $shareTypes, + 'limit' => $perPage, + ]); - $url = $this->urlGenerator->getAbsoluteURL('/ocs/v1.php/apps/files_sharing/api/v1/sharees') . '?' . http_build_query($params); - $response->addHeader('Link', '<' . $url . '> rel="next"'); + if (!empty($links)) { + $response->addHeader('Link', implode(', ', $links)); } return $response; @@ -319,10 +316,37 @@ class Sharees { * @return array */ protected function filterSharees($potentialSharees, $existingSharees) { - $sharees = array_map(function ($sharee) use ($existingSharees) { + $sharees = array_filter($potentialSharees, function ($sharee) use ($existingSharees) { return in_array($sharee['value']['shareWith'], $existingSharees) ? null : $sharee; - }, $potentialSharees); + }); - return array_filter($sharees); + return $sharees; + } + + /** + * Generates a bunch of pagination links for the current page + * + * @param int $page Current page + * @param int $total Number of total items that need to be paginated + * @param array $params Parameters for the URL + * @return array + */ + protected function getPaginationLinks($page, $total, array $params) { + $url = $this->urlGenerator->getAbsoluteURL('/ocs/v1.php/apps/files_sharing/api/v1/sharees') . '?'; + + $links = []; + if ($page > 1) { + $params['page'] = 1; + $links[] = '<' . $url . http_build_query($params) . '>; rel="first"'; + $params['page'] = $page - 1; + $links[] = '<' . $url . http_build_query($params) . '>; rel="prev"'; + } + if ($page * $params['limit'] < $total) { + $params['page'] = $page + 1; + $links[] = '<' . $url . http_build_query($params) . '>; rel="next"'; + $params['page'] = ceil($total / $params['limit']); + $links[] = '<' . $url . http_build_query($params) . '>; rel="last"'; + } + return $links; } } diff --git a/apps/files_sharing/tests/api/sharees.php b/apps/files_sharing/tests/api/sharees.php index ec19036bb8f..7efd29e592d 100644 --- a/apps/files_sharing/tests/api/sharees.php +++ b/apps/files_sharing/tests/api/sharees.php @@ -672,7 +672,7 @@ class ShareesTest extends TestCase { $headers = $ocs->getHeaders(); $this->assertArrayHasKey('Link', $headers); $this->assertStringStartsWith('<', $headers['Link']); - $this->assertStringEndsWith('> rel="next"', $headers['Link']); + $this->assertStringEndsWith('"', $headers['Link']); } } @@ -735,4 +735,52 @@ class ShareesTest extends TestCase { public function testFilterSharees($potentialSharees, $existingSharees, $expectedSharees) { $this->assertEquals($expectedSharees, $this->invokePrivate($this->sharees, 'filterSharees', [$potentialSharees, $existingSharees])); } + + public function dataGetPaginationLinks() { + return [ + [1, 1, ['limit' => 2], []], + [1, 3, ['limit' => 2], [ + '; rel="next"', + '; rel="last"', + ]], + [1, 21, ['limit' => 2], [ + '; rel="next"', + '; rel="last"', + ]], + [2, 21, ['limit' => 2], [ + '; rel="first"', + '; rel="prev"', + '; rel="next"', + '; rel="last"', + ]], + [5, 21, ['limit' => 2], [ + '; rel="first"', + '; rel="prev"', + '; rel="next"', + '; rel="last"', + ]], + [10, 21, ['limit' => 2], [ + '; rel="first"', + '; rel="prev"', + '; rel="next"', + '; rel="last"', + ]], + [11, 21, ['limit' => 2], [ + '; rel="first"', + '; rel="prev"', + ]], + ]; + } + + /** + * @dataProvider dataGetPaginationLinks + * + * @param int $page + * @param int $total + * @param array $params + * @param array $expected + */ + public function testGetPaginationLinks($page, $total, $params, $expected) { + $this->assertEquals($expected, $this->invokePrivate($this->sharees, 'getPaginationLinks', [$page, $total, $params])); + } } -- GitLab From 5c4fbf519133cc0e017581a29151911f685a64b0 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Thu, 13 Aug 2015 11:06:03 +0200 Subject: [PATCH 032/783] Inject the logger as well --- apps/files_sharing/api/sharees.php | 63 ++++++++++++++---------- apps/files_sharing/appinfo/routes.php | 3 +- apps/files_sharing/tests/api/sharees.php | 9 ++-- 3 files changed, 44 insertions(+), 31 deletions(-) diff --git a/apps/files_sharing/api/sharees.php b/apps/files_sharing/api/sharees.php index 714b4950c59..129a66851a7 100644 --- a/apps/files_sharing/api/sharees.php +++ b/apps/files_sharing/api/sharees.php @@ -20,12 +20,16 @@ */ namespace OCA\Files_Sharing\API; +use OC\Share\SearchResultSorter; +use OCP\Contacts\IManager; use OCP\IGroup; use OCP\IGroupManager; +use OCP\ILogger; use OCP\IUserManager; use OCP\IConfig; use OCP\IUserSession; use OCP\IURLGenerator; +use OCP\Share; class Sharees { @@ -35,7 +39,7 @@ class Sharees { /** @var IUserManager */ private $userManager; - /** @var \OCP\Contacts\IManager */ + /** @var IManager */ private $contactsManager; /** @var IConfig */ @@ -47,25 +51,32 @@ class Sharees { /** @var IURLGenerator */ private $urlGenerator; + /** @var ILogger */ + private $logger; + /** * @param IGroupManager $groupManager * @param IUserManager $userManager - * @param \OCP\Contacts\IManager $contactsManager + * @param IManager $contactsManager * @param IConfig $config * @param IUserSession $userSession + * @param IURLGenerator $urlGenerator + * @param ILogger $logger */ public function __construct(IGroupManager $groupManager, IUserManager $userManager, - \OCP\Contacts\IManager $contactsManager, + IManager $contactsManager, IConfig $config, IUserSession $userSession, - IURLGenerator $urlGenerator) { + IURLGenerator $urlGenerator, + ILogger $logger) { $this->groupManager = $groupManager; $this->userManager = $userManager; $this->contactsManager = $contactsManager; $this->config = $config; $this->userSession = $userSession; $this->urlGenerator = $urlGenerator; + $this->logger = $logger; } /** @@ -100,7 +111,7 @@ class Sharees { $sharees[] = [ 'label' => $displayName, 'value' => [ - 'shareType' => \OCP\Share::SHARE_TYPE_USER, + 'shareType' => Share::SHARE_TYPE_USER, 'shareWith' => $uid, ], ]; @@ -131,7 +142,7 @@ class Sharees { $sharees[] = [ 'label' => $gid, 'value' => [ - 'shareType' => \OCP\Share::SHARE_TYPE_GROUP, + 'shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => $gid, ], ]; @@ -152,7 +163,7 @@ class Sharees { $sharees[] = [ 'label' => $search, 'value' => [ - 'shareType' => \OCP\Share::SHARE_TYPE_REMOTE, + 'shareType' => Share::SHARE_TYPE_REMOTE, 'shareWith' => $search, ], ]; @@ -166,7 +177,7 @@ class Sharees { $sharees[] = [ 'label' => $contact['FN'] . ' (' . $cloudId . ')', 'value' => [ - 'shareType' => \OCP\Share::SHARE_TYPE_REMOTE, + 'shareType' => Share::SHARE_TYPE_REMOTE, 'shareWith' => $cloudId ] ]; @@ -188,9 +199,9 @@ class Sharees { $perPage = !empty($_GET['limit']) ? max(1, (int) $_GET['limit']) : 200; $shareTypes = [ - \OCP\Share::SHARE_TYPE_USER, - \OCP\Share::SHARE_TYPE_GROUP, - \OCP\Share::SHARE_TYPE_REMOTE, + Share::SHARE_TYPE_USER, + Share::SHARE_TYPE_GROUP, + Share::SHARE_TYPE_REMOTE, ]; if (isset($_GET['shareType']) && is_array($_GET['shareType'])) { $shareTypes = array_intersect($shareTypes, $_GET['shareType']); @@ -201,9 +212,9 @@ class Sharees { sort($shareTypes); } - if (in_array(\OCP\Share::SHARE_TYPE_REMOTE, $shareTypes) && !$this->isRemoteSharingAllowed($itemType)) { + if (in_array(Share::SHARE_TYPE_REMOTE, $shareTypes) && !$this->isRemoteSharingAllowed($itemType)) { // Remove remote shares from type array, because it is not allowed. - $shareTypes = array_diff($shareTypes, [\OCP\Share::SHARE_TYPE_REMOTE]); + $shareTypes = array_diff($shareTypes, [Share::SHARE_TYPE_REMOTE]); } $shareWithGroupOnly = $this->config->getAppValue('core', 'shareapi_only_share_with_group_members', 'no') === 'yes'; @@ -219,8 +230,8 @@ class Sharees { */ protected function isRemoteSharingAllowed($itemType) { try { - $backend = \OCP\Share::getBackend($itemType); - return $backend->isShareTypeAllowed(\OCP\Share::SHARE_TYPE_REMOTE); + $backend = Share::getBackend($itemType); + return $backend->isShareTypeAllowed(Share::SHARE_TYPE_REMOTE); } catch (\Exception $e) { return false; } @@ -242,14 +253,14 @@ class Sharees { $sharedUsers = $sharedGroups = []; if (!empty($existingShares)) { - if (!empty($existingShares[\OCP\Share::SHARE_TYPE_USER]) && - is_array($existingShares[\OCP\Share::SHARE_TYPE_USER])) { - $sharedUsers = $existingShares[\OCP\Share::SHARE_TYPE_USER]; + if (!empty($existingShares[Share::SHARE_TYPE_USER]) && + is_array($existingShares[Share::SHARE_TYPE_USER])) { + $sharedUsers = $existingShares[Share::SHARE_TYPE_USER]; } - if (!empty($existingShares[\OCP\Share::SHARE_TYPE_GROUP]) && - is_array($existingShares[\OCP\Share::SHARE_TYPE_GROUP])) { - $sharedGroups = $existingShares[\OCP\Share::SHARE_TYPE_GROUP]; + if (!empty($existingShares[Share::SHARE_TYPE_GROUP]) && + is_array($existingShares[Share::SHARE_TYPE_GROUP])) { + $sharedGroups = $existingShares[Share::SHARE_TYPE_GROUP]; } } @@ -260,27 +271,25 @@ class Sharees { $sharees = []; // Get users - if (in_array(\OCP\Share::SHARE_TYPE_USER, $shareTypes)) { + if (in_array(Share::SHARE_TYPE_USER, $shareTypes)) { $potentialSharees = $this->getUsers($search, $shareWithGroupOnly); $sharees = array_merge($sharees, $this->filterSharees($potentialSharees, $sharedUsers)); } // Get groups - if (in_array(\OCP\Share::SHARE_TYPE_GROUP, $shareTypes)) { + if (in_array(Share::SHARE_TYPE_GROUP, $shareTypes)) { $potentialSharees = $this->getGroups($search, $shareWithGroupOnly); $sharees = array_merge($sharees, $this->filterSharees($potentialSharees, $sharedGroups)); } // Get remote - if (in_array(\OCP\Share::SHARE_TYPE_REMOTE, $shareTypes)) { + if (in_array(Share::SHARE_TYPE_REMOTE, $shareTypes)) { $sharees = array_merge($sharees, $this->getRemote($search)); } // Sort sharees - $sorter = new \OC\Share\SearchResultSorter($search, - 'label', - \OC::$server->getLogger()); + $sorter = new SearchResultSorter($search, 'label', $this->logger); usort($sharees, array($sorter, 'sort')); //Pagination diff --git a/apps/files_sharing/appinfo/routes.php b/apps/files_sharing/appinfo/routes.php index 45ea85ff724..2000eab651f 100644 --- a/apps/files_sharing/appinfo/routes.php +++ b/apps/files_sharing/appinfo/routes.php @@ -107,7 +107,8 @@ $sharees = new \OCA\Files_Sharing\API\Sharees(\OC::$server->getGroupManager(), \OC::$server->getContactsManager(), \OC::$server->getConfig(), \OC::$server->getUserSession(), - \OC::$server->getURLGenerator()); + \OC::$server->getURLGenerator(), + \OC::$server->getLogger()); API::register('get', '/apps/files_sharing/api/v1/sharees', diff --git a/apps/files_sharing/tests/api/sharees.php b/apps/files_sharing/tests/api/sharees.php index 7efd29e592d..ddce7fddcd3 100644 --- a/apps/files_sharing/tests/api/sharees.php +++ b/apps/files_sharing/tests/api/sharees.php @@ -65,7 +65,8 @@ class ShareesTest extends TestCase { $this->contactsManager, $this->getMockBuilder('OCP\IConfig')->disableOriginalConstructor()->getMock(), $this->session, - $this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock() + $this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock(), + $this->getMockBuilder('OCP\ILogger')->disableOriginalConstructor()->getMock() ); } @@ -485,7 +486,8 @@ class ShareesTest extends TestCase { $this->contactsManager, $config, $this->session, - $this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock() + $this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock(), + $this->getMockBuilder('OCP\ILogger')->disableOriginalConstructor()->getMock() ]) ->setMethods(array('searchSharees', 'isRemoteSharingAllowed')) ->getMock(); @@ -639,7 +641,8 @@ class ShareesTest extends TestCase { $this->contactsManager, $this->getMockBuilder('OCP\IConfig')->disableOriginalConstructor()->getMock(), $this->session, - $this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock() + $this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock(), + $this->getMockBuilder('OCP\ILogger')->disableOriginalConstructor()->getMock() ]) ->setMethods(array('getUsers', 'getGroups', 'getRemote')) ->getMock(); -- GitLab From 0227cfff081a79627d038f7e30a1bdece9df4d3a Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Thu, 13 Aug 2015 10:13:23 +0200 Subject: [PATCH 033/783] Take a list of share IDs instead of the user and group names --- apps/files_sharing/api/sharees.php | 68 +++++++++++--- apps/files_sharing/appinfo/routes.php | 3 +- apps/files_sharing/tests/api/sharees.php | 114 ++++++++++++----------- 3 files changed, 118 insertions(+), 67 deletions(-) diff --git a/apps/files_sharing/api/sharees.php b/apps/files_sharing/api/sharees.php index 129a66851a7..3e802b3028a 100644 --- a/apps/files_sharing/api/sharees.php +++ b/apps/files_sharing/api/sharees.php @@ -20,8 +20,10 @@ */ namespace OCA\Files_Sharing\API; +use Doctrine\DBAL\Connection; use OC\Share\SearchResultSorter; use OCP\Contacts\IManager; +use OCP\IDBConnection; use OCP\IGroup; use OCP\IGroupManager; use OCP\ILogger; @@ -54,6 +56,9 @@ class Sharees { /** @var ILogger */ private $logger; + /** @var IDBConnection */ + private $connection; + /** * @param IGroupManager $groupManager * @param IUserManager $userManager @@ -62,6 +67,7 @@ class Sharees { * @param IUserSession $userSession * @param IURLGenerator $urlGenerator * @param ILogger $logger + * @param IDBConnection $connection */ public function __construct(IGroupManager $groupManager, IUserManager $userManager, @@ -69,7 +75,8 @@ class Sharees { IConfig $config, IUserSession $userSession, IURLGenerator $urlGenerator, - ILogger $logger) { + ILogger $logger, + IDBConnection $connection) { $this->groupManager = $groupManager; $this->userManager = $userManager; $this->contactsManager = $contactsManager; @@ -77,6 +84,7 @@ class Sharees { $this->userSession = $userSession; $this->urlGenerator = $urlGenerator; $this->logger = $logger; + $this->connection = $connection; } /** @@ -194,7 +202,7 @@ class Sharees { public function search() { $search = isset($_GET['search']) ? (string) $_GET['search'] : ''; $itemType = isset($_GET['itemType']) ? (string) $_GET['itemType'] : null; - $existingShares = isset($_GET['existingShares']) ? (array) $_GET['existingShares'] : []; + $shareIds = isset($_GET['existingShares']) ? (array) $_GET['existingShares'] : []; $page = !empty($_GET['page']) ? max(1, (int) $_GET['page']) : 1; $perPage = !empty($_GET['limit']) ? max(1, (int) $_GET['limit']) : 200; @@ -219,7 +227,7 @@ class Sharees { $shareWithGroupOnly = $this->config->getAppValue('core', 'shareapi_only_share_with_group_members', 'no') === 'yes'; - return $this->searchSharees($search, $itemType, $existingShares, $shareTypes, $page, $perPage, $shareWithGroupOnly); + return $this->searchSharees($search, $itemType, $shareIds, $shareTypes, $page, $perPage, $shareWithGroupOnly); } /** @@ -242,25 +250,27 @@ class Sharees { * * @param string $search * @param string $itemType - * @param array $existingShares + * @param array $shareIds * @param array $shareTypes * @param int $page * @param int $perPage * @param bool $shareWithGroupOnly * @return \OC_OCS_Result */ - protected function searchSharees($search, $itemType, array $existingShares, array $shareTypes, $page, $perPage, $shareWithGroupOnly) { + protected function searchSharees($search, $itemType, array $shareIds, array $shareTypes, $page, $perPage, $shareWithGroupOnly) { $sharedUsers = $sharedGroups = []; - if (!empty($existingShares)) { - if (!empty($existingShares[Share::SHARE_TYPE_USER]) && - is_array($existingShares[Share::SHARE_TYPE_USER])) { - $sharedUsers = $existingShares[Share::SHARE_TYPE_USER]; + $existingSharees = $this->getShareesForShareIds($shareIds); + + if (!empty($existingSharees)) { + if (!empty($existingSharees[Share::SHARE_TYPE_USER]) && + is_array($existingSharees[Share::SHARE_TYPE_USER])) { + $sharedUsers = $existingSharees[Share::SHARE_TYPE_USER]; } - if (!empty($existingShares[Share::SHARE_TYPE_GROUP]) && - is_array($existingShares[Share::SHARE_TYPE_GROUP])) { - $sharedGroups = $existingShares[Share::SHARE_TYPE_GROUP]; + if (!empty($existingSharees[Share::SHARE_TYPE_GROUP]) && + is_array($existingSharees[Share::SHARE_TYPE_GROUP])) { + $sharedGroups = $existingSharees[Share::SHARE_TYPE_GROUP]; } } @@ -305,7 +315,7 @@ class Sharees { $links = $this->getPaginationLinks($page, $total, [ 'search' => $search, 'itemType' => $itemType, - 'existingShares' => $existingShares, + 'existingShares' => $shareIds, 'shareType' => $shareTypes, 'limit' => $perPage, ]); @@ -332,6 +342,38 @@ class Sharees { return $sharees; } + /** + * Get a list of existing share_with's for the given share IDs (if the current user owns them) + * + * @param array $shareIds + * @return array + */ + protected function getShareesForShareIds($shareIds) { + if (empty($shareIds)) { + return []; + } + + $queryBuilder = $this->connection->getQueryBuilder(); + $exprBuilder = $queryBuilder->expr(); + + $queryBuilder->select(['share_type', 'share_with']) + ->from('share') + ->where($exprBuilder->in('id', $queryBuilder->createParameter('shareIds'))) + ->andWhere($exprBuilder->eq('uid_owner', $queryBuilder->createParameter('user'))) + ->andWhere($exprBuilder->isNull('parent')) + ->setParameter('shareIds', $shareIds, Connection::PARAM_INT_ARRAY) + ->setParameter('user', $this->userSession->getUser()->getUID()); + $query = $queryBuilder->execute(); + + $sharees = []; + while ($row = $query->fetch()) { + $sharees[$row['share_type']][] = $row['share_with']; + } + $query->closeCursor(); + + return $sharees; + } + /** * Generates a bunch of pagination links for the current page * diff --git a/apps/files_sharing/appinfo/routes.php b/apps/files_sharing/appinfo/routes.php index 2000eab651f..28dc3ab967f 100644 --- a/apps/files_sharing/appinfo/routes.php +++ b/apps/files_sharing/appinfo/routes.php @@ -108,7 +108,8 @@ $sharees = new \OCA\Files_Sharing\API\Sharees(\OC::$server->getGroupManager(), \OC::$server->getConfig(), \OC::$server->getUserSession(), \OC::$server->getURLGenerator(), - \OC::$server->getLogger()); + \OC::$server->getLogger(), + \OC::$server->getDatabaseConnection()); API::register('get', '/apps/files_sharing/api/v1/sharees', diff --git a/apps/files_sharing/tests/api/sharees.php b/apps/files_sharing/tests/api/sharees.php index ddce7fddcd3..24a659eb063 100644 --- a/apps/files_sharing/tests/api/sharees.php +++ b/apps/files_sharing/tests/api/sharees.php @@ -66,7 +66,8 @@ class ShareesTest extends TestCase { $this->getMockBuilder('OCP\IConfig')->disableOriginalConstructor()->getMock(), $this->session, $this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock(), - $this->getMockBuilder('OCP\ILogger')->disableOriginalConstructor()->getMock() + $this->getMockBuilder('OCP\ILogger')->disableOriginalConstructor()->getMock(), + \OC::$server->getDatabaseConnection() ); } @@ -349,106 +350,106 @@ class ShareesTest extends TestCase { $allTypes = [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_REMOTE]; return [ - [[], '', true, '', null, [], $allTypes, 1, 200, false], + [[], '', true, [], '', null, $allTypes, 1, 200, false], // Test itemType [[ 'search' => '', - ], '', true, '', null, [], $allTypes, 1, 200, false], + ], '', true, [], '', null, $allTypes, 1, 200, false], [[ 'search' => 'foobar', - ], '', true, 'foobar', null, [], $allTypes, 1, 200, false], + ], '', true, [], 'foobar', null, $allTypes, 1, 200, false], [[ 'search' => 0, - ], '', true, '0', null, [], $allTypes, 1, 200, false], + ], '', true, [], '0', null, $allTypes, 1, 200, false], // Test itemType [[ 'itemType' => '', - ], '', true, '', '', [], $allTypes, 1, 200, false], + ], '', true, [], '', '', $allTypes, 1, 200, false], [[ 'itemType' => 'folder', - ], '', true, '', 'folder', [], $allTypes, 1, 200, false], + ], '', true, [], '', 'folder', $allTypes, 1, 200, false], [[ 'itemType' => 0, - ], '', true, '', '0', [], $allTypes, 1, 200, false], + ], '', true, [], '', '0', $allTypes, 1, 200, false], // Test existingShares [[ 'existingShares' => [], - ], '', true, '', null, [], $allTypes, 1, 200, false], + ], '', true, [], '', null, $allTypes, 1, 200, false], [[ - 'existingShares' => [0 => ['test'], 1 => ['foobar']], - ], '', true, '', null, [0 => ['test'], 1 => ['foobar']], $allTypes, 1, 200, false], + 'existingShares' => [12, 42], + ], '', true, [12, 42], '', null, $allTypes, 1, 200, false], // Test shareType [[ - ], '', true, '', null, [], $allTypes, 1, 200, false], + ], '', true, [], '', null, $allTypes, 1, 200, false], [[ 'shareType' => 0, - ], '', true, '', null, [], [0], 1, 200, false], + ], '', true, [], '', null, [0], 1, 200, false], [[ 'shareType' => '0', - ], '', true, '', null, [], [0], 1, 200, false], + ], '', true, [], '', null, [0], 1, 200, false], [[ 'shareType' => 1, - ], '', true, '', null, [], [1], 1, 200, false], + ], '', true, [], '', null, [1], 1, 200, false], [[ 'shareType' => 12, - ], '', true, '', null, [], [], 1, 200, false], + ], '', true, [], '', null, [], 1, 200, false], [[ 'shareType' => 'foobar', - ], '', true, '', null, [], $allTypes, 1, 200, false], + ], '', true, [], '', null, $allTypes, 1, 200, false], [[ 'shareType' => [0, 1, 2], - ], '', true, '', null, [], [0, 1], 1, 200, false], + ], '', true, [], '', null, [0, 1], 1, 200, false], [[ 'shareType' => [0, 1], - ], '', true, '', null, [], [0, 1], 1, 200, false], + ], '', true, [], '', null, [0, 1], 1, 200, false], [[ 'shareType' => $allTypes, - ], '', true, '', null, [], $allTypes, 1, 200, false], + ], '', true, [], '', null, $allTypes, 1, 200, false], [[ 'shareType' => $allTypes, - ], '', false, '', null, [], [0, 1], 1, 200, false], + ], '', false, [], '', null, [0, 1], 1, 200, false], // Test pagination [[ 'page' => 0, - ], '', true, '', null, [], $allTypes, 1, 200, false], + ], '', true, [], '', null, $allTypes, 1, 200, false], [[ 'page' => '0', - ], '', true, '', null, [], $allTypes, 1, 200, false], + ], '', true, [], '', null, $allTypes, 1, 200, false], [[ 'page' => -1, - ], '', true, '', null, [], $allTypes, 1, 200, false], + ], '', true, [], '', null, $allTypes, 1, 200, false], [[ 'page' => 1, - ], '', true, '', null, [], $allTypes, 1, 200, false], + ], '', true, [], '', null, $allTypes, 1, 200, false], [[ 'page' => 10, - ], '', true, '', null, [], $allTypes, 10, 200, false], + ], '', true, [], '', null, $allTypes, 10, 200, false], // Test limit [[ 'limit' => 0, - ], '', true, '', null, [], $allTypes, 1, 200, false], + ], '', true, [], '', null, $allTypes, 1, 200, false], [[ 'limit' => '0', - ], '', true, '', null, [], $allTypes, 1, 200, false], + ], '', true, [], '', null, $allTypes, 1, 200, false], [[ 'limit' => -1, - ], '', true, '', null, [], $allTypes, 1, 1, false], + ], '', true, [], '', null, $allTypes, 1, 1, false], [[ 'limit' => 1, - ], '', true, '', null, [], $allTypes, 1, 1, false], + ], '', true, [], '', null, $allTypes, 1, 1, false], [[ 'limit' => 10, - ], '', true, '', null, [], $allTypes, 1, 10, false], + ], '', true, [], '', null, $allTypes, 1, 10, false], // Test $shareWithGroupOnly setting - [[], 'no', true, '', null, [], $allTypes, 1, 200, false], - [[], 'yes', true, '', null, [], $allTypes, 1, 200, true], + [[], 'no', true, [], '', null, $allTypes, 1, 200, false], + [[], 'yes', true, [], '', null, $allTypes, 1, 200, true], ]; } @@ -459,15 +460,15 @@ class ShareesTest extends TestCase { * @param array $getData * @param string $apiSetting * @param bool $remoteSharingEnabled + * @param array $shareIds * @param string $search * @param string $itemType - * @param array $existingShares * @param array $shareTypes * @param int $page * @param int $perPage * @param bool $shareWithGroupOnly */ - public function testSearch($getData, $apiSetting, $remoteSharingEnabled, $search, $itemType, $existingShares, $shareTypes, $page, $perPage, $shareWithGroupOnly) { + public function testSearch($getData, $apiSetting, $remoteSharingEnabled, $shareIds, $search, $itemType, $shareTypes, $page, $perPage, $shareWithGroupOnly) { $oldGet = $_GET; $_GET = $getData; @@ -487,21 +488,22 @@ class ShareesTest extends TestCase { $config, $this->session, $this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock(), - $this->getMockBuilder('OCP\ILogger')->disableOriginalConstructor()->getMock() + $this->getMockBuilder('OCP\ILogger')->disableOriginalConstructor()->getMock(), + \OC::$server->getDatabaseConnection() ]) ->setMethods(array('searchSharees', 'isRemoteSharingAllowed')) ->getMock(); $sharees->expects($this->once()) ->method('searchSharees') - ->with($search, $itemType, $existingShares, $shareTypes, $page, $perPage, $shareWithGroupOnly) + ->with($search, $itemType, $shareIds, $shareTypes, $page, $perPage, $shareWithGroupOnly) ->willReturnCallback(function - ($isearch, $iitemType, $iexistingShares, $ishareTypes, $ipage, $iperPage, $ishareWithGroupOnly) - use ($search, $itemType, $existingShares, $shareTypes, $page, $perPage, $shareWithGroupOnly) { + ($isearch, $iitemType, $ishareIds, $ishareTypes, $ipage, $iperPage, $ishareWithGroupOnly) + use ($search, $itemType, $shareIds, $shareTypes, $page, $perPage, $shareWithGroupOnly) { // We are doing strict comparisons here, so we can differ 0/'' and null on shareType/itemType $this->assertSame($search, $isearch); $this->assertSame($itemType, $iitemType); - $this->assertSame($existingShares, $iexistingShares); + $this->assertSame($shareIds, $ishareIds); $this->assertSame($shareTypes, $ishareTypes); $this->assertSame($page, $ipage); $this->assertSame($perPage, $iperPage); @@ -540,11 +542,11 @@ class ShareesTest extends TestCase { public function dataSearchSharees() { return [ - ['test', 'folder', [], [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_REMOTE], 1, 2, false, [], [], [], [], 0, false], - ['test', 'folder', [0 => ['test1'], 1 => ['test2 group']], [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_REMOTE], 1, 2, false, [], [], [], [], 0, false], + ['test', 'folder', [], [], [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_REMOTE], 1, 2, false, [], [], [], [], 0, false], + ['test', 'folder', [1, 2], [0 => ['test1'], 1 => ['test2 group']], [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_REMOTE], 1, 2, false, [], [], [], [], 0, false], // First page with 2 of 3 results [ - 'test', 'folder', [], [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_REMOTE], 1, 2, false, [ + 'test', 'folder', [], [], [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_REMOTE], 1, 2, false, [ ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], ], [ ['label' => 'testgroup1', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_GROUP, 'shareWith' => 'testgroup1']], @@ -557,7 +559,7 @@ class ShareesTest extends TestCase { ], // Second page with the 3rd result [ - 'test', 'folder', [], [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_REMOTE], 2, 2, false, [ + 'test', 'folder', [], [], [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_REMOTE], 2, 2, false, [ ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], ], [ ['label' => 'testgroup1', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_GROUP, 'shareWith' => 'testgroup1']], @@ -569,7 +571,7 @@ class ShareesTest extends TestCase { ], // No groups requested [ - 'test', 'folder', [], [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_REMOTE], 1, 2, false, [ + 'test', 'folder', [], [], [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_REMOTE], 1, 2, false, [ ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], ], null, [ ['label' => 'testz@remote', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_REMOTE, 'shareWith' => 'testz@remote']], @@ -580,7 +582,7 @@ class ShareesTest extends TestCase { ], // Ingnoring already shared user [ - 'test', 'folder', [\OCP\Share::SHARE_TYPE_USER => ['test1']], [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_REMOTE], 1, 2, false, [ + 'test', 'folder', [1], [\OCP\Share::SHARE_TYPE_USER => ['test1']], [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_REMOTE], 1, 2, false, [ ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], ], [ ['label' => 'testgroup1', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_GROUP, 'shareWith' => 'testgroup1']], @@ -593,7 +595,7 @@ class ShareesTest extends TestCase { ], // Share type restricted to user - Only one user [ - 'test', 'folder', [], [\OCP\Share::SHARE_TYPE_USER], 1, 2, false, [ + 'test', 'folder', [], [], [\OCP\Share::SHARE_TYPE_USER], 1, 2, false, [ ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], ], null, null, [ ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], @@ -601,7 +603,7 @@ class ShareesTest extends TestCase { ], // Share type restricted to user - Multipage result [ - 'test', 'folder', [], [\OCP\Share::SHARE_TYPE_USER], 1, 2, false, [ + 'test', 'folder', [], [], [\OCP\Share::SHARE_TYPE_USER], 1, 2, false, [ ['label' => 'test 1', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], ['label' => 'test 2', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], ['label' => 'test 3', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test3']], @@ -612,7 +614,7 @@ class ShareesTest extends TestCase { ], // Share type restricted to user - Only user already shared [ - 'test', 'folder', [\OCP\Share::SHARE_TYPE_USER => ['test1']], [\OCP\Share::SHARE_TYPE_USER], 1, 2, false, [ + 'test', 'folder', [1], [\OCP\Share::SHARE_TYPE_USER => ['test1']], [\OCP\Share::SHARE_TYPE_USER], 1, 2, false, [ ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], ], null, null, [], 0, false, ], @@ -624,6 +626,7 @@ class ShareesTest extends TestCase { * * @param string $searchTerm * @param string $itemType + * @param array $shareIds * @param array $existingShares * @param array $shareTypes * @param int $page @@ -631,7 +634,7 @@ class ShareesTest extends TestCase { * @param bool $shareWithGroupOnly * @param array $expected */ - public function testSearchSharees($searchTerm, $itemType, array $existingShares, array $shareTypes, $page, $perPage, $shareWithGroupOnly, + public function testSearchSharees($searchTerm, $itemType, array $shareIds, array $existingShares, array $shareTypes, $page, $perPage, $shareWithGroupOnly, $mockedUserResult, $mockedGroupsResult, $mockedRemotesResult, $expected, $totalItems, $nextLink) { /** @var \PHPUnit_Framework_MockObject_MockObject|\OCA\Files_Sharing\API\Sharees $sharees */ $sharees = $this->getMockBuilder('\OCA\Files_Sharing\API\Sharees') @@ -642,10 +645,15 @@ class ShareesTest extends TestCase { $this->getMockBuilder('OCP\IConfig')->disableOriginalConstructor()->getMock(), $this->session, $this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock(), - $this->getMockBuilder('OCP\ILogger')->disableOriginalConstructor()->getMock() + $this->getMockBuilder('OCP\ILogger')->disableOriginalConstructor()->getMock(), + \OC::$server->getDatabaseConnection() ]) - ->setMethods(array('getUsers', 'getGroups', 'getRemote')) + ->setMethods(array('getShareesForShareIds', 'getUsers', 'getGroups', 'getRemote')) ->getMock(); + $sharees->expects($this->once()) + ->method('getShareesForShareIds') + ->with($shareIds) + ->willReturn($existingShares); $sharees->expects(($mockedUserResult === null) ? $this->never() : $this->once()) ->method('getUsers') ->with($searchTerm, $shareWithGroupOnly) @@ -660,7 +668,7 @@ class ShareesTest extends TestCase { ->willReturn($mockedRemotesResult); /** @var \OC_OCS_Result $ocs */ - $ocs = $this->invokePrivate($sharees, 'searchSharees', [$searchTerm, $itemType, $existingShares, $shareTypes, $page, $perPage, $shareWithGroupOnly]); + $ocs = $this->invokePrivate($sharees, 'searchSharees', [$searchTerm, $itemType, $shareIds, $shareTypes, $page, $perPage, $shareWithGroupOnly]); $this->assertInstanceOf('\OC_OCS_Result', $ocs); $this->assertEquals($expected, $ocs->getData()); -- GitLab From 83b88c9a264a46f393df95e6c57793f0300495da Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Mon, 17 Aug 2015 12:13:49 +0200 Subject: [PATCH 034/783] Do not return the current user himself --- apps/files_sharing/api/sharees.php | 5 +++ apps/files_sharing/tests/api/sharees.php | 44 +++++++++++++++++++++--- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/apps/files_sharing/api/sharees.php b/apps/files_sharing/api/sharees.php index 3e802b3028a..f12677265bf 100644 --- a/apps/files_sharing/api/sharees.php +++ b/apps/files_sharing/api/sharees.php @@ -116,6 +116,11 @@ class Sharees { foreach ($users as $uid => $displayName) { + if ($uid === $this->userSession->getUser()->getUID()) { + // Skip the current user + continue; + } + $sharees[] = [ 'label' => $displayName, 'value' => [ diff --git a/apps/files_sharing/tests/api/sharees.php b/apps/files_sharing/tests/api/sharees.php index 24a659eb063..9b7a21b0635 100644 --- a/apps/files_sharing/tests/api/sharees.php +++ b/apps/files_sharing/tests/api/sharees.php @@ -127,6 +127,20 @@ class ShareesTest extends TestCase { ['label' => 'Test Two', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], ] ], + [ + 'test', + false, + [], + [ + $this->getUserMock('test1', 'Test One'), + $this->getUserMock('test2', 'Test Two'), + $this->getUserMock('admin', 'Should be removed'), + ], + [ + ['label' => 'Test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ['label' => 'Test Two', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], + ] + ], [ 'test', true, @@ -175,6 +189,26 @@ class ShareesTest extends TestCase { ['label' => 'Test Two', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], ] ], + [ + 'test', + true, + ['abc', 'xyz'], + [ + ['abc', 'test', -1, 0, [ + 'test1' => 'Test One', + ]], + ['xyz', 'test', -1, 0, [ + 'test2' => 'Test Two', + ]], + ['admin', 'Should be removed', -1, 0, [ + 'test2' => 'Test Two', + ]], + ], + [ + ['label' => 'Test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ['label' => 'Test Two', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], + ] + ], ]; } @@ -188,17 +222,17 @@ class ShareesTest extends TestCase { * @param array $expected */ public function testGetUsers($searchTerm, $shareWithGroupOnly, $groupResponse, $userResponse, $expected) { + $user = $this->getUserMock('admin', 'Administrator'); + $this->session->expects($this->any()) + ->method('getUser') + ->willReturn($user); + if (!$shareWithGroupOnly) { $this->userManager->expects($this->once()) ->method('searchDisplayName') ->with($searchTerm) ->willReturn($userResponse); } else { - $user = $this->getUserMock('admin', 'Administrator'); - $this->session->expects($this->any()) - ->method('getUser') - ->willReturn($user); - $this->groupManager->expects($this->once()) ->method('getUserGroupIds') ->with($user) -- GitLab From 6b69e7b1dae71601db8486df4c30ab9d73419694 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Mon, 17 Aug 2015 12:43:20 +0200 Subject: [PATCH 035/783] Add tests for "getShareesForShareIds()" --- apps/files_sharing/tests/api/sharees.php | 93 ++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/apps/files_sharing/tests/api/sharees.php b/apps/files_sharing/tests/api/sharees.php index 9b7a21b0635..675cc7bede0 100644 --- a/apps/files_sharing/tests/api/sharees.php +++ b/apps/files_sharing/tests/api/sharees.php @@ -21,6 +21,8 @@ namespace OCA\Files_Sharing\Tests\API; +use Doctrine\DBAL\Connection; +use OC\Share\Constants; use OCA\Files_Sharing\API\Sharees; use OCA\Files_sharing\Tests\TestCase; @@ -781,6 +783,97 @@ class ShareesTest extends TestCase { $this->assertEquals($expectedSharees, $this->invokePrivate($this->sharees, 'filterSharees', [$potentialSharees, $existingSharees])); } + public function dataGetShareesForShareIds() { + return [ + [[], []], + [[1, 2, 3], [Constants::SHARE_TYPE_USER => ['user1'], Constants::SHARE_TYPE_GROUP => ['group1']]], + ]; + } + + /** + * @dataProvider dataGetShareesForShareIds + * + * @param array $shareIds + * @param array $expectedSharees + */ + public function testGetShareesForShareIds(array $shareIds, array $expectedSharees) { + $owner = $this->getUniqueID('test'); + $shares2delete = []; + + if (!empty($shareIds)) { + $userShare = $this->createShare(Constants::SHARE_TYPE_USER, 'user1', $owner, null); + $shares2delete[] = $userShare; + $shares2delete[] = $this->createShare(Constants::SHARE_TYPE_USER, 'user3', $owner . '2', null); + + $groupShare = $this->createShare(Constants::SHARE_TYPE_GROUP, 'group1', $owner, null); + $shares2delete[] = $groupShare; + $groupShare2 = $this->createShare(Constants::SHARE_TYPE_GROUP, 'group2', $owner . '2', null); + $shares2delete[] = $groupShare2; + + $shares2delete[] = $this->createShare($this->invokePrivate(new Constants(), 'shareTypeGroupUserUnique'), 'user2', $owner, $groupShare); + $shares2delete[] = $this->createShare($this->invokePrivate(new Constants(), 'shareTypeGroupUserUnique'), 'user4', $owner, $groupShare2); + } + + $user = $this->getUserMock($owner, 'Sharee OCS test user'); + $this->session->expects($this->any()) + ->method('getUser') + ->willReturn($user); + $this->assertEquals($expectedSharees, $this->invokePrivate($this->sharees, 'getShareesForShareIds', [$shares2delete])); + + $this->deleteShares($shares2delete); + } + + /** + * @param int $type + * @param string $with + * @param string $owner + * @param int $parent + * @return int + */ + protected function createShare($type, $with, $owner, $parent) { + $connection = \OC::$server->getDatabaseConnection(); + $queryBuilder = $connection->getQueryBuilder(); + $queryBuilder->insert('share') + ->values([ + 'share_type' => $queryBuilder->createParameter('share_type'), + 'share_with' => $queryBuilder->createParameter('share_with'), + 'uid_owner' => $queryBuilder->createParameter('uid_owner'), + 'parent' => $queryBuilder->createParameter('parent'), + 'item_type' => $queryBuilder->expr()->literal('fake'), + 'item_source' => $queryBuilder->expr()->literal(''), + 'item_target' => $queryBuilder->expr()->literal(''), + 'file_source' => $queryBuilder->expr()->literal(0), + 'file_target' => $queryBuilder->expr()->literal(''), + 'permissions' => $queryBuilder->expr()->literal(0), + 'stime' => $queryBuilder->expr()->literal(0), + 'accepted' => $queryBuilder->expr()->literal(0), + 'expiration' => $queryBuilder->expr()->literal(''), + 'token' => $queryBuilder->expr()->literal(''), + 'mail_send' => $queryBuilder->expr()->literal(0), + ]) + ->setParameters([ + 'share_type' => $type, + 'share_with' => $with, + 'uid_owner' => $owner, + 'parent' => $parent, + ]) + ->execute(); + return $connection->lastInsertId('share'); + } + + /** + * @param int[] $shareIds + * @return null + */ + protected function deleteShares(array $shareIds) { + $connection = \OC::$server->getDatabaseConnection(); + $queryBuilder = $connection->getQueryBuilder(); + $queryBuilder->delete('share') + ->where($queryBuilder->expr()->in('id', $queryBuilder->createParameter('ids'))) + ->setParameter('ids', $shareIds, Connection::PARAM_INT_ARRAY) + ->execute(); + } + public function dataGetPaginationLinks() { return [ [1, 1, ['limit' => 2], []], -- GitLab From 937586a3f0260bbc976d13637a708c530c708517 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Mon, 17 Aug 2015 12:44:23 +0200 Subject: [PATCH 036/783] Rename file to match the class name --- apps/files_sharing/tests/api/{sharees.php => shareestest.php} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/files_sharing/tests/api/{sharees.php => shareestest.php} (100%) diff --git a/apps/files_sharing/tests/api/sharees.php b/apps/files_sharing/tests/api/shareestest.php similarity index 100% rename from apps/files_sharing/tests/api/sharees.php rename to apps/files_sharing/tests/api/shareestest.php -- GitLab From f4186d3dfccc80c6a819c94ece8883c981a9d013 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 19 Aug 2015 10:14:15 +0200 Subject: [PATCH 037/783] Fix wrong value for datetime field --- apps/files_sharing/tests/api/shareestest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/files_sharing/tests/api/shareestest.php b/apps/files_sharing/tests/api/shareestest.php index 675cc7bede0..c856b93d0fe 100644 --- a/apps/files_sharing/tests/api/shareestest.php +++ b/apps/files_sharing/tests/api/shareestest.php @@ -847,7 +847,7 @@ class ShareesTest extends TestCase { 'permissions' => $queryBuilder->expr()->literal(0), 'stime' => $queryBuilder->expr()->literal(0), 'accepted' => $queryBuilder->expr()->literal(0), - 'expiration' => $queryBuilder->expr()->literal(''), + 'expiration' => $queryBuilder->createParameter('expiration'), 'token' => $queryBuilder->expr()->literal(''), 'mail_send' => $queryBuilder->expr()->literal(0), ]) @@ -857,6 +857,7 @@ class ShareesTest extends TestCase { 'uid_owner' => $owner, 'parent' => $parent, ]) + ->setParameter('expiration', null, 'datetime') ->execute(); return $connection->lastInsertId('share'); } -- GitLab From ac8941f6ac919464b672db5961f14604d681c628 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 19 Aug 2015 12:06:00 +0200 Subject: [PATCH 038/783] Manually query for the last id --- apps/files_sharing/tests/api/shareestest.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/files_sharing/tests/api/shareestest.php b/apps/files_sharing/tests/api/shareestest.php index c856b93d0fe..3b2e17d9fdc 100644 --- a/apps/files_sharing/tests/api/shareestest.php +++ b/apps/files_sharing/tests/api/shareestest.php @@ -859,7 +859,17 @@ class ShareesTest extends TestCase { ]) ->setParameter('expiration', null, 'datetime') ->execute(); - return $connection->lastInsertId('share'); + + $queryBuilder = $connection->getQueryBuilder(); + $query = $queryBuilder->select('id') + ->from('share') + ->orderBy('id', 'DESC') + ->setMaxResults(1) + ->execute(); + $share = $query->fetch(); + $query->closeCursor(); + + return (int) $share['id']; } /** -- GitLab From aa2a894eb0b1e7df6384abc56b0d3a375a062936 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 26 Aug 2015 09:40:20 +0200 Subject: [PATCH 039/783] Fix performance issues of the sharees api --- apps/files_sharing/api/sharees.php | 326 ++++++++++++-------------- apps/files_sharing/appinfo/routes.php | 4 +- 2 files changed, 151 insertions(+), 179 deletions(-) diff --git a/apps/files_sharing/api/sharees.php b/apps/files_sharing/api/sharees.php index f12677265bf..4454d647b1c 100644 --- a/apps/files_sharing/api/sharees.php +++ b/apps/files_sharing/api/sharees.php @@ -20,13 +20,12 @@ */ namespace OCA\Files_Sharing\API; -use Doctrine\DBAL\Connection; -use OC\Share\SearchResultSorter; use OCP\Contacts\IManager; -use OCP\IDBConnection; use OCP\IGroup; use OCP\IGroupManager; use OCP\ILogger; +use OCP\IRequest; +use OCP\IUser; use OCP\IUserManager; use OCP\IConfig; use OCP\IUserSession; @@ -50,14 +49,37 @@ class Sharees { /** @var IUserSession */ private $userSession; + /** @var IRequest */ + private $request; + /** @var IURLGenerator */ private $urlGenerator; /** @var ILogger */ private $logger; - /** @var IDBConnection */ - private $connection; + /** @var bool */ + private $shareWithGroupOnly; + + /** @var int */ + protected $offset = 0; + + /** @var int */ + protected $limit = 10; + + /** @var array */ + protected $result = [ + 'exact' => [ + 'users' => [], + 'groups' => [], + 'remotes' => [], + ], + 'users' => [], + 'groups' => [], + 'remotes' => [], + ]; + + protected $reachedEndFor = []; /** * @param IGroupManager $groupManager @@ -66,8 +88,8 @@ class Sharees { * @param IConfig $config * @param IUserSession $userSession * @param IURLGenerator $urlGenerator + * @param IRequest $request * @param ILogger $logger - * @param IDBConnection $connection */ public function __construct(IGroupManager $groupManager, IUserManager $userManager, @@ -75,8 +97,8 @@ class Sharees { IConfig $config, IUserSession $userSession, IURLGenerator $urlGenerator, - ILogger $logger, - IDBConnection $connection) { + IRequest $request, + ILogger $logger) { $this->groupManager = $groupManager; $this->userManager = $userManager; $this->contactsManager = $contactsManager; @@ -84,67 +106,82 @@ class Sharees { $this->userSession = $userSession; $this->urlGenerator = $urlGenerator; $this->logger = $logger; - $this->connection = $connection; } /** * @param string $search - * @param bool $shareWithGroupOnly - * - * @return array possible sharees */ - protected function getUsers($search, $shareWithGroupOnly) { - $sharees = []; - - $users = []; - if ($shareWithGroupOnly) { + protected function getUsers($search) { + $this->result['users'] = $this->result['exact']['users'] = $users = []; + + if ($this->shareWithGroupOnly) { // Search in all the groups this user is part of $userGroups = $this->groupManager->getUserGroupIds($this->userSession->getUser()); foreach ($userGroups as $userGroup) { - $users = array_merge($users, $this->groupManager->displayNamesInGroup($userGroup, $search)); + $users = $this->groupManager->displayNamesInGroup($userGroup, $search, $this->limit, $this->offset); + foreach ($users as $uid => $userDisplayName) { + $users[$uid] = $userDisplayName; + } } - $users = array_unique($users); } else { // Search in all users - $users_tmp = $this->userManager->searchDisplayName($search); + $usersTmp = $this->userManager->searchDisplayName($search, $this->limit, $this->offset); - // Put in array that maps uid => displayName - foreach($users_tmp as $user) { + foreach ($usersTmp as $user) { $users[$user->getUID()] = $user->getDisplayName(); } } + if (sizeof($users) < $this->limit) { + $this->reachedEndFor[] = 'users'; + } - foreach ($users as $uid => $displayName) { - if ($uid === $this->userSession->getUser()->getUID()) { - // Skip the current user - continue; - } - - $sharees[] = [ - 'label' => $displayName, - 'value' => [ - 'shareType' => Share::SHARE_TYPE_USER, + $foundUserById = false; + foreach ($users as $uid => $userDisplayName) { + if ($uid === $search || $userDisplayName === $search) { + if ($uid === $search) { + $foundUserById = true; + } + $this->result['exact']['users'][] = [ + 'shareWith' => $search, + 'label' => $search, + ]; + } else { + $this->result['users'][] = [ 'shareWith' => $uid, - ], - ]; + 'label' => $userDisplayName, + ]; + } } - return $sharees; + if ($this->offset === 0 && !$foundUserById) { + // On page one we try if the search result has a direct hit on the + // user id and if so, we add that to the exact match list + $user = $this->userManager->get($search); + if ($user instanceof IUser) { + array_push($this->result['exact']['users'], [ + 'shareWith' => $user->getUID(), + 'label' => $user->getDisplayName(), + ]); + } + } } /** * @param string $search - * @param bool $shareWithGroupOnly - * - * @return array possible sharees */ - protected function getGroups($search, $shareWithGroupOnly) { - $sharees = []; - $groups = $this->groupManager->search($search); + protected function getGroups($search) { + $this->result['groups'] = $this->result['exact']['groups'] = []; + + $groups = $this->groupManager->search($search, $this->limit, $this->offset); $groups = array_map(function (IGroup $group) { return $group->getGID(); }, $groups); - if (!empty($groups) && $shareWithGroupOnly) { + if (sizeof($groups) < $this->limit) { + $this->reachedEndFor[] = 'groups'; + } + + $userGroups = []; + if (!empty($groups) && $this->shareWithGroupOnly) { // Intersect all the groups that match with the groups this user is a member of $userGroups = $this->groupManager->getUserGroups($this->userSession->getUser()); $userGroups = array_map(function (IGroup $group) { return $group->getGID(); }, $userGroups); @@ -152,53 +189,68 @@ class Sharees { } foreach ($groups as $gid) { - $sharees[] = [ - 'label' => $gid, - 'value' => [ - 'shareType' => Share::SHARE_TYPE_GROUP, + if ($gid === $search) { + $this->result['exact']['groups'][] = [ + 'shareWith' => $search, + 'label' => $search, + ]; + } else { + $this->result['groups'][] = [ 'shareWith' => $gid, - ], - ]; + 'label' => $gid, + ]; + } } - return $sharees; + if ($this->offset === 0 && empty($this->result['exact']['groups'])) { + // On page one we try if the search result has a direct hit on the + // user id and if so, we add that to the exact match list + $group = $this->groupManager->get($search); + if ($group instanceof IGroup && (!$this->shareWithGroupOnly || array_intersect([$group], $userGroups))) { + array_push($this->result['exact']['users'], [ + 'shareWith' => $group->getGID(), + 'label' => $group->getGID(), + ]); + } + } } /** * @param string $search - * * @return array possible sharees */ protected function getRemote($search) { - $sharees = []; + $this->result['remotes'] = []; - if (substr_count($search, '@') >= 1) { - $sharees[] = [ + if (substr_count($search, '@') >= 1 && $this->offset === 0) { + $this->result['exact']['remotes'][] = [ + 'shareWith' => $search, 'label' => $search, - 'value' => [ - 'shareType' => Share::SHARE_TYPE_REMOTE, - 'shareWith' => $search, - ], ]; } // Search in contacts + //@todo Pagination missing $addressBookContacts = $this->contactsManager->search($search, ['CLOUD', 'FN']); foreach ($addressBookContacts as $contact) { if (isset($contact['CLOUD'])) { foreach ($contact['CLOUD'] as $cloudId) { - $sharees[] = [ - 'label' => $contact['FN'] . ' (' . $cloudId . ')', - 'value' => [ - 'shareType' => Share::SHARE_TYPE_REMOTE, - 'shareWith' => $cloudId - ] - ]; + if ($contact['FN'] === $search || $cloudId === $search) { + $this->result['exact']['remotes'][] = [ + 'shareWith' => $cloudId, + 'label' => $contact['FN'], + ]; + } else { + $this->result['remotes'][] = [ + 'shareWith' => $cloudId, + 'label' => $contact['FN'], + ]; + } } } } - return $sharees; + $this->reachedEndFor[] = 'remotes'; } /** @@ -230,9 +282,11 @@ class Sharees { $shareTypes = array_diff($shareTypes, [Share::SHARE_TYPE_REMOTE]); } - $shareWithGroupOnly = $this->config->getAppValue('core', 'shareapi_only_share_with_group_members', 'no') === 'yes'; + $this->shareWithGroupOnly = $this->config->getAppValue('core', 'shareapi_only_share_with_group_members', 'no') === 'yes'; + $this->limit = (int) $perPage; + $this->offset = $perPage * ($page - 1); - return $this->searchSharees($search, $itemType, $shareIds, $shareTypes, $page, $perPage, $shareWithGroupOnly); + return $this->searchSharees($search, $itemType, $shareIds, $shareTypes, $page, $perPage); } /** @@ -259,150 +313,68 @@ class Sharees { * @param array $shareTypes * @param int $page * @param int $perPage - * @param bool $shareWithGroupOnly * @return \OC_OCS_Result */ - protected function searchSharees($search, $itemType, array $shareIds, array $shareTypes, $page, $perPage, $shareWithGroupOnly) { - - $sharedUsers = $sharedGroups = []; - $existingSharees = $this->getShareesForShareIds($shareIds); - - if (!empty($existingSharees)) { - if (!empty($existingSharees[Share::SHARE_TYPE_USER]) && - is_array($existingSharees[Share::SHARE_TYPE_USER])) { - $sharedUsers = $existingSharees[Share::SHARE_TYPE_USER]; - } - - if (!empty($existingSharees[Share::SHARE_TYPE_GROUP]) && - is_array($existingSharees[Share::SHARE_TYPE_GROUP])) { - $sharedGroups = $existingSharees[Share::SHARE_TYPE_GROUP]; - } - } - + protected function searchSharees($search, $itemType, array $shareIds, array $shareTypes, $page, $perPage) { // Verify arguments if ($itemType === null) { return new \OC_OCS_Result(null, 400, 'missing itemType'); } - $sharees = []; // Get users if (in_array(Share::SHARE_TYPE_USER, $shareTypes)) { - $potentialSharees = $this->getUsers($search, $shareWithGroupOnly); - $sharees = array_merge($sharees, $this->filterSharees($potentialSharees, $sharedUsers)); + $this->getUsers($search); } // Get groups if (in_array(Share::SHARE_TYPE_GROUP, $shareTypes)) { - $potentialSharees = $this->getGroups($search, $shareWithGroupOnly); - $sharees = array_merge($sharees, $this->filterSharees($potentialSharees, $sharedGroups)); + $this->getGroups($search); } // Get remote if (in_array(Share::SHARE_TYPE_REMOTE, $shareTypes)) { - $sharees = array_merge($sharees, $this->getRemote($search)); + $this->getRemote($search); } - - // Sort sharees - $sorter = new SearchResultSorter($search, 'label', $this->logger); - usort($sharees, array($sorter, 'sort')); - - //Pagination - $start = ($page - 1) * $perPage; - $total = sizeof($sharees); - - $sharees = array_slice($sharees, $start, $perPage); - - $response = new \OC_OCS_Result($sharees); - $response->setTotalItems($total); + $response = new \OC_OCS_Result($this->result); $response->setItemsPerPage($perPage); - $links = $this->getPaginationLinks($page, $total, [ - 'search' => $search, - 'itemType' => $itemType, - 'existingShares' => $shareIds, - 'shareType' => $shareTypes, - 'limit' => $perPage, - ]); - - if (!empty($links)) { - $response->addHeader('Link', implode(', ', $links)); + if (sizeof($this->reachedEndFor) < 3) { + $response->addHeader('Link', $this->getPaginationLink($page, [ + 'search' => $search, + 'itemType' => $itemType, + 'existingShares' => $shareIds, + 'shareType' => $shareTypes, + 'limit' => $perPage, + ])); } return $response; } /** - * Filter out already existing shares from a list of potential sharees - * - * @param array $potentialSharees - * @param array $existingSharees - * @return array - */ - protected function filterSharees($potentialSharees, $existingSharees) { - $sharees = array_filter($potentialSharees, function ($sharee) use ($existingSharees) { - return in_array($sharee['value']['shareWith'], $existingSharees) ? null : $sharee; - }); - - return $sharees; - } - - /** - * Get a list of existing share_with's for the given share IDs (if the current user owns them) + * Generates a bunch of pagination links for the current page * - * @param array $shareIds - * @return array + * @param int $page Current page + * @param array $params Parameters for the URL + * @return string */ - protected function getShareesForShareIds($shareIds) { - if (empty($shareIds)) { - return []; - } - - $queryBuilder = $this->connection->getQueryBuilder(); - $exprBuilder = $queryBuilder->expr(); - - $queryBuilder->select(['share_type', 'share_with']) - ->from('share') - ->where($exprBuilder->in('id', $queryBuilder->createParameter('shareIds'))) - ->andWhere($exprBuilder->eq('uid_owner', $queryBuilder->createParameter('user'))) - ->andWhere($exprBuilder->isNull('parent')) - ->setParameter('shareIds', $shareIds, Connection::PARAM_INT_ARRAY) - ->setParameter('user', $this->userSession->getUser()->getUID()); - $query = $queryBuilder->execute(); - - $sharees = []; - while ($row = $query->fetch()) { - $sharees[$row['share_type']][] = $row['share_with']; + protected function getPaginationLink($page, array $params) { + if ($this->isV2()) { + $url = $this->urlGenerator->getAbsoluteURL('/ocs/v2.php/apps/files_sharing/api/v1/sharees') . '?'; + } else { + $url = $this->urlGenerator->getAbsoluteURL('/ocs/v1.php/apps/files_sharing/api/v1/sharees') . '?'; } - $query->closeCursor(); + $params['page'] = $page + 1; + $link = '<' . $url . http_build_query($params) . '>; rel="next"'; - return $sharees; + return $link; } /** - * Generates a bunch of pagination links for the current page - * - * @param int $page Current page - * @param int $total Number of total items that need to be paginated - * @param array $params Parameters for the URL - * @return array + * @return bool */ - protected function getPaginationLinks($page, $total, array $params) { - $url = $this->urlGenerator->getAbsoluteURL('/ocs/v1.php/apps/files_sharing/api/v1/sharees') . '?'; - - $links = []; - if ($page > 1) { - $params['page'] = 1; - $links[] = '<' . $url . http_build_query($params) . '>; rel="first"'; - $params['page'] = $page - 1; - $links[] = '<' . $url . http_build_query($params) . '>; rel="prev"'; - } - if ($page * $params['limit'] < $total) { - $params['page'] = $page + 1; - $links[] = '<' . $url . http_build_query($params) . '>; rel="next"'; - $params['page'] = ceil($total / $params['limit']); - $links[] = '<' . $url . http_build_query($params) . '>; rel="last"'; - } - return $links; + protected function isV2() { + return $this->request->getScriptName() === '/ocs/v2.php'; } } diff --git a/apps/files_sharing/appinfo/routes.php b/apps/files_sharing/appinfo/routes.php index 28dc3ab967f..375124cb730 100644 --- a/apps/files_sharing/appinfo/routes.php +++ b/apps/files_sharing/appinfo/routes.php @@ -108,8 +108,8 @@ $sharees = new \OCA\Files_Sharing\API\Sharees(\OC::$server->getGroupManager(), \OC::$server->getConfig(), \OC::$server->getUserSession(), \OC::$server->getURLGenerator(), - \OC::$server->getLogger(), - \OC::$server->getDatabaseConnection()); + \OC::$server->getRequest(), + \OC::$server->getLogger()); API::register('get', '/apps/files_sharing/api/v1/sharees', -- GitLab From 2a6e676048f1f8e521e5b6c189e71e02bb2e5005 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 26 Aug 2015 10:51:26 +0200 Subject: [PATCH 040/783] Adjust tests --- apps/files_sharing/api/sharees.php | 77 ++- apps/files_sharing/tests/api/shareestest.php | 674 ++++++++----------- 2 files changed, 348 insertions(+), 403 deletions(-) diff --git a/apps/files_sharing/api/sharees.php b/apps/files_sharing/api/sharees.php index 4454d647b1c..807b6b3314f 100644 --- a/apps/files_sharing/api/sharees.php +++ b/apps/files_sharing/api/sharees.php @@ -35,31 +35,31 @@ use OCP\Share; class Sharees { /** @var IGroupManager */ - private $groupManager; + protected $groupManager; /** @var IUserManager */ - private $userManager; + protected $userManager; /** @var IManager */ - private $contactsManager; + protected $contactsManager; /** @var IConfig */ - private $config; + protected $config; /** @var IUserSession */ - private $userSession; + protected $userSession; /** @var IRequest */ - private $request; + protected $request; /** @var IURLGenerator */ - private $urlGenerator; + protected $urlGenerator; /** @var ILogger */ - private $logger; + protected $logger; /** @var bool */ - private $shareWithGroupOnly; + protected $shareWithGroupOnly = false; /** @var int */ protected $offset = 0; @@ -105,6 +105,7 @@ class Sharees { $this->config = $config; $this->userSession = $userSession; $this->urlGenerator = $urlGenerator; + $this->request = $request; $this->logger = $logger; } @@ -118,8 +119,8 @@ class Sharees { // Search in all the groups this user is part of $userGroups = $this->groupManager->getUserGroupIds($this->userSession->getUser()); foreach ($userGroups as $userGroup) { - $users = $this->groupManager->displayNamesInGroup($userGroup, $search, $this->limit, $this->offset); - foreach ($users as $uid => $userDisplayName) { + $usersTmp = $this->groupManager->displayNamesInGroup($userGroup, $search, $this->limit, $this->offset); + foreach ($usersTmp as $uid => $userDisplayName) { $users[$uid] = $userDisplayName; } } @@ -143,13 +144,19 @@ class Sharees { $foundUserById = true; } $this->result['exact']['users'][] = [ - 'shareWith' => $search, - 'label' => $search, + 'label' => $userDisplayName, + 'value' => [ + 'shareType' => Share::SHARE_TYPE_USER, + 'shareWith' => $uid, + ], ]; } else { $this->result['users'][] = [ - 'shareWith' => $uid, 'label' => $userDisplayName, + 'value' => [ + 'shareType' => Share::SHARE_TYPE_USER, + 'shareWith' => $uid, + ], ]; } } @@ -160,8 +167,11 @@ class Sharees { $user = $this->userManager->get($search); if ($user instanceof IUser) { array_push($this->result['exact']['users'], [ - 'shareWith' => $user->getUID(), 'label' => $user->getDisplayName(), + 'value' => [ + 'shareType' => Share::SHARE_TYPE_USER, + 'shareWith' => $user->getUID(), + ], ]); } } @@ -191,13 +201,19 @@ class Sharees { foreach ($groups as $gid) { if ($gid === $search) { $this->result['exact']['groups'][] = [ - 'shareWith' => $search, 'label' => $search, + 'value' => [ + 'shareType' => Share::SHARE_TYPE_GROUP, + 'shareWith' => $search, + ], ]; } else { $this->result['groups'][] = [ - 'shareWith' => $gid, 'label' => $gid, + 'value' => [ + 'shareType' => Share::SHARE_TYPE_GROUP, + 'shareWith' => $gid, + ], ]; } } @@ -208,8 +224,11 @@ class Sharees { $group = $this->groupManager->get($search); if ($group instanceof IGroup && (!$this->shareWithGroupOnly || array_intersect([$group], $userGroups))) { array_push($this->result['exact']['users'], [ - 'shareWith' => $group->getGID(), 'label' => $group->getGID(), + 'value' => [ + 'shareType' => Share::SHARE_TYPE_GROUP, + 'shareWith' => $group->getGID(), + ], ]); } } @@ -224,8 +243,11 @@ class Sharees { if (substr_count($search, '@') >= 1 && $this->offset === 0) { $this->result['exact']['remotes'][] = [ - 'shareWith' => $search, 'label' => $search, + 'value' => [ + 'shareType' => Share::SHARE_TYPE_REMOTE, + 'shareWith' => $search, + ], ]; } @@ -237,13 +259,19 @@ class Sharees { foreach ($contact['CLOUD'] as $cloudId) { if ($contact['FN'] === $search || $cloudId === $search) { $this->result['exact']['remotes'][] = [ - 'shareWith' => $cloudId, 'label' => $contact['FN'], + 'value' => [ + 'shareType' => Share::SHARE_TYPE_REMOTE, + 'shareWith' => $cloudId, + ], ]; } else { $this->result['remotes'][] = [ - 'shareWith' => $cloudId, 'label' => $contact['FN'], + 'value' => [ + 'shareType' => Share::SHARE_TYPE_REMOTE, + 'shareWith' => $cloudId, + ], ]; } } @@ -259,7 +287,6 @@ class Sharees { public function search() { $search = isset($_GET['search']) ? (string) $_GET['search'] : ''; $itemType = isset($_GET['itemType']) ? (string) $_GET['itemType'] : null; - $shareIds = isset($_GET['existingShares']) ? (array) $_GET['existingShares'] : []; $page = !empty($_GET['page']) ? max(1, (int) $_GET['page']) : 1; $perPage = !empty($_GET['limit']) ? max(1, (int) $_GET['limit']) : 200; @@ -286,7 +313,7 @@ class Sharees { $this->limit = (int) $perPage; $this->offset = $perPage * ($page - 1); - return $this->searchSharees($search, $itemType, $shareIds, $shareTypes, $page, $perPage); + return $this->searchSharees($search, $itemType, $shareTypes, $page, $perPage); } /** @@ -309,13 +336,12 @@ class Sharees { * * @param string $search * @param string $itemType - * @param array $shareIds * @param array $shareTypes * @param int $page * @param int $perPage * @return \OC_OCS_Result */ - protected function searchSharees($search, $itemType, array $shareIds, array $shareTypes, $page, $perPage) { + protected function searchSharees($search, $itemType, array $shareTypes, $page, $perPage) { // Verify arguments if ($itemType === null) { return new \OC_OCS_Result(null, 400, 'missing itemType'); @@ -343,7 +369,6 @@ class Sharees { $response->addHeader('Link', $this->getPaginationLink($page, [ 'search' => $search, 'itemType' => $itemType, - 'existingShares' => $shareIds, 'shareType' => $shareTypes, 'limit' => $perPage, ])); diff --git a/apps/files_sharing/tests/api/shareestest.php b/apps/files_sharing/tests/api/shareestest.php index 3b2e17d9fdc..d9f36623343 100644 --- a/apps/files_sharing/tests/api/shareestest.php +++ b/apps/files_sharing/tests/api/shareestest.php @@ -25,6 +25,7 @@ use Doctrine\DBAL\Connection; use OC\Share\Constants; use OCA\Files_Sharing\API\Sharees; use OCA\Files_sharing\Tests\TestCase; +use OCP\Share; class ShareesTest extends TestCase { /** @var Sharees */ @@ -42,6 +43,9 @@ class ShareesTest extends TestCase { /** @var \OCP\IUserSession|\PHPUnit_Framework_MockObject_MockObject */ protected $session; + /** @var \OCP\IRequest|\PHPUnit_Framework_MockObject_MockObject */ + protected $request; + protected function setUp() { parent::setUp(); @@ -61,6 +65,10 @@ class ShareesTest extends TestCase { ->disableOriginalConstructor() ->getMock(); + $this->request = $this->getMockBuilder('OCP\IRequest') + ->disableOriginalConstructor() + ->getMock(); + $this->sharees = new Sharees( $this->groupManager, $this->userManager, @@ -68,8 +76,8 @@ class ShareesTest extends TestCase { $this->getMockBuilder('OCP\IConfig')->disableOriginalConstructor()->getMock(), $this->session, $this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock(), - $this->getMockBuilder('OCP\ILogger')->disableOriginalConstructor()->getMock(), - \OC::$server->getDatabaseConnection() + $this->request, + $this->getMockBuilder('OCP\ILogger')->disableOriginalConstructor()->getMock() ); } @@ -103,8 +111,8 @@ class ShareesTest extends TestCase { public function dataGetUsers() { return [ - ['test', false, [], [], []], - ['test', true, [], [], []], + ['test', false, [], [], [], [], true], + ['test', true, [], [], [], [], true], [ 'test', false, @@ -112,9 +120,11 @@ class ShareesTest extends TestCase { [ $this->getUserMock('test1', 'Test One'), ], + [], [ - ['label' => 'Test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], - ] + ['label' => 'Test One', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ], + true, ], [ 'test', @@ -124,92 +134,85 @@ class ShareesTest extends TestCase { $this->getUserMock('test1', 'Test One'), $this->getUserMock('test2', 'Test Two'), ], + [], [ - ['label' => 'Test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], - ['label' => 'Test Two', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], - ] + ['label' => 'Test One', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ['label' => 'Test Two', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], + ], + false, ], [ 'test', false, [], [ + $this->getUserMock('test', 'Test'), $this->getUserMock('test1', 'Test One'), $this->getUserMock('test2', 'Test Two'), - $this->getUserMock('admin', 'Should be removed'), ], [ - ['label' => 'Test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], - ['label' => 'Test Two', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], - ] + ['label' => 'Test', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test']], + ], + [ + ['label' => 'Test One', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ['label' => 'Test Two', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], + ], + false, ], [ 'test', true, ['abc', 'xyz'], [ - ['abc', 'test', -1, 0, ['test1' => 'Test One']], - ['xyz', 'test', -1, 0, []], + ['abc', 'test', 2, 0, ['test1' => 'Test One']], + ['xyz', 'test', 2, 0, []], ], + [], [ - ['label' => 'Test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], - ] + ['label' => 'Test One', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ], + true, ], [ 'test', true, ['abc', 'xyz'], [ - ['abc', 'test', -1, 0, [ + ['abc', 'test', 2, 0, [ 'test1' => 'Test One', 'test2' => 'Test Two', ]], - ['xyz', 'test', -1, 0, [ + ['xyz', 'test', 2, 0, [ 'test1' => 'Test One', 'test2' => 'Test Two', ]], ], + [], [ - ['label' => 'Test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], - ['label' => 'Test Two', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], - ] + ['label' => 'Test One', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ['label' => 'Test Two', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], + ], + false, ], [ 'test', true, ['abc', 'xyz'], [ - ['abc', 'test', -1, 0, [ - 'test1' => 'Test One', + ['abc', 'test', 2, 0, [ + 'test' => 'Test One', ]], - ['xyz', 'test', -1, 0, [ + ['xyz', 'test', 2, 0, [ 'test2' => 'Test Two', ]], ], [ - ['label' => 'Test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], - ['label' => 'Test Two', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], - ] - ], - [ - 'test', - true, - ['abc', 'xyz'], - [ - ['abc', 'test', -1, 0, [ - 'test1' => 'Test One', - ]], - ['xyz', 'test', -1, 0, [ - 'test2' => 'Test Two', - ]], - ['admin', 'Should be removed', -1, 0, [ - 'test2' => 'Test Two', - ]], + ['label' => 'Test One', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test']], ], [ - ['label' => 'Test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], - ['label' => 'Test Two', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], - ] + ['label' => 'Test Two', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], + ], + false, ], ]; } @@ -221,9 +224,15 @@ class ShareesTest extends TestCase { * @param bool $shareWithGroupOnly * @param array $groupResponse * @param array $userResponse + * @param array $exactExpected * @param array $expected + * @param bool $reachedEnd */ - public function testGetUsers($searchTerm, $shareWithGroupOnly, $groupResponse, $userResponse, $expected) { + public function testGetUsers($searchTerm, $shareWithGroupOnly, $groupResponse, $userResponse, $exactExpected, $expected, $reachedEnd) { + $this->invokePrivate($this->sharees, 'limit', [2]); + $this->invokePrivate($this->sharees, 'offset', [0]); + $this->invokePrivate($this->sharees, 'shareWithGroupOnly', [$shareWithGroupOnly]); + $user = $this->getUserMock('admin', 'Administrator'); $this->session->expects($this->any()) ->method('getUser') @@ -232,7 +241,7 @@ class ShareesTest extends TestCase { if (!$shareWithGroupOnly) { $this->userManager->expects($this->once()) ->method('searchDisplayName') - ->with($searchTerm) + ->with($searchTerm, $this->invokePrivate($this->sharees, 'limit'), $this->invokePrivate($this->sharees, 'offset')) ->willReturn($userResponse); } else { $this->groupManager->expects($this->once()) @@ -242,25 +251,41 @@ class ShareesTest extends TestCase { $this->groupManager->expects($this->exactly(sizeof($groupResponse))) ->method('displayNamesInGroup') - ->with($this->anything(), $searchTerm) + ->with($this->anything(), $searchTerm, $this->invokePrivate($this->sharees, 'limit'), $this->invokePrivate($this->sharees, 'offset')) ->willReturnMap($userResponse); } - $users = $this->invokePrivate($this->sharees, 'getUsers', [$searchTerm, $shareWithGroupOnly]); + $this->invokePrivate($this->sharees, 'getUsers', [$searchTerm]); + $result = $this->invokePrivate($this->sharees, 'result'); - $this->assertEquals($expected, $users); + $this->assertEquals($exactExpected, $result['exact']['users']); + $this->assertEquals($expected, $result['users']); + $this->assertCount((int) $reachedEnd, $this->invokePrivate($this->sharees, 'reachedEndFor')); } public function dataGetGroups() { return [ - ['test', false, [], [], []], + ['test', false, [], [], [], [], true], [ 'test', false, [$this->getGroupMock('test1')], [], - [['label' => 'test1', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_GROUP, 'shareWith' => 'test1']]], + [], + [['label' => 'test1', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test1']]], + true, ], - ['test', true, [], [], []], + [ + 'test', false, + [ + $this->getGroupMock('test'), + $this->getGroupMock('test1'), + ], + [], + [['label' => 'test', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test']]], + [['label' => 'test1', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test1']]], + false, + ], + ['test', true, [], [], [], [], true], [ 'test', true, [ @@ -268,7 +293,31 @@ class ShareesTest extends TestCase { $this->getGroupMock('test2'), ], [$this->getGroupMock('test1')], - [['label' => 'test1', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_GROUP, 'shareWith' => 'test1']]], + [], + [['label' => 'test1', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test1']]], + false, + ], + [ + 'test', true, + [ + $this->getGroupMock('test'), + $this->getGroupMock('test1'), + ], + [$this->getGroupMock('test')], + [['label' => 'test', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test']]], + [], + false, + ], + [ + 'test', true, + [ + $this->getGroupMock('test'), + $this->getGroupMock('test1'), + ], + [$this->getGroupMock('test1')], + [], + [['label' => 'test1', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test1']]], + false, ], ]; } @@ -280,12 +329,18 @@ class ShareesTest extends TestCase { * @param bool $shareWithGroupOnly * @param array $groupResponse * @param array $userGroupsResponse + * @param array $exactExpected * @param array $expected + * @param bool $reachedEnd */ - public function testGetGroups($searchTerm, $shareWithGroupOnly, $groupResponse, $userGroupsResponse, $expected) { + public function testGetGroups($searchTerm, $shareWithGroupOnly, $groupResponse, $userGroupsResponse, $exactExpected, $expected, $reachedEnd) { + $this->invokePrivate($this->sharees, 'limit', [2]); + $this->invokePrivate($this->sharees, 'offset', [0]); + $this->invokePrivate($this->sharees, 'shareWithGroupOnly', [$shareWithGroupOnly]); + $this->groupManager->expects($this->once()) ->method('search') - ->with($searchTerm) + ->with($searchTerm, $this->invokePrivate($this->sharees, 'limit'), $this->invokePrivate($this->sharees, 'offset')) ->willReturn($groupResponse); if ($shareWithGroupOnly) { @@ -301,20 +356,25 @@ class ShareesTest extends TestCase { ->willReturn($userGroupsResponse); } - $users = $this->invokePrivate($this->sharees, 'getGroups', [$searchTerm, $shareWithGroupOnly]); + $this->invokePrivate($this->sharees, 'getGroups', [$searchTerm]); + $result = $this->invokePrivate($this->sharees, 'result'); - $this->assertEquals($expected, $users); + $this->assertEquals($exactExpected, $result['exact']['groups']); + $this->assertEquals($expected, $result['groups']); + $this->assertCount((int) $reachedEnd, $this->invokePrivate($this->sharees, 'reachedEndFor')); } public function dataGetRemote() { return [ - ['test', [], []], + ['test', [], [], [], true], [ 'test@remote', [], [ - ['label' => 'test@remote', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_REMOTE, 'shareWith' => 'test@remote']], + ['label' => 'test@remote', 'value' => ['shareType' => Share::SHARE_TYPE_REMOTE, 'shareWith' => 'test@remote']], ], + [], + true, ], [ 'test', @@ -334,9 +394,11 @@ class ShareesTest extends TestCase { ], ], ], + [], [ - ['label' => 'User @ Localhost (username@localhost)', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_REMOTE, 'shareWith' => 'username@localhost']], + ['label' => 'User @ Localhost', 'value' => ['shareType' => Share::SHARE_TYPE_REMOTE, 'shareWith' => 'username@localhost']], ], + true, ], [ 'test@remote', @@ -357,9 +419,12 @@ class ShareesTest extends TestCase { ], ], [ - ['label' => 'test@remote', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_REMOTE, 'shareWith' => 'test@remote']], - ['label' => 'User @ Localhost (username@localhost)', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_REMOTE, 'shareWith' => 'username@localhost']], + ['label' => 'test@remote', 'value' => ['shareType' => Share::SHARE_TYPE_REMOTE, 'shareWith' => 'test@remote']], + ], + [ + ['label' => 'User @ Localhost', 'value' => ['shareType' => Share::SHARE_TYPE_REMOTE, 'shareWith' => 'username@localhost']], ], + true, ], ]; } @@ -369,123 +434,120 @@ class ShareesTest extends TestCase { * * @param string $searchTerm * @param array $contacts + * @param array $exactExpected * @param array $expected + * @param bool $reachedEnd */ - public function testGetRemote($searchTerm, $contacts, $expected) { + public function testGetRemote($searchTerm, $contacts, $exactExpected, $expected, $reachedEnd) { $this->contactsManager->expects($this->any()) ->method('search') ->with($searchTerm, ['CLOUD', 'FN']) ->willReturn($contacts); - $users = $this->invokePrivate($this->sharees, 'getRemote', [$searchTerm]); + $this->invokePrivate($this->sharees, 'getRemote', [$searchTerm]); + $result = $this->invokePrivate($this->sharees, 'result'); - $this->assertEquals($expected, $users); + $this->assertEquals($exactExpected, $result['exact']['remotes']); + $this->assertEquals($expected, $result['remotes']); + $this->assertCount((int) $reachedEnd, $this->invokePrivate($this->sharees, 'reachedEndFor')); } public function dataSearch() { - $allTypes = [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_REMOTE]; + $allTypes = [Share::SHARE_TYPE_USER, Share::SHARE_TYPE_GROUP, Share::SHARE_TYPE_REMOTE]; return [ - [[], '', true, [], '', null, $allTypes, 1, 200, false], + [[], '', true, '', null, $allTypes, 1, 200, false], // Test itemType [[ 'search' => '', - ], '', true, [], '', null, $allTypes, 1, 200, false], + ], '', true, '', null, $allTypes, 1, 200, false], [[ 'search' => 'foobar', - ], '', true, [], 'foobar', null, $allTypes, 1, 200, false], + ], '', true, 'foobar', null, $allTypes, 1, 200, false], [[ 'search' => 0, - ], '', true, [], '0', null, $allTypes, 1, 200, false], + ], '', true, '0', null, $allTypes, 1, 200, false], // Test itemType [[ 'itemType' => '', - ], '', true, [], '', '', $allTypes, 1, 200, false], + ], '', true, '', '', $allTypes, 1, 200, false], [[ 'itemType' => 'folder', - ], '', true, [], '', 'folder', $allTypes, 1, 200, false], + ], '', true, '', 'folder', $allTypes, 1, 200, false], [[ 'itemType' => 0, - ], '', true, [], '', '0', $allTypes, 1, 200, false], - - // Test existingShares - [[ - 'existingShares' => [], - ], '', true, [], '', null, $allTypes, 1, 200, false], - [[ - 'existingShares' => [12, 42], - ], '', true, [12, 42], '', null, $allTypes, 1, 200, false], + ], '', true, '', '0', $allTypes, 1, 200, false], // Test shareType [[ - ], '', true, [], '', null, $allTypes, 1, 200, false], + ], '', true, '', null, $allTypes, 1, 200, false], [[ 'shareType' => 0, - ], '', true, [], '', null, [0], 1, 200, false], + ], '', true, '', null, [0], 1, 200, false], [[ 'shareType' => '0', - ], '', true, [], '', null, [0], 1, 200, false], + ], '', true, '', null, [0], 1, 200, false], [[ 'shareType' => 1, - ], '', true, [], '', null, [1], 1, 200, false], + ], '', true, '', null, [1], 1, 200, false], [[ 'shareType' => 12, - ], '', true, [], '', null, [], 1, 200, false], + ], '', true, '', null, [], 1, 200, false], [[ 'shareType' => 'foobar', - ], '', true, [], '', null, $allTypes, 1, 200, false], + ], '', true, '', null, $allTypes, 1, 200, false], [[ 'shareType' => [0, 1, 2], - ], '', true, [], '', null, [0, 1], 1, 200, false], + ], '', true, '', null, [0, 1], 1, 200, false], [[ 'shareType' => [0, 1], - ], '', true, [], '', null, [0, 1], 1, 200, false], + ], '', true, '', null, [0, 1], 1, 200, false], [[ 'shareType' => $allTypes, - ], '', true, [], '', null, $allTypes, 1, 200, false], + ], '', true, '', null, $allTypes, 1, 200, false], [[ 'shareType' => $allTypes, - ], '', false, [], '', null, [0, 1], 1, 200, false], + ], '', false, '', null, [0, 1], 1, 200, false], // Test pagination [[ 'page' => 0, - ], '', true, [], '', null, $allTypes, 1, 200, false], + ], '', true, '', null, $allTypes, 1, 200, false], [[ 'page' => '0', - ], '', true, [], '', null, $allTypes, 1, 200, false], + ], '', true, '', null, $allTypes, 1, 200, false], [[ 'page' => -1, - ], '', true, [], '', null, $allTypes, 1, 200, false], + ], '', true, '', null, $allTypes, 1, 200, false], [[ 'page' => 1, - ], '', true, [], '', null, $allTypes, 1, 200, false], + ], '', true, '', null, $allTypes, 1, 200, false], [[ 'page' => 10, - ], '', true, [], '', null, $allTypes, 10, 200, false], + ], '', true, '', null, $allTypes, 10, 200, false], // Test limit [[ 'limit' => 0, - ], '', true, [], '', null, $allTypes, 1, 200, false], + ], '', true, '', null, $allTypes, 1, 200, false], [[ 'limit' => '0', - ], '', true, [], '', null, $allTypes, 1, 200, false], + ], '', true, '', null, $allTypes, 1, 200, false], [[ 'limit' => -1, - ], '', true, [], '', null, $allTypes, 1, 1, false], + ], '', true, '', null, $allTypes, 1, 1, false], [[ 'limit' => 1, - ], '', true, [], '', null, $allTypes, 1, 1, false], + ], '', true, '', null, $allTypes, 1, 1, false], [[ 'limit' => 10, - ], '', true, [], '', null, $allTypes, 1, 10, false], + ], '', true, '', null, $allTypes, 1, 10, false], // Test $shareWithGroupOnly setting - [[], 'no', true, [], '', null, $allTypes, 1, 200, false], - [[], 'yes', true, [], '', null, $allTypes, 1, 200, true], + [[], 'no', true, '', null, $allTypes, 1, 200, false], + [[], 'yes', true, '', null, $allTypes, 1, 200, true], ]; } @@ -496,7 +558,6 @@ class ShareesTest extends TestCase { * @param array $getData * @param string $apiSetting * @param bool $remoteSharingEnabled - * @param array $shareIds * @param string $search * @param string $itemType * @param array $shareTypes @@ -504,7 +565,7 @@ class ShareesTest extends TestCase { * @param int $perPage * @param bool $shareWithGroupOnly */ - public function testSearch($getData, $apiSetting, $remoteSharingEnabled, $shareIds, $search, $itemType, $shareTypes, $page, $perPage, $shareWithGroupOnly) { + public function testSearch($getData, $apiSetting, $remoteSharingEnabled, $search, $itemType, $shareTypes, $page, $perPage, $shareWithGroupOnly) { $oldGet = $_GET; $_GET = $getData; @@ -524,26 +585,24 @@ class ShareesTest extends TestCase { $config, $this->session, $this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock(), - $this->getMockBuilder('OCP\ILogger')->disableOriginalConstructor()->getMock(), - \OC::$server->getDatabaseConnection() + $this->getMockBuilder('OCP\IRequest')->disableOriginalConstructor()->getMock(), + $this->getMockBuilder('OCP\ILogger')->disableOriginalConstructor()->getMock() ]) ->setMethods(array('searchSharees', 'isRemoteSharingAllowed')) ->getMock(); $sharees->expects($this->once()) ->method('searchSharees') - ->with($search, $itemType, $shareIds, $shareTypes, $page, $perPage, $shareWithGroupOnly) + ->with($search, $itemType, $shareTypes, $page, $perPage) ->willReturnCallback(function - ($isearch, $iitemType, $ishareIds, $ishareTypes, $ipage, $iperPage, $ishareWithGroupOnly) - use ($search, $itemType, $shareIds, $shareTypes, $page, $perPage, $shareWithGroupOnly) { + ($isearch, $iitemType, $ishareTypes, $ipage, $iperPage) + use ($search, $itemType, $shareTypes, $page, $perPage) { // We are doing strict comparisons here, so we can differ 0/'' and null on shareType/itemType $this->assertSame($search, $isearch); $this->assertSame($itemType, $iitemType); - $this->assertSame($shareIds, $ishareIds); $this->assertSame($shareTypes, $ishareTypes); $this->assertSame($page, $ipage); $this->assertSame($perPage, $iperPage); - $this->assertSame($shareWithGroupOnly, $ishareWithGroupOnly); return new \OC_OCS_Result([]); }); $sharees->expects($this->any()) @@ -554,6 +613,8 @@ class ShareesTest extends TestCase { /** @var \PHPUnit_Framework_MockObject_MockObject|\OCA\Files_Sharing\API\Sharees $sharees */ $this->assertInstanceOf('\OC_OCS_Result', $sharees->search()); + $this->assertSame($shareWithGroupOnly, $this->invokePrivate($sharees, 'shareWithGroupOnly')); + $_GET = $oldGet; } @@ -578,81 +639,88 @@ class ShareesTest extends TestCase { public function dataSearchSharees() { return [ - ['test', 'folder', [], [], [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_REMOTE], 1, 2, false, [], [], [], [], 0, false], - ['test', 'folder', [1, 2], [0 => ['test1'], 1 => ['test2 group']], [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_REMOTE], 1, 2, false, [], [], [], [], 0, false], - // First page with 2 of 3 results - [ - 'test', 'folder', [], [], [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_REMOTE], 1, 2, false, [ - ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], - ], [ - ['label' => 'testgroup1', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_GROUP, 'shareWith' => 'testgroup1']], - ], [ - ['label' => 'testz@remote', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_REMOTE, 'shareWith' => 'testz@remote']], - ], [ - ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], - ['label' => 'testgroup1', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_GROUP, 'shareWith' => 'testgroup1']], - ], 3, true, - ], - // Second page with the 3rd result + ['test', 'folder', [Share::SHARE_TYPE_USER, Share::SHARE_TYPE_GROUP, Share::SHARE_TYPE_REMOTE], 1, 2, false, [], [], [], + [ + 'exact' => ['users' => [], 'groups' => [], 'remotes' => []], + 'users' => [], + 'groups' => [], + 'remotes' => [], + ], false], + ['test', 'folder', [Share::SHARE_TYPE_USER, Share::SHARE_TYPE_GROUP, Share::SHARE_TYPE_REMOTE], 1, 2, false, [], [], [], + [ + 'exact' => ['users' => [], 'groups' => [], 'remotes' => []], + 'users' => [], + 'groups' => [], + 'remotes' => [], + ], false], [ - 'test', 'folder', [], [], [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_REMOTE], 2, 2, false, [ - ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], - ], [ - ['label' => 'testgroup1', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_GROUP, 'shareWith' => 'testgroup1']], + 'test', 'folder', [Share::SHARE_TYPE_USER, Share::SHARE_TYPE_GROUP, Share::SHARE_TYPE_REMOTE], 1, 2, false, [ + ['label' => 'test One', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], ], [ - ['label' => 'testz@remote', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_REMOTE, 'shareWith' => 'testz@remote']], + ['label' => 'testgroup1', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'testgroup1']], ], [ - ['label' => 'testz@remote', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_REMOTE, 'shareWith' => 'testz@remote']], - ], 3, false, + ['label' => 'testz@remote', 'value' => ['shareType' => Share::SHARE_TYPE_REMOTE, 'shareWith' => 'testz@remote']], + ], + [ + 'exact' => ['users' => [], 'groups' => [], 'remotes' => []], + 'users' => [ + ['label' => 'test One', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ], + 'groups' => [ + ['label' => 'testgroup1', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'testgroup1']], + ], + 'remotes' => [ + ['label' => 'testz@remote', 'value' => ['shareType' => Share::SHARE_TYPE_REMOTE, 'shareWith' => 'testz@remote']], + ], + ], true, ], // No groups requested [ - 'test', 'folder', [], [], [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_REMOTE], 1, 2, false, [ - ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], - ], null, [ - ['label' => 'testz@remote', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_REMOTE, 'shareWith' => 'testz@remote']], - ], [ - ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], - ['label' => 'testz@remote', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_REMOTE, 'shareWith' => 'testz@remote']], - ], 2, false, - ], - // Ingnoring already shared user - [ - 'test', 'folder', [1], [\OCP\Share::SHARE_TYPE_USER => ['test1']], [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_GROUP, \OCP\Share::SHARE_TYPE_REMOTE], 1, 2, false, [ - ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], - ], [ - ['label' => 'testgroup1', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_GROUP, 'shareWith' => 'testgroup1']], - ], [ - ['label' => 'testz@remote', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_REMOTE, 'shareWith' => 'testz@remote']], - ], [ - ['label' => 'testgroup1', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_GROUP, 'shareWith' => 'testgroup1']], - ['label' => 'testz@remote', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_REMOTE, 'shareWith' => 'testz@remote']], - ], 2, false, + 'test', 'folder', [Share::SHARE_TYPE_USER, Share::SHARE_TYPE_REMOTE], 1, 2, false, [ + ['label' => 'test One', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ], null, [ + ['label' => 'testz@remote', 'value' => ['shareType' => Share::SHARE_TYPE_REMOTE, 'shareWith' => 'testz@remote']], + ], + [ + 'exact' => ['users' => [], 'groups' => [], 'remotes' => []], + 'users' => [ + ['label' => 'test One', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ], + 'groups' => [], + 'remotes' => [ + ['label' => 'testz@remote', 'value' => ['shareType' => Share::SHARE_TYPE_REMOTE, 'shareWith' => 'testz@remote']], + ], + ], false, ], // Share type restricted to user - Only one user [ - 'test', 'folder', [], [], [\OCP\Share::SHARE_TYPE_USER], 1, 2, false, [ - ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], - ], null, null, [ - ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], - ], 1, false, + 'test', 'folder', [Share::SHARE_TYPE_USER], 1, 2, false, [ + ['label' => 'test One', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ], null, null, + [ + 'exact' => ['users' => [], 'groups' => [], 'remotes' => []], + 'users' => [ + ['label' => 'test One', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ], + 'groups' => [], + 'remotes' => [], + ], false, ], // Share type restricted to user - Multipage result [ - 'test', 'folder', [], [], [\OCP\Share::SHARE_TYPE_USER], 1, 2, false, [ - ['label' => 'test 1', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], - ['label' => 'test 2', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], - ['label' => 'test 3', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test3']], - ], null, null, [ - ['label' => 'test 1', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], - ['label' => 'test 2', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], - ], 3, true, - ], - // Share type restricted to user - Only user already shared - [ - 'test', 'folder', [1], [\OCP\Share::SHARE_TYPE_USER => ['test1']], [\OCP\Share::SHARE_TYPE_USER], 1, 2, false, [ - ['label' => 'test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], - ], null, null, [], 0, false, + 'test', 'folder', [Share::SHARE_TYPE_USER], 1, 2, false, [ + ['label' => 'test 1', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ['label' => 'test 2', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], + ], null, null, + [ + 'exact' => ['users' => [], 'groups' => [], 'remotes' => []], + 'users' => [ + ['label' => 'test 1', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], + ['label' => 'test 2', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], + ], + 'groups' => [], + 'remotes' => [], + ], true, ], ]; } @@ -662,16 +730,18 @@ class ShareesTest extends TestCase { * * @param string $searchTerm * @param string $itemType - * @param array $shareIds - * @param array $existingShares * @param array $shareTypes * @param int $page * @param int $perPage * @param bool $shareWithGroupOnly + * @param array $mockedUserResult + * @param array $mockedGroupsResult + * @param array $mockedRemotesResult * @param array $expected + * @param bool $nextLink */ - public function testSearchSharees($searchTerm, $itemType, array $shareIds, array $existingShares, array $shareTypes, $page, $perPage, $shareWithGroupOnly, - $mockedUserResult, $mockedGroupsResult, $mockedRemotesResult, $expected, $totalItems, $nextLink) { + public function testSearchSharees($searchTerm, $itemType, array $shareTypes, $page, $perPage, $shareWithGroupOnly, + $mockedUserResult, $mockedGroupsResult, $mockedRemotesResult, $expected, $nextLink) { /** @var \PHPUnit_Framework_MockObject_MockObject|\OCA\Files_Sharing\API\Sharees $sharees */ $sharees = $this->getMockBuilder('\OCA\Files_Sharing\API\Sharees') ->setConstructorArgs([ @@ -681,45 +751,47 @@ class ShareesTest extends TestCase { $this->getMockBuilder('OCP\IConfig')->disableOriginalConstructor()->getMock(), $this->session, $this->getMockBuilder('OCP\IURLGenerator')->disableOriginalConstructor()->getMock(), - $this->getMockBuilder('OCP\ILogger')->disableOriginalConstructor()->getMock(), - \OC::$server->getDatabaseConnection() + $this->getMockBuilder('OCP\IRequest')->disableOriginalConstructor()->getMock(), + $this->getMockBuilder('OCP\ILogger')->disableOriginalConstructor()->getMock() ]) ->setMethods(array('getShareesForShareIds', 'getUsers', 'getGroups', 'getRemote')) ->getMock(); - $sharees->expects($this->once()) - ->method('getShareesForShareIds') - ->with($shareIds) - ->willReturn($existingShares); $sharees->expects(($mockedUserResult === null) ? $this->never() : $this->once()) ->method('getUsers') - ->with($searchTerm, $shareWithGroupOnly) - ->willReturn($mockedUserResult); + ->with($searchTerm) + ->willReturnCallback(function() use ($sharees, $mockedUserResult) { + $result = $this->invokePrivate($sharees, 'result'); + $result['users'] = $mockedUserResult; + $this->invokePrivate($sharees, 'result', [$result]); + }); $sharees->expects(($mockedGroupsResult === null) ? $this->never() : $this->once()) ->method('getGroups') - ->with($searchTerm, $shareWithGroupOnly) - ->willReturn($mockedGroupsResult); + ->with($searchTerm) + ->willReturnCallback(function() use ($sharees, $mockedGroupsResult) { + $result = $this->invokePrivate($sharees, 'result'); + $result['groups'] = $mockedGroupsResult; + $this->invokePrivate($sharees, 'result', [$result]); + }); $sharees->expects(($mockedRemotesResult === null) ? $this->never() : $this->once()) ->method('getRemote') ->with($searchTerm) - ->willReturn($mockedRemotesResult); + ->willReturnCallback(function() use ($sharees, $mockedRemotesResult) { + $result = $this->invokePrivate($sharees, 'result'); + $result['remotes'] = $mockedRemotesResult; + $this->invokePrivate($sharees, 'result', [$result]); + }); /** @var \OC_OCS_Result $ocs */ - $ocs = $this->invokePrivate($sharees, 'searchSharees', [$searchTerm, $itemType, $shareIds, $shareTypes, $page, $perPage, $shareWithGroupOnly]); + $ocs = $this->invokePrivate($sharees, 'searchSharees', [$searchTerm, $itemType, $shareTypes, $page, $perPage, $shareWithGroupOnly]); $this->assertInstanceOf('\OC_OCS_Result', $ocs); - $this->assertEquals($expected, $ocs->getData()); - // Check number of total results - $meta = $ocs->getMeta(); - $this->assertArrayHasKey('totalitems', $meta); - $this->assertSame($totalItems, $meta['totalitems']); - // Check if next link is set if ($nextLink) { $headers = $ocs->getHeaders(); $this->assertArrayHasKey('Link', $headers); $this->assertStringStartsWith('<', $headers['Link']); - $this->assertStringEndsWith('"', $headers['Link']); + $this->assertStringEndsWith('>; rel="next"', $headers['Link']); } } @@ -737,199 +809,47 @@ class ShareesTest extends TestCase { $this->assertSame('missing itemType', $meta['message']); } - public function dataFilterSharees() { + public function dataGetPaginationLink() { return [ - [[], [], []], - [ - [ - ['label' => 'Test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], - ], - [], - [ - ['label' => 'Test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], - ], - ], - [ - [ - ['label' => 'Test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], - ['label' => 'Test Two', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], - ], - ['test1'], - [ - 1 => ['label' => 'Test Two', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], - ], - ], - [ - [ - ['label' => 'Test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], - ['label' => 'Test Two', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], - ], - ['test2'], - [ - 0 => ['label' => 'Test One', 'value' => ['shareType' => \OCP\Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], - ], - ], + [1, '/ocs/v1.php', ['limit' => 2], '; rel="next"'], + [10, '/ocs/v2.php', ['limit' => 2], '; rel="next"'], ]; } /** - * @dataProvider dataFilterSharees + * @dataProvider dataGetPaginationLink * - * @param array $potentialSharees - * @param array $existingSharees - * @param array $expectedSharees - */ - public function testFilterSharees($potentialSharees, $existingSharees, $expectedSharees) { - $this->assertEquals($expectedSharees, $this->invokePrivate($this->sharees, 'filterSharees', [$potentialSharees, $existingSharees])); - } - - public function dataGetShareesForShareIds() { - return [ - [[], []], - [[1, 2, 3], [Constants::SHARE_TYPE_USER => ['user1'], Constants::SHARE_TYPE_GROUP => ['group1']]], - ]; - } - - /** - * @dataProvider dataGetShareesForShareIds - * - * @param array $shareIds - * @param array $expectedSharees - */ - public function testGetShareesForShareIds(array $shareIds, array $expectedSharees) { - $owner = $this->getUniqueID('test'); - $shares2delete = []; - - if (!empty($shareIds)) { - $userShare = $this->createShare(Constants::SHARE_TYPE_USER, 'user1', $owner, null); - $shares2delete[] = $userShare; - $shares2delete[] = $this->createShare(Constants::SHARE_TYPE_USER, 'user3', $owner . '2', null); - - $groupShare = $this->createShare(Constants::SHARE_TYPE_GROUP, 'group1', $owner, null); - $shares2delete[] = $groupShare; - $groupShare2 = $this->createShare(Constants::SHARE_TYPE_GROUP, 'group2', $owner . '2', null); - $shares2delete[] = $groupShare2; - - $shares2delete[] = $this->createShare($this->invokePrivate(new Constants(), 'shareTypeGroupUserUnique'), 'user2', $owner, $groupShare); - $shares2delete[] = $this->createShare($this->invokePrivate(new Constants(), 'shareTypeGroupUserUnique'), 'user4', $owner, $groupShare2); - } - - $user = $this->getUserMock($owner, 'Sharee OCS test user'); - $this->session->expects($this->any()) - ->method('getUser') - ->willReturn($user); - $this->assertEquals($expectedSharees, $this->invokePrivate($this->sharees, 'getShareesForShareIds', [$shares2delete])); - - $this->deleteShares($shares2delete); - } - - /** - * @param int $type - * @param string $with - * @param string $owner - * @param int $parent - * @return int + * @param int $page + * @param string $scriptName + * @param array $params + * @param array $expected */ - protected function createShare($type, $with, $owner, $parent) { - $connection = \OC::$server->getDatabaseConnection(); - $queryBuilder = $connection->getQueryBuilder(); - $queryBuilder->insert('share') - ->values([ - 'share_type' => $queryBuilder->createParameter('share_type'), - 'share_with' => $queryBuilder->createParameter('share_with'), - 'uid_owner' => $queryBuilder->createParameter('uid_owner'), - 'parent' => $queryBuilder->createParameter('parent'), - 'item_type' => $queryBuilder->expr()->literal('fake'), - 'item_source' => $queryBuilder->expr()->literal(''), - 'item_target' => $queryBuilder->expr()->literal(''), - 'file_source' => $queryBuilder->expr()->literal(0), - 'file_target' => $queryBuilder->expr()->literal(''), - 'permissions' => $queryBuilder->expr()->literal(0), - 'stime' => $queryBuilder->expr()->literal(0), - 'accepted' => $queryBuilder->expr()->literal(0), - 'expiration' => $queryBuilder->createParameter('expiration'), - 'token' => $queryBuilder->expr()->literal(''), - 'mail_send' => $queryBuilder->expr()->literal(0), - ]) - ->setParameters([ - 'share_type' => $type, - 'share_with' => $with, - 'uid_owner' => $owner, - 'parent' => $parent, - ]) - ->setParameter('expiration', null, 'datetime') - ->execute(); - - $queryBuilder = $connection->getQueryBuilder(); - $query = $queryBuilder->select('id') - ->from('share') - ->orderBy('id', 'DESC') - ->setMaxResults(1) - ->execute(); - $share = $query->fetch(); - $query->closeCursor(); - - return (int) $share['id']; - } + public function testGetPaginationLink($page, $scriptName, $params, $expected) { + $this->request->expects($this->once()) + ->method('getScriptName') + ->willReturn($scriptName); - /** - * @param int[] $shareIds - * @return null - */ - protected function deleteShares(array $shareIds) { - $connection = \OC::$server->getDatabaseConnection(); - $queryBuilder = $connection->getQueryBuilder(); - $queryBuilder->delete('share') - ->where($queryBuilder->expr()->in('id', $queryBuilder->createParameter('ids'))) - ->setParameter('ids', $shareIds, Connection::PARAM_INT_ARRAY) - ->execute(); + $this->assertEquals($expected, $this->invokePrivate($this->sharees, 'getPaginationLink', [$page, $params])); } - public function dataGetPaginationLinks() { + public function dataIsV2() { return [ - [1, 1, ['limit' => 2], []], - [1, 3, ['limit' => 2], [ - '; rel="next"', - '; rel="last"', - ]], - [1, 21, ['limit' => 2], [ - '; rel="next"', - '; rel="last"', - ]], - [2, 21, ['limit' => 2], [ - '; rel="first"', - '; rel="prev"', - '; rel="next"', - '; rel="last"', - ]], - [5, 21, ['limit' => 2], [ - '; rel="first"', - '; rel="prev"', - '; rel="next"', - '; rel="last"', - ]], - [10, 21, ['limit' => 2], [ - '; rel="first"', - '; rel="prev"', - '; rel="next"', - '; rel="last"', - ]], - [11, 21, ['limit' => 2], [ - '; rel="first"', - '; rel="prev"', - ]], + ['/ocs/v1.php', false], + ['/ocs/v2.php', true], ]; } /** - * @dataProvider dataGetPaginationLinks + * @dataProvider dataIsV2 * - * @param int $page - * @param int $total - * @param array $params - * @param array $expected + * @param string $scriptName + * @param bool $expected */ - public function testGetPaginationLinks($page, $total, $params, $expected) { - $this->assertEquals($expected, $this->invokePrivate($this->sharees, 'getPaginationLinks', [$page, $total, $params])); + public function testIsV2($scriptName, $expected) { + $this->request->expects($this->once()) + ->method('getScriptName') + ->willReturn($scriptName); + + $this->assertEquals($expected, $this->invokePrivate($this->sharees, 'isV2')); } } -- GitLab From 199d1dc239a55f9be25b8779122420537f34ecf8 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 26 Aug 2015 11:45:11 +0200 Subject: [PATCH 041/783] Bring the coverage back to 100% --- apps/files_sharing/api/sharees.php | 38 +++-- apps/files_sharing/tests/api/shareestest.php | 156 ++++++++++++++++++- 2 files changed, 169 insertions(+), 25 deletions(-) diff --git a/apps/files_sharing/api/sharees.php b/apps/files_sharing/api/sharees.php index 807b6b3314f..d7eabb9a550 100644 --- a/apps/files_sharing/api/sharees.php +++ b/apps/files_sharing/api/sharees.php @@ -139,8 +139,8 @@ class Sharees { $foundUserById = false; foreach ($users as $uid => $userDisplayName) { - if ($uid === $search || $userDisplayName === $search) { - if ($uid === $search) { + if (strtolower($uid) === $search || strtolower($userDisplayName) === $search) { + if (strtolower($uid) === $search) { $foundUserById = true; } $this->result['exact']['users'][] = [ @@ -199,7 +199,7 @@ class Sharees { } foreach ($groups as $gid) { - if ($gid === $search) { + if (strtolower($gid) === $search) { $this->result['exact']['groups'][] = [ 'label' => $search, 'value' => [ @@ -222,8 +222,8 @@ class Sharees { // On page one we try if the search result has a direct hit on the // user id and if so, we add that to the exact match list $group = $this->groupManager->get($search); - if ($group instanceof IGroup && (!$this->shareWithGroupOnly || array_intersect([$group], $userGroups))) { - array_push($this->result['exact']['users'], [ + if ($group instanceof IGroup && (!$this->shareWithGroupOnly || in_array($group->getGID(), $userGroups))) { + array_push($this->result['exact']['groups'], [ 'label' => $group->getGID(), 'value' => [ 'shareType' => Share::SHARE_TYPE_GROUP, @@ -241,23 +241,17 @@ class Sharees { protected function getRemote($search) { $this->result['remotes'] = []; - if (substr_count($search, '@') >= 1 && $this->offset === 0) { - $this->result['exact']['remotes'][] = [ - 'label' => $search, - 'value' => [ - 'shareType' => Share::SHARE_TYPE_REMOTE, - 'shareWith' => $search, - ], - ]; - } - // Search in contacts //@todo Pagination missing $addressBookContacts = $this->contactsManager->search($search, ['CLOUD', 'FN']); + $foundRemoteById = false; foreach ($addressBookContacts as $contact) { if (isset($contact['CLOUD'])) { foreach ($contact['CLOUD'] as $cloudId) { - if ($contact['FN'] === $search || $cloudId === $search) { + if (strtolower($contact['FN']) === $search || strtolower($cloudId) === $search) { + if (strtolower($cloudId) === $search) { + $foundRemoteById = true; + } $this->result['exact']['remotes'][] = [ 'label' => $contact['FN'], 'value' => [ @@ -278,6 +272,16 @@ class Sharees { } } + if (!$foundRemoteById && substr_count($search, '@') >= 1 && substr_count($search, ' ') === 0 && $this->offset === 0) { + $this->result['exact']['remotes'][] = [ + 'label' => $search, + 'value' => [ + 'shareType' => Share::SHARE_TYPE_REMOTE, + 'shareWith' => $search, + ], + ]; + } + $this->reachedEndFor[] = 'remotes'; } @@ -313,7 +317,7 @@ class Sharees { $this->limit = (int) $perPage; $this->offset = $perPage * ($page - 1); - return $this->searchSharees($search, $itemType, $shareTypes, $page, $perPage); + return $this->searchSharees(strtolower($search), $itemType, $shareTypes, $page, $perPage); } /** diff --git a/apps/files_sharing/tests/api/shareestest.php b/apps/files_sharing/tests/api/shareestest.php index d9f36623343..1e4438acd88 100644 --- a/apps/files_sharing/tests/api/shareestest.php +++ b/apps/files_sharing/tests/api/shareestest.php @@ -111,8 +111,20 @@ class ShareesTest extends TestCase { public function dataGetUsers() { return [ - ['test', false, [], [], [], [], true], - ['test', true, [], [], [], [], true], + ['test', false, [], [], [], [], true, false], + ['test', true, [], [], [], [], true, false], + [ + 'test', false, [], [], + [ + ['label' => 'Test', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test']], + ], [], true, $this->getUserMock('test', 'Test') + ], + [ + 'test', true, [], [], + [ + ['label' => 'Test', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test']], + ], [], true, $this->getUserMock('test', 'Test') + ], [ 'test', false, @@ -125,6 +137,7 @@ class ShareesTest extends TestCase { ['label' => 'Test One', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], ], true, + false, ], [ 'test', @@ -140,24 +153,26 @@ class ShareesTest extends TestCase { ['label' => 'Test Two', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], ], false, + false, ], [ 'test', false, [], [ - $this->getUserMock('test', 'Test'), + $this->getUserMock('test0', 'Test'), $this->getUserMock('test1', 'Test One'), $this->getUserMock('test2', 'Test Two'), ], [ - ['label' => 'Test', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test']], + ['label' => 'Test', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test0']], ], [ ['label' => 'Test One', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], ['label' => 'Test Two', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], ], false, + false, ], [ 'test', @@ -172,6 +187,7 @@ class ShareesTest extends TestCase { ['label' => 'Test One', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test1']], ], true, + false, ], [ 'test', @@ -193,6 +209,7 @@ class ShareesTest extends TestCase { ['label' => 'Test Two', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], ], false, + false, ], [ 'test', @@ -213,6 +230,7 @@ class ShareesTest extends TestCase { ['label' => 'Test Two', 'value' => ['shareType' => Share::SHARE_TYPE_USER, 'shareWith' => 'test2']], ], false, + false, ], ]; } @@ -227,8 +245,9 @@ class ShareesTest extends TestCase { * @param array $exactExpected * @param array $expected * @param bool $reachedEnd + * @param mixed $singleUser */ - public function testGetUsers($searchTerm, $shareWithGroupOnly, $groupResponse, $userResponse, $exactExpected, $expected, $reachedEnd) { + public function testGetUsers($searchTerm, $shareWithGroupOnly, $groupResponse, $userResponse, $exactExpected, $expected, $reachedEnd, $singleUser) { $this->invokePrivate($this->sharees, 'limit', [2]); $this->invokePrivate($this->sharees, 'offset', [0]); $this->invokePrivate($this->sharees, 'shareWithGroupOnly', [$shareWithGroupOnly]); @@ -255,6 +274,13 @@ class ShareesTest extends TestCase { ->willReturnMap($userResponse); } + if ($singleUser !== false) { + $this->userManager->expects($this->once()) + ->method('get') + ->with($searchTerm) + ->willReturn($singleUser); + } + $this->invokePrivate($this->sharees, 'getUsers', [$searchTerm]); $result = $this->invokePrivate($this->sharees, 'result'); @@ -265,7 +291,7 @@ class ShareesTest extends TestCase { public function dataGetGroups() { return [ - ['test', false, [], [], [], [], true], + ['test', false, [], [], [], [], true, false], [ 'test', false, [$this->getGroupMock('test1')], @@ -273,6 +299,7 @@ class ShareesTest extends TestCase { [], [['label' => 'test1', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test1']]], true, + false, ], [ 'test', false, @@ -284,8 +311,41 @@ class ShareesTest extends TestCase { [['label' => 'test', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test']]], [['label' => 'test1', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test1']]], false, + false, ], - ['test', true, [], [], [], [], true], + [ + 'test', false, + [ + $this->getGroupMock('test0'), + $this->getGroupMock('test1'), + ], + [], + [], + [ + ['label' => 'test0', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test0']], + ['label' => 'test1', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test1']], + ], + false, + null, + ], + [ + 'test', false, + [ + $this->getGroupMock('test0'), + $this->getGroupMock('test1'), + ], + [], + [ + ['label' => 'test', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test']], + ], + [ + ['label' => 'test0', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test0']], + ['label' => 'test1', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test1']], + ], + false, + $this->getGroupMock('test'), + ], + ['test', true, [], [], [], [], true, false], [ 'test', true, [ @@ -296,6 +356,7 @@ class ShareesTest extends TestCase { [], [['label' => 'test1', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test1']]], false, + false, ], [ 'test', true, @@ -307,6 +368,7 @@ class ShareesTest extends TestCase { [['label' => 'test', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test']]], [], false, + false, ], [ 'test', true, @@ -318,6 +380,51 @@ class ShareesTest extends TestCase { [], [['label' => 'test1', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test1']]], false, + false, + ], + [ + 'test', true, + [ + $this->getGroupMock('test'), + $this->getGroupMock('test1'), + ], + [$this->getGroupMock('test'), $this->getGroupMock('test0'), $this->getGroupMock('test1')], + [['label' => 'test', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test']]], + [['label' => 'test1', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test1']]], + false, + false, + ], + [ + 'test', true, + [ + $this->getGroupMock('test0'), + $this->getGroupMock('test1'), + ], + [$this->getGroupMock('test'), $this->getGroupMock('test0'), $this->getGroupMock('test1')], + [], + [ + ['label' => 'test0', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test0']], + ['label' => 'test1', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test1']], + ], + false, + null, + ], + [ + 'test', true, + [ + $this->getGroupMock('test0'), + $this->getGroupMock('test1'), + ], + [$this->getGroupMock('test'), $this->getGroupMock('test0'), $this->getGroupMock('test1')], + [ + ['label' => 'test', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test']], + ], + [ + ['label' => 'test0', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test0']], + ['label' => 'test1', 'value' => ['shareType' => Share::SHARE_TYPE_GROUP, 'shareWith' => 'test1']], + ], + false, + $this->getGroupMock('test'), ], ]; } @@ -332,8 +439,9 @@ class ShareesTest extends TestCase { * @param array $exactExpected * @param array $expected * @param bool $reachedEnd + * @param mixed $singleGroup */ - public function testGetGroups($searchTerm, $shareWithGroupOnly, $groupResponse, $userGroupsResponse, $exactExpected, $expected, $reachedEnd) { + public function testGetGroups($searchTerm, $shareWithGroupOnly, $groupResponse, $userGroupsResponse, $exactExpected, $expected, $reachedEnd, $singleGroup) { $this->invokePrivate($this->sharees, 'limit', [2]); $this->invokePrivate($this->sharees, 'offset', [0]); $this->invokePrivate($this->sharees, 'shareWithGroupOnly', [$shareWithGroupOnly]); @@ -343,6 +451,13 @@ class ShareesTest extends TestCase { ->with($searchTerm, $this->invokePrivate($this->sharees, 'limit'), $this->invokePrivate($this->sharees, 'offset')) ->willReturn($groupResponse); + if ($singleGroup !== false) { + $this->groupManager->expects($this->once()) + ->method('get') + ->with($searchTerm) + ->willReturn($singleGroup); + } + if ($shareWithGroupOnly) { $user = $this->getUserMock('admin', 'Administrator'); $this->session->expects($this->any()) @@ -426,6 +541,31 @@ class ShareesTest extends TestCase { ], true, ], + [ + 'username@localhost', + [ + [ + 'FN' => 'User3 @ Localhost', + ], + [ + 'FN' => 'User2 @ Localhost', + 'CLOUD' => [ + ], + ], + [ + 'FN' => 'User @ Localhost', + 'CLOUD' => [ + 'username@localhost', + ], + ], + ], + [ + ['label' => 'User @ Localhost', 'value' => ['shareType' => Share::SHARE_TYPE_REMOTE, 'shareWith' => 'username@localhost']], + ], + [ + ], + true, + ], ]; } -- GitLab From 40203d7d1e7b55f2b0eb32c1ad36ada2b060d987 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Wed, 26 Aug 2015 12:19:24 +0200 Subject: [PATCH 042/783] Remove languages which are no longer maintained on transifex --- apps/files/l10n/af.js | 8 -- apps/files/l10n/af.json | 1 - apps/files/l10n/ca@valencia.js | 9 --- apps/files/l10n/ca@valencia.json | 7 -- apps/files/l10n/de_CH.js | 56 -------------- apps/files/l10n/de_CH.json | 54 -------------- apps/files/l10n/en_NZ.js | 9 --- apps/files/l10n/en_NZ.json | 7 -- apps/files/l10n/es_BO.js | 9 --- apps/files/l10n/es_BO.json | 7 -- apps/files/l10n/es_CO.js | 9 --- apps/files/l10n/es_CO.json | 7 -- apps/files/l10n/es_CR.js | 19 ----- apps/files/l10n/es_CR.json | 17 ----- apps/files/l10n/es_EC.js | 9 --- apps/files/l10n/es_EC.json | 7 -- apps/files/l10n/es_PE.js | 9 --- apps/files/l10n/es_PE.json | 7 -- apps/files/l10n/es_PY.js | 19 ----- apps/files/l10n/es_PY.json | 17 ----- apps/files/l10n/es_US.js | 9 --- apps/files/l10n/es_US.json | 7 -- apps/files/l10n/es_UY.js | 9 --- apps/files/l10n/es_UY.json | 7 -- apps/files/l10n/eu_ES.js | 8 -- apps/files/l10n/eu_ES.json | 6 -- apps/files/l10n/fi.js | 14 ---- apps/files/l10n/fi.json | 12 --- apps/files/l10n/fr_CA.js | 9 --- apps/files/l10n/fr_CA.json | 7 -- apps/files/l10n/hi_IN.js | 8 -- apps/files/l10n/hi_IN.json | 6 -- apps/files/l10n/sk.js | 9 --- apps/files/l10n/sk.json | 7 -- apps/files/l10n/ur.js | 6 -- apps/files/l10n/ur.json | 4 - apps/files_external/l10n/de_CH.js | 28 ------- apps/files_external/l10n/de_CH.json | 26 ------- apps/files_external/l10n/eu_ES.js | 8 -- apps/files_external/l10n/eu_ES.json | 6 -- apps/files_external/l10n/fi.js | 9 --- apps/files_external/l10n/fi.json | 7 -- apps/files_external/l10n/sk.js | 9 --- apps/files_external/l10n/sk.json | 7 -- apps/files_sharing/l10n/de_CH.js | 17 ----- apps/files_sharing/l10n/de_CH.json | 15 ---- apps/files_sharing/l10n/es_CR.js | 11 --- apps/files_sharing/l10n/es_CR.json | 9 --- apps/files_sharing/l10n/es_PY.js | 11 --- apps/files_sharing/l10n/es_PY.json | 9 --- apps/files_sharing/l10n/eu_ES.js | 7 -- apps/files_sharing/l10n/eu_ES.json | 5 -- apps/files_sharing/l10n/fi.js | 7 -- apps/files_sharing/l10n/fi.json | 5 -- apps/files_sharing/l10n/sk.js | 7 -- apps/files_sharing/l10n/sk.json | 5 -- apps/files_trashbin/l10n/de_CH.js | 15 ---- apps/files_trashbin/l10n/de_CH.json | 13 ---- apps/files_trashbin/l10n/eu_ES.js | 6 -- apps/files_trashbin/l10n/eu_ES.json | 4 - apps/files_trashbin/l10n/fi.js | 7 -- apps/files_trashbin/l10n/fi.json | 5 -- apps/files_trashbin/l10n/sk.js | 6 -- apps/files_trashbin/l10n/sk.json | 4 - apps/files_trashbin/l10n/ur.js | 6 -- apps/files_trashbin/l10n/ur.json | 4 - apps/files_versions/l10n/de_CH.js | 11 --- apps/files_versions/l10n/de_CH.json | 9 --- apps/user_ldap/l10n/ca@valencia.js | 7 -- apps/user_ldap/l10n/ca@valencia.json | 5 -- apps/user_ldap/l10n/de_CH.js | 80 -------------------- apps/user_ldap/l10n/de_CH.json | 78 -------------------- apps/user_ldap/l10n/en_NZ.js | 7 -- apps/user_ldap/l10n/en_NZ.json | 5 -- apps/user_ldap/l10n/es_BO.js | 7 -- apps/user_ldap/l10n/es_BO.json | 5 -- apps/user_ldap/l10n/es_CO.js | 7 -- apps/user_ldap/l10n/es_CO.json | 5 -- apps/user_ldap/l10n/es_CR.js | 7 -- apps/user_ldap/l10n/es_CR.json | 5 -- apps/user_ldap/l10n/es_EC.js | 7 -- apps/user_ldap/l10n/es_EC.json | 5 -- apps/user_ldap/l10n/es_PE.js | 7 -- apps/user_ldap/l10n/es_PE.json | 5 -- apps/user_ldap/l10n/es_PY.js | 7 -- apps/user_ldap/l10n/es_PY.json | 5 -- apps/user_ldap/l10n/es_US.js | 7 -- apps/user_ldap/l10n/es_US.json | 5 -- apps/user_ldap/l10n/es_UY.js | 7 -- apps/user_ldap/l10n/es_UY.json | 5 -- apps/user_ldap/l10n/eu_ES.js | 6 -- apps/user_ldap/l10n/eu_ES.json | 4 - apps/user_ldap/l10n/fi.js | 11 --- apps/user_ldap/l10n/fi.json | 9 --- apps/user_ldap/l10n/fr_CA.js | 7 -- apps/user_ldap/l10n/fr_CA.json | 5 -- apps/user_ldap/l10n/hi_IN.js | 7 -- apps/user_ldap/l10n/hi_IN.json | 5 -- apps/user_ldap/l10n/sk.js | 7 -- apps/user_ldap/l10n/sk.json | 5 -- apps/user_ldap/l10n/ur.js | 6 -- apps/user_ldap/l10n/ur.json | 4 - apps/user_webdavauth/l10n/de_CH.js | 8 -- apps/user_webdavauth/l10n/de_CH.json | 6 -- apps/user_webdavauth/l10n/eu_ES.js | 6 -- apps/user_webdavauth/l10n/eu_ES.json | 4 - apps/user_webdavauth/l10n/fi.js | 6 -- apps/user_webdavauth/l10n/fi.json | 4 - apps/user_webdavauth/l10n/sk.js | 6 -- apps/user_webdavauth/l10n/sk.json | 4 - core/l10n/ca@valencia.js | 8 -- core/l10n/ca@valencia.json | 6 -- core/l10n/de_CH.js | 105 --------------------------- core/l10n/de_CH.json | 103 -------------------------- core/l10n/en_NZ.js | 8 -- core/l10n/en_NZ.json | 6 -- core/l10n/es_BO.js | 8 -- core/l10n/es_BO.json | 6 -- core/l10n/es_CO.js | 8 -- core/l10n/es_CO.json | 6 -- core/l10n/es_CR.js | 8 -- core/l10n/es_CR.json | 6 -- core/l10n/es_EC.js | 8 -- core/l10n/es_EC.json | 6 -- core/l10n/es_PE.js | 8 -- core/l10n/es_PE.json | 6 -- core/l10n/es_PY.js | 8 -- core/l10n/es_PY.json | 6 -- core/l10n/es_US.js | 8 -- core/l10n/es_US.json | 6 -- core/l10n/es_UY.js | 8 -- core/l10n/es_UY.json | 6 -- core/l10n/eu_ES.js | 8 -- core/l10n/eu_ES.json | 6 -- core/l10n/fi.js | 18 ----- core/l10n/fi.json | 16 ---- core/l10n/fr_CA.js | 8 -- core/l10n/fr_CA.json | 6 -- core/l10n/hi_IN.js | 6 -- core/l10n/hi_IN.json | 4 - core/l10n/ignorelist | 1 - core/l10n/sk.js | 30 -------- core/l10n/sk.json | 28 ------- core/l10n/ur.js | 6 -- core/l10n/ur.json | 4 - lib/l10n/ca@valencia.js | 10 --- lib/l10n/ca@valencia.json | 8 -- lib/l10n/de_CH.js | 40 ---------- lib/l10n/de_CH.json | 38 ---------- lib/l10n/en_NZ.js | 10 --- lib/l10n/en_NZ.json | 8 -- lib/l10n/es_BO.js | 10 --- lib/l10n/es_BO.json | 8 -- lib/l10n/es_CO.js | 10 --- lib/l10n/es_CO.json | 8 -- lib/l10n/es_CR.js | 10 --- lib/l10n/es_CR.json | 8 -- lib/l10n/es_EC.js | 10 --- lib/l10n/es_EC.json | 8 -- lib/l10n/es_PE.js | 10 --- lib/l10n/es_PE.json | 8 -- lib/l10n/es_PY.js | 10 --- lib/l10n/es_PY.json | 8 -- lib/l10n/es_US.js | 10 --- lib/l10n/es_US.json | 8 -- lib/l10n/es_UY.js | 10 --- lib/l10n/es_UY.json | 8 -- lib/l10n/eu_ES.js | 6 -- lib/l10n/eu_ES.json | 4 - lib/l10n/fi.js | 7 -- lib/l10n/fi.json | 5 -- lib/l10n/fr_CA.js | 10 --- lib/l10n/fr_CA.json | 8 -- lib/l10n/hi_IN.js | 9 --- lib/l10n/hi_IN.json | 7 -- lib/l10n/sk.js | 7 -- lib/l10n/sk.json | 5 -- lib/l10n/ur.js | 9 --- lib/l10n/ur.json | 7 -- settings/l10n/de_CH.js | 102 -------------------------- settings/l10n/de_CH.json | 100 ------------------------- settings/l10n/eu_ES.js | 9 --- settings/l10n/eu_ES.json | 7 -- settings/l10n/fi.js | 11 --- settings/l10n/fi.json | 9 --- settings/l10n/sk.js | 9 --- settings/l10n/sk.json | 7 -- settings/l10n/ur.js | 6 -- settings/l10n/ur.json | 4 - 189 files changed, 2206 deletions(-) delete mode 100644 apps/files/l10n/af.js delete mode 100644 apps/files/l10n/af.json delete mode 100644 apps/files/l10n/ca@valencia.js delete mode 100644 apps/files/l10n/ca@valencia.json delete mode 100644 apps/files/l10n/de_CH.js delete mode 100644 apps/files/l10n/de_CH.json delete mode 100644 apps/files/l10n/en_NZ.js delete mode 100644 apps/files/l10n/en_NZ.json delete mode 100644 apps/files/l10n/es_BO.js delete mode 100644 apps/files/l10n/es_BO.json delete mode 100644 apps/files/l10n/es_CO.js delete mode 100644 apps/files/l10n/es_CO.json delete mode 100644 apps/files/l10n/es_CR.js delete mode 100644 apps/files/l10n/es_CR.json delete mode 100644 apps/files/l10n/es_EC.js delete mode 100644 apps/files/l10n/es_EC.json delete mode 100644 apps/files/l10n/es_PE.js delete mode 100644 apps/files/l10n/es_PE.json delete mode 100644 apps/files/l10n/es_PY.js delete mode 100644 apps/files/l10n/es_PY.json delete mode 100644 apps/files/l10n/es_US.js delete mode 100644 apps/files/l10n/es_US.json delete mode 100644 apps/files/l10n/es_UY.js delete mode 100644 apps/files/l10n/es_UY.json delete mode 100644 apps/files/l10n/eu_ES.js delete mode 100644 apps/files/l10n/eu_ES.json delete mode 100644 apps/files/l10n/fi.js delete mode 100644 apps/files/l10n/fi.json delete mode 100644 apps/files/l10n/fr_CA.js delete mode 100644 apps/files/l10n/fr_CA.json delete mode 100644 apps/files/l10n/hi_IN.js delete mode 100644 apps/files/l10n/hi_IN.json delete mode 100644 apps/files/l10n/sk.js delete mode 100644 apps/files/l10n/sk.json delete mode 100644 apps/files/l10n/ur.js delete mode 100644 apps/files/l10n/ur.json delete mode 100644 apps/files_external/l10n/de_CH.js delete mode 100644 apps/files_external/l10n/de_CH.json delete mode 100644 apps/files_external/l10n/eu_ES.js delete mode 100644 apps/files_external/l10n/eu_ES.json delete mode 100644 apps/files_external/l10n/fi.js delete mode 100644 apps/files_external/l10n/fi.json delete mode 100644 apps/files_external/l10n/sk.js delete mode 100644 apps/files_external/l10n/sk.json delete mode 100644 apps/files_sharing/l10n/de_CH.js delete mode 100644 apps/files_sharing/l10n/de_CH.json delete mode 100644 apps/files_sharing/l10n/es_CR.js delete mode 100644 apps/files_sharing/l10n/es_CR.json delete mode 100644 apps/files_sharing/l10n/es_PY.js delete mode 100644 apps/files_sharing/l10n/es_PY.json delete mode 100644 apps/files_sharing/l10n/eu_ES.js delete mode 100644 apps/files_sharing/l10n/eu_ES.json delete mode 100644 apps/files_sharing/l10n/fi.js delete mode 100644 apps/files_sharing/l10n/fi.json delete mode 100644 apps/files_sharing/l10n/sk.js delete mode 100644 apps/files_sharing/l10n/sk.json delete mode 100644 apps/files_trashbin/l10n/de_CH.js delete mode 100644 apps/files_trashbin/l10n/de_CH.json delete mode 100644 apps/files_trashbin/l10n/eu_ES.js delete mode 100644 apps/files_trashbin/l10n/eu_ES.json delete mode 100644 apps/files_trashbin/l10n/fi.js delete mode 100644 apps/files_trashbin/l10n/fi.json delete mode 100644 apps/files_trashbin/l10n/sk.js delete mode 100644 apps/files_trashbin/l10n/sk.json delete mode 100644 apps/files_trashbin/l10n/ur.js delete mode 100644 apps/files_trashbin/l10n/ur.json delete mode 100644 apps/files_versions/l10n/de_CH.js delete mode 100644 apps/files_versions/l10n/de_CH.json delete mode 100644 apps/user_ldap/l10n/ca@valencia.js delete mode 100644 apps/user_ldap/l10n/ca@valencia.json delete mode 100644 apps/user_ldap/l10n/de_CH.js delete mode 100644 apps/user_ldap/l10n/de_CH.json delete mode 100644 apps/user_ldap/l10n/en_NZ.js delete mode 100644 apps/user_ldap/l10n/en_NZ.json delete mode 100644 apps/user_ldap/l10n/es_BO.js delete mode 100644 apps/user_ldap/l10n/es_BO.json delete mode 100644 apps/user_ldap/l10n/es_CO.js delete mode 100644 apps/user_ldap/l10n/es_CO.json delete mode 100644 apps/user_ldap/l10n/es_CR.js delete mode 100644 apps/user_ldap/l10n/es_CR.json delete mode 100644 apps/user_ldap/l10n/es_EC.js delete mode 100644 apps/user_ldap/l10n/es_EC.json delete mode 100644 apps/user_ldap/l10n/es_PE.js delete mode 100644 apps/user_ldap/l10n/es_PE.json delete mode 100644 apps/user_ldap/l10n/es_PY.js delete mode 100644 apps/user_ldap/l10n/es_PY.json delete mode 100644 apps/user_ldap/l10n/es_US.js delete mode 100644 apps/user_ldap/l10n/es_US.json delete mode 100644 apps/user_ldap/l10n/es_UY.js delete mode 100644 apps/user_ldap/l10n/es_UY.json delete mode 100644 apps/user_ldap/l10n/eu_ES.js delete mode 100644 apps/user_ldap/l10n/eu_ES.json delete mode 100644 apps/user_ldap/l10n/fi.js delete mode 100644 apps/user_ldap/l10n/fi.json delete mode 100644 apps/user_ldap/l10n/fr_CA.js delete mode 100644 apps/user_ldap/l10n/fr_CA.json delete mode 100644 apps/user_ldap/l10n/hi_IN.js delete mode 100644 apps/user_ldap/l10n/hi_IN.json delete mode 100644 apps/user_ldap/l10n/sk.js delete mode 100644 apps/user_ldap/l10n/sk.json delete mode 100644 apps/user_ldap/l10n/ur.js delete mode 100644 apps/user_ldap/l10n/ur.json delete mode 100644 apps/user_webdavauth/l10n/de_CH.js delete mode 100644 apps/user_webdavauth/l10n/de_CH.json delete mode 100644 apps/user_webdavauth/l10n/eu_ES.js delete mode 100644 apps/user_webdavauth/l10n/eu_ES.json delete mode 100644 apps/user_webdavauth/l10n/fi.js delete mode 100644 apps/user_webdavauth/l10n/fi.json delete mode 100644 apps/user_webdavauth/l10n/sk.js delete mode 100644 apps/user_webdavauth/l10n/sk.json delete mode 100644 core/l10n/ca@valencia.js delete mode 100644 core/l10n/ca@valencia.json delete mode 100644 core/l10n/de_CH.js delete mode 100644 core/l10n/de_CH.json delete mode 100644 core/l10n/en_NZ.js delete mode 100644 core/l10n/en_NZ.json delete mode 100644 core/l10n/es_BO.js delete mode 100644 core/l10n/es_BO.json delete mode 100644 core/l10n/es_CO.js delete mode 100644 core/l10n/es_CO.json delete mode 100644 core/l10n/es_CR.js delete mode 100644 core/l10n/es_CR.json delete mode 100644 core/l10n/es_EC.js delete mode 100644 core/l10n/es_EC.json delete mode 100644 core/l10n/es_PE.js delete mode 100644 core/l10n/es_PE.json delete mode 100644 core/l10n/es_PY.js delete mode 100644 core/l10n/es_PY.json delete mode 100644 core/l10n/es_US.js delete mode 100644 core/l10n/es_US.json delete mode 100644 core/l10n/es_UY.js delete mode 100644 core/l10n/es_UY.json delete mode 100644 core/l10n/eu_ES.js delete mode 100644 core/l10n/eu_ES.json delete mode 100644 core/l10n/fi.js delete mode 100644 core/l10n/fi.json delete mode 100644 core/l10n/fr_CA.js delete mode 100644 core/l10n/fr_CA.json delete mode 100644 core/l10n/hi_IN.js delete mode 100644 core/l10n/hi_IN.json delete mode 100644 core/l10n/ignorelist delete mode 100644 core/l10n/sk.js delete mode 100644 core/l10n/sk.json delete mode 100644 core/l10n/ur.js delete mode 100644 core/l10n/ur.json delete mode 100644 lib/l10n/ca@valencia.js delete mode 100644 lib/l10n/ca@valencia.json delete mode 100644 lib/l10n/de_CH.js delete mode 100644 lib/l10n/de_CH.json delete mode 100644 lib/l10n/en_NZ.js delete mode 100644 lib/l10n/en_NZ.json delete mode 100644 lib/l10n/es_BO.js delete mode 100644 lib/l10n/es_BO.json delete mode 100644 lib/l10n/es_CO.js delete mode 100644 lib/l10n/es_CO.json delete mode 100644 lib/l10n/es_CR.js delete mode 100644 lib/l10n/es_CR.json delete mode 100644 lib/l10n/es_EC.js delete mode 100644 lib/l10n/es_EC.json delete mode 100644 lib/l10n/es_PE.js delete mode 100644 lib/l10n/es_PE.json delete mode 100644 lib/l10n/es_PY.js delete mode 100644 lib/l10n/es_PY.json delete mode 100644 lib/l10n/es_US.js delete mode 100644 lib/l10n/es_US.json delete mode 100644 lib/l10n/es_UY.js delete mode 100644 lib/l10n/es_UY.json delete mode 100644 lib/l10n/eu_ES.js delete mode 100644 lib/l10n/eu_ES.json delete mode 100644 lib/l10n/fi.js delete mode 100644 lib/l10n/fi.json delete mode 100644 lib/l10n/fr_CA.js delete mode 100644 lib/l10n/fr_CA.json delete mode 100644 lib/l10n/hi_IN.js delete mode 100644 lib/l10n/hi_IN.json delete mode 100644 lib/l10n/sk.js delete mode 100644 lib/l10n/sk.json delete mode 100644 lib/l10n/ur.js delete mode 100644 lib/l10n/ur.json delete mode 100644 settings/l10n/de_CH.js delete mode 100644 settings/l10n/de_CH.json delete mode 100644 settings/l10n/eu_ES.js delete mode 100644 settings/l10n/eu_ES.json delete mode 100644 settings/l10n/fi.js delete mode 100644 settings/l10n/fi.json delete mode 100644 settings/l10n/sk.js delete mode 100644 settings/l10n/sk.json delete mode 100644 settings/l10n/ur.js delete mode 100644 settings/l10n/ur.json diff --git a/apps/files/l10n/af.js b/apps/files/l10n/af.js deleted file mode 100644 index 5bdf101699a..00000000000 --- a/apps/files/l10n/af.js +++ /dev/null @@ -1,8 +0,0 @@ -OC.L10N.register( - "files", - { - "_%n folder_::_%n folders_" : "[ ,]", - "_%n file_::_%n files_" : "[ ,]", - "_Uploading %n file_::_Uploading %n files_" : "[ ,]" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/af.json b/apps/files/l10n/af.json deleted file mode 100644 index 26e5833738b..00000000000 --- a/apps/files/l10n/af.json +++ /dev/null @@ -1 +0,0 @@ -{"translations":{"_%n folder_::_%n folders_":["",""],"_%n file_::_%n files_":["",""],"_Uploading %n file_::_Uploading %n files_":["",""]},"pluralForm":"nplurals=2; plural=(n != 1);"} \ No newline at end of file diff --git a/apps/files/l10n/ca@valencia.js b/apps/files/l10n/ca@valencia.js deleted file mode 100644 index 7988332fa91..00000000000 --- a/apps/files/l10n/ca@valencia.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "files", - { - "_%n folder_::_%n folders_" : ["",""], - "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""], - "_matches '{filter}'_::_match '{filter}'_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/ca@valencia.json b/apps/files/l10n/ca@valencia.json deleted file mode 100644 index ef5fc586755..00000000000 --- a/apps/files/l10n/ca@valencia.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "_%n folder_::_%n folders_" : ["",""], - "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""], - "_matches '{filter}'_::_match '{filter}'_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files/l10n/de_CH.js b/apps/files/l10n/de_CH.js deleted file mode 100644 index 7bccd435300..00000000000 --- a/apps/files/l10n/de_CH.js +++ /dev/null @@ -1,56 +0,0 @@ -OC.L10N.register( - "files", - { - "Unknown error" : "Unbekannter Fehler", - "Could not move %s - File with this name already exists" : "%s konnte nicht verschoben werden. Eine Datei mit diesem Namen existiert bereits.", - "Could not move %s" : "Konnte %s nicht verschieben", - "File name cannot be empty." : "Der Dateiname darf nicht leer sein.", - "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "Ungültiger Name, «\\», «/», «<», «>», «:», «\"», «|», «?» und «*» sind nicht zulässig.", - "Unable to set upload directory." : "Das Upload-Verzeichnis konnte nicht gesetzt werden.", - "Invalid Token" : "Ungültiges Merkmal", - "No file was uploaded. Unknown error" : "Keine Datei hochgeladen. Unbekannter Fehler", - "There is no error, the file uploaded with success" : "Es ist kein Fehler aufgetreten. Die Datei wurde erfolgreich hochgeladen.", - "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Die hochgeladene Datei überschreitet die upload_max_filesize Vorgabe in php.ini", - "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Die Datei ist grösser, als die MAX_FILE_SIZE Vorgabe erlaubt, die im HTML-Formular spezifiziert ist", - "The uploaded file was only partially uploaded" : "Die Datei konnte nur teilweise übertragen werden", - "No file was uploaded" : "Keine Datei konnte übertragen werden.", - "Missing a temporary folder" : "Kein temporärer Ordner vorhanden", - "Failed to write to disk" : "Fehler beim Schreiben auf die Festplatte", - "Not enough storage available" : "Nicht genug Speicher vorhanden.", - "Invalid directory." : "Ungültiges Verzeichnis.", - "Files" : "Dateien", - "Upload cancelled." : "Upload abgebrochen.", - "File upload is in progress. Leaving the page now will cancel the upload." : "Dateiupload läuft. Wenn Sie die Seite jetzt verlassen, wird der Upload abgebrochen.", - "{new_name} already exists" : "{new_name} existiert bereits", - "Share" : "Teilen", - "Delete" : "Löschen", - "Unshare" : "Teilung aufheben", - "Delete permanently" : "Endgültig löschen", - "Rename" : "Umbenennen", - "Pending" : "Ausstehend", - "Error" : "Fehler", - "Name" : "Name", - "Size" : "Grösse", - "Modified" : "Geändert", - "_Uploading %n file_::_Uploading %n files_" : ["%n Datei wird hochgeladen","%n Dateien werden hochgeladen"], - "Your storage is full, files can not be updated or synced anymore!" : "Ihr Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!", - "Your storage is almost full ({usedSpacePercent}%)" : "Ihr Speicher ist fast voll ({usedSpacePercent}%)", - "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Die Verschlüsselung wurde deaktiviert, jedoch sind Ihre Dateien nach wie vor verschlüsselt. Bitte gehen Sie zu Ihren persönlichen Einstellungen, um Ihre Dateien zu entschlüsseln.", - "%s could not be renamed" : "%s konnte nicht umbenannt werden", - "File handling" : "Dateibehandlung", - "Maximum upload size" : "Maximale Upload-Grösse", - "max. possible: " : "maximal möglich:", - "Save" : "Speichern", - "WebDAV" : "WebDAV", - "New" : "Neu", - "Text file" : "Textdatei", - "New folder" : "Neues Verzeichnis", - "Folder" : "Ordner", - "From link" : "Von einem Link", - "Nothing in here. Upload something!" : "Alles leer. Laden Sie etwas hoch!", - "Download" : "Herunterladen", - "Upload too large" : "Der Upload ist zu gross", - "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Die Datei überschreitet die Maximalgrösse für Uploads auf diesem Server.", - "Files are being scanned, please wait." : "Dateien werden gescannt, bitte warten." -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/de_CH.json b/apps/files/l10n/de_CH.json deleted file mode 100644 index c7a64d52c87..00000000000 --- a/apps/files/l10n/de_CH.json +++ /dev/null @@ -1,54 +0,0 @@ -{ "translations": { - "Unknown error" : "Unbekannter Fehler", - "Could not move %s - File with this name already exists" : "%s konnte nicht verschoben werden. Eine Datei mit diesem Namen existiert bereits.", - "Could not move %s" : "Konnte %s nicht verschieben", - "File name cannot be empty." : "Der Dateiname darf nicht leer sein.", - "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "Ungültiger Name, «\\», «/», «<», «>», «:», «\"», «|», «?» und «*» sind nicht zulässig.", - "Unable to set upload directory." : "Das Upload-Verzeichnis konnte nicht gesetzt werden.", - "Invalid Token" : "Ungültiges Merkmal", - "No file was uploaded. Unknown error" : "Keine Datei hochgeladen. Unbekannter Fehler", - "There is no error, the file uploaded with success" : "Es ist kein Fehler aufgetreten. Die Datei wurde erfolgreich hochgeladen.", - "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Die hochgeladene Datei überschreitet die upload_max_filesize Vorgabe in php.ini", - "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Die Datei ist grösser, als die MAX_FILE_SIZE Vorgabe erlaubt, die im HTML-Formular spezifiziert ist", - "The uploaded file was only partially uploaded" : "Die Datei konnte nur teilweise übertragen werden", - "No file was uploaded" : "Keine Datei konnte übertragen werden.", - "Missing a temporary folder" : "Kein temporärer Ordner vorhanden", - "Failed to write to disk" : "Fehler beim Schreiben auf die Festplatte", - "Not enough storage available" : "Nicht genug Speicher vorhanden.", - "Invalid directory." : "Ungültiges Verzeichnis.", - "Files" : "Dateien", - "Upload cancelled." : "Upload abgebrochen.", - "File upload is in progress. Leaving the page now will cancel the upload." : "Dateiupload läuft. Wenn Sie die Seite jetzt verlassen, wird der Upload abgebrochen.", - "{new_name} already exists" : "{new_name} existiert bereits", - "Share" : "Teilen", - "Delete" : "Löschen", - "Unshare" : "Teilung aufheben", - "Delete permanently" : "Endgültig löschen", - "Rename" : "Umbenennen", - "Pending" : "Ausstehend", - "Error" : "Fehler", - "Name" : "Name", - "Size" : "Grösse", - "Modified" : "Geändert", - "_Uploading %n file_::_Uploading %n files_" : ["%n Datei wird hochgeladen","%n Dateien werden hochgeladen"], - "Your storage is full, files can not be updated or synced anymore!" : "Ihr Speicher ist voll, daher können keine Dateien mehr aktualisiert oder synchronisiert werden!", - "Your storage is almost full ({usedSpacePercent}%)" : "Ihr Speicher ist fast voll ({usedSpacePercent}%)", - "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Die Verschlüsselung wurde deaktiviert, jedoch sind Ihre Dateien nach wie vor verschlüsselt. Bitte gehen Sie zu Ihren persönlichen Einstellungen, um Ihre Dateien zu entschlüsseln.", - "%s could not be renamed" : "%s konnte nicht umbenannt werden", - "File handling" : "Dateibehandlung", - "Maximum upload size" : "Maximale Upload-Grösse", - "max. possible: " : "maximal möglich:", - "Save" : "Speichern", - "WebDAV" : "WebDAV", - "New" : "Neu", - "Text file" : "Textdatei", - "New folder" : "Neues Verzeichnis", - "Folder" : "Ordner", - "From link" : "Von einem Link", - "Nothing in here. Upload something!" : "Alles leer. Laden Sie etwas hoch!", - "Download" : "Herunterladen", - "Upload too large" : "Der Upload ist zu gross", - "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Die Datei überschreitet die Maximalgrösse für Uploads auf diesem Server.", - "Files are being scanned, please wait." : "Dateien werden gescannt, bitte warten." -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files/l10n/en_NZ.js b/apps/files/l10n/en_NZ.js deleted file mode 100644 index 7988332fa91..00000000000 --- a/apps/files/l10n/en_NZ.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "files", - { - "_%n folder_::_%n folders_" : ["",""], - "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""], - "_matches '{filter}'_::_match '{filter}'_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/en_NZ.json b/apps/files/l10n/en_NZ.json deleted file mode 100644 index ef5fc586755..00000000000 --- a/apps/files/l10n/en_NZ.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "_%n folder_::_%n folders_" : ["",""], - "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""], - "_matches '{filter}'_::_match '{filter}'_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files/l10n/es_BO.js b/apps/files/l10n/es_BO.js deleted file mode 100644 index 7988332fa91..00000000000 --- a/apps/files/l10n/es_BO.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "files", - { - "_%n folder_::_%n folders_" : ["",""], - "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""], - "_matches '{filter}'_::_match '{filter}'_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/es_BO.json b/apps/files/l10n/es_BO.json deleted file mode 100644 index ef5fc586755..00000000000 --- a/apps/files/l10n/es_BO.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "_%n folder_::_%n folders_" : ["",""], - "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""], - "_matches '{filter}'_::_match '{filter}'_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files/l10n/es_CO.js b/apps/files/l10n/es_CO.js deleted file mode 100644 index 7988332fa91..00000000000 --- a/apps/files/l10n/es_CO.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "files", - { - "_%n folder_::_%n folders_" : ["",""], - "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""], - "_matches '{filter}'_::_match '{filter}'_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/es_CO.json b/apps/files/l10n/es_CO.json deleted file mode 100644 index ef5fc586755..00000000000 --- a/apps/files/l10n/es_CO.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "_%n folder_::_%n folders_" : ["",""], - "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""], - "_matches '{filter}'_::_match '{filter}'_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files/l10n/es_CR.js b/apps/files/l10n/es_CR.js deleted file mode 100644 index db0f96010ee..00000000000 --- a/apps/files/l10n/es_CR.js +++ /dev/null @@ -1,19 +0,0 @@ -OC.L10N.register( - "files", - { - "Files" : "Archivos", - "A new file or folder has been created" : "Un nuevo archivo o carpeta ha sido creado", - "A file or folder has been changed" : "Un archivo o carpeta ha sido cambiado", - "A file or folder has been deleted" : "Un archivo o carpeta ha sido eliminado", - "A file or folder has been restored" : "Un archivo o carpeta ha sido restaurado", - "You created %1$s" : "Usted creó %1$s", - "%2$s created %1$s" : "%2$s creó %1$s", - "%1$s was created in a public folder" : "%1$s fue creado en un folder público", - "You changed %1$s" : "Usted cambió %1$s", - "%2$s changed %1$s" : "%2$s cambió %1$s", - "You deleted %1$s" : "Usted eliminó %1$s", - "%2$s deleted %1$s" : "%2$s eliminó %1$s", - "You restored %1$s" : "Usted restauró %1$s", - "%2$s restored %1$s" : "%2$s restauró %1$s" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/es_CR.json b/apps/files/l10n/es_CR.json deleted file mode 100644 index 506baf10fb6..00000000000 --- a/apps/files/l10n/es_CR.json +++ /dev/null @@ -1,17 +0,0 @@ -{ "translations": { - "Files" : "Archivos", - "A new file or folder has been created" : "Un nuevo archivo o carpeta ha sido creado", - "A file or folder has been changed" : "Un archivo o carpeta ha sido cambiado", - "A file or folder has been deleted" : "Un archivo o carpeta ha sido eliminado", - "A file or folder has been restored" : "Un archivo o carpeta ha sido restaurado", - "You created %1$s" : "Usted creó %1$s", - "%2$s created %1$s" : "%2$s creó %1$s", - "%1$s was created in a public folder" : "%1$s fue creado en un folder público", - "You changed %1$s" : "Usted cambió %1$s", - "%2$s changed %1$s" : "%2$s cambió %1$s", - "You deleted %1$s" : "Usted eliminó %1$s", - "%2$s deleted %1$s" : "%2$s eliminó %1$s", - "You restored %1$s" : "Usted restauró %1$s", - "%2$s restored %1$s" : "%2$s restauró %1$s" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files/l10n/es_EC.js b/apps/files/l10n/es_EC.js deleted file mode 100644 index 7988332fa91..00000000000 --- a/apps/files/l10n/es_EC.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "files", - { - "_%n folder_::_%n folders_" : ["",""], - "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""], - "_matches '{filter}'_::_match '{filter}'_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/es_EC.json b/apps/files/l10n/es_EC.json deleted file mode 100644 index ef5fc586755..00000000000 --- a/apps/files/l10n/es_EC.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "_%n folder_::_%n folders_" : ["",""], - "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""], - "_matches '{filter}'_::_match '{filter}'_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files/l10n/es_PE.js b/apps/files/l10n/es_PE.js deleted file mode 100644 index 7988332fa91..00000000000 --- a/apps/files/l10n/es_PE.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "files", - { - "_%n folder_::_%n folders_" : ["",""], - "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""], - "_matches '{filter}'_::_match '{filter}'_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/es_PE.json b/apps/files/l10n/es_PE.json deleted file mode 100644 index ef5fc586755..00000000000 --- a/apps/files/l10n/es_PE.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "_%n folder_::_%n folders_" : ["",""], - "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""], - "_matches '{filter}'_::_match '{filter}'_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files/l10n/es_PY.js b/apps/files/l10n/es_PY.js deleted file mode 100644 index 2cfff7608e5..00000000000 --- a/apps/files/l10n/es_PY.js +++ /dev/null @@ -1,19 +0,0 @@ -OC.L10N.register( - "files", - { - "Files" : "Archivos", - "A new file or folder has been created" : "Ha sido creado un nuevo archivo o carpeta", - "A file or folder has been changed" : "Ha sido modificado un archivo o carpeta", - "A file or folder has been deleted" : "Ha sido eliminado un archivo o carpeta", - "A file or folder has been restored" : "Se ha recuperado un archivo o carpeta", - "You created %1$s" : "Ha creado %1$s", - "%2$s created %1$s" : "%2$s ha creado %1$s", - "%1$s was created in a public folder" : "%1$s ha sido creado en una carpeta pública", - "You changed %1$s" : "Ha modificado %1$s", - "%2$s changed %1$s" : "%2$s ha modificado %1$s", - "You deleted %1$s" : "Usted ha eliminado %1$s", - "%2$s deleted %1$s" : "%2$s ha eliminado %1$s", - "You restored %1$s" : "Ha recuperado %1$s", - "%2$s restored %1$s" : "%2$s ha recuperado %1$s" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/es_PY.json b/apps/files/l10n/es_PY.json deleted file mode 100644 index 37392794692..00000000000 --- a/apps/files/l10n/es_PY.json +++ /dev/null @@ -1,17 +0,0 @@ -{ "translations": { - "Files" : "Archivos", - "A new file or folder has been created" : "Ha sido creado un nuevo archivo o carpeta", - "A file or folder has been changed" : "Ha sido modificado un archivo o carpeta", - "A file or folder has been deleted" : "Ha sido eliminado un archivo o carpeta", - "A file or folder has been restored" : "Se ha recuperado un archivo o carpeta", - "You created %1$s" : "Ha creado %1$s", - "%2$s created %1$s" : "%2$s ha creado %1$s", - "%1$s was created in a public folder" : "%1$s ha sido creado en una carpeta pública", - "You changed %1$s" : "Ha modificado %1$s", - "%2$s changed %1$s" : "%2$s ha modificado %1$s", - "You deleted %1$s" : "Usted ha eliminado %1$s", - "%2$s deleted %1$s" : "%2$s ha eliminado %1$s", - "You restored %1$s" : "Ha recuperado %1$s", - "%2$s restored %1$s" : "%2$s ha recuperado %1$s" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files/l10n/es_US.js b/apps/files/l10n/es_US.js deleted file mode 100644 index 7988332fa91..00000000000 --- a/apps/files/l10n/es_US.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "files", - { - "_%n folder_::_%n folders_" : ["",""], - "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""], - "_matches '{filter}'_::_match '{filter}'_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/es_US.json b/apps/files/l10n/es_US.json deleted file mode 100644 index ef5fc586755..00000000000 --- a/apps/files/l10n/es_US.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "_%n folder_::_%n folders_" : ["",""], - "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""], - "_matches '{filter}'_::_match '{filter}'_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files/l10n/es_UY.js b/apps/files/l10n/es_UY.js deleted file mode 100644 index 7988332fa91..00000000000 --- a/apps/files/l10n/es_UY.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "files", - { - "_%n folder_::_%n folders_" : ["",""], - "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""], - "_matches '{filter}'_::_match '{filter}'_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/es_UY.json b/apps/files/l10n/es_UY.json deleted file mode 100644 index ef5fc586755..00000000000 --- a/apps/files/l10n/es_UY.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "_%n folder_::_%n folders_" : ["",""], - "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""], - "_matches '{filter}'_::_match '{filter}'_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files/l10n/eu_ES.js b/apps/files/l10n/eu_ES.js deleted file mode 100644 index ed4c18dac7e..00000000000 --- a/apps/files/l10n/eu_ES.js +++ /dev/null @@ -1,8 +0,0 @@ -OC.L10N.register( - "files", - { - "Delete" : "Ezabatu", - "Save" : "Gorde", - "Download" : "Deskargatu" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/eu_ES.json b/apps/files/l10n/eu_ES.json deleted file mode 100644 index 6e8c511d42a..00000000000 --- a/apps/files/l10n/eu_ES.json +++ /dev/null @@ -1,6 +0,0 @@ -{ "translations": { - "Delete" : "Ezabatu", - "Save" : "Gorde", - "Download" : "Deskargatu" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files/l10n/fi.js b/apps/files/l10n/fi.js deleted file mode 100644 index 8733d6b1798..00000000000 --- a/apps/files/l10n/fi.js +++ /dev/null @@ -1,14 +0,0 @@ -OC.L10N.register( - "files", - { - "Rename" : "Nimeä uudelleen", - "Delete" : "Poista", - "Error" : "Virhe", - "Favorite" : "Suosikit", - "Save" : "Tallenna", - "Settings" : "Asetukset", - "New folder" : "Luo kansio", - "Folder" : "Kansio", - "Upload" : "Lähetä" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/fi.json b/apps/files/l10n/fi.json deleted file mode 100644 index 4a78a83735a..00000000000 --- a/apps/files/l10n/fi.json +++ /dev/null @@ -1,12 +0,0 @@ -{ "translations": { - "Rename" : "Nimeä uudelleen", - "Delete" : "Poista", - "Error" : "Virhe", - "Favorite" : "Suosikit", - "Save" : "Tallenna", - "Settings" : "Asetukset", - "New folder" : "Luo kansio", - "Folder" : "Kansio", - "Upload" : "Lähetä" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files/l10n/fr_CA.js b/apps/files/l10n/fr_CA.js deleted file mode 100644 index c50be1aa479..00000000000 --- a/apps/files/l10n/fr_CA.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "files", - { - "_%n folder_::_%n folders_" : ["",""], - "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""], - "_matches '{filter}'_::_match '{filter}'_" : ["",""] -}, -"nplurals=2; plural=(n > 1);"); diff --git a/apps/files/l10n/fr_CA.json b/apps/files/l10n/fr_CA.json deleted file mode 100644 index 210ac153bab..00000000000 --- a/apps/files/l10n/fr_CA.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "_%n folder_::_%n folders_" : ["",""], - "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""], - "_matches '{filter}'_::_match '{filter}'_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n > 1);" -} \ No newline at end of file diff --git a/apps/files/l10n/hi_IN.js b/apps/files/l10n/hi_IN.js deleted file mode 100644 index 329844854f1..00000000000 --- a/apps/files/l10n/hi_IN.js +++ /dev/null @@ -1,8 +0,0 @@ -OC.L10N.register( - "files", - { - "_%n folder_::_%n folders_" : ["",""], - "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/hi_IN.json b/apps/files/l10n/hi_IN.json deleted file mode 100644 index 37156658a86..00000000000 --- a/apps/files/l10n/hi_IN.json +++ /dev/null @@ -1,6 +0,0 @@ -{ "translations": { - "_%n folder_::_%n folders_" : ["",""], - "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files/l10n/sk.js b/apps/files/l10n/sk.js deleted file mode 100644 index 47af64a4937..00000000000 --- a/apps/files/l10n/sk.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "files", - { - "Share" : "Zdieľať", - "Delete" : "Odstrániť", - "Save" : "Uložiť", - "Download" : "Stiahnuť" -}, -"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"); diff --git a/apps/files/l10n/sk.json b/apps/files/l10n/sk.json deleted file mode 100644 index a61d2917bc9..00000000000 --- a/apps/files/l10n/sk.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "Share" : "Zdieľať", - "Delete" : "Odstrániť", - "Save" : "Uložiť", - "Download" : "Stiahnuť" -},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;" -} \ No newline at end of file diff --git a/apps/files/l10n/ur.js b/apps/files/l10n/ur.js deleted file mode 100644 index 87ed21fd6c7..00000000000 --- a/apps/files/l10n/ur.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "files", - { - "Error" : "خرابی" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/ur.json b/apps/files/l10n/ur.json deleted file mode 100644 index 1c1fc3d16c1..00000000000 --- a/apps/files/l10n/ur.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Error" : "خرابی" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files_external/l10n/de_CH.js b/apps/files_external/l10n/de_CH.js deleted file mode 100644 index b0039573097..00000000000 --- a/apps/files_external/l10n/de_CH.js +++ /dev/null @@ -1,28 +0,0 @@ -OC.L10N.register( - "files_external", - { - "Please provide a valid Dropbox app key and secret." : "Bitte tragen Sie einen gültigen Dropbox-App-Key mit Secret ein.", - "External storage" : "Externer Speicher", - "Local" : "Lokal", - "Location" : "Ort", - "Port" : "Port", - "Host" : "Host", - "Username" : "Benutzername", - "Password" : "Passwort", - "Share" : "Freigeben", - "URL" : "URL", - "Access granted" : "Zugriff gestattet", - "Error configuring Dropbox storage" : "Fehler beim Einrichten von Dropbox", - "Grant access" : "Zugriff gestatten", - "Error configuring Google Drive storage" : "Fehler beim Einrichten von Google Drive", - "Personal" : "Persönlich", - "Saved" : "Gespeichert", - "Name" : "Name", - "External Storage" : "Externer Speicher", - "Folder name" : "Ordnername", - "Configuration" : "Konfiguration", - "Add storage" : "Speicher hinzufügen", - "Delete" : "Löschen", - "Enable User External Storage" : "Externen Speicher für Benutzer aktivieren" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/de_CH.json b/apps/files_external/l10n/de_CH.json deleted file mode 100644 index 955fae07f5b..00000000000 --- a/apps/files_external/l10n/de_CH.json +++ /dev/null @@ -1,26 +0,0 @@ -{ "translations": { - "Please provide a valid Dropbox app key and secret." : "Bitte tragen Sie einen gültigen Dropbox-App-Key mit Secret ein.", - "External storage" : "Externer Speicher", - "Local" : "Lokal", - "Location" : "Ort", - "Port" : "Port", - "Host" : "Host", - "Username" : "Benutzername", - "Password" : "Passwort", - "Share" : "Freigeben", - "URL" : "URL", - "Access granted" : "Zugriff gestattet", - "Error configuring Dropbox storage" : "Fehler beim Einrichten von Dropbox", - "Grant access" : "Zugriff gestatten", - "Error configuring Google Drive storage" : "Fehler beim Einrichten von Google Drive", - "Personal" : "Persönlich", - "Saved" : "Gespeichert", - "Name" : "Name", - "External Storage" : "Externer Speicher", - "Folder name" : "Ordnername", - "Configuration" : "Konfiguration", - "Add storage" : "Speicher hinzufügen", - "Delete" : "Löschen", - "Enable User External Storage" : "Externen Speicher für Benutzer aktivieren" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files_external/l10n/eu_ES.js b/apps/files_external/l10n/eu_ES.js deleted file mode 100644 index 513edcb534e..00000000000 --- a/apps/files_external/l10n/eu_ES.js +++ /dev/null @@ -1,8 +0,0 @@ -OC.L10N.register( - "files_external", - { - "Location" : "kokapena", - "Personal" : "Pertsonala", - "Delete" : "Ezabatu" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/eu_ES.json b/apps/files_external/l10n/eu_ES.json deleted file mode 100644 index 149a30d1a7e..00000000000 --- a/apps/files_external/l10n/eu_ES.json +++ /dev/null @@ -1,6 +0,0 @@ -{ "translations": { - "Location" : "kokapena", - "Personal" : "Pertsonala", - "Delete" : "Ezabatu" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files_external/l10n/fi.js b/apps/files_external/l10n/fi.js deleted file mode 100644 index eaa9b89fc04..00000000000 --- a/apps/files_external/l10n/fi.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "files_external", - { - "Username" : "Käyttäjätunnus", - "Password" : "Salasana", - "URL" : "URL", - "Delete" : "Poista" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/fi.json b/apps/files_external/l10n/fi.json deleted file mode 100644 index 8a702552ca1..00000000000 --- a/apps/files_external/l10n/fi.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "Username" : "Käyttäjätunnus", - "Password" : "Salasana", - "URL" : "URL", - "Delete" : "Poista" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files_external/l10n/sk.js b/apps/files_external/l10n/sk.js deleted file mode 100644 index edae863703d..00000000000 --- a/apps/files_external/l10n/sk.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "files_external", - { - "Location" : "Poloha", - "Share" : "Zdieľať", - "Personal" : "Osobné", - "Delete" : "Odstrániť" -}, -"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"); diff --git a/apps/files_external/l10n/sk.json b/apps/files_external/l10n/sk.json deleted file mode 100644 index 4d6a95caf3c..00000000000 --- a/apps/files_external/l10n/sk.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "Location" : "Poloha", - "Share" : "Zdieľať", - "Personal" : "Osobné", - "Delete" : "Odstrániť" -},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;" -} \ No newline at end of file diff --git a/apps/files_sharing/l10n/de_CH.js b/apps/files_sharing/l10n/de_CH.js deleted file mode 100644 index 2cdb3d47c69..00000000000 --- a/apps/files_sharing/l10n/de_CH.js +++ /dev/null @@ -1,17 +0,0 @@ -OC.L10N.register( - "files_sharing", - { - "Cancel" : "Abbrechen", - "Shared by" : "Geteilt von", - "The password is wrong. Try again." : "Das Passwort ist falsch. Bitte versuchen Sie es erneut.", - "Password" : "Passwort", - "Name" : "Name", - "Sorry, this link doesn’t seem to work anymore." : "Entschuldigung, dieser Link scheint nicht mehr zu funktionieren.", - "Reasons might be:" : "Gründe könnten sein:", - "the item was removed" : "Das Element wurde entfernt", - "the link expired" : "Der Link ist abgelaufen", - "sharing is disabled" : "Teilen ist deaktiviert", - "For more info, please ask the person who sent this link." : "Für mehr Informationen, fragen Sie bitte die Person, die Ihnen diesen Link geschickt hat.", - "Download" : "Herunterladen" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/de_CH.json b/apps/files_sharing/l10n/de_CH.json deleted file mode 100644 index a161e06bae8..00000000000 --- a/apps/files_sharing/l10n/de_CH.json +++ /dev/null @@ -1,15 +0,0 @@ -{ "translations": { - "Cancel" : "Abbrechen", - "Shared by" : "Geteilt von", - "The password is wrong. Try again." : "Das Passwort ist falsch. Bitte versuchen Sie es erneut.", - "Password" : "Passwort", - "Name" : "Name", - "Sorry, this link doesn’t seem to work anymore." : "Entschuldigung, dieser Link scheint nicht mehr zu funktionieren.", - "Reasons might be:" : "Gründe könnten sein:", - "the item was removed" : "Das Element wurde entfernt", - "the link expired" : "Der Link ist abgelaufen", - "sharing is disabled" : "Teilen ist deaktiviert", - "For more info, please ask the person who sent this link." : "Für mehr Informationen, fragen Sie bitte die Person, die Ihnen diesen Link geschickt hat.", - "Download" : "Herunterladen" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files_sharing/l10n/es_CR.js b/apps/files_sharing/l10n/es_CR.js deleted file mode 100644 index 38387ee8608..00000000000 --- a/apps/files_sharing/l10n/es_CR.js +++ /dev/null @@ -1,11 +0,0 @@ -OC.L10N.register( - "files_sharing", - { - "A file or folder has been shared" : "Un archivo o carpeta has sido compartido", - "You shared %1$s with %2$s" : "Usted compartió %1$s con %2$s", - "You shared %1$s with group %2$s" : "Usted compartió %1$s con el grupo %2$s", - "%2$s shared %1$s with you" : "%2$s compartió %1$s con usted", - "You shared %1$s via link" : "Usted compartió %1$s con un vínculo", - "Shares" : "Compartidos" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/es_CR.json b/apps/files_sharing/l10n/es_CR.json deleted file mode 100644 index 6a92ddc55b4..00000000000 --- a/apps/files_sharing/l10n/es_CR.json +++ /dev/null @@ -1,9 +0,0 @@ -{ "translations": { - "A file or folder has been shared" : "Un archivo o carpeta has sido compartido", - "You shared %1$s with %2$s" : "Usted compartió %1$s con %2$s", - "You shared %1$s with group %2$s" : "Usted compartió %1$s con el grupo %2$s", - "%2$s shared %1$s with you" : "%2$s compartió %1$s con usted", - "You shared %1$s via link" : "Usted compartió %1$s con un vínculo", - "Shares" : "Compartidos" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files_sharing/l10n/es_PY.js b/apps/files_sharing/l10n/es_PY.js deleted file mode 100644 index ca83052f991..00000000000 --- a/apps/files_sharing/l10n/es_PY.js +++ /dev/null @@ -1,11 +0,0 @@ -OC.L10N.register( - "files_sharing", - { - "A file or folder has been shared" : "Se ha compartido un archivo o carpeta", - "You shared %1$s with %2$s" : "Ha compartido %1$s con %2$s", - "You shared %1$s with group %2$s" : "Ha compartido %1$s con el grupo %2$s", - "%2$s shared %1$s with you" : "%2$s ha compartido %1$s con tigo", - "You shared %1$s via link" : "Ha compartido %1$s via enlace", - "Shares" : "Compartidos" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/es_PY.json b/apps/files_sharing/l10n/es_PY.json deleted file mode 100644 index ca21de5caaf..00000000000 --- a/apps/files_sharing/l10n/es_PY.json +++ /dev/null @@ -1,9 +0,0 @@ -{ "translations": { - "A file or folder has been shared" : "Se ha compartido un archivo o carpeta", - "You shared %1$s with %2$s" : "Ha compartido %1$s con %2$s", - "You shared %1$s with group %2$s" : "Ha compartido %1$s con el grupo %2$s", - "%2$s shared %1$s with you" : "%2$s ha compartido %1$s con tigo", - "You shared %1$s via link" : "Ha compartido %1$s via enlace", - "Shares" : "Compartidos" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files_sharing/l10n/eu_ES.js b/apps/files_sharing/l10n/eu_ES.js deleted file mode 100644 index 240f0181559..00000000000 --- a/apps/files_sharing/l10n/eu_ES.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "files_sharing", - { - "Cancel" : "Ezeztatu", - "Download" : "Deskargatu" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/eu_ES.json b/apps/files_sharing/l10n/eu_ES.json deleted file mode 100644 index 9adbb2b8185..00000000000 --- a/apps/files_sharing/l10n/eu_ES.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "Cancel" : "Ezeztatu", - "Download" : "Deskargatu" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files_sharing/l10n/fi.js b/apps/files_sharing/l10n/fi.js deleted file mode 100644 index 1f1bf5377b3..00000000000 --- a/apps/files_sharing/l10n/fi.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "files_sharing", - { - "Cancel" : "Peruuta", - "Password" : "Salasana" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/fi.json b/apps/files_sharing/l10n/fi.json deleted file mode 100644 index a80ddde0fed..00000000000 --- a/apps/files_sharing/l10n/fi.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "Cancel" : "Peruuta", - "Password" : "Salasana" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files_sharing/l10n/sk.js b/apps/files_sharing/l10n/sk.js deleted file mode 100644 index aa385851497..00000000000 --- a/apps/files_sharing/l10n/sk.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "files_sharing", - { - "Cancel" : "Zrušiť", - "Download" : "Stiahnuť" -}, -"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"); diff --git a/apps/files_sharing/l10n/sk.json b/apps/files_sharing/l10n/sk.json deleted file mode 100644 index 65bbffa4191..00000000000 --- a/apps/files_sharing/l10n/sk.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "Cancel" : "Zrušiť", - "Download" : "Stiahnuť" -},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;" -} \ No newline at end of file diff --git a/apps/files_trashbin/l10n/de_CH.js b/apps/files_trashbin/l10n/de_CH.js deleted file mode 100644 index 70a428d4c93..00000000000 --- a/apps/files_trashbin/l10n/de_CH.js +++ /dev/null @@ -1,15 +0,0 @@ -OC.L10N.register( - "files_trashbin", - { - "Couldn't delete %s permanently" : "Konnte %s nicht dauerhaft löschen", - "Couldn't restore %s" : "Konnte %s nicht wiederherstellen", - "Deleted files" : "Gelöschte Dateien", - "Restore" : "Wiederherstellen", - "Error" : "Fehler", - "restored" : "Wiederhergestellt", - "Nothing in here. Your trash bin is empty!" : "Nichts zu löschen, Ihr Papierkorb ist leer!", - "Name" : "Name", - "Deleted" : "Gelöscht", - "Delete" : "Löschen" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files_trashbin/l10n/de_CH.json b/apps/files_trashbin/l10n/de_CH.json deleted file mode 100644 index 497b6c35d55..00000000000 --- a/apps/files_trashbin/l10n/de_CH.json +++ /dev/null @@ -1,13 +0,0 @@ -{ "translations": { - "Couldn't delete %s permanently" : "Konnte %s nicht dauerhaft löschen", - "Couldn't restore %s" : "Konnte %s nicht wiederherstellen", - "Deleted files" : "Gelöschte Dateien", - "Restore" : "Wiederherstellen", - "Error" : "Fehler", - "restored" : "Wiederhergestellt", - "Nothing in here. Your trash bin is empty!" : "Nichts zu löschen, Ihr Papierkorb ist leer!", - "Name" : "Name", - "Deleted" : "Gelöscht", - "Delete" : "Löschen" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files_trashbin/l10n/eu_ES.js b/apps/files_trashbin/l10n/eu_ES.js deleted file mode 100644 index 8e988be3bf6..00000000000 --- a/apps/files_trashbin/l10n/eu_ES.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "files_trashbin", - { - "Delete" : "Ezabatu" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files_trashbin/l10n/eu_ES.json b/apps/files_trashbin/l10n/eu_ES.json deleted file mode 100644 index 14a2375ad60..00000000000 --- a/apps/files_trashbin/l10n/eu_ES.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Delete" : "Ezabatu" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files_trashbin/l10n/fi.js b/apps/files_trashbin/l10n/fi.js deleted file mode 100644 index e3b5a93ead8..00000000000 --- a/apps/files_trashbin/l10n/fi.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "files_trashbin", - { - "Error" : "Virhe", - "Delete" : "Poista" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files_trashbin/l10n/fi.json b/apps/files_trashbin/l10n/fi.json deleted file mode 100644 index 639a5749f28..00000000000 --- a/apps/files_trashbin/l10n/fi.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "Error" : "Virhe", - "Delete" : "Poista" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files_trashbin/l10n/sk.js b/apps/files_trashbin/l10n/sk.js deleted file mode 100644 index 1b73b5f3afa..00000000000 --- a/apps/files_trashbin/l10n/sk.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "files_trashbin", - { - "Delete" : "Odstrániť" -}, -"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"); diff --git a/apps/files_trashbin/l10n/sk.json b/apps/files_trashbin/l10n/sk.json deleted file mode 100644 index 418f8874a6f..00000000000 --- a/apps/files_trashbin/l10n/sk.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Delete" : "Odstrániť" -},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;" -} \ No newline at end of file diff --git a/apps/files_trashbin/l10n/ur.js b/apps/files_trashbin/l10n/ur.js deleted file mode 100644 index cfdfd802748..00000000000 --- a/apps/files_trashbin/l10n/ur.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "files_trashbin", - { - "Error" : "خرابی" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files_trashbin/l10n/ur.json b/apps/files_trashbin/l10n/ur.json deleted file mode 100644 index 1c1fc3d16c1..00000000000 --- a/apps/files_trashbin/l10n/ur.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Error" : "خرابی" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/files_versions/l10n/de_CH.js b/apps/files_versions/l10n/de_CH.js deleted file mode 100644 index 9e970501fb7..00000000000 --- a/apps/files_versions/l10n/de_CH.js +++ /dev/null @@ -1,11 +0,0 @@ -OC.L10N.register( - "files_versions", - { - "Could not revert: %s" : "Konnte %s nicht zurücksetzen", - "Versions" : "Versionen", - "Failed to revert {file} to revision {timestamp}." : "Konnte {file} der Revision {timestamp} nicht rückgänging machen.", - "More versions..." : "Mehrere Versionen...", - "No other versions available" : "Keine anderen Versionen verfügbar", - "Restore" : "Wiederherstellen" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/files_versions/l10n/de_CH.json b/apps/files_versions/l10n/de_CH.json deleted file mode 100644 index 8d4b76f8c2c..00000000000 --- a/apps/files_versions/l10n/de_CH.json +++ /dev/null @@ -1,9 +0,0 @@ -{ "translations": { - "Could not revert: %s" : "Konnte %s nicht zurücksetzen", - "Versions" : "Versionen", - "Failed to revert {file} to revision {timestamp}." : "Konnte {file} der Revision {timestamp} nicht rückgänging machen.", - "More versions..." : "Mehrere Versionen...", - "No other versions available" : "Keine anderen Versionen verfügbar", - "Restore" : "Wiederherstellen" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/user_ldap/l10n/ca@valencia.js b/apps/user_ldap/l10n/ca@valencia.js deleted file mode 100644 index 37042a4f412..00000000000 --- a/apps/user_ldap/l10n/ca@valencia.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/ca@valencia.json b/apps/user_ldap/l10n/ca@valencia.json deleted file mode 100644 index 521de7ba1a8..00000000000 --- a/apps/user_ldap/l10n/ca@valencia.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/user_ldap/l10n/de_CH.js b/apps/user_ldap/l10n/de_CH.js deleted file mode 100644 index 2145f0d05ec..00000000000 --- a/apps/user_ldap/l10n/de_CH.js +++ /dev/null @@ -1,80 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Failed to clear the mappings." : "Löschen der Zuordnung fehlgeschlagen.", - "Failed to delete the server configuration" : "Löschen der Serverkonfiguration fehlgeschlagen", - "The configuration is valid and the connection could be established!" : "Die Konfiguration ist gültig und die Verbindung konnte hergestellt werden!", - "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "Die Konfiguration ist gültig aber die Verbindung ist fehlgeschlagen. Bitte überprüfen Sie die Servereinstellungen und die Anmeldeinformationen.", - "Deletion failed" : "Löschen fehlgeschlagen", - "Take over settings from recent server configuration?" : "Einstellungen von letzter Konfiguration übernehmen?", - "Keep settings?" : "Einstellungen beibehalten?", - "Cannot add server configuration" : "Das Hinzufügen der Serverkonfiguration schlug fehl", - "mappings cleared" : "Zuordnungen gelöscht", - "Success" : "Erfolg", - "Error" : "Fehler", - "Select groups" : "Wähle Gruppen", - "Connection test succeeded" : "Verbindungstest erfolgreich", - "Connection test failed" : "Verbindungstest fehlgeschlagen", - "Do you really want to delete the current Server Configuration?" : "Möchten Sie die aktuelle Serverkonfiguration wirklich löschen?", - "Confirm Deletion" : "Löschung bestätigen", - "Group Filter" : "Gruppen-Filter", - "Save" : "Speichern", - "Test Configuration" : "Testkonfiguration", - "Help" : "Hilfe", - "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Bestimmt den Filter, welcher bei einer Anmeldung angewandt wird. %%uid ersetzt den Benutzernamen bei der Anmeldung. Beispiel: \"uid=%%uid\"", - "Add Server Configuration" : "Serverkonfiguration hinzufügen", - "Host" : "Host", - "You can omit the protocol, except you require SSL. Then start with ldaps://" : "Sie können das Protokoll auslassen, ausser wenn Sie SSL benötigen. Beginnen Sie dann mit ldaps://", - "Port" : "Port", - "User DN" : "Benutzer-DN", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "Der DN des Benutzers für LDAP-Bind, z.B.: uid=agent,dc=example,dc=com. Für einen anonymen Zugriff lassen Sie DN und Passwort leer.", - "Password" : "Passwort", - "For anonymous access, leave DN and Password empty." : "Lassen Sie die Felder DN und Passwort für einen anonymen Zugang leer.", - "One Base DN per line" : "Ein Basis-DN pro Zeile", - "You can specify Base DN for users and groups in the Advanced tab" : "Sie können Basis-DN für Benutzer und Gruppen in dem «Erweitert»-Reiter konfigurieren", - "Advanced" : "Erweitert", - "Warning: Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "Warnung: Die Anwendungen user_ldap und user_webdavauth sind inkompatibel. Es kann demzufolge zu unerwarteten Verhalten kommen. Bitten Sie Ihren Systemadministator eine der beiden Anwendungen zu deaktivieren.", - "Warning: The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "Warnung: Da das PHP-Modul für LDAP nicht installiert ist, wird das Backend nicht funktionieren. Bitten Sie Ihren Systemadministrator das Modul zu installieren.", - "Connection Settings" : "Verbindungseinstellungen", - "Configuration Active" : "Konfiguration aktiv", - "When unchecked, this configuration will be skipped." : "Wenn nicht angehakt, wird diese Konfiguration übersprungen.", - "Backup (Replica) Host" : "Backup Host (Kopie)", - "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Geben Sie einen optionalen Backup Host an. Es muss sich um eine Kopie des Haupt LDAP/AD Servers handeln.", - "Backup (Replica) Port" : "Backup Port", - "Disable Main Server" : "Hauptserver deaktivieren", - "Only connect to the replica server." : "Nur zum Replikat-Server verbinden.", - "Turn off SSL certificate validation." : "Schalten Sie die SSL-Zertifikatsprüfung aus.", - "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Nur für Testzwecke geeignet, sollte Standardmäßig nicht verwendet werden. Falls die Verbindung nur mit dieser Option funktioniert, importieren Sie das SSL-Zertifikat des LDAP-Servers in Ihren %s Server.", - "Cache Time-To-Live" : "Speichere Time-To-Live zwischen", - "in seconds. A change empties the cache." : "in Sekunden. Eine Änderung leert den Cache.", - "Directory Settings" : "Ordnereinstellungen", - "User Display Name Field" : "Feld für den Anzeigenamen des Benutzers", - "The LDAP attribute to use to generate the user's display name." : "Das LDAP-Attribut zur Generierung des Anzeigenamens des Benutzers.", - "Base User Tree" : "Basis-Benutzerbaum", - "One User Base DN per line" : "Ein Benutzer Basis-DN pro Zeile", - "User Search Attributes" : "Benutzersucheigenschaften", - "Optional; one attribute per line" : "Optional; ein Attribut pro Zeile", - "Group Display Name Field" : "Feld für den Anzeigenamen der Gruppe", - "The LDAP attribute to use to generate the groups's display name." : "Das LDAP-Attribut zur Generierung des Anzeigenamens der Gruppen.", - "Base Group Tree" : "Basis-Gruppenbaum", - "One Group Base DN per line" : "Ein Gruppen Basis-DN pro Zeile", - "Group Search Attributes" : "Gruppensucheigenschaften", - "Group-Member association" : "Assoziation zwischen Gruppe und Benutzer", - "Special Attributes" : "Spezielle Eigenschaften", - "Quota Field" : "Kontingent-Feld", - "Quota Default" : "Standard-Kontingent", - "in bytes" : "in Bytes", - "Email Field" : "E-Mail-Feld", - "User Home Folder Naming Rule" : "Benennungsregel für das Home-Verzeichnis des Benutzers", - "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Ohne Eingabe wird der Benutzername (Standard) verwendet. Anderenfalls tragen Sie bitte ein LDAP/AD-Attribut ein.", - "Internal Username" : "Interner Benutzername", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Standardmässig wird der interne Benutzername mittels des UUID-Attributes erzeugt. Dies stellt sicher, dass der Benutzername einzigartig ist und keinerlei Zeichen konvertiert werden müssen. Der interne Benutzername unterliegt Beschränkungen, die nur die nachfolgenden Zeichen erlauben: [ a-zA-Z0-9_.@- ]. Andere Zeichen werden mittels ihrer korrespondierenden Zeichen ersetzt oder einfach ausgelassen. Bei Kollisionen wird ein Zähler hinzugefügt bzw. der Zähler um einen Wert erhöht. Der interne Benutzername wird benutzt, um einen Benutzer intern zu identifizieren. Es ist ebenso der standardmässig vorausgewählte Namen des Heimatverzeichnisses. Es ist auch ein Teil der Remote-URLs - zum Beispiel für alle *DAV-Dienste. Mit dieser Einstellung kann das Standardverhalten überschrieben werden. Um ein ähnliches Verhalten wie vor ownCloud 5 zu erzielen, fügen Sie das anzuzeigende Attribut des Benutzernamens in das nachfolgende Feld ein. Lassen Sie dies hingegen für das Standardverhalten leer. Die Änderungen werden sich nur auf neu gemappte (hinzugefügte) LDAP-Benutzer auswirken.", - "Internal Username Attribute:" : "Interne Eigenschaften des Benutzers:", - "Override UUID detection" : "UUID-Erkennung überschreiben", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Standardmässig wird die UUID-Eigenschaft automatisch erkannt. Die UUID-Eigenschaft wird genutzt, um einen LDAP-Benutzer und Gruppen einwandfrei zu identifizieren. Ausserdem wird der interne Benutzername erzeugt, der auf Eigenschaften der UUID basiert, wenn es oben nicht anders angegeben wurde. Sie müssen allerdings sicherstellen, dass Ihre gewählten Eigenschaften zur Identifikation der Benutzer und Gruppen eindeutig sind und zugeordnet werden können. Lassen Sie es frei, um es beim Standardverhalten zu belassen. Änderungen wirken sich nur auf neu gemappte (hinzugefügte) LDAP-Benutzer und -Gruppen aus.", - "Username-LDAP User Mapping" : "LDAP-Benutzernamenzuordnung", - "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Die Benutzernamen werden genutzt, um (Meta)Daten zuzuordnen und zu speichern. Um Benutzer eindeutig und präzise zu identifizieren, hat jeder LDAP-Benutzer einen internen Benutzernamen. Dies erfordert eine Zuordnung (mappen) von Benutzernamen zum LDAP-Benutzer. Der erstellte Benutzername wird der UUID des LDAP-Benutzernamens zugeordnet. Zusätzlich wird der DN zwischengespeichert, um die Interaktion mit dem LDAP zu minimieren, was aber nicht der Identifikation dient. Ändert sich der DN, werden die Änderungen durch gefunden. Der interne Benutzername, wird in überall verwendet. Werden die Zuordnungen gelöscht, bleiben überall Reste zurück. Die Löschung der Zuordnungen kann nicht in der Konfiguration vorgenommen werden, beeinflusst aber die LDAP-Konfiguration! Löschen Sie niemals die Zuordnungen in einer produktiven Umgebung. Löschen Sie die Zuordnungen nur in einer Test- oder Experimentierumgebung.", - "Clear Username-LDAP User Mapping" : "Lösche LDAP-Benutzernamenzuordnung", - "Clear Groupname-LDAP Group Mapping" : "Lösche LDAP-Gruppennamenzuordnung" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/de_CH.json b/apps/user_ldap/l10n/de_CH.json deleted file mode 100644 index b68fa0b2345..00000000000 --- a/apps/user_ldap/l10n/de_CH.json +++ /dev/null @@ -1,78 +0,0 @@ -{ "translations": { - "Failed to clear the mappings." : "Löschen der Zuordnung fehlgeschlagen.", - "Failed to delete the server configuration" : "Löschen der Serverkonfiguration fehlgeschlagen", - "The configuration is valid and the connection could be established!" : "Die Konfiguration ist gültig und die Verbindung konnte hergestellt werden!", - "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "Die Konfiguration ist gültig aber die Verbindung ist fehlgeschlagen. Bitte überprüfen Sie die Servereinstellungen und die Anmeldeinformationen.", - "Deletion failed" : "Löschen fehlgeschlagen", - "Take over settings from recent server configuration?" : "Einstellungen von letzter Konfiguration übernehmen?", - "Keep settings?" : "Einstellungen beibehalten?", - "Cannot add server configuration" : "Das Hinzufügen der Serverkonfiguration schlug fehl", - "mappings cleared" : "Zuordnungen gelöscht", - "Success" : "Erfolg", - "Error" : "Fehler", - "Select groups" : "Wähle Gruppen", - "Connection test succeeded" : "Verbindungstest erfolgreich", - "Connection test failed" : "Verbindungstest fehlgeschlagen", - "Do you really want to delete the current Server Configuration?" : "Möchten Sie die aktuelle Serverkonfiguration wirklich löschen?", - "Confirm Deletion" : "Löschung bestätigen", - "Group Filter" : "Gruppen-Filter", - "Save" : "Speichern", - "Test Configuration" : "Testkonfiguration", - "Help" : "Hilfe", - "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Bestimmt den Filter, welcher bei einer Anmeldung angewandt wird. %%uid ersetzt den Benutzernamen bei der Anmeldung. Beispiel: \"uid=%%uid\"", - "Add Server Configuration" : "Serverkonfiguration hinzufügen", - "Host" : "Host", - "You can omit the protocol, except you require SSL. Then start with ldaps://" : "Sie können das Protokoll auslassen, ausser wenn Sie SSL benötigen. Beginnen Sie dann mit ldaps://", - "Port" : "Port", - "User DN" : "Benutzer-DN", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "Der DN des Benutzers für LDAP-Bind, z.B.: uid=agent,dc=example,dc=com. Für einen anonymen Zugriff lassen Sie DN und Passwort leer.", - "Password" : "Passwort", - "For anonymous access, leave DN and Password empty." : "Lassen Sie die Felder DN und Passwort für einen anonymen Zugang leer.", - "One Base DN per line" : "Ein Basis-DN pro Zeile", - "You can specify Base DN for users and groups in the Advanced tab" : "Sie können Basis-DN für Benutzer und Gruppen in dem «Erweitert»-Reiter konfigurieren", - "Advanced" : "Erweitert", - "Warning: Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "Warnung: Die Anwendungen user_ldap und user_webdavauth sind inkompatibel. Es kann demzufolge zu unerwarteten Verhalten kommen. Bitten Sie Ihren Systemadministator eine der beiden Anwendungen zu deaktivieren.", - "Warning: The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "Warnung: Da das PHP-Modul für LDAP nicht installiert ist, wird das Backend nicht funktionieren. Bitten Sie Ihren Systemadministrator das Modul zu installieren.", - "Connection Settings" : "Verbindungseinstellungen", - "Configuration Active" : "Konfiguration aktiv", - "When unchecked, this configuration will be skipped." : "Wenn nicht angehakt, wird diese Konfiguration übersprungen.", - "Backup (Replica) Host" : "Backup Host (Kopie)", - "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Geben Sie einen optionalen Backup Host an. Es muss sich um eine Kopie des Haupt LDAP/AD Servers handeln.", - "Backup (Replica) Port" : "Backup Port", - "Disable Main Server" : "Hauptserver deaktivieren", - "Only connect to the replica server." : "Nur zum Replikat-Server verbinden.", - "Turn off SSL certificate validation." : "Schalten Sie die SSL-Zertifikatsprüfung aus.", - "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Nur für Testzwecke geeignet, sollte Standardmäßig nicht verwendet werden. Falls die Verbindung nur mit dieser Option funktioniert, importieren Sie das SSL-Zertifikat des LDAP-Servers in Ihren %s Server.", - "Cache Time-To-Live" : "Speichere Time-To-Live zwischen", - "in seconds. A change empties the cache." : "in Sekunden. Eine Änderung leert den Cache.", - "Directory Settings" : "Ordnereinstellungen", - "User Display Name Field" : "Feld für den Anzeigenamen des Benutzers", - "The LDAP attribute to use to generate the user's display name." : "Das LDAP-Attribut zur Generierung des Anzeigenamens des Benutzers.", - "Base User Tree" : "Basis-Benutzerbaum", - "One User Base DN per line" : "Ein Benutzer Basis-DN pro Zeile", - "User Search Attributes" : "Benutzersucheigenschaften", - "Optional; one attribute per line" : "Optional; ein Attribut pro Zeile", - "Group Display Name Field" : "Feld für den Anzeigenamen der Gruppe", - "The LDAP attribute to use to generate the groups's display name." : "Das LDAP-Attribut zur Generierung des Anzeigenamens der Gruppen.", - "Base Group Tree" : "Basis-Gruppenbaum", - "One Group Base DN per line" : "Ein Gruppen Basis-DN pro Zeile", - "Group Search Attributes" : "Gruppensucheigenschaften", - "Group-Member association" : "Assoziation zwischen Gruppe und Benutzer", - "Special Attributes" : "Spezielle Eigenschaften", - "Quota Field" : "Kontingent-Feld", - "Quota Default" : "Standard-Kontingent", - "in bytes" : "in Bytes", - "Email Field" : "E-Mail-Feld", - "User Home Folder Naming Rule" : "Benennungsregel für das Home-Verzeichnis des Benutzers", - "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Ohne Eingabe wird der Benutzername (Standard) verwendet. Anderenfalls tragen Sie bitte ein LDAP/AD-Attribut ein.", - "Internal Username" : "Interner Benutzername", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Standardmässig wird der interne Benutzername mittels des UUID-Attributes erzeugt. Dies stellt sicher, dass der Benutzername einzigartig ist und keinerlei Zeichen konvertiert werden müssen. Der interne Benutzername unterliegt Beschränkungen, die nur die nachfolgenden Zeichen erlauben: [ a-zA-Z0-9_.@- ]. Andere Zeichen werden mittels ihrer korrespondierenden Zeichen ersetzt oder einfach ausgelassen. Bei Kollisionen wird ein Zähler hinzugefügt bzw. der Zähler um einen Wert erhöht. Der interne Benutzername wird benutzt, um einen Benutzer intern zu identifizieren. Es ist ebenso der standardmässig vorausgewählte Namen des Heimatverzeichnisses. Es ist auch ein Teil der Remote-URLs - zum Beispiel für alle *DAV-Dienste. Mit dieser Einstellung kann das Standardverhalten überschrieben werden. Um ein ähnliches Verhalten wie vor ownCloud 5 zu erzielen, fügen Sie das anzuzeigende Attribut des Benutzernamens in das nachfolgende Feld ein. Lassen Sie dies hingegen für das Standardverhalten leer. Die Änderungen werden sich nur auf neu gemappte (hinzugefügte) LDAP-Benutzer auswirken.", - "Internal Username Attribute:" : "Interne Eigenschaften des Benutzers:", - "Override UUID detection" : "UUID-Erkennung überschreiben", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Standardmässig wird die UUID-Eigenschaft automatisch erkannt. Die UUID-Eigenschaft wird genutzt, um einen LDAP-Benutzer und Gruppen einwandfrei zu identifizieren. Ausserdem wird der interne Benutzername erzeugt, der auf Eigenschaften der UUID basiert, wenn es oben nicht anders angegeben wurde. Sie müssen allerdings sicherstellen, dass Ihre gewählten Eigenschaften zur Identifikation der Benutzer und Gruppen eindeutig sind und zugeordnet werden können. Lassen Sie es frei, um es beim Standardverhalten zu belassen. Änderungen wirken sich nur auf neu gemappte (hinzugefügte) LDAP-Benutzer und -Gruppen aus.", - "Username-LDAP User Mapping" : "LDAP-Benutzernamenzuordnung", - "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Die Benutzernamen werden genutzt, um (Meta)Daten zuzuordnen und zu speichern. Um Benutzer eindeutig und präzise zu identifizieren, hat jeder LDAP-Benutzer einen internen Benutzernamen. Dies erfordert eine Zuordnung (mappen) von Benutzernamen zum LDAP-Benutzer. Der erstellte Benutzername wird der UUID des LDAP-Benutzernamens zugeordnet. Zusätzlich wird der DN zwischengespeichert, um die Interaktion mit dem LDAP zu minimieren, was aber nicht der Identifikation dient. Ändert sich der DN, werden die Änderungen durch gefunden. Der interne Benutzername, wird in überall verwendet. Werden die Zuordnungen gelöscht, bleiben überall Reste zurück. Die Löschung der Zuordnungen kann nicht in der Konfiguration vorgenommen werden, beeinflusst aber die LDAP-Konfiguration! Löschen Sie niemals die Zuordnungen in einer produktiven Umgebung. Löschen Sie die Zuordnungen nur in einer Test- oder Experimentierumgebung.", - "Clear Username-LDAP User Mapping" : "Lösche LDAP-Benutzernamenzuordnung", - "Clear Groupname-LDAP Group Mapping" : "Lösche LDAP-Gruppennamenzuordnung" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/user_ldap/l10n/en_NZ.js b/apps/user_ldap/l10n/en_NZ.js deleted file mode 100644 index 37042a4f412..00000000000 --- a/apps/user_ldap/l10n/en_NZ.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/en_NZ.json b/apps/user_ldap/l10n/en_NZ.json deleted file mode 100644 index 521de7ba1a8..00000000000 --- a/apps/user_ldap/l10n/en_NZ.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/user_ldap/l10n/es_BO.js b/apps/user_ldap/l10n/es_BO.js deleted file mode 100644 index 37042a4f412..00000000000 --- a/apps/user_ldap/l10n/es_BO.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/es_BO.json b/apps/user_ldap/l10n/es_BO.json deleted file mode 100644 index 521de7ba1a8..00000000000 --- a/apps/user_ldap/l10n/es_BO.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/user_ldap/l10n/es_CO.js b/apps/user_ldap/l10n/es_CO.js deleted file mode 100644 index 37042a4f412..00000000000 --- a/apps/user_ldap/l10n/es_CO.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/es_CO.json b/apps/user_ldap/l10n/es_CO.json deleted file mode 100644 index 521de7ba1a8..00000000000 --- a/apps/user_ldap/l10n/es_CO.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/user_ldap/l10n/es_CR.js b/apps/user_ldap/l10n/es_CR.js deleted file mode 100644 index 37042a4f412..00000000000 --- a/apps/user_ldap/l10n/es_CR.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/es_CR.json b/apps/user_ldap/l10n/es_CR.json deleted file mode 100644 index 521de7ba1a8..00000000000 --- a/apps/user_ldap/l10n/es_CR.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/user_ldap/l10n/es_EC.js b/apps/user_ldap/l10n/es_EC.js deleted file mode 100644 index 37042a4f412..00000000000 --- a/apps/user_ldap/l10n/es_EC.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/es_EC.json b/apps/user_ldap/l10n/es_EC.json deleted file mode 100644 index 521de7ba1a8..00000000000 --- a/apps/user_ldap/l10n/es_EC.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/user_ldap/l10n/es_PE.js b/apps/user_ldap/l10n/es_PE.js deleted file mode 100644 index 37042a4f412..00000000000 --- a/apps/user_ldap/l10n/es_PE.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/es_PE.json b/apps/user_ldap/l10n/es_PE.json deleted file mode 100644 index 521de7ba1a8..00000000000 --- a/apps/user_ldap/l10n/es_PE.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/user_ldap/l10n/es_PY.js b/apps/user_ldap/l10n/es_PY.js deleted file mode 100644 index 37042a4f412..00000000000 --- a/apps/user_ldap/l10n/es_PY.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/es_PY.json b/apps/user_ldap/l10n/es_PY.json deleted file mode 100644 index 521de7ba1a8..00000000000 --- a/apps/user_ldap/l10n/es_PY.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/user_ldap/l10n/es_US.js b/apps/user_ldap/l10n/es_US.js deleted file mode 100644 index 37042a4f412..00000000000 --- a/apps/user_ldap/l10n/es_US.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/es_US.json b/apps/user_ldap/l10n/es_US.json deleted file mode 100644 index 521de7ba1a8..00000000000 --- a/apps/user_ldap/l10n/es_US.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/user_ldap/l10n/es_UY.js b/apps/user_ldap/l10n/es_UY.js deleted file mode 100644 index 37042a4f412..00000000000 --- a/apps/user_ldap/l10n/es_UY.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/es_UY.json b/apps/user_ldap/l10n/es_UY.json deleted file mode 100644 index 521de7ba1a8..00000000000 --- a/apps/user_ldap/l10n/es_UY.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/user_ldap/l10n/eu_ES.js b/apps/user_ldap/l10n/eu_ES.js deleted file mode 100644 index e2907d44953..00000000000 --- a/apps/user_ldap/l10n/eu_ES.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Save" : "Gorde" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/eu_ES.json b/apps/user_ldap/l10n/eu_ES.json deleted file mode 100644 index 7a78f4becee..00000000000 --- a/apps/user_ldap/l10n/eu_ES.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Save" : "Gorde" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/user_ldap/l10n/fi.js b/apps/user_ldap/l10n/fi.js deleted file mode 100644 index 7e8944002b2..00000000000 --- a/apps/user_ldap/l10n/fi.js +++ /dev/null @@ -1,11 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Error" : "Virhe", - "Server" : "Palvelin", - "Save" : "Tallenna", - "Help" : "Apua", - "Password" : "Salasana", - "Back" : "Takaisin" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/fi.json b/apps/user_ldap/l10n/fi.json deleted file mode 100644 index 7b82cac2bd2..00000000000 --- a/apps/user_ldap/l10n/fi.json +++ /dev/null @@ -1,9 +0,0 @@ -{ "translations": { - "Error" : "Virhe", - "Server" : "Palvelin", - "Save" : "Tallenna", - "Help" : "Apua", - "Password" : "Salasana", - "Back" : "Takaisin" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/user_ldap/l10n/fr_CA.js b/apps/user_ldap/l10n/fr_CA.js deleted file mode 100644 index 95c97db2f9c..00000000000 --- a/apps/user_ldap/l10n/fr_CA.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -}, -"nplurals=2; plural=(n > 1);"); diff --git a/apps/user_ldap/l10n/fr_CA.json b/apps/user_ldap/l10n/fr_CA.json deleted file mode 100644 index 8e0cd6f6783..00000000000 --- a/apps/user_ldap/l10n/fr_CA.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n > 1);" -} \ No newline at end of file diff --git a/apps/user_ldap/l10n/hi_IN.js b/apps/user_ldap/l10n/hi_IN.js deleted file mode 100644 index 37042a4f412..00000000000 --- a/apps/user_ldap/l10n/hi_IN.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/hi_IN.json b/apps/user_ldap/l10n/hi_IN.json deleted file mode 100644 index 521de7ba1a8..00000000000 --- a/apps/user_ldap/l10n/hi_IN.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/user_ldap/l10n/sk.js b/apps/user_ldap/l10n/sk.js deleted file mode 100644 index 33b6d85e734..00000000000 --- a/apps/user_ldap/l10n/sk.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Save" : "Uložiť", - "Advanced" : "Pokročilé" -}, -"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"); diff --git a/apps/user_ldap/l10n/sk.json b/apps/user_ldap/l10n/sk.json deleted file mode 100644 index 52c7f32624b..00000000000 --- a/apps/user_ldap/l10n/sk.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "Save" : "Uložiť", - "Advanced" : "Pokročilé" -},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;" -} \ No newline at end of file diff --git a/apps/user_ldap/l10n/ur.js b/apps/user_ldap/l10n/ur.js deleted file mode 100644 index 7dfbc33c3e6..00000000000 --- a/apps/user_ldap/l10n/ur.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "user_ldap", - { - "Error" : "خرابی" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/ur.json b/apps/user_ldap/l10n/ur.json deleted file mode 100644 index 1c1fc3d16c1..00000000000 --- a/apps/user_ldap/l10n/ur.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Error" : "خرابی" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/user_webdavauth/l10n/de_CH.js b/apps/user_webdavauth/l10n/de_CH.js deleted file mode 100644 index 84bcb9d4efb..00000000000 --- a/apps/user_webdavauth/l10n/de_CH.js +++ /dev/null @@ -1,8 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "WebDAV Authentication" : "WebDAV-Authentifizierung", - "Save" : "Speichern", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Die Benutzerdaten werden an diese Adresse gesendet. Dieses Plugin prüft die Antwort und wird die HTTP-Statuscodes 401 und 403 als ungültige Daten interpretieren und alle anderen Antworten als gültige Daten." -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/de_CH.json b/apps/user_webdavauth/l10n/de_CH.json deleted file mode 100644 index 1c47d57a349..00000000000 --- a/apps/user_webdavauth/l10n/de_CH.json +++ /dev/null @@ -1,6 +0,0 @@ -{ "translations": { - "WebDAV Authentication" : "WebDAV-Authentifizierung", - "Save" : "Speichern", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Die Benutzerdaten werden an diese Adresse gesendet. Dieses Plugin prüft die Antwort und wird die HTTP-Statuscodes 401 und 403 als ungültige Daten interpretieren und alle anderen Antworten als gültige Daten." -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/user_webdavauth/l10n/eu_ES.js b/apps/user_webdavauth/l10n/eu_ES.js deleted file mode 100644 index 68ab406f834..00000000000 --- a/apps/user_webdavauth/l10n/eu_ES.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "Save" : "Gorde" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/eu_ES.json b/apps/user_webdavauth/l10n/eu_ES.json deleted file mode 100644 index 7a78f4becee..00000000000 --- a/apps/user_webdavauth/l10n/eu_ES.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Save" : "Gorde" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/user_webdavauth/l10n/fi.js b/apps/user_webdavauth/l10n/fi.js deleted file mode 100644 index 09bd8e55e7f..00000000000 --- a/apps/user_webdavauth/l10n/fi.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "Save" : "Tallenna" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/fi.json b/apps/user_webdavauth/l10n/fi.json deleted file mode 100644 index f4a8647859b..00000000000 --- a/apps/user_webdavauth/l10n/fi.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Save" : "Tallenna" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/apps/user_webdavauth/l10n/sk.js b/apps/user_webdavauth/l10n/sk.js deleted file mode 100644 index 299b57be670..00000000000 --- a/apps/user_webdavauth/l10n/sk.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "user_webdavauth", - { - "Save" : "Uložiť" -}, -"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"); diff --git a/apps/user_webdavauth/l10n/sk.json b/apps/user_webdavauth/l10n/sk.json deleted file mode 100644 index 48cd128194e..00000000000 --- a/apps/user_webdavauth/l10n/sk.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Save" : "Uložiť" -},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;" -} \ No newline at end of file diff --git a/core/l10n/ca@valencia.js b/core/l10n/ca@valencia.js deleted file mode 100644 index 4cb36aaaaac..00000000000 --- a/core/l10n/ca@valencia.js +++ /dev/null @@ -1,8 +0,0 @@ -OC.L10N.register( - "core", - { - "_{count} file conflict_::_{count} file conflicts_" : ["",""], - "_download %n file_::_download %n files_" : ["",""], - "_{count} search result in other places_::_{count} search results in other places_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/ca@valencia.json b/core/l10n/ca@valencia.json deleted file mode 100644 index 43fce52c5cf..00000000000 --- a/core/l10n/ca@valencia.json +++ /dev/null @@ -1,6 +0,0 @@ -{ "translations": { - "_{count} file conflict_::_{count} file conflicts_" : ["",""], - "_download %n file_::_download %n files_" : ["",""], - "_{count} search result in other places_::_{count} search results in other places_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/core/l10n/de_CH.js b/core/l10n/de_CH.js deleted file mode 100644 index a95205b439b..00000000000 --- a/core/l10n/de_CH.js +++ /dev/null @@ -1,105 +0,0 @@ -OC.L10N.register( - "core", - { - "Turned on maintenance mode" : "Wartungsmodus eingeschaltet", - "Turned off maintenance mode" : "Wartungsmodus ausgeschaltet", - "Updated database" : "Datenbank aktualisiert", - "Sunday" : "Sonntag", - "Monday" : "Montag", - "Tuesday" : "Dienstag", - "Wednesday" : "Mittwoch", - "Thursday" : "Donnerstag", - "Friday" : "Freitag", - "Saturday" : "Samstag", - "January" : "Januar", - "February" : "Februar", - "March" : "März", - "April" : "April", - "May" : "Mai", - "June" : "Juni", - "July" : "Juli", - "August" : "August", - "September" : "September", - "October" : "Oktober", - "November" : "November", - "December" : "Dezember", - "Settings" : "Einstellungen", - "Saving..." : "Speichern...", - "Reset password" : "Passwort zurücksetzen", - "No" : "Nein", - "Yes" : "Ja", - "Choose" : "Auswählen", - "Ok" : "OK", - "New Files" : "Neue Dateien", - "Cancel" : "Abbrechen", - "Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." : "Ihr Web-Server ist noch nicht für eine Datei-Synchronisation konfiguriert, weil die WebDAV-Schnittstelle vermutlich defekt ist.", - "This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." : "Dieser Server hat keine funktionierende Internetverbindung. Dies bedeutet das einige Funktionen wie z.B. das Einbinden von externen Speichern, Update-Benachrichtigungen oder die Installation von Drittanbieter-Apps nicht funktionieren. Der Fernzugriff auf Dateien und das Senden von Benachrichtigungsmails funktioniert eventuell ebenfalls nicht. Wir empfehlen die Internetverbindung für diesen Server zu aktivieren wenn Sie alle Funktionen nutzen wollen.", - "Shared" : "Geteilt", - "Share" : "Teilen", - "Error" : "Fehler", - "Error while sharing" : "Fehler beim Teilen", - "Error while unsharing" : "Fehler beim Aufheben der Freigabe", - "Error while changing permissions" : "Fehler bei der Änderung der Rechte", - "Shared with you and the group {group} by {owner}" : "Von {owner} mit Ihnen und der Gruppe {group} geteilt.", - "Shared with you by {owner}" : "Von {owner} mit Ihnen geteilt.", - "Password protect" : "Passwortschutz", - "Allow Public Upload" : "Öffentliches Hochladen erlauben", - "Email link to person" : "Link per E-Mail verschicken", - "Send" : "Senden", - "Set expiration date" : "Ein Ablaufdatum setzen", - "Expiration date" : "Ablaufdatum", - "group" : "Gruppe", - "Resharing is not allowed" : "Das Weiterverteilen ist nicht erlaubt", - "Shared in {item} with {user}" : "Freigegeben in {item} von {user}", - "Unshare" : "Freigabe aufheben", - "can edit" : "kann bearbeiten", - "access control" : "Zugriffskontrolle", - "create" : "erstellen", - "update" : "aktualisieren", - "delete" : "löschen", - "Password protected" : "Passwortgeschützt", - "Error unsetting expiration date" : "Fehler beim Entfernen des Ablaufdatums", - "Error setting expiration date" : "Fehler beim Setzen des Ablaufdatums", - "Sending ..." : "Sende ...", - "Email sent" : "Email gesendet", - "Warning" : "Warnung", - "The object type is not specified." : "Der Objekttyp ist nicht angegeben.", - "Delete" : "Löschen", - "Add" : "Hinzufügen", - "The update was successful. Redirecting you to ownCloud now." : "Das Update war erfolgreich. Sie werden nun zu ownCloud weitergeleitet.", - "%s password reset" : "%s-Passwort zurücksetzen", - "Use the following link to reset your password: {link}" : "Nutzen Sie den nachfolgenden Link, um Ihr Passwort zurückzusetzen: {link}", - "You will receive a link to reset your password via Email." : "Sie erhalten einen Link per E-Mail, um Ihr Passwort zurückzusetzen.", - "Username" : "Benutzername", - "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset. If you are not sure what to do, please contact your administrator before you continue. Do you really want to continue?" : "Ihre Dateien sind verschlüsselt. Wenn Sie den Wiederherstellungsschlüssel nicht aktiviert haben, wird es keine Möglichkeit geben, um Ihre Daten wiederzubekommen, nachdem Ihr Passwort zurückgesetzt wurde. Wenn Sie sich nicht sicher sind, was Sie tun sollen, wenden Sie sich bitte an Ihren Administrator, bevor Sie fortfahren. Wollen Sie wirklich fortfahren?", - "Yes, I really want to reset my password now" : "Ja, ich möchte jetzt mein Passwort wirklich zurücksetzen.", - "Reset" : "Zurücksetzen", - "New password" : "Neues Passwort", - "Personal" : "Persönlich", - "Users" : "Benutzer", - "Apps" : "Apps", - "Admin" : "Administrator", - "Help" : "Hilfe", - "Access forbidden" : "Zugriff verboten", - "Security Warning" : "Sicherheitshinweis", - "Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" : "Ihre PHP Version ist durch die NULL Byte Attacke (CVE-2006-7243) angreifbar", - "Please update your PHP installation to use %s securely." : "Bitte aktualisieren Sie Ihre PHP-Installation um %s sicher nutzen zu können.", - "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "Ihr Datenverzeichnis und Ihre Dateien sind wahrscheinlich vom Internet aus erreichbar, weil die .htaccess-Datei nicht funktioniert.", - "For information how to properly configure your server, please see the documentation." : "Für Informationen, wie Sie Ihren Server richtig konfigurieren lesen Sie bitte die Dokumentation.", - "Create an admin account" : "Administrator-Konto anlegen", - "Password" : "Passwort", - "Data folder" : "Datenverzeichnis", - "Configure the database" : "Datenbank einrichten", - "Database user" : "Datenbank-Benutzer", - "Database password" : "Datenbank-Passwort", - "Database name" : "Datenbank-Name", - "Database tablespace" : "Datenbank-Tablespace", - "Database host" : "Datenbank-Host", - "Finish setup" : "Installation abschliessen", - "%s is available. Get more information on how to update." : "%s ist verfügbar. Holen Sie weitere Informationen zu Aktualisierungen ein.", - "Log out" : "Abmelden", - "remember" : "merken", - "Log in" : "Einloggen", - "Alternative Logins" : "Alternative Logins" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/de_CH.json b/core/l10n/de_CH.json deleted file mode 100644 index 8d84ade00cd..00000000000 --- a/core/l10n/de_CH.json +++ /dev/null @@ -1,103 +0,0 @@ -{ "translations": { - "Turned on maintenance mode" : "Wartungsmodus eingeschaltet", - "Turned off maintenance mode" : "Wartungsmodus ausgeschaltet", - "Updated database" : "Datenbank aktualisiert", - "Sunday" : "Sonntag", - "Monday" : "Montag", - "Tuesday" : "Dienstag", - "Wednesday" : "Mittwoch", - "Thursday" : "Donnerstag", - "Friday" : "Freitag", - "Saturday" : "Samstag", - "January" : "Januar", - "February" : "Februar", - "March" : "März", - "April" : "April", - "May" : "Mai", - "June" : "Juni", - "July" : "Juli", - "August" : "August", - "September" : "September", - "October" : "Oktober", - "November" : "November", - "December" : "Dezember", - "Settings" : "Einstellungen", - "Saving..." : "Speichern...", - "Reset password" : "Passwort zurücksetzen", - "No" : "Nein", - "Yes" : "Ja", - "Choose" : "Auswählen", - "Ok" : "OK", - "New Files" : "Neue Dateien", - "Cancel" : "Abbrechen", - "Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." : "Ihr Web-Server ist noch nicht für eine Datei-Synchronisation konfiguriert, weil die WebDAV-Schnittstelle vermutlich defekt ist.", - "This server has no working internet connection. This means that some of the features like mounting of external storage, notifications about updates or installation of 3rd party apps don´t work. Accessing files from remote and sending of notification emails might also not work. We suggest to enable internet connection for this server if you want to have all features." : "Dieser Server hat keine funktionierende Internetverbindung. Dies bedeutet das einige Funktionen wie z.B. das Einbinden von externen Speichern, Update-Benachrichtigungen oder die Installation von Drittanbieter-Apps nicht funktionieren. Der Fernzugriff auf Dateien und das Senden von Benachrichtigungsmails funktioniert eventuell ebenfalls nicht. Wir empfehlen die Internetverbindung für diesen Server zu aktivieren wenn Sie alle Funktionen nutzen wollen.", - "Shared" : "Geteilt", - "Share" : "Teilen", - "Error" : "Fehler", - "Error while sharing" : "Fehler beim Teilen", - "Error while unsharing" : "Fehler beim Aufheben der Freigabe", - "Error while changing permissions" : "Fehler bei der Änderung der Rechte", - "Shared with you and the group {group} by {owner}" : "Von {owner} mit Ihnen und der Gruppe {group} geteilt.", - "Shared with you by {owner}" : "Von {owner} mit Ihnen geteilt.", - "Password protect" : "Passwortschutz", - "Allow Public Upload" : "Öffentliches Hochladen erlauben", - "Email link to person" : "Link per E-Mail verschicken", - "Send" : "Senden", - "Set expiration date" : "Ein Ablaufdatum setzen", - "Expiration date" : "Ablaufdatum", - "group" : "Gruppe", - "Resharing is not allowed" : "Das Weiterverteilen ist nicht erlaubt", - "Shared in {item} with {user}" : "Freigegeben in {item} von {user}", - "Unshare" : "Freigabe aufheben", - "can edit" : "kann bearbeiten", - "access control" : "Zugriffskontrolle", - "create" : "erstellen", - "update" : "aktualisieren", - "delete" : "löschen", - "Password protected" : "Passwortgeschützt", - "Error unsetting expiration date" : "Fehler beim Entfernen des Ablaufdatums", - "Error setting expiration date" : "Fehler beim Setzen des Ablaufdatums", - "Sending ..." : "Sende ...", - "Email sent" : "Email gesendet", - "Warning" : "Warnung", - "The object type is not specified." : "Der Objekttyp ist nicht angegeben.", - "Delete" : "Löschen", - "Add" : "Hinzufügen", - "The update was successful. Redirecting you to ownCloud now." : "Das Update war erfolgreich. Sie werden nun zu ownCloud weitergeleitet.", - "%s password reset" : "%s-Passwort zurücksetzen", - "Use the following link to reset your password: {link}" : "Nutzen Sie den nachfolgenden Link, um Ihr Passwort zurückzusetzen: {link}", - "You will receive a link to reset your password via Email." : "Sie erhalten einen Link per E-Mail, um Ihr Passwort zurückzusetzen.", - "Username" : "Benutzername", - "Your files are encrypted. If you haven't enabled the recovery key, there will be no way to get your data back after your password is reset. If you are not sure what to do, please contact your administrator before you continue. Do you really want to continue?" : "Ihre Dateien sind verschlüsselt. Wenn Sie den Wiederherstellungsschlüssel nicht aktiviert haben, wird es keine Möglichkeit geben, um Ihre Daten wiederzubekommen, nachdem Ihr Passwort zurückgesetzt wurde. Wenn Sie sich nicht sicher sind, was Sie tun sollen, wenden Sie sich bitte an Ihren Administrator, bevor Sie fortfahren. Wollen Sie wirklich fortfahren?", - "Yes, I really want to reset my password now" : "Ja, ich möchte jetzt mein Passwort wirklich zurücksetzen.", - "Reset" : "Zurücksetzen", - "New password" : "Neues Passwort", - "Personal" : "Persönlich", - "Users" : "Benutzer", - "Apps" : "Apps", - "Admin" : "Administrator", - "Help" : "Hilfe", - "Access forbidden" : "Zugriff verboten", - "Security Warning" : "Sicherheitshinweis", - "Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" : "Ihre PHP Version ist durch die NULL Byte Attacke (CVE-2006-7243) angreifbar", - "Please update your PHP installation to use %s securely." : "Bitte aktualisieren Sie Ihre PHP-Installation um %s sicher nutzen zu können.", - "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "Ihr Datenverzeichnis und Ihre Dateien sind wahrscheinlich vom Internet aus erreichbar, weil die .htaccess-Datei nicht funktioniert.", - "For information how to properly configure your server, please see the documentation." : "Für Informationen, wie Sie Ihren Server richtig konfigurieren lesen Sie bitte die Dokumentation.", - "Create an admin account" : "Administrator-Konto anlegen", - "Password" : "Passwort", - "Data folder" : "Datenverzeichnis", - "Configure the database" : "Datenbank einrichten", - "Database user" : "Datenbank-Benutzer", - "Database password" : "Datenbank-Passwort", - "Database name" : "Datenbank-Name", - "Database tablespace" : "Datenbank-Tablespace", - "Database host" : "Datenbank-Host", - "Finish setup" : "Installation abschliessen", - "%s is available. Get more information on how to update." : "%s ist verfügbar. Holen Sie weitere Informationen zu Aktualisierungen ein.", - "Log out" : "Abmelden", - "remember" : "merken", - "Log in" : "Einloggen", - "Alternative Logins" : "Alternative Logins" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/core/l10n/en_NZ.js b/core/l10n/en_NZ.js deleted file mode 100644 index 4cb36aaaaac..00000000000 --- a/core/l10n/en_NZ.js +++ /dev/null @@ -1,8 +0,0 @@ -OC.L10N.register( - "core", - { - "_{count} file conflict_::_{count} file conflicts_" : ["",""], - "_download %n file_::_download %n files_" : ["",""], - "_{count} search result in other places_::_{count} search results in other places_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/en_NZ.json b/core/l10n/en_NZ.json deleted file mode 100644 index 43fce52c5cf..00000000000 --- a/core/l10n/en_NZ.json +++ /dev/null @@ -1,6 +0,0 @@ -{ "translations": { - "_{count} file conflict_::_{count} file conflicts_" : ["",""], - "_download %n file_::_download %n files_" : ["",""], - "_{count} search result in other places_::_{count} search results in other places_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/core/l10n/es_BO.js b/core/l10n/es_BO.js deleted file mode 100644 index 4cb36aaaaac..00000000000 --- a/core/l10n/es_BO.js +++ /dev/null @@ -1,8 +0,0 @@ -OC.L10N.register( - "core", - { - "_{count} file conflict_::_{count} file conflicts_" : ["",""], - "_download %n file_::_download %n files_" : ["",""], - "_{count} search result in other places_::_{count} search results in other places_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/es_BO.json b/core/l10n/es_BO.json deleted file mode 100644 index 43fce52c5cf..00000000000 --- a/core/l10n/es_BO.json +++ /dev/null @@ -1,6 +0,0 @@ -{ "translations": { - "_{count} file conflict_::_{count} file conflicts_" : ["",""], - "_download %n file_::_download %n files_" : ["",""], - "_{count} search result in other places_::_{count} search results in other places_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/core/l10n/es_CO.js b/core/l10n/es_CO.js deleted file mode 100644 index 4cb36aaaaac..00000000000 --- a/core/l10n/es_CO.js +++ /dev/null @@ -1,8 +0,0 @@ -OC.L10N.register( - "core", - { - "_{count} file conflict_::_{count} file conflicts_" : ["",""], - "_download %n file_::_download %n files_" : ["",""], - "_{count} search result in other places_::_{count} search results in other places_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/es_CO.json b/core/l10n/es_CO.json deleted file mode 100644 index 43fce52c5cf..00000000000 --- a/core/l10n/es_CO.json +++ /dev/null @@ -1,6 +0,0 @@ -{ "translations": { - "_{count} file conflict_::_{count} file conflicts_" : ["",""], - "_download %n file_::_download %n files_" : ["",""], - "_{count} search result in other places_::_{count} search results in other places_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/core/l10n/es_CR.js b/core/l10n/es_CR.js deleted file mode 100644 index 4cb36aaaaac..00000000000 --- a/core/l10n/es_CR.js +++ /dev/null @@ -1,8 +0,0 @@ -OC.L10N.register( - "core", - { - "_{count} file conflict_::_{count} file conflicts_" : ["",""], - "_download %n file_::_download %n files_" : ["",""], - "_{count} search result in other places_::_{count} search results in other places_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/es_CR.json b/core/l10n/es_CR.json deleted file mode 100644 index 43fce52c5cf..00000000000 --- a/core/l10n/es_CR.json +++ /dev/null @@ -1,6 +0,0 @@ -{ "translations": { - "_{count} file conflict_::_{count} file conflicts_" : ["",""], - "_download %n file_::_download %n files_" : ["",""], - "_{count} search result in other places_::_{count} search results in other places_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/core/l10n/es_EC.js b/core/l10n/es_EC.js deleted file mode 100644 index 4cb36aaaaac..00000000000 --- a/core/l10n/es_EC.js +++ /dev/null @@ -1,8 +0,0 @@ -OC.L10N.register( - "core", - { - "_{count} file conflict_::_{count} file conflicts_" : ["",""], - "_download %n file_::_download %n files_" : ["",""], - "_{count} search result in other places_::_{count} search results in other places_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/es_EC.json b/core/l10n/es_EC.json deleted file mode 100644 index 43fce52c5cf..00000000000 --- a/core/l10n/es_EC.json +++ /dev/null @@ -1,6 +0,0 @@ -{ "translations": { - "_{count} file conflict_::_{count} file conflicts_" : ["",""], - "_download %n file_::_download %n files_" : ["",""], - "_{count} search result in other places_::_{count} search results in other places_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/core/l10n/es_PE.js b/core/l10n/es_PE.js deleted file mode 100644 index 4cb36aaaaac..00000000000 --- a/core/l10n/es_PE.js +++ /dev/null @@ -1,8 +0,0 @@ -OC.L10N.register( - "core", - { - "_{count} file conflict_::_{count} file conflicts_" : ["",""], - "_download %n file_::_download %n files_" : ["",""], - "_{count} search result in other places_::_{count} search results in other places_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/es_PE.json b/core/l10n/es_PE.json deleted file mode 100644 index 43fce52c5cf..00000000000 --- a/core/l10n/es_PE.json +++ /dev/null @@ -1,6 +0,0 @@ -{ "translations": { - "_{count} file conflict_::_{count} file conflicts_" : ["",""], - "_download %n file_::_download %n files_" : ["",""], - "_{count} search result in other places_::_{count} search results in other places_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/core/l10n/es_PY.js b/core/l10n/es_PY.js deleted file mode 100644 index 4cb36aaaaac..00000000000 --- a/core/l10n/es_PY.js +++ /dev/null @@ -1,8 +0,0 @@ -OC.L10N.register( - "core", - { - "_{count} file conflict_::_{count} file conflicts_" : ["",""], - "_download %n file_::_download %n files_" : ["",""], - "_{count} search result in other places_::_{count} search results in other places_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/es_PY.json b/core/l10n/es_PY.json deleted file mode 100644 index 43fce52c5cf..00000000000 --- a/core/l10n/es_PY.json +++ /dev/null @@ -1,6 +0,0 @@ -{ "translations": { - "_{count} file conflict_::_{count} file conflicts_" : ["",""], - "_download %n file_::_download %n files_" : ["",""], - "_{count} search result in other places_::_{count} search results in other places_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/core/l10n/es_US.js b/core/l10n/es_US.js deleted file mode 100644 index 4cb36aaaaac..00000000000 --- a/core/l10n/es_US.js +++ /dev/null @@ -1,8 +0,0 @@ -OC.L10N.register( - "core", - { - "_{count} file conflict_::_{count} file conflicts_" : ["",""], - "_download %n file_::_download %n files_" : ["",""], - "_{count} search result in other places_::_{count} search results in other places_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/es_US.json b/core/l10n/es_US.json deleted file mode 100644 index 43fce52c5cf..00000000000 --- a/core/l10n/es_US.json +++ /dev/null @@ -1,6 +0,0 @@ -{ "translations": { - "_{count} file conflict_::_{count} file conflicts_" : ["",""], - "_download %n file_::_download %n files_" : ["",""], - "_{count} search result in other places_::_{count} search results in other places_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/core/l10n/es_UY.js b/core/l10n/es_UY.js deleted file mode 100644 index 4cb36aaaaac..00000000000 --- a/core/l10n/es_UY.js +++ /dev/null @@ -1,8 +0,0 @@ -OC.L10N.register( - "core", - { - "_{count} file conflict_::_{count} file conflicts_" : ["",""], - "_download %n file_::_download %n files_" : ["",""], - "_{count} search result in other places_::_{count} search results in other places_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/es_UY.json b/core/l10n/es_UY.json deleted file mode 100644 index 43fce52c5cf..00000000000 --- a/core/l10n/es_UY.json +++ /dev/null @@ -1,6 +0,0 @@ -{ "translations": { - "_{count} file conflict_::_{count} file conflicts_" : ["",""], - "_download %n file_::_download %n files_" : ["",""], - "_{count} search result in other places_::_{count} search results in other places_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/core/l10n/eu_ES.js b/core/l10n/eu_ES.js deleted file mode 100644 index 847f4cc5da0..00000000000 --- a/core/l10n/eu_ES.js +++ /dev/null @@ -1,8 +0,0 @@ -OC.L10N.register( - "core", - { - "Cancel" : "Ezeztatu", - "Delete" : "Ezabatu", - "Personal" : "Pertsonala" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/eu_ES.json b/core/l10n/eu_ES.json deleted file mode 100644 index 0f7c86a7b9e..00000000000 --- a/core/l10n/eu_ES.json +++ /dev/null @@ -1,6 +0,0 @@ -{ "translations": { - "Cancel" : "Ezeztatu", - "Delete" : "Ezabatu", - "Personal" : "Pertsonala" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/core/l10n/fi.js b/core/l10n/fi.js deleted file mode 100644 index 84301350b9b..00000000000 --- a/core/l10n/fi.js +++ /dev/null @@ -1,18 +0,0 @@ -OC.L10N.register( - "core", - { - "Settings" : "Asetukset", - "No" : "EI", - "Yes" : "KYLLÄ", - "Choose" : "Valitse", - "Cancel" : "Peruuta", - "Error" : "Virhe", - "Share link" : "Jaa linkki", - "Password" : "Salasana", - "Delete" : "Poista", - "Add" : "Lisää", - "Help" : "Apua", - "Username" : "Käyttäjätunnus", - "Log in" : "Kirjaudu sisään" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/fi.json b/core/l10n/fi.json deleted file mode 100644 index d9a8d572f51..00000000000 --- a/core/l10n/fi.json +++ /dev/null @@ -1,16 +0,0 @@ -{ "translations": { - "Settings" : "Asetukset", - "No" : "EI", - "Yes" : "KYLLÄ", - "Choose" : "Valitse", - "Cancel" : "Peruuta", - "Error" : "Virhe", - "Share link" : "Jaa linkki", - "Password" : "Salasana", - "Delete" : "Poista", - "Add" : "Lisää", - "Help" : "Apua", - "Username" : "Käyttäjätunnus", - "Log in" : "Kirjaudu sisään" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/core/l10n/fr_CA.js b/core/l10n/fr_CA.js deleted file mode 100644 index 572404948ed..00000000000 --- a/core/l10n/fr_CA.js +++ /dev/null @@ -1,8 +0,0 @@ -OC.L10N.register( - "core", - { - "_{count} file conflict_::_{count} file conflicts_" : ["",""], - "_download %n file_::_download %n files_" : ["",""], - "_{count} search result in other places_::_{count} search results in other places_" : ["",""] -}, -"nplurals=2; plural=(n > 1);"); diff --git a/core/l10n/fr_CA.json b/core/l10n/fr_CA.json deleted file mode 100644 index b43ffe08ed3..00000000000 --- a/core/l10n/fr_CA.json +++ /dev/null @@ -1,6 +0,0 @@ -{ "translations": { - "_{count} file conflict_::_{count} file conflicts_" : ["",""], - "_download %n file_::_download %n files_" : ["",""], - "_{count} search result in other places_::_{count} search results in other places_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n > 1);" -} \ No newline at end of file diff --git a/core/l10n/hi_IN.js b/core/l10n/hi_IN.js deleted file mode 100644 index c483b4ab65d..00000000000 --- a/core/l10n/hi_IN.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "core", - { - "_{count} file conflict_::_{count} file conflicts_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/hi_IN.json b/core/l10n/hi_IN.json deleted file mode 100644 index 52ecaf565a9..00000000000 --- a/core/l10n/hi_IN.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "_{count} file conflict_::_{count} file conflicts_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/core/l10n/ignorelist b/core/l10n/ignorelist deleted file mode 100644 index a2b225cbe4a..00000000000 --- a/core/l10n/ignorelist +++ /dev/null @@ -1 +0,0 @@ -js/jquery-ui-1.8.16.custom.min.js diff --git a/core/l10n/sk.js b/core/l10n/sk.js deleted file mode 100644 index 6d446d19099..00000000000 --- a/core/l10n/sk.js +++ /dev/null @@ -1,30 +0,0 @@ -OC.L10N.register( - "core", - { - "Sunday" : "Nedeľa", - "Monday" : "Pondelok", - "Tuesday" : "Utorok", - "Wednesday" : "Streda", - "Thursday" : "Štvrtok", - "Friday" : "Piatok", - "Saturday" : "Sobota", - "January" : "Január", - "February" : "Február", - "March" : "Marec", - "April" : "Apríl", - "May" : "Máj", - "June" : "Jún", - "July" : "Júl", - "August" : "August", - "September" : "September", - "October" : "Október", - "November" : "November", - "December" : "December", - "Settings" : "Nastavenia", - "Cancel" : "Zrušiť", - "Share" : "Zdieľať", - "group" : "skupina", - "Delete" : "Odstrániť", - "Personal" : "Osobné" -}, -"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"); diff --git a/core/l10n/sk.json b/core/l10n/sk.json deleted file mode 100644 index 05064303dac..00000000000 --- a/core/l10n/sk.json +++ /dev/null @@ -1,28 +0,0 @@ -{ "translations": { - "Sunday" : "Nedeľa", - "Monday" : "Pondelok", - "Tuesday" : "Utorok", - "Wednesday" : "Streda", - "Thursday" : "Štvrtok", - "Friday" : "Piatok", - "Saturday" : "Sobota", - "January" : "Január", - "February" : "Február", - "March" : "Marec", - "April" : "Apríl", - "May" : "Máj", - "June" : "Jún", - "July" : "Júl", - "August" : "August", - "September" : "September", - "October" : "Október", - "November" : "November", - "December" : "December", - "Settings" : "Nastavenia", - "Cancel" : "Zrušiť", - "Share" : "Zdieľať", - "group" : "skupina", - "Delete" : "Odstrániť", - "Personal" : "Osobné" -},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;" -} \ No newline at end of file diff --git a/core/l10n/ur.js b/core/l10n/ur.js deleted file mode 100644 index 442326e9ad7..00000000000 --- a/core/l10n/ur.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "core", - { - "Error" : "خرابی" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/ur.json b/core/l10n/ur.json deleted file mode 100644 index 1c1fc3d16c1..00000000000 --- a/core/l10n/ur.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Error" : "خرابی" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/lib/l10n/ca@valencia.js b/lib/l10n/ca@valencia.js deleted file mode 100644 index a12702211c2..00000000000 --- a/lib/l10n/ca@valencia.js +++ /dev/null @@ -1,10 +0,0 @@ -OC.L10N.register( - "lib", - { - "_%n day ago_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""], - "_%n year ago_::_%n years ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n minute ago_::_%n minutes ago_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/ca@valencia.json b/lib/l10n/ca@valencia.json deleted file mode 100644 index b994fa289eb..00000000000 --- a/lib/l10n/ca@valencia.json +++ /dev/null @@ -1,8 +0,0 @@ -{ "translations": { - "_%n day ago_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""], - "_%n year ago_::_%n years ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n minute ago_::_%n minutes ago_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/lib/l10n/de_CH.js b/lib/l10n/de_CH.js deleted file mode 100644 index d0d4be0f4e6..00000000000 --- a/lib/l10n/de_CH.js +++ /dev/null @@ -1,40 +0,0 @@ -OC.L10N.register( - "lib", - { - "Help" : "Hilfe", - "Personal" : "Persönlich", - "Settings" : "Einstellungen", - "Users" : "Benutzer", - "Admin" : "Administrator", - "No app name specified" : "Kein App-Name spezifiziert", - "web services under your control" : "Web-Services unter Ihrer Kontrolle", - "App directory already exists" : "Anwendungsverzeichnis existiert bereits", - "App can't be installed because of not allowed code in the App" : "Anwendung kann wegen nicht erlaubten Codes nicht installiert werden", - "Application is not enabled" : "Die Anwendung ist nicht aktiviert", - "Authentication error" : "Authentifizierungs-Fehler", - "Token expired. Please reload page." : "Token abgelaufen. Bitte laden Sie die Seite neu.", - "%s enter the database username." : "%s geben Sie den Datenbank-Benutzernamen an.", - "%s enter the database name." : "%s geben Sie den Datenbank-Namen an.", - "%s you may not use dots in the database name" : "%s Der Datenbank-Name darf keine Punkte enthalten", - "MS SQL username and/or password not valid: %s" : "MS SQL Benutzername und/oder Passwort ungültig: %s", - "You need to enter either an existing account or the administrator." : "Sie müssen entweder ein existierendes Benutzerkonto oder das Administratoren-Konto angeben.", - "DB Error: \"%s\"" : "DB Fehler: \"%s\"", - "Offending command was: \"%s\"" : "Fehlerhafter Befehl war: \"%s\"", - "Oracle connection could not be established" : "Die Oracle-Verbindung konnte nicht aufgebaut werden.", - "Oracle username and/or password not valid" : "Oracle Benutzername und/oder Passwort ungültig", - "Offending command was: \"%s\", name: %s, password: %s" : "Fehlerhafter Befehl war: \"%s\", Name: %s, Passwort: %s", - "PostgreSQL username and/or password not valid" : "PostgreSQL Benutzername und/oder Passwort ungültig", - "Set an admin username." : "Setze Administrator Benutzername.", - "Set an admin password." : "Setze Administrator Passwort", - "%s shared »%s« with you" : "%s teilt »%s« mit Ihnen", - "Could not find category \"%s\"" : "Die Kategorie «%s» konnte nicht gefunden werden.", - "seconds ago" : "Gerade eben", - "today" : "Heute", - "yesterday" : "Gestern", - "last month" : "Letzten Monat", - "last year" : "Letztes Jahr", - "years ago" : "Vor Jahren", - "A valid username must be provided" : "Es muss ein gültiger Benutzername angegeben werden", - "A valid password must be provided" : "Es muss ein gültiges Passwort angegeben werden" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/de_CH.json b/lib/l10n/de_CH.json deleted file mode 100644 index 26ab7e1b201..00000000000 --- a/lib/l10n/de_CH.json +++ /dev/null @@ -1,38 +0,0 @@ -{ "translations": { - "Help" : "Hilfe", - "Personal" : "Persönlich", - "Settings" : "Einstellungen", - "Users" : "Benutzer", - "Admin" : "Administrator", - "No app name specified" : "Kein App-Name spezifiziert", - "web services under your control" : "Web-Services unter Ihrer Kontrolle", - "App directory already exists" : "Anwendungsverzeichnis existiert bereits", - "App can't be installed because of not allowed code in the App" : "Anwendung kann wegen nicht erlaubten Codes nicht installiert werden", - "Application is not enabled" : "Die Anwendung ist nicht aktiviert", - "Authentication error" : "Authentifizierungs-Fehler", - "Token expired. Please reload page." : "Token abgelaufen. Bitte laden Sie die Seite neu.", - "%s enter the database username." : "%s geben Sie den Datenbank-Benutzernamen an.", - "%s enter the database name." : "%s geben Sie den Datenbank-Namen an.", - "%s you may not use dots in the database name" : "%s Der Datenbank-Name darf keine Punkte enthalten", - "MS SQL username and/or password not valid: %s" : "MS SQL Benutzername und/oder Passwort ungültig: %s", - "You need to enter either an existing account or the administrator." : "Sie müssen entweder ein existierendes Benutzerkonto oder das Administratoren-Konto angeben.", - "DB Error: \"%s\"" : "DB Fehler: \"%s\"", - "Offending command was: \"%s\"" : "Fehlerhafter Befehl war: \"%s\"", - "Oracle connection could not be established" : "Die Oracle-Verbindung konnte nicht aufgebaut werden.", - "Oracle username and/or password not valid" : "Oracle Benutzername und/oder Passwort ungültig", - "Offending command was: \"%s\", name: %s, password: %s" : "Fehlerhafter Befehl war: \"%s\", Name: %s, Passwort: %s", - "PostgreSQL username and/or password not valid" : "PostgreSQL Benutzername und/oder Passwort ungültig", - "Set an admin username." : "Setze Administrator Benutzername.", - "Set an admin password." : "Setze Administrator Passwort", - "%s shared »%s« with you" : "%s teilt »%s« mit Ihnen", - "Could not find category \"%s\"" : "Die Kategorie «%s» konnte nicht gefunden werden.", - "seconds ago" : "Gerade eben", - "today" : "Heute", - "yesterday" : "Gestern", - "last month" : "Letzten Monat", - "last year" : "Letztes Jahr", - "years ago" : "Vor Jahren", - "A valid username must be provided" : "Es muss ein gültiger Benutzername angegeben werden", - "A valid password must be provided" : "Es muss ein gültiges Passwort angegeben werden" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/lib/l10n/en_NZ.js b/lib/l10n/en_NZ.js deleted file mode 100644 index a12702211c2..00000000000 --- a/lib/l10n/en_NZ.js +++ /dev/null @@ -1,10 +0,0 @@ -OC.L10N.register( - "lib", - { - "_%n day ago_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""], - "_%n year ago_::_%n years ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n minute ago_::_%n minutes ago_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/en_NZ.json b/lib/l10n/en_NZ.json deleted file mode 100644 index b994fa289eb..00000000000 --- a/lib/l10n/en_NZ.json +++ /dev/null @@ -1,8 +0,0 @@ -{ "translations": { - "_%n day ago_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""], - "_%n year ago_::_%n years ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n minute ago_::_%n minutes ago_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/lib/l10n/es_BO.js b/lib/l10n/es_BO.js deleted file mode 100644 index a12702211c2..00000000000 --- a/lib/l10n/es_BO.js +++ /dev/null @@ -1,10 +0,0 @@ -OC.L10N.register( - "lib", - { - "_%n day ago_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""], - "_%n year ago_::_%n years ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n minute ago_::_%n minutes ago_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/es_BO.json b/lib/l10n/es_BO.json deleted file mode 100644 index b994fa289eb..00000000000 --- a/lib/l10n/es_BO.json +++ /dev/null @@ -1,8 +0,0 @@ -{ "translations": { - "_%n day ago_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""], - "_%n year ago_::_%n years ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n minute ago_::_%n minutes ago_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/lib/l10n/es_CO.js b/lib/l10n/es_CO.js deleted file mode 100644 index a12702211c2..00000000000 --- a/lib/l10n/es_CO.js +++ /dev/null @@ -1,10 +0,0 @@ -OC.L10N.register( - "lib", - { - "_%n day ago_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""], - "_%n year ago_::_%n years ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n minute ago_::_%n minutes ago_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/es_CO.json b/lib/l10n/es_CO.json deleted file mode 100644 index b994fa289eb..00000000000 --- a/lib/l10n/es_CO.json +++ /dev/null @@ -1,8 +0,0 @@ -{ "translations": { - "_%n day ago_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""], - "_%n year ago_::_%n years ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n minute ago_::_%n minutes ago_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/lib/l10n/es_CR.js b/lib/l10n/es_CR.js deleted file mode 100644 index a12702211c2..00000000000 --- a/lib/l10n/es_CR.js +++ /dev/null @@ -1,10 +0,0 @@ -OC.L10N.register( - "lib", - { - "_%n day ago_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""], - "_%n year ago_::_%n years ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n minute ago_::_%n minutes ago_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/es_CR.json b/lib/l10n/es_CR.json deleted file mode 100644 index b994fa289eb..00000000000 --- a/lib/l10n/es_CR.json +++ /dev/null @@ -1,8 +0,0 @@ -{ "translations": { - "_%n day ago_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""], - "_%n year ago_::_%n years ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n minute ago_::_%n minutes ago_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/lib/l10n/es_EC.js b/lib/l10n/es_EC.js deleted file mode 100644 index a12702211c2..00000000000 --- a/lib/l10n/es_EC.js +++ /dev/null @@ -1,10 +0,0 @@ -OC.L10N.register( - "lib", - { - "_%n day ago_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""], - "_%n year ago_::_%n years ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n minute ago_::_%n minutes ago_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/es_EC.json b/lib/l10n/es_EC.json deleted file mode 100644 index b994fa289eb..00000000000 --- a/lib/l10n/es_EC.json +++ /dev/null @@ -1,8 +0,0 @@ -{ "translations": { - "_%n day ago_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""], - "_%n year ago_::_%n years ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n minute ago_::_%n minutes ago_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/lib/l10n/es_PE.js b/lib/l10n/es_PE.js deleted file mode 100644 index a12702211c2..00000000000 --- a/lib/l10n/es_PE.js +++ /dev/null @@ -1,10 +0,0 @@ -OC.L10N.register( - "lib", - { - "_%n day ago_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""], - "_%n year ago_::_%n years ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n minute ago_::_%n minutes ago_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/es_PE.json b/lib/l10n/es_PE.json deleted file mode 100644 index b994fa289eb..00000000000 --- a/lib/l10n/es_PE.json +++ /dev/null @@ -1,8 +0,0 @@ -{ "translations": { - "_%n day ago_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""], - "_%n year ago_::_%n years ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n minute ago_::_%n minutes ago_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/lib/l10n/es_PY.js b/lib/l10n/es_PY.js deleted file mode 100644 index a12702211c2..00000000000 --- a/lib/l10n/es_PY.js +++ /dev/null @@ -1,10 +0,0 @@ -OC.L10N.register( - "lib", - { - "_%n day ago_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""], - "_%n year ago_::_%n years ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n minute ago_::_%n minutes ago_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/es_PY.json b/lib/l10n/es_PY.json deleted file mode 100644 index b994fa289eb..00000000000 --- a/lib/l10n/es_PY.json +++ /dev/null @@ -1,8 +0,0 @@ -{ "translations": { - "_%n day ago_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""], - "_%n year ago_::_%n years ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n minute ago_::_%n minutes ago_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/lib/l10n/es_US.js b/lib/l10n/es_US.js deleted file mode 100644 index a12702211c2..00000000000 --- a/lib/l10n/es_US.js +++ /dev/null @@ -1,10 +0,0 @@ -OC.L10N.register( - "lib", - { - "_%n day ago_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""], - "_%n year ago_::_%n years ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n minute ago_::_%n minutes ago_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/es_US.json b/lib/l10n/es_US.json deleted file mode 100644 index b994fa289eb..00000000000 --- a/lib/l10n/es_US.json +++ /dev/null @@ -1,8 +0,0 @@ -{ "translations": { - "_%n day ago_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""], - "_%n year ago_::_%n years ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n minute ago_::_%n minutes ago_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/lib/l10n/es_UY.js b/lib/l10n/es_UY.js deleted file mode 100644 index a12702211c2..00000000000 --- a/lib/l10n/es_UY.js +++ /dev/null @@ -1,10 +0,0 @@ -OC.L10N.register( - "lib", - { - "_%n day ago_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""], - "_%n year ago_::_%n years ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n minute ago_::_%n minutes ago_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/es_UY.json b/lib/l10n/es_UY.json deleted file mode 100644 index b994fa289eb..00000000000 --- a/lib/l10n/es_UY.json +++ /dev/null @@ -1,8 +0,0 @@ -{ "translations": { - "_%n day ago_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""], - "_%n year ago_::_%n years ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n minute ago_::_%n minutes ago_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/lib/l10n/eu_ES.js b/lib/l10n/eu_ES.js deleted file mode 100644 index f547910d4aa..00000000000 --- a/lib/l10n/eu_ES.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "lib", - { - "Personal" : "Pertsonala" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/eu_ES.json b/lib/l10n/eu_ES.json deleted file mode 100644 index 711c235ddc2..00000000000 --- a/lib/l10n/eu_ES.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Personal" : "Pertsonala" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/lib/l10n/fi.js b/lib/l10n/fi.js deleted file mode 100644 index f1346425331..00000000000 --- a/lib/l10n/fi.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "lib", - { - "Help" : "Apua", - "Settings" : "Asetukset" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/fi.json b/lib/l10n/fi.json deleted file mode 100644 index b556f7f1816..00000000000 --- a/lib/l10n/fi.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "Help" : "Apua", - "Settings" : "Asetukset" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/lib/l10n/fr_CA.js b/lib/l10n/fr_CA.js deleted file mode 100644 index 9408adc0dc3..00000000000 --- a/lib/l10n/fr_CA.js +++ /dev/null @@ -1,10 +0,0 @@ -OC.L10N.register( - "lib", - { - "_%n day ago_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""], - "_%n year ago_::_%n years ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n minute ago_::_%n minutes ago_" : ["",""] -}, -"nplurals=2; plural=(n > 1);"); diff --git a/lib/l10n/fr_CA.json b/lib/l10n/fr_CA.json deleted file mode 100644 index 2a227e468c7..00000000000 --- a/lib/l10n/fr_CA.json +++ /dev/null @@ -1,8 +0,0 @@ -{ "translations": { - "_%n day ago_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""], - "_%n year ago_::_%n years ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n minute ago_::_%n minutes ago_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n > 1);" -} \ No newline at end of file diff --git a/lib/l10n/hi_IN.js b/lib/l10n/hi_IN.js deleted file mode 100644 index da0dcc6bdde..00000000000 --- a/lib/l10n/hi_IN.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "lib", - { - "_%n minute ago_::_%n minutes ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n day go_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/hi_IN.json b/lib/l10n/hi_IN.json deleted file mode 100644 index 4286553dd0c..00000000000 --- a/lib/l10n/hi_IN.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "_%n minute ago_::_%n minutes ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n day go_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/lib/l10n/sk.js b/lib/l10n/sk.js deleted file mode 100644 index 1eed1a5720c..00000000000 --- a/lib/l10n/sk.js +++ /dev/null @@ -1,7 +0,0 @@ -OC.L10N.register( - "lib", - { - "Personal" : "Osobné", - "Settings" : "Nastavenia" -}, -"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"); diff --git a/lib/l10n/sk.json b/lib/l10n/sk.json deleted file mode 100644 index bd84c129e92..00000000000 --- a/lib/l10n/sk.json +++ /dev/null @@ -1,5 +0,0 @@ -{ "translations": { - "Personal" : "Osobné", - "Settings" : "Nastavenia" -},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;" -} \ No newline at end of file diff --git a/lib/l10n/ur.js b/lib/l10n/ur.js deleted file mode 100644 index da0dcc6bdde..00000000000 --- a/lib/l10n/ur.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "lib", - { - "_%n minute ago_::_%n minutes ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n day go_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""] -}, -"nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/ur.json b/lib/l10n/ur.json deleted file mode 100644 index 4286553dd0c..00000000000 --- a/lib/l10n/ur.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "_%n minute ago_::_%n minutes ago_" : ["",""], - "_%n hour ago_::_%n hours ago_" : ["",""], - "_%n day go_::_%n days ago_" : ["",""], - "_%n month ago_::_%n months ago_" : ["",""] -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/settings/l10n/de_CH.js b/settings/l10n/de_CH.js deleted file mode 100644 index af913b8d81e..00000000000 --- a/settings/l10n/de_CH.js +++ /dev/null @@ -1,102 +0,0 @@ -OC.L10N.register( - "settings", - { - "Enabled" : "Aktiviert", - "Authentication error" : "Authentifizierungs-Fehler", - "Group already exists" : "Die Gruppe existiert bereits", - "Unable to add group" : "Die Gruppe konnte nicht angelegt werden", - "Email saved" : "E-Mail-Adresse gespeichert", - "Invalid email" : "Ungültige E-Mail-Adresse", - "Unable to delete group" : "Die Gruppe konnte nicht gelöscht werden", - "Unable to delete user" : "Der Benutzer konnte nicht gelöscht werden", - "Language changed" : "Sprache geändert", - "Invalid request" : "Ungültige Anforderung", - "Admins can't remove themself from the admin group" : "Administratoren können sich nicht selbst aus der admin-Gruppe löschen", - "Unable to add user to group %s" : "Der Benutzer konnte nicht zur Gruppe %s hinzugefügt werden", - "Unable to remove user from group %s" : "Der Benutzer konnte nicht aus der Gruppe %s entfernt werden", - "Couldn't update app." : "Die App konnte nicht aktualisiert werden.", - "Saved" : "Gespeichert", - "Email sent" : "Email gesendet", - "All" : "Alle", - "Please wait...." : "Bitte warten....", - "Error while disabling app" : "Fehler während der Deaktivierung der Anwendung", - "Disable" : "Deaktivieren", - "Enable" : "Aktivieren", - "Error while enabling app" : "Fehler während der Aktivierung der Anwendung", - "Updating...." : "Update...", - "Error while updating app" : "Es ist ein Fehler während des Updates aufgetreten", - "Updated" : "Aktualisiert", - "Delete" : "Löschen", - "Decrypting files... Please wait, this can take some time." : "Entschlüssel Dateien ... Bitte warten Sie, denn dieser Vorgang kann einige Zeit beanspruchen.", - "Groups" : "Gruppen", - "undo" : "rückgängig machen", - "never" : "niemals", - "add group" : "Gruppe hinzufügen", - "A valid username must be provided" : "Es muss ein gültiger Benutzername angegeben werden", - "Error creating user" : "Beim Erstellen des Benutzers ist ein Fehler aufgetreten", - "A valid password must be provided" : "Es muss ein gültiges Passwort angegeben werden", - "__language_name__" : "Deutsch (Schweiz)", - "SSL root certificates" : "SSL-Root-Zertifikate", - "Encryption" : "Verschlüsselung", - "Login" : "Anmelden", - "Security Warning" : "Sicherheitshinweis", - "Your data directory and your files are probably accessible from the internet. The .htaccess file is not working. We strongly suggest that you configure your webserver in a way that the data directory is no longer accessible or you move the data directory outside the webserver document root." : "Ihr Datenverzeichnis und Ihre Dateien sind möglicher Weise aus dem Internet erreichbar. Die .htaccess-Datei funktioniert nicht. Wir raten Ihnen dringend, dass Sie Ihren Webserver dahingehend konfigurieren, dass Ihr Datenverzeichnis nicht länger aus dem Internet erreichbar ist, oder Sie verschieben das Datenverzeichnis ausserhalb des Wurzelverzeichnisses des Webservers.", - "Setup Warning" : "Einrichtungswarnung", - "Module 'fileinfo' missing" : "Das Modul 'fileinfo' fehlt", - "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Das PHP-Modul 'fileinfo' fehlt. Wir empfehlen Ihnen dieses Modul zu aktivieren, um die besten Resultate bei der Bestimmung der Dateitypen zu erzielen.", - "Locale not working" : "Die Lokalisierung funktioniert nicht", - "Please double check the installation guides." : "Bitte prüfen Sie die Installationsanleitungen.", - "Cron" : "Cron", - "Execute one task with each page loaded" : "Eine Aufgabe bei jedem Laden der Seite ausführen", - "Sharing" : "Teilen", - "Allow apps to use the Share API" : "Anwendungen erlauben, die Share-API zu benutzen", - "Allow public uploads" : "Erlaube öffentliches hochladen", - "Allow resharing" : "Erlaube Weiterverteilen", - "Security" : "Sicherheit", - "Enforce HTTPS" : "HTTPS erzwingen", - "Forces the clients to connect to %s via an encrypted connection." : "Zwingt die Clients, sich über eine verschlüsselte Verbindung zu %s zu verbinden.", - "Please connect to your %s via HTTPS to enable or disable the SSL enforcement." : "Bitte verbinden Sie sich zu Ihrem %s über HTTPS um die SSL-Erzwingung zu aktivieren oder zu deaktivieren.", - "Server address" : "Adresse des Servers", - "Port" : "Port", - "Log" : "Log", - "Log level" : "Log-Level", - "More" : "Mehr", - "Less" : "Weniger", - "Version" : "Version", - "Developed by the ownCloud community, the source code is licensed under the AGPL." : "Entwickelt von der ownCloud-Community. Der Quellcode ist unter der AGPL lizenziert.", - "More apps" : "Mehr Apps", - "by" : "von", - "User Documentation" : "Dokumentation für Benutzer", - "Administrator Documentation" : "Dokumentation für Administratoren", - "Online Documentation" : "Online-Dokumentation", - "Forum" : "Forum", - "Bugtracker" : "Bugtracker", - "Commercial Support" : "Kommerzieller Support", - "Get the apps to sync your files" : "Installieren Sie die Anwendungen, um Ihre Dateien zu synchronisieren", - "Show First Run Wizard again" : "Den Einrichtungsassistenten erneut anzeigen", - "You have used %s of the available %s" : "Sie verwenden %s der verfügbaren %s", - "Password" : "Passwort", - "Your password was changed" : "Ihr Passwort wurde geändert.", - "Unable to change your password" : "Das Passwort konnte nicht geändert werden", - "Current password" : "Aktuelles Passwort", - "New password" : "Neues Passwort", - "Change password" : "Passwort ändern", - "Email" : "E-Mail", - "Your email address" : "Ihre E-Mail-Adresse", - "Cancel" : "Abbrechen", - "Language" : "Sprache", - "Help translate" : "Helfen Sie bei der Übersetzung", - "Import Root Certificate" : "Root-Zertifikate importieren", - "Log-in password" : "Login-Passwort", - "Decrypt all Files" : "Alle Dateien entschlüsseln", - "Login Name" : "Loginname", - "Create" : "Erstellen", - "Admin Recovery Password" : "Admin-Passwort-Wiederherstellung", - "Enter the recovery password in order to recover the users files during password change" : "Geben Sie das Wiederherstellungspasswort ein, um die Benutzerdateien während Passwortänderung wiederherzustellen", - "Unlimited" : "Unbegrenzt", - "Other" : "Andere", - "Username" : "Benutzername", - "set new password" : "Neues Passwort setzen", - "Default" : "Standard" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/de_CH.json b/settings/l10n/de_CH.json deleted file mode 100644 index ad7338d33b1..00000000000 --- a/settings/l10n/de_CH.json +++ /dev/null @@ -1,100 +0,0 @@ -{ "translations": { - "Enabled" : "Aktiviert", - "Authentication error" : "Authentifizierungs-Fehler", - "Group already exists" : "Die Gruppe existiert bereits", - "Unable to add group" : "Die Gruppe konnte nicht angelegt werden", - "Email saved" : "E-Mail-Adresse gespeichert", - "Invalid email" : "Ungültige E-Mail-Adresse", - "Unable to delete group" : "Die Gruppe konnte nicht gelöscht werden", - "Unable to delete user" : "Der Benutzer konnte nicht gelöscht werden", - "Language changed" : "Sprache geändert", - "Invalid request" : "Ungültige Anforderung", - "Admins can't remove themself from the admin group" : "Administratoren können sich nicht selbst aus der admin-Gruppe löschen", - "Unable to add user to group %s" : "Der Benutzer konnte nicht zur Gruppe %s hinzugefügt werden", - "Unable to remove user from group %s" : "Der Benutzer konnte nicht aus der Gruppe %s entfernt werden", - "Couldn't update app." : "Die App konnte nicht aktualisiert werden.", - "Saved" : "Gespeichert", - "Email sent" : "Email gesendet", - "All" : "Alle", - "Please wait...." : "Bitte warten....", - "Error while disabling app" : "Fehler während der Deaktivierung der Anwendung", - "Disable" : "Deaktivieren", - "Enable" : "Aktivieren", - "Error while enabling app" : "Fehler während der Aktivierung der Anwendung", - "Updating...." : "Update...", - "Error while updating app" : "Es ist ein Fehler während des Updates aufgetreten", - "Updated" : "Aktualisiert", - "Delete" : "Löschen", - "Decrypting files... Please wait, this can take some time." : "Entschlüssel Dateien ... Bitte warten Sie, denn dieser Vorgang kann einige Zeit beanspruchen.", - "Groups" : "Gruppen", - "undo" : "rückgängig machen", - "never" : "niemals", - "add group" : "Gruppe hinzufügen", - "A valid username must be provided" : "Es muss ein gültiger Benutzername angegeben werden", - "Error creating user" : "Beim Erstellen des Benutzers ist ein Fehler aufgetreten", - "A valid password must be provided" : "Es muss ein gültiges Passwort angegeben werden", - "__language_name__" : "Deutsch (Schweiz)", - "SSL root certificates" : "SSL-Root-Zertifikate", - "Encryption" : "Verschlüsselung", - "Login" : "Anmelden", - "Security Warning" : "Sicherheitshinweis", - "Your data directory and your files are probably accessible from the internet. The .htaccess file is not working. We strongly suggest that you configure your webserver in a way that the data directory is no longer accessible or you move the data directory outside the webserver document root." : "Ihr Datenverzeichnis und Ihre Dateien sind möglicher Weise aus dem Internet erreichbar. Die .htaccess-Datei funktioniert nicht. Wir raten Ihnen dringend, dass Sie Ihren Webserver dahingehend konfigurieren, dass Ihr Datenverzeichnis nicht länger aus dem Internet erreichbar ist, oder Sie verschieben das Datenverzeichnis ausserhalb des Wurzelverzeichnisses des Webservers.", - "Setup Warning" : "Einrichtungswarnung", - "Module 'fileinfo' missing" : "Das Modul 'fileinfo' fehlt", - "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Das PHP-Modul 'fileinfo' fehlt. Wir empfehlen Ihnen dieses Modul zu aktivieren, um die besten Resultate bei der Bestimmung der Dateitypen zu erzielen.", - "Locale not working" : "Die Lokalisierung funktioniert nicht", - "Please double check the installation guides." : "Bitte prüfen Sie die Installationsanleitungen.", - "Cron" : "Cron", - "Execute one task with each page loaded" : "Eine Aufgabe bei jedem Laden der Seite ausführen", - "Sharing" : "Teilen", - "Allow apps to use the Share API" : "Anwendungen erlauben, die Share-API zu benutzen", - "Allow public uploads" : "Erlaube öffentliches hochladen", - "Allow resharing" : "Erlaube Weiterverteilen", - "Security" : "Sicherheit", - "Enforce HTTPS" : "HTTPS erzwingen", - "Forces the clients to connect to %s via an encrypted connection." : "Zwingt die Clients, sich über eine verschlüsselte Verbindung zu %s zu verbinden.", - "Please connect to your %s via HTTPS to enable or disable the SSL enforcement." : "Bitte verbinden Sie sich zu Ihrem %s über HTTPS um die SSL-Erzwingung zu aktivieren oder zu deaktivieren.", - "Server address" : "Adresse des Servers", - "Port" : "Port", - "Log" : "Log", - "Log level" : "Log-Level", - "More" : "Mehr", - "Less" : "Weniger", - "Version" : "Version", - "Developed by the ownCloud community, the source code is licensed under the AGPL." : "Entwickelt von der ownCloud-Community. Der Quellcode ist unter der AGPL lizenziert.", - "More apps" : "Mehr Apps", - "by" : "von", - "User Documentation" : "Dokumentation für Benutzer", - "Administrator Documentation" : "Dokumentation für Administratoren", - "Online Documentation" : "Online-Dokumentation", - "Forum" : "Forum", - "Bugtracker" : "Bugtracker", - "Commercial Support" : "Kommerzieller Support", - "Get the apps to sync your files" : "Installieren Sie die Anwendungen, um Ihre Dateien zu synchronisieren", - "Show First Run Wizard again" : "Den Einrichtungsassistenten erneut anzeigen", - "You have used %s of the available %s" : "Sie verwenden %s der verfügbaren %s", - "Password" : "Passwort", - "Your password was changed" : "Ihr Passwort wurde geändert.", - "Unable to change your password" : "Das Passwort konnte nicht geändert werden", - "Current password" : "Aktuelles Passwort", - "New password" : "Neues Passwort", - "Change password" : "Passwort ändern", - "Email" : "E-Mail", - "Your email address" : "Ihre E-Mail-Adresse", - "Cancel" : "Abbrechen", - "Language" : "Sprache", - "Help translate" : "Helfen Sie bei der Übersetzung", - "Import Root Certificate" : "Root-Zertifikate importieren", - "Log-in password" : "Login-Passwort", - "Decrypt all Files" : "Alle Dateien entschlüsseln", - "Login Name" : "Loginname", - "Create" : "Erstellen", - "Admin Recovery Password" : "Admin-Passwort-Wiederherstellung", - "Enter the recovery password in order to recover the users files during password change" : "Geben Sie das Wiederherstellungspasswort ein, um die Benutzerdateien während Passwortänderung wiederherzustellen", - "Unlimited" : "Unbegrenzt", - "Other" : "Andere", - "Username" : "Benutzername", - "set new password" : "Neues Passwort setzen", - "Default" : "Standard" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/settings/l10n/eu_ES.js b/settings/l10n/eu_ES.js deleted file mode 100644 index b5685139534..00000000000 --- a/settings/l10n/eu_ES.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "settings", - { - "Invalid request" : "Eskakizun baliogabea", - "Delete" : "Ezabatu", - "Cancel" : "Ezeztatu", - "Other" : "Bestea" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/eu_ES.json b/settings/l10n/eu_ES.json deleted file mode 100644 index 062f410b0e9..00000000000 --- a/settings/l10n/eu_ES.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "Invalid request" : "Eskakizun baliogabea", - "Delete" : "Ezabatu", - "Cancel" : "Ezeztatu", - "Other" : "Bestea" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/settings/l10n/fi.js b/settings/l10n/fi.js deleted file mode 100644 index bf1854567a1..00000000000 --- a/settings/l10n/fi.js +++ /dev/null @@ -1,11 +0,0 @@ -OC.L10N.register( - "settings", - { - "Delete" : "Poista", - "More" : "Lisää", - "Password" : "Salasana", - "Cancel" : "Peruuta", - "Username" : "Käyttäjätunnus", - "Create" : "Luo" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/fi.json b/settings/l10n/fi.json deleted file mode 100644 index 58852d56692..00000000000 --- a/settings/l10n/fi.json +++ /dev/null @@ -1,9 +0,0 @@ -{ "translations": { - "Delete" : "Poista", - "More" : "Lisää", - "Password" : "Salasana", - "Cancel" : "Peruuta", - "Username" : "Käyttäjätunnus", - "Create" : "Luo" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file diff --git a/settings/l10n/sk.js b/settings/l10n/sk.js deleted file mode 100644 index e48cc9d9ed9..00000000000 --- a/settings/l10n/sk.js +++ /dev/null @@ -1,9 +0,0 @@ -OC.L10N.register( - "settings", - { - "Delete" : "Odstrániť", - "never" : "nikdy", - "Cancel" : "Zrušiť", - "Other" : "Ostatné" -}, -"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"); diff --git a/settings/l10n/sk.json b/settings/l10n/sk.json deleted file mode 100644 index 609a62d21fd..00000000000 --- a/settings/l10n/sk.json +++ /dev/null @@ -1,7 +0,0 @@ -{ "translations": { - "Delete" : "Odstrániť", - "never" : "nikdy", - "Cancel" : "Zrušiť", - "Other" : "Ostatné" -},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;" -} \ No newline at end of file diff --git a/settings/l10n/ur.js b/settings/l10n/ur.js deleted file mode 100644 index 78fcf358b75..00000000000 --- a/settings/l10n/ur.js +++ /dev/null @@ -1,6 +0,0 @@ -OC.L10N.register( - "settings", - { - "Error" : "خرابی" -}, -"nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/ur.json b/settings/l10n/ur.json deleted file mode 100644 index 1c1fc3d16c1..00000000000 --- a/settings/l10n/ur.json +++ /dev/null @@ -1,4 +0,0 @@ -{ "translations": { - "Error" : "خرابی" -},"pluralForm" :"nplurals=2; plural=(n != 1);" -} \ No newline at end of file -- GitLab From 3773c69f01c5d2e7c695cd31b8000742c589bef8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Wed, 26 Aug 2015 12:19:58 +0200 Subject: [PATCH 043/783] Adding simple script to remove language files from core --- l10n/rm-old.sh | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 l10n/rm-old.sh diff --git a/l10n/rm-old.sh b/l10n/rm-old.sh new file mode 100644 index 00000000000..30e4509db25 --- /dev/null +++ b/l10n/rm-old.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +lang=(ach ady af_ZA ak am_ET ar ast az bal be bg_BG bn_BD bn_IN bs ca cs_CZ cy_GB da de de_AT de_DE el en_GB en@pirate eo es es_AR es_CL es_MX et_EE eu fa fi_FI fil fr fy_NL gl gu he hi hr hu_HU hy ia id io is it ja jv ka_GE km kn ko ku_IQ la lb lo lt_LT lv mg mk ml ml_IN mn mr ms_MY mt_MT my_MM nb_NO nds ne nl nn_NO nqo oc or_IN pa pl pt_BR pt_PT ro ru si_LK sk_SK sl sq sr sr@latin su sv sw_KE ta_IN ta_LK te tg_TJ th_TH tl_PH tr tzl tzm ug uk ur_PK uz vi yo zh_CN zh_HK zh_TW) + +ignore="" + +for fignore in "${lang[@]}"; do + ignore=${ignore}"-not -name ${fignore}.js -not -name ${fignore}.json " +done + + +find ../lib/l10n -type f $ignore -delete +find ../settings/l10n -type f $ignore -delete +find ../core/l10n -type f $ignore -delete +find ../apps/files/l10n -type f $ignore -delete +find ../apps/encryption/l10n -type f $ignore -delete +find ../apps/files_external/l10n -type f $ignore -delete +find ../apps/files_sharing/l10n -type f $ignore -delete +find ../apps/files_trashbin/l10n -type f $ignore -delete +find ../apps/files_versions/l10n -type f $ignore -delete +find ../apps/user_ldap/l10n -type f $ignore -delete +find ../apps/user_webdavauth/l10n -type f $ignore -delete + + -- GitLab From 3d2ee95f1e06972188967b2bc19720001a4f1395 Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Wed, 26 Aug 2015 14:29:36 +0200 Subject: [PATCH 044/783] Remove last occurence of `forcessl` This shoudl have been adjusted as well, now it's consistent with `setMagicInCookie`. While it does not have a security impact directly some automated scanners reported this all the time. --- lib/private/user/session.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/private/user/session.php b/lib/private/user/session.php index 75a884fb452..baceeb43956 100644 --- a/lib/private/user/session.php +++ b/lib/private/user/session.php @@ -297,8 +297,8 @@ class Session implements IUserSession, Emitter { * Remove cookie for "remember username" */ public function unsetMagicInCookie() { - //TODO: DI for cookies and OC_Config - $secureCookie = \OC_Config::getValue('forcessl', false); + //TODO: DI for cookies and IRequest + $secureCookie = \OC::$server->getRequest()->getServerProtocol() === 'https'; unset($_COOKIE["oc_username"]); //TODO: DI unset($_COOKIE["oc_token"]); -- GitLab From 8c08dd0ac26290829b10e28c333358ae10d953eb Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Mon, 24 Aug 2015 15:56:04 +0200 Subject: [PATCH 045/783] occ tool to encrypt all files --- apps/encryption/appinfo/application.php | 20 + apps/encryption/lib/crypto/encryptall.php | 424 ++++++++++++++++++ apps/encryption/lib/crypto/encryption.php | 19 + apps/encryption/lib/users/setup.php | 2 + apps/encryption/templates/altmail.php | 16 + apps/encryption/templates/mail.php | 39 ++ .../tests/lib/crypto/encryptalltest.php | 291 ++++++++++++ .../tests/lib/crypto/encryptionTest.php | 7 + core/command/encryption/encryptall.php | 114 +++++ core/register_command.php | 1 + lib/public/encryption/iencryptionmodule.php | 12 + .../command/encryption/encryptalltest.php | 131 ++++++ .../lib/files/storage/wrapper/encryption.php | 2 +- tests/lib/files/stream/encryption.php | 2 +- 14 files changed, 1078 insertions(+), 2 deletions(-) create mode 100644 apps/encryption/lib/crypto/encryptall.php create mode 100644 apps/encryption/templates/altmail.php create mode 100644 apps/encryption/templates/mail.php create mode 100644 apps/encryption/tests/lib/crypto/encryptalltest.php create mode 100644 core/command/encryption/encryptall.php create mode 100644 tests/core/command/encryption/encryptalltest.php diff --git a/apps/encryption/appinfo/application.php b/apps/encryption/appinfo/application.php index d4804394c5f..cba8964eefb 100644 --- a/apps/encryption/appinfo/application.php +++ b/apps/encryption/appinfo/application.php @@ -30,6 +30,7 @@ use OCA\Encryption\Controller\RecoveryController; use OCA\Encryption\Controller\SettingsController; use OCA\Encryption\Controller\StatusController; use OCA\Encryption\Crypto\Crypt; +use OCA\Encryption\Crypto\EncryptAll; use OCA\Encryption\Crypto\Encryption; use OCA\Encryption\HookManager; use OCA\Encryption\Hooks\UserHooks; @@ -42,6 +43,7 @@ use OCP\App; use OCP\AppFramework\IAppContainer; use OCP\Encryption\IManager; use OCP\IConfig; +use Symfony\Component\Console\Helper\QuestionHelper; class Application extends \OCP\AppFramework\App { @@ -111,6 +113,7 @@ class Application extends \OCP\AppFramework\App { $container->query('Crypt'), $container->query('KeyManager'), $container->query('Util'), + $container->query('EncryptAll'), $container->getServer()->getLogger(), $container->getServer()->getL10N($container->getAppName()) ); @@ -221,6 +224,23 @@ class Application extends \OCP\AppFramework\App { $server->getUserManager()); }); + $container->registerService('EncryptAll', + function (IAppContainer $c) { + $server = $c->getServer(); + return new EncryptAll( + $c->query('UserSetup'), + $c->getServer()->getUserManager(), + new View(), + $c->query('KeyManager'), + $server->getConfig(), + $server->getMailer(), + $server->getL10N('encryption'), + new QuestionHelper(), + $server->getSecureRandom() + ); + } + ); + } public function registerSettings() { diff --git a/apps/encryption/lib/crypto/encryptall.php b/apps/encryption/lib/crypto/encryptall.php new file mode 100644 index 00000000000..a0c69c13fdd --- /dev/null +++ b/apps/encryption/lib/crypto/encryptall.php @@ -0,0 +1,424 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program 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, version 3, + * along with this program. If not, see + * + */ + + +namespace OCA\Encryption\Crypto; + +use OC\Encryption\Exceptions\DecryptionFailedException; +use OC\Files\View; +use OCA\Encryption\KeyManager; +use OCA\Encryption\Users\Setup; +use OCP\IConfig; +use OCP\IL10N; +use OCP\IUserManager; +use OCP\Mail\IMailer; +use OCP\Security\ISecureRandom; +use Symfony\Component\Console\Helper\ProgressBar; +use Symfony\Component\Console\Helper\QuestionHelper; +use Symfony\Component\Console\Helper\Table; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Question\ConfirmationQuestion; + +class EncryptAll { + + /** @var Setup */ + protected $userSetup; + + /** @var IUserManager */ + protected $userManager; + + /** @var View */ + protected $rootView; + + /** @var KeyManager */ + protected $keyManager; + + /** @var array */ + protected $userPasswords; + + /** @var IConfig */ + protected $config; + + /** @var IMailer */ + protected $mailer; + + /** @var IL10N */ + protected $l; + + /** @var QuestionHelper */ + protected $questionHelper; + + /** @var OutputInterface */ + protected $output; + + /** @var InputInterface */ + protected $input; + + /** @var ISecureRandom */ + protected $secureRandom; + + /** + * @param Setup $userSetup + * @param IUserManager $userManager + * @param View $rootView + * @param KeyManager $keyManager + * @param IConfig $config + * @param IMailer $mailer + * @param IL10N $l + * @param QuestionHelper $questionHelper + * @param ISecureRandom $secureRandom + */ + public function __construct( + Setup $userSetup, + IUserManager $userManager, + View $rootView, + KeyManager $keyManager, + IConfig $config, + IMailer $mailer, + IL10N $l, + QuestionHelper $questionHelper, + ISecureRandom $secureRandom + ) { + $this->userSetup = $userSetup; + $this->userManager = $userManager; + $this->rootView = $rootView; + $this->keyManager = $keyManager; + $this->config = $config; + $this->mailer = $mailer; + $this->l = $l; + $this->questionHelper = $questionHelper; + $this->secureRandom = $secureRandom; + // store one time passwords for the users + $this->userPasswords = array(); + } + + /** + * start to encrypt all files + * + * @param InputInterface $input + * @param OutputInterface $output + */ + public function encryptAll(InputInterface $input, OutputInterface $output) { + + $this->input = $input; + $this->output = $output; + + $headline = 'Encrypt all files with the ' . Encryption::DISPLAY_NAME; + $this->output->writeln("\n"); + $this->output->writeln($headline); + $this->output->writeln(str_pad('', strlen($headline), '=')); + + //create private/public keys for each user and store the private key password + $this->output->writeln("\n"); + $this->output->writeln('Create key-pair for every user'); + $this->output->writeln('------------------------------'); + $this->output->writeln(''); + $this->output->writeln('This module will encrypt all files in the users files folder initially.'); + $this->output->writeln('Already existing versions and files in the trash bin will not be encrypted.'); + $this->output->writeln(''); + $this->createKeyPairs(); + + //setup users file system and encrypt all files one by one (take should encrypt setting of storage into account) + $this->output->writeln("\n"); + $this->output->writeln('Start to encrypt users files'); + $this->output->writeln('----------------------------'); + $this->output->writeln(''); + $this->encryptAllUsersFiles(); + //send-out or display password list and write it to a file + $this->output->writeln("\n"); + $this->output->writeln('Generated encryption key passwords'); + $this->output->writeln('----------------------------------'); + $this->output->writeln(''); + $this->outputPasswords(); + $this->output->writeln("\n"); + } + + /** + * create key-pair for every user + */ + protected function createKeyPairs() { + $this->output->writeln("\n"); + $progress = new ProgressBar($this->output); + $progress->setFormat(" %message% \n [%bar%]"); + $progress->start(); + + foreach($this->userManager->getBackends() as $backend) { + $limit = 500; + $offset = 0; + do { + $users = $backend->getUsers('', $limit, $offset); + foreach ($users as $user) { + if ($this->keyManager->userHasKeys($user) === false) { + $progress->setMessage('Create key-pair for ' . $user); + $progress->advance(); + $this->setupUserFS($user); + $password = $this->generateOneTimePassword($user); + $this->userSetup->setupUser($user, $password); + } else { + // users which already have a key-pair will be stored with a + // empty password and filtered out later + $this->userPasswords[$user] = ''; + } + } + $offset += $limit; + } while(count($users) >= $limit); + } + + $progress->setMessage('Key-pair created for all users'); + $progress->finish(); + } + + /** + * iterate over all user and encrypt their files + */ + protected function encryptAllUsersFiles() { + $this->output->writeln("\n"); + $progress = new ProgressBar($this->output); + $progress->setFormat(" %message% \n [%bar%]"); + $progress->start(); + $numberOfUsers = count($this->userPasswords); + $userNo = 1; + foreach ($this->userPasswords as $uid => $password) { + $userCount = "$uid ($userNo of $numberOfUsers)"; + $this->encryptUsersFiles($uid, $progress, $userCount); + $userNo++; + } + $progress->setMessage("all files encrypted"); + $progress->finish(); + + } + + /** + * encrypt files from the given user + * + * @param string $uid + * @param ProgressBar $progress + * @param string $userCount + */ + protected function encryptUsersFiles($uid, ProgressBar $progress, $userCount) { + + $this->setupUserFS($uid); + $directories = array(); + $directories[] = '/' . $uid . '/files'; + + while($root = array_pop($directories)) { + $content = $this->rootView->getDirectoryContent($root); + foreach ($content as $file) { + $path = $root . '/' . $file['name']; + if ($this->rootView->is_dir($path)) { + $directories[] = $path; + continue; + } else { + $progress->setMessage("encrypt files for user $userCount: $path"); + $progress->advance(); + if($this->encryptFile($path) === false) { + $progress->setMessage("encrypt files for user $userCount: $path (already encrypted)"); + $progress->advance(); + } + } + } + } + } + + /** + * encrypt file + * + * @param string $path + * @return bool + */ + protected function encryptFile($path) { + + $source = $path; + $target = $path . '.encrypted.' . time(); + + try { + $this->rootView->copy($source, $target); + $this->rootView->rename($target, $source); + } catch (DecryptionFailedException $e) { + if ($this->rootView->file_exists($target)) { + $this->rootView->unlink($target); + } + return false; + } + + return true; + } + + /** + * output one-time encryption passwords + */ + protected function outputPasswords() { + $table = new Table($this->output); + $table->setHeaders(array('Username', 'Private key password')); + + //create rows + $newPasswords = array(); + $unchangedPasswords = array(); + foreach ($this->userPasswords as $uid => $password) { + if (empty($password)) { + $unchangedPasswords[] = $uid; + } else { + $newPasswords[] = [$uid, $password]; + } + } + $table->setRows($newPasswords); + $table->render(); + + if (!empty($unchangedPasswords)) { + $this->output->writeln("\nThe following users already had a key-pair which was reused without setting a new password:\n"); + foreach ($unchangedPasswords as $uid) { + $this->output->writeln(" $uid"); + } + } + + $this->writePasswordsToFile($newPasswords); + + $this->output->writeln(''); + $question = new ConfirmationQuestion('Do you want to send the passwords directly to the users by mail? (y/n) ', false); + if ($this->questionHelper->ask($this->input, $this->output, $question)) { + $this->sendPasswordsByMail(); + } + } + + /** + * write one-time encryption passwords to a csv file + * + * @param array $passwords + */ + protected function writePasswordsToFile(array $passwords) { + $fp = $this->rootView->fopen('oneTimeEncryptionPasswords.csv', 'w'); + foreach ($passwords as $pwd) { + fputcsv($fp, $pwd); + } + fclose($fp); + $this->output->writeln("\n"); + $this->output->writeln('A list of all newly created passwords was written to data/oneTimeEncryptionPasswords.csv'); + $this->output->writeln(''); + $this->output->writeln('Each of these users need to login to the web interface, go to the'); + $this->output->writeln('personal settings section "ownCloud basic encryption module" and'); + $this->output->writeln('update the private key password to match the login password again by'); + $this->output->writeln('entering the one-time password into the "old log-in password" field'); + $this->output->writeln('and their current login password'); + } + + /** + * setup user file system + * + * @param string $uid + */ + protected function setupUserFS($uid) { + \OC_Util::tearDownFS(); + \OC_Util::setupFS($uid); + } + + /** + * generate one time password for the user and store it in a array + * + * @param string $uid + * @return string password + */ + protected function generateOneTimePassword($uid) { + $password = $this->secureRandom->getMediumStrengthGenerator()->generate(8); + $this->userPasswords[$uid] = $password; + return $password; + } + + /** + * send encryption key passwords to the users by mail + */ + protected function sendPasswordsByMail() { + $noMail = []; + + $this->output->writeln(''); + $progress = new ProgressBar($this->output, count($this->userPasswords)); + $progress->start(); + + foreach ($this->userPasswords as $recipient => $password) { + $progress->advance(); + if (!empty($password)) { + $recipientDisplayName = $this->userManager->get($recipient)->getDisplayName(); + $to = $this->config->getUserValue($recipient, 'settings', 'email', ''); + + if ($to === '') { + $noMail[] = $recipient; + continue; + } + + $subject = (string)$this->l->t('one-time password for server-side-encryption'); + list($htmlBody, $textBody) = $this->createMailBody($password); + + // send it out now + try { + $message = $this->mailer->createMessage(); + $message->setSubject($subject); + $message->setTo([$to => $recipientDisplayName]); + $message->setHtmlBody($htmlBody); + $message->setPlainBody($textBody); + $message->setFrom([ + \OCP\Util::getDefaultEmailAddress('admin-noreply') + ]); + + $this->mailer->send($message); + } catch (\Exception $e) { + $noMail[] = $recipient; + } + } + } + + $progress->finish(); + + if (empty($noMail)) { + $this->output->writeln("\n\nPassword successfully send to all users"); + } else { + $table = new Table($this->output); + $table->setHeaders(array('Username', 'Private key password')); + $this->output->writeln("\n\nCould not send password to following users:\n"); + $rows = []; + foreach ($noMail as $uid) { + $rows[] = [$uid, $this->userPasswords[$uid]]; + } + $table->setRows($rows); + $table->render(); + } + + } + + /** + * create mail body for plain text and html mail + * + * @param string $password one-time encryption password + * @return array an array of the html mail body and the plain text mail body + */ + protected function createMailBody($password) { + + $html = new \OC_Template("encryption", "mail", ""); + $html->assign ('password', $password); + $htmlMail = $html->fetchPage(); + + $plainText = new \OC_Template("encryption", "altmail", ""); + $plainText->assign ('password', $password); + $plainTextMail = $plainText->fetchPage(); + + return [$htmlMail, $plainTextMail]; + } + +} diff --git a/apps/encryption/lib/crypto/encryption.php b/apps/encryption/lib/crypto/encryption.php index 1fa0581506b..1bd6af2eca7 100644 --- a/apps/encryption/lib/crypto/encryption.php +++ b/apps/encryption/lib/crypto/encryption.php @@ -35,6 +35,8 @@ use OCP\Encryption\IEncryptionModule; use OCA\Encryption\KeyManager; use OCP\IL10N; use OCP\ILogger; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; class Encryption implements IEncryptionModule { @@ -79,22 +81,28 @@ class Encryption implements IEncryptionModule { /** @var IL10N */ private $l; + /** @var EncryptAll */ + private $encryptAll; + /** * * @param Crypt $crypt * @param KeyManager $keyManager * @param Util $util + * @param EncryptAll $encryptAll * @param ILogger $logger * @param IL10N $il10n */ public function __construct(Crypt $crypt, KeyManager $keyManager, Util $util, + EncryptAll $encryptAll, ILogger $logger, IL10N $il10n) { $this->crypt = $crypt; $this->keyManager = $keyManager; $this->util = $util; + $this->encryptAll = $encryptAll; $this->logger = $logger; $this->l = $il10n; } @@ -397,6 +405,17 @@ class Encryption implements IEncryptionModule { return true; } + /** + * Initial encryption of all files + * + * @param InputInterface $input + * @param OutputInterface $output write some status information to the terminal during encryption + * @return bool + */ + public function encryptAll(InputInterface $input, OutputInterface $output) { + return $this->encryptAll->encryptAll($input, $output); + } + /** * @param string $path * @return string diff --git a/apps/encryption/lib/users/setup.php b/apps/encryption/lib/users/setup.php index f224826ed52..433ea824c9b 100644 --- a/apps/encryption/lib/users/setup.php +++ b/apps/encryption/lib/users/setup.php @@ -76,6 +76,8 @@ class Setup { } /** + * check if user has a key pair, if not we create one + * * @param string $uid userid * @param string $password user password * @return bool diff --git a/apps/encryption/templates/altmail.php b/apps/encryption/templates/altmail.php new file mode 100644 index 00000000000..b92c6b4a7c4 --- /dev/null +++ b/apps/encryption/templates/altmail.php @@ -0,0 +1,16 @@ +t("Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n", array($_['password']))); +if ( isset($_['expiration']) ) { + print_unescaped($l->t("The share will expire on %s.", array($_['expiration']))); + print_unescaped("\n\n"); +} +// TRANSLATORS term at the end of a mail +p($l->t("Cheers!")); +?> + + -- +getName() . ' - ' . $theme->getSlogan()); ?> +getBaseUrl()); diff --git a/apps/encryption/templates/mail.php b/apps/encryption/templates/mail.php new file mode 100644 index 00000000000..2b61e915dec --- /dev/null +++ b/apps/encryption/templates/mail.php @@ -0,0 +1,39 @@ + + + +
+ + + + + + + + + + + + + + + + + + +
  + <?php p($theme->getName()); ?> +
 
  + t('Hey there,

the admin enabled server-side-encryption. Your files were encrypted using the password %s.

Please login to the web interface, go to the section "ownCloud basic encryption module" of your personal settings and update your encryption password by entering this password into the "old log-in password" field and your current login-password.

', array($_['password']))); + // TRANSLATORS term at the end of a mail + p($l->t('Cheers!')); + ?> +
 
 --
+ getName()); ?> - + getSlogan()); ?> +
getBaseUrl());?> +
 
+
diff --git a/apps/encryption/tests/lib/crypto/encryptalltest.php b/apps/encryption/tests/lib/crypto/encryptalltest.php new file mode 100644 index 00000000000..e907d154a2d --- /dev/null +++ b/apps/encryption/tests/lib/crypto/encryptalltest.php @@ -0,0 +1,291 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program 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, version 3, + * along with this program. If not, see + * + */ + + +namespace OCA\Encryption\Tests\lib\Crypto; + + +use OCA\Encryption\Crypto\EncryptAll; +use Test\TestCase; + +class EncryptAllTest extends TestCase { + + /** @var \PHPUnit_Framework_MockObject_MockObject | \OCA\Encryption\KeyManager */ + protected $keyManager; + + /** @var \PHPUnit_Framework_MockObject_MockObject | \OCP\IUserManager */ + protected $userManager; + + /** @var \PHPUnit_Framework_MockObject_MockObject | \OCA\Encryption\Users\Setup */ + protected $setupUser; + + /** @var \PHPUnit_Framework_MockObject_MockObject | \OC\Files\View */ + protected $view; + + /** @var \PHPUnit_Framework_MockObject_MockObject | \OCP\IConfig */ + protected $config; + + /** @var \PHPUnit_Framework_MockObject_MockObject | \OCP\Mail\IMailer */ + protected $mailer; + + /** @var \PHPUnit_Framework_MockObject_MockObject | \OCP\IL10N */ + protected $l; + + /** @var \PHPUnit_Framework_MockObject_MockObject | \Symfony\Component\Console\Helper\QuestionHelper */ + protected $questionHelper; + + /** @var \PHPUnit_Framework_MockObject_MockObject | \Symfony\Component\Console\Input\InputInterface */ + protected $inputInterface; + + /** @var \PHPUnit_Framework_MockObject_MockObject | \Symfony\Component\Console\Output\OutputInterface */ + protected $outputInterface; + + /** @var \PHPUnit_Framework_MockObject_MockObject | \OCP\UserInterface */ + protected $userInterface; + + /** @var \PHPUnit_Framework_MockObject_MockObject | \OCP\Security\ISecureRandom */ + protected $secureRandom; + + /** @var EncryptAll */ + protected $encryptAll; + + function setUp() { + parent::setUp(); + $this->setupUser = $this->getMockBuilder('OCA\Encryption\Users\Setup') + ->disableOriginalConstructor()->getMock(); + $this->keyManager = $this->getMockBuilder('OCA\Encryption\KeyManager') + ->disableOriginalConstructor()->getMock(); + $this->userManager = $this->getMockBuilder('OCP\IUserManager') + ->disableOriginalConstructor()->getMock(); + $this->view = $this->getMockBuilder('OC\Files\View') + ->disableOriginalConstructor()->getMock(); + $this->config = $this->getMockBuilder('OCP\IConfig') + ->disableOriginalConstructor()->getMock(); + $this->mailer = $this->getMockBuilder('OCP\Mail\IMailer') + ->disableOriginalConstructor()->getMock(); + $this->l = $this->getMockBuilder('OCP\IL10N') + ->disableOriginalConstructor()->getMock(); + $this->questionHelper = $this->getMockBuilder('Symfony\Component\Console\Helper\QuestionHelper') + ->disableOriginalConstructor()->getMock(); + $this->inputInterface = $this->getMockBuilder('Symfony\Component\Console\Input\InputInterface') + ->disableOriginalConstructor()->getMock(); + $this->outputInterface = $this->getMockBuilder('Symfony\Component\Console\Output\OutputInterface') + ->disableOriginalConstructor()->getMock(); + $this->userInterface = $this->getMockBuilder('OCP\UserInterface') + ->disableOriginalConstructor()->getMock(); + + + $this->outputInterface->expects($this->any())->method('getFormatter') + ->willReturn($this->getMock('\Symfony\Component\Console\Formatter\OutputFormatterInterface')); + + $this->userManager->expects($this->any())->method('getBackends')->willReturn([$this->userInterface]); + $this->userInterface->expects($this->any())->method('getUsers')->willReturn(['user1', 'user2']); + + $this->secureRandom = $this->getMockBuilder('OCP\Security\ISecureRandom')->disableOriginalConstructor()->getMock(); + $this->secureRandom->expects($this->any())->method('getMediumStrengthGenerator')->willReturn($this->secureRandom); + $this->secureRandom->expects($this->any())->method('getLowStrengthGenerator')->willReturn($this->secureRandom); + $this->secureRandom->expects($this->any())->method('generate')->willReturn('12345678'); + + + $this->encryptAll = new EncryptAll( + $this->setupUser, + $this->userManager, + $this->view, + $this->keyManager, + $this->config, + $this->mailer, + $this->l, + $this->questionHelper, + $this->secureRandom + ); + } + + public function testEncryptAll() { + /** @var EncryptAll | \PHPUnit_Framework_MockObject_MockObject $encryptAll */ + $encryptAll = $this->getMockBuilder('OCA\Encryption\Crypto\EncryptAll') + ->setConstructorArgs( + [ + $this->setupUser, + $this->userManager, + $this->view, + $this->keyManager, + $this->config, + $this->mailer, + $this->l, + $this->questionHelper, + $this->secureRandom + ] + ) + ->setMethods(['createKeyPairs', 'encryptAllUsersFiles', 'outputPasswords']) + ->getMock(); + + $encryptAll->expects($this->at(0))->method('createKeyPairs')->with(); + $encryptAll->expects($this->at(1))->method('encryptAllUsersFiles')->with(); + $encryptAll->expects($this->at(2))->method('outputPasswords')->with(); + + $encryptAll->encryptAll($this->inputInterface, $this->outputInterface); + + } + + public function testCreateKeyPairs() { + /** @var EncryptAll | \PHPUnit_Framework_MockObject_MockObject $encryptAll */ + $encryptAll = $this->getMockBuilder('OCA\Encryption\Crypto\EncryptAll') + ->setConstructorArgs( + [ + $this->setupUser, + $this->userManager, + $this->view, + $this->keyManager, + $this->config, + $this->mailer, + $this->l, + $this->questionHelper, + $this->secureRandom + ] + ) + ->setMethods(['setupUserFS', 'generateOneTimePassword']) + ->getMock(); + + + // set protected property $output + $this->invokePrivate($encryptAll, 'output', [$this->outputInterface]); + + $this->keyManager->expects($this->exactly(2))->method('userHasKeys') + ->willReturnCallback( + function ($user) { + if ($user === 'user1') { + return false; + } + return true; + } + ); + + $encryptAll->expects($this->once())->method('setupUserFS')->with('user1'); + $encryptAll->expects($this->once())->method('generateOneTimePassword')->with('user1')->willReturn('password'); + $this->setupUser->expects($this->once())->method('setupUser')->with('user1', 'password'); + + $this->invokePrivate($encryptAll, 'createKeyPairs'); + + $userPasswords = $this->invokePrivate($encryptAll, 'userPasswords'); + + // we only expect the skipped user, because generateOneTimePassword which + // would set the user with the new password was mocked. + // This method will be tested separately + $this->assertSame(1, count($userPasswords)); + $this->assertSame('', $userPasswords['user2']); + } + + public function testEncryptAllUsersFiles() { + /** @var EncryptAll | \PHPUnit_Framework_MockObject_MockObject $encryptAll */ + $encryptAll = $this->getMockBuilder('OCA\Encryption\Crypto\EncryptAll') + ->setConstructorArgs( + [ + $this->setupUser, + $this->userManager, + $this->view, + $this->keyManager, + $this->config, + $this->mailer, + $this->l, + $this->questionHelper, + $this->secureRandom + ] + ) + ->setMethods(['encryptUsersFiles']) + ->getMock(); + + // set protected property $output + $this->invokePrivate($encryptAll, 'output', [$this->outputInterface]); + $this->invokePrivate($encryptAll, 'userPasswords', [['user1' => 'pwd1', 'user2' => 'pwd2']]); + + $encryptAll->expects($this->at(0))->method('encryptUsersFiles')->with('user1'); + $encryptAll->expects($this->at(1))->method('encryptUsersFiles')->with('user2'); + + $this->invokePrivate($encryptAll, 'encryptAllUsersFiles'); + + } + + public function testEncryptUsersFiles() { + /** @var EncryptAll | \PHPUnit_Framework_MockObject_MockObject $encryptAll */ + $encryptAll = $this->getMockBuilder('OCA\Encryption\Crypto\EncryptAll') + ->setConstructorArgs( + [ + $this->setupUser, + $this->userManager, + $this->view, + $this->keyManager, + $this->config, + $this->mailer, + $this->l, + $this->questionHelper, + $this->secureRandom + ] + ) + ->setMethods(['encryptFile']) + ->getMock(); + + + $this->view->expects($this->at(0))->method('getDirectoryContent') + ->with('/user1/files')->willReturn( + [ + ['name' => 'foo', 'type'=>'dir'], + ['name' => 'bar', 'type'=>'file'], + ] + ); + + $this->view->expects($this->at(3))->method('getDirectoryContent') + ->with('/user1/files/foo')->willReturn( + [ + ['name' => 'subfile', 'type'=>'file'] + ] + ); + + $this->view->expects($this->any())->method('is_dir') + ->willReturnCallback( + function($path) { + if ($path === '/user1/files/foo') { + return true; + } + return false; + } + ); + + $encryptAll->expects($this->at(0))->method('encryptFile')->with('/user1/files/bar'); + $encryptAll->expects($this->at(1))->method('encryptFile')->with('/user1/files/foo/subfile'); + + $progressBar = $this->getMockBuilder('Symfony\Component\Console\Helper\ProgressBar') + ->disableOriginalConstructor()->getMock(); + + $this->invokePrivate($encryptAll, 'encryptUsersFiles', ['user1', $progressBar, '']); + + } + + public function testGenerateOneTimePassword() { + $password = $this->invokePrivate($this->encryptAll, 'generateOneTimePassword', ['user1']); + $this->assertTrue(is_string($password)); + $this->assertSame(8, strlen($password)); + + $userPasswords = $this->invokePrivate($this->encryptAll, 'userPasswords'); + $this->assertSame(1, count($userPasswords)); + $this->assertSame($password, $userPasswords['user1']); + } + +} diff --git a/apps/encryption/tests/lib/crypto/encryptionTest.php b/apps/encryption/tests/lib/crypto/encryptionTest.php index 7b0b29fe197..f58aa5d3ccb 100644 --- a/apps/encryption/tests/lib/crypto/encryptionTest.php +++ b/apps/encryption/tests/lib/crypto/encryptionTest.php @@ -36,6 +36,9 @@ class EncryptionTest extends TestCase { /** @var \PHPUnit_Framework_MockObject_MockObject */ private $keyManagerMock; + /** @var \PHPUnit_Framework_MockObject_MockObject */ + private $encryptAllMock; + /** @var \PHPUnit_Framework_MockObject_MockObject */ private $cryptMock; @@ -60,6 +63,9 @@ class EncryptionTest extends TestCase { $this->keyManagerMock = $this->getMockBuilder('OCA\Encryption\KeyManager') ->disableOriginalConstructor() ->getMock(); + $this->encryptAllMock = $this->getMockBuilder('OCA\Encryption\Crypto\EncryptAll') + ->disableOriginalConstructor() + ->getMock(); $this->loggerMock = $this->getMockBuilder('OCP\ILogger') ->disableOriginalConstructor() ->getMock(); @@ -75,6 +81,7 @@ class EncryptionTest extends TestCase { $this->cryptMock, $this->keyManagerMock, $this->utilMock, + $this->encryptAllMock, $this->loggerMock, $this->l10nMock ); diff --git a/core/command/encryption/encryptall.php b/core/command/encryption/encryptall.php new file mode 100644 index 00000000000..db413a33d92 --- /dev/null +++ b/core/command/encryption/encryptall.php @@ -0,0 +1,114 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program 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, version 3, + * along with this program. If not, see + * + */ + +namespace OC\Core\Command\Encryption; + +use OCP\App\IAppManager; +use OCP\Encryption\IManager; +use OCP\IConfig; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Helper\QuestionHelper; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\Console\Question\ConfirmationQuestion; + +class EncryptAll extends Command { + + /** @var IManager */ + protected $encryptionManager; + + /** @var IAppManager */ + protected $appManager; + + /** @var IConfig */ + protected $config; + + /** @var QuestionHelper */ + protected $questionHelper; + + /** @var bool */ + protected $wasTrashbinEnabled; + + /** @var bool */ + protected $wasSingleUserModeEnabled; + + /** + * @param IManager $encryptionManager + * @param IAppManager $appManager + * @param IConfig $config + * @param QuestionHelper $questionHelper + */ + public function __construct( + IManager $encryptionManager, + IAppManager $appManager, + IConfig $config, + QuestionHelper $questionHelper + ) { + parent::__construct(); + $this->appManager = $appManager; + $this->encryptionManager = $encryptionManager; + $this->config = $config; + $this->questionHelper = $questionHelper; + $this->wasTrashbinEnabled = $this->appManager->isEnabledForUser('files_trashbin'); + $this->wasSingleUserModeEnabled = $this->config->getSystemValue('singleUser', false); + $this->config->setSystemValue('singleUser', true); + $this->appManager->disableApp('files_trashbin'); + } + + public function __destruct() { + $this->config->setSystemValue('singleUser', $this->wasSingleUserModeEnabled); + if ($this->wasTrashbinEnabled) { + $this->appManager->enableApp('files_trashbin'); + } + } + + protected function configure() { + parent::configure(); + + $this->setName('encryption:encrypt_all'); + $this->setDescription( + 'This will encrypt all files for all users. ' + . 'Please make sure that no user access his files during this process!' + ); + } + + protected function execute(InputInterface $input, OutputInterface $output) { + + if ($this->encryptionManager->isEnabled() === false) { + throw new \Exception('Server side encryption is not enabled'); + } + + $output->writeln("\n"); + $output->writeln('You are about to start to encrypt all files stored in your ownCloud.'); + $output->writeln('It will depend on the encryption module you use which files get encrypted.'); + $output->writeln('Depending on the number and size of your files this can take some time'); + $output->writeln('Please make sure that no user access his files during this process!'); + $output->writeln(''); + $question = new ConfirmationQuestion('Do you really want to continue? (y/n) ', false); + if ($this->questionHelper->ask($input, $output, $question)) { + $defaultModule = $this->encryptionManager->getEncryptionModule(); + $defaultModule->encryptAll($input, $output); + } else { + $output->writeln('aborted'); + } + } + +} diff --git a/core/register_command.php b/core/register_command.php index 6cd81b4c3b7..86816f10419 100644 --- a/core/register_command.php +++ b/core/register_command.php @@ -57,6 +57,7 @@ if (\OC::$server->getConfig()->getSystemValue('installed', false)) { $application->add(new OC\Core\Command\Encryption\ListModules(\OC::$server->getEncryptionManager())); $application->add(new OC\Core\Command\Encryption\SetDefaultModule(\OC::$server->getEncryptionManager())); $application->add(new OC\Core\Command\Encryption\Status(\OC::$server->getEncryptionManager())); + $application->add(new OC\Core\Command\Encryption\EncryptAll(\OC::$server->getEncryptionManager(), \OC::$server->getAppManager(), \OC::$server->getConfig(), new \Symfony\Component\Console\Helper\QuestionHelper())); $application->add(new OC\Core\Command\Maintenance\MimeTypesJS()); $application->add(new OC\Core\Command\Maintenance\Mode(\OC::$server->getConfig())); diff --git a/lib/public/encryption/iencryptionmodule.php b/lib/public/encryption/iencryptionmodule.php index 183b322e714..a5cd7075691 100644 --- a/lib/public/encryption/iencryptionmodule.php +++ b/lib/public/encryption/iencryptionmodule.php @@ -23,6 +23,8 @@ */ namespace OCP\Encryption; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; /** * Interface IEncryptionModule @@ -134,4 +136,14 @@ interface IEncryptionModule { */ public function isReadable($path, $uid); + /** + * Initial encryption of all files + * + * @param InputInterface $input + * @param OutputInterface $output write some status information to the terminal during encryption + * @return bool + * @since 8.2.0 + */ + public function encryptAll(InputInterface $input, OutputInterface $output); + } diff --git a/tests/core/command/encryption/encryptalltest.php b/tests/core/command/encryption/encryptalltest.php new file mode 100644 index 00000000000..41edee6987c --- /dev/null +++ b/tests/core/command/encryption/encryptalltest.php @@ -0,0 +1,131 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program 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, version 3, + * along with this program. If not, see + * + */ + + +namespace Tests\Core\Command\Encryption; + + +use OC\Core\Command\Encryption\EncryptAll; +use Test\TestCase; + +class EncryptAllTest extends TestCase { + + /** @var \PHPUnit_Framework_MockObject_MockObject | \OCP\IConfig */ + protected $config; + + /** @var \PHPUnit_Framework_MockObject_MockObject | \OCP\Encryption\IManager */ + protected $encryptionManager; + + /** @var \PHPUnit_Framework_MockObject_MockObject | \OCP\App\IAppManager */ + protected $appManager; + + /** @var \PHPUnit_Framework_MockObject_MockObject | \Symfony\Component\Console\Input\InputInterface */ + protected $consoleInput; + + /** @var \PHPUnit_Framework_MockObject_MockObject | \Symfony\Component\Console\Output\OutputInterface */ + protected $consoleOutput; + + /** @var \PHPUnit_Framework_MockObject_MockObject | \Symfony\Component\Console\Helper\QuestionHelper */ + protected $questionHelper; + + /** @var \PHPUnit_Framework_MockObject_MockObject | \OCP\Encryption\IEncryptionModule */ + protected $encryptionModule; + + /** @var EncryptAll */ + protected $command; + + protected function setUp() { + parent::setUp(); + + $this->config = $this->getMockBuilder('OCP\IConfig') + ->disableOriginalConstructor() + ->getMock(); + $this->encryptionManager = $this->getMockBuilder('OCP\Encryption\IManager') + ->disableOriginalConstructor() + ->getMock(); + $this->appManager = $this->getMockBuilder('OCP\App\IAppManager') + ->disableOriginalConstructor() + ->getMock(); + $this->encryptionModule = $this->getMockBuilder('\OCP\Encryption\IEncryptionModule') + ->disableOriginalConstructor() + ->getMock(); + $this->questionHelper = $this->getMockBuilder('Symfony\Component\Console\Helper\QuestionHelper') + ->disableOriginalConstructor() + ->getMock(); + $this->consoleInput = $this->getMock('Symfony\Component\Console\Input\InputInterface'); + $this->consoleOutput = $this->getMock('Symfony\Component\Console\Output\OutputInterface'); + + } + + public function testEncryptAll() { + // trash bin needs to be disabled in order to avoid adding dummy files to the users + // trash bin which gets deleted during the encryption process + $this->appManager->expects($this->once())->method('disableApp')->with('files_trashbin'); + // enable single user mode to avoid that other user login during encryption + // destructor should disable the single user mode again + $this->config->expects($this->once())->method('getSystemValue')->with('singleUser', false)->willReturn(false); + $this->config->expects($this->at(1))->method('setSystemValue')->with('singleUser', true); + $this->config->expects($this->at(2))->method('setSystemValue')->with('singleUser', false); + + new EncryptAll($this->encryptionManager, $this->appManager, $this->config, $this->questionHelper); + } + + /** + * @dataProvider dataTestExecute + */ + public function testExecute($answer, $askResult) { + + $command = new EncryptAll($this->encryptionManager, $this->appManager, $this->config, $this->questionHelper); + + $this->encryptionManager->expects($this->once())->method('isEnabled')->willReturn(true); + $this->questionHelper->expects($this->once())->method('ask')->willReturn($askResult); + + if ($answer === 'Y' || $answer === 'y') { + $this->encryptionManager->expects($this->once()) + ->method('getEncryptionModule')->willReturn($this->encryptionModule); + $this->encryptionModule->expects($this->once()) + ->method('encryptAll')->with($this->consoleInput, $this->consoleOutput); + } else { + $this->encryptionManager->expects($this->never())->method('getEncryptionModule'); + $this->encryptionModule->expects($this->never())->method('encryptAll'); + } + + $this->invokePrivate($command, 'execute', [$this->consoleInput, $this->consoleOutput]); + } + + public function dataTestExecute() { + return [ + ['y', true], ['Y', true], ['n', false], ['N', false], ['', false] + ]; + } + + /** + * @expectedException \Exception + */ + public function testExecuteException() { + $command = new EncryptAll($this->encryptionManager, $this->appManager, $this->config, $this->questionHelper); + $this->encryptionManager->expects($this->once())->method('isEnabled')->willReturn(false); + $this->encryptionManager->expects($this->never())->method('getEncryptionModule'); + $this->encryptionModule->expects($this->never())->method('encryptAll'); + $this->invokePrivate($command, 'execute', [$this->consoleInput, $this->consoleOutput]); + } + +} diff --git a/tests/lib/files/storage/wrapper/encryption.php b/tests/lib/files/storage/wrapper/encryption.php index c49e6bb0d1f..3d1bf1077a2 100644 --- a/tests/lib/files/storage/wrapper/encryption.php +++ b/tests/lib/files/storage/wrapper/encryption.php @@ -194,7 +194,7 @@ class Encryption extends \Test\Files\Storage\Storage { protected function buildMockModule() { $this->encryptionModule = $this->getMockBuilder('\OCP\Encryption\IEncryptionModule') ->disableOriginalConstructor() - ->setMethods(['getId', 'getDisplayName', 'begin', 'end', 'encrypt', 'decrypt', 'update', 'shouldEncrypt', 'getUnencryptedBlockSize', 'isReadable']) + ->setMethods(['getId', 'getDisplayName', 'begin', 'end', 'encrypt', 'decrypt', 'update', 'shouldEncrypt', 'getUnencryptedBlockSize', 'isReadable', 'encryptAll']) ->getMock(); $this->encryptionModule->expects($this->any())->method('getId')->willReturn('UNIT_TEST_MODULE'); diff --git a/tests/lib/files/stream/encryption.php b/tests/lib/files/stream/encryption.php index 281ec0a14a0..ed3b5b1b156 100644 --- a/tests/lib/files/stream/encryption.php +++ b/tests/lib/files/stream/encryption.php @@ -305,7 +305,7 @@ class Encryption extends \Test\TestCase { protected function buildMockModule() { $encryptionModule = $this->getMockBuilder('\OCP\Encryption\IEncryptionModule') ->disableOriginalConstructor() - ->setMethods(['getId', 'getDisplayName', 'begin', 'end', 'encrypt', 'decrypt', 'update', 'shouldEncrypt', 'getUnencryptedBlockSize', 'isReadable']) + ->setMethods(['getId', 'getDisplayName', 'begin', 'end', 'encrypt', 'decrypt', 'update', 'shouldEncrypt', 'getUnencryptedBlockSize', 'isReadable', 'encryptAll']) ->getMock(); $encryptionModule->expects($this->any())->method('getId')->willReturn('UNIT_TEST_MODULE'); -- GitLab From e51fe617d89fd515e9e6836f205f67c613939b41 Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Mon, 24 Aug 2015 15:57:03 +0200 Subject: [PATCH 046/783] copy always file by file to encrypt/decrypt it if needed --- .../files/storage/wrapper/encryption.php | 44 +++++-------- .../lib/files/storage/wrapper/encryption.php | 61 +++---------------- 2 files changed, 23 insertions(+), 82 deletions(-) diff --git a/lib/private/files/storage/wrapper/encryption.php b/lib/private/files/storage/wrapper/encryption.php index 4ba9b21ddb4..805a2bc1ad0 100644 --- a/lib/private/files/storage/wrapper/encryption.php +++ b/lib/private/files/storage/wrapper/encryption.php @@ -67,7 +67,6 @@ class Encryption extends Wrapper { /** @var IMountPoint */ private $mount; - /** @var IStorage */ private $keyStorage; @@ -300,33 +299,15 @@ class Encryption extends Wrapper { public function copy($path1, $path2) { $source = $this->getFullPath($path1); - $target = $this->getFullPath($path2); if ($this->util->isExcluded($source)) { return $this->storage->copy($path1, $path2); } - $result = $this->storage->copy($path1, $path2); - - if ($result && $this->encryptionManager->isEnabled()) { - $keysCopied = $this->copyKeys($source, $target); - - if ($keysCopied && - dirname($source) !== dirname($target) && - $this->util->isFile($target) - ) { - $this->update->update($target); - } - - $data = $this->getMetaData($path1); - - if (isset($data['encrypted'])) { - $this->getCache()->put($path2, ['encrypted' => $data['encrypted']]); - } - if (isset($data['size'])) { - $this->updateUnencryptedSize($target, $data['size']); - } - } + // need to stream copy file by file in case we copy between a encrypted + // and a unencrypted storage + $this->unlink($path2); + $result = $this->copyFromStorage($this, $path1, $path2); return $result; } @@ -511,12 +492,17 @@ class Encryption extends Wrapper { } } } else { - $source = $sourceStorage->fopen($sourceInternalPath, 'r'); - $target = $this->fopen($targetInternalPath, 'w'); - list(, $result) = \OC_Helper::streamCopy($source, $target); - fclose($source); - fclose($target); - + try { + $source = $sourceStorage->fopen($sourceInternalPath, 'r'); + $target = $this->fopen($targetInternalPath, 'w'); + list(, $result) = \OC_Helper::streamCopy($source, $target); + fclose($source); + fclose($target); + } catch (\Exception $e) { + fclose($source); + fclose($target); + throw $e; + } if($result) { if ($preserveMtime) { $this->touch($targetInternalPath, $sourceStorage->filemtime($sourceInternalPath)); diff --git a/tests/lib/files/storage/wrapper/encryption.php b/tests/lib/files/storage/wrapper/encryption.php index 3d1bf1077a2..36a5b288c64 100644 --- a/tests/lib/files/storage/wrapper/encryption.php +++ b/tests/lib/files/storage/wrapper/encryption.php @@ -241,59 +241,14 @@ class Encryption extends \Test\Files\Storage\Storage { $this->instance->rename($source, $target); } - /** - * @dataProvider dataTestCopyAndRename - * - * @param string $source - * @param string $target - * @param $encryptionEnabled - * @param boolean $copyKeysReturn - * @param boolean $shouldUpdate - */ - public function testCopyEncryption($source, - $target, - $encryptionEnabled, - $copyKeysReturn, - $shouldUpdate) { - - if ($encryptionEnabled) { - $this->keyStore - ->expects($this->once()) - ->method('copyKeys') - ->willReturn($copyKeysReturn); - $this->cache->expects($this->atLeastOnce()) - ->method('put') - ->willReturnCallback(function($path, $data) { - $this->assertArrayHasKey('encrypted', $data); - $this->assertTrue($data['encrypted']); - }); - } else { - $this->cache->expects($this->never())->method('put'); - $this->keyStore->expects($this->never())->method('copyKeys'); - } - $this->util->expects($this->any()) - ->method('isFile')->willReturn(true); - $this->util->expects($this->any()) - ->method('isExcluded')->willReturn(false); - $this->encryptionManager->expects($this->once()) - ->method('isEnabled')->willReturn($encryptionEnabled); - if ($shouldUpdate) { - $this->update->expects($this->once()) - ->method('update'); - } else { - $this->update->expects($this->never()) - ->method('update'); - } - - $this->instance->mkdir($source); - $this->instance->mkdir(dirname($target)); - $this->instance->copy($source, $target); - - if ($encryptionEnabled) { - $this->assertSame($this->dummySize, - $this->instance->filesize($target) - ); - } + public function testCopyEncryption() { + $this->instance->file_put_contents('source.txt', 'bar'); + $this->instance->copy('source.txt', 'target.txt'); + $this->assertSame('bar', $this->instance->file_get_contents('target.txt')); + $targetMeta = $this->instance->getMetaData('target.txt'); + $sourceMeta = $this->instance->getMetaData('source.txt'); + $this->assertSame($sourceMeta['encrypted'], $targetMeta['encrypted']); + $this->assertSame($sourceMeta['size'], $targetMeta['size']); } /** -- GitLab From bf0c3b3d21cf918b074ffa26c018b022721a3464 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Mon, 24 Aug 2015 12:16:55 +0200 Subject: [PATCH 047/783] reduce grey tones in app navigation, bubble menu and scrollbar --- apps/files/css/files.css | 2 +- apps/files/img/delete.png | Bin 209 -> 243 bytes apps/files/img/delete.svg | 2 +- apps/files/img/external.png | Bin 369 -> 392 bytes apps/files/img/external.svg | 2 +- apps/files/img/folder.png | Bin 160 -> 303 bytes apps/files/img/folder.svg | 4 ++-- apps/files/img/public.png | Bin 297 -> 307 bytes apps/files/img/public.svg | 6 +++--- apps/files/img/share.png | Bin 365 -> 264 bytes apps/files/img/share.svg | 2 +- apps/files/img/star.png | Bin 373 -> 490 bytes apps/files/img/star.svg | 4 ++-- core/css/apps.css | 41 ++++++++++++++++-------------------- core/css/styles.css | 2 +- 15 files changed, 30 insertions(+), 35 deletions(-) diff --git a/apps/files/css/files.css b/apps/files/css/files.css index f8c1d03b666..a1b9312b152 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -133,7 +133,7 @@ position: fixed !important; bottom: 44px; width: inherit !important; - background-color: #f5f5f5; + background-color: #fff; } /* double padding to account for Deleted files entry, issue with Firefox */ .app-files #app-navigation > ul li:nth-last-child(2) { diff --git a/apps/files/img/delete.png b/apps/files/img/delete.png index b2ab8c5efefab235fa4bfa1eb06afa0106116a21..e891b370cca7b3d83e937863dbbc9578c5b8b1bd 100644 GIT binary patch delta 227 zcmcb}_?dBnL_G%^0|SHn=l_X7ilx}eGlT;OYB*9lfPBsZkH}&M2Hxu+%;=;sy8hT|5}cn_Ql40p%1~Zju9umYU7Va)kgAtols@~NjTBH(fv1aOh(+(&Nr7Ak6nLB` zSN{L~L$hMW+xyHZ_NPKLN`%{5>u%aj7V?TYWweEFT!`!Y2ng9#!1`#rm_L|MB^U&(t-XW|T<#w)um70$&irgv53YW{$t-il*cn XUC&$i?88QNpydpnu6{1-oD!M& zkY6wZlbEu;jYmjKLSj;GRm1s7Qv-ogE}kxqAso@YCl~TI7>GC=%(iXwoH0dk#!6)d zt~37P8V_c9`R#pTcq4Cvn@h|jhT{JxOCH2*5?}SEG4|R5iEHaMwygTiaAUH}>5lAv QeUPg>UHx3vIVCg!03d`qr2qf` diff --git a/apps/files/img/delete.svg b/apps/files/img/delete.svg index b6dc2cc4173..f0a3cd4db88 100644 --- a/apps/files/img/delete.svg +++ b/apps/files/img/delete.svg @@ -1,4 +1,4 @@ - + diff --git a/apps/files/img/external.png b/apps/files/img/external.png index 2ac5e9344c33c1abf1b12d115d91d2d3e4240650..af03dbf3e05397a5aa029b699297933729f55d56 100644 GIT binary patch delta 376 zcmV-;0f+wa0*C{U8Gi-<001BJ|6u?C00eVFNmK|32nc)#WQYI&010qNS#tmY4c7nw z4c7reD4Tcy000?uMObuGZ)S9NVRB^vcXxL#X>MzCV_|S*E^l&Yo9;Xs00036Nkl>6CYCA*FL=j3P6q&7qoWw% z1YNvU^tk{GTq67QDl>Z{Y~dj@j|Yq~kL_V&j^bbucXa?$HN`7<>ML&J9KYjq(85N= zencxXyAkn;J#i>WyueLnsw&Qk-)=Ei_;!kSAv5a%ir5jF6}yeY(jLk|DVcennLicR zG}cOEB)}*sNleT}#PS$5%_6_oBJASJ|7{zjA6PFri1HdEVhS^3bnu;-y*-FY&-oAb WnUGyx?$P7`0000;M1%fy{vgdo_$60$rd} z666=mz{teR!p6bL&BG@sA}S@TpscNHU}9$B;OXV#9}yK3mz126o>Nd#UR~d?(opg* zP+x(ki(^OyW9f->J|;y8wuj=e++vK~H$+`ScKrX#GO53%rS{+11?OvKbGmqIs>;VW z6|rsjXZf5b-Ce3(d(y_0$FHKM=UeKVWP7(8b21!$N4JZrr8@97E_af=nSEWZ m+%HG&k@Si5#+K5Sg%A0U_44K|IP%y96l$KXelF{r5}E*ru~6s$ diff --git a/apps/files/img/external.svg b/apps/files/img/external.svg index d1940f2f1b3..80eba5b9960 100644 --- a/apps/files/img/external.svg +++ b/apps/files/img/external.svg @@ -1,4 +1,4 @@ - + diff --git a/apps/files/img/folder.png b/apps/files/img/folder.png index ada4c4c2f882d05c44d53a592309c44d0c6e31f2..4a8861f25ca0bc4709493b03f005491a0ba571d3 100644 GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI13?%1G+4BcTB?S0{xB_XKf?xhGdVvUCa2Xlt=PJ4_n}jdp1=I^ZMU*&0#IqZr;B4q#jUGnZt^)8 z2sm7HoVuti>;3=#OOF_FE_Ql!wAS`y>+U%g(Lz&}#05{8)GKAYRVLYE$wbA8d(=%> z|IFyU(kMNbYwg^kPgByo{yW)}yX~KbLh* G2~7Y(dQVsY literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZ{r~?zkckFt+ujrch1g4i z{DK*H6!Hs;>NyroKLZpp_H=O!;fPL7XkeVSC4{3{SC{u30~51^GUEx47OgaI25!p( n5}Xy1o(67GQw~mIyV}RdQ2Rut*RtbFHpmiBS3j3^P6 - - + + diff --git a/apps/files/img/public.png b/apps/files/img/public.png index f49c5fb1ee555b025a3645238a90515a6baf0f8a..772838ad2058e5e6e16c9fcb13e1bb6708155238 100644 GIT binary patch delta 205 zcmV;;05bon0fjm!aBi0001UNkl2atPc;S!O2v{`cqASsqg|rJoMk?mBx@`!jiw zabx&;4-9MV0m%w@Y)}?ym2V73=HhyZ5;T5y1EN6&)&Sqv0{{R307*qoM6N<$f*`(7 A8vp - - - + + + diff --git a/apps/files/img/share.png b/apps/files/img/share.png index 61c87e78b6cc9f46d9ffec57af4e9961b6a85964..fdacbbabebcf013a5a80907b3e62cb2e3c0ee26d 100644 GIT binary patch delta 247 zcmV0*C^T8Gi-<001BJ|6u?C0MAK8K~y-)WBC97KLaJ0c!dlMra-(Ii0=Y% zB@i=_YQRMx{*Q#ch&BKST+lRw@Kk~Z0D&eDuK?nISPXDPF#rf;fjA9_<$+igh!+F# zU#Q~8KwJ*Q%YpbP5GSGpA`rv?@gJz-e@N_SK%5K2?091V2yo7!IqxSB7XdLRQPBtl z$I%S<3dCVR%t)*Oen9*gs`)RHL6?Cz7@tANfyf8M0YEGY#I``Z56PelK%5H1i?9YF xo@jIc;)7VC5HlJH7!*cULZVtyrb=eQg#qdo4PA^R@Y4VQ002ovPDHLkV1nC8U~B*Y literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}V}MVH>;M1%fy@B}jq6q!0j<|A z3GxeOU}R!p=i=iR5|NTqP*PRb(AG0BHnFhr3Ji&iPe@8m&&bZpFRHArsjE-fZpR1I zR^aL47*fGl+kaf>kOPmivwq7Y0VePGUHAXjD?FY#cdPyfziE7vV*Vsn?Z~&j*Ky#` zOUna#r%%c)y;6On=a^%~mWO-7V!1ia`)>D$Y4pFnc?0){b+Pw9wH{b&w0ytRnLYt& n-m_Ddhh&G;&G7yIbIwOrTRrXz9ku5iK_TYp>gTe~DWM4flxSBb diff --git a/apps/files/img/share.svg b/apps/files/img/share.svg index 97f52f2e783..d67d35c6e56 100644 --- a/apps/files/img/share.svg +++ b/apps/files/img/share.svg @@ -1,6 +1,6 @@ - + diff --git a/apps/files/img/star.png b/apps/files/img/star.png index 6b0ec67ec1c5729ca1d758e271c84ff1a328f707..3c66c49a8c4e07667790aa1e0597229a67ece20b 100644 GIT binary patch literal 490 zcmVK~zYIwbnmN98na9;b+$vf`V*}g(7ZaArXW$!NM4#jg^fl z7wr_%`vFpTb0<4LINbSj&Uw$h zoSAzG*8rY`22~4yRw6512RK5dOvo$ziEOq^&~^f}Sr%j%w+T=agL#8PnqdvSiTg)b z4v5dC2l(ONY+^gq<)&Clfy6eGCqV^IF@(pcMPvK*GmK^AIKfw3;5-^H+r~3kz^@J! z|F1RCh^v~y_Yxo{c;3DQBiQdEw*>+BcrUQ!-{5xu?Hg^Z^p*~4VQ zXB3}O{OTc~)kNT_)?p;8qZaWq;or#cOVt+cw6^O!N2?k(qL>dMpj}Ld1Vnm)k9nP| g=qUh+^)T(>UjS6k{<;M1%fy{vgdo_$60$rd} z666=mz{teH&dtNiFCZ)`B`qT>ud1n~qibbt=iuQT5g8Smol{U$TvA$IRb5w~a=ahp zu@X-g#}En0(1YwkO$H3E2iX^`SP_ww6Q~pM;r{gTe~DWM4fmiAYc diff --git a/apps/files/img/star.svg b/apps/files/img/star.svg index fb3eef1e452..3207f6f9a46 100644 --- a/apps/files/img/star.svg +++ b/apps/files/img/star.svg @@ -1,6 +1,6 @@ - - + + diff --git a/core/css/apps.css b/core/css/apps.css index 17595479ae2..846eba8e4bf 100644 --- a/core/css/apps.css +++ b/core/css/apps.css @@ -22,7 +22,7 @@ height: 100%; float: left; -moz-box-sizing: border-box; box-sizing: border-box; - background-color: #f5f5f5; + background-color: #fff; padding-bottom: 44px; -webkit-user-select: none; -moz-user-select: none; @@ -42,10 +42,6 @@ width: 100%; -moz-box-sizing: border-box; box-sizing: border-box; } -#app-navigation .active, -#app-navigation .active a { - background-color: #ddd; -} #app-navigation .active.with-menu > a, #app-navigation .with-counter > a { @@ -56,14 +52,6 @@ padding-right: 90px; } -#app-navigation li:hover > a, -#app-navigation li:focus > a, -#app-navigation a:focus, -#app-navigation .selected, -#app-navigation .selected a { - background-color: #ddd; -} - #app-navigation .with-icon a, #app-navigation .app-navigation-entry-loading a { padding-left: 44px; @@ -82,7 +70,17 @@ -moz-box-sizing: border-box; box-sizing: border-box; white-space: nowrap; text-overflow: ellipsis; - color: #333; + color: #000; + opacity: .5; +} +#app-navigation .active, +#app-navigation .active a, +#app-navigation li:hover > a, +#app-navigation li:focus > a, +#app-navigation a:focus, +#app-navigation .selected, +#app-navigation .selected a { + opacity: 1; } #app-navigation .collapse { @@ -296,7 +294,7 @@ .bubble, #app-navigation .app-navigation-entry-menu { position: absolute; - background-color: #eee; + background-color: #fff; color: #333; border-radius: 3px; border-top-right-radius: 0; @@ -324,7 +322,7 @@ .bubble:after, #app-navigation .app-navigation-entry-menu:after { border-color: rgba(238, 238, 238, 0); - border-bottom-color: #eee; + border-bottom-color: #fff; border-width: 10px; margin-left: -10px; } @@ -473,13 +471,10 @@ #app-settings.opened #app-settings-content { display: block; } -#app-settings-header { - background-color: #eee; -} #app-settings-content { display: none; padding: 10px; - background-color: #eee; + background-color: #fff; } #app-settings.open #app-settings-content { display: block; @@ -499,7 +494,7 @@ width: 100%; padding: 0; margin: 0; - background-color: transparent; + background-color: #fff; background-image: url('../img/actions/settings.svg'); background-position: 14px center; background-repeat: no-repeat; @@ -512,11 +507,11 @@ } .settings-button:hover, .settings-button:focus { - background-color: #ddd; + background-color: #fff; } .settings-button.opened:hover, .settings-button.opened:focus { - background-color: transparent; + background-color: #fff; } /* buttons */ diff --git a/core/css/styles.css b/core/css/styles.css index 8b89837bcec..cad407b52ea 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -186,7 +186,7 @@ input img, button img, .button img { background-color: transparent; } ::-webkit-scrollbar-thumb { - background: #ccc; + background: #ddd; } -- GitLab From c41089bcada846ac2c4f526ae4e96bea9d22f744 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Wed, 26 Aug 2015 17:28:40 +0200 Subject: [PATCH 048/783] reduce grey tones to one for list highlight --- apps/files/css/files.css | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/apps/files/css/files.css b/apps/files/css/files.css index a1b9312b152..4a56490fe0f 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -96,7 +96,10 @@ min-width: 688px; /* 768 (mobile break) - 80 (nav width) */ } -#filestable tbody tr { background-color:#fff; height:51px; } +#filestable tbody tr { + background-color: #fff; + height: 51px; +} /* fit app list view heights */ .app-files #app-content>.viewcontainer { @@ -140,20 +143,20 @@ margin-bottom: 44px; } -#filestable tbody tr { background-color:#fff; height:40px; } +#filestable tbody tr { + background-color: #fff; + height: 40px; +} #filestable tbody tr:hover, #filestable tbody tr:focus, #filestable tbody .name:focus, -#filestable tbody tr:active { - background-color: rgb(240,240,240); -} +#filestable tbody tr:active, #filestable tbody tr.highlighted, #filestable tbody tr.highlighted .name:focus, -#filestable tbody tr.selected { - background-color: rgb(230,230,230); -} -#filestable tbody tr.searchresult { - background-color: rgb(240,240,240); +#filestable tbody tr.selected, +#filestable tbody tr.searchresult, +table tr.mouseOver td { + background-color: #f8f8f8; } tbody a { color:#000; } @@ -178,9 +181,6 @@ tr:focus span.extension { color: #777; } -table tr.mouseOver td { - background-color: #eee; -} table th, table th a { color: #999; } @@ -275,7 +275,7 @@ table thead th { background-color: #fff; } table.multiselect thead th { - background-color: rgba(220,220,220,.8); + background-color: rgba(248,248,248,.8); /* #f8f8f8 like other hover style */ color: #000; font-weight: bold; border-bottom: 0; @@ -706,7 +706,7 @@ table.dragshadow td.size { left: 0; right: 0; bottom: 0; - background-color: white; + background-color: #fff; background-repeat: no-repeat no-repeat; background-position: 50%; opacity: 0.7; -- GitLab From 46978b616cf18d86c3b5790560d233ebde1fc8e7 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Thu, 27 Aug 2015 01:55:20 -0400 Subject: [PATCH 049/783] [tx-robot] updated from transifex --- apps/files_external/l10n/el.js | 22 ++++++++++++++++++++++ apps/files_external/l10n/el.json | 22 ++++++++++++++++++++++ apps/files_external/l10n/fi_FI.js | 2 ++ apps/files_external/l10n/fi_FI.json | 2 ++ apps/files_external/l10n/fr.js | 15 +++++++++++++++ apps/files_external/l10n/fr.json | 15 +++++++++++++++ apps/files_external/l10n/pt_BR.js | 1 + apps/files_external/l10n/pt_BR.json | 1 + core/l10n/de.js | 2 +- core/l10n/de.json | 2 +- lib/l10n/el.js | 1 + lib/l10n/el.json | 1 + lib/l10n/fr.js | 1 + lib/l10n/fr.json | 1 + lib/l10n/tr.js | 1 + lib/l10n/tr.json | 1 + settings/l10n/de.js | 6 +++--- settings/l10n/de.json | 6 +++--- settings/l10n/el.js | 7 +++++++ settings/l10n/el.json | 7 +++++++ settings/l10n/fr.js | 7 +++++++ settings/l10n/fr.json | 7 +++++++ 22 files changed, 122 insertions(+), 8 deletions(-) diff --git a/apps/files_external/l10n/el.js b/apps/files_external/l10n/el.js index 156b713acba..13fb910e79d 100644 --- a/apps/files_external/l10n/el.js +++ b/apps/files_external/l10n/el.js @@ -1,6 +1,9 @@ OC.L10N.register( "files_external", { + "Fetching request tokens failed. Verify that your app key and secret are correct." : "Η λήψη των τεκμηρίων αιτήματος απέτυχε. Βεβαιώστε ότι το κλειδί εφαρμογής και το μυστικό είναι ορθά.", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "Η λήψη των τεκμηρίων πρόσβασης απέτυχε. Βεβαιώστε ότι το κλειδί εφαρμογής και το μυστικό είναι ορθά.", + "Please provide a valid app key and secret." : "Παρακαλούμε δώστε έγκυρο κλειδί εφαρμογής και μυστικό.", "Step 1 failed. Exception: %s" : "Το βήμα 1 απέτυχε. Εξαίρεση: %s", "Step 2 failed. Exception: %s" : "Το βήμα 2 απέτυχε. Εξαίρεση: %s", "External storage" : "Εξωτερική αποθήκευση", @@ -22,12 +25,19 @@ OC.L10N.register( "SFTP with secret key login" : "SFTP με σύνδεση με κρυφό κλειδί", "Public key" : "Δημόσιο κλειδί", "Storage with id \"%i\" not found" : "Αποθήκευση με id \"%i\" δεν βρέθηκε", + "Invalid backend or authentication mechanism class" : "Μη έγκυρη κλάση συστήματος ή μηχανισμού πιστοποίησης", "Invalid mount point" : "Μη έγκυρο σημείο ανάρτησης", + "Objectstore forbidden" : "Απαγορευμένο objectstore", "Invalid storage backend \"%s\"" : "Μή έγκυρο σύστημα υποστήριξης αποθήκευσης \"%s\"", + "Unsatisfied backend parameters" : "Ελλιπείς παράμετροι συστήματος", + "Unsatisfied authentication mechanism parameters" : "Ελλιπείς παράμετροι μηχανισμού πιστοποίησης", + "Admin-only storage backend \"%s\"" : "Σύστημα αποθήκευσης μόνο για διαχειριστή \"%s\"", "Personal" : "Προσωπικά", "System" : "Σύστημα", "Grant access" : "Παροχή πρόσβασης", "Access granted" : "Πρόσβαση παρασχέθηκε", + "Error configuring OAuth1" : "Σφάλμα ρύθμισης του OAuth1", + "Error configuring OAuth2" : "Σφάλμα ρύθμισης του OAuth2", "Enable encryption" : "Ενεργοποίηση κρυπτογράφησης", "Enable previews" : "Ενεργοποίηση προεπισκοπήσεων", "Check for changes" : "Έλεγχος για αλλαγές", @@ -39,12 +49,19 @@ OC.L10N.register( "Saved" : "Αποθηκεύτηκαν", "Generate keys" : "Δημιουργία κλειδιών", "Error generating key pair" : "Σφάλμα κατά τη δημιουργία ζεύγους κλειδιών", + "Access key" : "Κλειδί πρόσβασης", + "Secret key" : "Μυστικό κλειδί", + "Builtin" : "Builtin", "None" : "Τίποτα", + "OAuth1" : "OAuth1", "App key" : "Κλειδί εφαρμογής", "App secret" : "Μυστικό εφαρμογής", + "OAuth2" : "OAuth2", "Client ID" : "ID πελάτη", "Client secret" : "Μυστικό πελάτη", + "Username and password" : "Όνομα χρήστη και κωδικός πρόσβασης", "Password" : "Κωδικός πρόσβασης", + "Session credentials" : "Διαπιστευτήρια συνεδρίας", "Amazon S3" : "Amazon S3", "Hostname" : "Όνομα Υπολογιστή", "Port" : "Θύρα", @@ -55,11 +72,15 @@ OC.L10N.register( "URL" : "URL", "Secure https://" : "Ασφαλής σύνδεση https://", "Dropbox" : "Dropbox", + "FTP" : "FTP", "Secure ftps://" : "Ασφαλής ftps://", + "Google Drive" : "Google Drive", "Local" : "Τοπικός", "Location" : "Τοποθεσία", "ownCloud" : "ownCloud", + "SFTP" : "SFTP", "Root" : "Root", + "SMB / CIFS" : "SMB / CIFS", "Note: " : "Σημείωση: ", "Note: The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Σημείωση: Η υποστήριξη cURL στην PHP δεν είναι ενεργοποιημένη ή εγκατεστημένη. Η προσάρτηση του %s δεν είναι δυνατή. Παρακαλώ ζητήστε από τον διαχειριστή συστημάτων σας να την εγκαταστήσει.", "Note: The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Σημείωση: Η υποστήριξη FTP στην PHP δεν είναι ενεργοποιημένη ή εγκατεστημένη. Δεν είναι δυνατή η προσάρτηση του %s. Παρακαλώ ζητήστε από τον διαχειριστή συστημάτων σας να την εγκαταστήσει.", @@ -71,6 +92,7 @@ OC.L10N.register( "Scope" : "Εύρος", "External Storage" : "Εξωτερικό Αποθηκευτικό Μέσο", "Folder name" : "Όνομα φακέλου", + "Authentication" : "Πιστοποίηση", "Configuration" : "Ρυθμίσεις", "Available for" : "Διαθέσιμο για", "Advanced settings" : "Ρυθμίσεις για προχωρημένους", diff --git a/apps/files_external/l10n/el.json b/apps/files_external/l10n/el.json index 5412c9a44ab..c2211b18842 100644 --- a/apps/files_external/l10n/el.json +++ b/apps/files_external/l10n/el.json @@ -1,4 +1,7 @@ { "translations": { + "Fetching request tokens failed. Verify that your app key and secret are correct." : "Η λήψη των τεκμηρίων αιτήματος απέτυχε. Βεβαιώστε ότι το κλειδί εφαρμογής και το μυστικό είναι ορθά.", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "Η λήψη των τεκμηρίων πρόσβασης απέτυχε. Βεβαιώστε ότι το κλειδί εφαρμογής και το μυστικό είναι ορθά.", + "Please provide a valid app key and secret." : "Παρακαλούμε δώστε έγκυρο κλειδί εφαρμογής και μυστικό.", "Step 1 failed. Exception: %s" : "Το βήμα 1 απέτυχε. Εξαίρεση: %s", "Step 2 failed. Exception: %s" : "Το βήμα 2 απέτυχε. Εξαίρεση: %s", "External storage" : "Εξωτερική αποθήκευση", @@ -20,12 +23,19 @@ "SFTP with secret key login" : "SFTP με σύνδεση με κρυφό κλειδί", "Public key" : "Δημόσιο κλειδί", "Storage with id \"%i\" not found" : "Αποθήκευση με id \"%i\" δεν βρέθηκε", + "Invalid backend or authentication mechanism class" : "Μη έγκυρη κλάση συστήματος ή μηχανισμού πιστοποίησης", "Invalid mount point" : "Μη έγκυρο σημείο ανάρτησης", + "Objectstore forbidden" : "Απαγορευμένο objectstore", "Invalid storage backend \"%s\"" : "Μή έγκυρο σύστημα υποστήριξης αποθήκευσης \"%s\"", + "Unsatisfied backend parameters" : "Ελλιπείς παράμετροι συστήματος", + "Unsatisfied authentication mechanism parameters" : "Ελλιπείς παράμετροι μηχανισμού πιστοποίησης", + "Admin-only storage backend \"%s\"" : "Σύστημα αποθήκευσης μόνο για διαχειριστή \"%s\"", "Personal" : "Προσωπικά", "System" : "Σύστημα", "Grant access" : "Παροχή πρόσβασης", "Access granted" : "Πρόσβαση παρασχέθηκε", + "Error configuring OAuth1" : "Σφάλμα ρύθμισης του OAuth1", + "Error configuring OAuth2" : "Σφάλμα ρύθμισης του OAuth2", "Enable encryption" : "Ενεργοποίηση κρυπτογράφησης", "Enable previews" : "Ενεργοποίηση προεπισκοπήσεων", "Check for changes" : "Έλεγχος για αλλαγές", @@ -37,12 +47,19 @@ "Saved" : "Αποθηκεύτηκαν", "Generate keys" : "Δημιουργία κλειδιών", "Error generating key pair" : "Σφάλμα κατά τη δημιουργία ζεύγους κλειδιών", + "Access key" : "Κλειδί πρόσβασης", + "Secret key" : "Μυστικό κλειδί", + "Builtin" : "Builtin", "None" : "Τίποτα", + "OAuth1" : "OAuth1", "App key" : "Κλειδί εφαρμογής", "App secret" : "Μυστικό εφαρμογής", + "OAuth2" : "OAuth2", "Client ID" : "ID πελάτη", "Client secret" : "Μυστικό πελάτη", + "Username and password" : "Όνομα χρήστη και κωδικός πρόσβασης", "Password" : "Κωδικός πρόσβασης", + "Session credentials" : "Διαπιστευτήρια συνεδρίας", "Amazon S3" : "Amazon S3", "Hostname" : "Όνομα Υπολογιστή", "Port" : "Θύρα", @@ -53,11 +70,15 @@ "URL" : "URL", "Secure https://" : "Ασφαλής σύνδεση https://", "Dropbox" : "Dropbox", + "FTP" : "FTP", "Secure ftps://" : "Ασφαλής ftps://", + "Google Drive" : "Google Drive", "Local" : "Τοπικός", "Location" : "Τοποθεσία", "ownCloud" : "ownCloud", + "SFTP" : "SFTP", "Root" : "Root", + "SMB / CIFS" : "SMB / CIFS", "Note: " : "Σημείωση: ", "Note: The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Σημείωση: Η υποστήριξη cURL στην PHP δεν είναι ενεργοποιημένη ή εγκατεστημένη. Η προσάρτηση του %s δεν είναι δυνατή. Παρακαλώ ζητήστε από τον διαχειριστή συστημάτων σας να την εγκαταστήσει.", "Note: The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Σημείωση: Η υποστήριξη FTP στην PHP δεν είναι ενεργοποιημένη ή εγκατεστημένη. Δεν είναι δυνατή η προσάρτηση του %s. Παρακαλώ ζητήστε από τον διαχειριστή συστημάτων σας να την εγκαταστήσει.", @@ -69,6 +90,7 @@ "Scope" : "Εύρος", "External Storage" : "Εξωτερικό Αποθηκευτικό Μέσο", "Folder name" : "Όνομα φακέλου", + "Authentication" : "Πιστοποίηση", "Configuration" : "Ρυθμίσεις", "Available for" : "Διαθέσιμο για", "Advanced settings" : "Ρυθμίσεις για προχωρημένους", diff --git a/apps/files_external/l10n/fi_FI.js b/apps/files_external/l10n/fi_FI.js index 54fdd01751e..1e67d9ffc73 100644 --- a/apps/files_external/l10n/fi_FI.js +++ b/apps/files_external/l10n/fi_FI.js @@ -18,6 +18,7 @@ OC.L10N.register( "Share" : "Jaa", "Remote subfolder" : "Etäalikansio", "Public key" : "Julkinen avain", + "Storage with id \"%i\" not found" : "Tallennustilaa tunnisteella \"%i\" ei löytynyt", "Invalid mount point" : "Virheellinen liitoskohta", "Personal" : "Henkilökohtainen", "System" : "Järjestelmä", @@ -26,6 +27,7 @@ OC.L10N.register( "Error configuring OAuth1" : "Virhe OAuth1:n asetuksia tehdessä", "Error configuring OAuth2" : "Virhe OAuth2:n asetuksia tehdessä", "Enable encryption" : "Käytä salausta", + "Enable previews" : "Käytä esikatseluja", "Check for changes" : "Tarkista muutokset", "Never" : "Ei koskaan", "Once every direct access" : "Kerran aina suoran käytön yhteydessä", diff --git a/apps/files_external/l10n/fi_FI.json b/apps/files_external/l10n/fi_FI.json index 33db4d9d5dc..3870158899b 100644 --- a/apps/files_external/l10n/fi_FI.json +++ b/apps/files_external/l10n/fi_FI.json @@ -16,6 +16,7 @@ "Share" : "Jaa", "Remote subfolder" : "Etäalikansio", "Public key" : "Julkinen avain", + "Storage with id \"%i\" not found" : "Tallennustilaa tunnisteella \"%i\" ei löytynyt", "Invalid mount point" : "Virheellinen liitoskohta", "Personal" : "Henkilökohtainen", "System" : "Järjestelmä", @@ -24,6 +25,7 @@ "Error configuring OAuth1" : "Virhe OAuth1:n asetuksia tehdessä", "Error configuring OAuth2" : "Virhe OAuth2:n asetuksia tehdessä", "Enable encryption" : "Käytä salausta", + "Enable previews" : "Käytä esikatseluja", "Check for changes" : "Tarkista muutokset", "Never" : "Ei koskaan", "Once every direct access" : "Kerran aina suoran käytön yhteydessä", diff --git a/apps/files_external/l10n/fr.js b/apps/files_external/l10n/fr.js index e47f9d167bd..42944b2f2fb 100644 --- a/apps/files_external/l10n/fr.js +++ b/apps/files_external/l10n/fr.js @@ -1,6 +1,9 @@ OC.L10N.register( "files_external", { + "Fetching request tokens failed. Verify that your app key and secret are correct." : "L'obtention des jetons de requête a échoué. Vérifiez que votre clé d'application et votre mot de passe sont corrects.", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "L'obtention des jetons d'accès a échoué. Vérifiez que votre clé d'application et votre mot de passe sont corrects.", + "Please provide a valid app key and secret." : "Veuillez fournir une clé d'application et un mot de passe valides.", "Step 1 failed. Exception: %s" : "L’étape 1 a échoué. Erreur : %s", "Step 2 failed. Exception: %s" : "L’étape 2 a échoué. Erreur : %s", "External storage" : "Stockage externe", @@ -22,8 +25,11 @@ OC.L10N.register( "SFTP with secret key login" : "SFTP avec identification par clé", "Public key" : "Clef publique", "Storage with id \"%i\" not found" : "Stockage avec l'id \"%i\" non trouvé", + "Invalid backend or authentication mechanism class" : "Système de stockage ou méthode d'authentification non valable", "Invalid mount point" : "Point de montage non valide", "Invalid storage backend \"%s\"" : "Service de stockage non valide : \"%s\"", + "Unsatisfied authentication mechanism parameters" : "Paramètres manquants pour la méthode d'authentification", + "Admin-only storage backend \"%s\"" : "Service de stockage \"%s\" pour admins seulement", "Personal" : "Personnel", "System" : "Système", "Grant access" : "Autoriser l'accès", @@ -40,11 +46,15 @@ OC.L10N.register( "Generate keys" : "Générer des clés", "Error generating key pair" : "Erreur lors de la génération des clés", "None" : "Aucun", + "OAuth1" : "OAuth1", "App key" : "App key", "App secret" : "App secret", + "OAuth2" : "OAuth2", "Client ID" : "ID Client", "Client secret" : "Secret client", + "Username and password" : "Nom d'utilisateur et mot de passe", "Password" : "Mot de passe", + "Session credentials" : "Informations d'identification de session", "Amazon S3" : "Amazon S3", "Hostname" : "Nom de l'hôte", "Port" : "Port", @@ -55,11 +65,15 @@ OC.L10N.register( "URL" : "URL", "Secure https://" : "Sécurisation https://", "Dropbox" : "Dropbox", + "FTP" : "FTP", "Secure ftps://" : "Sécurisation ftps://", + "Google Drive" : "Google Drive", "Local" : "Local", "Location" : "Emplacement", "ownCloud" : "ownCloud", + "SFTP" : "SFTP", "Root" : "Root", + "SMB / CIFS" : "SMB / CIFS", "Note: " : "Attention :", "Note: The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Attention : La prise en charge de cURL par PHP n'est pas activée ou installée. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.", "Note: The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Attention : La prise en charge du FTP par PHP n'est pas activée ou installée. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.", @@ -71,6 +85,7 @@ OC.L10N.register( "Scope" : "Portée", "External Storage" : "Stockage externe", "Folder name" : "Nom du dossier", + "Authentication" : "Authentification", "Configuration" : "Configuration", "Available for" : "Disponible pour", "Advanced settings" : "Paramètres avancés", diff --git a/apps/files_external/l10n/fr.json b/apps/files_external/l10n/fr.json index c0c927ebffb..ffc2de0ef53 100644 --- a/apps/files_external/l10n/fr.json +++ b/apps/files_external/l10n/fr.json @@ -1,4 +1,7 @@ { "translations": { + "Fetching request tokens failed. Verify that your app key and secret are correct." : "L'obtention des jetons de requête a échoué. Vérifiez que votre clé d'application et votre mot de passe sont corrects.", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "L'obtention des jetons d'accès a échoué. Vérifiez que votre clé d'application et votre mot de passe sont corrects.", + "Please provide a valid app key and secret." : "Veuillez fournir une clé d'application et un mot de passe valides.", "Step 1 failed. Exception: %s" : "L’étape 1 a échoué. Erreur : %s", "Step 2 failed. Exception: %s" : "L’étape 2 a échoué. Erreur : %s", "External storage" : "Stockage externe", @@ -20,8 +23,11 @@ "SFTP with secret key login" : "SFTP avec identification par clé", "Public key" : "Clef publique", "Storage with id \"%i\" not found" : "Stockage avec l'id \"%i\" non trouvé", + "Invalid backend or authentication mechanism class" : "Système de stockage ou méthode d'authentification non valable", "Invalid mount point" : "Point de montage non valide", "Invalid storage backend \"%s\"" : "Service de stockage non valide : \"%s\"", + "Unsatisfied authentication mechanism parameters" : "Paramètres manquants pour la méthode d'authentification", + "Admin-only storage backend \"%s\"" : "Service de stockage \"%s\" pour admins seulement", "Personal" : "Personnel", "System" : "Système", "Grant access" : "Autoriser l'accès", @@ -38,11 +44,15 @@ "Generate keys" : "Générer des clés", "Error generating key pair" : "Erreur lors de la génération des clés", "None" : "Aucun", + "OAuth1" : "OAuth1", "App key" : "App key", "App secret" : "App secret", + "OAuth2" : "OAuth2", "Client ID" : "ID Client", "Client secret" : "Secret client", + "Username and password" : "Nom d'utilisateur et mot de passe", "Password" : "Mot de passe", + "Session credentials" : "Informations d'identification de session", "Amazon S3" : "Amazon S3", "Hostname" : "Nom de l'hôte", "Port" : "Port", @@ -53,11 +63,15 @@ "URL" : "URL", "Secure https://" : "Sécurisation https://", "Dropbox" : "Dropbox", + "FTP" : "FTP", "Secure ftps://" : "Sécurisation ftps://", + "Google Drive" : "Google Drive", "Local" : "Local", "Location" : "Emplacement", "ownCloud" : "ownCloud", + "SFTP" : "SFTP", "Root" : "Root", + "SMB / CIFS" : "SMB / CIFS", "Note: " : "Attention :", "Note: The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Attention : La prise en charge de cURL par PHP n'est pas activée ou installée. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.", "Note: The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Attention : La prise en charge du FTP par PHP n'est pas activée ou installée. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.", @@ -69,6 +83,7 @@ "Scope" : "Portée", "External Storage" : "Stockage externe", "Folder name" : "Nom du dossier", + "Authentication" : "Authentification", "Configuration" : "Configuration", "Available for" : "Disponible pour", "Advanced settings" : "Paramètres avancés", diff --git a/apps/files_external/l10n/pt_BR.js b/apps/files_external/l10n/pt_BR.js index 58c15fa0b02..8140d8be980 100644 --- a/apps/files_external/l10n/pt_BR.js +++ b/apps/files_external/l10n/pt_BR.js @@ -1,6 +1,7 @@ OC.L10N.register( "files_external", { + "Please provide a valid app key and secret." : "Por favor forneça uma chave e segurança válidos.", "Step 1 failed. Exception: %s" : "Passo 1 falhou. Exceção: %s", "Step 2 failed. Exception: %s" : "Passo 2 falhou. Exceção: %s", "External storage" : "Armazenamento Externo", diff --git a/apps/files_external/l10n/pt_BR.json b/apps/files_external/l10n/pt_BR.json index 089da37f0d2..13ce808ba84 100644 --- a/apps/files_external/l10n/pt_BR.json +++ b/apps/files_external/l10n/pt_BR.json @@ -1,4 +1,5 @@ { "translations": { + "Please provide a valid app key and secret." : "Por favor forneça uma chave e segurança válidos.", "Step 1 failed. Exception: %s" : "Passo 1 falhou. Exceção: %s", "Step 2 failed. Exception: %s" : "Passo 2 falhou. Exceção: %s", "External storage" : "Armazenamento Externo", diff --git a/core/l10n/de.js b/core/l10n/de.js index f8d4f47ee33..1361a970a42 100644 --- a/core/l10n/de.js +++ b/core/l10n/de.js @@ -192,7 +192,7 @@ OC.L10N.register( "You can click here to return to %s." : "Du kannst zur Rückkehr zu %s hier klicken.", "Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" : "Hallo,\n\nhier nur kurz die Mitteilung, dass %s %s mit Dir geteilt hat.\nZum Anzeigen: %s\n\n", "The share will expire on %s." : "Die Freigabe wird am %s ablaufen.", - "Cheers!" : "Hallo!", + "Cheers!" : "Noch einen schönen Tag!", "Internal Server Error" : "Interner Serverfehler", "The server encountered an internal error and was unable to complete your request." : "Der Server hat einen internen Fehler und konnte Ihre Anfrage nicht vervollständigen.", "Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." : "Bitte wende Dich an den Serveradministrator, sollte dieser Fehler mehrfach auftreten, und füge Deiner Anfrage die unten stehenden technischen Details bei.", diff --git a/core/l10n/de.json b/core/l10n/de.json index 60a5fb1e282..3eee17db65e 100644 --- a/core/l10n/de.json +++ b/core/l10n/de.json @@ -190,7 +190,7 @@ "You can click here to return to %s." : "Du kannst zur Rückkehr zu %s hier klicken.", "Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" : "Hallo,\n\nhier nur kurz die Mitteilung, dass %s %s mit Dir geteilt hat.\nZum Anzeigen: %s\n\n", "The share will expire on %s." : "Die Freigabe wird am %s ablaufen.", - "Cheers!" : "Hallo!", + "Cheers!" : "Noch einen schönen Tag!", "Internal Server Error" : "Interner Serverfehler", "The server encountered an internal error and was unable to complete your request." : "Der Server hat einen internen Fehler und konnte Ihre Anfrage nicht vervollständigen.", "Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report." : "Bitte wende Dich an den Serveradministrator, sollte dieser Fehler mehrfach auftreten, und füge Deiner Anfrage die unten stehenden technischen Details bei.", diff --git a/lib/l10n/el.js b/lib/l10n/el.js index 2e47db30473..b47cc7e36d2 100644 --- a/lib/l10n/el.js +++ b/lib/l10n/el.js @@ -46,6 +46,7 @@ OC.L10N.register( "Can't read file" : "Αδυναμία ανάγνωσης αρχείου", "App directory already exists" : "Ο κατάλογος εφαρμογών υπάρχει ήδη", "Can't create app folder. Please fix permissions. %s" : "Δεν είναι δυνατόν να δημιουργηθεί ο φάκελος εφαρμογής. Παρακαλώ διορθώστε τις άδειες πρόσβασης. %s", + "Archive does not contain a directory named %s" : "Το αρχείο δεν περιέχει κατάλογο με το όνομα %s", "No source specified when installing app" : "Δεν προσδιορίστηκε πηγή κατά την εγκατάσταση της εφαρμογής", "No href specified when installing app from http" : "Δεν προσδιορίστηκε href κατά την εγκατάσταση της εφαρμογής μέσω http ", "No path specified when installing app from local file" : "Δεν προσδιορίστηκε μονοπάτι κατά την εγκατάσταση εφαρμογής από τοπικό αρχείο", diff --git a/lib/l10n/el.json b/lib/l10n/el.json index 7b0b9b149ad..d82aec00129 100644 --- a/lib/l10n/el.json +++ b/lib/l10n/el.json @@ -44,6 +44,7 @@ "Can't read file" : "Αδυναμία ανάγνωσης αρχείου", "App directory already exists" : "Ο κατάλογος εφαρμογών υπάρχει ήδη", "Can't create app folder. Please fix permissions. %s" : "Δεν είναι δυνατόν να δημιουργηθεί ο φάκελος εφαρμογής. Παρακαλώ διορθώστε τις άδειες πρόσβασης. %s", + "Archive does not contain a directory named %s" : "Το αρχείο δεν περιέχει κατάλογο με το όνομα %s", "No source specified when installing app" : "Δεν προσδιορίστηκε πηγή κατά την εγκατάσταση της εφαρμογής", "No href specified when installing app from http" : "Δεν προσδιορίστηκε href κατά την εγκατάσταση της εφαρμογής μέσω http ", "No path specified when installing app from local file" : "Δεν προσδιορίστηκε μονοπάτι κατά την εγκατάσταση εφαρμογής από τοπικό αρχείο", diff --git a/lib/l10n/fr.js b/lib/l10n/fr.js index 8e7de3462a3..873abd44ad0 100644 --- a/lib/l10n/fr.js +++ b/lib/l10n/fr.js @@ -48,6 +48,7 @@ OC.L10N.register( "Can't read file" : "Impossible de lire le fichier", "App directory already exists" : "Le dossier de l'application existe déjà", "Can't create app folder. Please fix permissions. %s" : "Impossible de créer le dossier de l'application. Corrigez les droits d'accès. %s", + "Archive does not contain a directory named %s" : "Le fichier archive ne contient pas de répertoire %s", "No source specified when installing app" : "Aucune source spécifiée pour installer l'application", "No href specified when installing app from http" : "Aucun href spécifié pour installer l'application par http", "No path specified when installing app from local file" : "Aucun chemin spécifié pour installer l'application depuis un fichier local", diff --git a/lib/l10n/fr.json b/lib/l10n/fr.json index 25bcf5b17ee..440f2ddd84d 100644 --- a/lib/l10n/fr.json +++ b/lib/l10n/fr.json @@ -46,6 +46,7 @@ "Can't read file" : "Impossible de lire le fichier", "App directory already exists" : "Le dossier de l'application existe déjà", "Can't create app folder. Please fix permissions. %s" : "Impossible de créer le dossier de l'application. Corrigez les droits d'accès. %s", + "Archive does not contain a directory named %s" : "Le fichier archive ne contient pas de répertoire %s", "No source specified when installing app" : "Aucune source spécifiée pour installer l'application", "No href specified when installing app from http" : "Aucun href spécifié pour installer l'application par http", "No path specified when installing app from local file" : "Aucun chemin spécifié pour installer l'application depuis un fichier local", diff --git a/lib/l10n/tr.js b/lib/l10n/tr.js index d26505b4a1e..828b5a85569 100644 --- a/lib/l10n/tr.js +++ b/lib/l10n/tr.js @@ -49,6 +49,7 @@ OC.L10N.register( "Can't read file" : "Dosya okunamıyor", "App directory already exists" : "Uygulama dizini zaten mevcut", "Can't create app folder. Please fix permissions. %s" : "Uygulama dizini oluşturulamıyor. Lütfen izinleri düzeltin. %s", + "Archive does not contain a directory named %s" : "Arşivde %s adında bir dizin bulunmuyor", "No source specified when installing app" : "Uygulama kurulurken bir kaynak belirtilmedi", "No href specified when installing app from http" : "Uygulama http'den kurulurken href belirtilmedi", "No path specified when installing app from local file" : "Uygulama yerel dosyadan kurulurken dosya yolu belirtilmedi", diff --git a/lib/l10n/tr.json b/lib/l10n/tr.json index 4170115682d..13b63ee6f7d 100644 --- a/lib/l10n/tr.json +++ b/lib/l10n/tr.json @@ -47,6 +47,7 @@ "Can't read file" : "Dosya okunamıyor", "App directory already exists" : "Uygulama dizini zaten mevcut", "Can't create app folder. Please fix permissions. %s" : "Uygulama dizini oluşturulamıyor. Lütfen izinleri düzeltin. %s", + "Archive does not contain a directory named %s" : "Arşivde %s adında bir dizin bulunmuyor", "No source specified when installing app" : "Uygulama kurulurken bir kaynak belirtilmedi", "No href specified when installing app from http" : "Uygulama http'den kurulurken href belirtilmedi", "No path specified when installing app from local file" : "Uygulama yerel dosyadan kurulurken dosya yolu belirtilmedi", diff --git a/settings/l10n/de.js b/settings/l10n/de.js index c294a499258..b74a5364d1a 100644 --- a/settings/l10n/de.js +++ b/settings/l10n/de.js @@ -180,8 +180,8 @@ OC.L10N.register( "More" : "Mehr", "Less" : "Weniger", "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Die Logdatei ist größer als 100 MB. Es kann etwas Zeit beanspruchen, sie herunterzuladen!", - "Transactional File Locking is enabled." : "Dateisperren bei Transaktionen sind aktiviert.", - "Transactional File Locking is disabled." : "Dateisperren bei Transaktionen sind deaktiviert.", + "Transactional File Locking is enabled." : "Transaktionale Dateisperre ist aktiviert.", + "Transactional File Locking is disabled." : "Transaktionale Dateisperre ist deaktiviert.", "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite wird als Datenbank verwendet. Bei größeren Installationen wird empfohlen, auf ein anderes Datenbank-Backend zu wechseln.", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Insbesondere bei der Nutzung des Desktop Clients zur Dateisynchronisierung wird vom Einsatz von SQLite abgeraten.", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Um zu einer anderen Datenbank zu migrieren, benutze bitte die Kommandozeile: 'occ db:convert-type', oder in die Dokumentation ↗ schauen.", @@ -208,7 +208,7 @@ OC.L10N.register( "Enable experimental apps" : "Experimentelle Apps aktivieren", "No apps found for your version" : "Es wurden keine Apps für Deine Version gefunden", "Hey there,

just letting you know that you now have an %s account.

Your username: %s
Access it: %s

" : "Hallo,

hier nur kurz die Mitteilung, dass Du jetzt ein %s-Konto hast.

Dein Benutzername: %s
Greife darauf zu: %s

", - "Cheers!" : "Hallo!", + "Cheers!" : "Noch einen schönen Tag!", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hallo,\n\nhier nur kurz die Mitteilung, dass Du jetzt ein %s-Konto hast.\n\nDein Benutzername: %s\nGreife darauf zu: %s\n\n", "Administrator documentation" : "Dokumentation für Administratoren", "Online documentation" : "Online-Dokumentation", diff --git a/settings/l10n/de.json b/settings/l10n/de.json index 9c67fb65ee8..d0e658c3c0f 100644 --- a/settings/l10n/de.json +++ b/settings/l10n/de.json @@ -178,8 +178,8 @@ "More" : "Mehr", "Less" : "Weniger", "The logfile is bigger than 100 MB. Downloading it may take some time!" : "Die Logdatei ist größer als 100 MB. Es kann etwas Zeit beanspruchen, sie herunterzuladen!", - "Transactional File Locking is enabled." : "Dateisperren bei Transaktionen sind aktiviert.", - "Transactional File Locking is disabled." : "Dateisperren bei Transaktionen sind deaktiviert.", + "Transactional File Locking is enabled." : "Transaktionale Dateisperre ist aktiviert.", + "Transactional File Locking is disabled." : "Transaktionale Dateisperre ist deaktiviert.", "SQLite is used as database. For larger installations we recommend to switch to a different database backend." : "SQLite wird als Datenbank verwendet. Bei größeren Installationen wird empfohlen, auf ein anderes Datenbank-Backend zu wechseln.", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Insbesondere bei der Nutzung des Desktop Clients zur Dateisynchronisierung wird vom Einsatz von SQLite abgeraten.", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the documentation ↗." : "Um zu einer anderen Datenbank zu migrieren, benutze bitte die Kommandozeile: 'occ db:convert-type', oder in die Dokumentation ↗ schauen.", @@ -206,7 +206,7 @@ "Enable experimental apps" : "Experimentelle Apps aktivieren", "No apps found for your version" : "Es wurden keine Apps für Deine Version gefunden", "Hey there,

just letting you know that you now have an %s account.

Your username: %s
Access it: %s

" : "Hallo,

hier nur kurz die Mitteilung, dass Du jetzt ein %s-Konto hast.

Dein Benutzername: %s
Greife darauf zu: %s

", - "Cheers!" : "Hallo!", + "Cheers!" : "Noch einen schönen Tag!", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hallo,\n\nhier nur kurz die Mitteilung, dass Du jetzt ein %s-Konto hast.\n\nDein Benutzername: %s\nGreife darauf zu: %s\n\n", "Administrator documentation" : "Dokumentation für Administratoren", "Online documentation" : "Online-Dokumentation", diff --git a/settings/l10n/el.js b/settings/l10n/el.js index 3a647b0baac..859bfe296cf 100644 --- a/settings/l10n/el.js +++ b/settings/l10n/el.js @@ -132,6 +132,7 @@ OC.L10N.register( "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Αν η εγκατάστασή σας δεν έχει γίνει στο root του τομέα και χρησιμοποιείται το cron του συστήματος, μπορεί να υπάρξουν ζητήματα με τη δημιουργία URL. Για να αποφύγετε αυτά τα προβλήματα, παρακαλώ ρυθμίστε την επιλογή \"overwrite.cli.url\" στο αρχείο config.php που βρίσκεται στη διαδρομή webroot της εγκατάστασής σας (Suggested: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Δεν ήταν δυνατή η εκτέλεση της cronjob μέσω τερματικού. Εμφανίστηκαν τα παρακάτω τεχνικά σφάλματα:", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Παρακαλώ ελέγξτε ξανά τους οδηγούς εγκατάστασης, καθώς επίσης και για τυχόν σφάλματα ή προειδοποιήσεις στο log.", + "All checks passed." : "Όλοι οι έλεγχοι επιτυχείς.", "Open documentation" : "Ανοιχτή τεκμηρίωση.", "Allow apps to use the Share API" : "Επιτρέπει την χρήση του API διαμοιρασμού σε εφαρμογές ", "Allow users to share via link" : "Να επιτρέπεται σε χρήστες ο διαμοιρασμός μέσω συνδέσμου", @@ -154,6 +155,12 @@ OC.L10N.register( "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "Το cron.php είναι καταχωρημένο σε μια υπηρεσία webcron ώστε να καλεί το cron.php κάθε 15 λεπτά μέσω http.", "Use system's cron service to call the cron.php file every 15 minutes." : "Χρησιμοποιήστε την cron υπηρεσία του συτήματος για να καλέσετε το cron.php αρχείο κάθε 15 λεπτά.", "Enable server-side encryption" : "Ενεργοποίηση κρυπτογράφησης από το διακομιστή", + "Please read carefully before activating server-side encryption: " : "Παρακαλούμε διαβάστε προσεκτικά πριν ενεργοποιήσετε την κρυπτογράφηση στο διακομιστή:", + "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "Η κρυπτογράφηση είναι μια μη αντιστρεπτή διαδικασία. Μόλις ενεργοποιηθεί, όλα τα αρχεία από αυτό το σημείο και μετά θα κρυπτογραφηθούν στο διακομιστή και η κρυπτογράφηση δεν είναι δυνατόν να απενεργοποιηθεί αργότερα", + "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "Οποιοσδήποτε έχει αυξημένα δικαιώματα πρόσβασης στο διακομιστή του ownCloud σας μπορεί να αποκρυπτογραφήσει τα αρχεία σας είτε παγιδεύοντας τα αιτήματα ή διαβάζοντας τους κωδικούς χρηστών που είναι αποθηκευμένοι σε απλά αρχεία κειμένου. Η κρυπτογράφηση στο διακομιστή δεν προστατεύει επομένως από κακόβουλους διαχειριστές αλλά είναι χρήσιμη στο να προστατεύει τα δεδομένα σας σε εξωτερικούς διακομιστές αποθήκευσης.", + "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "Ανάλογα με το άρθρωμα που χρησιμοποιείται το μέγεθος αρχείων γενικά αυξάνεται (κατά 35%% ή και περισσότερο αν χρησιμοποιηθεί το προεπιλεγμένο άρθρωμα)", + "You should regularly backup all encryption keys to prevent permanent data loss (data//files_encryption and data/files_encryption)" : "Θα πρέπει να λαμβάνετε τακτικά αντίγραφα ασφαλείας όλων των κλειδιών κρυπτογράφησης για να αποφύγετε μόνιμη απώλεια δεδομένων (data//files_encryption και data/files_encryption)", + "This is the final warning: Do you really want to enable encryption?" : "Αυτή είναι η τελευταία προειδοποίηση: Θέλετε πραγματικά να ενεργοποιήσετε την κρυπτογράφηση;", "Enable encryption" : "Ενεργοποίηση κρυπτογράφησης", "No encryption module loaded, please enable an encryption module in the app menu." : "Δεν έχει φορτωθεί μονάδα κρυπτογράφησης, παρακαλούμε φορτώστε μια μονάδα κρυπτογράφησης από το μενού εφαρμογών.", "Select default encryption module:" : "Επιλογή προεπιλεγμένης μονάδας κρυπτογράφησης:", diff --git a/settings/l10n/el.json b/settings/l10n/el.json index 9081d9791e9..a0b1f0c7f13 100644 --- a/settings/l10n/el.json +++ b/settings/l10n/el.json @@ -130,6 +130,7 @@ "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Αν η εγκατάστασή σας δεν έχει γίνει στο root του τομέα και χρησιμοποιείται το cron του συστήματος, μπορεί να υπάρξουν ζητήματα με τη δημιουργία URL. Για να αποφύγετε αυτά τα προβλήματα, παρακαλώ ρυθμίστε την επιλογή \"overwrite.cli.url\" στο αρχείο config.php που βρίσκεται στη διαδρομή webroot της εγκατάστασής σας (Suggested: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Δεν ήταν δυνατή η εκτέλεση της cronjob μέσω τερματικού. Εμφανίστηκαν τα παρακάτω τεχνικά σφάλματα:", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Παρακαλώ ελέγξτε ξανά τους οδηγούς εγκατάστασης, καθώς επίσης και για τυχόν σφάλματα ή προειδοποιήσεις στο log.", + "All checks passed." : "Όλοι οι έλεγχοι επιτυχείς.", "Open documentation" : "Ανοιχτή τεκμηρίωση.", "Allow apps to use the Share API" : "Επιτρέπει την χρήση του API διαμοιρασμού σε εφαρμογές ", "Allow users to share via link" : "Να επιτρέπεται σε χρήστες ο διαμοιρασμός μέσω συνδέσμου", @@ -152,6 +153,12 @@ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "Το cron.php είναι καταχωρημένο σε μια υπηρεσία webcron ώστε να καλεί το cron.php κάθε 15 λεπτά μέσω http.", "Use system's cron service to call the cron.php file every 15 minutes." : "Χρησιμοποιήστε την cron υπηρεσία του συτήματος για να καλέσετε το cron.php αρχείο κάθε 15 λεπτά.", "Enable server-side encryption" : "Ενεργοποίηση κρυπτογράφησης από το διακομιστή", + "Please read carefully before activating server-side encryption: " : "Παρακαλούμε διαβάστε προσεκτικά πριν ενεργοποιήσετε την κρυπτογράφηση στο διακομιστή:", + "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "Η κρυπτογράφηση είναι μια μη αντιστρεπτή διαδικασία. Μόλις ενεργοποιηθεί, όλα τα αρχεία από αυτό το σημείο και μετά θα κρυπτογραφηθούν στο διακομιστή και η κρυπτογράφηση δεν είναι δυνατόν να απενεργοποιηθεί αργότερα", + "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "Οποιοσδήποτε έχει αυξημένα δικαιώματα πρόσβασης στο διακομιστή του ownCloud σας μπορεί να αποκρυπτογραφήσει τα αρχεία σας είτε παγιδεύοντας τα αιτήματα ή διαβάζοντας τους κωδικούς χρηστών που είναι αποθηκευμένοι σε απλά αρχεία κειμένου. Η κρυπτογράφηση στο διακομιστή δεν προστατεύει επομένως από κακόβουλους διαχειριστές αλλά είναι χρήσιμη στο να προστατεύει τα δεδομένα σας σε εξωτερικούς διακομιστές αποθήκευσης.", + "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "Ανάλογα με το άρθρωμα που χρησιμοποιείται το μέγεθος αρχείων γενικά αυξάνεται (κατά 35%% ή και περισσότερο αν χρησιμοποιηθεί το προεπιλεγμένο άρθρωμα)", + "You should regularly backup all encryption keys to prevent permanent data loss (data//files_encryption and data/files_encryption)" : "Θα πρέπει να λαμβάνετε τακτικά αντίγραφα ασφαλείας όλων των κλειδιών κρυπτογράφησης για να αποφύγετε μόνιμη απώλεια δεδομένων (data//files_encryption και data/files_encryption)", + "This is the final warning: Do you really want to enable encryption?" : "Αυτή είναι η τελευταία προειδοποίηση: Θέλετε πραγματικά να ενεργοποιήσετε την κρυπτογράφηση;", "Enable encryption" : "Ενεργοποίηση κρυπτογράφησης", "No encryption module loaded, please enable an encryption module in the app menu." : "Δεν έχει φορτωθεί μονάδα κρυπτογράφησης, παρακαλούμε φορτώστε μια μονάδα κρυπτογράφησης από το μενού εφαρμογών.", "Select default encryption module:" : "Επιλογή προεπιλεγμένης μονάδας κρυπτογράφησης:", diff --git a/settings/l10n/fr.js b/settings/l10n/fr.js index 41db5f7f44b..d07fe9ebf26 100644 --- a/settings/l10n/fr.js +++ b/settings/l10n/fr.js @@ -132,6 +132,7 @@ OC.L10N.register( "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Si votre installation n'a pas été effectuée à la racine du domaine et qu'elle utilise le cron du système, il peut y avoir des problèmes avec la génération d'URL. Pour les éviter, veuillez configurer l'option \"overwrite.cli.url\" de votre fichier config.php avec le chemin de la racine de votre installation (suggéré : \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "La tâche cron n'a pu s'exécuter via CLI. Ces erreurs techniques sont apparues :", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Consultez les guides d'installation ↗, et cherchez des erreurs ou avertissements dans les logs.", + "All checks passed." : "Tous les tests ont réussi.", "Open documentation" : "Voir la documentation", "Allow apps to use the Share API" : "Autoriser les applications à utiliser l'API de partage", "Allow users to share via link" : "Autoriser les utilisateurs à partager par lien", @@ -154,6 +155,12 @@ OC.L10N.register( "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "Utilisez un service webcron pour exécuter cron.php toutes les 15 minutes par HTTP", "Use system's cron service to call the cron.php file every 15 minutes." : "Utilisez le service cron du système pour appeler le fichier cron.php toutes les 15 minutes.", "Enable server-side encryption" : "Activer le chiffrement côté serveur", + "Please read carefully before activating server-side encryption: " : "Veuillez lire ceci avec attention avant d'activer le chiffrement :", + "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "Le chiffrement côté serveur est un processus à sens unique. Une fois le chiffrement activé, tous les fichiers seront dorénavant chiffrés sur le serveur, et il ne sera plus possible de désactiver le chiffrement.", + "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "Toute personne ayant un accès d'administrateur sur votre serveur ownCloud peut déchiffrer vos fichiers en interceptant les requêtes, ou en lisant les mots de passe des utilisateurs qui sont stockés dans les fichiers de sessions. Le chiffrement côté serveur n'empêche donc pas vos fichiers d'être lus par des administrateurs mal intentionnés, mais sert à protéger vos données stockées sur des espaces de stockages externes ou tiers.", + "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "Selon le module de chiffrement utilisé, la taille des fichiers peut augmenter (dans le cas du module par défaut, l'augmentation est de 35%% ou plus)", + "You should regularly backup all encryption keys to prevent permanent data loss (data//files_encryption and data/files_encryption)" : "Vous devriez sauvegarder régulièrement les clés de chiffrement pour éviter toute perte de données irrémédiable (data//files_encryption et data/files_encryption)", + "This is the final warning: Do you really want to enable encryption?" : "Dernier avertissement : Voulez-vous vraiment activer le chiffrement ?", "Enable encryption" : "Activer le chiffrement", "No encryption module loaded, please enable an encryption module in the app menu." : "Aucun module de chiffrement n'est chargé. Merci d'activer un module de chiffrement dans le menu des applications.", "Select default encryption module:" : "Sélectionnez le module de chiffrement par défaut :", diff --git a/settings/l10n/fr.json b/settings/l10n/fr.json index b462d52b8c4..0688759770c 100644 --- a/settings/l10n/fr.json +++ b/settings/l10n/fr.json @@ -130,6 +130,7 @@ "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Si votre installation n'a pas été effectuée à la racine du domaine et qu'elle utilise le cron du système, il peut y avoir des problèmes avec la génération d'URL. Pour les éviter, veuillez configurer l'option \"overwrite.cli.url\" de votre fichier config.php avec le chemin de la racine de votre installation (suggéré : \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "La tâche cron n'a pu s'exécuter via CLI. Ces erreurs techniques sont apparues :", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Consultez les guides d'installation ↗, et cherchez des erreurs ou avertissements dans les logs.", + "All checks passed." : "Tous les tests ont réussi.", "Open documentation" : "Voir la documentation", "Allow apps to use the Share API" : "Autoriser les applications à utiliser l'API de partage", "Allow users to share via link" : "Autoriser les utilisateurs à partager par lien", @@ -152,6 +153,12 @@ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "Utilisez un service webcron pour exécuter cron.php toutes les 15 minutes par HTTP", "Use system's cron service to call the cron.php file every 15 minutes." : "Utilisez le service cron du système pour appeler le fichier cron.php toutes les 15 minutes.", "Enable server-side encryption" : "Activer le chiffrement côté serveur", + "Please read carefully before activating server-side encryption: " : "Veuillez lire ceci avec attention avant d'activer le chiffrement :", + "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "Le chiffrement côté serveur est un processus à sens unique. Une fois le chiffrement activé, tous les fichiers seront dorénavant chiffrés sur le serveur, et il ne sera plus possible de désactiver le chiffrement.", + "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "Toute personne ayant un accès d'administrateur sur votre serveur ownCloud peut déchiffrer vos fichiers en interceptant les requêtes, ou en lisant les mots de passe des utilisateurs qui sont stockés dans les fichiers de sessions. Le chiffrement côté serveur n'empêche donc pas vos fichiers d'être lus par des administrateurs mal intentionnés, mais sert à protéger vos données stockées sur des espaces de stockages externes ou tiers.", + "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "Selon le module de chiffrement utilisé, la taille des fichiers peut augmenter (dans le cas du module par défaut, l'augmentation est de 35%% ou plus)", + "You should regularly backup all encryption keys to prevent permanent data loss (data//files_encryption and data/files_encryption)" : "Vous devriez sauvegarder régulièrement les clés de chiffrement pour éviter toute perte de données irrémédiable (data//files_encryption et data/files_encryption)", + "This is the final warning: Do you really want to enable encryption?" : "Dernier avertissement : Voulez-vous vraiment activer le chiffrement ?", "Enable encryption" : "Activer le chiffrement", "No encryption module loaded, please enable an encryption module in the app menu." : "Aucun module de chiffrement n'est chargé. Merci d'activer un module de chiffrement dans le menu des applications.", "Select default encryption module:" : "Sélectionnez le module de chiffrement par défaut :", -- GitLab From 60426e2ef81e27446196a74fc5ac1c36d457a553 Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Thu, 27 Aug 2015 09:59:27 +0200 Subject: [PATCH 050/783] add comment for translators --- settings/personal.php | 1 + 1 file changed, 1 insertion(+) diff --git a/settings/personal.php b/settings/personal.php index bbbba3b5b8d..32944de7200 100644 --- a/settings/personal.php +++ b/settings/personal.php @@ -71,6 +71,7 @@ $languages=array(); $commonlanguages = array(); foreach($languageCodes as $lang) { $l = \OC::$server->getL10N('settings', $lang); + // TRANSLATORS this is the language name for the language switcher in the personal settings and should be the localized version if(substr($l->t('__language_name__'), 0, 1) !== '_') {//first check if the language name is in the translation file $ln=array('code'=>$lang, 'name'=> (string)$l->t('__language_name__')); }elseif(isset($languageNames[$lang])) { -- GitLab From dacf0fc7fc37781b69a74c8f9b021f5dac31d2a3 Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Thu, 27 Aug 2015 10:00:01 +0200 Subject: [PATCH 051/783] remove language code fallbacks for properly translated language names --- settings/languageCodes.php | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/settings/languageCodes.php b/settings/languageCodes.php index e5fe9ff29ad..729cc3c6af3 100644 --- a/settings/languageCodes.php +++ b/settings/languageCodes.php @@ -25,48 +25,22 @@ */ return array( -'bg_BG'=>'български език', -'ca'=>'Català', -'cs_CZ'=>'Čeština', -'da'=>'Dansk', -'de'=>'Deutsch (Persönlich)', -'de_DE'=>'Deutsch (Förmlich)', 'el'=>'Ελληνικά', -'en'=>'English', -'es'=>'Español', -'et_EE'=>'Eesti', 'fa'=>'فارسى', 'fi_FI'=>'Suomi', -'fr'=>'Français', 'hi'=>'हिन्दी', 'id'=>'Bahasa Indonesia', -'it'=>'Italiano', 'lb'=>'Lëtzebuergesch', -//'l10n-de'=>'', 'ms_MY'=>'Bahasa Melayu', 'nb_NO'=>'Norwegian Bokmål', -'nl'=>'Nederlands', -'pl'=>'Polski', 'pt_BR'=>'Português brasileiro', 'pt_PT'=>'Português', 'ro'=>'română', -'ru'=>'Русский язык', -'sr'=>'Српски', 'sr@latin'=>'Srpski', 'sv'=>'Svenska', -'zh_CN'=>'简体中文', -'sk_SK'=>'Slovenčina', 'hu_HU'=>'Magyar', -'eu'=>'Euskara', -'lt_LT'=>'Lietuvių', -'eo'=>'Esperanto', -'tr'=>'Türkçe', 'hr'=>'Hrvatski', 'ar'=>'العربية', -'he'=>'עִבְרִית,', -'ia'=>'Interlingua', -'sl'=>'Slovenski', -'nn_NO'=>'Nynorsk', 'lv'=>'Latviešu', 'mk'=>'македонски', 'uk'=>'Українська', @@ -76,9 +50,7 @@ return array( 'bn_BD'=>'Bengali', 'ta_LK'=>'தமிழ்', 'zh_HK'=>'繁體中文(香港)', -'oc'=>'Occitan (post 1500)', 'is'=>'Icelandic', -'pl_PL'=>'Polski', 'ka_GE'=>'Georgian for Georgia', 'ku_IQ'=>'Kurdish Iraq', 'si_LK'=>'Sinhala', -- GitLab From c3c7689b6743e5d36a6d46730a53b058499ca97a Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Thu, 27 Aug 2015 13:14:50 +0200 Subject: [PATCH 052/783] Add a public interface for the language factory so apps can use it --- lib/private/l10n/factory.php | 24 +++++++++++++++--------- lib/private/server.php | 9 ++++++++- lib/public/l10n/ifactory.php | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 10 deletions(-) create mode 100644 lib/public/l10n/ifactory.php diff --git a/lib/private/l10n/factory.php b/lib/private/l10n/factory.php index 4424d014f47..a9ac4da42a2 100644 --- a/lib/private/l10n/factory.php +++ b/lib/private/l10n/factory.php @@ -25,29 +25,35 @@ namespace OC\L10N; +use OCP\L10N\IFactory; + /** - * TODO: Description + * A factory that generates language instances */ -class Factory { +class Factory implements IFactory { /** * cached instances */ protected $instances = array(); /** - * get an L10N instance + * Get a language instance * * @param string $app * @param string|null $lang - * @return \OC_L10N + * @return \OCP\IL10N */ public function get($app, $lang = null) { - if (!is_null($lang)) { - return new \OC_L10N($app, $lang); - } else if (!isset($this->instances[$app])) { - $this->instances[$app] = new \OC_L10N($app); + $key = $lang; + if ($key === null) { + $key = 'null'; + } + + if (!isset($this->instances[$key][$app])) { + $this->instances[$key][$app] = new \OC_L10N($app, $lang); } - return $this->instances[$app]; + + return $this->instances[$key][$app]; } } diff --git a/lib/private/server.php b/lib/private/server.php index 287b70eb806..a47fa2e43f9 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -673,6 +673,13 @@ class Server extends SimpleContainer implements IServerContainer { return $this->query('AppConfig'); } + /** + * @return \OCP\L10N\IFactory + */ + public function getL10NFactory() { + return $this->query('L10NFactory'); + } + /** * get an L10N instance * @@ -681,7 +688,7 @@ class Server extends SimpleContainer implements IServerContainer { * @return \OC_L10N */ public function getL10N($app, $lang = null) { - return $this->query('L10NFactory')->get($app, $lang); + return $this->getL10NFactory()->get($app, $lang); } /** diff --git a/lib/public/l10n/ifactory.php b/lib/public/l10n/ifactory.php new file mode 100644 index 00000000000..e2dc1c313cc --- /dev/null +++ b/lib/public/l10n/ifactory.php @@ -0,0 +1,32 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program 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, version 3, + * along with this program. If not, see + * + */ +namespace OCP\L10N; + +interface IFactory { + /** + * Get a language instance + * + * @param string $app + * @param string|null $lang + * @return \OCP\IL10N + */ + public function get($app, $lang = null); +} -- GitLab From 67f3dc232fc81c95f7320ff9e17e25b1fd20db44 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Thu, 27 Aug 2015 14:49:40 +0200 Subject: [PATCH 053/783] fix right sidebar causing filename overflow, fix #18383 --- apps/files/css/files.css | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/apps/files/css/files.css b/apps/files/css/files.css index 4a56490fe0f..fe57e4ef3c3 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -373,30 +373,53 @@ table td.filename .nametext .innernametext { max-width: 47%; } -@media only screen and (min-width: 1366px) { +@media only screen and (min-width: 1500px) { + table td.filename .nametext .innernametext { + max-width: 790px; + } + .with-app-sidebar table td.filename .nametext .innernametext { + max-width: 390px; + } +} +@media only screen and (min-width: 1366px) and (max-width: 1500px) { table td.filename .nametext .innernametext { max-width: 660px; } + .with-app-sidebar table td.filename .nametext .innernametext { + max-width: 290px; + } } @media only screen and (min-width: 1200px) and (max-width: 1366px) { table td.filename .nametext .innernametext { max-width: 500px; } + .with-app-sidebar table td.filename .nametext .innernametext { + max-width: 230px; + } } @media only screen and (min-width: 1100px) and (max-width: 1200px) { table td.filename .nametext .innernametext { max-width: 400px; } + .with-app-sidebar table td.filename .nametext .innernametext { + max-width: 230px; + } } @media only screen and (min-width: 1000px) and (max-width: 1100px) { table td.filename .nametext .innernametext { max-width: 310px; } + .with-app-sidebar table td.filename .nametext .innernametext { + max-width: 230px; + } } @media only screen and (min-width: 768px) and (max-width: 1000px) { table td.filename .nametext .innernametext { max-width: 240px; } + .with-app-sidebar table td.filename .nametext .innernametext { + max-width: 230px; + } } /* for smaller resolutions - see mobile.css */ -- GitLab From 1a8f921a3d7dc1fa05e225a681b0022cd0e121e5 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Mon, 24 Aug 2015 18:14:41 +0200 Subject: [PATCH 054/783] simpler style for filetype icons --- core/img/filetypes/application-epub+zip.png | Bin 1273 -> 0 bytes core/img/filetypes/application-epub+zip.svg | 74 ------------ core/img/filetypes/application-javascript.png | Bin 1243 -> 0 bytes core/img/filetypes/application-javascript.svg | 71 ------------ core/img/filetypes/application-pdf.png | Bin 1672 -> 354 bytes core/img/filetypes/application-pdf.svg | 49 +------- core/img/filetypes/application-rss+xml.png | Bin 1024 -> 0 bytes core/img/filetypes/application-rss+xml.svg | 38 ------ core/img/filetypes/application-x-cbr.png | Bin 1113 -> 0 bytes core/img/filetypes/application-x-cbr.svg | 78 ------------- .../application-x-shockwave-flash.png | Bin 880 -> 0 bytes .../application-x-shockwave-flash.svg | 56 --------- core/img/filetypes/application.png | Bin 945 -> 244 bytes core/img/filetypes/application.svg | 57 +-------- core/img/filetypes/audio.png | Bin 743 -> 362 bytes core/img/filetypes/audio.svg | 47 +------- core/img/filetypes/database.png | Bin 1117 -> 0 bytes core/img/filetypes/database.svg | 47 -------- core/img/filetypes/file.png | Bin 300 -> 155 bytes core/img/filetypes/file.svg | 32 +----- core/img/filetypes/folder-drag-accept.png | Bin 760 -> 137 bytes core/img/filetypes/folder-drag-accept.svg | 60 +--------- core/img/filetypes/folder-external.png | Bin 850 -> 274 bytes core/img/filetypes/folder-external.svg | 54 +-------- core/img/filetypes/folder-public.png | Bin 1207 -> 264 bytes core/img/filetypes/folder-public.svg | 57 +-------- core/img/filetypes/folder-shared.png | Bin 1134 -> 308 bytes core/img/filetypes/folder-shared.svg | 61 +--------- core/img/filetypes/folder-starred.png | Bin 0 -> 309 bytes core/img/filetypes/folder-starred.svg | 4 + core/img/filetypes/folder.png | Bin 713 -> 135 bytes core/img/filetypes/folder.svg | 58 +--------- core/img/filetypes/font.png | Bin 1623 -> 0 bytes core/img/filetypes/font.svg | 35 ------ core/img/filetypes/image-vector.png | Bin 885 -> 0 bytes core/img/filetypes/image-vector.svg | 48 -------- core/img/filetypes/image.png | Bin 695 -> 223 bytes core/img/filetypes/image.svg | 39 +------ core/img/filetypes/package-x-generic.png | Bin 720 -> 142 bytes core/img/filetypes/package-x-generic.svg | 53 +-------- core/img/filetypes/text-calendar.png | Bin 1271 -> 250 bytes core/img/filetypes/text-calendar.svg | 87 +------------- core/img/filetypes/text-code.png | Bin 834 -> 194 bytes core/img/filetypes/text-code.svg | 60 +--------- core/img/filetypes/text-html.png | Bin 581 -> 0 bytes core/img/filetypes/text-html.svg | 43 ------- core/img/filetypes/text-vcard.png | Bin 668 -> 439 bytes core/img/filetypes/text-vcard.svg | 53 +-------- core/img/filetypes/text-x-c.png | Bin 1228 -> 0 bytes core/img/filetypes/text-x-c.svg | 70 ------------ core/img/filetypes/text-x-h.png | Bin 1168 -> 0 bytes core/img/filetypes/text-x-h.svg | 74 ------------ core/img/filetypes/text-x-python.png | Bin 1368 -> 0 bytes core/img/filetypes/text-x-python.svg | 80 ------------- core/img/filetypes/text.png | Bin 620 -> 169 bytes core/img/filetypes/text.svg | 39 +------ core/img/filetypes/video.png | Bin 1252 -> 166 bytes core/img/filetypes/video.svg | 92 +-------------- core/img/filetypes/web.png | Bin 2136 -> 0 bytes core/img/filetypes/web.svg | 36 ------ core/img/filetypes/x-office-document.png | Bin 856 -> 169 bytes core/img/filetypes/x-office-document.svg | 53 +-------- core/img/filetypes/x-office-presentation.png | Bin 1028 -> 135 bytes core/img/filetypes/x-office-presentation.svg | 108 +----------------- core/img/filetypes/x-office-spreadsheet.png | Bin 715 -> 166 bytes core/img/filetypes/x-office-spreadsheet.svg | 63 +--------- core/js/mimetypelist.js | 45 ++++---- 67 files changed, 69 insertions(+), 1852 deletions(-) delete mode 100644 core/img/filetypes/application-epub+zip.png delete mode 100644 core/img/filetypes/application-epub+zip.svg delete mode 100644 core/img/filetypes/application-javascript.png delete mode 100644 core/img/filetypes/application-javascript.svg delete mode 100644 core/img/filetypes/application-rss+xml.png delete mode 100644 core/img/filetypes/application-rss+xml.svg delete mode 100644 core/img/filetypes/application-x-cbr.png delete mode 100644 core/img/filetypes/application-x-cbr.svg delete mode 100644 core/img/filetypes/application-x-shockwave-flash.png delete mode 100644 core/img/filetypes/application-x-shockwave-flash.svg delete mode 100644 core/img/filetypes/database.png delete mode 100644 core/img/filetypes/database.svg create mode 100644 core/img/filetypes/folder-starred.png create mode 100644 core/img/filetypes/folder-starred.svg delete mode 100644 core/img/filetypes/font.png delete mode 100644 core/img/filetypes/font.svg delete mode 100644 core/img/filetypes/image-vector.png delete mode 100644 core/img/filetypes/image-vector.svg delete mode 100644 core/img/filetypes/text-html.png delete mode 100644 core/img/filetypes/text-html.svg delete mode 100644 core/img/filetypes/text-x-c.png delete mode 100644 core/img/filetypes/text-x-c.svg delete mode 100644 core/img/filetypes/text-x-h.png delete mode 100644 core/img/filetypes/text-x-h.svg delete mode 100644 core/img/filetypes/text-x-python.png delete mode 100644 core/img/filetypes/text-x-python.svg delete mode 100644 core/img/filetypes/web.png delete mode 100644 core/img/filetypes/web.svg diff --git a/core/img/filetypes/application-epub+zip.png b/core/img/filetypes/application-epub+zip.png deleted file mode 100644 index 2399088b28adc460fd1009343cfee2eebfae4a17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1273 zcmVpZ) zbLWh3T^HstF)=Zp%jKS-p?KtY688_Uz^O_&j;!_O_)dMuwS?Vu<-&)Vl!<4f;mBsQ z6SK1ygl*fX$^tAALp?{=_@!PpuHZJE^PGS4|KR**PakQV-9(_hz1=!}`eijvbOKMk zTEe|L9y>XFZA$`tjE#*Ukw~CiE@SlI1F$TLhp<3jQiM;aw*>gZUv`@Ogp_IkNiMV3 zF8xTauT%^8J^l6JEeUW=WHK47uC5}V&tv4dK?1WBpx+A~Ga&}&AF^=+U`<3yY4j3t zt6SwkBm(BR*7P}hL>fQ}slbKu9Uch{UT>#WQOZ+rPV?X)Ei3=Tm;GY(5^>ubl(};T#C4Opin zI{YH+Ya3Y3{)D+7-UdH|O0f)vhaM;JDMe^u>0`(aLroz=Ll7YcbUYnu>!quhx%3vr zzliYzXEE4&9C@*Vg0-T+#~+?n|IIACiCg8XO}TJacL8UAN0*J<<}zl!djl_={D4SI zdwZ~;@f6CHyaH!Jon3K5O|5K8cY$xLn0uk%YaN|7dA*D;zkMC0%597voTfIV#$V92 zJeJXMpRMLQ<|CQyLvkRLfa5p~dEf>faKA&5xQ@@ic@4#KPBk7E=-Lhf_viU`eh9Y} z0w+j9Ewz3QfJnrU-@Jj3W}jDfox3WePMh-7uNwUwQPl$0HVFhd!0>*rPpD>$!HQMY zwRpld!0Vr?ihv_q+lb5@@SlFZ_r4Ztfi~T1a1Y)!>I2mFmdFa!?FDQk5EP)k_s!*Z zuz&}y3stjVZK)!vDPR!ru_18h!wude0s@>%Rtq6$+zoa02&&(`mdz)nBFBEZuF|R jPA|Wk=6_8D{_o>I=Sj}Q1)c8A00000NkvXXu0mjf8e3#( diff --git a/core/img/filetypes/application-epub+zip.svg b/core/img/filetypes/application-epub+zip.svg deleted file mode 100644 index 7de28f4f216..00000000000 --- a/core/img/filetypes/application-epub+zip.svg +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/img/filetypes/application-javascript.png b/core/img/filetypes/application-javascript.png deleted file mode 100644 index 1e1d3140f63cf6bde1b015abd154e351da0d16d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1243 zcmV<11SI>3P)Z14}iXsw;Oq%A=_Rh?`ckX$(NHdN}n~lTjq95L(ljlK zqF|#k|JOu>G);?30yyXJ-tRiVy6;N@3|f*T6h(oEpp>F03W6ZOIoJQaZsX(QLqTl< zSbzJ$=VI%FDs4xx3+>qwAW0IEBq0n#=W)NXwXsa&5z#xdV7OgejIWQIkoGbkYz%KnwdhA`Ky-X9Eh2(7hWYt{waC&>WNM7nRY8{^jx63;f*bCH(~L|FX{dKHKPwb*7vuq zN;pWnu&_XyrYNOo7=yPC1iTwOq~M)^DX7;ht4CiWe(+hUhn}W-=;=*9cbo+?Gc#)n zAb9IRJl@%V_cX7g)Bb@taE$7+)O60`(N{R58&n^89z8kpAHSQrN29J92v#M!fF zan|Ck!&{HFp4HV=R#sN9_dLm8S(C+cF^&*rI!x|KxH>*X_q`X%e?PgU0&2UJ%sY>_ zehtD6>`&s^29AU9t#rpu2pX2IrL+6t>hc86ySrA1LBgXVUfpdl=Nyw8f z6gdQCI<+gw9(;kU^(&okKIYm+8Hx-|h%-GTC~v z`wt-FGsL4~SmW0ea~^9PD1A|7w^X2BuT!hl)>2dc1rRSxOf+#}1;$31Y36k2kCV=6 z#6x||3~MdM7%I;90i5*|ML}U4I_r^}h`6SSMfH80DI%6TiapP~ zJbWQqpL*oXDFOxFSSV?X2f_-W2*tyP`Sav4I6a4Q7B2#o5xD72YIht$DwW|1QTzBu zIGC1M3x)yC0=~ z;6Ca@3?VxPxZ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/img/filetypes/application-pdf.png b/core/img/filetypes/application-pdf.png index 74676372671865506deb906403a7056324b81f12..1c0b18e2f5100c589b0fca3a249b297c868d84f7 100644 GIT binary patch literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMfoB*E?S0H^m$o+Pp$DKg8I|1$x zbQi)1^tc=BeK*wSZn)q5xX?$rsgLr~9~ERgD#(0Xl=Zkc=V@K}v&O1t&9%?l>Yuka zzMR+Z+&7Eny<4^H-I^8eH?IA(Z`Y>-dp{pO@cGEWFDH+GId%N& zxieqSpZRwA;`i%UzTdq5RBj~@Pc|L*U%Z~uP({`cqi|Ns9Pv_G{2-N#W9bmX~rJe+Z~)WTfETz4bWl+Pgg&ebxsLQ0LXu}g#Z8m literal 1672 zcmV;326y?1P)5xgiu2))r2PFM`p;hMki?}OlFd~bMHNSEg#OE>D>A1i;x#L zcd_Sk_TBq`{_DT~YmZS?uII2^=kb34e*TwF8k4`PXU&d*)sp2S;(e2 zwPF_)R58qIN&pp96(eXG!t}_+@n5}pVeAiYs8*K*aA!}~j>jI}`RXm(w?}b40b`l~ zO!hYhEZJ-_APQ(@6~(RFz*vlPbI$-ogiF6WN_g)g=TDq?l;0lt9B_C^0P8C^?CR|( zNA*7)qhY{UgRvHxvuOg!fI+|z-@lWNk8h(fJ51!dAN!o3lR8)WuYRdD5zu#6Gg1SZ`)4yBVWL` zx0BXtoc`%cTzdUAD&+zt@0hNqM4g>YSu#XcjB^0IF0|K`Y(lw%kSO?tAc+ z3ZgJmt?~Y;zw-9JeY9yxDIZhx9wUl`6jLl^<+<<-V>2?F>0Owk767$Ih*$4@9-Nym z3@)EN!|=gFOr1VOrC6Yti^zKqq9}@}VoU9dHebZ52r4Tw0LI6N1V9-(agvc&4pJQ+ zrkuodmkN|(Ph=hQyJ#8&jgw{0H)v2KXg2FgA{6EP;lqrbJjuk+5Uy6GElDUB^5kMi z;yu=6LT$kvBvadx-KGgvl*rf*DMR4jhYq3>6Lfh;R45R8M=o+%E0EbDGP555f(Tf* zWD44Pd%1#=w-&d=bGsl}-2V9EbPo*B5yzAxM`8^c1Q9{Qyj%uBnxR24F2Wg$w~okp za&bbbP^A0Tjrcf^ijsz~vIqfsc0NeY0}pU@XoySuUq(lUQIn}VE6t1nL$g-^PQm7L z6bktzvk>?96aMjc(neU6KD(d_=c2grHu}EzJh{(4j06D{jDXS1SWsaOG6PE1_#!MN=V)^gtCE=UBS(2-_a0P)fjxV$o9{$K=0ZiV z&bPd|gg~uU1690pth)C;8fjRRr4|6vEU%1KB{EQUp7toBe)=@WpV^J1fepLAMf9<) zA21-2+4sD+pQ+A(W_QP2lB4V1`)D*mwsv_9=v-aTf?eZ9Sr z_t_(3S{fU%LL5^5w*LUzzVjUGo_K<*qoc%~oup}+fiZ?8Nm@E)eP)I?4<3?{nd&Po zy>fO@rBZ1tTf5=bG<|4OlG}kX9SgeZoB=5q5%EDJHdu9*nh22~uBD_}lRJ4XZ5$r* z{x?%1=f=m!CtCmjtXZ?B7(!_G-p3;1{+IuPS!+X@rgi7sm9eq0Yl|4TUgN(HotT^K S8{*yo0000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + diff --git a/core/img/filetypes/application-rss+xml.png b/core/img/filetypes/application-rss+xml.png deleted file mode 100644 index 5b18ee2cd4fd647d820fc8dac732b7a53fdcc490..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmV+b1poVqP)#TqtR^B6Oirl~`&QtzV_IlEgG0&CI*+92f8F&b-&mEP`?2gFE-#$Gi9cJO6V( z-iVp8nU~vC_5T6>3jp=*2j`x@e-39uAR8=Ypt5$`J12Ln3t;Hb*i%ytLBI(}TCz4- zyGp}Sp|rNNs9_lAj~pp=DFditXJ@dh3*a0g4qRG7m~IFQL{;3|yM zW6Ucig1Cg*QUIxnK5)TOj?59$^xnrbH*#$mjiJcy|*B0DO?Yu&u+tUGwZX+GdE(z;=WRl z(3)48ub)6K{EYs2n)t#j@h{&X6*hMF&!GYs@qMp?I0ulC8>o#;QrkVr0HA-&vi8wy z=%sV(5d;7v=`z48s&O9KcYhx%O;ouW~fc-XF(17!!Su+Ge(SN>-4 zttr|+d`bO|y$n7yg{~~qI{7I8wO!*CQCleu=CyJstVluO!07Z*u0QlG(%ixFd(!|6 z-19K%mFVm#0P16VI&xo?hP?E%3RD$~Vl+~s^QV!aVRU5)o4<_CT}%WcrG4i696+Or z%_-aw4O|pgo`%xBJAM7gO)Gb9-`3FO#eA!k>ORE!KTx_oE zfT<#lQC#D?O2KQL#CiW9p8QoykFdGL()%3%BI1rs?rhEe`rAf-lcyZk5)o&?Z0tyZ uBnSOSH`oSV9=KwGXlV}o+t;T5HTwsktq4JpUSq2O0000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/img/filetypes/application-x-cbr.png b/core/img/filetypes/application-x-cbr.png deleted file mode 100644 index c0d374a459658d2d19ae4a077152f47d6133c19c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1113 zcmV-f1g86mP)jpC zDheV97Q7yxQ?(wszzPO>Fb06$mzaU7;+#VjL@Zd}6-YUWTwWJi?B4e!IKNGGC47okts&=6r*{n$DiP_%8Ok6-0 zZg32^;VuYyJYQO4ed+Z+<-Mbjo8g(|H!0;86WLIZ{9yrv`N-TkMBGRvcXDEiQ?q9h zS=Bh04;O?X?dFQhW7YlX{HaVmP|?vD$Oy*ebo_V=lB9Oj@x)CVA|Tv4y6 zH?Cg)kbhcxBPqYzxWzX=eS~_89=Q;C?=wI`-4DVdLX>wz z`8=t91Pl(^_xQTDg+EZr)v3(=;6)GT0`G$hLh0|^1D(^7>HXXUOwUGG63it1fI2-| z40Nnd)Jo&h3}BUNY8qIIyHSu=MR1zi(s)GPS^K>}yGUKG6DJ z7UD)V-LQ_;5p@|z0qE!+V10%MOED71fp=rLptl;Pvmm=4NI=3)Hw!?$KU^K?WWgZo z`&+UBEW{gC!;jJxt13|xv9Pc}v)QCnDAU!O?E{ChkP61OZw)U*<#KtZQmI_3)oL#T z - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/img/filetypes/application-x-shockwave-flash.png b/core/img/filetypes/application-x-shockwave-flash.png deleted file mode 100644 index 75424f81d68477d9b2744b14a3b36d05d6787538..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 880 zcmV-$1CRWPP)E9ydbuEbHKx^T8y7;x#X3x{HHAsG-v6gqBP z4xR2q7Z#jR{D6+AW?sa3N&AXkxgg59P-sW;Xe&?QZ?|nik z#eU7t&%d6}=V!SC+Su5*w7k50X8)SiYn037W)~I~UN#IP(&SP~mX?+R>j3}&*LCT1 zI*|fcmNpgIGJD$+g$|3U#ZpQ|4$&9D?Hr<30H9m_o!9|g%t%|Xv%XGob(PZE8m8m$ z!o`aRV(JtCkW%&ypnRVn&lD)GtdPJWYua4jDIbWTltM~*G(gulEPz+5@zrama5qcj z6DeW{+;#`UAON7#p+gu}KP;Zc+}a|aOfhU2+;Uy&zRO*SWGMeb?}0F1<-1Gle)~1q zbed#5MoYH&qp`>RufD?bpI->r>ojl+l$8AR=4mEUNk-x^gfF>T-Q~&mJ|O+r<9MDI zss(`^=nl$J)tAnnLp1A*XHvu+n{uO0{@D{G9+|~;-2=niO|Bclfm+~u9>wMN$&F`- zJ2s|m@>koVxN?q9W@q@~nWwdWIt_FYl|TKM;h`AABO^GrNk=Mjxk;ubC-B=ozyJ12 zz(2Z+NGYy=be5^i-NYRe(=;&^*p`9pNZeK%!w^~ko%%k8H^01q*=~_cPh!VoT)zA( z&C1OKHpjBr(DC}(fm<6zuD!iTZt5O}jyY6zD-2EE%Tu3y6Y#IqYJs)E0hFTg{W{m) zdV`6vQPSfX49DU|X`7jM&Qh&bZ(n9V0J^u}=aVNeJ3iTDlF`u&){sqkyG-iQC$Jxw z#`C;T00X}T{$7RY>El?Ag=w3VZ)~&sXO)@7cWJd+M<(ya)G5?4G=)GaNwe8tZ>NDd zbsrBGKE$;hl%}dMMI8#DGmejqQQEr7@Po(6zIc++=U$@TY$AO>RPt_2okGpPL+95J zLg0BGtyYU_&xD5s2t5P63Nz({>i_vy{GS6@mPITUixfcD{{Vmx!kC+zyHY3=RwK>+ zk2W_quLvOwrPRMPV*l0%Aq0@<1&dG}psw~M6;b!PU;PbI_*uwsFzOWm0000C% diff --git a/core/img/filetypes/application-x-shockwave-flash.svg b/core/img/filetypes/application-x-shockwave-flash.svg deleted file mode 100644 index b373fd6512d..00000000000 --- a/core/img/filetypes/application-x-shockwave-flash.svg +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/img/filetypes/application.png b/core/img/filetypes/application.png index b6b1bbce2f0249f7382bc50805372130089759a3..43cc3abafe760069ddcffb04881fae5e08ae213a 100644 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!S%6Q7E0CTvY0~`p^QTXrK4r=j zAPEFhr%nZu)4%}E0P^7MpCS@|K%IgmL4Lsu>>LW(I>8}1xl_)byKwQ+zp{9}gFwj` zPZ!6K3dY{PgM7>i9L|NC78*?a_y4?J_Yu`J_G-o2cK4TNG6(mE`HBQ=oONKrMi!=? zYcdnA&hHBB=yIN}-tcX&Y{&lw(YOvd;ZxDC_MX>W`u(R_``$Hjm-Rn0&bz?!{(PS= Q2hbh{Pgg&ebxsLQ08!duvj6}9 literal 945 zcmV;i15W&jP)2^iHV6A7#J277BDa{jEszqj*e4PQ%XuoR#sMsh=`4ijZsliXlQ7sr>9X- zQCL`5T3T9NU0q&YUSD5dU|?WjVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2 zY;0_8ZEbFDZf|dIaBy&OadC2Ta&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R; zeSLm@et&;|fPjF3fq{a8f`fyDgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|u zj*pLzkdTm(k&%*;l9Q8@l$4Z}m6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}Zte zprD|kp`oIpqNAguq@<*!rKP5(rl+T;si~=|s;aB2tE{Z7t*x!EudlGMu(7eRva+(X zv$M3cw6(Rhwzjsnx3{>sxVpN!ySux*yu7}?zQDl1#l^+R$;r#h%gxQr(9qD*($dt_ z)YsS7+1c6K+uPmU-Jz3&g8%>k5_D2dQveGN8X6!YK&h#%!2A3A{Qdp11A3hR00GfS zL_t(IPsNf=ZWBQigzL3?qS)Ah$O7z563ha&7Lhmz+<S4DC7JY zkNZ`zn8cYF@2OqCS6!dfUBLgB0f<@lcFpSZVv#DtX7htB1ugY)_NOv*-p@j#(P+dN zf$@rLNI zX!E_^l;nd1plHdpJHX)&<7T0H0_oCuy1-&@FvY;X+o+Rmts;H}3+dSjaQ$?Ym8Wb! zK)6I0SeQWt$?CP12~OzE_3_M4dH}|5&7DVu==B7%ZuTWi$}Y~%V|uwYchwVIA-Aa% z&T@n({d_F3mf)1^Y7!Q(2qm+z+M;~<7j$>;cYSxi<=)!g@owMUy^b(hF}!Hr^bgRt zz2{pa7ga;J$@uNbZ$!bz*dDv?5D|b<3N-WFu>B54r^u^DCEXd^X~7I;lL-I`5+%Pg z%u6?;nZW=6x@~qjN7d@q#_I@MH6VR0ZvX>A7Gned%2Qep2EanFH3pGdGhWqSMXR3C T8pI){00000NkvXXu0mjftQ64g diff --git a/core/img/filetypes/application.svg b/core/img/filetypes/application.svg index edce49e3e4e..f37966d4a25 100644 --- a/core/img/filetypes/application.svg +++ b/core/img/filetypes/application.svg @@ -1,57 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - - - diff --git a/core/img/filetypes/audio.png b/core/img/filetypes/audio.png index 3c78bcfd173c380ee4c8ccfb418ae5ef54954f1a..32171285e8e89653047d0c47bc87cc8f1df0a2c7 100644 GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}dw@@fE0F&G|9?Y6!_1j8`}_N+ zPoF+*+O(-tr%stN1wul&K=BzfW&lZ`AP_(V;UtiO3qTBn%c61N;=HR)tN=PirzFTP zn1PXrOF&vlMa|UQ!pg}jIxe-mskNtn()5K(SFGB!`^edISMNS}{PflPkH7y_p6gTs z>Pz!*yE9`-!tx&K|3ZPHxx zt$P}d-Al{+)zEh|)qX)^`~h}xgIj#}{)W8>XDM_v;B>i>6;RM8(p{c2Cc{uWw*rU}$J)WMpJ)Y;0m;Vrpt?W@ct?Zf;>=VQFb;Wo2b;ZEa&?V{2<`XJ=<` zZ|~sX;OOY+lq=?d{{^ILvI(6E#X)|Wbm^pLitXZ=n zJL3I;0Vh}zw*w z(_4q!4)V62HsKmhjFJ4xbw8x8si3qAiROo|cyv zaqeabY;@c`$EbCI=AIo58o3v~xpO!@D^yZZ@{ry#N#Ms$bpavAF0+hNuQu>=u&_)t zi#WN8X@}k{h1soPW_uRi-FYZ%3*(A4W$VA4e^;g+ro_cFi|N?Ur?s+uYk-O~G-tQ7 z%W+QH!uTd`uiB5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/core/img/filetypes/database.png b/core/img/filetypes/database.png deleted file mode 100644 index 49b2b861757e7bddee8bc56f61886c8514015f04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1117 zcmaKqX;9Nw5WxQ-NCAOD(c0FLqg9zw7^NelgQEhCN~A+0$b@4=2r@y!F+w;xEdj5z z7z8Otjv^+SKq4W5gj^C52uTnK&=e5DP14e!0jaGZL`q-y+L``l-@cul-M4Sw+cH$t zc~|F8oFNEuMMfZ^!R}*Qj&Pt6%)43$f>}{tUpl+Jy$wA7k60}JZ-7uJ3fJw06_ zk$^~rLQz;)2m(kX($LUQW@aXdR8FB#fq!5?*VCic>2#n+M1f0 z+FEj*4GOpzC`6&qs8k?7(`Z2IAJ}MUXrMoS%wjTGELKxvBfF`I!)8C>a5yb3yp|R| zkH_b?3R+tQZEZq<07$z)C~9vPi9`~SSSl7vB@&rb`cx+Ccnav~ly@pR6-tFdsqE_R z>H;sPQmH^^8ns5N(P*{WUTtr0UtfQJ{{U!t05oZ1a0l=tfZ-i}*+H+@|GL8nV03hJ z%*J!T`1r)cgu!5#oSdARnws8WW^QhNVZmrJnHCopmzI_+7Rw=jPusVK5Sy^3u{ny`X>oztv zHmz3c*4EZPZGYa{1BPlCi3q!NVn9>fmhBnlPQ(@zyvk0qTHFmV`@6S8eKdppk6n*SQV5m%lks_1LdG{~ zY{CXkV83GdL36I~;>L^JPy|%!F;oO^U5J9;4$0dOxjNQCeu;;h6Nbake$x>CwD+v` z82@rs81knFfkWD{C#tuw!C3x2I}YUk(g!7!2~7@Nza_Zb$BxLKF+B5)JcpxLJ17)_ zT+HU9SrUqum%bpzcltZ*X+m^yN~D8n*>ETA?po6E(lf>HOt_2R6a{4*{CH;O)SE9z z2fde#!=5-UJUZdBQe%){291jTv>d;+FJ0*VIL7Y*If=-;Ib*j;df;(NrO`TDC>Cg0Tw=3`$~HzFB(*zOd_ z;Z=P0J-a?N^iwO9#OdSWFh}5cx32HYv!nQ3zgm^38t%a%oC- diff --git a/core/img/filetypes/database.svg b/core/img/filetypes/database.svg deleted file mode 100644 index f3d4570015f..00000000000 --- a/core/img/filetypes/database.svg +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/img/filetypes/file.png b/core/img/filetypes/file.png index 54a242d9d29e80a41d437dca7eb598108eebf4f5..b56833a5763fff473ac8ee6765a5e6d270320dbc 100644 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa4)6(a1=7=|O`9=e#`Njafed8u z_LXY~P@1D8$S;_|*wX3EhtFS{*>-XQ#ne4r978ywlM@=6d;0qL+y(eO%C~4aNXi~H maI@~Y=;-Rka>J-anc;eq)<3H=TQ>r=FnGH9xvX4iSc3`50Kkncrzl - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/core/img/filetypes/folder-drag-accept.png b/core/img/filetypes/folder-drag-accept.png index fc1d83cfa6f574c0b6930cbefce82dfd7b811ca6..58640b5cb5cc4145decb93017063bdd54904e9eb 100644 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?b1=3+9Gee4Ig%*R5Hg9(& zP>7`@$S;_oq2v8T&j}lVd{s{u#}JO_%A1Vs6!7|lpz aOJZPPpUAHGplTY(A_h-aKbLh*2~7aHN+Qqz literal 760 zcmV6Cv***f%?vR! z#wjsY@BaY+$ioXFS^zLJpzSs@SB44zV1}9B4q`||HvtR}fQYUG05c;^(_@W1&+FRU zIHlhKqIH&Ku+|O~seegId8_yQ=Z^=O3(mRI`UVm8tq*rW|C`aO z=c_LQ)>;gbg0o17{?3;GKtuvSK`DhKNk$4#EEWNvKtzI>GrDu{!J{h+*X|n~oV$AY z(qbMF_*~w2H#IZctd!SY$_p1ui%*|CzMJQsv~(MbnX`Dlyu2Yz818(nHo(F|UJL}l zB_X0Xs>x0eYy};IiRn3HIfX$G!E_8%tF`-T@Bwf;bGT+Jt~NIr3Q`h!DpS!Z57$08G1H)mmd>)`LBm1t(&h z@&hRdQ4l~k>%ReN-&bov;Dd|P_-huNoup4*K|pIC)o-iS9ze6Q(N1*GnJ<;5GcFwA zXE>=51nlcTt7=*G006W9pD#BLs(4DxBUSC0000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/core/img/filetypes/folder-external.png b/core/img/filetypes/folder-external.png index ede1a0d17f35f7b9c433c4bc1603e2fdc412ff4c..56cb385a7725bade3dc3619af65850c071541542 100644 GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}NPtg>E0AVj_#fJ^D!g=NNb#(Y zlG&lfvqOqzh852WE1DHn0u%v~AZ|#}tWdB>Xz@%C0&v{df*8^#BYyl0+zKU@v+o2RRv%Q~loCIHOxYQX>i literal 850 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U|bU56XN>+|9_wee!#}V!y_mN zR3oXR4kTq%^&sjM3~klT>~!rt^&Na|oqbK*gH64{Y<#0^17ckRLLGyXoWoPyqtd-& z(tYBy{StBllJbI53qsS1!_$i+vPz<|OEq00;&UtFbIY|nVsw3zb$yb;l5#?t7KOAe z4{ci+)3XMMk|u6Qnz&KX$WGbVUd6;-&D37q%t6!4LCf4h$HGz9(ox^a$-v6VJUHDq zJ~y*Ilk!ccpsCftsZU>o#7k-*mlk#o?xvN1L}?YhQD`ecSbpbtgKu zUGJJat9!?do*g%Or_Jr%d82RRss2r;C+xmCY0u56`)*C!c5eFi^E39}nswmzoZXk^ z?!7$s;GOx0?k+lVckzL%i;v!2a_IW<($O<9 zHMg?1ck=WJ2o8%)NJz`dFR83;YU`RXdFI^t3m5O)z5C^xH=n=!`g8F{#s^@Wt9rUP zhFJ9OoqX2ou!BH@^Vbc_RJ}xbmaKF?7(LJR{?Z>!P7B&Q79Nd0xmG{G)Y|&-xqmY+ z=*1o3XPSLi|MTYEGgbB*{FGOm&3?r5;UCKh^Muw31@U=3Q(op~5k2vGrm5Qvkrfvf z9$Vl!ar#|7r|@Y}JL+QYxJKB-W;rhGY4YN>GIV*MwMD_*>GL5A#yJnFBCePI{Z`;8 zbv-1%W&Zlrt9G%c96W!6Rh-i>e;fCGk&lb7Pxnq#ubS-C zDC45hqLC2Z;%4b&@55NhSMWh~mXuSkgF7>)n(Gc;cjg4f@BgM;J~#2#<9o%tB4t@+ zuV=K@D)lu8So=8WP14xiIbkNptJRgg7jE?4+BTab_jK$Ft;OP9{~q1{!}e*Tef)iv R$swR*?&<31vd$@?2>@Fgeg^;m diff --git a/core/img/filetypes/folder-external.svg b/core/img/filetypes/folder-external.svg index 2b96baa90c5..d5d4ef73edf 100644 --- a/core/img/filetypes/folder-external.svg +++ b/core/img/filetypes/folder-external.svg @@ -1,54 +1,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/core/img/filetypes/folder-public.png b/core/img/filetypes/folder-public.png index c8e5e0d3d4cefab4094e584d94abf3c4fea1916d..4887ea6e7672d150e457d5c62b2a459f4fb7ead1 100644 GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!M}SX=E07K@oE2I)C%9y0Xz{F& zqS+xOv%`vKhn36>DVh~pG%KWdW?1p8(3069K(cryPz0z9!~l_C1Qyx+nHOZ4cuA07 zFoU+4d2C!_RYS+*DO0CSpSfY>-m7^nC^#4Y=`ICR#``s+7ih*`8c)I$ztaD0e0s!>0WQ3Np>h}bGcy=`f&?QL&w&%DmKpxn0f z7H$c(8^6gUXJ*cK<}-7C^Ekpe$7ITz)ZYIG0D|EeA;fZ^tVnOGbFSsF0sv*sxyE9Q zLWmmR@c{@SQUK05wAK$ag<*Klv-T1D?QzcC7y$qzj4_wuIDV)*j$@25Ma@(p1wpVb z|2(`RlgXfzdenA{QX-KUkr&Q6UaZ^p%FMZQcduTxqRv`7p#Z+`^WBwe=eqy7bNKAh zPY(qERn<$j@7eQiUEuo@+W9?g-u7zU-o1NUfx7_Gnr!o(495L8+d{$z9mf$2#(*_$ zKq*7)hdj#B(ACk#m&cCKdiyuZE2fazu!&`ii3jok+UQ7X0|es+NVha` z^uv89DG9=m&h|D=eR2>RJC>{(4Iu;=YtXUH~Rl9{$ z?N%HxYrzt{AfPwXjV`dKctT*6!5TdTprjs%v>_QgZ2WM5p3ZiT9o&yml9d~`Fn>i2 z%HH)|K6f0gG;w^Vihp>zl4#;+IPe_=zNIUf;zNQ!5L4@0Y-#jHT!AKZgKRHmjx4T00l& z0;?cdT0vh|JL%@@%&4m7*Tx2#zWstAk!1DGw|R0_6@`2S0X&D)#%8;_WgY;qN*igc z3k!|n+0;gUYWSGTpMQWChQwOqCz7muZ5QP;tBM-=J$b^Rw2lBf0w7XaYU|1hHCDNJ zHPsecuAC>zW|%g29*bVukzZ=#ktZBd*--!vqwQ0ri7}0{YSxpgSwF7M#!|bH7I4D> zve&;pb>imt7w6z6_);K5Y_;qF`eE=&cDGyvKshkc*CGq_Ip@p>fXULN|C&uYz`q+f VyPG9K1Ze;O002ovPDHLkV1i`*IFtYY diff --git a/core/img/filetypes/folder-public.svg b/core/img/filetypes/folder-public.svg index 6bfae917a8e..bd7039750dc 100644 --- a/core/img/filetypes/folder-public.svg +++ b/core/img/filetypes/folder-public.svg @@ -1,57 +1,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/core/img/filetypes/folder-shared.png b/core/img/filetypes/folder-shared.png index f1f2fedccfc073dc23ebca5adea512732d9297d8..56c8ff36ed84b51b96fc35b20c45a43d0682bf35 100644 GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}W`IwKE0AVj_}|db5E{D50Z0~3 zk0_cKT0A4XWKL-D?BK!~p+z%8if4wE%nT`-6;?buqpAirP+MkZz!X<02DW0TC{hK`=O3s$V%v2*w3dyk(y zd;a3p>-Ycc7W{n=R2|{z;uuoFn5@90p~1+gKdC`T;=@7?g$AZc4IK?i6I?h>Y%=Ij zWI2-hx`d%F6$taD0e0st!}b07c! literal 1134 zcmV-!1d;oRP)xCjbBd93?IQ00000 z03b0vCpJDUKS?h@O+7)5gT0Kx*MNm~iQ({9`Wk*_POI&A6Uu#ZaY*1ou zQe|*eW^-3(b69G0T5EM*ZFpa8cO^VcB|cDAVr(cxSSLeQPk5J6f1gr-pjwBhT8O7% zkgs8oupu%&BQrlFG(RRaKPNUoC^tbUKTjz(Kq@ytD?CRmI6*8qK`c5%EIUOlIYBKt zLM}Q&FFHamM_4dALNYr-G*V_YNmn*TQ8r6jIZ|UfQDHkuR6JB>Jy2dfQei_+S43re zMQevfS7b(Fc1KlSRA_coX?Ry=aae|>Scb~nOuULV040Dn#5q6#9*7nVSklk zil$?atz?O#WRI?8hoEMl$!CqIXP?JspU7vS%4ed>Xoi|;gqLZPv1ygHX_mEZiJfhX zqHdbFZl%m_rp<1r&u*yCZm7_2jG%9txO0b3;(sZoSb)UU=r^$J#%XzBJ zd9KrXsmpq<)O)1Be5JvDvDJZ}wSlO^f~m!WwAF*O)`Xw5g`Tj7tjCA6)rYp%h_1+p zw%3WQ#EO%einY^=tHX=0$BVewjIha!xY&)BosGHJj+nl@7oxRhY!Q7w1-J-f z78oETB_=8=EG{%PH#$2%LP<ba{P(hKi7rnV+Gith>O%>+S9H^!ofw zzlll!00DwYL_t&-8O_1LYEw}VfZ=~`rVR+87%{bJu+l(l1-ld%t_5Gjhw>o=SBfs& zDwOV2RMad2*4k7{>`ijdIWy*_CdLxC;`i|%5TK?^ofe#^IA?@E-8)7Ba~2aoS#5k8u~>EeLRZ*%knuNu|FvS4nAdwWym?2M$PC4zJ98d> z=f&kVCCLoMf*8Mbz5#n1lrl3E3l(ST=-CltyGF^)P%OGL)_=7VpC4MSeGsp2L`q_Y zVxwgP_V>a|4YjRX84#Grf}y07dIa8$K(=pJQ({K@3B`(H2#A9$6^S{^Lqkb14?y#4 zkimZE>J4GWVnVUgY5+D{AFuU3eC~BG4F~mI&I}DD3_@T`+B6!S?w3P2sBSV*M3fX$ z!Bn&P{teJ;QOfd2g-X6vq?x#KJb){;Sn?+aQNi*YaDG{>oUE_(DVc%d{v!vR31?|- zjR6yu3`MNPSYiPOLANWyVs3APfQYb|yYmnH1Y?%JHL-}0y8r+H07*qoM6N<$f=EUG AQ2+n{ diff --git a/core/img/filetypes/folder-shared.svg b/core/img/filetypes/folder-shared.svg index b73e1fc3db9..5e0d4fde7a2 100644 --- a/core/img/filetypes/folder-shared.svg +++ b/core/img/filetypes/folder-shared.svg @@ -1,61 +1,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/core/img/filetypes/folder-starred.png b/core/img/filetypes/folder-starred.png new file mode 100644 index 0000000000000000000000000000000000000000..09383b5e06b886cee73bf4533e4a8313f445365c GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}T7XZ8E0AVj_@9^Xvu64S&U4AWkG`I zh~@QXS)e_NB|(0{42-PoT-?HM>A1jWJtk)vUMzVBb+5qaUM+x<@$IeFgeGdXVKKNC^N zvsUoPkAEpMHto3gX_fa!rS~h77lgZHIdFYnaQbd%#{JUIhDvW(ddj%l4wU3DItB_P Tcl`-u0(sxl)z4*}Q$iB}Zl`<9 literal 0 HcmV?d00001 diff --git a/core/img/filetypes/folder-starred.svg b/core/img/filetypes/folder-starred.svg new file mode 100644 index 00000000000..de5ef5723da --- /dev/null +++ b/core/img/filetypes/folder-starred.svg @@ -0,0 +1,4 @@ + + + + diff --git a/core/img/filetypes/folder.png b/core/img/filetypes/folder.png index d6b4d8cab991a041f15af89cebca2d332f5cef51..3dfb4391f2cde95313b8fd10b3193604f95bbabf 100644 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?b1=3+9Gee4Ig%*R5Hg9(& zP>7`@$S;_oq2v8T&j}lVd}U7;#}JO0$q5G-&gkheC9rjOcMJD0GO-!7F)!swo6#u2 Zz@YU{_@S@KKP{kg22WQ%mvv4FO#rUjB!B<_ literal 713 zcmV;)0yh1LP)J)26x9I zBU|X|{{aAs@j(dT8i1uKb2r`n%S-_PmfZdQG>IXEI{;<}2qD}A0Cxv7ADdK`gwty zfIonw(*L|wL3}>PLMI2j0_^?j*NFsY&B5A! zkC;dh>uRh5)%HG#fYrfz@@@EUk%5@8-`m|E0)A|NtCx0QMq}as4Z~*X_BBjJga=0Hj25=gi znL}00000NkvXXu0mjfWGyz$ diff --git a/core/img/filetypes/folder.svg b/core/img/filetypes/folder.svg index c0a5af9ce1e..e9d96d40490 100644 --- a/core/img/filetypes/folder.svg +++ b/core/img/filetypes/folder.svg @@ -1,58 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - diff --git a/core/img/filetypes/font.png b/core/img/filetypes/font.png deleted file mode 100644 index 535e03dfa7719300249d7142075884ada1dc5e92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1623 zcmV-d2B`UoP)1gA6fcN~U`3@@O6m5X-L})2onvQqw|n$H=t1d$Q33(cKnM}667eWeu@FBP&Xlui zfpBSULK6@vl!PNzkOHQZqp(D3KnsH1?zUSBeZIHsnr(p=K2T!fhhKK*KkxXx^FKZS z;PW)`RGt5~2xzt1b&@232cjsxF=zxBh8d0o+9yq#1jWV0ke!_kvMiq*Gy)iHp}}Bi zD=I32f`S4lEG#4f9hiy8K_Q?hN?k@qhReCxY<3YyN=kAffu&EJ0LO6w=*XF$pAVUt znXdZh=H^09P7YvMuKW1-40)mi(BT4;$>bmcMx(JEowg(=CwJ4cPN%bBc~bi7oHMF} zFB)SPS(DkyODSx%HI?0GP2~<-lbFg&rfAb+5x`noDgEwCxRA&?&LzZ6eIx=Hy-3a| z<>>4#I{VI>6iow>nk7koXH4mzCJNAv74f&bmMc9`@96p;h=M)!C?PVr@3-wg08D6$6!BYh`)JK z7q{Sq5@$Z4#AKe-Gs_yY6vy8y<^rKHUB1;I$65v?K(mh-Xs1Zi)6*%^R!_rW8T_d+ zv$C=vB_#!ljJlrFX^P{x62JCfQrHM@JI6$3Mq{?o_Se!`aO3m0;1`*3ddu`X`xtc_ zIl(4$B7w4AqbbV=a1?>wC&)5J{!M>&%I8{o@&MWlj;`bK@g5Av&zX z^aEvp>WsS}-1~i*sHw5&bguW7gaj~);g>rtsJG~BbsSSP zAOV_vT)hq=px5i$@%dfs{2&jiG+ax4ZYs<(8^B~V_K+NA=)Rp$tKrTz<)=f-w0sw8 zd5yi6VL}HafYDej77L9YMRps};em|h&}+4>x*PCUrzm$Q12`4Ec0x@IoA@Kg+pWbD z;PT{bXfDWv-3(_Na1+w(qaiyve;iOlQm-HpUo<7MjwNT{x`MLzP;ywqF9C*{2(iN@~rfA`34i4@u@R2t!-1U$1(k-MYsptHUT6)NH4eoXDrXbz4b zHiz-{Pou;e21(mPde}dZAV_z=h>%8Cgb5csvR{Sqw)HAW+@Rvi*QF9J0C zn0^Ok0HY@Y_jN2`ZK!ahI$Z2I5Gev-KVo-;2qsaYCZxTAeW11DeUY{%RBYH4eot;& znBXiQC*1j3B{JY)PYOJ`VR|zoHI&|tl zMN+0uZl|xWuNobWMm&cYfp{JJ&KPFXM*&<{sXx~;KOk-@>W@MUzpn}D&>is@ z#LI4H&$uz{0T}Mi2$6gV;g3)u#v>vTA&6HHFQ$$P2n@MrZ&=?8>!H{2VBvoP{{RIR V3%w?@<-q^|002ovPDHLkV1nN91k(Tj diff --git a/core/img/filetypes/font.svg b/core/img/filetypes/font.svg deleted file mode 100644 index 13c0596006b..00000000000 --- a/core/img/filetypes/font.svg +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/img/filetypes/image-vector.png b/core/img/filetypes/image-vector.png deleted file mode 100644 index a847f78fcd8599ea8787c56cfa845a43dd128c7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 885 zcmV-*1B(2KP)fxzo3*ldt3sg{n)=W}@d_42ZK)6{zDc3&lS+#b zArBS7id0HTo0e@;D3nrAR3d~1jgZ=uPBxpmJG(pcoj$C_&0fqHC)ht6KKS^~Ilpth zo2V+~N~Kb_Rkf2vkcj-1OeVX^=bXw##+c4zGKpnbktR3BkV>Vh3abK8RXoqb_x(r# z9LJ%u+W=K%s%p)JkE(icYj$8UARY>!e2f|*6u@KeK-J=ZCeTYiAkVIYWy@#h%*Ep{ zb{S3ojjZfOdXmVxx1q)jdL#gIY!BN0B=YlltRoj-^mok3_i)y}hVx<{R$~KtYlOn^ z*O*J+BRfBZCGDXA>fVAmAjUx8LotsUgE@PY_}2G{t?$Kd@5E}1;XJjH=H9o6KaoKD z57vwm8lY0L?=!4r%ORhItHX!}*sGpL{A|ezGe|xI`Dqf*b;HCc`uYB;DgP?*f1E1o7;wWbto{2H;72ObI_)HQUzJq18hc9eMI6uv6CF_*%` z6#4xhmDVO&z_Mp!)Qh_yfa1pONOqdQyF+1Q6p9|j)o2bz)xVoii61KopAp9atblr5<|+{+|Gj;}DO>BL%qk$vqH2M67{< zfytqvp^iwi-;X~jB9^Moev490B_aZ}R)R$+AINA~Qd!JXA4dNH_Va9XLKx0700000 LNkvXXu0mjfR3fFG diff --git a/core/img/filetypes/image-vector.svg b/core/img/filetypes/image-vector.svg deleted file mode 100644 index 1f0a54a21ca..00000000000 --- a/core/img/filetypes/image-vector.svg +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/img/filetypes/image.png b/core/img/filetypes/image.png index 305c3d4db27a52367ce49ffbf0fb9d63b409007c..2a5441efdb7989c03307df6ec62ad2ad19bbcbdc 100644 GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!aez;VE0FH)?w&Gb%2Y6zK7IN$ z7(iyj#6Yx|N77f2StUV!!3^Bm2@Nf+Z5{KkKL7CP^B1lQD|Z0pyggkULn;`1PdM^5 zCpfTs#LHZ)I;@RtU2`5gF+|>4MhS$!D}zU zo6=j(9z?v^LOdBEAqb(Q;2%V)H8Fp7Jj89+-Pz41J3_wO&hGo(kN0NYBm^2I5{cDd zFc{UY^H8~5&S$gPjCxJfeiR42y=Ot^)voTCIjwtHl*S6q%_Y zuofw$T$7u5>ab*42Bnlc1f>+REO!S`2h@KxQ7wP7m3Tbp!O*Z|_?`)%RNzZ>56@Ds zZ2>Glz65{JV^~qcJ;19C-Mn-FMgjhi7c)1)@c3L@AxvAK1WaED;9hDTf$*Xn|IzFQ0-SbOw_sIuM;bX(_oC=>XKnP@#U4E1=zO0|0*48`yeTvYbHe zW%(Ft0gCxutlfTr$*EC%c)Nr8zHXwz?Hz`1;uuQ#T~jZum=#b5D*FC;AMaj$WG0W! zO=A7|Ev!6Qz~cQFhK@+Mo0`@6^jv{%B7`EoHizg;2+HMkeqjn{uY}QT9Nr~neqCFj z4ip>&a=Y_lC> z{-hJp0e`)ymR! z{695#Ef|QO<&q@9>2z`jU`Y!g6pO_|CX?CZn*FaTl}Z7feRog_?LSZgz|8>Tr51oa d9Nd)ypg)>=;&A!lyWao+002ovPDHLkV1i!#JEH&q diff --git a/core/img/filetypes/image.svg b/core/img/filetypes/image.svg index 0159eed6482..3aaa34cf901 100644 --- a/core/img/filetypes/image.svg +++ b/core/img/filetypes/image.svg @@ -1,39 +1,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/core/img/filetypes/package-x-generic.png b/core/img/filetypes/package-x-generic.png index 4f5c6583bf1bf06ffc3b8da0cc2ac5cc94ac8ca3..eb1470b0dff2ee8a2d33b25675fa9511b0da77c3 100644 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Xn;?ME07K=nH5qrJFH}8NYSj& zVi58?x~%~y!B!IF7tByz-_Y^i0x$iEP)8S%5dPL)pJQJVC4`8dNIVAxd4x#RG^rvwr0ens2nh)(FF-|0l_!9LmN$Sjp+HGQ zE;_QFABywcdCzuiU;Y|K8p*TX`TJ&Oy*8?f`=sDrz5fpYfGrB&KEHbd==(N`CI~%Q zg`0I0qJh4C{&N50Y%OoXubox)=cXVgbOIV5h(KD6nygsFxt@#jsHf+lygL z2$(V4rhxkL+LQ4^zLu^&oW3`hZDev_x`dDelY@{$(q9gahi5xe1XeeG#j?tsK?SB!L0~)Lwfbr~Zy|38-5SlufpbTq^_M7CoR{+_Y%I zVhOlVg0{AB`rxdg-u`dLh?GzC=K12=eSEtslk!sdgdi-RVbAP^X1 zf=Lf_VyfWjd%BW|2_gbxOke@@E05yFY`T?Zes^Aiz6G!(c}CZ9(8j43z&PP03&46u z@ohM*Sj-Wy7Jx4DIj*$d;WsZ2KrH|#%F4{9LFYzElof!p07lNykxog)!zafap$~PeK4lRew$X3r;Zin|2380PqhjaR2S-rZqMI0000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - diff --git a/core/img/filetypes/text-calendar.png b/core/img/filetypes/text-calendar.png index ac48f1f802bc79e35b15b8a6de66b436fee03876..dcb22b53e670fede3591e239b1100c582f1b65d5 100644 GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Q-Dv1E0CTxZQ6_(Gp0|U4rEN7 zIu%aB84xKT7Xr|@j;G@e0!A$*1rk{Zd zf;?RuLn>~qJ$0I|!GOahuqI?nSkBhZ|MzFTY-)LNX?MaT;TNle{|G%O<6~g{+p_ZD z-jjl&CHl2%3fFVhipFqlin`Qz^3nbUOOAT&JQ$Jiv@y>ru6{1- HoD!M<6oPCZ literal 1271 zcmVAzP`TIJ}=xmDSv-|dwYAs!^7M|0f`WpCgoK8MhKPuWii(Phi;IkmjE;_ukdTm( zk&%*;l9ZH`m6es2mX?>7mzbECo0yoJnV6fKo1C1SpP!$gprE0lp`xOqqobpwq@<;# zrKYB)r>Cc=sHmx_sj8}~tE;Q5tgNlAt+BDOva+(Xsi?HHw70jnxw*Nzy1KnNHod*Q zzBe%rz>{ zJ~PlZDbzSA)YR0~)z#M4*4Nk9*x1+geuJ+uPhaC*0iJ-BC#0X<*&m z-QH74-e6kZXJX!KVcy=}-&RZCX=C5t-{4nF;AC9j;Nam|OyO%};o;%pT210xPU2in z;#^PSXkX%MUgB(K;^N}tT~Fg)Pvc%t<8EW)Zf4_eXX9{Zlq(WL4&8SLSwY=H}+-X;|my=jdx%=xkc(=;-NhUFqrR>T_V~>gwxu zV(XKP>+9?6cw_8&WbEwh?d|REeP`~SmF}IE?(XjIfokvX@9>0d@T8mY@bK}5Ztrr=MeyWF^yEblK`;ITB6{;!^bhbL(t{AigVIBZxOk|9ssyPK zp(;q#Z8piyk9{*vvOf~&f{*WEAM;_}%&->xr>yj2f2r4ooF)U~H&%vVr0Ii_Gj<95 zGp$Mn2F>bkMq^NP3IM^AU`neB1{cepoPDA1 z`le-=fHFerJ72r()`R2>DhN@{?^dW`n0g14a^4^Bgq)mzs0IK-ia1p~6cW?WK%$y) zD;+L~BnhAt#qmn#C$SA1xa4Z#q`!rNpdkl<(UN8RJu+sI{+*x{1#MpDg^(HX8Q9++ zkXJ>HG1xrq<^r>kfXOQ=7m$w-0||JiyJxv@&yp#KM0b(2j+8#nx^bGv9QYt01qvf@ z^p3VNlMu^BhzynPAQfx^ej`x}l5A41<$V5 z4<=cko)&feJdPr0c&eXYWfuG7$#EITj6$OsDC`Xt*b(AiP6 zqthO_g_0Cs12&t{dx$nR(DS6{fr&B$tW7S!tLohIrKvcz<%wVKg5d~(gz9IbDvO{3 zsG9*Q$jiYkJV^2epv-9scE3z6!`{O0JOQkBc{T?$pZPIx7+E!PK!>Bl`hdx(M{
x~$hGPH#002ovPDHLkV1i$Do4^17 diff --git a/core/img/filetypes/text-calendar.svg b/core/img/filetypes/text-calendar.svg index e935abeee9d..051a32f4e57 100644 --- a/core/img/filetypes/text-calendar.svg +++ b/core/img/filetypes/text-calendar.svg @@ -1,87 +1,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - - - - - - - - - - - - diff --git a/core/img/filetypes/text-code.png b/core/img/filetypes/text-code.png index c0e7590108104033da94a62c93ac28fef9c14122..652ab3566ad53b2b9b3dc6db75e2b5f8a6322f9f 100644 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv5AX?b1=0--4b!Ggn>uyslqplD zPoEBCLr5S44w6M$P6L(llmz(&GcbAj`iHgkP5=Jmr-%UKBcQmQr;B3ju^XPO}WyF3YSCiQrfwu~0To!H4}r#L)CE{JNTcx)HAZ$Cm;5d4jWJ&tF4x@RLhZ zIbYX_8s^46kb0f46$%XQb`HS&44-KKt!K*j`6W@Q*6!7zQDrw2vT)mFo?Urwk@^;`z)yXB_HUlBEF+DBTZ;QQ6 z0b6miVA-$Xt?8=(>`CsV;&HZ1{m2dgZj4O;aJW1FC6%vk$p8oSV_An!BBO?-vw@C{ zwoV-fxI23jzoMglaWnaJ3XjJ_e}8{ASrKaw(C0mXKtR1jhL&PVwXy+jU%w52-|r`x zOtQbelS<(x6HlUs{AA)uw1z5-`9<8VK@{ENEI>3G1waUaloCy-2tam*vS*zkgirtj zRAt5Kl>I;88XhLm-OZ!u!UFbxe2+<5kx#Y}c7qwOK?jK?|DQHRH+<^{-CyQm2; zG(?T6GVt54swz@S4)3V5Us1$dw{(Dt3R~csFQKMsxZUoOMOL#vm)xoVLI`DK zWF#>M9GeorUu7r4$pf~lEZrT_o{ M07*qoM6N<$f}C81Q2+n{ diff --git a/core/img/filetypes/text-code.svg b/core/img/filetypes/text-code.svg index b85ddece9c0..0ff78b6bcf3 100644 --- a/core/img/filetypes/text-code.svg +++ b/core/img/filetypes/text-code.svg @@ -1,60 +1,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/core/img/filetypes/text-html.png b/core/img/filetypes/text-html.png deleted file mode 100644 index c3bbf2bfd91f2ae6bba5fdf38bc8903738164653..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 581 zcmV-L0=oT)P)Cf> zsHv%`s;a81tE;T6tgWrBudlDLu&}YQv9hwVv$M0bw6wLgwYIjlx3{;rxVX8wxw^W# zySux*yu7`=y}-c0!NI}8!otJD!^FhI$;rve%F4~n&Ck!z($dn_*4Ee8*Vx$D+}zyV z-QC{a-rwKf;Nall;o;)q;^X7vlt)=I7_<=;-L_>FMg~>g((4?Ck9A?d|UF z?(gsK@bK{Q@$vHV^7Hfa^z`)g_4WPz{r~^}4?0_v00007bW%=J009CI6X@yfibUD~ z008|-L_t(I%f*q=N&-<7MR!A^!XQdAI*%41_7D9(MEDC8^(c4;m2tRpXI3w1bv-W; z)Oud$Y|cK3B&7?JRFV=&nlJARmh+PU-T=M`GWaIgdBr_4YWqU0V_5 z-UIOVfZvzrJyc~@0EE{CMOIdE4`I_UYJheBin{1;LKNXN^#I+=bpw7X7YQl54q$UJ z0lFP&bY?zqwIn^=Hj-*L$fGk4vz`m!m;k}`W{3DppX1>9CIF7ypY_lt;|%VL4#>ty zdtOvC8p8GfFdQ}3v#R=7bzS|}yMGmNnHgN3ge0sU4OSuf5NN$g%Si|(Et1{=roBR6 TbyKKY00000NkvXXu0mjf^*B5w diff --git a/core/img/filetypes/text-html.svg b/core/img/filetypes/text-html.svg deleted file mode 100644 index 99215d303ea..00000000000 --- a/core/img/filetypes/text-html.svg +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/img/filetypes/text-vcard.png b/core/img/filetypes/text-vcard.png index 6849792dfd24e77b10f02069a402d2ff59d3319b..81e7d3dc3b66c94723577fe371e731eb78b406a9 100644 GIT binary patch literal 439 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMf#sHrXS0MfW|Nr^(=TDtFb<(6s z)2C0LIddkE0ptQ1K<>0@(|~Ls14vGpG6li~vVjaBfQZAnKoJNVt`VXJq70+~tN^G6 zq5zqM$O1`-AVeix5YE{3_55j|qpeDU{DK)6Ie7TQBxPjf6qHnSZ0uazJUqQ45|UFg za`T&8+S)s&&R@A^?YdnD&z!w*>GGAEcOE}`{^I4wpTGYw%x2vSG^N_p#W6%evh-j( z-@yQewu|@gUAZ^qR`vFM-|G#oFZC2I?E80GMP%xIA)YUxbIVK*Yn=A_84#abl9JlE zto`AMuDKt$b05sR;?5jCt65q5;{9UjrN<{s-umP%Crfu%kFlV$r?e8EQP)<^g{#-d oEo@&?ar$=bpW}s3r+smdKI;Vst08!V|!~g&Q literal 668 zcmV;N0%QG&P)K0ZJ|Kte)7MMXtMMn*?RM@UFWNl8gcN=i#hOH52mO-)TsPEJoxPf$=$ zQBhG+Qc_b>Q&dz`RaI41R#sP6S6EnBT3T9LTU%XSU0z;ZUteEfU|?foV{B|}ZfSZpP!|rrKzc@t*x!NxVXByy2Hc6&d$!y&(GJ_ z*W26M+}zyV-QC{a-rwKf;Nall;o;)q;^X7vlt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4WPz{r~^}qcrll0000HbW%=J009CI z6LWi}rlzK*rlzK*t-3L%1Ar{C11Kx7y+wP4&-B$@oy0=O^~@%hx3n*JgS~B33X8MlQklW5@7sf2 zs1k*lb1!6dajI}|CSxtce+y+Dpn^2=)U+iW0$cGy&EEKQg>G^a(Ninzo%hNWa0GVI+8+;j(bW0Ad=^MN#Xo0+axoT6o$iH_Eb_x z8vaAWwEWcv0evI@ZVLo_673ndH9-3#1H=YsXz>T9sHUE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/core/img/filetypes/text-x-c.png b/core/img/filetypes/text-x-c.png deleted file mode 100644 index 2bdb16a2a770230e7adab3350a70f544a33600cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1228 zcmV;-1T*`IP)Q`zQc`wS(MNhX`kW<1a9s&STOVVdS<>+^jCbX~Uz&>ETJf?=3o z?E?u=&#Ccl6KJe`Ac1CRng+*l0`_#ct_z;$gM}LR4aDQ|j!5kz(D1%_w0qaMZ+>?W z+Rb?+0U7~11VISA<~T0!oWgQFtg1SRh=7djqg*Z{olZkhlJrAcr9Vg@SwT7 z3x*>R^krDwH8s5Z%{^S6$RM8%buR*QYjs@TW{?;j!hFSrgT1H8Ah!kGg}{gy%MW7a z=3Tr#nZlWb+!=vpB1O%@_iGlygG2bE=#uafQK?lRR|^o~g9bt8Wth<Ms@3=XyIoh8t=X21&T8#epTKfURufQXhk-PjlGW+N9DNB&SP~ z^y-sIeEf3}e{PwuI1$S{i+iOaUU{Nt&$>ra!h$1$RYE8mE)SZ{EBR z!Hv}tY?msYhuBE}o-I9;5;jL*_I3f5l7mA9&ol9OHhQ4oJe7+-GN+D2V5>&*J@PQhClqN2wPCV zb8PTTuh;SZ^!U*t&^%e>fXR%H8>Jn%(F`g?XyS)bfZf=!g_o@zRCSsSV`y@+03!>i{)aJ33FfeDOLwd_cUXahnQpuZuB!Stw&J8A(pcS^Xw!@%%3QjQo% ztcxDO#j}Gx&ZHG$kPrUT811^NLmflIFoI@;lAzlmk#Ob`9?r&h$<;}gQ}1Y$=zXIb zije+*>H_U0y3!BOMwB)ult4b8rym$WA)*GUVM>y|qkvC&XbV#cyzRa zd^sIid^#e~O&pp4>0B7P=iLTflVSFEt9*-ber9GyTv%98aRMk53L>>ZBH^?pKwppv qedJQa$-wek_Mu%4& - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/img/filetypes/text-x-h.png b/core/img/filetypes/text-x-h.png deleted file mode 100644 index 7b4a36cdbe9e51389769429a2e9a8ae394650feb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1168 zcmV;B1aJF^P)A!(?|S`Fhd4HIoV3BMihAIHgv6nj3JD2`TU9vq{{V?27t{k+5Zo&D#0_x+ zaYLe9pz480q)L>gp-!po5U;;>cV=D=j#Jl8Z0Do=q&e*DjNfN|?>p~Wi3r2GfB$}U zX=%yj6=-*NS6{z=y*xZO7AT+3t8%$qwAP+$aK~{7!|>VY{1`yD+l}KmX4ILpN-0IR z+l{9JSZfiHa|amw_Edmj1wlX@$0((69EUiL@jMS}?cwu4#bWVPP-6gt(+`j1=7(LH z#j&H-OausmfFKA+CX-le@jMTu6jJ>g+1?_GB9i$9qN~@a*XxwaWpcUP`2h?@7>1cq%1!Y6ho8Ch)!mt#I59vro5lBipkKx5beck;z%$3e(@h99_{o_I z_S6oHzO$kbZNM0eo-O~!0XWAk8U!=Opp-&ujfhaI)rhr0VuOth#+W`-7}DL?z_i;F z3wf#olYj=Y79=)^6|A;A{qhd>$u@q#%ZpiTd*<8;|~B{z8)1GA@ZI#A$cw?d;&MtQ;Qfs7^T1foiqN=H@0_TU%7C)fYuL zNI`4}YE8n+Z*k@8Z)j$Vgpt9p+mZos? zCIaMc+@Rfw5P^iXM2)?Zr(k$-CX=C7s~vX0L6?hSgY_)RLO0Yj5egzC=JWKlLfk&2 zHFoS)%>*z_RzQpe0V4{WzLCN~4H=6S#c0M)>_Ds4V(+gH-EPx-vcsGa#0p{rk@3DVs<9dvUflfUS5iOz#LCVl;kS25M)5%>6vXr) zj2-Tf0wRc|pMoj*KN4VgL-)7eSzSnx+*o6IagM!*ewY@7Z)iOi_FjG zF#=*O)<{29XSoIL8<*I9w2gHVJbk=NdUXX6L2C=H2Yw1;ES*k=D2nLzdKe2%CIe2Q ze_KupFx-fiZ+}ef+S@#gE|B@?7QI}STCGOz-FJAmDQJm&-9nP zZ1!x|u+?f21OdM96NVw#Y?d$#aU2KV_X&c4R4PTU*Fz~qCX=DvZj;aF$>;N9!A{i) zhfkojrc$Zkx-Okg2iJ99oZjaz#WR#vHZffHL_i i0DwqF0*(Rv-}(>x&-Db$Jn*Fe0000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/img/filetypes/text-x-python.png b/core/img/filetypes/text-x-python.png deleted file mode 100644 index fbaf9a342f626eba72af7e7a11105739f4f2ec85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1368 zcmV-e1*iInP)lxihzbcrNfC&z^dnAVCvm*q_3ZA<;}BxfCT^V4KFRX>dG^h3-kX{Co)Qsu%Y_RU zR%T~sJ???D+wJ_!nKP~3x;+y$8V%KIwWh7LcXe{danM??-m2dNkR(Z#Wf`}6=KqRP ziX=(00|BhHh{#E}-Y7fB9>UV#} z>34f+5|8aSW-Ndi{LSFTGJ`nYUbQ&5r8yF}G#ZyA38hjAtu@_lmsYDqwOYM90K-ck za_phkpa!4-OBOGYMjf)aOYy|}xc4tkG|3$S1ocO$lyf9)gHu2$7s@4+`vlf)(p&zF zto#gK^QDR7eJB8%#Ynma*%nbRCQpZyry2y6D#|X=IChfuFP~$loFJjc}=A=fVdh$tT$U7~t)fwcSm*bTbhMxOW>+AKj#j8b65LCO!4mmg;M z=f{{-<0_4(671GxZ2c5s&Gw3dBPcic&rY(6h(#O)R;$TRL7st45#?g7Wqo}efT^KI ztOb>0^8vk$A>Q)a%s%-hkh5|52P#j00zlgN4zKeC#rsZ>to=j~-50{y+lOH1Cd3NZ z9IU~0JRX`q!hG-xq1VTC6^KPg1E%I*#IGJFELk!J%*tEwm zd_JCN4~Pg>1SAI(mFWjDzkNd8{gq>nKMUC=LYeN$D&EoOac5s;tJ8seK&e_K-MGAM zBU;9DEua|2DaM^PlLJ^mY>uQI8nukpTu9knMd>T##%KB0KPW7|3(BL=I?Lu-2T+97 zGU@fNG07T!;39d%U~7QWJbSofD35)de-#@+OpbE4tC>clF)~uC)d<57V+^kAVvND} zeRS{!?cYD*!Q(}0Rl%k?nS|gL$9mxQA&>yE4kjOxrYVI&0RXKv#+XrovQwBOrihLm ztT8ClXMMATfB)gZ1W6Sw^SR0T_Y!zJHS!T-SyAvkZC{sgwe` zT|@QMnO#TQPVRyF3m*|h5n5~1EB~SYnt$=G8#Chx5ShK~WUZ@AnCU z0IfBZN(HSoj^hvn0sVfTVzG$1`X#~UMLbV2e{2e6bC$1bYR|oQXX$ucD$Vnpg@pw? z&m)dwJkLW!a0XX+e6h*NN2aL;4r@J^u6m3=u5OI2Atx$IXJ%%YnVH%1f2(yiQUpoM@$L@guN-5 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/img/filetypes/text.png b/core/img/filetypes/text.png index 73080fb3ea02960c42afc2f0ca7eb5a2474a6c2e..13547961c76d9d14ea436ca0b6c19dde2068d737 100644 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa4)6(a1=3TdOqnrb29TVF3epcR z`~{TeC<*clW-zjJe)Hk;7YV`Hyg)HiPZ!4!j_BlshUT8WK0bE=W{>hMS`88kF+8F# yGujQU6oO;~*kV{bxmJnJ7MbP2a>J-anc*Lg%Ce6UzT1HYFnGH9xvXuz*=jZ3>=;-O`>FVn0>+9?6?CkCB?e6aG@9*#M@bK~R z@$&NW^Yioc^z`-h_5J<*|NsAsvZUAm000qmQchC<0Rj&bb9<(yrlzK*rlzK?x-qBZ z0003aNklT26ztN-sf-(K7q36MR1M_BGOKAVz=k- zf9t6Nm|054?STrwJgLH5o=*T|UjQ6OlOv#{AZIX<5dgwl6SWX^po!F1^F&BQcu=B1 zl%NEqBWB@{cNiC9n?b>!_n(zaCQtk=*34sE)cnU~%YB)%E*2kGUC(`NBM!oxxdW zoxN9sm>YmL@sOGXD+5!~@WwLlbqd zQ-7xi%bzjG|JS~%3xFN~1x%_7pZCxo0cxU(0O^Z+l$~!4SE0M$;JnTN0000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/core/img/filetypes/video.png b/core/img/filetypes/video.png index a5793d6eb10fa256e91cdd28052fed782427f7c8..5604a4a1891236639fcbf7de826330e45418bf65 100644 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa4)6(a1=7=SfKrSSCI}oj!1&Ny!8k%>0Z*S8tHxsH6HciI nmds$iu+>>IM?hOh!hnIH(?%eb`(G|EP&b38tDnm{r-UW|a8)<1 literal 1252 zcmV;M6y>@XU8#%J$^fGx9z4(>NM`{QRUO?&PFAl&@2OwXw0$ znwy*3jZm-GJ?aQ4UU%LiDeNkb(-O_vN_m&sr_@KEZiHRr4OL-_? zrUt6js=+xw!5BM1EyeU+Fs=|H0tVa(o*#1?a>w0U?DSu*d}(#{}Sd7xHEV&>l5SvlM~is0e9ITeoh( zy_4@l-wS8(ogwXK2@z79E<~Ov!aUxLfS#V7RJBs91PDnO;1bv)4?*wg=iun{EcBdu z7MDdW4Wn6yOhF1}aS`V6W(3%_ovK!fRSl@B)_lOtGH|;J{jaAL=e+nc* zFF_t}Mu25mscNM-El9?vhk30(ZPk##iXU2iWF0ex0jDVe;om90_91Fl%B^}6nT-*h%mK(cJ z#M^BbKu5KzS!%K{>~fVF1{m1!_x0?Yig>$SMyYD0INk+8y9P>Rh2y}l(;vg-7hi(y`32~+ z$_S*w<5!-VdP^4Z?)@&H*&{-9;P%g}(ERoi{CN6#xN+%wIAD~ZzhZ(ZxD=V(0m;i~ zPj^9HwX#4F(uC$-9*4CLFM{nka2R7j`b**yk>KG0{qP7*;T4p?Fb;F5)+kay4jh+JlZ z!^+^{1r)H7BxZ<|19F=R2`?;x%T4^w*xx^*yfd4Kh|nRB7+zK_E2qI#pG#n6DSTgd zL0+|bl#r_=Zj_uy2^C!479t(PcOEzYon7FN1I$z|A43!}Sw)W5vLdW=9q1`Xz;UN$Q4n;So)xle(e6awu - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/core/img/filetypes/web.png b/core/img/filetypes/web.png deleted file mode 100644 index 33063212466ca53e7c562f723864f336d3b21b6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2136 zcmV-e2&eanP)6+Scj^sc>LuV3*qZtVC`+Bl$urXdKCmbNssDww26N(qAC&h?+uCLZm=S;s!rRNSzpmJp795Bz6+N*7ok~%q~!*eB;%_jay&;<2r(MjdTB30b71?xbn$g z{^{kf?s{u5yU;Tb$`5qrhW!U~Bf*1(Rizz~%5Y!vua5Q6GxY5LRKVsJ5B!i*;@$b# z{L{X??4`YzdJ9fpIG5Ab)8lFDKI6F<7emqfvZ7FZL;W2MwNK~dWOY5U>)^BhwSY}O zd$ZyzyAHftR2bf&dHn?^2Zo_PCPOk(2BM~dL2n1LK=%3|sxuf6ROk^5fJIfsWs56z zZ2b8fr|-UR{fZAI;PL18ZwiKj?-p0rfAXrHl{Gvgg30laU0DnA^ceVyN}zP@BT(`1 zdhiz%1IKd!90w+F(0647hGlQS&uc4cKC$ZUho0H_&HqTirXTOA2zdQ3x{9kyE=FaD z#RQONr=W288qlRUXkr2ag=OH&%>&K^aCv;VrRYr)lvos>5n+0A94@mkgsMNDZ^Wl} ze(Fox8$PfA&BOiPUtC!-JR^aMi$#08Ku?M=e)4UY`ukroMh?W0_dtsaz!V)!9c{-H zfMJ3!CjwbT<)AAvMEkqp%!%U=Dk{liF8IR-67blMTAs}K}t9|_TN5kn9dEZh%PL3M4du!@x~N15-tE)v)GB#CTUL1dFSn zNwnSs zmp>b_BBhX1(EtqRnQGh499Y*lNB0yV28odY5Jm<;ymkqq=R08XY#RvI1|b%Yqj>Gp z3krB>>yC)q69|hbj0khDCSq1)7cBcM6g94eoXR^b0cg${1Ns@jF5Clk20J(m5dC;;#B+2q<> zFbDSEN<0Slc*dYIU|2zbl|E*rkBT@Ey#c=PBHrMQrSnsu8s$231$3v9y*WkT35H>^ z=N*uvW484Rkj@pO#HOLTt^vOGz)GkNIppl-sL5Dc?kpc~@{8vS&~aCh#fAf{`cTC( zD7^b~n2tDhzX_Q7M+XR_14uNpfB*vp=Uc_Mq3MgT^$TmDA;Q_@GfbCa4D&?YE?w~^=9a2k6=obe zZD^7JQ|H>TQ=YQ7pd)~uApx4Efubm|eA!*_)RT|G>N~KYF*vu^EA)087+bIpAn7qv zMj|DJkTcth9B})?R`lE9OY1C{`gck!vw z8w>?7C22!dti2vAuCsDXX<&1l@P*6g2({0Tv;%1oGP+t?S^`gfeWUrv>gwuk+qU@@ z6wv+FE2B(Ly=tb$Byxet$qYCw#!&fkB(S$Bb6fyC=8SX=P%4;_5pb)Ba5&6u+^}JJ zBogUB5yAHf;5g2WLsrkhms>!K4lr53KA*I}WIP42n{h-=MM|9x$6#R%c(d~CXHw2{ zj({|772)xC+)YhQD^bKr6cOefa@;H6b>JBv?A~swHzv~2r$ta*aH!eT73+w0dxDNb zQbr^dp+VK|I6&84uNQcphg2#BaXb$Q4Gj(TKA*3fpOXsS+VqHt-p&bW_WBFVxIRfv zWC&!@7DCbIRbltU`bdcuu{F+dfXI=6BDNy$?d_HJ?%lh8&z?Qs#&L67Tiat;ppW1B zL1L!I;m+S49>3WBgl>#qFx2UkO_GFAVJ!r6E5PmY&xstr7tJCr@=5BO@aU zMP6H58_dnkttAor_U${2LRwo|TF#^e=yRZ@$LZmo(f%W^ZBB}#ExH+vGBtr|P{7Um zGQ^q4Gbu2@?RI0teQNt(-ud;36DOuf42fuLY^>RUML37cE<)2fu0TPk4rB)@MDj}K z{+989&do`6;tiFXy{xg>sAkLxx+Z7@x~4h0$8$^?8X8hsTaO*WD0iX*dnYF+bxK1` zO-*i9Rn_yv<#68I1*ZKY(xd~)frv=NFP|N}(!Te(p<}N-IDX;iy4b||Euwh&y9BzX zIl3prru8F7jC>kts2(Iqg8KUUCC$yv3mnHch3E*1Jb@6Lkq~zf z6UGOxPM&W&b-nA*Ap%{~9NiN|@g>ah=Jb14uU?(P-xHx z5J`mKkk9@*?B2cmr?FUUhTd`B)iD3hwYIjlA3b{Xz5f3G-=I60!|0#Z{>?klr>VRE O0000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/img/filetypes/x-office-document.png b/core/img/filetypes/x-office-document.png index 6c0c4f8c228afd8c6cf5454f687edbaf8b09907e..861ac965a7d9e2b247459cc64edb4e44ad13f712 100644 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa4)6(a1=8+oUwf>2>9P8S=jvC; zD6jccFi@JKB*-tA!N}72&4w-{T^vI=qLULEntS^C_}m4UJ<7LeHApDL z@QA+5Xg9P{2$B(Ci(&EPS|vJLWR?fZ4WkxihJQRN%RWZ>W3 BHW2^- literal 856 zcmV-e1E>6nP)5o&7V>y8qVv|5Z6GHxegAUycv+26f((f?KSr1uuHr;01&r&F~B{(Tv zC*8JEdm0(`}Tvc{~0_D zzc1e0MSfh@N|jH*7`O=`6ws1)WjAmenaLM_836z>Q6)k>e)075lpqM` zcDs0)oPVquSd07WiS}v`#$}CpM`}5Ha9oN zh!j_VNC#p-5YqSJ3e19Z1&lGp1dyoz5dm8RF=8#GQLopzy1Js(YO%b$oJ*vTfS8Dc zm}nZ(C=%2>uzf&;FdPz5lPi!#5xMeXC?gSO2~5*KkzdU017bi_ao|}{N`&zQ7y~Lp z;Os0~jIr3#NT0>ezVEZOwKa@eR)nD>709+=XJ@DIEA0=O+lcHjY`5Dq8Vx#~4wXs; z$8i!X)>_l)bSx`AI5-$1QcNK60f}ExnP6*cYq`PV^GQ}+ia_FmCVsay0Mm`A*=){l zM23+QW-o4UZzs=6DOOfi#_lSmXf~T@t*wORTM&yd1QZw}=wT1E)>gtS;$g4o9G0YQTwgSHIssa$ z!*LvTcXuZenob}b5ilaj7|yy4(@D!~z(h$S9~c+e$;k;Ys=#0{pjNAKeSHm#kLLRN zIzbQ=lAN#&hr57CjIsC+4-X3ij)lrppcDZiwGD~IGgIC|GE)g?%x%?EG%7AAs4Xty zVE1lToJpb#>_qVUB(E+^t@cEN%H}m1*;^L!HN{dLsMx{%mA{(n`iQOS? ifh$QRRg-%2f8i&u-vqRd5o#C!0000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/core/img/filetypes/x-office-presentation.png b/core/img/filetypes/x-office-presentation.png index b129c76de6068c2ca039880dd26f9a17b8ccd883..fbe941e5c3f2fcfb3fa97ae5104948652c867bb0 100644 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJe}GSjE0F#$Egp_CxzF_ig;+|0 z{DK*tfB39#_Gk%^uk7jK7*fHQtiWWjS%J}Q0RuPJ0j-8L^V67G?jCG8ldg1VJ;RB+ WjFm--Tl0a+89ZJ6T-G@yGywqo)F>JN literal 1028 zcmV+f1pE7mP)-+orTYxU$RAJ*C)^<-$PW%#SGvn2FpSvKs@`@Av zC4T+nn|C<(-60}_r%#`D0stEiz2+BRBTIDe=jio%Jb3V+WIT!@27>{r zisyMnvx?)GtE($otybaGYy@J()PYM=V3|lBJ$h6!GHo>X0AMniFc=K*eZS;oj&{3U zTCb|JDKMu918{rWY&?^k}W)oLs+FP8{RJ5cliG*1Db{=x)?!y&3V_kLJg zTf;dwLwcqPOfw+@l9l1hmoK@wxdEWl=`a`!Xf~TT=eWMUW^ZqgD2nD955th9rKK6~ zE33d%K{Jt%=4fYUr?hc>eSPMjTw%wNC~)qG+;v7l+5V$dZmrinpjy`!ORH55a0JJb6thJEb|C>kZM3P66vr) zskeJ871RtWzyIRF%!mO@bhpyTRy>z218jZ$#5m*#O1Vlu>{p{2D#~*$!b&ZcUez{iyBJxT^ yM6&W|03qoQ*?$28A~PGw`{w$t;N8CDe(^URxCs@EbDL2B0000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/core/img/filetypes/x-office-spreadsheet.png b/core/img/filetypes/x-office-spreadsheet.png index 9efe6f29501a07539a1b855ed89850fcd83f404e..bf22ca23f095143043bdd68a98f7d4b892376a74 100644 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa4)6(a1=2J3`p($nGkdS^ti687 zNP;DD4N#h+B*-tA!N}6-^@q=2b}Z{+0g4%Ux;Tb#L?Q@u}sQrbc`6<0Kk4}1vkep31ryfkME}cQwv%mHOtdjEGBI&7&APt zHmHQ1)b2WgU@+LRpp#Hyfr{u!fUfIsxm-#G9RB2N1rS2Ccs#z7NF+`v?cS`vLkQ6r xWBjcqqAEfN0dU+ZOktP+elwvdQSEiF@driO)bkoTregpA002ovPDHLkV1jx`LQwz! diff --git a/core/img/filetypes/x-office-spreadsheet.svg b/core/img/filetypes/x-office-spreadsheet.svg index aae8f3c95ca..aac8c4e3f73 100644 --- a/core/img/filetypes/x-office-spreadsheet.svg +++ b/core/img/filetypes/x-office-spreadsheet.svg @@ -1,63 +1,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/core/js/mimetypelist.js b/core/js/mimetypelist.js index b4de98247d1..e49ace6df73 100644 --- a/core/js/mimetypelist.js +++ b/core/js/mimetypelist.js @@ -9,23 +9,26 @@ OC.MimeTypeList={ aliases: { "application/coreldraw": "image", - "application/font-sfnt": "font", - "application/font-woff": "font", - "application/illustrator": "image/vector", + "application/epub+zip": "text", + "application/font-sfnt": "image", + "application/font-woff": "image", + "application/illustrator": "image", + "application/javascript": "text/code", "application/json": "text/code", - "application/msaccess": "database", + "application/msaccess": "file", "application/msexcel": "x-office/spreadsheet", "application/mspowerpoint": "x-office/presentation", "application/msword": "x-office/document", "application/octet-stream": "file", - "application/postscript": "image/vector", + "application/postscript": "image", + "application/rss+xml": "text/code", "application/vnd.android.package-archive": "package/x-generic", "application/vnd.ms-excel": "x-office/spreadsheet", "application/vnd.ms-excel.addin.macroEnabled.12": "x-office/spreadsheet", "application/vnd.ms-excel.sheet.binary.macroEnabled.12": "x-office/spreadsheet", "application/vnd.ms-excel.sheet.macroEnabled.12": "x-office/spreadsheet", "application/vnd.ms-excel.template.macroEnabled.12": "x-office/spreadsheet", - "application/vnd.ms-fontobject": "font", + "application/vnd.ms-fontobject": "image", "application/vnd.ms-powerpoint": "x-office/presentation", "application/vnd.ms-powerpoint.addin.macroEnabled.12": "x-office/presentation", "application/vnd.ms-powerpoint.presentation.macroEnabled.12": "x-office/presentation", @@ -49,58 +52,54 @@ OC.MimeTypeList={ "application/vnd.openxmlformats-officedocument.wordprocessingml.document": "x-office/document", "application/vnd.openxmlformats-officedocument.wordprocessingml.template": "x-office/document", "application/x-7z-compressed": "package/x-generic", + "application/x-cbr": "text", "application/x-compressed": "package/x-generic", "application/x-dcraw": "image", "application/x-deb": "package/x-generic", - "application/x-font": "font", + "application/x-font": "image", "application/x-gimp": "image", "application/x-gzip": "package/x-generic", "application/x-perl": "text/code", "application/x-photoshop": "image", "application/x-php": "text/code", "application/x-rar-compressed": "package/x-generic", + "application/x-shockwave-flash": "application", "application/x-tar": "package/x-generic", "application/x-tex": "text", "application/xml": "text/html", "application/yaml": "text/code", "application/zip": "package/x-generic", + "database": "file", "httpd/unix-directory": "dir", - "image/svg+xml": "image/vector", + "image/svg+xml": "image", + "image/vector": "image", "text/css": "text/code", "text/csv": "x-office/spreadsheet", - "text/x-shellscript": "text/code" + "text/html": "text/code", + "text/x-c": "text/code", + "text/x-h": "text/code", + "text/x-python": "text/code", + "text/x-shellscript": "text/code", + "web": "text/code" }, files: [ - "text-x-h", - "application-rss+xml", "video", "folder-drag-accept", - "application-epub+zip", "folder-public", "package-x-generic", - "application-x-shockwave-flash", - "text", "folder-external", - "web", "text-vcard", "application", - "image-vector", - "database", "text-code", - "text-x-python", "x-office-spreadsheet", "application-pdf", "folder", "x-office-document", - "text-html", "text-calendar", "x-office-presentation", - "text-x-c", "file", - "font", + "text", "folder-shared", - "application-x-cbr", - "application-javascript", "image", "audio" ], -- GitLab From 2a935f1b47ed27596ac4a6d8bf5fd911c766d453 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Wed, 26 Aug 2015 19:00:42 +0200 Subject: [PATCH 055/783] move log in button into fields and use icon instead of text --- core/css/styles.css | 30 +++++++++++++++++++++++++----- core/templates/login.php | 9 ++++++--- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/core/css/styles.css b/core/css/styles.css index cad407b52ea..1f41af211c5 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -456,11 +456,30 @@ input[type="submit"].enabled { padding: 13px; margin: -13px; } -/* quick fix for log in button not being aligned with input fields, should be properly fixed by input field width later */ + +/* position log in button as confirm icon in right of password field */ #body-login #submit.login { - margin-right: 7px; + position: absolute; + right: 0; + top: 49px; + border: none; + background-color: transparent; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=30)"; + opacity: .3; +} +#body-login #submit.login:hover, +#body-login #submit.login:focus { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; + opacity: .7; } +#body-login input[type="password"] { + padding-right: 40px; + box-sizing: border-box; + min-width: 269px; +} + #body-login form { + position: relative; width: 22em; margin: 2em auto 2em; padding: 0; @@ -539,10 +558,8 @@ input[name='password-clone'] { /* General new input field look */ #body-login input[type="text"], #body-login input[type="password"], -#body-login input[type="email"], -#body-login input[type="submit"] { +#body-login input[type="email"] { border: none; - border-radius: 5px; } /* Nicely grouping input field sets */ @@ -783,6 +800,9 @@ label.infield { margin: 24px 5px 0 16px !important; vertical-align: text-bottom; } +#body-login .remember-login-container { + text-align: center; +} /* Sticky footer */ #body-login .wrapper { diff --git a/core/templates/login.php b/core/templates/login.php index f942e02dc86..0cd76b2b372 100644 --- a/core/templates/login.php +++ b/core/templates/login.php @@ -56,19 +56,22 @@ script('core', [

+ + t('Wrong password. Reset it?')); ?> - - + - -- GitLab From cea3247d49e2aa0bdf49303a9bffadfb36c44898 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Thu, 27 Aug 2015 21:02:00 +0200 Subject: [PATCH 056/783] show feedback spinner for log in process --- core/js/login.js | 24 ++++++++++++++++++++++++ core/templates/login.php | 3 ++- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 core/js/login.js diff --git a/core/js/login.js b/core/js/login.js new file mode 100644 index 00000000000..33ec868cb23 --- /dev/null +++ b/core/js/login.js @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2015 + * Vincent Petry + * Jan-Christoph Borchardt, http://jancborchardt.net + * This file is licensed under the Affero General Public License version 3 or later. + * See the COPYING-README file. + */ + +/** + * @namespace + * @memberOf OC + */ +OC.Login = _.extend(OC.Login || {}, { + onLogin: function () { + $('#submit') + .removeClass('icon-confirm') + .addClass('icon-loading-small') + .css('opacity', '1'); + return true; + } +}); +$(document).ready(function() { + $('form[name=login]').submit(OC.Login.onLogin); +}); diff --git a/core/templates/login.php b/core/templates/login.php index 0cd76b2b372..50ca6febf08 100644 --- a/core/templates/login.php +++ b/core/templates/login.php @@ -3,7 +3,8 @@ vendor_script('jsTimezoneDetect/jstz'); script('core', [ 'visitortimezone', - 'lostpassword' + 'lostpassword', + 'login' ]); ?> -- GitLab From e4d0a69126430210fc59f945e73973dd18b9237b Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Thu, 27 Aug 2015 21:23:45 +0200 Subject: [PATCH 057/783] position and style remember button on log in page --- core/css/styles.css | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/css/styles.css b/core/css/styles.css index 1f41af211c5..bf6ca519146 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -758,7 +758,7 @@ label.infield { margin: 35px auto; } #body-login .warning { - margin: 0 7px 5px; + margin: 0 7px 5px 4px; } #body-login .warning legend { -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; @@ -797,8 +797,10 @@ label.infield { padding: 10px 20px; /* larger log in and installation buttons */ } #remember_login { - margin: 24px 5px 0 16px !important; + margin: 18px 5px 0 16px !important; vertical-align: text-bottom; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; + opacity: .7; } #body-login .remember-login-container { text-align: center; -- GitLab From 8fc7a3dc80edee0e4ac4347dfb019e783876c860 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Thu, 27 Aug 2015 21:29:29 +0200 Subject: [PATCH 058/783] use simpler logo for log in page --- core/css/header.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/css/header.css b/core/css/header.css index 5630f96953f..369750251c4 100644 --- a/core/css/header.css +++ b/core/css/header.css @@ -70,8 +70,10 @@ } #header .logo { - background-image: url(../img/logo.svg); + background-image: url(../img/logo-icon.svg); background-repeat: no-repeat; + background-size: 175px; + background-position: center 30px; width: 252px; height: 120px; margin: 0 auto; -- GitLab From ab8727493037731162563632bd05870c610d202d Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Thu, 27 Aug 2015 22:23:08 +0200 Subject: [PATCH 059/783] Use certificates that expire in 10 years :speak_no_evil: :speak_no_evil: :speak_no_evil: --- tests/data/certificates/badCertificate.crt | 31 +++++++++++------- tests/data/certificates/goodCertificate.crt | 35 +++++++++++++-------- tests/lib/security/certificate.php | 15 ++++----- 3 files changed, 48 insertions(+), 33 deletions(-) diff --git a/tests/data/certificates/badCertificate.crt b/tests/data/certificates/badCertificate.crt index dcb1895fbad..c61c1e6aec6 100644 --- a/tests/data/certificates/badCertificate.crt +++ b/tests/data/certificates/badCertificate.crt @@ -1,13 +1,22 @@ -----BEGIN CERTIFICATE----- -MIICATCCAWoCCQDNdmb4pJrUeDANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJB -VTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0 -cyBQdHkgTHRkMB4XDTE0MDgyNzA4NDg1MVoXDTE1MDgyNzA4NDg1MVowRTELMAkG -A1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0 -IFdpZGdpdHMgUHR5IEx0ZDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvrMe -x5D45HVMV2U4kqTU0mzHAihHT6r+OtO6g7S9yIlJZGGVcEet6An78Ow7aYM141eI -Jfbvqql7OIblHXSw7mvkw4bOQ1ee5lmJYOYCgaMNJ6mBLJfpK9xwidb0ZvhWOA8P -DLIiBKA3T5ChXCzilD5GF2+H/BXBE9lL9tuDjM0CAwEAATANBgkqhkiG9w0BAQUF -AAOBgQCJwfJe7j+aNkopw+P8uxobfOnMWU9XC4Pu+39TVLeakeSqu2Y8vJSHmkjF -WK3VXAJr33Eul5VP/3SWGwuRPd9X4i4iLh1gJfYvi9MJf1lQNYncGCM+xtdrNu2O -u0yexkOBRrapDYjcv58BiOaFgvFLquKvtVj9HlcYRfwfM77uKQ== +MIIDtTCCAp2gAwIBAgIJAJ9c5xX3Bf7cMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX +aWRnaXRzIFB0eSBMdGQwHhcNMTUwODI3MjAxOTEzWhcNMjUwODI0MjAxOTEzWjBF +MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50 +ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEApYxB04E1rGUCopazf8PsW+3EYrX8J1Ze4g3jRJEmzqHLB4+T4h45LwLl +D7OLJCLdYA8sfEruInokNV1oUBGDwBWdZA1w7d4o7Wgwiz7WE0FQwkA7YpvtKK2K +Xvv5wltdUzI+WpbfhHzlg8XIDCPA0ayWx2CDyqsHMXYNOvov1vPbIASF0nBGnRSK +5Eu7KUKK5UkO8+G6RqBwxQkd/tB2GV68npls++QzA0nf3IIHcc+yNQqaMnb5CVxg +z2i98VuvCPzYY/EWHkIGdSSKRqRG4sqRegb6d/qf46NfjVYLziLfsFGFH4fLVy6n +IxkP0gdnoTGu8K8H6wm57GViGLLsPwIDAQABo4GnMIGkMB0GA1UdDgQWBBRrMYy8 +SOqiMiVdo/dfyN6yftK+jzB1BgNVHSMEbjBsgBRrMYy8SOqiMiVdo/dfyN6yftK+ +j6FJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNV +BAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJAJ9c5xX3Bf7cMAwGA1UdEwQF +MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHargAErj8TAhMfozjgqRihCSOIO5DX7 +W/7mBImP6B76ctP+PWzEaGrOPO81WR5apZP72cwnXD6WABKd1YhMSyr2NI++y5jP +c3KF/3MpGu4ZYV39JUVpfeq5Fzu9d9C49tj384vljixsxeaCUKuZYqyPuHeGr14u +7UytsqYORRy/rG4xm0mhk/srOzKJlRenSc9QiWH2Mxst55+cj7zXXFG54N7rI3UU +9e4Lc2NHQLv3Xv6FunC9mB/AUuEcI6XS6CqNyzAtPAvbO6MZGwUft/S/2TAyqJB0 +VsXK3j3X8DJCwruNLGA3Q/TAYHqrElYg8N4b6w4LD91WbrRyWvkCXmM= -----END CERTIFICATE----- \ No newline at end of file diff --git a/tests/data/certificates/goodCertificate.crt b/tests/data/certificates/goodCertificate.crt index 4a5d7bd32fe..4072c8db2dc 100644 --- a/tests/data/certificates/goodCertificate.crt +++ b/tests/data/certificates/goodCertificate.crt @@ -1,15 +1,24 @@ -----BEGIN CERTIFICATE----- -MIICazCCAdQCCQCySF7HjQD78DANBgkqhkiG9w0BAQUFADB6MQswCQYDVQQGEwJD -SDEPMA0GA1UECBMGWnVyaWNoMQ8wDQYDVQQHEwZadXJpY2gxFjAUBgNVBAoTDW93 -bkNsb3VkIEluYy4xETAPBgNVBAsTCFNlY3VyaXR5MR4wHAYDVQQDExVzZWN1cml0 -eS5vd25jbG91ZC5jb20wHhcNMTQwODI3MDg0NTUyWhcNMTUwODI3MDg0NTUyWjB6 -MQswCQYDVQQGEwJDSDEPMA0GA1UECBMGWnVyaWNoMQ8wDQYDVQQHEwZadXJpY2gx -FjAUBgNVBAoTDW93bkNsb3VkIEluYy4xETAPBgNVBAsTCFNlY3VyaXR5MR4wHAYD -VQQDExVzZWN1cml0eS5vd25jbG91ZC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0A -MIGJAoGBAL55lB4RvU0pTyh7YsLCxPBq43xxkRZBxfZENoflCIUsBo7/mXNz2zVO -476oQ4L47heUOX3j8kemOgPmWEqA34JB8rusijCy5WqFBLnm4HsRLa66i+Jgd+Yl -QhcKvhGas1K/CVTG4oSLoAmA2coZUL94uxnRtd8aluflHMNGApIlAgMBAAEwDQYJ -KoZIhvcNAQEFBQADgYEADo08zWdOtIvCKFDnLbzRwIjSYTlAtQtQaULv7KQe3qIn -iaFAi6fAynHfdC8/2tvmSeniw0OZBkrfVGIVtUbwCSrljNSUY/lWrUR0pE61lb4r -DpX0JZjlk48XEaErRVDfu3wq6n/2nYg6HnaLOPwt8OSYYrxzvXlFPrKBH3q6R+M= +MIIEADCCAuigAwIBAgIJAN0NPgU09qt9MA0GCSqGSIb3DQEBBQUAMF0xCzAJBgNV +BAYTAkNIMRIwEAYDVQQIEwlTdC5HYWxsZW4xGjAYBgNVBAoTEW93bkNsb3VkIFNl +Y3VyaXR5MR4wHAYDVQQDExVzZWN1cml0eS5vd25jbG91ZC5jb20wHhcNMTUwODI3 +MjAwMzQyWhcNMjUwODI0MjAwMzQyWjBdMQswCQYDVQQGEwJDSDESMBAGA1UECBMJ +U3QuR2FsbGVuMRowGAYDVQQKExFvd25DbG91ZCBTZWN1cml0eTEeMBwGA1UEAxMV +c2VjdXJpdHkub3duY2xvdWQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAlxdUFrwhvT+Exp78Nk0A8Zpfi9/XoLyQkKWH162HX++mxtGXrFKAl5PT +fKRAv0VqY8hincT+6AlzQkdtiOi5OSVFJpeubtSKrShJQyDKmGLlDntanfLc69GT +EhkznHmA8AeQMK/NApQpOSC+nmdxpu1aKk7QkSYfpmZ41HF8zKWJTyXzFPZGKw+l +YxfzIxmUMIIZvfeWE3hq3qlJcS+KO8NcCHEpoiVvZp7PpfDTnyOQVjSkWg55c4j6 +cqNgJ93WTOTOE+3D1XF43Oo+0VQivJn7/tQmIOAg+YyL3Sjmzjb8sP0ksx17vpLO +Z73UShJw5AGtoaS4oQkSd/+qYBwQMwIDAQABo4HCMIG/MB0GA1UdDgQWBBSG7JAe +KoR82sQ60QhMNWdU4qY6YzCBjwYDVR0jBIGHMIGEgBSG7JAeKoR82sQ60QhMNWdU +4qY6Y6FhpF8wXTELMAkGA1UEBhMCQ0gxEjAQBgNVBAgTCVN0LkdhbGxlbjEaMBgG +A1UEChMRb3duQ2xvdWQgU2VjdXJpdHkxHjAcBgNVBAMTFXNlY3VyaXR5Lm93bmNs +b3VkLmNvbYIJAN0NPgU09qt9MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBAJL9LKzWSJCTG0r+pNXw6Xy2DW9xbi3YsUeelkMKMqurmiH59P90juOJQgIC +B1Jcn/U0rzpJpolI3jJNjHzs/kI4MDkzcKGV84Pqwj+PSdMFK3OCWH/J81lUhrCj +H3yguZ/JpAisInVeBqg6lRf0X+S8jJIp4ZP2XZJsX70XgkRsEaC9TrlxtFsm839t +WhroMb25Njm9eAdSYrx5PFDwN8TtJlb5Ve3uZL8D0uBv+p0kWjkt1TrDk2x78F6b +5ExmE9+APc0gcLtSVwIGX6FDXOcOA8ndkp7p4K0CDnMZfFAU0oKxvnDxehrVKQEL +os/cq7EKmmsY/rM0uJ6L0ka4WUk= -----END CERTIFICATE----- \ No newline at end of file diff --git a/tests/lib/security/certificate.php b/tests/lib/security/certificate.php index 7fc8bbbdf25..81d159ebd52 100644 --- a/tests/lib/security/certificate.php +++ b/tests/lib/security/certificate.php @@ -61,29 +61,26 @@ class CertificateTest extends \Test\TestCase { } public function testGetOrganization() { - $this->assertSame('ownCloud Inc.', $this->goodCertificate->getOrganization()); + $this->assertSame('ownCloud Security', $this->goodCertificate->getOrganization()); $this->assertSame('Internet Widgits Pty Ltd', $this->invalidCertificate->getOrganization()); } public function testGetIssueDate() { - $expected = new DateTime('2014-08-27 08:45:52 GMT'); + $expected = new DateTime('2015-08-27 20:03:42 GMT'); $this->assertEquals($expected->getTimestamp(), $this->goodCertificate->getIssueDate()->getTimestamp()); - $expected = new DateTime('2014-08-27 08:48:51 GMT'); + $expected = new DateTime('2015-08-27 20:19:13 GMT'); $this->assertEquals($expected->getTimestamp(), $this->invalidCertificate->getIssueDate()->getTimestamp()); } public function testGetExpireDate() { - $expected = new DateTime('2015-08-27 08:45:52 GMT'); + $expected = new DateTime('2025-08-24 20:03:42 GMT'); $this->assertEquals($expected->getTimestamp(), $this->goodCertificate->getExpireDate()->getTimestamp()); - $expected = new DateTime('2015-08-27 08:48:51 GMT'); + $expected = new DateTime('2025-08-24 20:19:13 GMT'); $this->assertEquals($expected->getTimestamp(), $this->invalidCertificate->getExpireDate()->getTimestamp()); $expected = new DateTime('2014-08-28 09:12:43 GMT'); $this->assertEquals($expected->getTimestamp(), $this->expiredCertificate->getExpireDate()->getTimestamp()); } - /** - * Obviously the following test case might fail after 2015-08-27, just create a new certificate with longer validity then - */ public function testIsExpired() { $this->assertSame(false, $this->goodCertificate->isExpired()); $this->assertSame(false, $this->invalidCertificate->isExpired()); @@ -97,7 +94,7 @@ class CertificateTest extends \Test\TestCase { } public function testGetIssuerOrganization() { - $this->assertSame('ownCloud Inc.', $this->goodCertificate->getIssuerOrganization()); + $this->assertSame('ownCloud Security', $this->goodCertificate->getIssuerOrganization()); $this->assertSame('Internet Widgits Pty Ltd', $this->invalidCertificate->getIssuerOrganization()); $this->assertSame('Internet Widgits Pty Ltd', $this->expiredCertificate->getIssuerOrganization()); } -- GitLab From 589b066c4cc4bd44539e2257b85f674f4832a140 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Thu, 27 Aug 2015 23:09:32 +0200 Subject: [PATCH 060/783] restore behavior where favorite stars only show up on hover, to not clutter the interface so much --- apps/files/css/files.css | 4 ++-- apps/files/css/mobile.css | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/apps/files/css/files.css b/apps/files/css/files.css index 4a56490fe0f..25a3df53050 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -616,13 +616,13 @@ a.action > img { } /* show share action of shared items darker to distinguish from non-shared */ -#fileList a.action.permanent.shared-style { +#fileList a.action.permanent.shared-style, +#fileList a.action.action-favorite.permanent { -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)" !important; filter: alpha(opacity=70) !important; opacity: .7 !important; } /* always show actions on mobile, not only on hover */ -#fileList a.action, #fileList a.action.action-menu.permanent { -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=30)" !important; filter: alpha(opacity=30) !important; diff --git a/apps/files/css/mobile.css b/apps/files/css/mobile.css index c5507a1e268..0641304d211 100644 --- a/apps/files/css/mobile.css +++ b/apps/files/css/mobile.css @@ -43,6 +43,14 @@ table td.filename .nametext { #fileList a.action-share span { display: none; } +#fileList a.action.action-favorite { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)" !important; + opacity: .7 !important; +} +#fileList a.action.action-favorite { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=30)" !important; + opacity: .3 !important; +} /* ellipsis on file names */ table td.filename .nametext .innernametext { -- GitLab From 49140865006046e8aaa7d861de45c06a2d6227b7 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Thu, 27 Aug 2015 23:16:53 +0200 Subject: [PATCH 061/783] fix png fallbacks of triangle icons --- core/img/actions/caret-dark.png | Bin 151 -> 128 bytes core/img/actions/caret.png | Bin 147 -> 127 bytes core/img/actions/triangle-e.png | Bin 176 -> 149 bytes core/img/actions/triangle-n.png | Bin 147 -> 128 bytes core/img/actions/triangle-s.png | Bin 151 -> 128 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/core/img/actions/caret-dark.png b/core/img/actions/caret-dark.png index 8f25a9bbb4385c6e5f12fe25d1429638c51241ce..97c64c6a7203c89f8a0074a13bb53bb5a1d319ce 100644 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJe}GSjE09J8{(R4Sfqa&dAirRS z@`etpv)y7qzKo}fV@L&K@&fsU6h`JW6TvhS(=#h}&6pwaf|EgYC4=M7mb_CSb39%B KT-G@yGywoK&l{fr literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyLIFM@u0R?MJkXY01QcQ|3GxeO zC~xTK+|;q=GEhL@)5S5Qf-za5CPBnt(;@~jCaoEqGY8UItKzr6kBN zn4!F(!|H6e7?3aR>Eakt!I-STBN2I^LGoN$TetDyD+Y#!0?Z8j*BKncs}_N@F?hQA KxvX50 cNkWE!LFEmjRiDg@HlQ{JPgg&ebxsLQ0Qb%^s{jB1 diff --git a/core/img/actions/triangle-e.png b/core/img/actions/triangle-e.png index 90897e0fecd6f46b993eef4bb077b1c375c47c9f..4ce1086f61d4f9ea9333f695407831e2b800819f 100644 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDU1=3hSn7ND=P=dWA$S;_o zzM;LN^Pi#A-CCfKs;7%%2uE~sf&!n!0g06cZo8O!0+~{$h#!(*3SjeTaAZ8Dz`~&A V%OdgnTflCR;hwI3F6*2UngEeTAIty% literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy(g8jpu0R?Wm=gF%0Vu~&666=m zP~Xtr(fRjZ@A?u>pqP!Pi(^Q|t+%Ik@-is!9B}x|vg!YkCGIDwg2X*VEO{Wt~$(69B9}G>!lO diff --git a/core/img/actions/triangle-n.png b/core/img/actions/triangle-n.png index ca5e1868253a8176d748150be5be8a063002065e..2042d66532c01d7266d157a7c665bd7301321405 100644 GIT binary patch delta 91 zcmbQt*ubdR8Q|y6%O%Cdz`(%k>ERLtqy<2jgBeI_=<)|oRMaz+@pN$vsbEZApq-H7 p_IUFKgT)^MU1l`IY~Z-dz@Tu7!O8a4gERLtq!mDzgBeJ=Ea^HnQBluD-_yl0q=ND7DMcor z%+Y|7-T!Cmrq!u#_!X9XoA2P%2VNhZ?fA#BjwQTF+jQMq#`o_TSv|cAd4NVRc)I$z JtaD0e0sx8jBWC~r diff --git a/core/img/actions/triangle-s.png b/core/img/actions/triangle-s.png index 8f25a9bbb4385c6e5f12fe25d1429638c51241ce..97c64c6a7203c89f8a0074a13bb53bb5a1d319ce 100644 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJe}GSjE09J8{(R4Sfqa&dAirRS z@`etpv)y7qzKo}fV@L&K@&fsU6h`JW6TvhS(=#h}&6pwaf|EgYC4=M7mb_CSb39%B KT-G@yGywoK&l{fr literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyLIFM@u0R?MJkXY01QcQ|3GxeO zC~xTK+|;q=GEhL@)5S5Qf-za5CPBnt(;@~jCaoEqGY Date: Fri, 28 Aug 2015 00:53:27 +0200 Subject: [PATCH 062/783] fix filetype icons elsewhere, empty page, sidebar, apps menu --- apps/files/img/folder.png | Bin 303 -> 135 bytes apps/files/img/folder.svg | 4 ++-- apps/files/img/star.png | Bin 490 -> 492 bytes apps/files/img/star.svg | 6 +++--- core/css/icons.css | 8 ++------ core/img/places/file.png | Bin 174 -> 0 bytes core/img/places/file.svg | 5 ----- core/img/places/files.png | Bin 172 -> 155 bytes core/img/places/files.svg | 4 +++- core/img/places/folder.png | Bin 326 -> 0 bytes core/img/places/folder.svg | 6 ------ 11 files changed, 10 insertions(+), 23 deletions(-) delete mode 100644 core/img/places/file.png delete mode 100644 core/img/places/file.svg delete mode 100644 core/img/places/folder.png delete mode 100644 core/img/places/folder.svg diff --git a/apps/files/img/folder.png b/apps/files/img/folder.png index 4a8861f25ca0bc4709493b03f005491a0ba571d3..3dfb4391f2cde95313b8fd10b3193604f95bbabf 100644 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?b1=3+9Gee4Ig%*R5Hg9(& zP>7`@$S;_oq2v8T&j}lVd}U7;#}JO0$q5G-&gkheC9rjOcMJD0GO-!7F)!swo6#u2 Zz@YU{_@S@KKP{kg22WQ%mvv4FO#rUjB!B<_ literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI13?%1G+4BcTB?S0{xB_XKf?xhGdVvUCa2Xlt=PJ4_n}jdp1=I^ZMU*&0#IqZr;B4q#jUGnZt^)8 z2sm7HoVuti>;3=#OOF_FE_Ql!wAS`y>+U%g(Lz&}#05{8)GKAYRVLYE$wbA8d(=%> z|IFyU(kMNbYwg^kPgByo{yW)}yX~KbLh* G2~7Y(dQVsY diff --git a/apps/files/img/folder.svg b/apps/files/img/folder.svg index 4411b065c1c..e9d96d40490 100644 --- a/apps/files/img/folder.svg +++ b/apps/files/img/folder.svg @@ -1,6 +1,6 @@ - - + + diff --git a/apps/files/img/star.png b/apps/files/img/star.png index 3c66c49a8c4e07667790aa1e0597229a67ece20b..22e68c757e79535d4378a7e7539b5f6e99dfb401 100644 GIT binary patch literal 492 zcmVgv{XYyYlBNr&_5B;);}N(EeQ=S{Q*He z71@t5C~61{1Q89do(3(iK9}w>`@rEm=lkRRd^zWPIFVA4r817`(rYA@IpN)TRD>z( zYRCddR>gC%->Pruvf{8tTI`fk2&$2lo&itIt!y z-HmoD)nn>TbncH6JkI`e{>ONPWrqCmds;9Y%uT>}05^j4P ik0j?SnC!=Nm-+?#L4wF;-O0HC0000zd literal 490 zcmVK~zYIwbnmN98na9;b+$vf`V*}g(7ZaArXW$!NM4#jg^fl z7wr_%`vFpTb0<4LINbSj&Uw$h zoSAzG*8rY`22~4yRw6512RK5dOvo$ziEOq^&~^f}Sr%j%w+T=agL#8PnqdvSiTg)b z4v5dC2l(ONY+^gq<)&Clfy6eGCqV^IF@(pcMPvK*GmK^AIKfw3;5-^H+r~3kz^@J! z|F1RCh^v~y_Yxo{c;3DQBiQdEw*>+BcrUQ!-{5xu?Hg^Z^p*~4VQ zXB3}O{OTc~)kNT_)?p;8qZaWq;or#cOVt+cw6^O!N2?k(qL>dMpj}Ld1Vnm)k9nP| g=qUh+^)T(>UjS6k{< - - - + + + diff --git a/core/css/icons.css b/core/css/icons.css index e44f9880052..88b14449e46 100644 --- a/core/css/icons.css +++ b/core/css/icons.css @@ -227,18 +227,14 @@ background-image: url('../img/places/contacts-dark.svg'); } -.icon-file { - background-image: url('../img/places/file.svg'); -} .icon-files { background-image: url('../img/places/files.svg'); } -.icon-folder { - background-image: url('../img/places/folder.svg'); -} +.icon-file, .icon-filetype-text { background-image: url('../img/filetypes/text.svg'); } +.icon-folder, .icon-filetype-folder { background-image: url('../img/filetypes/folder.svg'); } diff --git a/core/img/places/file.png b/core/img/places/file.png deleted file mode 100644 index e0f04c31731f10b7881e85d6bcbae6f8b795ff55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv4DbnY{r~?zkckJ}El3FmN^_S4 z`2{lwNXp2UlvPw#HK=dxFaru3db&7qT$DJ_ZIcN1X+#Ij_Hftn_sCb6Mw<&;$S?f-7(U diff --git a/core/img/places/file.svg b/core/img/places/file.svg deleted file mode 100644 index 7db9a201a9f..00000000000 --- a/core/img/places/file.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/core/img/places/files.png b/core/img/places/files.png index 0ff943b077b64301f8894f12ca1df0237b15d18a..e317fc3c722b9d2ff4d51286a5f8716c6a0dc99a 100644 GIT binary patch delta 126 zcmZ3(IGb^TO1Wr&Plzi61H*p|;Bh{e1t`H*666=m(9p5}z(F~)t&@Nv`kpS1AsWHS z2@5z2yqTF8RTu^Abva`dd>LaEIAa;OCS7E`Jt}J ahVHoLKQ98$3INUFWbkzLb6Mw<&;$T&eL|A} diff --git a/core/img/places/files.svg b/core/img/places/files.svg index 72605afcc14..8f61739bc4a 100644 --- a/core/img/places/files.svg +++ b/core/img/places/files.svg @@ -1,4 +1,6 @@ - + + + diff --git a/core/img/places/folder.png b/core/img/places/folder.png deleted file mode 100644 index e7882298a834ca9e6b6f65719c24c00df45e545c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 326 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!q5^zET>t<74`k8;Y?O~!0W?>( zB*-tAfsvg9glAUA}hX*4=v#9{#xI6i^0KSm){D7*fIb_JSoJ zlOcn1VEcvx8xAuZe)KzjGSel2#wj~GTK@2V=;Hsr%KGEt#NJ7LXLhlQd`XBixghuB zVxAt;oz)EPS^~T^?AwyBOl{zFQP{@b)fN|~bRb)R@t8dukAy)&0;A7LhFWuL4~J6@ o+zZk}zfWj*I#ZNa+T!~=&Z7?)d#<*mdKI;Vst0L_S7Z~y=R diff --git a/core/img/places/folder.svg b/core/img/places/folder.svg deleted file mode 100644 index 08633f60a80..00000000000 --- a/core/img/places/folder.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - -- GitLab From 933ac14b767f78d99f4b45456467e7513c57ffa7 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Fri, 28 Aug 2015 01:55:25 -0400 Subject: [PATCH 063/783] [tx-robot] updated from transifex --- apps/files/l10n/es.js | 2 +- apps/files/l10n/es.json | 2 +- apps/files_external/l10n/da.js | 1 + apps/files_external/l10n/da.json | 1 + apps/files_external/l10n/es.js | 4 ++-- apps/files_external/l10n/es.json | 4 ++-- apps/files_external/l10n/nl.js | 14 ++++++++++++++ apps/files_external/l10n/nl.json | 14 ++++++++++++++ apps/files_external/l10n/pt_BR.js | 13 +++++++++++++ apps/files_external/l10n/pt_BR.json | 13 +++++++++++++ apps/files_external/l10n/th_TH.js | 23 +++++++++++++++++++++++ apps/files_external/l10n/th_TH.json | 23 +++++++++++++++++++++++ apps/user_ldap/l10n/es.js | 2 +- apps/user_ldap/l10n/es.json | 2 +- core/l10n/af_ZA.js | 1 - core/l10n/af_ZA.json | 1 - core/l10n/ar.js | 1 - core/l10n/ar.json | 1 - core/l10n/ast.js | 1 - core/l10n/ast.json | 1 - core/l10n/az.js | 1 - core/l10n/az.json | 1 - core/l10n/bg_BG.js | 1 - core/l10n/bg_BG.json | 1 - core/l10n/bn_BD.js | 1 - core/l10n/bn_BD.json | 1 - core/l10n/bs.js | 1 - core/l10n/bs.json | 1 - core/l10n/ca.js | 1 - core/l10n/ca.json | 1 - core/l10n/cs_CZ.js | 1 - core/l10n/cs_CZ.json | 1 - core/l10n/cy_GB.js | 1 - core/l10n/cy_GB.json | 1 - core/l10n/da.js | 3 ++- core/l10n/da.json | 3 ++- core/l10n/de.js | 1 - core/l10n/de.json | 1 - core/l10n/de_DE.js | 1 - core/l10n/de_DE.json | 1 - core/l10n/el.js | 3 ++- core/l10n/el.json | 3 ++- core/l10n/en_GB.js | 1 - core/l10n/en_GB.json | 1 - core/l10n/eo.js | 1 - core/l10n/eo.json | 1 - core/l10n/es.js | 7 +++---- core/l10n/es.json | 7 +++---- core/l10n/es_AR.js | 1 - core/l10n/es_AR.json | 1 - core/l10n/es_MX.js | 1 - core/l10n/es_MX.json | 1 - core/l10n/et_EE.js | 1 - core/l10n/et_EE.json | 1 - core/l10n/eu.js | 1 - core/l10n/eu.json | 1 - core/l10n/fa.js | 1 - core/l10n/fa.json | 1 - core/l10n/fi_FI.js | 3 ++- core/l10n/fi_FI.json | 3 ++- core/l10n/fr.js | 1 - core/l10n/fr.json | 1 - core/l10n/gl.js | 1 - core/l10n/gl.json | 1 - core/l10n/he.js | 1 - core/l10n/he.json | 1 - core/l10n/hr.js | 1 - core/l10n/hr.json | 1 - core/l10n/hu_HU.js | 1 - core/l10n/hu_HU.json | 1 - core/l10n/ia.js | 1 - core/l10n/ia.json | 1 - core/l10n/id.js | 1 - core/l10n/id.json | 1 - core/l10n/is.js | 2 +- core/l10n/is.json | 2 +- core/l10n/it.js | 3 ++- core/l10n/it.json | 3 ++- core/l10n/ja.js | 1 - core/l10n/ja.json | 1 - core/l10n/ka_GE.js | 1 - core/l10n/ka_GE.json | 1 - core/l10n/km.js | 1 - core/l10n/km.json | 1 - core/l10n/ko.js | 1 - core/l10n/ko.json | 1 - core/l10n/lb.js | 1 - core/l10n/lb.json | 1 - core/l10n/lt_LT.js | 1 - core/l10n/lt_LT.json | 1 - core/l10n/lv.js | 1 - core/l10n/lv.json | 1 - core/l10n/mk.js | 1 - core/l10n/mk.json | 1 - core/l10n/ms_MY.js | 3 +-- core/l10n/ms_MY.json | 3 +-- core/l10n/my_MM.js | 3 +-- core/l10n/my_MM.json | 3 +-- core/l10n/nb_NO.js | 1 - core/l10n/nb_NO.json | 1 - core/l10n/nl.js | 4 +++- core/l10n/nl.json | 4 +++- core/l10n/nn_NO.js | 1 - core/l10n/nn_NO.json | 1 - core/l10n/oc.js | 1 - core/l10n/oc.json | 1 - core/l10n/pl.js | 1 - core/l10n/pl.json | 1 - core/l10n/pt_BR.js | 3 ++- core/l10n/pt_BR.json | 3 ++- core/l10n/pt_PT.js | 1 - core/l10n/pt_PT.json | 1 - core/l10n/ro.js | 1 - core/l10n/ro.json | 1 - core/l10n/ru.js | 1 - core/l10n/ru.json | 1 - core/l10n/si_LK.js | 3 +-- core/l10n/si_LK.json | 3 +-- core/l10n/sk_SK.js | 1 - core/l10n/sk_SK.json | 1 - core/l10n/sl.js | 1 - core/l10n/sl.json | 1 - core/l10n/sq.js | 1 - core/l10n/sq.json | 1 - core/l10n/sr.js | 1 - core/l10n/sr.json | 1 - core/l10n/sr@latin.js | 1 - core/l10n/sr@latin.json | 1 - core/l10n/sv.js | 1 - core/l10n/sv.json | 1 - core/l10n/ta_LK.js | 3 +-- core/l10n/ta_LK.json | 3 +-- core/l10n/th_TH.js | 4 +++- core/l10n/th_TH.json | 4 +++- core/l10n/tr.js | 1 - core/l10n/tr.json | 1 - core/l10n/uk.js | 1 - core/l10n/uk.json | 1 - core/l10n/ur_PK.js | 1 - core/l10n/ur_PK.json | 1 - core/l10n/vi.js | 1 - core/l10n/vi.json | 1 - core/l10n/zh_CN.js | 1 - core/l10n/zh_CN.json | 1 - core/l10n/zh_HK.js | 3 +-- core/l10n/zh_HK.json | 3 +-- core/l10n/zh_TW.js | 1 - core/l10n/zh_TW.json | 1 - lib/l10n/es.js | 2 +- lib/l10n/es.json | 2 +- lib/l10n/nl.js | 1 + lib/l10n/nl.json | 1 + lib/l10n/th_TH.js | 1 + lib/l10n/th_TH.json | 1 + settings/l10n/es.js | 6 +++--- settings/l10n/es.json | 6 +++--- settings/l10n/nl.js | 7 +++++++ settings/l10n/nl.json | 7 +++++++ settings/l10n/th_TH.js | 7 +++++++ settings/l10n/th_TH.json | 7 +++++++ 160 files changed, 200 insertions(+), 166 deletions(-) diff --git a/apps/files/l10n/es.js b/apps/files/l10n/es.js index 64df2a8491d..39f4b8d0569 100644 --- a/apps/files/l10n/es.js +++ b/apps/files/l10n/es.js @@ -7,7 +7,7 @@ OC.L10N.register( "Could not move %s - File with this name already exists" : "No se pudo mover %s - Ya existe un archivo con ese nombre.", "Could not move %s" : "No se pudo mover %s", "Permission denied" : "Permiso denegado", - "The target folder has been moved or deleted." : "La carpeta destino fue movida o eliminada.", + "The target folder has been moved or deleted." : "La carpeta de destino fue movida o eliminada.", "The name %s is already used in the folder %s. Please choose a different name." : "El nombre %s ya está en uso por la carpeta %s. Por favor elija uno diferente.", "Error when creating the file" : "Error al crear el archivo", "Error when creating the folder" : "Error al crear la carpeta.", diff --git a/apps/files/l10n/es.json b/apps/files/l10n/es.json index c074a882129..064ffe3785d 100644 --- a/apps/files/l10n/es.json +++ b/apps/files/l10n/es.json @@ -5,7 +5,7 @@ "Could not move %s - File with this name already exists" : "No se pudo mover %s - Ya existe un archivo con ese nombre.", "Could not move %s" : "No se pudo mover %s", "Permission denied" : "Permiso denegado", - "The target folder has been moved or deleted." : "La carpeta destino fue movida o eliminada.", + "The target folder has been moved or deleted." : "La carpeta de destino fue movida o eliminada.", "The name %s is already used in the folder %s. Please choose a different name." : "El nombre %s ya está en uso por la carpeta %s. Por favor elija uno diferente.", "Error when creating the file" : "Error al crear el archivo", "Error when creating the folder" : "Error al crear la carpeta.", diff --git a/apps/files_external/l10n/da.js b/apps/files_external/l10n/da.js index 31f0776d875..946ea94169c 100644 --- a/apps/files_external/l10n/da.js +++ b/apps/files_external/l10n/da.js @@ -27,6 +27,7 @@ OC.L10N.register( "Storage with id \"%i\" not found" : "Lager med ID'et \"%i% er ikke fundet", "Invalid backend or authentication mechanism class" : "Ugyldig backend eller klasse for godkendelsesmekanisme", "Invalid mount point" : "Fokert monteringspunkt", + "Objectstore forbidden" : "Objectstore er forbudt", "Invalid storage backend \"%s\"" : "Forkert lager til backend \"%s\"en", "Unsatisfied backend parameters" : "Utilfredsstillede backend-parametre", "Unsatisfied authentication mechanism parameters" : "Utilfredsstillede parametre for godkendelsesmekanisme", diff --git a/apps/files_external/l10n/da.json b/apps/files_external/l10n/da.json index a9380e5f052..6a291b2b149 100644 --- a/apps/files_external/l10n/da.json +++ b/apps/files_external/l10n/da.json @@ -25,6 +25,7 @@ "Storage with id \"%i\" not found" : "Lager med ID'et \"%i% er ikke fundet", "Invalid backend or authentication mechanism class" : "Ugyldig backend eller klasse for godkendelsesmekanisme", "Invalid mount point" : "Fokert monteringspunkt", + "Objectstore forbidden" : "Objectstore er forbudt", "Invalid storage backend \"%s\"" : "Forkert lager til backend \"%s\"en", "Unsatisfied backend parameters" : "Utilfredsstillede backend-parametre", "Unsatisfied authentication mechanism parameters" : "Utilfredsstillede parametre for godkendelsesmekanisme", diff --git a/apps/files_external/l10n/es.js b/apps/files_external/l10n/es.js index f4960136af3..16d87d8d2f2 100644 --- a/apps/files_external/l10n/es.js +++ b/apps/files_external/l10n/es.js @@ -28,8 +28,8 @@ OC.L10N.register( "System" : "Sistema", "Grant access" : "Conceder acceso", "Access granted" : "Acceso concedido", - "Error configuring OAuth1" : "Error configurando OAuth1", - "Error configuring OAuth2" : "Error configurando OAuth2", + "Error configuring OAuth1" : "Error al configurar OAuth1", + "Error configuring OAuth2" : "Error al configurar OAuth2", "Enable encryption" : "Habilitar cifrado", "Enable previews" : "Habilitar previsualizaciones", "Check for changes" : "Comprobar si hay cambios", diff --git a/apps/files_external/l10n/es.json b/apps/files_external/l10n/es.json index b44592016dc..fe20eca13d2 100644 --- a/apps/files_external/l10n/es.json +++ b/apps/files_external/l10n/es.json @@ -26,8 +26,8 @@ "System" : "Sistema", "Grant access" : "Conceder acceso", "Access granted" : "Acceso concedido", - "Error configuring OAuth1" : "Error configurando OAuth1", - "Error configuring OAuth2" : "Error configurando OAuth2", + "Error configuring OAuth1" : "Error al configurar OAuth1", + "Error configuring OAuth2" : "Error al configurar OAuth2", "Enable encryption" : "Habilitar cifrado", "Enable previews" : "Habilitar previsualizaciones", "Check for changes" : "Comprobar si hay cambios", diff --git a/apps/files_external/l10n/nl.js b/apps/files_external/l10n/nl.js index dc136969fd8..a9a66934753 100644 --- a/apps/files_external/l10n/nl.js +++ b/apps/files_external/l10n/nl.js @@ -28,6 +28,8 @@ OC.L10N.register( "System" : "Systeem", "Grant access" : "Sta toegang toe", "Access granted" : "Toegang toegestaan", + "Error configuring OAuth1" : "Fout bij configureren OAuth1", + "Error configuring OAuth2" : "Fout bij configureren OAuth2", "Enable encryption" : "Versleuteling inschakelen", "Enable previews" : "Activeren voorbeelden", "Check for changes" : "Controleren op wijzigingen", @@ -39,12 +41,19 @@ OC.L10N.register( "Saved" : "Bewaard", "Generate keys" : "Genereer sleutels", "Error generating key pair" : "Fout bij genereren sleutelpaar", + "Access key" : "Access Key", + "Secret key" : "Geheime sleutel", + "Builtin" : "Ingebouwd", "None" : "Geen", + "OAuth1" : "OAuth1", "App key" : "App key", "App secret" : "App secret", + "OAuth2" : "OAuth2", "Client ID" : "Client ID", "Client secret" : "Client secret", + "Username and password" : "Gebruikersnaam en wachtwoord", "Password" : "Wachtwoord", + "Session credentials" : "Sessie inloggegevens", "Amazon S3" : "Amazon S3", "Hostname" : "Hostnaam", "Port" : "Poort", @@ -55,11 +64,15 @@ OC.L10N.register( "URL" : "URL", "Secure https://" : "Secure https://", "Dropbox" : "Dropbox", + "FTP" : "FTP", "Secure ftps://" : "Secure ftps://", + "Google Drive" : "Google Drive", "Local" : "Lokaal", "Location" : "Locatie", "ownCloud" : "ownCloud", + "SFTP" : "SFTP", "Root" : "Root", + "SMB / CIFS" : "SMB / CIFS", "Note: " : "Let op: ", "Note: The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Let op: Curl ondersteuning in PHP is niet geactiveerd of geïnstalleerd. Mounten van %s is niet mogelijk. Vraag uw systeembeheerder dit te installeren.", "Note: The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Let op: FTP ondersteuning in PHP is niet geactiveerd of geïnstalleerd. Mounten van %s is niet mogelijk. Vraag uw beheerder dit te installeren.", @@ -71,6 +84,7 @@ OC.L10N.register( "Scope" : "Scope", "External Storage" : "Externe opslag", "Folder name" : "Mapnaam", + "Authentication" : "Authenticatie", "Configuration" : "Configuratie", "Available for" : "Beschikbaar voor", "Advanced settings" : "Geavanceerde instellingen", diff --git a/apps/files_external/l10n/nl.json b/apps/files_external/l10n/nl.json index 7d5279afbc2..bd3fd953a26 100644 --- a/apps/files_external/l10n/nl.json +++ b/apps/files_external/l10n/nl.json @@ -26,6 +26,8 @@ "System" : "Systeem", "Grant access" : "Sta toegang toe", "Access granted" : "Toegang toegestaan", + "Error configuring OAuth1" : "Fout bij configureren OAuth1", + "Error configuring OAuth2" : "Fout bij configureren OAuth2", "Enable encryption" : "Versleuteling inschakelen", "Enable previews" : "Activeren voorbeelden", "Check for changes" : "Controleren op wijzigingen", @@ -37,12 +39,19 @@ "Saved" : "Bewaard", "Generate keys" : "Genereer sleutels", "Error generating key pair" : "Fout bij genereren sleutelpaar", + "Access key" : "Access Key", + "Secret key" : "Geheime sleutel", + "Builtin" : "Ingebouwd", "None" : "Geen", + "OAuth1" : "OAuth1", "App key" : "App key", "App secret" : "App secret", + "OAuth2" : "OAuth2", "Client ID" : "Client ID", "Client secret" : "Client secret", + "Username and password" : "Gebruikersnaam en wachtwoord", "Password" : "Wachtwoord", + "Session credentials" : "Sessie inloggegevens", "Amazon S3" : "Amazon S3", "Hostname" : "Hostnaam", "Port" : "Poort", @@ -53,11 +62,15 @@ "URL" : "URL", "Secure https://" : "Secure https://", "Dropbox" : "Dropbox", + "FTP" : "FTP", "Secure ftps://" : "Secure ftps://", + "Google Drive" : "Google Drive", "Local" : "Lokaal", "Location" : "Locatie", "ownCloud" : "ownCloud", + "SFTP" : "SFTP", "Root" : "Root", + "SMB / CIFS" : "SMB / CIFS", "Note: " : "Let op: ", "Note: The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Let op: Curl ondersteuning in PHP is niet geactiveerd of geïnstalleerd. Mounten van %s is niet mogelijk. Vraag uw systeembeheerder dit te installeren.", "Note: The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Let op: FTP ondersteuning in PHP is niet geactiveerd of geïnstalleerd. Mounten van %s is niet mogelijk. Vraag uw beheerder dit te installeren.", @@ -69,6 +82,7 @@ "Scope" : "Scope", "External Storage" : "Externe opslag", "Folder name" : "Mapnaam", + "Authentication" : "Authenticatie", "Configuration" : "Configuratie", "Available for" : "Beschikbaar voor", "Advanced settings" : "Geavanceerde instellingen", diff --git a/apps/files_external/l10n/pt_BR.js b/apps/files_external/l10n/pt_BR.js index 8140d8be980..ae9a08fac6b 100644 --- a/apps/files_external/l10n/pt_BR.js +++ b/apps/files_external/l10n/pt_BR.js @@ -1,6 +1,8 @@ OC.L10N.register( "files_external", { + "Fetching request tokens failed. Verify that your app key and secret are correct." : "A solicitação dos tokens de requesição falhou. Verifique se a sua chave de aplicativo e segurança estão corretos.", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "A solicitação dos tokens de acesso falhou. Verifique se a sua chave de aplicativo e segurança estão corretos.", "Please provide a valid app key and secret." : "Por favor forneça uma chave e segurança válidos.", "Step 1 failed. Exception: %s" : "Passo 1 falhou. Exceção: %s", "Step 2 failed. Exception: %s" : "Passo 2 falhou. Exceção: %s", @@ -23,12 +25,19 @@ OC.L10N.register( "SFTP with secret key login" : "SFTP com chave secreta de login", "Public key" : "Chave pública", "Storage with id \"%i\" not found" : "Armazenamento com id \"%i\" não encontrado", + "Invalid backend or authentication mechanism class" : "Backend inválido ou classe de mecanismo de autenticação", "Invalid mount point" : "Ponto de montagem inválido", + "Objectstore forbidden" : "Proibido armazenamento de objetos", "Invalid storage backend \"%s\"" : "Armazenamento backend inválido \"%s\"", + "Unsatisfied backend parameters" : "Parâmetros de back-end não-atendidos", + "Unsatisfied authentication mechanism parameters" : "Parâmetros de mecanismos de autenticação não satisfeitos", + "Admin-only storage backend \"%s\"" : "Backend de armazenamento somente de administrador \"%s\"", "Personal" : "Pessoal", "System" : "Sistema", "Grant access" : "Permitir acesso", "Access granted" : "Acesso concedido", + "Error configuring OAuth1" : "Erro configurando OAuth1", + "Error configuring OAuth2" : "Erro configurando OAuth2", "Enable encryption" : "Ativar criptografia", "Enable previews" : "Habilitar visualizações prévias", "Check for changes" : "Verifique se há alterações", @@ -40,7 +49,11 @@ OC.L10N.register( "Saved" : "Salvo", "Generate keys" : "Gerar chaves", "Error generating key pair" : "Erro ao gerar um par de chaves", + "Access key" : "Chave da acesso", + "Secret key" : "Chave secreta", + "Builtin" : "Construídas em", "None" : "Nenhum", + "OAuth1" : "OAuth1", "App key" : "Chave do Aplicativo", "App secret" : "Segredo da Aplicação", "OAuth2" : "OAuth2", diff --git a/apps/files_external/l10n/pt_BR.json b/apps/files_external/l10n/pt_BR.json index 13ce808ba84..2cf6c696112 100644 --- a/apps/files_external/l10n/pt_BR.json +++ b/apps/files_external/l10n/pt_BR.json @@ -1,4 +1,6 @@ { "translations": { + "Fetching request tokens failed. Verify that your app key and secret are correct." : "A solicitação dos tokens de requesição falhou. Verifique se a sua chave de aplicativo e segurança estão corretos.", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "A solicitação dos tokens de acesso falhou. Verifique se a sua chave de aplicativo e segurança estão corretos.", "Please provide a valid app key and secret." : "Por favor forneça uma chave e segurança válidos.", "Step 1 failed. Exception: %s" : "Passo 1 falhou. Exceção: %s", "Step 2 failed. Exception: %s" : "Passo 2 falhou. Exceção: %s", @@ -21,12 +23,19 @@ "SFTP with secret key login" : "SFTP com chave secreta de login", "Public key" : "Chave pública", "Storage with id \"%i\" not found" : "Armazenamento com id \"%i\" não encontrado", + "Invalid backend or authentication mechanism class" : "Backend inválido ou classe de mecanismo de autenticação", "Invalid mount point" : "Ponto de montagem inválido", + "Objectstore forbidden" : "Proibido armazenamento de objetos", "Invalid storage backend \"%s\"" : "Armazenamento backend inválido \"%s\"", + "Unsatisfied backend parameters" : "Parâmetros de back-end não-atendidos", + "Unsatisfied authentication mechanism parameters" : "Parâmetros de mecanismos de autenticação não satisfeitos", + "Admin-only storage backend \"%s\"" : "Backend de armazenamento somente de administrador \"%s\"", "Personal" : "Pessoal", "System" : "Sistema", "Grant access" : "Permitir acesso", "Access granted" : "Acesso concedido", + "Error configuring OAuth1" : "Erro configurando OAuth1", + "Error configuring OAuth2" : "Erro configurando OAuth2", "Enable encryption" : "Ativar criptografia", "Enable previews" : "Habilitar visualizações prévias", "Check for changes" : "Verifique se há alterações", @@ -38,7 +47,11 @@ "Saved" : "Salvo", "Generate keys" : "Gerar chaves", "Error generating key pair" : "Erro ao gerar um par de chaves", + "Access key" : "Chave da acesso", + "Secret key" : "Chave secreta", + "Builtin" : "Construídas em", "None" : "Nenhum", + "OAuth1" : "OAuth1", "App key" : "Chave do Aplicativo", "App secret" : "Segredo da Aplicação", "OAuth2" : "OAuth2", diff --git a/apps/files_external/l10n/th_TH.js b/apps/files_external/l10n/th_TH.js index b8fc2a054cb..5926a806437 100644 --- a/apps/files_external/l10n/th_TH.js +++ b/apps/files_external/l10n/th_TH.js @@ -1,6 +1,9 @@ OC.L10N.register( "files_external", { + "Fetching request tokens failed. Verify that your app key and secret are correct." : "การเรียกร้องขอโทเคนล้มเหลว โปรดตรวจสอบคีย์และรหัสลับให้ถูกต้อง", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "การเรียกร้องขอโทเคนล้มเหลว โปรดตรวจสอบคีย์และรหัสลับของแอพฯ ให้ถูกต้อง", + "Please provide a valid app key and secret." : "โปรดระบุคีย์และรหัสลับของแอพฯ ให้ถูกต้อง", "Step 1 failed. Exception: %s" : "ขั้นตอนที่ 1 ล้มเหลว ข้อยกเว้น: %s", "Step 2 failed. Exception: %s" : "ขั้นตอนที่ 2 ล้มเหลว ข้อยกเว้น: %s", "External storage" : "จัดเก็บข้อมูลภายนอก", @@ -22,12 +25,19 @@ OC.L10N.register( "SFTP with secret key login" : "SFTP กับคีย์ลับสำหรับเข้าสู่ระบบ", "Public key" : "คีย์สาธารณะ", "Storage with id \"%i\" not found" : "ไม่พบจัดการเก็บข้อมูลของ ID \"%i\"", + "Invalid backend or authentication mechanism class" : "แบ็กเอนด์ไม่ถูกต้องหรือระดับการรับรองความถูกต้องไม่เพียงพอ", "Invalid mount point" : "จุดเชื่อมต่อที่ไม่ถูกต้อง", + "Objectstore forbidden" : "เก็บวัตถุต้องห้าม", "Invalid storage backend \"%s\"" : "การจัดเก็บข้อมูลแบ็กเอนด์ไม่ถูกต้อง \"%s\"", + "Unsatisfied backend parameters" : "พารามิเตอร์แบ็กเอนด์ไม่ได้รับอนุญาต", + "Unsatisfied authentication mechanism parameters" : "การรับรองความถูกต้องไม่เพียงพอ", + "Admin-only storage backend \"%s\"" : "จัดเก็บแบ็กเอนด์ของผู้ดูแลระบบเท่านั้น \"%s\"", "Personal" : "ส่วนตัว", "System" : "ระบบ", "Grant access" : "อนุญาตให้เข้าถึงได้", "Access granted" : "การเข้าถึงได้รับอนุญาตแล้ว", + "Error configuring OAuth1" : "ข้อผิดพลาดในการกำหนดค่า OAuth1", + "Error configuring OAuth2" : "ข้อผิดพลาดในการกำหนดค่า OAuth2", "Enable encryption" : "เปิดใช้งานการเข้ารหัส", "Enable previews" : "เปิดใช้งานการแสดงตัวอย่าง", "Check for changes" : "ตรวจสอบการเปลี่ยนแปลง", @@ -39,12 +49,19 @@ OC.L10N.register( "Saved" : "บันทึกแล้ว", "Generate keys" : "สร้างคีย์", "Error generating key pair" : "ข้อผิดพลาดในการสร้างคีย์แบบเป็นคู่", + "Access key" : "คีย์การเข้าถึง", + "Secret key" : "คีย์ลับ", + "Builtin" : "ในตัว", "None" : "ไม่มี", + "OAuth1" : "OAuth1", "App key" : "App key", "App secret" : "App secret", + "OAuth2" : "OAuth2", "Client ID" : "Client ID", "Client secret" : "Client secret", + "Username and password" : "ชื่อผู้ใช้และรหัสผ่าน", "Password" : "รหัสผ่าน", + "Session credentials" : "ข้อมูลของเซสชั่น", "Amazon S3" : "Amazon S3", "Hostname" : "ชื่อโฮสต์", "Port" : "พอร์ต", @@ -55,10 +72,15 @@ OC.L10N.register( "URL" : "URL", "Secure https://" : "โหมดปลอดภัย https://", "Dropbox" : "Dropbox", + "FTP" : "FTP", "Secure ftps://" : "โหมดปลอดภัย ftps://", + "Google Drive" : "กูเกิ้ลไดร์ฟ", "Local" : "ต้นทาง", "Location" : "ตำแหน่งที่อยู่", "ownCloud" : "ownCloud", + "SFTP" : "SFTP", + "Root" : "รูท", + "SMB / CIFS" : "SMB / CIFS", "Note: " : "หมายเหตุ:", "Note: The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "หมายเหตุ: การสนับสนุน cURL ใน PHP ไม่ได้เปิดใช้งานหรือติดตั้ง %s เป็นไปไม่ได้ กรุณาขอให้ผู้ดูแลระบบของคุณติดตั้งมัน", "Note: The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "หมายเหตุ: การสนับสนุน FTP ใน PHP ไม่ได้เปิดใช้งานหรือติดตั้ง %s เป็นไปไม่ได้ กรุณาขอให้ผู้ดูแลระบบของคุณติดตั้งมัน", @@ -70,6 +92,7 @@ OC.L10N.register( "Scope" : "ขอบเขต", "External Storage" : "พื้นทีจัดเก็บข้อมูลจากภายนอก", "Folder name" : "ชื่อโฟลเดอร์", + "Authentication" : "รับรองความถูกต้อง", "Configuration" : "การกำหนดค่า", "Available for" : "สามารถใช้ได้สำหรับ", "Advanced settings" : "ตั้งค่าขั้นสูง", diff --git a/apps/files_external/l10n/th_TH.json b/apps/files_external/l10n/th_TH.json index 2b65013f584..c927a5980b9 100644 --- a/apps/files_external/l10n/th_TH.json +++ b/apps/files_external/l10n/th_TH.json @@ -1,4 +1,7 @@ { "translations": { + "Fetching request tokens failed. Verify that your app key and secret are correct." : "การเรียกร้องขอโทเคนล้มเหลว โปรดตรวจสอบคีย์และรหัสลับให้ถูกต้อง", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "การเรียกร้องขอโทเคนล้มเหลว โปรดตรวจสอบคีย์และรหัสลับของแอพฯ ให้ถูกต้อง", + "Please provide a valid app key and secret." : "โปรดระบุคีย์และรหัสลับของแอพฯ ให้ถูกต้อง", "Step 1 failed. Exception: %s" : "ขั้นตอนที่ 1 ล้มเหลว ข้อยกเว้น: %s", "Step 2 failed. Exception: %s" : "ขั้นตอนที่ 2 ล้มเหลว ข้อยกเว้น: %s", "External storage" : "จัดเก็บข้อมูลภายนอก", @@ -20,12 +23,19 @@ "SFTP with secret key login" : "SFTP กับคีย์ลับสำหรับเข้าสู่ระบบ", "Public key" : "คีย์สาธารณะ", "Storage with id \"%i\" not found" : "ไม่พบจัดการเก็บข้อมูลของ ID \"%i\"", + "Invalid backend or authentication mechanism class" : "แบ็กเอนด์ไม่ถูกต้องหรือระดับการรับรองความถูกต้องไม่เพียงพอ", "Invalid mount point" : "จุดเชื่อมต่อที่ไม่ถูกต้อง", + "Objectstore forbidden" : "เก็บวัตถุต้องห้าม", "Invalid storage backend \"%s\"" : "การจัดเก็บข้อมูลแบ็กเอนด์ไม่ถูกต้อง \"%s\"", + "Unsatisfied backend parameters" : "พารามิเตอร์แบ็กเอนด์ไม่ได้รับอนุญาต", + "Unsatisfied authentication mechanism parameters" : "การรับรองความถูกต้องไม่เพียงพอ", + "Admin-only storage backend \"%s\"" : "จัดเก็บแบ็กเอนด์ของผู้ดูแลระบบเท่านั้น \"%s\"", "Personal" : "ส่วนตัว", "System" : "ระบบ", "Grant access" : "อนุญาตให้เข้าถึงได้", "Access granted" : "การเข้าถึงได้รับอนุญาตแล้ว", + "Error configuring OAuth1" : "ข้อผิดพลาดในการกำหนดค่า OAuth1", + "Error configuring OAuth2" : "ข้อผิดพลาดในการกำหนดค่า OAuth2", "Enable encryption" : "เปิดใช้งานการเข้ารหัส", "Enable previews" : "เปิดใช้งานการแสดงตัวอย่าง", "Check for changes" : "ตรวจสอบการเปลี่ยนแปลง", @@ -37,12 +47,19 @@ "Saved" : "บันทึกแล้ว", "Generate keys" : "สร้างคีย์", "Error generating key pair" : "ข้อผิดพลาดในการสร้างคีย์แบบเป็นคู่", + "Access key" : "คีย์การเข้าถึง", + "Secret key" : "คีย์ลับ", + "Builtin" : "ในตัว", "None" : "ไม่มี", + "OAuth1" : "OAuth1", "App key" : "App key", "App secret" : "App secret", + "OAuth2" : "OAuth2", "Client ID" : "Client ID", "Client secret" : "Client secret", + "Username and password" : "ชื่อผู้ใช้และรหัสผ่าน", "Password" : "รหัสผ่าน", + "Session credentials" : "ข้อมูลของเซสชั่น", "Amazon S3" : "Amazon S3", "Hostname" : "ชื่อโฮสต์", "Port" : "พอร์ต", @@ -53,10 +70,15 @@ "URL" : "URL", "Secure https://" : "โหมดปลอดภัย https://", "Dropbox" : "Dropbox", + "FTP" : "FTP", "Secure ftps://" : "โหมดปลอดภัย ftps://", + "Google Drive" : "กูเกิ้ลไดร์ฟ", "Local" : "ต้นทาง", "Location" : "ตำแหน่งที่อยู่", "ownCloud" : "ownCloud", + "SFTP" : "SFTP", + "Root" : "รูท", + "SMB / CIFS" : "SMB / CIFS", "Note: " : "หมายเหตุ:", "Note: The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "หมายเหตุ: การสนับสนุน cURL ใน PHP ไม่ได้เปิดใช้งานหรือติดตั้ง %s เป็นไปไม่ได้ กรุณาขอให้ผู้ดูแลระบบของคุณติดตั้งมัน", "Note: The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "หมายเหตุ: การสนับสนุน FTP ใน PHP ไม่ได้เปิดใช้งานหรือติดตั้ง %s เป็นไปไม่ได้ กรุณาขอให้ผู้ดูแลระบบของคุณติดตั้งมัน", @@ -68,6 +90,7 @@ "Scope" : "ขอบเขต", "External Storage" : "พื้นทีจัดเก็บข้อมูลจากภายนอก", "Folder name" : "ชื่อโฟลเดอร์", + "Authentication" : "รับรองความถูกต้อง", "Configuration" : "การกำหนดค่า", "Available for" : "สามารถใช้ได้สำหรับ", "Advanced settings" : "ตั้งค่าขั้นสูง", diff --git a/apps/user_ldap/l10n/es.js b/apps/user_ldap/l10n/es.js index b423d5a8fa1..c73f54b5489 100644 --- a/apps/user_ldap/l10n/es.js +++ b/apps/user_ldap/l10n/es.js @@ -3,7 +3,7 @@ OC.L10N.register( { "Failed to clear the mappings." : "Ocurrió un fallo al borrar las asignaciones.", "Failed to delete the server configuration" : "No se pudo borrar la configuración del servidor", - "The configuration is invalid: anonymous bind is not allowed." : "La configuración no es válida: enlaces anónimos no están permitido.", + "The configuration is invalid: anonymous bind is not allowed." : "La configuración no es válida: no están permitidos enlaces anónimos.", "The configuration is valid and the connection could be established!" : "¡La configuración es válida y la conexión puede establecerse!", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "La configuración es válida, pero falló el nexo. Por favor, compruebe la configuración del servidor y las credenciales.", "The configuration is invalid. Please have a look at the logs for further details." : "La configuración no es válida. Por favor, revise el registro para más detalles.", diff --git a/apps/user_ldap/l10n/es.json b/apps/user_ldap/l10n/es.json index c8244f41a6e..8666d1efdd9 100644 --- a/apps/user_ldap/l10n/es.json +++ b/apps/user_ldap/l10n/es.json @@ -1,7 +1,7 @@ { "translations": { "Failed to clear the mappings." : "Ocurrió un fallo al borrar las asignaciones.", "Failed to delete the server configuration" : "No se pudo borrar la configuración del servidor", - "The configuration is invalid: anonymous bind is not allowed." : "La configuración no es válida: enlaces anónimos no están permitido.", + "The configuration is invalid: anonymous bind is not allowed." : "La configuración no es válida: no están permitidos enlaces anónimos.", "The configuration is valid and the connection could be established!" : "¡La configuración es válida y la conexión puede establecerse!", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "La configuración es válida, pero falló el nexo. Por favor, compruebe la configuración del servidor y las credenciales.", "The configuration is invalid. Please have a look at the logs for further details." : "La configuración no es válida. Por favor, revise el registro para más detalles.", diff --git a/core/l10n/af_ZA.js b/core/l10n/af_ZA.js index d96aa5cf465..7c95b0a0db4 100644 --- a/core/l10n/af_ZA.js +++ b/core/l10n/af_ZA.js @@ -110,7 +110,6 @@ OC.L10N.register( "Finish setup" : "Maak opstelling klaar", "Log out" : "Teken uit", "remember" : "onthou", - "Log in" : "Teken aan", "Alternative Logins" : "Alternatiewe aantekeninge", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Halo daar,

wou jou net laat weet dat %s %s met jou gedeel het.
Sien alles!

" }, diff --git a/core/l10n/af_ZA.json b/core/l10n/af_ZA.json index 362255fe50a..a040afc6962 100644 --- a/core/l10n/af_ZA.json +++ b/core/l10n/af_ZA.json @@ -108,7 +108,6 @@ "Finish setup" : "Maak opstelling klaar", "Log out" : "Teken uit", "remember" : "onthou", - "Log in" : "Teken aan", "Alternative Logins" : "Alternatiewe aantekeninge", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Halo daar,

wou jou net laat weet dat %s %s met jou gedeel het.
Sien alles!

" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/core/l10n/ar.js b/core/l10n/ar.js index 55d87c826e4..e4bde6b47ed 100644 --- a/core/l10n/ar.js +++ b/core/l10n/ar.js @@ -131,7 +131,6 @@ OC.L10N.register( "Log out" : "الخروج", "Search" : "البحث", "remember" : "تذكر", - "Log in" : "أدخل", "Alternative Logins" : "اسماء دخول بديلة" }, "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"); diff --git a/core/l10n/ar.json b/core/l10n/ar.json index 70e95257980..90168479a9b 100644 --- a/core/l10n/ar.json +++ b/core/l10n/ar.json @@ -129,7 +129,6 @@ "Log out" : "الخروج", "Search" : "البحث", "remember" : "تذكر", - "Log in" : "أدخل", "Alternative Logins" : "اسماء دخول بديلة" },"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" } \ No newline at end of file diff --git a/core/l10n/ast.js b/core/l10n/ast.js index 22d3ad472c2..675b3bd00a1 100644 --- a/core/l10n/ast.js +++ b/core/l10n/ast.js @@ -169,7 +169,6 @@ OC.L10N.register( "Server side authentication failed!" : "Falló l'autenticación nel sirvidor!", "Please contact your administrator." : "Por favor, contauta col to alministrador", "remember" : "recordar", - "Log in" : "Aniciar sesión", "Alternative Logins" : "Anicios de sesión alternativos", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hola, ¿qué hai?,

namái déxamos dicite que %s compartió %s contigo.\n
¡Velu!

", "This ownCloud instance is currently in single user mode." : "Esta instalación d'ownCloud ta en mou d'usuariu únicu.", diff --git a/core/l10n/ast.json b/core/l10n/ast.json index e7f87e94f25..5479fb6a524 100644 --- a/core/l10n/ast.json +++ b/core/l10n/ast.json @@ -167,7 +167,6 @@ "Server side authentication failed!" : "Falló l'autenticación nel sirvidor!", "Please contact your administrator." : "Por favor, contauta col to alministrador", "remember" : "recordar", - "Log in" : "Aniciar sesión", "Alternative Logins" : "Anicios de sesión alternativos", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hola, ¿qué hai?,

namái déxamos dicite que %s compartió %s contigo.\n
¡Velu!

", "This ownCloud instance is currently in single user mode." : "Esta instalación d'ownCloud ta en mou d'usuariu únicu.", diff --git a/core/l10n/az.js b/core/l10n/az.js index e94203c372c..29e643c665a 100644 --- a/core/l10n/az.js +++ b/core/l10n/az.js @@ -83,7 +83,6 @@ OC.L10N.register( "Username" : "İstifadəçi adı", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Xüsusilə fayl sinxronizasiyası üçün desktop client-dən istifadə edilərsə, SQLite məsləhət görülmür.", "Search" : "Axtarış", - "Log in" : "Giriş", "You are accessing the server from an untrusted domain." : "Siz serverə inamsız domain-dən girməyə çalışırsız.", "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domain\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Xahiş olunur inzibatçı ilə əlaqə saxlayasınız. Eger siz bu xidmətin inzibatçısısınizsa, \"trusted_domain\" configini config/config.php faylinda düzgün qeyd edin. Config nüsxəsi config/config.sample.php faylında qeyd edilmişdir." }, diff --git a/core/l10n/az.json b/core/l10n/az.json index 8dc93029ed1..6827838c944 100644 --- a/core/l10n/az.json +++ b/core/l10n/az.json @@ -81,7 +81,6 @@ "Username" : "İstifadəçi adı", "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "Xüsusilə fayl sinxronizasiyası üçün desktop client-dən istifadə edilərsə, SQLite məsləhət görülmür.", "Search" : "Axtarış", - "Log in" : "Giriş", "You are accessing the server from an untrusted domain." : "Siz serverə inamsız domain-dən girməyə çalışırsız.", "Please contact your administrator. If you are an administrator of this instance, configure the \"trusted_domain\" setting in config/config.php. An example configuration is provided in config/config.sample.php." : "Xahiş olunur inzibatçı ilə əlaqə saxlayasınız. Eger siz bu xidmətin inzibatçısısınizsa, \"trusted_domain\" configini config/config.php faylinda düzgün qeyd edin. Config nüsxəsi config/config.sample.php faylında qeyd edilmişdir." },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/core/l10n/bg_BG.js b/core/l10n/bg_BG.js index efc40bfed21..52fdcccf13b 100644 --- a/core/l10n/bg_BG.js +++ b/core/l10n/bg_BG.js @@ -212,7 +212,6 @@ OC.L10N.register( "Server side authentication failed!" : "Удостоверяването от страна на сървъра е неуспешно!", "Please contact your administrator." : "Моля, свържете се с администратора.", "remember" : "запомняне", - "Log in" : "Вписване", "Alternative Logins" : "Алтернативни методи на вписване", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Здрасти,

само да те уведомя, че %s сподели %s с теб.\n
Разгледай го!

.", "This ownCloud instance is currently in single user mode." : "В момента този ownCloud е в режим допускащ само един потребител.", diff --git a/core/l10n/bg_BG.json b/core/l10n/bg_BG.json index bb9651af481..0d8b4a21a19 100644 --- a/core/l10n/bg_BG.json +++ b/core/l10n/bg_BG.json @@ -210,7 +210,6 @@ "Server side authentication failed!" : "Удостоверяването от страна на сървъра е неуспешно!", "Please contact your administrator." : "Моля, свържете се с администратора.", "remember" : "запомняне", - "Log in" : "Вписване", "Alternative Logins" : "Алтернативни методи на вписване", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Здрасти,

само да те уведомя, че %s сподели %s с теб.\n
Разгледай го!

.", "This ownCloud instance is currently in single user mode." : "В момента този ownCloud е в режим допускащ само един потребител.", diff --git a/core/l10n/bn_BD.js b/core/l10n/bn_BD.js index a2b94ff8029..d9bce487f45 100644 --- a/core/l10n/bn_BD.js +++ b/core/l10n/bn_BD.js @@ -126,7 +126,6 @@ OC.L10N.register( "Log out" : "প্রস্থান", "Search" : "অনুসন্ধান", "remember" : "মনে রাখ", - "Log in" : "প্রবেশ", "Alternative Logins" : "বিকল্প লগইন" }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/bn_BD.json b/core/l10n/bn_BD.json index 305f1e60d15..8474fa61f1c 100644 --- a/core/l10n/bn_BD.json +++ b/core/l10n/bn_BD.json @@ -124,7 +124,6 @@ "Log out" : "প্রস্থান", "Search" : "অনুসন্ধান", "remember" : "মনে রাখ", - "Log in" : "প্রবেশ", "Alternative Logins" : "বিকল্প লগইন" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/core/l10n/bs.js b/core/l10n/bs.js index e2c5bd8e0e4..f237de9d8ce 100644 --- a/core/l10n/bs.js +++ b/core/l10n/bs.js @@ -190,7 +190,6 @@ OC.L10N.register( "Server side authentication failed!" : "Autentikacija na strani servera nije uspjela!", "Please contact your administrator." : "Molim kontaktirajte svog administratora.", "remember" : "zapamti", - "Log in" : "Prijava", "Alternative Logins" : "Alternativne Prijave", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hej,

upravo vam javljam da je %s s vama podijelio %s.
Pogledajte!

", "This ownCloud instance is currently in single user mode." : "Ova ownCloud instanca je trenutno u jednokorisničkom načinu rada.", diff --git a/core/l10n/bs.json b/core/l10n/bs.json index 10d79cb2b45..c4f7962b14e 100644 --- a/core/l10n/bs.json +++ b/core/l10n/bs.json @@ -188,7 +188,6 @@ "Server side authentication failed!" : "Autentikacija na strani servera nije uspjela!", "Please contact your administrator." : "Molim kontaktirajte svog administratora.", "remember" : "zapamti", - "Log in" : "Prijava", "Alternative Logins" : "Alternativne Prijave", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hej,

upravo vam javljam da je %s s vama podijelio %s.
Pogledajte!

", "This ownCloud instance is currently in single user mode." : "Ova ownCloud instanca je trenutno u jednokorisničkom načinu rada.", diff --git a/core/l10n/ca.js b/core/l10n/ca.js index e2bed36c3d4..853cd662472 100644 --- a/core/l10n/ca.js +++ b/core/l10n/ca.js @@ -228,7 +228,6 @@ OC.L10N.register( "Please try again or contact your administrator." : "Intenti-ho de nou o posi's en contacte amb el seu administrador.", "Wrong password. Reset it?" : "Contrasenya incorrecta. Voleu restablir-la?", "remember" : "recorda'm", - "Log in" : "Inici de sessió", "Alternative Logins" : "Acreditacions alternatives", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Ei,

només fer-vos saber que %s us ha comparti %s.
Mireu-ho!", "This ownCloud instance is currently in single user mode." : "La instància ownCloud està en mode d'usuari únic.", diff --git a/core/l10n/ca.json b/core/l10n/ca.json index 8afd3826038..56006bc7d17 100644 --- a/core/l10n/ca.json +++ b/core/l10n/ca.json @@ -226,7 +226,6 @@ "Please try again or contact your administrator." : "Intenti-ho de nou o posi's en contacte amb el seu administrador.", "Wrong password. Reset it?" : "Contrasenya incorrecta. Voleu restablir-la?", "remember" : "recorda'm", - "Log in" : "Inici de sessió", "Alternative Logins" : "Acreditacions alternatives", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Ei,

només fer-vos saber que %s us ha comparti %s.
Mireu-ho!", "This ownCloud instance is currently in single user mode." : "La instància ownCloud està en mode d'usuari únic.", diff --git a/core/l10n/cs_CZ.js b/core/l10n/cs_CZ.js index 845ea68b0f6..8d57e0e76c0 100644 --- a/core/l10n/cs_CZ.js +++ b/core/l10n/cs_CZ.js @@ -246,7 +246,6 @@ OC.L10N.register( "Please try again or contact your administrator." : "Prosím zkuste to znovu nebo kontaktujte vašeho správce.", "Wrong password. Reset it?" : "Nesprávné heslo. Resetovat?", "remember" : "zapamatovat", - "Log in" : "Přihlásit", "Alternative Logins" : "Alternativní přihlášení", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Ahoj,

jen ti dávám vědět, že s tebou %s sdílí %s.
Zkontroluj to!

", "This ownCloud instance is currently in single user mode." : "Tato instalace ownCloudu je momentálně v jednouživatelském módu.", diff --git a/core/l10n/cs_CZ.json b/core/l10n/cs_CZ.json index 57e8d974e4d..e9f52cfa46d 100644 --- a/core/l10n/cs_CZ.json +++ b/core/l10n/cs_CZ.json @@ -244,7 +244,6 @@ "Please try again or contact your administrator." : "Prosím zkuste to znovu nebo kontaktujte vašeho správce.", "Wrong password. Reset it?" : "Nesprávné heslo. Resetovat?", "remember" : "zapamatovat", - "Log in" : "Přihlásit", "Alternative Logins" : "Alternativní přihlášení", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Ahoj,

jen ti dávám vědět, že s tebou %s sdílí %s.
Zkontroluj to!

", "This ownCloud instance is currently in single user mode." : "Tato instalace ownCloudu je momentálně v jednouživatelském módu.", diff --git a/core/l10n/cy_GB.js b/core/l10n/cy_GB.js index efc9aaa10c2..5afe9c94ae5 100644 --- a/core/l10n/cy_GB.js +++ b/core/l10n/cy_GB.js @@ -101,7 +101,6 @@ OC.L10N.register( "Log out" : "Allgofnodi", "Search" : "Chwilio", "remember" : "cofio", - "Log in" : "Mewngofnodi", "Alternative Logins" : "Mewngofnodiadau Amgen" }, "nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;"); diff --git a/core/l10n/cy_GB.json b/core/l10n/cy_GB.json index b873c9d84ad..1e37b240bc9 100644 --- a/core/l10n/cy_GB.json +++ b/core/l10n/cy_GB.json @@ -99,7 +99,6 @@ "Log out" : "Allgofnodi", "Search" : "Chwilio", "remember" : "cofio", - "Log in" : "Mewngofnodi", "Alternative Logins" : "Mewngofnodiadau Amgen" },"pluralForm" :"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;" } \ No newline at end of file diff --git a/core/l10n/da.js b/core/l10n/da.js index da1e2106a30..0482ceff99e 100644 --- a/core/l10n/da.js +++ b/core/l10n/da.js @@ -2,6 +2,7 @@ OC.L10N.register( "core", { "Couldn't send mail to following users: %s " : "Kunne ikke sende mail til følgende brugere: %s", + "Preparing update" : "Forbereder opdatering", "Turned on maintenance mode" : "Startede vedligeholdelsestilstand", "Turned off maintenance mode" : "standsede vedligeholdelsestilstand", "Maintenance mode is kept active" : "Vedligeholdelsestilstanden holdes kørende", @@ -13,6 +14,7 @@ OC.L10N.register( "Repair error: " : "Reparationsfejl:", "Following incompatible apps have been disabled: %s" : "Følgende inkompatible apps er blevet deaktiveret: %s", "Following apps have been disabled: %s" : "Følgende apps er blevet deaktiveret: %s", + "Already up to date" : "Allerede opdateret", "File is too big" : "Filen er for stor", "Invalid file provided" : "Der er angivet en ugyldig fil", "No image or file provided" : "Ingen fil eller billede givet", @@ -248,7 +250,6 @@ OC.L10N.register( "Please try again or contact your administrator." : "Kontakt venligst din administrator.", "Wrong password. Reset it?" : "Forkert kodeord. Skal det nulstilles?", "remember" : "husk", - "Log in" : "Log ind", "Alternative Logins" : "Alternative logins", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hej med dig,

Dette er blot for at informere dig om, at %s har delt %s med dig.
Se det her!

", "This ownCloud instance is currently in single user mode." : "Denne ownCloud instans er lige nu i enkeltbruger tilstand.", diff --git a/core/l10n/da.json b/core/l10n/da.json index 287bc96afdc..2396b997877 100644 --- a/core/l10n/da.json +++ b/core/l10n/da.json @@ -1,5 +1,6 @@ { "translations": { "Couldn't send mail to following users: %s " : "Kunne ikke sende mail til følgende brugere: %s", + "Preparing update" : "Forbereder opdatering", "Turned on maintenance mode" : "Startede vedligeholdelsestilstand", "Turned off maintenance mode" : "standsede vedligeholdelsestilstand", "Maintenance mode is kept active" : "Vedligeholdelsestilstanden holdes kørende", @@ -11,6 +12,7 @@ "Repair error: " : "Reparationsfejl:", "Following incompatible apps have been disabled: %s" : "Følgende inkompatible apps er blevet deaktiveret: %s", "Following apps have been disabled: %s" : "Følgende apps er blevet deaktiveret: %s", + "Already up to date" : "Allerede opdateret", "File is too big" : "Filen er for stor", "Invalid file provided" : "Der er angivet en ugyldig fil", "No image or file provided" : "Ingen fil eller billede givet", @@ -246,7 +248,6 @@ "Please try again or contact your administrator." : "Kontakt venligst din administrator.", "Wrong password. Reset it?" : "Forkert kodeord. Skal det nulstilles?", "remember" : "husk", - "Log in" : "Log ind", "Alternative Logins" : "Alternative logins", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hej med dig,

Dette er blot for at informere dig om, at %s har delt %s med dig.
Se det her!

", "This ownCloud instance is currently in single user mode." : "Denne ownCloud instans er lige nu i enkeltbruger tilstand.", diff --git a/core/l10n/de.js b/core/l10n/de.js index 1361a970a42..2662e0d895f 100644 --- a/core/l10n/de.js +++ b/core/l10n/de.js @@ -239,7 +239,6 @@ OC.L10N.register( "Please try again or contact your administrator." : "Bitte versuche es noch einmal oder kontaktiere Deinen Administrator.", "Wrong password. Reset it?" : "Falsches Passwort. Soll es zurückgesetzt werden?", "remember" : "merken", - "Log in" : "Einloggen", "Alternative Logins" : "Alternative Logins", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hallo,

hier nur kurz die Mitteilung, dass %s %s mit Dir geteilt hat.
Sieh es Dir an!

", "This ownCloud instance is currently in single user mode." : "Diese ownClound-Instanz befindet sich derzeit im Einzelbenutzermodus.", diff --git a/core/l10n/de.json b/core/l10n/de.json index 3eee17db65e..2da213c6116 100644 --- a/core/l10n/de.json +++ b/core/l10n/de.json @@ -237,7 +237,6 @@ "Please try again or contact your administrator." : "Bitte versuche es noch einmal oder kontaktiere Deinen Administrator.", "Wrong password. Reset it?" : "Falsches Passwort. Soll es zurückgesetzt werden?", "remember" : "merken", - "Log in" : "Einloggen", "Alternative Logins" : "Alternative Logins", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hallo,

hier nur kurz die Mitteilung, dass %s %s mit Dir geteilt hat.
Sieh es Dir an!

", "This ownCloud instance is currently in single user mode." : "Diese ownClound-Instanz befindet sich derzeit im Einzelbenutzermodus.", diff --git a/core/l10n/de_DE.js b/core/l10n/de_DE.js index 0feca899f9d..6a77c3952c3 100644 --- a/core/l10n/de_DE.js +++ b/core/l10n/de_DE.js @@ -238,7 +238,6 @@ OC.L10N.register( "Please try again or contact your administrator." : "Bitte versuchen Sie es noch einmal oder kontaktieren Sie Ihren Administrator.", "Wrong password. Reset it?" : "Falsches Passwort. Soll es zurückgesetzt werden?", "remember" : "merken", - "Log in" : "Einloggen", "Alternative Logins" : "Alternative Logins", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hallo,

hier nur kurz die Mitteilung, dass %s %s mit Ihnen geteilt hat.
Sehen Sie es sich an!

", "This ownCloud instance is currently in single user mode." : "Diese ownClound-Instanz befindet sich derzeit im Einzelbenutzermodus.", diff --git a/core/l10n/de_DE.json b/core/l10n/de_DE.json index 83359463920..fc6dc12aa17 100644 --- a/core/l10n/de_DE.json +++ b/core/l10n/de_DE.json @@ -236,7 +236,6 @@ "Please try again or contact your administrator." : "Bitte versuchen Sie es noch einmal oder kontaktieren Sie Ihren Administrator.", "Wrong password. Reset it?" : "Falsches Passwort. Soll es zurückgesetzt werden?", "remember" : "merken", - "Log in" : "Einloggen", "Alternative Logins" : "Alternative Logins", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hallo,

hier nur kurz die Mitteilung, dass %s %s mit Ihnen geteilt hat.
Sehen Sie es sich an!

", "This ownCloud instance is currently in single user mode." : "Diese ownClound-Instanz befindet sich derzeit im Einzelbenutzermodus.", diff --git a/core/l10n/el.js b/core/l10n/el.js index 0eb62981306..03ecc018c05 100644 --- a/core/l10n/el.js +++ b/core/l10n/el.js @@ -2,6 +2,7 @@ OC.L10N.register( "core", { "Couldn't send mail to following users: %s " : "Αδυναμία αποστολής μηνύματος στους ακόλουθους χρήστες: %s", + "Preparing update" : "Προετοιμασία ενημέρωσης", "Turned on maintenance mode" : "Η κατάσταση συντήρησης ενεργοποιήθηκε", "Turned off maintenance mode" : "Η κατάσταση συντήρησης απενεργοποιήθηκε", "Maintenance mode is kept active" : "Η λειτουργία συντήρησης διατηρήθηκε ενεργή", @@ -13,6 +14,7 @@ OC.L10N.register( "Repair error: " : "Σφάλμα διόρθωσης:", "Following incompatible apps have been disabled: %s" : "Οι παρακάτω εφαρμογές έχουν απενεργοποιηθεί: %s", "Following apps have been disabled: %s" : "Οι ακόλουθες εφαρμογές έχουν απενεργοποιηθεί: %s", + "Already up to date" : "Ήδη ενημερωμένο", "File is too big" : "Το αρχείο είναι πολύ μεγάλο", "Invalid file provided" : "Έχει δοθεί μη έγκυρο αρχείο", "No image or file provided" : "Δεν δόθηκε εικόνα ή αρχείο", @@ -248,7 +250,6 @@ OC.L10N.register( "Please try again or contact your administrator." : "Παρακαλώ δοκιμάστε ξανά ή επικοινωνήστε με τον διαχειριστή σας.", "Wrong password. Reset it?" : "Λάθος Κωδικός. Επαναφορά;", "remember" : "απομνημόνευση", - "Log in" : "Είσοδος", "Alternative Logins" : "Εναλλακτικές Συνδέσεις", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Γειά χαρά,

απλά σας ενημερώνω πως ο %s μοιράστηκε το%s με εσάς.
Δείτε το!

", "This ownCloud instance is currently in single user mode." : "Αυτή η εγκατάσταση ownCloud είναι τώρα σε κατάσταση ενός χρήστη.", diff --git a/core/l10n/el.json b/core/l10n/el.json index 507da1690ea..4e901e6606b 100644 --- a/core/l10n/el.json +++ b/core/l10n/el.json @@ -1,5 +1,6 @@ { "translations": { "Couldn't send mail to following users: %s " : "Αδυναμία αποστολής μηνύματος στους ακόλουθους χρήστες: %s", + "Preparing update" : "Προετοιμασία ενημέρωσης", "Turned on maintenance mode" : "Η κατάσταση συντήρησης ενεργοποιήθηκε", "Turned off maintenance mode" : "Η κατάσταση συντήρησης απενεργοποιήθηκε", "Maintenance mode is kept active" : "Η λειτουργία συντήρησης διατηρήθηκε ενεργή", @@ -11,6 +12,7 @@ "Repair error: " : "Σφάλμα διόρθωσης:", "Following incompatible apps have been disabled: %s" : "Οι παρακάτω εφαρμογές έχουν απενεργοποιηθεί: %s", "Following apps have been disabled: %s" : "Οι ακόλουθες εφαρμογές έχουν απενεργοποιηθεί: %s", + "Already up to date" : "Ήδη ενημερωμένο", "File is too big" : "Το αρχείο είναι πολύ μεγάλο", "Invalid file provided" : "Έχει δοθεί μη έγκυρο αρχείο", "No image or file provided" : "Δεν δόθηκε εικόνα ή αρχείο", @@ -246,7 +248,6 @@ "Please try again or contact your administrator." : "Παρακαλώ δοκιμάστε ξανά ή επικοινωνήστε με τον διαχειριστή σας.", "Wrong password. Reset it?" : "Λάθος Κωδικός. Επαναφορά;", "remember" : "απομνημόνευση", - "Log in" : "Είσοδος", "Alternative Logins" : "Εναλλακτικές Συνδέσεις", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Γειά χαρά,

απλά σας ενημερώνω πως ο %s μοιράστηκε το%s με εσάς.
Δείτε το!

", "This ownCloud instance is currently in single user mode." : "Αυτή η εγκατάσταση ownCloud είναι τώρα σε κατάσταση ενός χρήστη.", diff --git a/core/l10n/en_GB.js b/core/l10n/en_GB.js index 7730ff8a530..e3760b6f2bc 100644 --- a/core/l10n/en_GB.js +++ b/core/l10n/en_GB.js @@ -231,7 +231,6 @@ OC.L10N.register( "An internal error occured." : "An internal error occured.", "Please try again or contact your administrator." : "Please try again or contact your administrator.", "remember" : "remember", - "Log in" : "Log in", "Alternative Logins" : "Alternative Logins", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hey there,

just letting you know that %s shared %s with you.
View it!

", "This ownCloud instance is currently in single user mode." : "This ownCloud instance is currently in single user mode.", diff --git a/core/l10n/en_GB.json b/core/l10n/en_GB.json index a2bd71be34d..4c76d47111e 100644 --- a/core/l10n/en_GB.json +++ b/core/l10n/en_GB.json @@ -229,7 +229,6 @@ "An internal error occured." : "An internal error occured.", "Please try again or contact your administrator." : "Please try again or contact your administrator.", "remember" : "remember", - "Log in" : "Log in", "Alternative Logins" : "Alternative Logins", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hey there,

just letting you know that %s shared %s with you.
View it!

", "This ownCloud instance is currently in single user mode." : "This ownCloud instance is currently in single user mode.", diff --git a/core/l10n/eo.js b/core/l10n/eo.js index 0b32ad7339d..78a571a798a 100644 --- a/core/l10n/eo.js +++ b/core/l10n/eo.js @@ -130,7 +130,6 @@ OC.L10N.register( "Search" : "Serĉi", "Please contact your administrator." : "Bonvolu kontakti vian administranton.", "remember" : "memori", - "Log in" : "Ensaluti", "Alternative Logins" : "Alternativaj ensalutoj", "Thank you for your patience." : "Dankon pro via pacienco." }, diff --git a/core/l10n/eo.json b/core/l10n/eo.json index 383e50a010f..401e9327560 100644 --- a/core/l10n/eo.json +++ b/core/l10n/eo.json @@ -128,7 +128,6 @@ "Search" : "Serĉi", "Please contact your administrator." : "Bonvolu kontakti vian administranton.", "remember" : "memori", - "Log in" : "Ensaluti", "Alternative Logins" : "Alternativaj ensalutoj", "Thank you for your patience." : "Dankon pro via pacienco." },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/core/l10n/es.js b/core/l10n/es.js index 376fd97dc94..303e0707402 100644 --- a/core/l10n/es.js +++ b/core/l10n/es.js @@ -105,7 +105,7 @@ OC.L10N.register( "Error occurred while checking server setup" : "Ha ocurrido un error al revisar la configuración del servidor", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "La \"{header}\" cabecera HTTP no está configurado para ser igual a \"{expected}\". Esto puede suponer un riesgo para la seguridad o la privacidad, por lo que se recomienda ajustar esta opción.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our security tips." : "La cabecera HTTP \"Strict-Transport-Security\" no está configurada en al menos \"{segundos}\" segundos. Para una mejor seguridad recomendamos que habilite HSTS como es descripta en nuestros consejos de seguridad.", - "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our security tips." : "Esta ingresando a este sitio de internet vía HTTP. Sugerimos fuertemente que configure su servidor que utilice HTTPS como es descripto en nuestros consejos de seguridad.", + "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our security tips." : "Está ingresando a este sitio de internet vía HTTP. Le sugerimos enérgicamente que configure su servidor que utilice HTTPS como se describe en nuestros consejos de seguridad.", "Shared" : "Compartido", "Shared with {recipients}" : "Compartido con {recipients}", "Error" : "Error", @@ -115,7 +115,7 @@ OC.L10N.register( "Shared with you and the group {group} by {owner}" : "Compartido contigo y el grupo {group} por {owner}", "Shared with you by {owner}" : "Compartido contigo por {owner}", "Share with users or groups …" : "Compartir con usuarios o grupos ...", - "Share with users, groups or remote users …" : "Comparte con usuarios, grupos o usuarios remotos ...", + "Share with users, groups or remote users …" : "Comparte con usuarios, grupos o usuarios remotos...", "Share" : "Compartir", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Comparta con personas en otros ownClouds utilizando la sintáxis username@example.com/owncloud", "Share link" : "Enlace compartido", @@ -234,7 +234,7 @@ OC.L10N.register( "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "El uso de SQLite esta desaconsejado especialmente cuando se usa el cliente de escritorio para sincronizar los ficheros.", "Finish setup" : "Completar la instalación", "Finishing …" : "Finalizando...", - "Need help?" : "Necesita ayuda?", + "Need help?" : "¿Necesita ayuda?", "See the documentation" : "Vea la documentación", "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Esta aplicación requiere JavaScript para operar correctamente. Por favor, {linkstart}habilite JavaScript{linkend} y recargue la página.", "Log out" : "Salir", @@ -245,7 +245,6 @@ OC.L10N.register( "Please try again or contact your administrator." : "Por favor reintente nuevamente o contáctese con su administrador.", "Wrong password. Reset it?" : "Contraseña incorrecta. ¿Restablecerla?", "remember" : "recordar", - "Log in" : "Entrar", "Alternative Logins" : "Inicios de sesión alternativos", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hola:

Te comentamos que %s compartió %s contigo.
¡Échale un vistazo!

", "This ownCloud instance is currently in single user mode." : "Esta instalación de ownCloud se encuentra en modo de usuario único.", diff --git a/core/l10n/es.json b/core/l10n/es.json index 6975ce15c6a..34547fff630 100644 --- a/core/l10n/es.json +++ b/core/l10n/es.json @@ -103,7 +103,7 @@ "Error occurred while checking server setup" : "Ha ocurrido un error al revisar la configuración del servidor", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "La \"{header}\" cabecera HTTP no está configurado para ser igual a \"{expected}\". Esto puede suponer un riesgo para la seguridad o la privacidad, por lo que se recomienda ajustar esta opción.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our security tips." : "La cabecera HTTP \"Strict-Transport-Security\" no está configurada en al menos \"{segundos}\" segundos. Para una mejor seguridad recomendamos que habilite HSTS como es descripta en nuestros consejos de seguridad.", - "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our security tips." : "Esta ingresando a este sitio de internet vía HTTP. Sugerimos fuertemente que configure su servidor que utilice HTTPS como es descripto en nuestros consejos de seguridad.", + "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our security tips." : "Está ingresando a este sitio de internet vía HTTP. Le sugerimos enérgicamente que configure su servidor que utilice HTTPS como se describe en nuestros consejos de seguridad.", "Shared" : "Compartido", "Shared with {recipients}" : "Compartido con {recipients}", "Error" : "Error", @@ -113,7 +113,7 @@ "Shared with you and the group {group} by {owner}" : "Compartido contigo y el grupo {group} por {owner}", "Shared with you by {owner}" : "Compartido contigo por {owner}", "Share with users or groups …" : "Compartir con usuarios o grupos ...", - "Share with users, groups or remote users …" : "Comparte con usuarios, grupos o usuarios remotos ...", + "Share with users, groups or remote users …" : "Comparte con usuarios, grupos o usuarios remotos...", "Share" : "Compartir", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Comparta con personas en otros ownClouds utilizando la sintáxis username@example.com/owncloud", "Share link" : "Enlace compartido", @@ -232,7 +232,7 @@ "Especially when using the desktop client for file syncing the use of SQLite is discouraged." : "El uso de SQLite esta desaconsejado especialmente cuando se usa el cliente de escritorio para sincronizar los ficheros.", "Finish setup" : "Completar la instalación", "Finishing …" : "Finalizando...", - "Need help?" : "Necesita ayuda?", + "Need help?" : "¿Necesita ayuda?", "See the documentation" : "Vea la documentación", "This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Esta aplicación requiere JavaScript para operar correctamente. Por favor, {linkstart}habilite JavaScript{linkend} y recargue la página.", "Log out" : "Salir", @@ -243,7 +243,6 @@ "Please try again or contact your administrator." : "Por favor reintente nuevamente o contáctese con su administrador.", "Wrong password. Reset it?" : "Contraseña incorrecta. ¿Restablecerla?", "remember" : "recordar", - "Log in" : "Entrar", "Alternative Logins" : "Inicios de sesión alternativos", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hola:

Te comentamos que %s compartió %s contigo.
¡Échale un vistazo!

", "This ownCloud instance is currently in single user mode." : "Esta instalación de ownCloud se encuentra en modo de usuario único.", diff --git a/core/l10n/es_AR.js b/core/l10n/es_AR.js index 43ef513c434..5cc18198864 100644 --- a/core/l10n/es_AR.js +++ b/core/l10n/es_AR.js @@ -150,7 +150,6 @@ OC.L10N.register( "Server side authentication failed!" : "¡Falló la autenticación del servidor!", "Please contact your administrator." : "Por favor, contacte a su administrador.", "remember" : "recordame", - "Log in" : "Iniciar sesión", "Alternative Logins" : "Nombre alternativos de usuarios", "This ownCloud instance is currently in single user mode." : "Esta instancia de ownCloud está en modo de usuario único.", "This means only administrators can use the instance." : "Esto significa que solo administradores pueden usar esta instancia.", diff --git a/core/l10n/es_AR.json b/core/l10n/es_AR.json index 09b42de22bc..8ccb4cedb4b 100644 --- a/core/l10n/es_AR.json +++ b/core/l10n/es_AR.json @@ -148,7 +148,6 @@ "Server side authentication failed!" : "¡Falló la autenticación del servidor!", "Please contact your administrator." : "Por favor, contacte a su administrador.", "remember" : "recordame", - "Log in" : "Iniciar sesión", "Alternative Logins" : "Nombre alternativos de usuarios", "This ownCloud instance is currently in single user mode." : "Esta instancia de ownCloud está en modo de usuario único.", "This means only administrators can use the instance." : "Esto significa que solo administradores pueden usar esta instancia.", diff --git a/core/l10n/es_MX.js b/core/l10n/es_MX.js index 9b71d4a5aaa..7c4ca4a2d61 100644 --- a/core/l10n/es_MX.js +++ b/core/l10n/es_MX.js @@ -144,7 +144,6 @@ OC.L10N.register( "Server side authentication failed!" : "La autenticación a fallado en el servidor.", "Please contact your administrator." : "Por favor, contacte con el administrador.", "remember" : "recordar", - "Log in" : "Entrar", "Alternative Logins" : "Accesos Alternativos", "This ownCloud instance is currently in single user mode." : "Esta instalación de ownCloud se encuentra en modo de usuario único.", "This means only administrators can use the instance." : "Esto quiere decir que solo un administrador puede usarla.", diff --git a/core/l10n/es_MX.json b/core/l10n/es_MX.json index 8d95cef6c26..45b55e8f283 100644 --- a/core/l10n/es_MX.json +++ b/core/l10n/es_MX.json @@ -142,7 +142,6 @@ "Server side authentication failed!" : "La autenticación a fallado en el servidor.", "Please contact your administrator." : "Por favor, contacte con el administrador.", "remember" : "recordar", - "Log in" : "Entrar", "Alternative Logins" : "Accesos Alternativos", "This ownCloud instance is currently in single user mode." : "Esta instalación de ownCloud se encuentra en modo de usuario único.", "This means only administrators can use the instance." : "Esto quiere decir que solo un administrador puede usarla.", diff --git a/core/l10n/et_EE.js b/core/l10n/et_EE.js index 1cff2557cb0..3e517277f53 100644 --- a/core/l10n/et_EE.js +++ b/core/l10n/et_EE.js @@ -218,7 +218,6 @@ OC.L10N.register( "An internal error occured." : "Tekkis sisemine tõrge.", "Please try again or contact your administrator." : "Palun proovi uuesti või võta ühendust oma administraatoriga.", "remember" : "pea meeles", - "Log in" : "Logi sisse", "Alternative Logins" : "Alternatiivsed sisselogimisviisid", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hei,

annan teada, et %s jagas sinuga %s. Vaata seda!

", "This ownCloud instance is currently in single user mode." : "See ownCloud on momendil seadistatud ühe kasutaja jaoks.", diff --git a/core/l10n/et_EE.json b/core/l10n/et_EE.json index 94ebd08dece..73839f889ca 100644 --- a/core/l10n/et_EE.json +++ b/core/l10n/et_EE.json @@ -216,7 +216,6 @@ "An internal error occured." : "Tekkis sisemine tõrge.", "Please try again or contact your administrator." : "Palun proovi uuesti või võta ühendust oma administraatoriga.", "remember" : "pea meeles", - "Log in" : "Logi sisse", "Alternative Logins" : "Alternatiivsed sisselogimisviisid", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hei,

annan teada, et %s jagas sinuga %s. Vaata seda!

", "This ownCloud instance is currently in single user mode." : "See ownCloud on momendil seadistatud ühe kasutaja jaoks.", diff --git a/core/l10n/eu.js b/core/l10n/eu.js index 0d965759770..e215b870125 100644 --- a/core/l10n/eu.js +++ b/core/l10n/eu.js @@ -200,7 +200,6 @@ OC.L10N.register( "Server side authentication failed!" : "Zerbitzari aldeko autentifikazioak huts egin du!", "Please contact your administrator." : "Mesedez jarri harremetan zure administradorearekin.", "remember" : "gogoratu", - "Log in" : "Hasi saioa", "Alternative Logins" : "Beste erabiltzaile izenak", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Kaixo

%s-ek %s zurekin partekatu duela jakin dezazun.\nIkusi ezazu: %s", "This ownCloud instance is currently in single user mode." : "ownCloud instantzia hau erabiltzaile bakar moduan dago.", diff --git a/core/l10n/eu.json b/core/l10n/eu.json index 9206ed66d71..9af46ca9cfb 100644 --- a/core/l10n/eu.json +++ b/core/l10n/eu.json @@ -198,7 +198,6 @@ "Server side authentication failed!" : "Zerbitzari aldeko autentifikazioak huts egin du!", "Please contact your administrator." : "Mesedez jarri harremetan zure administradorearekin.", "remember" : "gogoratu", - "Log in" : "Hasi saioa", "Alternative Logins" : "Beste erabiltzaile izenak", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Kaixo

%s-ek %s zurekin partekatu duela jakin dezazun.\nIkusi ezazu: %s", "This ownCloud instance is currently in single user mode." : "ownCloud instantzia hau erabiltzaile bakar moduan dago.", diff --git a/core/l10n/fa.js b/core/l10n/fa.js index bfb76506984..12bdd37eaba 100644 --- a/core/l10n/fa.js +++ b/core/l10n/fa.js @@ -146,7 +146,6 @@ OC.L10N.register( "Log out" : "خروج", "Search" : "جست‌و‌جو", "remember" : "بیاد آوری", - "Log in" : "ورود", "Alternative Logins" : "ورود متناوب", "Thank you for your patience." : "از صبر شما متشکریم", "Start update" : "اغاز به روز رسانی" diff --git a/core/l10n/fa.json b/core/l10n/fa.json index a1af42495ab..22a8e2eb0f5 100644 --- a/core/l10n/fa.json +++ b/core/l10n/fa.json @@ -144,7 +144,6 @@ "Log out" : "خروج", "Search" : "جست‌و‌جو", "remember" : "بیاد آوری", - "Log in" : "ورود", "Alternative Logins" : "ورود متناوب", "Thank you for your patience." : "از صبر شما متشکریم", "Start update" : "اغاز به روز رسانی" diff --git a/core/l10n/fi_FI.js b/core/l10n/fi_FI.js index 29839e4d3fe..2893ce8ae2a 100644 --- a/core/l10n/fi_FI.js +++ b/core/l10n/fi_FI.js @@ -2,6 +2,7 @@ OC.L10N.register( "core", { "Couldn't send mail to following users: %s " : "Sähköpostin lähetys seuraaville käyttäjille epäonnistui: %s", + "Preparing update" : "Valmistellaan päivitystä", "Turned on maintenance mode" : "Siirrytty huoltotilaan", "Turned off maintenance mode" : "Huoltotila asetettu pois päältä", "Maintenance mode is kept active" : "Huoltotila pidetään aktiivisena", @@ -13,6 +14,7 @@ OC.L10N.register( "Repair error: " : "Korjausvirhe:", "Following incompatible apps have been disabled: %s" : "Seuraavat yhteensopimattomat sovellukset on poistettu käytöstä: %s", "Following apps have been disabled: %s" : "Seuraavat sovellukset on poistettu käytöstä: %s", + "Already up to date" : "Kaikki on jo ajan tasalla", "File is too big" : "Tiedosto on liian suuri", "Invalid file provided" : "Määritetty virheellinen tiedosto", "No image or file provided" : "Kuvaa tai tiedostoa ei määritelty", @@ -248,7 +250,6 @@ OC.L10N.register( "Please try again or contact your administrator." : "Yritä uudestaan tai ota yhteys ylläpitäjään.", "Wrong password. Reset it?" : "Väärä salasana. Haluatko palauttaa salasanan?", "remember" : "muista", - "Log in" : "Kirjaudu sisään", "Alternative Logins" : "Vaihtoehtoiset kirjautumiset", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hei!

%s jakoi kanssasi kohteen %s.
Tutustu siihen!

", "This ownCloud instance is currently in single user mode." : "Tämä ownCloud-asennus on parhaillaan single user -tilassa.", diff --git a/core/l10n/fi_FI.json b/core/l10n/fi_FI.json index 01e11ab7e48..21316024e73 100644 --- a/core/l10n/fi_FI.json +++ b/core/l10n/fi_FI.json @@ -1,5 +1,6 @@ { "translations": { "Couldn't send mail to following users: %s " : "Sähköpostin lähetys seuraaville käyttäjille epäonnistui: %s", + "Preparing update" : "Valmistellaan päivitystä", "Turned on maintenance mode" : "Siirrytty huoltotilaan", "Turned off maintenance mode" : "Huoltotila asetettu pois päältä", "Maintenance mode is kept active" : "Huoltotila pidetään aktiivisena", @@ -11,6 +12,7 @@ "Repair error: " : "Korjausvirhe:", "Following incompatible apps have been disabled: %s" : "Seuraavat yhteensopimattomat sovellukset on poistettu käytöstä: %s", "Following apps have been disabled: %s" : "Seuraavat sovellukset on poistettu käytöstä: %s", + "Already up to date" : "Kaikki on jo ajan tasalla", "File is too big" : "Tiedosto on liian suuri", "Invalid file provided" : "Määritetty virheellinen tiedosto", "No image or file provided" : "Kuvaa tai tiedostoa ei määritelty", @@ -246,7 +248,6 @@ "Please try again or contact your administrator." : "Yritä uudestaan tai ota yhteys ylläpitäjään.", "Wrong password. Reset it?" : "Väärä salasana. Haluatko palauttaa salasanan?", "remember" : "muista", - "Log in" : "Kirjaudu sisään", "Alternative Logins" : "Vaihtoehtoiset kirjautumiset", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hei!

%s jakoi kanssasi kohteen %s.
Tutustu siihen!

", "This ownCloud instance is currently in single user mode." : "Tämä ownCloud-asennus on parhaillaan single user -tilassa.", diff --git a/core/l10n/fr.js b/core/l10n/fr.js index fc5881d83fe..8b0fbdbe836 100644 --- a/core/l10n/fr.js +++ b/core/l10n/fr.js @@ -247,7 +247,6 @@ OC.L10N.register( "Please try again or contact your administrator." : "Veuillez réessayer ou contacter votre administrateur.", "Wrong password. Reset it?" : "Mot de passe incorrect. Réinitialiser ?", "remember" : "se souvenir de moi", - "Log in" : "Connexion", "Alternative Logins" : "Identifiants alternatifs", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Bonjour,

Nous vous informons que %s a partagé %s avec vous.
Cliquez ici pour y accéder !

", "This ownCloud instance is currently in single user mode." : "Cette instance de ownCloud est actuellement en mode utilisateur unique.", diff --git a/core/l10n/fr.json b/core/l10n/fr.json index 7ee6a35ae20..2eb2a722298 100644 --- a/core/l10n/fr.json +++ b/core/l10n/fr.json @@ -245,7 +245,6 @@ "Please try again or contact your administrator." : "Veuillez réessayer ou contacter votre administrateur.", "Wrong password. Reset it?" : "Mot de passe incorrect. Réinitialiser ?", "remember" : "se souvenir de moi", - "Log in" : "Connexion", "Alternative Logins" : "Identifiants alternatifs", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Bonjour,

Nous vous informons que %s a partagé %s avec vous.
Cliquez ici pour y accéder !

", "This ownCloud instance is currently in single user mode." : "Cette instance de ownCloud est actuellement en mode utilisateur unique.", diff --git a/core/l10n/gl.js b/core/l10n/gl.js index c3cd6303631..f53866cdc08 100644 --- a/core/l10n/gl.js +++ b/core/l10n/gl.js @@ -244,7 +244,6 @@ OC.L10N.register( "An internal error occured." : "Produciuse un erro interno.", "Please try again or contact your administrator." : "Ténteo de novo ou póñase en contacto co administrador.", "remember" : "lembrar", - "Log in" : "Conectar", "Alternative Logins" : "Accesos alternativos", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Ola,

só facerlle saber que %s compartiu %s con vostede.
Véxao!

", "This ownCloud instance is currently in single user mode." : "Esta instancia do ownCloud está actualmente en modo de usuario único.", diff --git a/core/l10n/gl.json b/core/l10n/gl.json index 72bb146e0e3..1542d83210c 100644 --- a/core/l10n/gl.json +++ b/core/l10n/gl.json @@ -242,7 +242,6 @@ "An internal error occured." : "Produciuse un erro interno.", "Please try again or contact your administrator." : "Ténteo de novo ou póñase en contacto co administrador.", "remember" : "lembrar", - "Log in" : "Conectar", "Alternative Logins" : "Accesos alternativos", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Ola,

só facerlle saber que %s compartiu %s con vostede.
Véxao!

", "This ownCloud instance is currently in single user mode." : "Esta instancia do ownCloud está actualmente en modo de usuario único.", diff --git a/core/l10n/he.js b/core/l10n/he.js index 4ca06adfc53..4692495cccb 100644 --- a/core/l10n/he.js +++ b/core/l10n/he.js @@ -104,7 +104,6 @@ OC.L10N.register( "Log out" : "התנתקות", "Search" : "חיפוש", "remember" : "שמירת הססמה", - "Log in" : "כניסה", "Alternative Logins" : "כניסות אלטרנטיביות" }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/he.json b/core/l10n/he.json index f2013f1f621..fe873e0b02c 100644 --- a/core/l10n/he.json +++ b/core/l10n/he.json @@ -102,7 +102,6 @@ "Log out" : "התנתקות", "Search" : "חיפוש", "remember" : "שמירת הססמה", - "Log in" : "כניסה", "Alternative Logins" : "כניסות אלטרנטיביות" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/core/l10n/hr.js b/core/l10n/hr.js index d79d0a2e455..9d0c1ddeb49 100644 --- a/core/l10n/hr.js +++ b/core/l10n/hr.js @@ -200,7 +200,6 @@ OC.L10N.register( "Server side authentication failed!" : "Autentikacija na strani poslužitelja nije uspjela!", "Please contact your administrator." : "Molimo kontaktirajte svog administratora.", "remember" : "Sjetite se", - "Log in" : "Prijavite se", "Alternative Logins" : "Alternativne prijave", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hej,

vam upravo javlja da je %s podijelio %ss vama.
POgledajte!

", "This ownCloud instance is currently in single user mode." : "Ova ownCloud instanca je trenutno u načinu rada za jednog korisnika.", diff --git a/core/l10n/hr.json b/core/l10n/hr.json index 19637fb27a0..1472b8aaa0d 100644 --- a/core/l10n/hr.json +++ b/core/l10n/hr.json @@ -198,7 +198,6 @@ "Server side authentication failed!" : "Autentikacija na strani poslužitelja nije uspjela!", "Please contact your administrator." : "Molimo kontaktirajte svog administratora.", "remember" : "Sjetite se", - "Log in" : "Prijavite se", "Alternative Logins" : "Alternativne prijave", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hej,

vam upravo javlja da je %s podijelio %ss vama.
POgledajte!

", "This ownCloud instance is currently in single user mode." : "Ova ownCloud instanca je trenutno u načinu rada za jednog korisnika.", diff --git a/core/l10n/hu_HU.js b/core/l10n/hu_HU.js index 25a0caad57f..ff04fe9900c 100644 --- a/core/l10n/hu_HU.js +++ b/core/l10n/hu_HU.js @@ -247,7 +247,6 @@ OC.L10N.register( "Please try again or contact your administrator." : "Kérem próbálja újra, vagy vegye fel a kapcsolatot a rendszergazdával.", "Wrong password. Reset it?" : "Hibás jelszó. Visszaállítja?", "remember" : "emlékezzen", - "Log in" : "Bejelentkezés", "Alternative Logins" : "Alternatív bejelentkezés", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Üdvözöljük!

\n\nÉrtesítjük, hogy %s megosztotta Önnel ezt az állományt: %s
\nItt lehet megnézni!

", "This ownCloud instance is currently in single user mode." : "Ez az ownCloud szolgáltatás jelenleg egyfelhasználós üzemmódban működik.", diff --git a/core/l10n/hu_HU.json b/core/l10n/hu_HU.json index 9fe7b6e5d23..d7c20ae181b 100644 --- a/core/l10n/hu_HU.json +++ b/core/l10n/hu_HU.json @@ -245,7 +245,6 @@ "Please try again or contact your administrator." : "Kérem próbálja újra, vagy vegye fel a kapcsolatot a rendszergazdával.", "Wrong password. Reset it?" : "Hibás jelszó. Visszaállítja?", "remember" : "emlékezzen", - "Log in" : "Bejelentkezés", "Alternative Logins" : "Alternatív bejelentkezés", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Üdvözöljük!

\n\nÉrtesítjük, hogy %s megosztotta Önnel ezt az állományt: %s
\nItt lehet megnézni!

", "This ownCloud instance is currently in single user mode." : "Ez az ownCloud szolgáltatás jelenleg egyfelhasználós üzemmódban működik.", diff --git a/core/l10n/ia.js b/core/l10n/ia.js index 201585e9890..15842447aa8 100644 --- a/core/l10n/ia.js +++ b/core/l10n/ia.js @@ -157,7 +157,6 @@ OC.L10N.register( "Server side authentication failed!" : "Il falleva authentication de latere servitor!", "Please contact your administrator." : "Pro favor continge tu administrator.", "remember" : "memora", - "Log in" : "Aperir session", "Alternative Logins" : "Accessos de autorisation alternative", "Thank you for your patience." : "Gratias pro tu patientia.", "Start update" : "Initia actualisation" diff --git a/core/l10n/ia.json b/core/l10n/ia.json index 2f4d11bfcf8..649e667bdcb 100644 --- a/core/l10n/ia.json +++ b/core/l10n/ia.json @@ -155,7 +155,6 @@ "Server side authentication failed!" : "Il falleva authentication de latere servitor!", "Please contact your administrator." : "Pro favor continge tu administrator.", "remember" : "memora", - "Log in" : "Aperir session", "Alternative Logins" : "Accessos de autorisation alternative", "Thank you for your patience." : "Gratias pro tu patientia.", "Start update" : "Initia actualisation" diff --git a/core/l10n/id.js b/core/l10n/id.js index ea5f96015d0..9af2d3bad0c 100644 --- a/core/l10n/id.js +++ b/core/l10n/id.js @@ -247,7 +247,6 @@ OC.L10N.register( "Please try again or contact your administrator." : "Mohon coba lagi atau hubungi administrator Anda.", "Wrong password. Reset it?" : "Sandi salah. Atur ulang?", "remember" : "selalu masuk", - "Log in" : "Masuk", "Alternative Logins" : "Cara Alternatif untuk Masuk", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hai,

hanya memberi tahu jika %s membagikan %s dengan Anda.
Lihat!

", "This ownCloud instance is currently in single user mode." : "ownCloud ini sedang dalam mode pengguna tunggal.", diff --git a/core/l10n/id.json b/core/l10n/id.json index 606cdb063a8..79a84db45c5 100644 --- a/core/l10n/id.json +++ b/core/l10n/id.json @@ -245,7 +245,6 @@ "Please try again or contact your administrator." : "Mohon coba lagi atau hubungi administrator Anda.", "Wrong password. Reset it?" : "Sandi salah. Atur ulang?", "remember" : "selalu masuk", - "Log in" : "Masuk", "Alternative Logins" : "Cara Alternatif untuk Masuk", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hai,

hanya memberi tahu jika %s membagikan %s dengan Anda.
Lihat!

", "This ownCloud instance is currently in single user mode." : "ownCloud ini sedang dalam mode pengguna tunggal.", diff --git a/core/l10n/is.js b/core/l10n/is.js index 16860e5afcb..346e4f5306f 100644 --- a/core/l10n/is.js +++ b/core/l10n/is.js @@ -2,6 +2,7 @@ OC.L10N.register( "core", { "Couldn't send mail to following users: %s " : "Gat ekki sent póst á eftirfarandi notanda: %s", + "Preparing update" : "Undirbúa uppfærslu", "Turned on maintenance mode" : "Kveikt á viðhaldsham", "Turned off maintenance mode" : "Slökkt á viðhaldsham", "Maintenance mode is kept active" : "viðhaldshami er haldið virkur", @@ -248,7 +249,6 @@ OC.L10N.register( "Please try again or contact your administrator." : "Vinsamlegast reyndu aftur eða hafðu samband við kerfisstjóra.", "Wrong password. Reset it?" : "Rangt lykilorð. Endursetja?", "remember" : "muna eftir mér", - "Log in" : "Skrá inn", "Alternative Logins" : "Aðrar Innskráningar", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Sælir ,

bara láta þig vita að %s deildi %s með þér.
Skoða það!

", "This ownCloud instance is currently in single user mode." : "Þetta ownCloud eintak er nú í einnar notandaham.", diff --git a/core/l10n/is.json b/core/l10n/is.json index 7fb3457de9c..a89b268d760 100644 --- a/core/l10n/is.json +++ b/core/l10n/is.json @@ -1,5 +1,6 @@ { "translations": { "Couldn't send mail to following users: %s " : "Gat ekki sent póst á eftirfarandi notanda: %s", + "Preparing update" : "Undirbúa uppfærslu", "Turned on maintenance mode" : "Kveikt á viðhaldsham", "Turned off maintenance mode" : "Slökkt á viðhaldsham", "Maintenance mode is kept active" : "viðhaldshami er haldið virkur", @@ -246,7 +247,6 @@ "Please try again or contact your administrator." : "Vinsamlegast reyndu aftur eða hafðu samband við kerfisstjóra.", "Wrong password. Reset it?" : "Rangt lykilorð. Endursetja?", "remember" : "muna eftir mér", - "Log in" : "Skrá inn", "Alternative Logins" : "Aðrar Innskráningar", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Sælir ,

bara láta þig vita að %s deildi %s með þér.
Skoða það!

", "This ownCloud instance is currently in single user mode." : "Þetta ownCloud eintak er nú í einnar notandaham.", diff --git a/core/l10n/it.js b/core/l10n/it.js index 9c84001e666..3b540014655 100644 --- a/core/l10n/it.js +++ b/core/l10n/it.js @@ -2,6 +2,7 @@ OC.L10N.register( "core", { "Couldn't send mail to following users: %s " : "Impossibile inviare email ai seguenti utenti: %s", + "Preparing update" : "Preparazione aggiornamento", "Turned on maintenance mode" : "Modalità di manutenzione attivata", "Turned off maintenance mode" : "Modalità di manutenzione disattivata", "Maintenance mode is kept active" : "La modalità di manutenzione è lasciata attiva", @@ -13,6 +14,7 @@ OC.L10N.register( "Repair error: " : "Errore di riparazione:", "Following incompatible apps have been disabled: %s" : "Le seguenti applicazioni incompatibili sono state disabilitate: %s", "Following apps have been disabled: %s" : "Le seguenti applicazioni sono state disabilitate: %s", + "Already up to date" : "Già aggiornato", "File is too big" : "Il file è troppo grande", "Invalid file provided" : "File non valido fornito", "No image or file provided" : "Non è stata fornita alcun immagine o file", @@ -248,7 +250,6 @@ OC.L10N.register( "Please try again or contact your administrator." : "Prova ancora o contatta il tuo amministratore.", "Wrong password. Reset it?" : "Password errata. Vuoi reimpostarla?", "remember" : "ricorda", - "Log in" : "Accedi", "Alternative Logins" : "Accessi alternativi", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Ciao,

volevo informarti che %s ha condiviso %s con te.
Guarda!

", "This ownCloud instance is currently in single user mode." : "Questa istanza di ownCloud è in modalità utente singolo.", diff --git a/core/l10n/it.json b/core/l10n/it.json index 003ed1883d9..30543ce8a6e 100644 --- a/core/l10n/it.json +++ b/core/l10n/it.json @@ -1,5 +1,6 @@ { "translations": { "Couldn't send mail to following users: %s " : "Impossibile inviare email ai seguenti utenti: %s", + "Preparing update" : "Preparazione aggiornamento", "Turned on maintenance mode" : "Modalità di manutenzione attivata", "Turned off maintenance mode" : "Modalità di manutenzione disattivata", "Maintenance mode is kept active" : "La modalità di manutenzione è lasciata attiva", @@ -11,6 +12,7 @@ "Repair error: " : "Errore di riparazione:", "Following incompatible apps have been disabled: %s" : "Le seguenti applicazioni incompatibili sono state disabilitate: %s", "Following apps have been disabled: %s" : "Le seguenti applicazioni sono state disabilitate: %s", + "Already up to date" : "Già aggiornato", "File is too big" : "Il file è troppo grande", "Invalid file provided" : "File non valido fornito", "No image or file provided" : "Non è stata fornita alcun immagine o file", @@ -246,7 +248,6 @@ "Please try again or contact your administrator." : "Prova ancora o contatta il tuo amministratore.", "Wrong password. Reset it?" : "Password errata. Vuoi reimpostarla?", "remember" : "ricorda", - "Log in" : "Accedi", "Alternative Logins" : "Accessi alternativi", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Ciao,

volevo informarti che %s ha condiviso %s con te.
Guarda!

", "This ownCloud instance is currently in single user mode." : "Questa istanza di ownCloud è in modalità utente singolo.", diff --git a/core/l10n/ja.js b/core/l10n/ja.js index 6d8ad2362ab..fbdd112cb08 100644 --- a/core/l10n/ja.js +++ b/core/l10n/ja.js @@ -247,7 +247,6 @@ OC.L10N.register( "Please try again or contact your administrator." : "もう一度試してみるか、管理者に問い合わせてください。", "Wrong password. Reset it?" : "パスワードが間違っています。リセットしますか?", "remember" : "パスワードを保存", - "Log in" : "ログイン", "Alternative Logins" : "代替ログイン", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "こんにちは、

%sがあなたと »%s« を共有したことをお知らせします。
それを表示

", "This ownCloud instance is currently in single user mode." : "このownCloudインスタンスは、現在シングルユーザーモードです。", diff --git a/core/l10n/ja.json b/core/l10n/ja.json index a849a4e58fb..c31bd5aba9e 100644 --- a/core/l10n/ja.json +++ b/core/l10n/ja.json @@ -245,7 +245,6 @@ "Please try again or contact your administrator." : "もう一度試してみるか、管理者に問い合わせてください。", "Wrong password. Reset it?" : "パスワードが間違っています。リセットしますか?", "remember" : "パスワードを保存", - "Log in" : "ログイン", "Alternative Logins" : "代替ログイン", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "こんにちは、

%sがあなたと »%s« を共有したことをお知らせします。
それを表示

", "This ownCloud instance is currently in single user mode." : "このownCloudインスタンスは、現在シングルユーザーモードです。", diff --git a/core/l10n/ka_GE.js b/core/l10n/ka_GE.js index 43e86870ff0..eef607f316d 100644 --- a/core/l10n/ka_GE.js +++ b/core/l10n/ka_GE.js @@ -103,7 +103,6 @@ OC.L10N.register( "Log out" : "გამოსვლა", "Search" : "ძებნა", "remember" : "დამახსოვრება", - "Log in" : "შესვლა", "Alternative Logins" : "ალტერნატიული Login–ი" }, "nplurals=1; plural=0;"); diff --git a/core/l10n/ka_GE.json b/core/l10n/ka_GE.json index 26b7073a722..dad6746fe94 100644 --- a/core/l10n/ka_GE.json +++ b/core/l10n/ka_GE.json @@ -101,7 +101,6 @@ "Log out" : "გამოსვლა", "Search" : "ძებნა", "remember" : "დამახსოვრება", - "Log in" : "შესვლა", "Alternative Logins" : "ალტერნატიული Login–ი" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/core/l10n/km.js b/core/l10n/km.js index 28fb959d4e6..b2d3fa069e8 100644 --- a/core/l10n/km.js +++ b/core/l10n/km.js @@ -110,7 +110,6 @@ OC.L10N.register( "Log out" : "ចាក​ចេញ", "Search" : "ស្វែង​រក", "remember" : "ចងចាំ", - "Log in" : "ចូល", "Alternative Logins" : "ការ​ចូល​ជំនួស" }, "nplurals=1; plural=0;"); diff --git a/core/l10n/km.json b/core/l10n/km.json index ba7e82ff633..b8307fb08de 100644 --- a/core/l10n/km.json +++ b/core/l10n/km.json @@ -108,7 +108,6 @@ "Log out" : "ចាក​ចេញ", "Search" : "ស្វែង​រក", "remember" : "ចងចាំ", - "Log in" : "ចូល", "Alternative Logins" : "ការ​ចូល​ជំនួស" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/core/l10n/ko.js b/core/l10n/ko.js index 98a86efe543..c5aef4258d2 100644 --- a/core/l10n/ko.js +++ b/core/l10n/ko.js @@ -236,7 +236,6 @@ OC.L10N.register( "An internal error occured." : "내부 오류가 발생하였습니다.", "Please try again or contact your administrator." : "다시 시도하거나 관리자에게 연락하십시오.", "remember" : "기억하기", - "Log in" : "로그인", "Alternative Logins" : "대체 로그인", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "안녕하세요,

%s 님이 %s을(를) 공유하였음을 알려 드립니다.
보러 가기!

", "This ownCloud instance is currently in single user mode." : "ownCloud 인스턴스가 현재 단일 사용자 모드로 동작 중입니다.", diff --git a/core/l10n/ko.json b/core/l10n/ko.json index 5b3ddabc168..b1e133d76ca 100644 --- a/core/l10n/ko.json +++ b/core/l10n/ko.json @@ -234,7 +234,6 @@ "An internal error occured." : "내부 오류가 발생하였습니다.", "Please try again or contact your administrator." : "다시 시도하거나 관리자에게 연락하십시오.", "remember" : "기억하기", - "Log in" : "로그인", "Alternative Logins" : "대체 로그인", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "안녕하세요,

%s 님이 %s을(를) 공유하였음을 알려 드립니다.
보러 가기!

", "This ownCloud instance is currently in single user mode." : "ownCloud 인스턴스가 현재 단일 사용자 모드로 동작 중입니다.", diff --git a/core/l10n/lb.js b/core/l10n/lb.js index a24c350a926..6bbc675150e 100644 --- a/core/l10n/lb.js +++ b/core/l10n/lb.js @@ -121,7 +121,6 @@ OC.L10N.register( "Log out" : "Ofmellen", "Search" : "Sichen", "remember" : "verhalen", - "Log in" : "Umellen", "Alternative Logins" : "Alternativ Umeldungen", "Thank you for your patience." : "Merci fir deng Gedold." }, diff --git a/core/l10n/lb.json b/core/l10n/lb.json index 699ee25fd29..4a8fcce1136 100644 --- a/core/l10n/lb.json +++ b/core/l10n/lb.json @@ -119,7 +119,6 @@ "Log out" : "Ofmellen", "Search" : "Sichen", "remember" : "verhalen", - "Log in" : "Umellen", "Alternative Logins" : "Alternativ Umeldungen", "Thank you for your patience." : "Merci fir deng Gedold." },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/core/l10n/lt_LT.js b/core/l10n/lt_LT.js index f444d28b43a..41f012b6f07 100644 --- a/core/l10n/lt_LT.js +++ b/core/l10n/lt_LT.js @@ -157,7 +157,6 @@ OC.L10N.register( "Server side authentication failed!" : "Autentikacija serveryje nepavyko!", "Please contact your administrator." : "Kreipkitės į savo sistemos administratorių.", "remember" : "prisiminti", - "Log in" : "Prisijungti", "Alternative Logins" : "Alternatyvūs prisijungimai", "This ownCloud instance is currently in single user mode." : "Ši ownCloud sistema yra vieno naudotojo veiksenoje.", "This means only administrators can use the instance." : "Tai reiškia, kad tik administratorius gali naudotis sistema.", diff --git a/core/l10n/lt_LT.json b/core/l10n/lt_LT.json index dc915cb05fa..7b6ad9e4907 100644 --- a/core/l10n/lt_LT.json +++ b/core/l10n/lt_LT.json @@ -155,7 +155,6 @@ "Server side authentication failed!" : "Autentikacija serveryje nepavyko!", "Please contact your administrator." : "Kreipkitės į savo sistemos administratorių.", "remember" : "prisiminti", - "Log in" : "Prisijungti", "Alternative Logins" : "Alternatyvūs prisijungimai", "This ownCloud instance is currently in single user mode." : "Ši ownCloud sistema yra vieno naudotojo veiksenoje.", "This means only administrators can use the instance." : "Tai reiškia, kad tik administratorius gali naudotis sistema.", diff --git a/core/l10n/lv.js b/core/l10n/lv.js index 3f63ab03ed2..526ef6846c0 100644 --- a/core/l10n/lv.js +++ b/core/l10n/lv.js @@ -120,7 +120,6 @@ OC.L10N.register( "Log out" : "Izrakstīties", "Search" : "Meklēt", "remember" : "atcerēties", - "Log in" : "Ierakstīties", "Alternative Logins" : "Alternatīvās pieteikšanās" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"); diff --git a/core/l10n/lv.json b/core/l10n/lv.json index 15b9bd5f75a..c40bb4757d8 100644 --- a/core/l10n/lv.json +++ b/core/l10n/lv.json @@ -118,7 +118,6 @@ "Log out" : "Izrakstīties", "Search" : "Meklēt", "remember" : "atcerēties", - "Log in" : "Ierakstīties", "Alternative Logins" : "Alternatīvās pieteikšanās" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);" } \ No newline at end of file diff --git a/core/l10n/mk.js b/core/l10n/mk.js index 7c132dec81c..bbc073bce0b 100644 --- a/core/l10n/mk.js +++ b/core/l10n/mk.js @@ -169,7 +169,6 @@ OC.L10N.register( "Server side authentication failed!" : "Автентификацијата на серверската страна е неуспешна!", "Please contact your administrator." : "Ве молиме контактирајте го вашиот администратор.", "remember" : "запамти", - "Log in" : "Најава", "Alternative Logins" : "Алтернативни најавувања", "Contact your system administrator if this message persists or appeared unexpectedly." : "Контактирајте го вашиот систем администратор до колку оваа порака продолжи да се појавува или пак се појавува ненадејно.", "Thank you for your patience." : "Благодариме на вашето трпение." diff --git a/core/l10n/mk.json b/core/l10n/mk.json index 1056ad0b21e..88a4ee81934 100644 --- a/core/l10n/mk.json +++ b/core/l10n/mk.json @@ -167,7 +167,6 @@ "Server side authentication failed!" : "Автентификацијата на серверската страна е неуспешна!", "Please contact your administrator." : "Ве молиме контактирајте го вашиот администратор.", "remember" : "запамти", - "Log in" : "Најава", "Alternative Logins" : "Алтернативни најавувања", "Contact your system administrator if this message persists or appeared unexpectedly." : "Контактирајте го вашиот систем администратор до колку оваа порака продолжи да се појавува или пак се појавува ненадејно.", "Thank you for your patience." : "Благодариме на вашето трпение." diff --git a/core/l10n/ms_MY.js b/core/l10n/ms_MY.js index 1cdb18d72b2..cd2c54abf4a 100644 --- a/core/l10n/ms_MY.js +++ b/core/l10n/ms_MY.js @@ -75,7 +75,6 @@ OC.L10N.register( "Finish setup" : "Setup selesai", "Log out" : "Log keluar", "Search" : "Cari", - "remember" : "ingat", - "Log in" : "Log masuk" + "remember" : "ingat" }, "nplurals=1; plural=0;"); diff --git a/core/l10n/ms_MY.json b/core/l10n/ms_MY.json index 3de546e03c9..7e8fa3e0856 100644 --- a/core/l10n/ms_MY.json +++ b/core/l10n/ms_MY.json @@ -73,7 +73,6 @@ "Finish setup" : "Setup selesai", "Log out" : "Log keluar", "Search" : "Cari", - "remember" : "ingat", - "Log in" : "Log masuk" + "remember" : "ingat" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/core/l10n/my_MM.js b/core/l10n/my_MM.js index a800e908dcd..a885e55a228 100644 --- a/core/l10n/my_MM.js +++ b/core/l10n/my_MM.js @@ -39,7 +39,6 @@ OC.L10N.register( "Database password" : "Database စကားဝှက်", "Database name" : "Database အမည်", "Finish setup" : "တပ်ဆင်ခြင်းပြီးပါပြီ။", - "remember" : "မှတ်မိစေသည်", - "Log in" : "ဝင်ရောက်ရန်" + "remember" : "မှတ်မိစေသည်" }, "nplurals=1; plural=0;"); diff --git a/core/l10n/my_MM.json b/core/l10n/my_MM.json index 329fd194319..a505042f7e1 100644 --- a/core/l10n/my_MM.json +++ b/core/l10n/my_MM.json @@ -37,7 +37,6 @@ "Database password" : "Database စကားဝှက်", "Database name" : "Database အမည်", "Finish setup" : "တပ်ဆင်ခြင်းပြီးပါပြီ။", - "remember" : "မှတ်မိစေသည်", - "Log in" : "ဝင်ရောက်ရန်" + "remember" : "မှတ်မိစေသည်" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/core/l10n/nb_NO.js b/core/l10n/nb_NO.js index 1c1e7a2458f..352a0ce78a9 100644 --- a/core/l10n/nb_NO.js +++ b/core/l10n/nb_NO.js @@ -236,7 +236,6 @@ OC.L10N.register( "An internal error occured." : "Det oppstod en intern feil.", "Please try again or contact your administrator." : "Prøv igjen eller kontakt en administrator.", "remember" : "husk", - "Log in" : "Logg inn", "Alternative Logins" : "Alternative innlogginger", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hei,

Dette er en beskjed om at %s delte %s med deg.
Vis den!

", "This ownCloud instance is currently in single user mode." : "Denne ownCloud-instansen er for øyeblikket i enbrukermodus.", diff --git a/core/l10n/nb_NO.json b/core/l10n/nb_NO.json index d2ee6c14a7d..22afa2b9c92 100644 --- a/core/l10n/nb_NO.json +++ b/core/l10n/nb_NO.json @@ -234,7 +234,6 @@ "An internal error occured." : "Det oppstod en intern feil.", "Please try again or contact your administrator." : "Prøv igjen eller kontakt en administrator.", "remember" : "husk", - "Log in" : "Logg inn", "Alternative Logins" : "Alternative innlogginger", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hei,

Dette er en beskjed om at %s delte %s med deg.
Vis den!

", "This ownCloud instance is currently in single user mode." : "Denne ownCloud-instansen er for øyeblikket i enbrukermodus.", diff --git a/core/l10n/nl.js b/core/l10n/nl.js index 80e0ef332fd..b7606ec84cb 100644 --- a/core/l10n/nl.js +++ b/core/l10n/nl.js @@ -2,6 +2,7 @@ OC.L10N.register( "core", { "Couldn't send mail to following users: %s " : "Kon geen e-mail sturen aan de volgende gebruikers: %s", + "Preparing update" : "Update voorbereiden", "Turned on maintenance mode" : "Onderhoudsmodus ingeschakeld", "Turned off maintenance mode" : "Onderhoudsmodus uitgeschakeld", "Maintenance mode is kept active" : "Onderhoudsmodus blijft actief", @@ -13,6 +14,7 @@ OC.L10N.register( "Repair error: " : "Reparatiefout:", "Following incompatible apps have been disabled: %s" : "De volgende incompatibele apps zijn uitgeschakeld: %s", "Following apps have been disabled: %s" : "De volgende apps zijn gedeactiveerd: %s", + "Already up to date" : "Al bijgewerkt", "File is too big" : "Bestand te groot", "Invalid file provided" : "Ongeldig bestand opgegeven", "No image or file provided" : "Geen afbeelding of bestand opgegeven", @@ -172,6 +174,7 @@ OC.L10N.register( "The update was successful. There were warnings." : "De update is geslaagd. Er zijn wel waarschuwingen.", "The update was successful. Redirecting you to ownCloud now." : "De update is geslaagd. U wordt teruggeleid naar uw eigen ownCloud.", "Couldn't reset password because the token is invalid" : "Kon het wachtwoord niet herstellen, omdat het token ongeldig is", + "Couldn't reset password because the token is expired" : "Kon het wachtwoord niet herstellen, omdat het token verlopen is", "Couldn't send reset email. Please make sure your username is correct." : "Kon e-mail niet versturen. Verifieer of uw gebruikersnaam correct is.", "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Kon geen herstel e-mail versturen, omdat er geen e-mailadres bekend is bij deze gebruikersnaam. Neem contact op met uw beheerder.", "%s password reset" : "%s wachtwoord reset", @@ -247,7 +250,6 @@ OC.L10N.register( "Please try again or contact your administrator." : "Probeer het opnieuw of neem contact op met uw beheerder.", "Wrong password. Reset it?" : "Onjuist wachtwoord. Resetten?", "remember" : "onthoud gegevens", - "Log in" : "Meld u aan", "Alternative Logins" : "Alternatieve inlogs", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hallo,

%s deelt %s met u.
Bekijk hier!

", "This ownCloud instance is currently in single user mode." : "Deze ownCloud werkt momenteel in enkele gebruiker modus.", diff --git a/core/l10n/nl.json b/core/l10n/nl.json index 828d78bb4ce..1a3b8a40ad6 100644 --- a/core/l10n/nl.json +++ b/core/l10n/nl.json @@ -1,5 +1,6 @@ { "translations": { "Couldn't send mail to following users: %s " : "Kon geen e-mail sturen aan de volgende gebruikers: %s", + "Preparing update" : "Update voorbereiden", "Turned on maintenance mode" : "Onderhoudsmodus ingeschakeld", "Turned off maintenance mode" : "Onderhoudsmodus uitgeschakeld", "Maintenance mode is kept active" : "Onderhoudsmodus blijft actief", @@ -11,6 +12,7 @@ "Repair error: " : "Reparatiefout:", "Following incompatible apps have been disabled: %s" : "De volgende incompatibele apps zijn uitgeschakeld: %s", "Following apps have been disabled: %s" : "De volgende apps zijn gedeactiveerd: %s", + "Already up to date" : "Al bijgewerkt", "File is too big" : "Bestand te groot", "Invalid file provided" : "Ongeldig bestand opgegeven", "No image or file provided" : "Geen afbeelding of bestand opgegeven", @@ -170,6 +172,7 @@ "The update was successful. There were warnings." : "De update is geslaagd. Er zijn wel waarschuwingen.", "The update was successful. Redirecting you to ownCloud now." : "De update is geslaagd. U wordt teruggeleid naar uw eigen ownCloud.", "Couldn't reset password because the token is invalid" : "Kon het wachtwoord niet herstellen, omdat het token ongeldig is", + "Couldn't reset password because the token is expired" : "Kon het wachtwoord niet herstellen, omdat het token verlopen is", "Couldn't send reset email. Please make sure your username is correct." : "Kon e-mail niet versturen. Verifieer of uw gebruikersnaam correct is.", "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Kon geen herstel e-mail versturen, omdat er geen e-mailadres bekend is bij deze gebruikersnaam. Neem contact op met uw beheerder.", "%s password reset" : "%s wachtwoord reset", @@ -245,7 +248,6 @@ "Please try again or contact your administrator." : "Probeer het opnieuw of neem contact op met uw beheerder.", "Wrong password. Reset it?" : "Onjuist wachtwoord. Resetten?", "remember" : "onthoud gegevens", - "Log in" : "Meld u aan", "Alternative Logins" : "Alternatieve inlogs", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hallo,

%s deelt %s met u.
Bekijk hier!

", "This ownCloud instance is currently in single user mode." : "Deze ownCloud werkt momenteel in enkele gebruiker modus.", diff --git a/core/l10n/nn_NO.js b/core/l10n/nn_NO.js index bcc8592e029..7466a7d9a96 100644 --- a/core/l10n/nn_NO.js +++ b/core/l10n/nn_NO.js @@ -128,7 +128,6 @@ OC.L10N.register( "Log out" : "Logg ut", "Search" : "Søk", "remember" : "hugs", - "Log in" : "Logg inn", "Alternative Logins" : "Alternative innloggingar" }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/nn_NO.json b/core/l10n/nn_NO.json index 7505fb85282..ae90139ddca 100644 --- a/core/l10n/nn_NO.json +++ b/core/l10n/nn_NO.json @@ -126,7 +126,6 @@ "Log out" : "Logg ut", "Search" : "Søk", "remember" : "hugs", - "Log in" : "Logg inn", "Alternative Logins" : "Alternative innloggingar" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/core/l10n/oc.js b/core/l10n/oc.js index f1448aa9de0..910f5a2265e 100644 --- a/core/l10n/oc.js +++ b/core/l10n/oc.js @@ -230,7 +230,6 @@ OC.L10N.register( "An internal error occured." : "Una error intèrna s'es produsida.", "Please try again or contact your administrator." : "Reensajatz o contactatz vòstre administrator.", "remember" : "se remembrar de ieu", - "Log in" : "Connexion", "Alternative Logins" : "Identificants alternatius", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Bonjorn,

Vos informam que %s a partejat %s amb vos.
Clicatz aicí per i accedir !

", "This ownCloud instance is currently in single user mode." : "Aquesta instància de ownCloud es actualament en mòde utilizaire unic.", diff --git a/core/l10n/oc.json b/core/l10n/oc.json index fedd7ec6c81..6c859cd0c7a 100644 --- a/core/l10n/oc.json +++ b/core/l10n/oc.json @@ -228,7 +228,6 @@ "An internal error occured." : "Una error intèrna s'es produsida.", "Please try again or contact your administrator." : "Reensajatz o contactatz vòstre administrator.", "remember" : "se remembrar de ieu", - "Log in" : "Connexion", "Alternative Logins" : "Identificants alternatius", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Bonjorn,

Vos informam que %s a partejat %s amb vos.
Clicatz aicí per i accedir !

", "This ownCloud instance is currently in single user mode." : "Aquesta instància de ownCloud es actualament en mòde utilizaire unic.", diff --git a/core/l10n/pl.js b/core/l10n/pl.js index 61ce9378891..a26c2b1e2bd 100644 --- a/core/l10n/pl.js +++ b/core/l10n/pl.js @@ -207,7 +207,6 @@ OC.L10N.register( "Please contact your administrator." : "Skontaktuj się z administratorem", "Please try again or contact your administrator." : "Spróbuj ponownie lub skontaktuj się z administratorem.", "remember" : "pamiętaj", - "Log in" : "Zaloguj", "Alternative Logins" : "Alternatywne loginy", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Witam,

informuję, że %s udostępnianych zasobów %s jest z Tobą.
Zobacz!

", "This ownCloud instance is currently in single user mode." : "Ta instalacja ownCloud działa obecnie w trybie pojedynczego użytkownika.", diff --git a/core/l10n/pl.json b/core/l10n/pl.json index 0ad9d091421..0c3524c5cc4 100644 --- a/core/l10n/pl.json +++ b/core/l10n/pl.json @@ -205,7 +205,6 @@ "Please contact your administrator." : "Skontaktuj się z administratorem", "Please try again or contact your administrator." : "Spróbuj ponownie lub skontaktuj się z administratorem.", "remember" : "pamiętaj", - "Log in" : "Zaloguj", "Alternative Logins" : "Alternatywne loginy", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Witam,

informuję, że %s udostępnianych zasobów %s jest z Tobą.
Zobacz!

", "This ownCloud instance is currently in single user mode." : "Ta instalacja ownCloud działa obecnie w trybie pojedynczego użytkownika.", diff --git a/core/l10n/pt_BR.js b/core/l10n/pt_BR.js index 9ecf345d7c1..ad5cf69a798 100644 --- a/core/l10n/pt_BR.js +++ b/core/l10n/pt_BR.js @@ -2,6 +2,7 @@ OC.L10N.register( "core", { "Couldn't send mail to following users: %s " : "Não foi possível enviar e-mail para os seguintes usuários: %s", + "Preparing update" : "Preparando atualização", "Turned on maintenance mode" : "Ativar modo de manutenção", "Turned off maintenance mode" : "Desligar o modo de manutenção", "Maintenance mode is kept active" : "O modo de manutenção está sendo mantido como ativo", @@ -13,6 +14,7 @@ OC.L10N.register( "Repair error: " : "Reparação de erro:", "Following incompatible apps have been disabled: %s" : "Seguir aplicativos incompatíveis foi desativado: %s", "Following apps have been disabled: %s" : "Os seguintes aplicativos foram desabilitados: %s", + "Already up to date" : "Já está atualizado", "File is too big" : "O arquivo é muito grande", "Invalid file provided" : "Arquivo fornecido inválido", "No image or file provided" : "Nenhuma imagem ou arquivo fornecido", @@ -248,7 +250,6 @@ OC.L10N.register( "Please try again or contact your administrator." : "Por favor tente novamente ou faça contato com o seu administrador.", "Wrong password. Reset it?" : "Senha incorreta. Redefini-la?", "remember" : "lembrar", - "Log in" : "Fazer login", "Alternative Logins" : "Logins Alternativos", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Olá,

só para seu conhecimento que %s compartilhou %s com você.
Verificar!

", "This ownCloud instance is currently in single user mode." : "Nesta instância ownCloud está em modo de usuário único.", diff --git a/core/l10n/pt_BR.json b/core/l10n/pt_BR.json index b82874a826e..bcc3522c430 100644 --- a/core/l10n/pt_BR.json +++ b/core/l10n/pt_BR.json @@ -1,5 +1,6 @@ { "translations": { "Couldn't send mail to following users: %s " : "Não foi possível enviar e-mail para os seguintes usuários: %s", + "Preparing update" : "Preparando atualização", "Turned on maintenance mode" : "Ativar modo de manutenção", "Turned off maintenance mode" : "Desligar o modo de manutenção", "Maintenance mode is kept active" : "O modo de manutenção está sendo mantido como ativo", @@ -11,6 +12,7 @@ "Repair error: " : "Reparação de erro:", "Following incompatible apps have been disabled: %s" : "Seguir aplicativos incompatíveis foi desativado: %s", "Following apps have been disabled: %s" : "Os seguintes aplicativos foram desabilitados: %s", + "Already up to date" : "Já está atualizado", "File is too big" : "O arquivo é muito grande", "Invalid file provided" : "Arquivo fornecido inválido", "No image or file provided" : "Nenhuma imagem ou arquivo fornecido", @@ -246,7 +248,6 @@ "Please try again or contact your administrator." : "Por favor tente novamente ou faça contato com o seu administrador.", "Wrong password. Reset it?" : "Senha incorreta. Redefini-la?", "remember" : "lembrar", - "Log in" : "Fazer login", "Alternative Logins" : "Logins Alternativos", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Olá,

só para seu conhecimento que %s compartilhou %s com você.
Verificar!

", "This ownCloud instance is currently in single user mode." : "Nesta instância ownCloud está em modo de usuário único.", diff --git a/core/l10n/pt_PT.js b/core/l10n/pt_PT.js index 1dceca1fdad..537efc34728 100644 --- a/core/l10n/pt_PT.js +++ b/core/l10n/pt_PT.js @@ -234,7 +234,6 @@ OC.L10N.register( "Please try again or contact your administrator." : "Por favor tente de novo ou contacte o administrador.", "Wrong password. Reset it?" : "Senha errada. Repô-la?", "remember" : "lembrar", - "Log in" : "Entrar", "Alternative Logins" : "Contas de acesso alternativas", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Olá,

apenas para informar que %s partilhou %s consigo.
Consulte aqui!

", "This ownCloud instance is currently in single user mode." : "Esta instância do ownCloud está actualmente configurada no modo de utilizador único.", diff --git a/core/l10n/pt_PT.json b/core/l10n/pt_PT.json index 3eabc73b287..17c5b5dd587 100644 --- a/core/l10n/pt_PT.json +++ b/core/l10n/pt_PT.json @@ -232,7 +232,6 @@ "Please try again or contact your administrator." : "Por favor tente de novo ou contacte o administrador.", "Wrong password. Reset it?" : "Senha errada. Repô-la?", "remember" : "lembrar", - "Log in" : "Entrar", "Alternative Logins" : "Contas de acesso alternativas", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Olá,

apenas para informar que %s partilhou %s consigo.
Consulte aqui!

", "This ownCloud instance is currently in single user mode." : "Esta instância do ownCloud está actualmente configurada no modo de utilizador único.", diff --git a/core/l10n/ro.js b/core/l10n/ro.js index 5b54c4a4297..054c5fcb187 100644 --- a/core/l10n/ro.js +++ b/core/l10n/ro.js @@ -149,7 +149,6 @@ OC.L10N.register( "Log out" : "Ieșire", "Search" : "Căutare", "remember" : "amintește", - "Log in" : "Autentificare", "Alternative Logins" : "Conectări alternative", "Thank you for your patience." : "Îți mulțumim pentru răbrade.", "Start update" : "Începe actualizarea" diff --git a/core/l10n/ro.json b/core/l10n/ro.json index 90888980ee6..41f9e9ab0f1 100644 --- a/core/l10n/ro.json +++ b/core/l10n/ro.json @@ -147,7 +147,6 @@ "Log out" : "Ieșire", "Search" : "Căutare", "remember" : "amintește", - "Log in" : "Autentificare", "Alternative Logins" : "Conectări alternative", "Thank you for your patience." : "Îți mulțumim pentru răbrade.", "Start update" : "Începe actualizarea" diff --git a/core/l10n/ru.js b/core/l10n/ru.js index 9de31c69e8d..5b114a933fc 100644 --- a/core/l10n/ru.js +++ b/core/l10n/ru.js @@ -240,7 +240,6 @@ OC.L10N.register( "Please try again or contact your administrator." : "Пожалуйста попробуйте ещё раз или свяжитесь с вашим администратором", "Wrong password. Reset it?" : "Неправильный пароль. Сбросить его?", "remember" : "запомнить", - "Log in" : "Войти", "Alternative Logins" : "Альтернативные имена пользователя", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Здравствуйте,

%s поделился с вами %s.
Перейдите по ссылке, чтобы посмотреть

", "This ownCloud instance is currently in single user mode." : "Сервер ownCloud в настоящее время работает в однопользовательском режиме.", diff --git a/core/l10n/ru.json b/core/l10n/ru.json index a1f22cb9dd1..b9b2bc4e1ce 100644 --- a/core/l10n/ru.json +++ b/core/l10n/ru.json @@ -238,7 +238,6 @@ "Please try again or contact your administrator." : "Пожалуйста попробуйте ещё раз или свяжитесь с вашим администратором", "Wrong password. Reset it?" : "Неправильный пароль. Сбросить его?", "remember" : "запомнить", - "Log in" : "Войти", "Alternative Logins" : "Альтернативные имена пользователя", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Здравствуйте,

%s поделился с вами %s.
Перейдите по ссылке, чтобы посмотреть

", "This ownCloud instance is currently in single user mode." : "Сервер ownCloud в настоящее время работает в однопользовательском режиме.", diff --git a/core/l10n/si_LK.js b/core/l10n/si_LK.js index 5f20a83a275..be29a54e7b4 100644 --- a/core/l10n/si_LK.js +++ b/core/l10n/si_LK.js @@ -82,7 +82,6 @@ OC.L10N.register( "Finish setup" : "ස්ථාපනය කිරීම අවසන් කරන්න", "Log out" : "නික්මීම", "Search" : "සොයන්න", - "remember" : "මතක තබාගන්න", - "Log in" : "ප්‍රවේශවන්න" + "remember" : "මතක තබාගන්න" }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/si_LK.json b/core/l10n/si_LK.json index 8d1a02c4ded..68638609324 100644 --- a/core/l10n/si_LK.json +++ b/core/l10n/si_LK.json @@ -80,7 +80,6 @@ "Finish setup" : "ස්ථාපනය කිරීම අවසන් කරන්න", "Log out" : "නික්මීම", "Search" : "සොයන්න", - "remember" : "මතක තබාගන්න", - "Log in" : "ප්‍රවේශවන්න" + "remember" : "මතක තබාගන්න" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/core/l10n/sk_SK.js b/core/l10n/sk_SK.js index 8b17371774e..a08bc9d09f3 100644 --- a/core/l10n/sk_SK.js +++ b/core/l10n/sk_SK.js @@ -228,7 +228,6 @@ OC.L10N.register( "An internal error occured." : "Vyskytla sa vnútorná chyba.", "Please try again or contact your administrator." : "Skúste to znovu, alebo sa obráťte na vášho administrátora.", "remember" : "zapamätať", - "Log in" : "Prihlásiť sa", "Alternative Logins" : "Alternatívne prihlásenie", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Dobrý deň,

Používateľ %s zdieľa s vami súbor, alebo priečinok s názvom »%s«.
Pre zobrazenie kliknite na túto linku!

", "This ownCloud instance is currently in single user mode." : "Táto inštancia ownCloudu je teraz v jednopoužívateľskom móde.", diff --git a/core/l10n/sk_SK.json b/core/l10n/sk_SK.json index c36ee19839f..fcb358cdf9c 100644 --- a/core/l10n/sk_SK.json +++ b/core/l10n/sk_SK.json @@ -226,7 +226,6 @@ "An internal error occured." : "Vyskytla sa vnútorná chyba.", "Please try again or contact your administrator." : "Skúste to znovu, alebo sa obráťte na vášho administrátora.", "remember" : "zapamätať", - "Log in" : "Prihlásiť sa", "Alternative Logins" : "Alternatívne prihlásenie", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Dobrý deň,

Používateľ %s zdieľa s vami súbor, alebo priečinok s názvom »%s«.
Pre zobrazenie kliknite na túto linku!

", "This ownCloud instance is currently in single user mode." : "Táto inštancia ownCloudu je teraz v jednopoužívateľskom móde.", diff --git a/core/l10n/sl.js b/core/l10n/sl.js index f6599d5c2eb..cc7633c0623 100644 --- a/core/l10n/sl.js +++ b/core/l10n/sl.js @@ -201,7 +201,6 @@ OC.L10N.register( "Server side authentication failed!" : "Overitev s strežnika je spodletela!", "Please contact your administrator." : "Stopite v stik s skrbnikom sistema.", "remember" : "zapomni si", - "Log in" : "Prijava", "Alternative Logins" : "Druge prijavne možnosti", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Pozdravljeni,

uporabnik %s vam je omogočil souporabo %s.
Oglejte si vsebino!

", "This ownCloud instance is currently in single user mode." : "Ta seja oblaka ownCloud je trenutno v načinu enega sočasnega uporabnika.", diff --git a/core/l10n/sl.json b/core/l10n/sl.json index b886b8cd484..96945519caa 100644 --- a/core/l10n/sl.json +++ b/core/l10n/sl.json @@ -199,7 +199,6 @@ "Server side authentication failed!" : "Overitev s strežnika je spodletela!", "Please contact your administrator." : "Stopite v stik s skrbnikom sistema.", "remember" : "zapomni si", - "Log in" : "Prijava", "Alternative Logins" : "Druge prijavne možnosti", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Pozdravljeni,

uporabnik %s vam je omogočil souporabo %s.
Oglejte si vsebino!

", "This ownCloud instance is currently in single user mode." : "Ta seja oblaka ownCloud je trenutno v načinu enega sočasnega uporabnika.", diff --git a/core/l10n/sq.js b/core/l10n/sq.js index b3f23289c0c..8e5eda15f06 100644 --- a/core/l10n/sq.js +++ b/core/l10n/sq.js @@ -191,7 +191,6 @@ OC.L10N.register( "Server side authentication failed!" : "Verifikimi në krahun e serverit dështoi!", "Please contact your administrator." : "Ju lutem kontaktoni administratorin.", "remember" : "kujto", - "Log in" : "Hyrje", "Alternative Logins" : "Hyrje alternative", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Tungjatjeta,

dëshirojmë t'ju njoftojmë se %s ka ndarë %s me ju.
Klikoni këtu për ta shikuar!
", "This ownCloud instance is currently in single user mode." : "Kjo instancë ownCloud është aktualisht në gjendje me përdorues të vetëm.", diff --git a/core/l10n/sq.json b/core/l10n/sq.json index 6005136d8e7..24d73ab8228 100644 --- a/core/l10n/sq.json +++ b/core/l10n/sq.json @@ -189,7 +189,6 @@ "Server side authentication failed!" : "Verifikimi në krahun e serverit dështoi!", "Please contact your administrator." : "Ju lutem kontaktoni administratorin.", "remember" : "kujto", - "Log in" : "Hyrje", "Alternative Logins" : "Hyrje alternative", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Tungjatjeta,

dëshirojmë t'ju njoftojmë se %s ka ndarë %s me ju.
Klikoni këtu për ta shikuar!
", "This ownCloud instance is currently in single user mode." : "Kjo instancë ownCloud është aktualisht në gjendje me përdorues të vetëm.", diff --git a/core/l10n/sr.js b/core/l10n/sr.js index b32e4467c63..ac11270c8bf 100644 --- a/core/l10n/sr.js +++ b/core/l10n/sr.js @@ -234,7 +234,6 @@ OC.L10N.register( "An internal error occured." : "Дошло је до интерне грешке.", "Please try again or contact your administrator." : "Покушајте поново или контактирајте вашег администратора.", "remember" : "упамти", - "Log in" : "Пријава", "Alternative Logins" : "Алтернативне пријаве", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Поздрав,

само вас обавештавам да %s дели %s са вама.
Погледајте!

", "This ownCloud instance is currently in single user mode." : "Овај оунКлауд тренутно ради у режиму једног корисника.", diff --git a/core/l10n/sr.json b/core/l10n/sr.json index ffb7d87c7e4..ceee884de1b 100644 --- a/core/l10n/sr.json +++ b/core/l10n/sr.json @@ -232,7 +232,6 @@ "An internal error occured." : "Дошло је до интерне грешке.", "Please try again or contact your administrator." : "Покушајте поново или контактирајте вашег администратора.", "remember" : "упамти", - "Log in" : "Пријава", "Alternative Logins" : "Алтернативне пријаве", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Поздрав,

само вас обавештавам да %s дели %s са вама.
Погледајте!

", "This ownCloud instance is currently in single user mode." : "Овај оунКлауд тренутно ради у режиму једног корисника.", diff --git a/core/l10n/sr@latin.js b/core/l10n/sr@latin.js index 36a69cfb9f0..5108f16d996 100644 --- a/core/l10n/sr@latin.js +++ b/core/l10n/sr@latin.js @@ -197,7 +197,6 @@ OC.L10N.register( "Server side authentication failed!" : "Provera identiteta na stani servera nije uspela!", "Please contact your administrator." : "Molimo Vas da kontaktirate Vašeg administratora.", "remember" : "upamti", - "Log in" : "Prijavi se", "Alternative Logins" : "Alternativne prijave", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hej,

samo ti javljamo da je %s delio %s sa tobom.
Pogledaj!

", "This ownCloud instance is currently in single user mode." : "Ova instanca ownCloud-a je trenutno u režimu rada jednog korisnika.", diff --git a/core/l10n/sr@latin.json b/core/l10n/sr@latin.json index 4402ff3e6af..5bc49c7e58a 100644 --- a/core/l10n/sr@latin.json +++ b/core/l10n/sr@latin.json @@ -195,7 +195,6 @@ "Server side authentication failed!" : "Provera identiteta na stani servera nije uspela!", "Please contact your administrator." : "Molimo Vas da kontaktirate Vašeg administratora.", "remember" : "upamti", - "Log in" : "Prijavi se", "Alternative Logins" : "Alternativne prijave", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hej,

samo ti javljamo da je %s delio %s sa tobom.
Pogledaj!

", "This ownCloud instance is currently in single user mode." : "Ova instanca ownCloud-a je trenutno u režimu rada jednog korisnika.", diff --git a/core/l10n/sv.js b/core/l10n/sv.js index 8852d1ca237..a5a7895b2cc 100644 --- a/core/l10n/sv.js +++ b/core/l10n/sv.js @@ -202,7 +202,6 @@ OC.L10N.register( "Server side authentication failed!" : "Servern misslyckades med autentisering!", "Please contact your administrator." : "Kontakta din administratör.", "remember" : "kom ihåg", - "Log in" : "Logga in", "Alternative Logins" : "Alternativa inloggningar", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hej där,

ville bara informera dig om att %s delade %s med dig.
Visa den!

", "This ownCloud instance is currently in single user mode." : "Denna ownCloud instans är för närvarande i enanvändarläge", diff --git a/core/l10n/sv.json b/core/l10n/sv.json index f49900f04a8..307fd6afc78 100644 --- a/core/l10n/sv.json +++ b/core/l10n/sv.json @@ -200,7 +200,6 @@ "Server side authentication failed!" : "Servern misslyckades med autentisering!", "Please contact your administrator." : "Kontakta din administratör.", "remember" : "kom ihåg", - "Log in" : "Logga in", "Alternative Logins" : "Alternativa inloggningar", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Hej där,

ville bara informera dig om att %s delade %s med dig.
Visa den!

", "This ownCloud instance is currently in single user mode." : "Denna ownCloud instans är för närvarande i enanvändarläge", diff --git a/core/l10n/ta_LK.js b/core/l10n/ta_LK.js index a22802bee0e..21025db2fa0 100644 --- a/core/l10n/ta_LK.js +++ b/core/l10n/ta_LK.js @@ -93,7 +93,6 @@ OC.L10N.register( "Finish setup" : "அமைப்பை முடிக்க", "Log out" : "விடுபதிகை செய்க", "Search" : "தேடுதல்", - "remember" : "ஞாபகப்படுத்துக", - "Log in" : "புகுபதிகை" + "remember" : "ஞாபகப்படுத்துக" }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/ta_LK.json b/core/l10n/ta_LK.json index 07d08aa9d72..a7f28999023 100644 --- a/core/l10n/ta_LK.json +++ b/core/l10n/ta_LK.json @@ -91,7 +91,6 @@ "Finish setup" : "அமைப்பை முடிக்க", "Log out" : "விடுபதிகை செய்க", "Search" : "தேடுதல்", - "remember" : "ஞாபகப்படுத்துக", - "Log in" : "புகுபதிகை" + "remember" : "ஞாபகப்படுத்துக" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/core/l10n/th_TH.js b/core/l10n/th_TH.js index 65a7de7705c..142895dd1d0 100644 --- a/core/l10n/th_TH.js +++ b/core/l10n/th_TH.js @@ -2,6 +2,7 @@ OC.L10N.register( "core", { "Couldn't send mail to following users: %s " : "ไม่สามารถส่งอีเมลไปยังผู้ใช้: %s", + "Preparing update" : "เตรียมอัพเดท", "Turned on maintenance mode" : "เปิดโหมดการบำรุงรักษา", "Turned off maintenance mode" : "ปิดโหมดการบำรุงรักษา", "Maintenance mode is kept active" : "โหมดการบำรุงรักษาจะถูกเก็บไว้ใช้งาน", @@ -13,6 +14,7 @@ OC.L10N.register( "Repair error: " : "เกิดข้อผิดพลาดในการซ่อมแซม:", "Following incompatible apps have been disabled: %s" : "แอพพลิเคชันต่อไปนี้เข้ากันไม่ได้มันจะถูกปิดการใช้งาน: %s", "Following apps have been disabled: %s" : "แอพฯดังต่อไปนี้ถูกปิดการใช้งาน: %s", + "Already up to date" : "มีอยู่แล้วถึงวันที่", "File is too big" : "ไฟล์มีขนาดใหญ่เกินไป", "Invalid file provided" : "ระบุไฟล์ไม่ถูกต้อง", "No image or file provided" : "ไม่มีรูปภาพหรือไฟล์ที่ระบุ", @@ -172,6 +174,7 @@ OC.L10N.register( "The update was successful. There were warnings." : "การอัพเดทสำเร็จ แต่มีคำเตือนอยู่", "The update was successful. Redirecting you to ownCloud now." : "การอัพเดทเสร็จเรียบร้อย กำลังเปลี่ยนเส้นทางไปที่ ownCloud อยู่ในขณะนี้", "Couldn't reset password because the token is invalid" : "ไม่สามารถตั้งรหัสผ่านใหม่เพราะโทเค็นไม่ถูกต้อง", + "Couldn't reset password because the token is expired" : "ไม่สามารถตั้งค่ารหัสผ่านเพราะโทเค็นหมดอายุ", "Couldn't send reset email. Please make sure your username is correct." : "ไม่สามารถส่งการตั้งค่าอีเมลใหม่ กรุณาตรวจสอบชื่อผู้ใช้ของคุณให้ถูกต้อง", "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "ไม่สามารถส่งการตั้งค่าอีเมลใหม่เพราะไม่มีที่อยู่อีเมลนี้ กรุณาติดต่อผู้ดูแลระบบ", "%s password reset" : "%s ตั้งรหัสผ่านใหม่", @@ -247,7 +250,6 @@ OC.L10N.register( "Please try again or contact your administrator." : "โปรดลองอีกครั้งหรือติดต่อผู้ดูแลระบบ", "Wrong password. Reset it?" : "รหัสผ่านผิด ตั้งค่าใหม่?", "remember" : "จดจำฉัน", - "Log in" : "เข้าสู่ระบบ", "Alternative Logins" : "ทางเลือกการเข้าสู่ระบบ", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "นี่คุณ,

อยากให้คุณทราบว่า %s ได้แชร์ %s กับคุณ
คลิกดูที่นี่

", "This ownCloud instance is currently in single user mode." : "ขณะนี้ ownCloud อยู่ในโหมดผู้ใช้คนเดียว", diff --git a/core/l10n/th_TH.json b/core/l10n/th_TH.json index a10ff461855..88c74d1eb4c 100644 --- a/core/l10n/th_TH.json +++ b/core/l10n/th_TH.json @@ -1,5 +1,6 @@ { "translations": { "Couldn't send mail to following users: %s " : "ไม่สามารถส่งอีเมลไปยังผู้ใช้: %s", + "Preparing update" : "เตรียมอัพเดท", "Turned on maintenance mode" : "เปิดโหมดการบำรุงรักษา", "Turned off maintenance mode" : "ปิดโหมดการบำรุงรักษา", "Maintenance mode is kept active" : "โหมดการบำรุงรักษาจะถูกเก็บไว้ใช้งาน", @@ -11,6 +12,7 @@ "Repair error: " : "เกิดข้อผิดพลาดในการซ่อมแซม:", "Following incompatible apps have been disabled: %s" : "แอพพลิเคชันต่อไปนี้เข้ากันไม่ได้มันจะถูกปิดการใช้งาน: %s", "Following apps have been disabled: %s" : "แอพฯดังต่อไปนี้ถูกปิดการใช้งาน: %s", + "Already up to date" : "มีอยู่แล้วถึงวันที่", "File is too big" : "ไฟล์มีขนาดใหญ่เกินไป", "Invalid file provided" : "ระบุไฟล์ไม่ถูกต้อง", "No image or file provided" : "ไม่มีรูปภาพหรือไฟล์ที่ระบุ", @@ -170,6 +172,7 @@ "The update was successful. There were warnings." : "การอัพเดทสำเร็จ แต่มีคำเตือนอยู่", "The update was successful. Redirecting you to ownCloud now." : "การอัพเดทเสร็จเรียบร้อย กำลังเปลี่ยนเส้นทางไปที่ ownCloud อยู่ในขณะนี้", "Couldn't reset password because the token is invalid" : "ไม่สามารถตั้งรหัสผ่านใหม่เพราะโทเค็นไม่ถูกต้อง", + "Couldn't reset password because the token is expired" : "ไม่สามารถตั้งค่ารหัสผ่านเพราะโทเค็นหมดอายุ", "Couldn't send reset email. Please make sure your username is correct." : "ไม่สามารถส่งการตั้งค่าอีเมลใหม่ กรุณาตรวจสอบชื่อผู้ใช้ของคุณให้ถูกต้อง", "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "ไม่สามารถส่งการตั้งค่าอีเมลใหม่เพราะไม่มีที่อยู่อีเมลนี้ กรุณาติดต่อผู้ดูแลระบบ", "%s password reset" : "%s ตั้งรหัสผ่านใหม่", @@ -245,7 +248,6 @@ "Please try again or contact your administrator." : "โปรดลองอีกครั้งหรือติดต่อผู้ดูแลระบบ", "Wrong password. Reset it?" : "รหัสผ่านผิด ตั้งค่าใหม่?", "remember" : "จดจำฉัน", - "Log in" : "เข้าสู่ระบบ", "Alternative Logins" : "ทางเลือกการเข้าสู่ระบบ", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "นี่คุณ,

อยากให้คุณทราบว่า %s ได้แชร์ %s กับคุณ
คลิกดูที่นี่

", "This ownCloud instance is currently in single user mode." : "ขณะนี้ ownCloud อยู่ในโหมดผู้ใช้คนเดียว", diff --git a/core/l10n/tr.js b/core/l10n/tr.js index df0509bd271..bedc5ce7e26 100644 --- a/core/l10n/tr.js +++ b/core/l10n/tr.js @@ -236,7 +236,6 @@ OC.L10N.register( "An internal error occured." : "Dahili bir hata oluştu.", "Please try again or contact your administrator." : "Lütfen yeniden deneyin veya yöneticinizle iletişim kurun.", "remember" : "hatırla", - "Log in" : "Giriş yap", "Alternative Logins" : "Alternatif Girişler", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Merhaba,

%s kullanıcısının sizinle %s paylaşımında bulunduğunu bildirmek istedik.
Paylaşımı gör!

", "This ownCloud instance is currently in single user mode." : "Bu ownCloud örneği şu anda tek kullanıcı kipinde.", diff --git a/core/l10n/tr.json b/core/l10n/tr.json index b421d140092..3925a97627d 100644 --- a/core/l10n/tr.json +++ b/core/l10n/tr.json @@ -234,7 +234,6 @@ "An internal error occured." : "Dahili bir hata oluştu.", "Please try again or contact your administrator." : "Lütfen yeniden deneyin veya yöneticinizle iletişim kurun.", "remember" : "hatırla", - "Log in" : "Giriş yap", "Alternative Logins" : "Alternatif Girişler", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Merhaba,

%s kullanıcısının sizinle %s paylaşımında bulunduğunu bildirmek istedik.
Paylaşımı gör!

", "This ownCloud instance is currently in single user mode." : "Bu ownCloud örneği şu anda tek kullanıcı kipinde.", diff --git a/core/l10n/uk.js b/core/l10n/uk.js index 580126e39c8..ab5689e64f1 100644 --- a/core/l10n/uk.js +++ b/core/l10n/uk.js @@ -230,7 +230,6 @@ OC.L10N.register( "An internal error occured." : "Виникла внутрішня помилка.", "Please try again or contact your administrator." : "Будь ласка, спробуйте ще раз або зверніться до адміністратора.", "remember" : "запам'ятати", - "Log in" : "Увійти", "Alternative Logins" : "Альтернативні імена користувача", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Агов,

просто повідомляємо вам, що %s поділився »%s« з вами.
Перегляньте!

", "This ownCloud instance is currently in single user mode." : "Сервер ownCloud в даний час працює в однокористувацькому режимі.", diff --git a/core/l10n/uk.json b/core/l10n/uk.json index 188b0436949..7d92acb3cc9 100644 --- a/core/l10n/uk.json +++ b/core/l10n/uk.json @@ -228,7 +228,6 @@ "An internal error occured." : "Виникла внутрішня помилка.", "Please try again or contact your administrator." : "Будь ласка, спробуйте ще раз або зверніться до адміністратора.", "remember" : "запам'ятати", - "Log in" : "Увійти", "Alternative Logins" : "Альтернативні імена користувача", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "Агов,

просто повідомляємо вам, що %s поділився »%s« з вами.
Перегляньте!

", "This ownCloud instance is currently in single user mode." : "Сервер ownCloud в даний час працює в однокористувацькому режимі.", diff --git a/core/l10n/ur_PK.js b/core/l10n/ur_PK.js index a89d990eeab..bae6b156867 100644 --- a/core/l10n/ur_PK.js +++ b/core/l10n/ur_PK.js @@ -111,7 +111,6 @@ OC.L10N.register( "Log out" : "لاگ آؤٹ", "Search" : "تلاش", "remember" : "یاد رکھیں", - "Log in" : "لاگ ان", "Alternative Logins" : "متبادل لاگ ان ", "Thank you for your patience." : "آپ کے صبر کا شکریہ" }, diff --git a/core/l10n/ur_PK.json b/core/l10n/ur_PK.json index 2cb01f2aedb..b2166dfa3b1 100644 --- a/core/l10n/ur_PK.json +++ b/core/l10n/ur_PK.json @@ -109,7 +109,6 @@ "Log out" : "لاگ آؤٹ", "Search" : "تلاش", "remember" : "یاد رکھیں", - "Log in" : "لاگ ان", "Alternative Logins" : "متبادل لاگ ان ", "Thank you for your patience." : "آپ کے صبر کا شکریہ" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/core/l10n/vi.js b/core/l10n/vi.js index fe5d79f46b5..c51c1563fe4 100644 --- a/core/l10n/vi.js +++ b/core/l10n/vi.js @@ -142,7 +142,6 @@ OC.L10N.register( "Server side authentication failed!" : "Xác thực phía máy chủ không thành công!", "Please contact your administrator." : "Vui lòng liên hệ với quản trị viên.", "remember" : "ghi nhớ", - "Log in" : "Đăng nhập", "Alternative Logins" : "Đăng nhập khác", "This ownCloud instance is currently in single user mode." : "OwnCloud trong trường hợp này đang ở chế độ người dùng duy nhất.", "This means only administrators can use the instance." : "Điều này có nghĩa chỉ có người quản trị có thể sử dụng trong trường hợp này.", diff --git a/core/l10n/vi.json b/core/l10n/vi.json index 7080777480b..ba8015cafb4 100644 --- a/core/l10n/vi.json +++ b/core/l10n/vi.json @@ -140,7 +140,6 @@ "Server side authentication failed!" : "Xác thực phía máy chủ không thành công!", "Please contact your administrator." : "Vui lòng liên hệ với quản trị viên.", "remember" : "ghi nhớ", - "Log in" : "Đăng nhập", "Alternative Logins" : "Đăng nhập khác", "This ownCloud instance is currently in single user mode." : "OwnCloud trong trường hợp này đang ở chế độ người dùng duy nhất.", "This means only administrators can use the instance." : "Điều này có nghĩa chỉ có người quản trị có thể sử dụng trong trường hợp này.", diff --git a/core/l10n/zh_CN.js b/core/l10n/zh_CN.js index 7f502f307e2..e82635fe946 100644 --- a/core/l10n/zh_CN.js +++ b/core/l10n/zh_CN.js @@ -237,7 +237,6 @@ OC.L10N.register( "An internal error occured." : "发生了内部错误。", "Please try again or contact your administrator." : "请重试或联系管理员。", "remember" : "记住", - "Log in" : "登录", "Alternative Logins" : "其他登录方式", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "嗨、你好,

只想让你知道 %s 分享了 %s 给你。
现在查看!

", "This ownCloud instance is currently in single user mode." : "当前ownCloud实例运行在单用户模式下。", diff --git a/core/l10n/zh_CN.json b/core/l10n/zh_CN.json index f0e45555f04..d47be1b0c5d 100644 --- a/core/l10n/zh_CN.json +++ b/core/l10n/zh_CN.json @@ -235,7 +235,6 @@ "An internal error occured." : "发生了内部错误。", "Please try again or contact your administrator." : "请重试或联系管理员。", "remember" : "记住", - "Log in" : "登录", "Alternative Logins" : "其他登录方式", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "嗨、你好,

只想让你知道 %s 分享了 %s 给你。
现在查看!

", "This ownCloud instance is currently in single user mode." : "当前ownCloud实例运行在单用户模式下。", diff --git a/core/l10n/zh_HK.js b/core/l10n/zh_HK.js index c4fb9b3486d..fc1bef316a9 100644 --- a/core/l10n/zh_HK.js +++ b/core/l10n/zh_HK.js @@ -68,7 +68,6 @@ OC.L10N.register( "Database name" : "資料庫名稱", "Log out" : "登出", "Search" : "尋找", - "remember" : "記住", - "Log in" : "登入" + "remember" : "記住" }, "nplurals=1; plural=0;"); diff --git a/core/l10n/zh_HK.json b/core/l10n/zh_HK.json index 5aedf688dc4..2a6230797c1 100644 --- a/core/l10n/zh_HK.json +++ b/core/l10n/zh_HK.json @@ -66,7 +66,6 @@ "Database name" : "資料庫名稱", "Log out" : "登出", "Search" : "尋找", - "remember" : "記住", - "Log in" : "登入" + "remember" : "記住" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/core/l10n/zh_TW.js b/core/l10n/zh_TW.js index d93f3a8ec8e..29ef83f2614 100644 --- a/core/l10n/zh_TW.js +++ b/core/l10n/zh_TW.js @@ -187,7 +187,6 @@ OC.L10N.register( "Server side authentication failed!" : "伺服器端認證失敗!", "Please contact your administrator." : "請聯絡系統管理員。", "remember" : "記住", - "Log in" : "登入", "Alternative Logins" : "其他登入方法", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "嗨,

%s 與你分享了%s
檢視

", "This ownCloud instance is currently in single user mode." : "這個 ownCloud 伺服器目前運作於單一使用者模式", diff --git a/core/l10n/zh_TW.json b/core/l10n/zh_TW.json index 0bfc3e619e7..bf1e1a5ff5b 100644 --- a/core/l10n/zh_TW.json +++ b/core/l10n/zh_TW.json @@ -185,7 +185,6 @@ "Server side authentication failed!" : "伺服器端認證失敗!", "Please contact your administrator." : "請聯絡系統管理員。", "remember" : "記住", - "Log in" : "登入", "Alternative Logins" : "其他登入方法", "Hey there,

just letting you know that %s shared %s with you.
View it!

" : "嗨,

%s 與你分享了%s
檢視

", "This ownCloud instance is currently in single user mode." : "這個 ownCloud 伺服器目前運作於單一使用者模式", diff --git a/lib/l10n/es.js b/lib/l10n/es.js index 5c66377bc56..e08ed66f1b5 100644 --- a/lib/l10n/es.js +++ b/lib/l10n/es.js @@ -116,7 +116,7 @@ OC.L10N.register( "A valid password must be provided" : "Se debe proporcionar una contraseña válida", "The username is already being used" : "El nombre de usuario ya está en uso", "No database drivers (sqlite, mysql, or postgresql) installed." : "No están instalados los drivers de BBDD (sqlite, mysql, o postgresql)", - "Microsoft Windows Platform is not supported" : "Plataforma Microsoft Windows no está soportada", + "Microsoft Windows Platform is not supported" : "La plataforma Microsoft Windows no está soportada", "Running ownCloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "Ejecutar el servidor ownCloud en la plataforma Microsoft Windows no está soportada. Sugerimos que utilice un servidor Linux en una máquina virtual si no posee opción de migrar de servidor. Encuentre paquetes de Linux así como implementar máquinas virtuales en %s. Para migrar instalaciones actuales hacia Linux puede encontrar algunos consejos y un script de migración en nuestra documentación.", "Cannot write into \"config\" directory" : "No se puede escribir el el directorio de configuración", "Cannot write into \"apps\" directory" : "No se puede escribir en el directorio de \"apps\"", diff --git a/lib/l10n/es.json b/lib/l10n/es.json index 57b4f936e8a..f9bca103231 100644 --- a/lib/l10n/es.json +++ b/lib/l10n/es.json @@ -114,7 +114,7 @@ "A valid password must be provided" : "Se debe proporcionar una contraseña válida", "The username is already being used" : "El nombre de usuario ya está en uso", "No database drivers (sqlite, mysql, or postgresql) installed." : "No están instalados los drivers de BBDD (sqlite, mysql, o postgresql)", - "Microsoft Windows Platform is not supported" : "Plataforma Microsoft Windows no está soportada", + "Microsoft Windows Platform is not supported" : "La plataforma Microsoft Windows no está soportada", "Running ownCloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "Ejecutar el servidor ownCloud en la plataforma Microsoft Windows no está soportada. Sugerimos que utilice un servidor Linux en una máquina virtual si no posee opción de migrar de servidor. Encuentre paquetes de Linux así como implementar máquinas virtuales en %s. Para migrar instalaciones actuales hacia Linux puede encontrar algunos consejos y un script de migración en nuestra documentación.", "Cannot write into \"config\" directory" : "No se puede escribir el el directorio de configuración", "Cannot write into \"apps\" directory" : "No se puede escribir en el directorio de \"apps\"", diff --git a/lib/l10n/nl.js b/lib/l10n/nl.js index c7a68c9000f..d08e8294dfb 100644 --- a/lib/l10n/nl.js +++ b/lib/l10n/nl.js @@ -49,6 +49,7 @@ OC.L10N.register( "Can't read file" : "Kan bestand niet lezen", "App directory already exists" : "App directory bestaat al", "Can't create app folder. Please fix permissions. %s" : "Kan de app map niet aanmaken, Herstel de permissies. %s", + "Archive does not contain a directory named %s" : "Archief bevat geen directory genaamd %s", "No source specified when installing app" : "Geen bron opgegeven bij installatie van de app", "No href specified when installing app from http" : "Geen href opgegeven bij installeren van de app vanaf http", "No path specified when installing app from local file" : "Geen pad opgegeven bij installeren van de app vanaf een lokaal bestand", diff --git a/lib/l10n/nl.json b/lib/l10n/nl.json index 560e20fbd4f..8d0b5dc7169 100644 --- a/lib/l10n/nl.json +++ b/lib/l10n/nl.json @@ -47,6 +47,7 @@ "Can't read file" : "Kan bestand niet lezen", "App directory already exists" : "App directory bestaat al", "Can't create app folder. Please fix permissions. %s" : "Kan de app map niet aanmaken, Herstel de permissies. %s", + "Archive does not contain a directory named %s" : "Archief bevat geen directory genaamd %s", "No source specified when installing app" : "Geen bron opgegeven bij installatie van de app", "No href specified when installing app from http" : "Geen href opgegeven bij installeren van de app vanaf http", "No path specified when installing app from local file" : "Geen pad opgegeven bij installeren van de app vanaf een lokaal bestand", diff --git a/lib/l10n/th_TH.js b/lib/l10n/th_TH.js index c2d327e22d5..2ff86f599e9 100644 --- a/lib/l10n/th_TH.js +++ b/lib/l10n/th_TH.js @@ -49,6 +49,7 @@ OC.L10N.register( "Can't read file" : "ไม่สามารถอ่านไฟล์", "App directory already exists" : "มีไดเรกทอรีแอพฯอยู่แล้ว", "Can't create app folder. Please fix permissions. %s" : "ไม่สามารถสร้างโฟลเดอร์แอพพลิเคชัน โปรดแก้ไขการอนุญาต: %s", + "Archive does not contain a directory named %s" : "เอกสารไม่สามารถประกอบด้วยไดเรกทอรีชื่อ %s", "No source specified when installing app" : "ไม่ได้ระบุแหล่งที่มาเมื่อติดตั้งแอพพลิเคชัน", "No href specified when installing app from http" : "ไม่ได้ระบุ href เมื่อกำลังติดตั้งแอพพลิเคชันจาก http", "No path specified when installing app from local file" : "ไม่ได้ระบุเส้นทางไว้เมื่อกำลังติดตั้งแอพฯจากไฟล์ต้นทาง", diff --git a/lib/l10n/th_TH.json b/lib/l10n/th_TH.json index d6ffcb5f73d..a215b67a180 100644 --- a/lib/l10n/th_TH.json +++ b/lib/l10n/th_TH.json @@ -47,6 +47,7 @@ "Can't read file" : "ไม่สามารถอ่านไฟล์", "App directory already exists" : "มีไดเรกทอรีแอพฯอยู่แล้ว", "Can't create app folder. Please fix permissions. %s" : "ไม่สามารถสร้างโฟลเดอร์แอพพลิเคชัน โปรดแก้ไขการอนุญาต: %s", + "Archive does not contain a directory named %s" : "เอกสารไม่สามารถประกอบด้วยไดเรกทอรีชื่อ %s", "No source specified when installing app" : "ไม่ได้ระบุแหล่งที่มาเมื่อติดตั้งแอพพลิเคชัน", "No href specified when installing app from http" : "ไม่ได้ระบุ href เมื่อกำลังติดตั้งแอพพลิเคชันจาก http", "No path specified when installing app from local file" : "ไม่ได้ระบุเส้นทางไว้เมื่อกำลังติดตั้งแอพฯจากไฟล์ต้นทาง", diff --git a/settings/l10n/es.js b/settings/l10n/es.js index 96baa987a8d..51c22653ad8 100644 --- a/settings/l10n/es.js +++ b/settings/l10n/es.js @@ -123,8 +123,8 @@ OC.L10N.register( "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Se ha habilitado la configuración de sólo lectura. Esto evita que ajustar algunas configuraciones a través de la interfaz web. Además, el archivo debe hacerse modificable manualmente para cada actualización.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP está aparentemente configurado para eliminar bloques de documentos en línea. Esto hará que varias aplicaciones principales no estén accesibles.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Probablemente esto venga a causa de la caché o un acelerador, tales como Zend OPcache o eAccelerator.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Su servidor está operando con Microsoft Windows. Le recomendamos Linux encarecidamente para disfrutar una experiencia óptima como usuario.", - "%1$s below version %2$s is installed, for stability and performance reasons we recommend to update to a newer %1$s version." : "nueva versión %1$s, la version %2$s está instalada, por cuestiones de estabilidad y rendimiento , recomendamos actualizar a la nueva versión %1$s .", + "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Su servidor está operando con Microsoft Windows. Le recomendamos GNU/Linux encarecidamente para disfrutar una experiencia óptima como usuario.", + "%1$s below version %2$s is installed, for stability and performance reasons we recommend to update to a newer %1$s version." : "nueva versión %1$s, la version %2$s está instalada, por cuestiones de estabilidad y rendimiento recomendamos actualizar a la nueva versión %1$s .", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "No se ha encontrado el modulo PHP 'fileinfo'. Le recomendamos encarecidamente que habilite este módulo para obtener mejores resultados con la detección de tipos MIME.", "System locale can not be set to a one which supports UTF-8." : "No se puede escoger una configuración regional que soporte UTF-8.", "This means that there might be problems with certain characters in file names." : "Esto significa que puede haber problemas con ciertos caracteres en los nombres de los archivos.", @@ -213,7 +213,7 @@ OC.L10N.register( "Cheers!" : "¡Saludos!", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hola, ¿qué tal?,\n\nEste mensaje es para hacerle saber que ahora tiene una cuenta %s.\n\nSu nombre de usuario: %s\nAcceda en: %s\n\n", "Administrator documentation" : "Documentación del adminsitrador", - "Online documentation" : "Documentación en linea", + "Online documentation" : "Documentación en línea", "Forum" : "Foro", "Issue tracker" : "Seguidor de problemas:", "Commercial support" : "Soporte Comercial", diff --git a/settings/l10n/es.json b/settings/l10n/es.json index f2e3b2ebd3b..3c0fefc7cfa 100644 --- a/settings/l10n/es.json +++ b/settings/l10n/es.json @@ -121,8 +121,8 @@ "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Se ha habilitado la configuración de sólo lectura. Esto evita que ajustar algunas configuraciones a través de la interfaz web. Además, el archivo debe hacerse modificable manualmente para cada actualización.", "PHP is apparently setup to strip inline doc blocks. This will make several core apps inaccessible." : "PHP está aparentemente configurado para eliminar bloques de documentos en línea. Esto hará que varias aplicaciones principales no estén accesibles.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Probablemente esto venga a causa de la caché o un acelerador, tales como Zend OPcache o eAccelerator.", - "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Su servidor está operando con Microsoft Windows. Le recomendamos Linux encarecidamente para disfrutar una experiencia óptima como usuario.", - "%1$s below version %2$s is installed, for stability and performance reasons we recommend to update to a newer %1$s version." : "nueva versión %1$s, la version %2$s está instalada, por cuestiones de estabilidad y rendimiento , recomendamos actualizar a la nueva versión %1$s .", + "Your server is running on Microsoft Windows. We highly recommend Linux for optimal user experience." : "Su servidor está operando con Microsoft Windows. Le recomendamos GNU/Linux encarecidamente para disfrutar una experiencia óptima como usuario.", + "%1$s below version %2$s is installed, for stability and performance reasons we recommend to update to a newer %1$s version." : "nueva versión %1$s, la version %2$s está instalada, por cuestiones de estabilidad y rendimiento recomendamos actualizar a la nueva versión %1$s .", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "No se ha encontrado el modulo PHP 'fileinfo'. Le recomendamos encarecidamente que habilite este módulo para obtener mejores resultados con la detección de tipos MIME.", "System locale can not be set to a one which supports UTF-8." : "No se puede escoger una configuración regional que soporte UTF-8.", "This means that there might be problems with certain characters in file names." : "Esto significa que puede haber problemas con ciertos caracteres en los nombres de los archivos.", @@ -211,7 +211,7 @@ "Cheers!" : "¡Saludos!", "Hey there,\n\njust letting you know that you now have an %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hola, ¿qué tal?,\n\nEste mensaje es para hacerle saber que ahora tiene una cuenta %s.\n\nSu nombre de usuario: %s\nAcceda en: %s\n\n", "Administrator documentation" : "Documentación del adminsitrador", - "Online documentation" : "Documentación en linea", + "Online documentation" : "Documentación en línea", "Forum" : "Foro", "Issue tracker" : "Seguidor de problemas:", "Commercial support" : "Soporte Comercial", diff --git a/settings/l10n/nl.js b/settings/l10n/nl.js index 0b029043441..6fef65aabc4 100644 --- a/settings/l10n/nl.js +++ b/settings/l10n/nl.js @@ -132,6 +132,7 @@ OC.L10N.register( "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Als uw installatie niet in de hoofddirectory van het domein staat, maar wel cron gebruikt, dan kunnen er problemen ontstaan bij het genereren van URL's. Om deze problemen te voorkomen zou u de \"overwrite.cli.url\" optie in config.php moeten instellen op het webroot pad van uw ownCloud (aanbevolen: \"%s\") ", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "het was niet mogelijk om de cronjob via CLI uit te voeren. De volgende technische problemen traden op:", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Lees de installatie handleiding goed door en controleer op fouten en waarschuwingen in de logging.", + "All checks passed." : "Alle checks geslaagd", "Open documentation" : "Open documentatie", "Allow apps to use the Share API" : "Apps toestaan de Share API te gebruiken", "Allow users to share via link" : "Sta gebruikers toe om te delen via een link", @@ -154,6 +155,12 @@ OC.L10N.register( "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php is geregisteerd bij een webcron service om elke 15 minuten cron.php over http aan te roepen.", "Use system's cron service to call the cron.php file every 15 minutes." : "Gebruik de systeem cron service om cron.php elke 15 minuten aan te roepen.", "Enable server-side encryption" : "Server-side versleuteling inschakelen", + "Please read carefully before activating server-side encryption: " : "Lees dit goed, voordat u de serverside versleuteling activeert:", + "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "Versleuteling van de server is een eenrichtingsproces. Als versleuteling is ingeschakeld, worden alle bestanden vanaf dat moment versleuteld op de server en is het niet meer mogelijk versleuteling later uit te schakelen.", + "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "Iedereen met toegang met hoge autorisaties op uw ownCloud server kan ue bestanden ontcijferen door aanvragen af te luisteren of de wachtwoorden van gebruikers die in leesbare tekst in sessie bestanden zijn opgeslagen uit te lezen. Versleuteling van de server beschermt dus niet tegen kwaadwillende beheerders, maar is praktisch om uw data op externe opslag te beveiligen.", + "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "Afhankelijk van de gebruikte cryptomodule, zal de bestandsomvang gemiddeld toenemen (35%% of meer bij gebruik van de standaardmodule)", + "You should regularly backup all encryption keys to prevent permanent data loss (data//files_encryption and data/files_encryption)" : "U zou regelmatig uw cryptosleutels moeten backuppen om permanent gegevensverlies te voorkomen (data//files_encryption en data/files_encryption)", + "This is the final warning: Do you really want to enable encryption?" : "Dit is de laatste waarschuwing: Wilt u versleuteling echt inschakelen?", "Enable encryption" : "Versleuteling inschakelen", "No encryption module loaded, please enable an encryption module in the app menu." : "Er is geen cryptomodule geladen, activeer een cryptomodule in het appmenu", "Select default encryption module:" : "Selecteer de standaard cryptomodule:", diff --git a/settings/l10n/nl.json b/settings/l10n/nl.json index ff0964a8215..978b70e7996 100644 --- a/settings/l10n/nl.json +++ b/settings/l10n/nl.json @@ -130,6 +130,7 @@ "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Als uw installatie niet in de hoofddirectory van het domein staat, maar wel cron gebruikt, dan kunnen er problemen ontstaan bij het genereren van URL's. Om deze problemen te voorkomen zou u de \"overwrite.cli.url\" optie in config.php moeten instellen op het webroot pad van uw ownCloud (aanbevolen: \"%s\") ", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "het was niet mogelijk om de cronjob via CLI uit te voeren. De volgende technische problemen traden op:", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "Lees de installatie handleiding goed door en controleer op fouten en waarschuwingen in de logging.", + "All checks passed." : "Alle checks geslaagd", "Open documentation" : "Open documentatie", "Allow apps to use the Share API" : "Apps toestaan de Share API te gebruiken", "Allow users to share via link" : "Sta gebruikers toe om te delen via een link", @@ -152,6 +153,12 @@ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php is geregisteerd bij een webcron service om elke 15 minuten cron.php over http aan te roepen.", "Use system's cron service to call the cron.php file every 15 minutes." : "Gebruik de systeem cron service om cron.php elke 15 minuten aan te roepen.", "Enable server-side encryption" : "Server-side versleuteling inschakelen", + "Please read carefully before activating server-side encryption: " : "Lees dit goed, voordat u de serverside versleuteling activeert:", + "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "Versleuteling van de server is een eenrichtingsproces. Als versleuteling is ingeschakeld, worden alle bestanden vanaf dat moment versleuteld op de server en is het niet meer mogelijk versleuteling later uit te schakelen.", + "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "Iedereen met toegang met hoge autorisaties op uw ownCloud server kan ue bestanden ontcijferen door aanvragen af te luisteren of de wachtwoorden van gebruikers die in leesbare tekst in sessie bestanden zijn opgeslagen uit te lezen. Versleuteling van de server beschermt dus niet tegen kwaadwillende beheerders, maar is praktisch om uw data op externe opslag te beveiligen.", + "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "Afhankelijk van de gebruikte cryptomodule, zal de bestandsomvang gemiddeld toenemen (35%% of meer bij gebruik van de standaardmodule)", + "You should regularly backup all encryption keys to prevent permanent data loss (data//files_encryption and data/files_encryption)" : "U zou regelmatig uw cryptosleutels moeten backuppen om permanent gegevensverlies te voorkomen (data//files_encryption en data/files_encryption)", + "This is the final warning: Do you really want to enable encryption?" : "Dit is de laatste waarschuwing: Wilt u versleuteling echt inschakelen?", "Enable encryption" : "Versleuteling inschakelen", "No encryption module loaded, please enable an encryption module in the app menu." : "Er is geen cryptomodule geladen, activeer een cryptomodule in het appmenu", "Select default encryption module:" : "Selecteer de standaard cryptomodule:", diff --git a/settings/l10n/th_TH.js b/settings/l10n/th_TH.js index a66c907be01..043f3429bf3 100644 --- a/settings/l10n/th_TH.js +++ b/settings/l10n/th_TH.js @@ -132,6 +132,7 @@ OC.L10N.register( "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "หากการติดตั้งของคุณไม่ได้ติดตั้งในรากของโดเมนและใช้ระบบ cron อาจมีปัญหาเกี่ยวกับการสร้าง URL เพื่อหลีกเลี่ยงปัญหาเหล่านี้โปรดไปตั้งค่า \"overwrite.cli.url\" ในไฟล์ config.php ของคุณไปยังเส้นทาง webroot ของการติดตั้งของคุณ (แนะนำ: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "มันเป็นไปไม่ได้ที่จะดำเนินการ cronjob ผ่านทาง CLI ข้อผิดพลาดทางเทคนิคต่อไปนี้จะปรากฏ:", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "กรุณาตรวจสอบ คู่มือการติดตั้ง และตรวจสอบข้อผิดพลาดหรือคำเตือนใน บันทึก", + "All checks passed." : "ผ่านการตรวจสอบทั้งหมด", "Open documentation" : "เปิดเอกสาร", "Allow apps to use the Share API" : "อนุญาตให้แอปฯสามารถใช้ API สำหรับแชร์ข้อมูลได้", "Allow users to share via link" : "อนุญาตให้ผู้ใช้สามารถแชร์ผ่านทางลิงค์", @@ -154,6 +155,12 @@ OC.L10N.register( "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php มีการลงทะเบียนให้บริการ Webcron เรียก cron.php ทุกๆ 15 นาที บน Http", "Use system's cron service to call the cron.php file every 15 minutes." : "บริการ cron ของระบบจะเรียกไฟล์ cron.php ทุกq 15 นาที", "Enable server-side encryption" : "เปิดการใช้งานเข้ารหัสฝั่งเซิร์ฟเวอร์", + "Please read carefully before activating server-side encryption: " : "กรุณาอ่านอย่างละเอียดก่อนที่จะเปิดใช้งานการเข้ารหัสฝั่งเซิร์ฟเวอร์:", + "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "การเข้ารหัสฝั่งเซิร์ฟเวอร์เป็นกระบวนการหนึ่ง เมื่อมีการเปิดใช้การเข้ารหัสไฟล์ทั้งหมดและมันจะเป็นไปไม่ได้ที่จะปิดการใช้งานการเข้ารหัสในภายหลัง", + "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "ทุกคนที่มีสิทธิในการเข้าถึงเซิร์ฟเวอร์ ownCloud คุณสามารถถอดรหัสไฟล์ของคุณโดยการสกัดกั้นการร้องขอหรือการอ่านรหัสผ่านของผู้ใช้ซึ่งจะถูกเก็บไว้ในเซสชั่นไฟล์ข้อความธรรมดา การเข้ารหัสฝั่งเซิร์ฟเวอร์จึงไม่ได้ป้องกันผู้ดูแลระบบที่เป็นอันตราย แต่จะเป็นประโยชน์สำหรับการปกป้องข้อมูลของคุณในการจัดเก็บข้อมูลจากภายนอก", + "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "ทั้งนี้ขึ้นอยู่กับโมดูลการเข้ารหัสที่เกิดขึ้นจริงขนาดไฟล์ทั่วไปจะเพิ่มขึ้น (35%% หรือมากกว่าเมื่อใช้โมดูลเริ่มต้น)", + "You should regularly backup all encryption keys to prevent permanent data loss (data//files_encryption and data/files_encryption)" : "คุณควรสำรองข้อมูลคีย์การเข้ารหัสอย่างสม่ำเสมอ เพื่อป้องกันการสูญเสียข้อมูลอย่างถาวร (data//files_encryption และ data/files_encryption)", + "This is the final warning: Do you really want to enable encryption?" : "นี่คือการเตือนครั้งสุดท้าย: คุณต้องการที่จะเปิดใช้การเข้ารหัส?", "Enable encryption" : "เปิดใช้งานการเข้ารหัส", "No encryption module loaded, please enable an encryption module in the app menu." : "ไม่มีโมดูลการเข้ารหัสโหลดโปรดเปิดใช้งานโมดูลการเข้ารหัสในเมนูแอพฯ", "Select default encryption module:" : "เลือกค่าเริ่มต้นโมดูลการเข้ารหัส:", diff --git a/settings/l10n/th_TH.json b/settings/l10n/th_TH.json index 17ccd3c3bd0..e67cc01f279 100644 --- a/settings/l10n/th_TH.json +++ b/settings/l10n/th_TH.json @@ -130,6 +130,7 @@ "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "หากการติดตั้งของคุณไม่ได้ติดตั้งในรากของโดเมนและใช้ระบบ cron อาจมีปัญหาเกี่ยวกับการสร้าง URL เพื่อหลีกเลี่ยงปัญหาเหล่านี้โปรดไปตั้งค่า \"overwrite.cli.url\" ในไฟล์ config.php ของคุณไปยังเส้นทาง webroot ของการติดตั้งของคุณ (แนะนำ: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "มันเป็นไปไม่ได้ที่จะดำเนินการ cronjob ผ่านทาง CLI ข้อผิดพลาดทางเทคนิคต่อไปนี้จะปรากฏ:", "Please double check the installation guides ↗, and check for any errors or warnings in the log." : "กรุณาตรวจสอบ คู่มือการติดตั้ง และตรวจสอบข้อผิดพลาดหรือคำเตือนใน บันทึก", + "All checks passed." : "ผ่านการตรวจสอบทั้งหมด", "Open documentation" : "เปิดเอกสาร", "Allow apps to use the Share API" : "อนุญาตให้แอปฯสามารถใช้ API สำหรับแชร์ข้อมูลได้", "Allow users to share via link" : "อนุญาตให้ผู้ใช้สามารถแชร์ผ่านทางลิงค์", @@ -152,6 +153,12 @@ "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php มีการลงทะเบียนให้บริการ Webcron เรียก cron.php ทุกๆ 15 นาที บน Http", "Use system's cron service to call the cron.php file every 15 minutes." : "บริการ cron ของระบบจะเรียกไฟล์ cron.php ทุกq 15 นาที", "Enable server-side encryption" : "เปิดการใช้งานเข้ารหัสฝั่งเซิร์ฟเวอร์", + "Please read carefully before activating server-side encryption: " : "กรุณาอ่านอย่างละเอียดก่อนที่จะเปิดใช้งานการเข้ารหัสฝั่งเซิร์ฟเวอร์:", + "Server-side encryption is a one way process. Once encryption is enabled, all files from that point forward will be encrypted on the server and it will not be possible to disable encryption at a later date" : "การเข้ารหัสฝั่งเซิร์ฟเวอร์เป็นกระบวนการหนึ่ง เมื่อมีการเปิดใช้การเข้ารหัสไฟล์ทั้งหมดและมันจะเป็นไปไม่ได้ที่จะปิดการใช้งานการเข้ารหัสในภายหลัง", + "Anyone who has privileged access to your ownCloud server can decrypt your files either by intercepting requests or reading out user passwords which are stored in plain text session files. Server-side encryption does therefore not protect against malicious administrators but is useful for protecting your data on externally hosted storage." : "ทุกคนที่มีสิทธิในการเข้าถึงเซิร์ฟเวอร์ ownCloud คุณสามารถถอดรหัสไฟล์ของคุณโดยการสกัดกั้นการร้องขอหรือการอ่านรหัสผ่านของผู้ใช้ซึ่งจะถูกเก็บไว้ในเซสชั่นไฟล์ข้อความธรรมดา การเข้ารหัสฝั่งเซิร์ฟเวอร์จึงไม่ได้ป้องกันผู้ดูแลระบบที่เป็นอันตราย แต่จะเป็นประโยชน์สำหรับการปกป้องข้อมูลของคุณในการจัดเก็บข้อมูลจากภายนอก", + "Depending on the actual encryption module the general file size is increased (by 35%% or more when using the default module)" : "ทั้งนี้ขึ้นอยู่กับโมดูลการเข้ารหัสที่เกิดขึ้นจริงขนาดไฟล์ทั่วไปจะเพิ่มขึ้น (35%% หรือมากกว่าเมื่อใช้โมดูลเริ่มต้น)", + "You should regularly backup all encryption keys to prevent permanent data loss (data//files_encryption and data/files_encryption)" : "คุณควรสำรองข้อมูลคีย์การเข้ารหัสอย่างสม่ำเสมอ เพื่อป้องกันการสูญเสียข้อมูลอย่างถาวร (data//files_encryption และ data/files_encryption)", + "This is the final warning: Do you really want to enable encryption?" : "นี่คือการเตือนครั้งสุดท้าย: คุณต้องการที่จะเปิดใช้การเข้ารหัส?", "Enable encryption" : "เปิดใช้งานการเข้ารหัส", "No encryption module loaded, please enable an encryption module in the app menu." : "ไม่มีโมดูลการเข้ารหัสโหลดโปรดเปิดใช้งานโมดูลการเข้ารหัสในเมนูแอพฯ", "Select default encryption module:" : "เลือกค่าเริ่มต้นโมดูลการเข้ารหัส:", -- GitLab From a12d3547627611a933b3e70ab5b51c2e130b0e24 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Fri, 28 Aug 2015 12:04:52 +0200 Subject: [PATCH 064/783] Deprecate OC_L10N::get() --- lib/private/l10n.php | 9 +++------ lib/public/il10n.php | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/lib/private/l10n.php b/lib/private/l10n.php index 17acaac1692..168011cfcec 100644 --- a/lib/private/l10n.php +++ b/lib/private/l10n.php @@ -81,14 +81,11 @@ class OC_L10N implements \OCP\IL10N { * get an L10N instance * @param string $app * @param string|null $lang - * @return \OC_L10N + * @return \OCP\IL10N + * @deprecated Use \OC::$server->getL10NFactory()->get() instead */ public static function get($app, $lang=null) { - if (is_null($lang)) { - return OC::$server->getL10N($app); - } else { - return new \OC_L10N($app, $lang); - } + return \OC::$server->getL10NFactory()->get($app, $lang); } /** diff --git a/lib/public/il10n.php b/lib/public/il10n.php index e1d0102105b..c6e076a21f8 100644 --- a/lib/public/il10n.php +++ b/lib/public/il10n.php @@ -100,7 +100,7 @@ interface IL10N { /** - * The code (en, de, ...) of the language that is used for this OC_L10N object + * The code (en, de, ...) of the language that is used for this IL10N object * * @return string language * @since 7.0.0 -- GitLab From bd1215c1dd0955bc8c99a8d6d9005a6fd6bdc8aa Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Fri, 28 Aug 2015 12:08:54 +0200 Subject: [PATCH 065/783] Add a test for the interface --- tests/lib/server.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/lib/server.php b/tests/lib/server.php index bc44c50a22a..e73fc8b3ab1 100644 --- a/tests/lib/server.php +++ b/tests/lib/server.php @@ -90,6 +90,7 @@ class Server extends \Test\TestCase { ['JobList', '\OCP\BackgroundJob\IJobList'], ['L10NFactory', '\OC\L10N\Factory'], + ['L10NFactory', '\OCP\L10N\IFactory'], ['LockingProvider', '\OCP\Lock\ILockingProvider'], ['Logger', '\OC\Log'], ['Logger', '\OCP\ILogger'], -- GitLab From 7303b68577979bfe53859157f60659bfb3c6000e Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Fri, 28 Aug 2015 12:23:57 +0200 Subject: [PATCH 066/783] Fix controls bar calculation Controls bar calculation needs to take the sidebar visibility into account. Recalculation is now triggered when sidebar is toggled, using a new app-content event "appresized". --- core/js/apps.js | 6 +++--- core/js/js.js | 12 +++++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/core/js/apps.js b/core/js/apps.js index f148de3b2e9..d8f4bfdf1c5 100644 --- a/core/js/apps.js +++ b/core/js/apps.js @@ -27,8 +27,8 @@ */ exports.Apps.showAppSidebar = function($el) { var $appSidebar = $el || $('#app-sidebar'); - $appSidebar.removeClass('disappear') - $('#app-content').addClass('with-app-sidebar'); + $appSidebar.removeClass('disappear'); + $('#app-content').addClass('with-app-sidebar').trigger(new $.Event('appresized')); }; @@ -41,7 +41,7 @@ exports.Apps.hideAppSidebar = function($el) { var $appSidebar = $el || $('#app-sidebar'); $appSidebar.addClass('disappear'); - $('#app-content').removeClass('with-app-sidebar'); + $('#app-content').removeClass('with-app-sidebar').trigger(new $.Event('appresized')); }; /** diff --git a/core/js/js.js b/core/js/js.js index 52cf076472a..8d3756ae2ec 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -1393,13 +1393,19 @@ function initCore() { // if there is a scrollbar … if($('#app-content').get(0).scrollHeight > $('#app-content').height()) { if($(window).width() > 768) { - controlsWidth = $('#content').width() - $('#app-navigation').width() - $('#app-sidebar').width() - getScrollBarWidth(); + controlsWidth = $('#content').width() - $('#app-navigation').width() - getScrollBarWidth(); + if (!$('#app-sidebar').hasClass('hidden') && !$('#app-sidebar').hasClass('disappear')) { + controlsWidth -= $('#app-sidebar').width(); + } } else { controlsWidth = $('#content').width() - getScrollBarWidth(); } } else { // if there is none if($(window).width() > 768) { - controlsWidth = $('#content').width() - $('#app-navigation').width() - $('#app-sidebar').width(); + controlsWidth = $('#content').width() - $('#app-navigation').width(); + if (!$('#app-sidebar').hasClass('hidden') && !$('#app-sidebar').hasClass('disappear')) { + controlsWidth -= $('#app-sidebar').width(); + } } else { controlsWidth = $('#content').width(); } @@ -1411,7 +1417,7 @@ function initCore() { $(window).resize(_.debounce(adjustControlsWidth, 250)); - $('body').delegate('#app-content', 'apprendered', adjustControlsWidth); + $('body').delegate('#app-content', 'apprendered appresized', adjustControlsWidth); } -- GitLab From 30d2283bedb804350bd8641307c34a9b490ee0fb Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Fri, 28 Aug 2015 13:30:20 +0200 Subject: [PATCH 067/783] compress icons in navigation, move to monochrome again --- apps/files/img/delete.png | Bin 243 -> 208 bytes apps/files/img/folder.png | Bin 135 -> 151 bytes apps/files/img/folder.svg | 4 ++-- apps/files/img/public.svg | 4 ++-- apps/files/img/star.png | Bin 492 -> 422 bytes apps/files/img/star.svg | 2 +- 6 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/files/img/delete.png b/apps/files/img/delete.png index e891b370cca7b3d83e937863dbbc9578c5b8b1bd..20e894c7f740da793d98590fa12e998749ae2ad3 100644 GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF4e$wZ{r~?zkVzysV6}MxP$^$Y zkY6wZvyN+A`Ggfa4jepu>+=mQw;Mni7f%<*5RT~HlM8tp3`86bX4|%T&X^)NW2G_! z*BO6tjR&*5{PsREypgxT%_U|ML-GHUB@bdYiLZLo7<+Aj#I^MrTUPyMxG`DgbVqi- PKFCp?u6{1-oD!M_?dBnL_G%^0|SHn=l_X7ilx}eGlT;OYB*9lfPBsZkH}&M2Hxu+%;=;sy8hT|5}cn_Ql40p%1~Zju9umYU7Va)kgAtols@~NjTBH(fv1aOh(+(&Nr7Ak6nLB` zSN{L~L$hMW+xyHZ_NPKLN`%{5>u%aj7V?TYWweEFT!`!Y2ng9#!1`#rm_L|MB^U&(t-XW|T<#w)um70$&irgv53YW{$t-il*cn XUC&$i?88QNpydpnu6{1-oD!Mt@$UVHe<6aJ>wsd)o-U3d95a&> y4lpFi%5o*NxwyL<_b@W?8MrYndXC7D0KC&ZP3fg!A9W=PSj&|(nM=IyQo3bB*~`2{mHbiAMFIbj2kuk7jK z7{W0#IpF}q89hCw1h($(Zs8tACN_gM=A}GoGa4lr7_|NgKlC;Erv+5b;OXk;vd$@? F2>{sIAhiGh diff --git a/apps/files/img/folder.svg b/apps/files/img/folder.svg index e9d96d40490..0cf4b3499dc 100644 --- a/apps/files/img/folder.svg +++ b/apps/files/img/folder.svg @@ -1,6 +1,6 @@ - - + + diff --git a/apps/files/img/public.svg b/apps/files/img/public.svg index 99a71c6cb5b..7721c9e3408 100644 --- a/apps/files/img/public.svg +++ b/apps/files/img/public.svg @@ -1,7 +1,7 @@ - - + + diff --git a/apps/files/img/star.png b/apps/files/img/star.png index 22e68c757e79535d4378a7e7539b5f6e99dfb401..8b24c4441cfa2877a37c9275b800edb4b08dfe4a 100644 GIT binary patch delta 397 zcmV;80doHA1EvFzBYyw{b3#c}2nYxWd6K2j~r^T0vtKaM1xCYXx2o zfW}(t7hKoaaLp=*HpprGRmr=7*w+Vrm0rr;kfCWflmOv$X^E|DvSfOqkMW9^rE r9!L1ZP6+rAvmwDqB^-2-?@zz=e2+K`#rM?!0000g zv{XYyYlBNr&_5B;);}N(EeQ=S{Q*He71@t5C~61{1Q89do(3(iK9}w>`@rEm=lkRR zd^zWPIFVA4r817`(rYA@IpN)TRD>z(YRCddR>gC%->PruvVY>RMq2EYQsn$y({=RW zfSRj0DS6;zs^$CU{{ffLz^N9?s8>Hs^j}0GBIS z$u(vC!2F+)Hpi-YjkFl4bO-kk9jnh%!rhH_E8~(djoKceOTrEHG_%#mWsD0?ap)hR zUlcAHNpERAynnIuLSX_Qc8yG)Ya0Iz-42G4^cf92%Z7$&2Thtt-?y3DUg?j~W7&ev zd%oO%5g76SWKumJNSbG2Wio+zDxUc4T1qx$n z);>eR1FVVaK3AWn&?Ahhr@4x+RVULDZhIY%B - + -- GitLab From 19bc5a452a97788c9153c05523cf6dd61d9c111c Mon Sep 17 00:00:00 2001 From: Robin McCorkell Date: Wed, 12 Aug 2015 22:10:30 +0100 Subject: [PATCH 068/783] Migrate Swift external storage to new API The Rackspace/OpenStack differences have been split into separate auth mechanisms, with correct legacy migration --- apps/files_external/appinfo/app.php | 18 ------ apps/files_external/appinfo/application.php | 5 ++ .../lib/auth/openstack/openstack.php | 48 +++++++++++++++ .../lib/auth/openstack/rackspace.php | 46 ++++++++++++++ apps/files_external/lib/backend/swift.php | 60 +++++++++++++++++++ 5 files changed, 159 insertions(+), 18 deletions(-) create mode 100644 apps/files_external/lib/auth/openstack/openstack.php create mode 100644 apps/files_external/lib/auth/openstack/rackspace.php create mode 100644 apps/files_external/lib/backend/swift.php diff --git a/apps/files_external/appinfo/app.php b/apps/files_external/appinfo/app.php index 9db4b0a6330..da24dfd819a 100644 --- a/apps/files_external/appinfo/app.php +++ b/apps/files_external/appinfo/app.php @@ -70,24 +70,6 @@ if (OCP\Config::getAppValue('files_external', 'allow_user_mounting', 'yes') == ' OCP\Util::connectHook('OC_Filesystem', 'post_initMountPoints', '\OC_Mount_Config', 'initMountPointsHook'); OCP\Util::connectHook('OC_User', 'post_login', 'OC\Files\Storage\SMB_OC', 'login'); -OC_Mount_Config::registerBackend('\OC\Files\Storage\Swift', [ - 'backend' => (string)$l->t('OpenStack Object Storage'), - 'priority' => 100, - 'configuration' => [ - 'user' => (string)$l->t('Username'), - 'bucket' => (string)$l->t('Bucket'), - 'region' => '&'.$l->t('Region (optional for OpenStack Object Storage)'), - 'key' => '&*'.$l->t('API Key (required for Rackspace Cloud Files)'), - 'tenant' => '&'.$l->t('Tenantname (required for OpenStack Object Storage)'), - 'password' => '&*'.$l->t('Password (required for OpenStack Object Storage)'), - 'service_name' => '&'.$l->t('Service Name (required for OpenStack Object Storage)'), - 'url' => '&'.$l->t('URL of identity endpoint (required for OpenStack Object Storage)'), - 'timeout' => '&'.$l->t('Timeout of HTTP requests in seconds'), - ], - 'has_dependencies' => true, -]); - - if (!OC_Util::runningOnWindows()) { OC_Mount_Config::registerBackend('\OC\Files\Storage\SMB_OC', [ 'backend' => (string)$l->t('SMB / CIFS using OC login'), diff --git a/apps/files_external/appinfo/application.php b/apps/files_external/appinfo/application.php index 1e43c737408..81e60658c8c 100644 --- a/apps/files_external/appinfo/application.php +++ b/apps/files_external/appinfo/application.php @@ -68,6 +68,7 @@ class Application extends App { $container->query('OCA\Files_External\Lib\Backend\AmazonS3'), $container->query('OCA\Files_External\Lib\Backend\Dropbox'), $container->query('OCA\Files_External\Lib\Backend\Google'), + $container->query('OCA\Files_External\Lib\Backend\Swift'), ]); if (!\OC_Util::runningOnWindows()) { @@ -101,6 +102,10 @@ class Application extends App { // AuthMechanism::SCHEME_OAUTH2 mechanisms $container->query('OCA\Files_External\Lib\Auth\OAuth2\OAuth2'), + // AuthMechanism::SCHEME_OPENSTACK mechanisms + $container->query('OCA\Files_External\Lib\Auth\OpenStack\OpenStack'), + $container->query('OCA\Files_External\Lib\Auth\OpenStack\Rackspace'), + // Specialized mechanisms $container->query('OCA\Files_External\Lib\Auth\AmazonS3\AccessKey'), ]); diff --git a/apps/files_external/lib/auth/openstack/openstack.php b/apps/files_external/lib/auth/openstack/openstack.php new file mode 100644 index 00000000000..faf356bcf2e --- /dev/null +++ b/apps/files_external/lib/auth/openstack/openstack.php @@ -0,0 +1,48 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program 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, version 3, + * along with this program. If not, see + * + */ + +namespace OCA\Files_External\Lib\Auth\OpenStack; + +use \OCP\IL10N; +use \OCA\Files_External\Lib\DefinitionParameter; +use \OCA\Files_External\Lib\Auth\AuthMechanism; + +/** + * OpenStack Keystone authentication + */ +class OpenStack extends AuthMechanism { + + public function __construct(IL10N $l) { + $this + ->setIdentifier('openstack::openstack') + ->setScheme(self::SCHEME_OPENSTACK) + ->setText($l->t('OpenStack')) + ->addParameters([ + (new DefinitionParameter('user', $l->t('Username'))), + (new DefinitionParameter('password', $l->t('Password'))) + ->setType(DefinitionParameter::VALUE_PASSWORD), + (new DefinitionParameter('tenant', $l->t('Tenant name'))), + (new DefinitionParameter('url', $l->t('Identity endpoint URL'))), + ]) + ; + } + +} diff --git a/apps/files_external/lib/auth/openstack/rackspace.php b/apps/files_external/lib/auth/openstack/rackspace.php new file mode 100644 index 00000000000..9268f3aad87 --- /dev/null +++ b/apps/files_external/lib/auth/openstack/rackspace.php @@ -0,0 +1,46 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program 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, version 3, + * along with this program. If not, see + * + */ + +namespace OCA\Files_External\Lib\Auth\OpenStack; + +use \OCP\IL10N; +use \OCA\Files_External\Lib\DefinitionParameter; +use \OCA\Files_External\Lib\Auth\AuthMechanism; + +/** + * Rackspace authentication + */ +class Rackspace extends AuthMechanism { + + public function __construct(IL10N $l) { + $this + ->setIdentifier('openstack::rackspace') + ->setScheme(self::SCHEME_OPENSTACK) + ->setText($l->t('Rackspace')) + ->addParameters([ + (new DefinitionParameter('user', $l->t('Username'))), + (new DefinitionParameter('key', $l->t('API key'))) + ->setType(DefinitionParameter::VALUE_PASSWORD), + ]) + ; + } + +} diff --git a/apps/files_external/lib/backend/swift.php b/apps/files_external/lib/backend/swift.php new file mode 100644 index 00000000000..9f01a923638 --- /dev/null +++ b/apps/files_external/lib/backend/swift.php @@ -0,0 +1,60 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program 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, version 3, + * along with this program. If not, see + * + */ + +namespace OCA\Files_External\Lib\Backend; + +use \OCP\IL10N; +use \OCA\Files_External\Lib\Backend\Backend; +use \OCA\Files_External\Lib\DefinitionParameter; +use \OCA\Files_External\Lib\Auth\AuthMechanism; +use \OCA\Files_External\Service\BackendService; +use \OCA\Files_External\Lib\Auth\OpenStack\OpenStack; +use \OCA\Files_External\Lib\Auth\OpenStack\Rackspace; + +class Swift extends Backend { + + public function __construct(IL10N $l, OpenStack $openstackAuth, Rackspace $rackspaceAuth) { + $this + ->setIdentifier('swift') + ->addIdentifierAlias('\OC\Files\Storage\Swift') // legacy compat + ->setStorageClass('\OC\Files\Storage\Swift') + ->setText($l->t('OpenStack Object Storage')) + ->addParameters([ + (new DefinitionParameter('service_name', $l->t('Service name'))) + ->setFlag(DefinitionParameter::FLAG_OPTIONAL), + (new DefinitionParameter('region', $l->t('Region'))) + ->setFlag(DefinitionParameter::FLAG_OPTIONAL), + (new DefinitionParameter('bucket', $l->t('Bucket'))), + (new DefinitionParameter('timeout', $l->t('Request timeout (seconds)'))) + ->setFlag(DefinitionParameter::FLAG_OPTIONAL), + ]) + ->setDependencyCheck('\OC\Files\Storage\Swift::checkDependencies') + ->addAuthScheme(AuthMechanism::SCHEME_OPENSTACK) + ->setLegacyAuthMechanismCallback(function(array $params) use ($openstackAuth, $rackspaceAuth) { + if (isset($params['key'])) { + return $rackspaceAuth; + } + return $openstackAuth; + }) + ; + } + +} -- GitLab From cb1ef827028126dd55c21fc3f3720723e5cc25a6 Mon Sep 17 00:00:00 2001 From: Robin McCorkell Date: Wed, 12 Aug 2015 22:14:42 +0100 Subject: [PATCH 069/783] Migrate SMB_OC external storage to new API SMB_OC has been merged with SMB, via the identifier aliases mechanism. Legacy migration is done to the Session Credentials password mechanism --- apps/files_external/appinfo/app.php | 16 --- apps/files_external/appinfo/application.php | 1 + apps/files_external/lib/backend/smb_oc.php | 67 +++++++++++ apps/files_external/lib/smb_oc.php | 126 -------------------- 4 files changed, 68 insertions(+), 142 deletions(-) create mode 100644 apps/files_external/lib/backend/smb_oc.php delete mode 100644 apps/files_external/lib/smb_oc.php diff --git a/apps/files_external/appinfo/app.php b/apps/files_external/appinfo/app.php index da24dfd819a..351b87c4c8b 100644 --- a/apps/files_external/appinfo/app.php +++ b/apps/files_external/appinfo/app.php @@ -37,7 +37,6 @@ OC::$CLASSPATH['OC\Files\Storage\OwnCloud'] = 'files_external/lib/owncloud.php'; OC::$CLASSPATH['OC\Files\Storage\Google'] = 'files_external/lib/google.php'; OC::$CLASSPATH['OC\Files\Storage\Swift'] = 'files_external/lib/swift.php'; OC::$CLASSPATH['OC\Files\Storage\SMB'] = 'files_external/lib/smb.php'; -OC::$CLASSPATH['OC\Files\Storage\SMB_OC'] = 'files_external/lib/smb_oc.php'; OC::$CLASSPATH['OC\Files\Storage\AmazonS3'] = 'files_external/lib/amazons3.php'; OC::$CLASSPATH['OC\Files\Storage\Dropbox'] = 'files_external/lib/dropbox.php'; OC::$CLASSPATH['OC\Files\Storage\SFTP'] = 'files_external/lib/sftp.php'; @@ -68,21 +67,6 @@ if (OCP\Config::getAppValue('files_external', 'allow_user_mounting', 'yes') == ' // connecting hooks OCP\Util::connectHook('OC_Filesystem', 'post_initMountPoints', '\OC_Mount_Config', 'initMountPointsHook'); -OCP\Util::connectHook('OC_User', 'post_login', 'OC\Files\Storage\SMB_OC', 'login'); - -if (!OC_Util::runningOnWindows()) { - OC_Mount_Config::registerBackend('\OC\Files\Storage\SMB_OC', [ - 'backend' => (string)$l->t('SMB / CIFS using OC login'), - 'priority' => 90, - 'configuration' => [ - 'host' => (string)$l->t('Host'), - 'username_as_share' => '!'.$l->t('Username as share'), - 'share' => '&'.$l->t('Share'), - 'root' => '&'.$l->t('Remote subfolder'), - ], - 'has_dependencies' => true, - ]); -} OC_Mount_Config::registerBackend('\OC\Files\Storage\SFTP_Key', [ 'backend' => (string)$l->t('SFTP with secret key login'), diff --git a/apps/files_external/appinfo/application.php b/apps/files_external/appinfo/application.php index 81e60658c8c..e5275c29b39 100644 --- a/apps/files_external/appinfo/application.php +++ b/apps/files_external/appinfo/application.php @@ -74,6 +74,7 @@ class Application extends App { if (!\OC_Util::runningOnWindows()) { $service->registerBackends([ $container->query('OCA\Files_External\Lib\Backend\SMB'), + $container->query('OCA\Files_External\Lib\Backend\SMB_OC'), ]); } } diff --git a/apps/files_external/lib/backend/smb_oc.php b/apps/files_external/lib/backend/smb_oc.php new file mode 100644 index 00000000000..cae3818c76c --- /dev/null +++ b/apps/files_external/lib/backend/smb_oc.php @@ -0,0 +1,67 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program 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, version 3, + * along with this program. If not, see + * + */ + +namespace OCA\Files_External\Lib\Backend; + +use \OCP\IL10N; +use \OCA\Files_External\Lib\Backend\Backend; +use \OCA\Files_External\Lib\DefinitionParameter; +use \OCA\Files_External\Lib\Auth\AuthMechanism; +use \OCA\Files_External\Service\BackendService; +use \OCA\Files_External\Lib\Auth\Password\SessionCredentials; +use \OCA\Files_External\Lib\StorageConfig; + +/** + * Deprecated SMB_OC class - use SMB with the password::sessioncredentials auth mechanism + */ +class SMB_OC extends Backend { + + public function __construct(IL10N $l, SessionCredentials $legacyAuth) { + $this + ->setIdentifier('\OC\Files\Storage\SMB_OC') + ->setStorageClass('\OC\Files\Storage\SMB') + ->setText($l->t('SMB / CIFS using OC login [DEPRECATED]')) + ->addParameters([ + (new DefinitionParameter('host', $l->t('Host'))), + (new DefinitionParameter('username_as_share', $l->t('Username as share'))) + ->setType(DefinitionParameter::VALUE_BOOLEAN), + (new DefinitionParameter('share', $l->t('Share'))) + ->setFlag(DefinitionParameter::FLAG_OPTIONAL), + (new DefinitionParameter('root', $l->t('Remote subfolder'))) + ->setFlag(DefinitionParameter::FLAG_OPTIONAL), + ]) + ->setDependencyCheck('\OC\Files\Storage\SMB::checkDependencies') + ->setPriority(BackendService::PRIORITY_DEFAULT - 10) + ->addAuthScheme(AuthMechanism::SCHEME_PASSWORD) + ->setLegacyAuthMechanism($legacyAuth) + ; + } + + public function manipulateStorageConfig(StorageConfig &$storage) { + $username_as_share = ($storage->getBackendOption('username_as_share') === 'true'); + + if ($this->username_as_share) { + $share = '/' . $storage->getBackendOption('user'); + $storage->setBackendOption('share', $share); + } + } + +} diff --git a/apps/files_external/lib/smb_oc.php b/apps/files_external/lib/smb_oc.php deleted file mode 100644 index 547caa5ecbf..00000000000 --- a/apps/files_external/lib/smb_oc.php +++ /dev/null @@ -1,126 +0,0 @@ - - * @author Morris Jobke - * @author Robin Appelman - * @author Robin McCorkell - * - * @copyright Copyright (c) 2015, ownCloud, Inc. - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program 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, version 3, - * along with this program. If not, see - * - */ - -namespace OC\Files\Storage; - - -use Icewind\SMB\Exception\AccessDeniedException; -use Icewind\SMB\Exception\Exception; -use Icewind\SMB\Server; - -class SMB_OC extends SMB { - private $username_as_share; - - /** - * @param array $params - * @throws \Exception - */ - public function __construct($params) { - if (isset($params['host'])) { - $host = $params['host']; - $this->username_as_share = ($params['username_as_share'] === true); - - // dummy credentials, unused, to satisfy constructor - $user = 'foo'; - $password = 'bar'; - if (\OC::$server->getSession()->exists('smb-credentials')) { - $params_auth = json_decode(\OC::$server->getCrypto()->decrypt(\OC::$server->getSession()->get('smb-credentials')), true); - $user = \OC::$server->getSession()->get('loginname'); - $password = $params_auth['password']; - } else { - // assume we are testing from the admin section - } - - $root = isset($params['root']) ? $params['root'] : '/'; - $share = ''; - - if ($this->username_as_share) { - $share = '/' . $user; - } elseif (isset($params['share'])) { - $share = $params['share']; - } else { - throw new \Exception(); - } - parent::__construct(array( - "user" => $user, - "password" => $password, - "host" => $host, - "share" => $share, - "root" => $root - )); - } else { - throw new \Exception(); - } - } - - - /** - * Intercepts the user credentials on login and stores them - * encrypted inside the session if SMB_OC storage is enabled. - * @param array $params - */ - public static function login($params) { - $mountpoints = \OC_Mount_Config::getAbsoluteMountPoints($params['uid']); - $mountpointClasses = array(); - foreach($mountpoints as $mountpoint) { - $mountpointClasses[$mountpoint['class']] = true; - } - if(isset($mountpointClasses['\OC\Files\Storage\SMB_OC'])) { - \OC::$server->getSession()->set('smb-credentials', \OC::$server->getCrypto()->encrypt(json_encode($params))); - } - } - - /** - * @param string $path - * @return boolean - */ - public function isSharable($path) { - return false; - } - - /** - * @param bool $isPersonal - * @return bool - */ - public function test($isPersonal = true) { - if ($isPersonal) { - if ($this->stat('')) { - return true; - } - return false; - } else { - $server = new Server($this->server->getHost(), '', ''); - - try { - $server->listShares(); - return true; - } catch (AccessDeniedException $e) { - // expected due to anonymous login - return true; - } catch (Exception $e) { - return false; - } - } - } -} -- GitLab From 1084e3adc7636787a139b68335112715b187b3bb Mon Sep 17 00:00:00 2001 From: Robin McCorkell Date: Wed, 12 Aug 2015 22:20:08 +0100 Subject: [PATCH 070/783] Migrate SFTP_Key external storage to new API The SFTP backend now supports public key authentication alongside password authentication. --- apps/files_external/appinfo/app.php | 13 -- apps/files_external/appinfo/application.php | 4 + apps/files_external/appinfo/routes.php | 2 +- apps/files_external/js/public_key.js | 46 ++++ apps/files_external/js/sftp_key.js | 53 ----- .../files_external/lib/auth/publickey/rsa.php | 65 ++++++ apps/files_external/lib/backend/sftp.php | 1 + apps/files_external/lib/backend/sftp_key.php | 48 ++++ apps/files_external/lib/sftp.php | 17 +- apps/files_external/lib/sftp_key.php | 215 ------------------ 10 files changed, 177 insertions(+), 287 deletions(-) create mode 100644 apps/files_external/js/public_key.js delete mode 100644 apps/files_external/js/sftp_key.js create mode 100644 apps/files_external/lib/auth/publickey/rsa.php create mode 100644 apps/files_external/lib/backend/sftp_key.php delete mode 100644 apps/files_external/lib/sftp_key.php diff --git a/apps/files_external/appinfo/app.php b/apps/files_external/appinfo/app.php index 351b87c4c8b..f33012b5f09 100644 --- a/apps/files_external/appinfo/app.php +++ b/apps/files_external/appinfo/app.php @@ -40,7 +40,6 @@ OC::$CLASSPATH['OC\Files\Storage\SMB'] = 'files_external/lib/smb.php'; OC::$CLASSPATH['OC\Files\Storage\AmazonS3'] = 'files_external/lib/amazons3.php'; OC::$CLASSPATH['OC\Files\Storage\Dropbox'] = 'files_external/lib/dropbox.php'; OC::$CLASSPATH['OC\Files\Storage\SFTP'] = 'files_external/lib/sftp.php'; -OC::$CLASSPATH['OC\Files\Storage\SFTP_Key'] = 'files_external/lib/sftp_key.php'; OC::$CLASSPATH['OC_Mount_Config'] = 'files_external/lib/config.php'; OC::$CLASSPATH['OCA\Files\External\Api'] = 'files_external/lib/api.php'; @@ -68,17 +67,5 @@ if (OCP\Config::getAppValue('files_external', 'allow_user_mounting', 'yes') == ' // connecting hooks OCP\Util::connectHook('OC_Filesystem', 'post_initMountPoints', '\OC_Mount_Config', 'initMountPointsHook'); -OC_Mount_Config::registerBackend('\OC\Files\Storage\SFTP_Key', [ - 'backend' => (string)$l->t('SFTP with secret key login'), - 'priority' => 100, - 'configuration' => array( - 'host' => (string)$l->t('Host'), - 'user' => (string)$l->t('Username'), - 'public_key' => (string)$l->t('Public key'), - 'private_key' => '#private_key', - 'root' => '&'.$l->t('Remote subfolder')), - 'custom' => 'sftp_key', - ] -); $mountProvider = $appContainer->query('OCA\Files_External\Config\ConfigAdapter'); \OC::$server->getMountProviderCollection()->registerProvider($mountProvider); diff --git a/apps/files_external/appinfo/application.php b/apps/files_external/appinfo/application.php index e5275c29b39..ed236af0ec5 100644 --- a/apps/files_external/appinfo/application.php +++ b/apps/files_external/appinfo/application.php @@ -69,6 +69,7 @@ class Application extends App { $container->query('OCA\Files_External\Lib\Backend\Dropbox'), $container->query('OCA\Files_External\Lib\Backend\Google'), $container->query('OCA\Files_External\Lib\Backend\Swift'), + $container->query('OCA\Files_External\Lib\Backend\SFTP_Key'), ]); if (!\OC_Util::runningOnWindows()) { @@ -103,6 +104,9 @@ class Application extends App { // AuthMechanism::SCHEME_OAUTH2 mechanisms $container->query('OCA\Files_External\Lib\Auth\OAuth2\OAuth2'), + // AuthMechanism::SCHEME_PUBLICKEY mechanisms + $container->query('OCA\Files_External\Lib\Auth\PublicKey\RSA'), + // AuthMechanism::SCHEME_OPENSTACK mechanisms $container->query('OCA\Files_External\Lib\Auth\OpenStack\OpenStack'), $container->query('OCA\Files_External\Lib\Auth\OpenStack\Rackspace'), diff --git a/apps/files_external/appinfo/routes.php b/apps/files_external/appinfo/routes.php index 5d7018c3476..a371273e74e 100644 --- a/apps/files_external/appinfo/routes.php +++ b/apps/files_external/appinfo/routes.php @@ -38,7 +38,7 @@ namespace OCA\Files_External\AppInfo; 'routes' => array( array( 'name' => 'Ajax#getSshKeys', - 'url' => '/ajax/sftp_key.php', + 'url' => '/ajax/public_key.php', 'verb' => 'POST', 'requirements' => array() ) diff --git a/apps/files_external/js/public_key.js b/apps/files_external/js/public_key.js new file mode 100644 index 00000000000..a8546067452 --- /dev/null +++ b/apps/files_external/js/public_key.js @@ -0,0 +1,46 @@ +$(document).ready(function() { + + OCA.External.Settings.mountConfig.whenSelectAuthMechanism(function($tr, authMechanism, scheme) { + if (scheme === 'publickey') { + var config = $tr.find('.configuration'); + if ($(config).find('[name="public_key_generate"]').length === 0) { + setupTableRow($tr, config); + } + } + }); + + $('#externalStorage').on('click', '[name="public_key_generate"]', function(event) { + event.preventDefault(); + var tr = $(this).parent().parent(); + generateKeys(tr); + }); + + function setupTableRow(tr, config) { + $(config).append($(document.createElement('input')) + .addClass('button auth-param') + .attr('type', 'button') + .attr('value', t('files_external', 'Generate keys')) + .attr('name', 'public_key_generate') + ); + // If there's no private key, build one + if (0 === $(config).find('[data-parameter="private_key"]').val().length) { + generateKeys(tr); + } + } + + function generateKeys(tr) { + var config = $(tr).find('.configuration'); + + $.post(OC.filePath('files_external', 'ajax', 'public_key.php'), {}, function(result) { + if (result && result.status === 'success') { + $(config).find('[data-parameter="public_key"]').val(result.data.public_key); + $(config).find('[data-parameter="private_key"]').val(result.data.private_key); + OCA.External.Settings.mountConfig.saveStorageConfig(tr, function() { + // Nothing to do + }); + } else { + OC.dialogs.alert(result.data.message, t('files_external', 'Error generating key pair') ); + } + }); + } +}); diff --git a/apps/files_external/js/sftp_key.js b/apps/files_external/js/sftp_key.js deleted file mode 100644 index 55b11b1fac9..00000000000 --- a/apps/files_external/js/sftp_key.js +++ /dev/null @@ -1,53 +0,0 @@ -$(document).ready(function() { - - $('#externalStorage tbody tr.\\\\OC\\\\Files\\\\Storage\\\\SFTP_Key').each(function() { - var tr = $(this); - var config = $(tr).find('.configuration'); - if ($(config).find('.sftp_key').length === 0) { - setupTableRow(tr, config); - } - }); - - // We can't catch the DOM elements being added, but we can pick up when - // they receive focus - $('#externalStorage').on('focus', 'tbody tr.\\\\OC\\\\Files\\\\Storage\\\\SFTP_Key', function() { - var tr = $(this); - var config = $(tr).find('.configuration'); - - if ($(config).find('.sftp_key').length === 0) { - setupTableRow(tr, config); - } - }); - - $('#externalStorage').on('click', '.sftp_key', function(event) { - event.preventDefault(); - var tr = $(this).parent().parent(); - generateKeys(tr); - }); - - function setupTableRow(tr, config) { - $(config).append($(document.createElement('input')).addClass('button sftp_key') - .attr('type', 'button') - .attr('value', t('files_external', 'Generate keys'))); - // If there's no private key, build one - if (0 === $(config).find('[data-parameter="private_key"]').val().length) { - generateKeys(tr); - } - } - - function generateKeys(tr) { - var config = $(tr).find('.configuration'); - - $.post(OC.filePath('files_external', 'ajax', 'sftp_key.php'), {}, function(result) { - if (result && result.status === 'success') { - $(config).find('[data-parameter="public_key"]').val(result.data.public_key); - $(config).find('[data-parameter="private_key"]').val(result.data.private_key); - OCA.External.mountConfig.saveStorageConfig(tr, function() { - // Nothing to do - }); - } else { - OC.dialogs.alert(result.data.message, t('files_external', 'Error generating key pair') ); - } - }); - } -}); diff --git a/apps/files_external/lib/auth/publickey/rsa.php b/apps/files_external/lib/auth/publickey/rsa.php new file mode 100644 index 00000000000..b5eecb42712 --- /dev/null +++ b/apps/files_external/lib/auth/publickey/rsa.php @@ -0,0 +1,65 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program 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, version 3, + * along with this program. If not, see + * + */ + +namespace OCA\Files_External\Lib\Auth\PublicKey; + +use \OCP\IL10N; +use \OCA\Files_External\Lib\DefinitionParameter; +use \OCA\Files_External\Lib\Auth\AuthMechanism; +use \OCA\Files_External\Lib\StorageConfig; +use \OCP\IConfig; +use \phpseclib\Crypt\RSA as RSACrypt; + +/** + * RSA public key authentication + */ +class RSA extends AuthMechanism { + + /** @var IConfig */ + private $config; + + public function __construct(IL10N $l, IConfig $config) { + $this->config = $config; + + $this + ->setIdentifier('publickey::rsa') + ->setScheme(self::SCHEME_PUBLICKEY) + ->setText($l->t('RSA public key')) + ->addParameters([ + (new DefinitionParameter('user', $l->t('Username'))), + (new DefinitionParameter('public_key', $l->t('Public key'))), + (new DefinitionParameter('private_key', 'private_key')) + ->setType(DefinitionParameter::VALUE_HIDDEN), + ]) + ->setCustomJs('public_key') + ; + } + + public function manipulateStorageConfig(StorageConfig &$storage) { + $auth = new RSACrypt(); + $auth->setPassword($this->config->getSystemValue('secret', '')); + if (!$auth->loadKey($storage->getBackendOption('private_key'))) { + throw new \RuntimeException('unable to load private key'); + } + $storage->setBackendOption('public_key_auth', $auth); + } + +} diff --git a/apps/files_external/lib/backend/sftp.php b/apps/files_external/lib/backend/sftp.php index dd0f5d8e2e0..c0bcd27c54b 100644 --- a/apps/files_external/lib/backend/sftp.php +++ b/apps/files_external/lib/backend/sftp.php @@ -43,6 +43,7 @@ class SFTP extends Backend { ->setFlag(DefinitionParameter::FLAG_OPTIONAL), ]) ->addAuthScheme(AuthMechanism::SCHEME_PASSWORD) + ->addAuthScheme(AuthMechanism::SCHEME_PUBLICKEY) ->setLegacyAuthMechanism($legacyAuth) ; } diff --git a/apps/files_external/lib/backend/sftp_key.php b/apps/files_external/lib/backend/sftp_key.php new file mode 100644 index 00000000000..4a7f565eb19 --- /dev/null +++ b/apps/files_external/lib/backend/sftp_key.php @@ -0,0 +1,48 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program 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, version 3, + * along with this program. If not, see + * + */ + +namespace OCA\Files_External\Lib\Backend; + +use \OCP\IL10N; +use \OCA\Files_External\Lib\Backend\Backend; +use \OCA\Files_External\Lib\DefinitionParameter; +use \OCA\Files_External\Lib\Auth\AuthMechanism; +use \OCA\Files_External\Service\BackendService; +use \OCA\Files_External\Lib\Auth\PublicKey\RSA; + +class SFTP_Key extends Backend { + + public function __construct(IL10N $l, RSA $legacyAuth) { + $this + ->setIdentifier('\OC\Files\Storage\SFTP_Key') + ->setStorageClass('\OC\Files\Storage\SFTP') + ->setText($l->t('SFTP with secret key login [DEPRECATED]')) + ->addParameters([ + (new DefinitionParameter('host', $l->t('Host'))), + (new DefinitionParameter('root', $l->t('Remote subfolder'))) + ->setFlag(DefinitionParameter::FLAG_OPTIONAL), + ]) + ->addAuthScheme(AuthMechanism::SCHEME_PUBLICKEY) + ->setLegacyAuthMechanism($legacyAuth) + ; + } + +} diff --git a/apps/files_external/lib/sftp.php b/apps/files_external/lib/sftp.php index 7f921b5342f..921e7283c66 100644 --- a/apps/files_external/lib/sftp.php +++ b/apps/files_external/lib/sftp.php @@ -40,10 +40,11 @@ use phpseclib\Net\SFTP\Stream; class SFTP extends \OC\Files\Storage\Common { private $host; private $user; - private $password; private $root; private $port = 22; + private $auth; + /** * @var SFTP */ @@ -73,8 +74,15 @@ class SFTP extends \OC\Files\Storage\Common { } $this->user = $params['user']; - $this->password - = isset($params['password']) ? $params['password'] : ''; + + if (isset($params['public_key_auth'])) { + $this->auth = $params['public_key_auth']; + } elseif (isset($params['password'])) { + $this->auth = $params['password']; + } else { + throw new \UnexpectedValueException('no authentication parameters specified'); + } + $this->root = isset($params['root']) ? $this->cleanPath($params['root']) : '/'; @@ -112,7 +120,7 @@ class SFTP extends \OC\Files\Storage\Common { $this->writeHostKeys($hostKeys); } - if (!$this->client->login($this->user, $this->password)) { + if (!$this->client->login($this->user, $this->auth)) { throw new \Exception('Login failed'); } return $this->client; @@ -125,7 +133,6 @@ class SFTP extends \OC\Files\Storage\Common { if ( !isset($this->host) || !isset($this->user) - || !isset($this->password) ) { return false; } diff --git a/apps/files_external/lib/sftp_key.php b/apps/files_external/lib/sftp_key.php deleted file mode 100644 index a193b323678..00000000000 --- a/apps/files_external/lib/sftp_key.php +++ /dev/null @@ -1,215 +0,0 @@ - - * @author Morris Jobke - * @author Ross Nicoll - * - * @copyright Copyright (c) 2015, ownCloud, Inc. - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program 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, version 3, - * along with this program. If not, see - * - */ -namespace OC\Files\Storage; - -use phpseclib\Crypt\RSA; - -class SFTP_Key extends \OC\Files\Storage\SFTP { - private $publicKey; - private $privateKey; - - /** - * {@inheritdoc} - */ - public function __construct($params) { - parent::__construct($params); - $this->publicKey = $params['public_key']; - $this->privateKey = $params['private_key']; - } - - /** - * Returns the connection. - * - * @return \phpseclib\Net\SFTP connected client instance - * @throws \Exception when the connection failed - */ - public function getConnection() { - if (!is_null($this->client)) { - return $this->client; - } - - $hostKeys = $this->readHostKeys(); - $this->client = new \phpseclib\Net\SFTP($this->getHost()); - - // The SSH Host Key MUST be verified before login(). - $currentHostKey = $this->client->getServerPublicHostKey(); - if (array_key_exists($this->getHost(), $hostKeys)) { - if ($hostKeys[$this->getHost()] !== $currentHostKey) { - throw new \Exception('Host public key does not match known key'); - } - } else { - $hostKeys[$this->getHost()] = $currentHostKey; - $this->writeHostKeys($hostKeys); - } - - $key = $this->getPrivateKey(); - if (is_null($key)) { - throw new \Exception('Secret key could not be loaded'); - } - if (!$this->client->login($this->getUser(), $key)) { - throw new \Exception('Login failed'); - } - return $this->client; - } - - /** - * Returns the private key to be used for authentication to the remote server. - * - * @return RSA instance or null in case of a failure to load the key. - */ - private function getPrivateKey() { - $key = new RSA(); - $key->setPassword(\OC::$server->getConfig()->getSystemValue('secret', '')); - if (!$key->loadKey($this->privateKey)) { - // Should this exception rather than return null? - return null; - } - return $key; - } - - /** - * Throws an exception if the provided host name/address is invalid (cannot be resolved - * and is not an IPv4 address). - * - * @return true; never returns in case of a problem, this return value is used just to - * make unit tests happy. - */ - public function assertHostAddressValid($hostname) { - // TODO: Should handle IPv6 addresses too - if (!preg_match('/^\d+\.\d+\.\d+\.\d+$/', $hostname) && gethostbyname($hostname) === $hostname) { - // Hostname is not an IPv4 address and cannot be resolved via DNS - throw new \InvalidArgumentException('Cannot resolve hostname.'); - } - return true; - } - - /** - * Throws an exception if the provided port number is invalid (cannot be resolved - * and is not an IPv4 address). - * - * @return true; never returns in case of a problem, this return value is used just to - * make unit tests happy. - */ - public function assertPortNumberValid($port) { - if (!preg_match('/^\d+$/', $port)) { - throw new \InvalidArgumentException('Port number must be a number.'); - } - if ($port < 0 || $port > 65535) { - throw new \InvalidArgumentException('Port number must be between 0 and 65535 inclusive.'); - } - return true; - } - - /** - * Replaces anything that's not an alphanumeric character or "." in a hostname - * with "_", to make it safe for use as part of a file name. - */ - protected function sanitizeHostName($name) { - return preg_replace('/[^\d\w\._]/', '_', $name); - } - - /** - * Replaces anything that's not an alphanumeric character or "_" in a username - * with "_", to make it safe for use as part of a file name. - */ - protected function sanitizeUserName($name) { - return preg_replace('/[^\d\w_]/', '_', $name); - } - - public function test() { - - // FIXME: Use as expression in empty once PHP 5.4 support is dropped - $host = $this->getHost(); - if (empty($host)) { - \OC::$server->getLogger()->warning('Hostname has not been specified'); - return false; - } - // FIXME: Use as expression in empty once PHP 5.4 support is dropped - $user = $this->getUser(); - if (empty($user)) { - \OC::$server->getLogger()->warning('Username has not been specified'); - return false; - } - if (!isset($this->privateKey)) { - \OC::$server->getLogger()->warning('Private key was missing from the request'); - return false; - } - - // Sanity check the host - $hostParts = explode(':', $this->getHost()); - try { - if (count($hostParts) == 1) { - $hostname = $hostParts[0]; - $this->assertHostAddressValid($hostname); - } else if (count($hostParts) == 2) { - $hostname = $hostParts[0]; - $this->assertHostAddressValid($hostname); - $this->assertPortNumberValid($hostParts[1]); - } else { - throw new \Exception('Host connection string is invalid.'); - } - } catch(\Exception $e) { - \OC::$server->getLogger()->warning($e->getMessage()); - return false; - } - - // Validate the key - $key = $this->getPrivateKey(); - if (is_null($key)) { - \OC::$server->getLogger()->warning('Secret key could not be loaded'); - return false; - } - - try { - if ($this->getConnection()->nlist() === false) { - return false; - } - } catch(\Exception $e) { - // We should be throwing a more specific error, so we're not just catching - // Exception here - \OC::$server->getLogger()->warning($e->getMessage()); - return false; - } - - // Save the key somewhere it can easily be extracted later - if (\OC::$server->getUserSession()->getUser()) { - $view = new \OC\Files\View('/'.\OC::$server->getUserSession()->getUser()->getUId().'/files_external/sftp_keys'); - if (!$view->is_dir('')) { - if (!$view->mkdir('')) { - \OC::$server->getLogger()->warning('Could not create secret key directory.'); - return false; - } - } - $key_filename = $this->sanitizeUserName($this->getUser()).'@'.$this->sanitizeHostName($hostname).'.pub'; - $key_file = $view->fopen($key_filename, "w"); - if ($key_file) { - fwrite($key_file, $this->publicKey); - fclose($key_file); - } else { - \OC::$server->getLogger()->warning('Could not write secret key file.'); - } - } - - return true; - } -} -- GitLab From 080fafe63a980f6a485027fd4216864adf764e1e Mon Sep 17 00:00:00 2001 From: Robin McCorkell Date: Wed, 19 Aug 2015 21:13:16 +0100 Subject: [PATCH 071/783] AjaxController uses RSA auth mechanism --- apps/files_external/appinfo/application.php | 13 ------------- apps/files_external/controller/ajaxcontroller.php | 14 +++++++------- apps/files_external/lib/auth/publickey/rsa.php | 15 +++++++++++++++ 3 files changed, 22 insertions(+), 20 deletions(-) diff --git a/apps/files_external/appinfo/application.php b/apps/files_external/appinfo/application.php index ed236af0ec5..c00ae3ee019 100644 --- a/apps/files_external/appinfo/application.php +++ b/apps/files_external/appinfo/application.php @@ -24,7 +24,6 @@ namespace OCA\Files_External\AppInfo; -use \OCA\Files_External\Controller\AjaxController; use \OCP\AppFramework\App; use \OCP\IContainer; use \OCA\Files_External\Service\BackendService; @@ -36,18 +35,6 @@ class Application extends App { public function __construct(array $urlParams=array()) { parent::__construct('files_external', $urlParams); - $container = $this->getContainer(); - - /** - * Controllers - */ - $container->registerService('AjaxController', function (IContainer $c) { - return new AjaxController( - $c->query('AppName'), - $c->query('Request') - ); - }); - $this->loadBackends(); $this->loadAuthMechanisms(); } diff --git a/apps/files_external/controller/ajaxcontroller.php b/apps/files_external/controller/ajaxcontroller.php index cb2de432286..c285cd34e70 100644 --- a/apps/files_external/controller/ajaxcontroller.php +++ b/apps/files_external/controller/ajaxcontroller.php @@ -25,19 +25,19 @@ namespace OCA\Files_External\Controller; use OCP\AppFramework\Controller; use OCP\IRequest; use OCP\AppFramework\Http\JSONResponse; -use phpseclib\Crypt\RSA; +use OCA\Files_External\Lib\Auth\PublicKey\RSA; class AjaxController extends Controller { - public function __construct($appName, IRequest $request) { + /** @var RSA */ + private $rsaMechanism; + + public function __construct($appName, IRequest $request, RSA $rsaMechanism) { parent::__construct($appName, $request); + $this->rsaMechanism = $rsaMechanism; } private function generateSshKeys() { - $rsa = new RSA(); - $rsa->setPublicKeyFormat(RSA::PUBLIC_FORMAT_OPENSSH); - $rsa->setPassword(\OC::$server->getConfig()->getSystemValue('secret', '')); - - $key = $rsa->createKey(); + $key = $this->rsaMechanism->createKey(); // Replace the placeholder label with a more meaningful one $key['publicKey'] = str_replace('phpseclib-generated-key', gethostname(), $key['publickey']); diff --git a/apps/files_external/lib/auth/publickey/rsa.php b/apps/files_external/lib/auth/publickey/rsa.php index b5eecb42712..f40136dda01 100644 --- a/apps/files_external/lib/auth/publickey/rsa.php +++ b/apps/files_external/lib/auth/publickey/rsa.php @@ -33,6 +33,8 @@ use \phpseclib\Crypt\RSA as RSACrypt; */ class RSA extends AuthMechanism { + const CREATE_KEY_BITS = 1024; + /** @var IConfig */ private $config; @@ -62,4 +64,17 @@ class RSA extends AuthMechanism { $storage->setBackendOption('public_key_auth', $auth); } + /** + * Generate a keypair + * + * @return array ['privatekey' => $privateKey, 'publickey' => $publicKey] + */ + public function createKey() { + $rsa = new RSACrypt(); + $rsa->setPublicKeyFormat(RSACrypt::PUBLIC_FORMAT_OPENSSH); + $rsa->setPassword($this->config->getSystemValue('secret', '')); + + return $rsa->createKey(self::CREATE_KEY_BITS); + } + } -- GitLab From 37b00b7443bec09aac84b359a1c2f77caf143b30 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Fri, 28 Aug 2015 15:46:55 +0200 Subject: [PATCH 072/783] Add since tag --- lib/public/l10n/ifactory.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/public/l10n/ifactory.php b/lib/public/l10n/ifactory.php index e2dc1c313cc..b784505a68b 100644 --- a/lib/public/l10n/ifactory.php +++ b/lib/public/l10n/ifactory.php @@ -20,6 +20,9 @@ */ namespace OCP\L10N; +/** + * @since 8.2.0 + */ interface IFactory { /** * Get a language instance @@ -27,6 +30,7 @@ interface IFactory { * @param string $app * @param string|null $lang * @return \OCP\IL10N + * @since 8.2.0 */ public function get($app, $lang = null); } -- GitLab From d14252d9c75f39e8a35faff91127a430e9a3bf37 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Fri, 28 Aug 2015 16:13:19 +0200 Subject: [PATCH 073/783] make sure we actually have an object store --- apps/files_external/lib/config/configadapter.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/files_external/lib/config/configadapter.php b/apps/files_external/lib/config/configadapter.php index a15d9e06a5f..a255a7b3d25 100644 --- a/apps/files_external/lib/config/configadapter.php +++ b/apps/files_external/lib/config/configadapter.php @@ -74,6 +74,9 @@ class ConfigAdapter implements IMountProvider { $objectStore = $storage->getBackendOption('objectstore'); if ($objectStore) { $objectClass = $objectStore['class']; + if (!is_subclass_of($objectClass, '\OCP\Files\ObjectStore\IObjectStore')) { + throw new \InvalidArgumentException('Invalid object store'); + } $storage->setBackendOption('objectstore', new $objectClass($objectStore)); } -- GitLab From 59273a8863ecc0aa570f56e024cb1a22d424111a Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Thu, 27 Aug 2015 13:22:58 +0200 Subject: [PATCH 074/783] Combine upload action into the "New" menu Refactored the new menu to be encapsulated in the NewFileMenu JS class --- apps/files/css/files.css | 135 ++++++-------- apps/files/css/upload.css | 14 -- apps/files/index.php | 1 + apps/files/js/file-upload.js | 149 --------------- apps/files/js/fileactionsmenu.js | 4 +- apps/files/js/filelist.js | 145 +++++++++++++++ apps/files/js/newfilemenu.js | 237 ++++++++++++++++++++++++ apps/files/templates/list.php | 52 +++--- apps/files_sharing/templates/public.php | 1 + core/css/apps.css | 73 ++++++++ core/css/styles.css | 10 + 11 files changed, 551 insertions(+), 270 deletions(-) create mode 100644 apps/files/js/newfilemenu.js diff --git a/apps/files/css/files.css b/apps/files/css/files.css index a9c85127c66..97b2a0c451e 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -18,11 +18,6 @@ z-index: -30; } -#new { - z-index: 1010; - float: left; - padding: 0 !important; /* override default control bar button padding */ -} #trash { margin-right: 8px; float: right; @@ -30,49 +25,8 @@ padding: 10px; font-weight: normal; } -#new > a { - padding: 14px 10px; - position: relative; - top: 7px; -} -#new.active { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - border-bottom: none; - background: #f8f8f8; -} -#new > ul { - display: none; - position: fixed; - min-width: 112px; - z-index: -10; - padding: 8px; - padding-bottom: 0; - margin-top: 13.5px; - margin-left: -1px; - text-align: left; - background: #f8f8f8; - border: 1px solid #ddd; - border: 1px solid rgba(240, 240, 240, 0.9); - border-radius: 5px; - border-top-left-radius: 0; - box-shadow: 0 2px 7px rgba(170,170,170,.4); -} -#new > ul > li { - height: 36px; - margin: 5px; - padding-left: 42px; - padding-bottom: 2px; - background-position: left center; - cursor: pointer; -} -#new > ul > li > p { - cursor: pointer; - padding-top: 7px; - padding-bottom: 7px; -} -#new .error, #fileList .error { +.newFileMenu .error, #fileList .error { color: #e9322d; border-color: #e9322d; -webkit-box-shadow: 0 0 6px #f8b9b7; @@ -143,6 +97,30 @@ margin-bottom: 44px; } +#app-navigation .nav-files a.nav-icon-files { + width: auto; +} +/* button needs overrides due to navigation styles */ +#app-navigation .nav-files a.new { + width: 40px; + height: 32px; + padding: 0 10px; + margin: 0; + cursor: pointer; +} + +#app-navigation .nav-files a { + display: inline-block; +} + +#app-navigation .nav-files a.new.hidden { + display: none; +} + +#app-navigation .nav-files a.new.disabled { + opacity: 0.3; +} + #filestable tbody tr { background-color: #fff; height: 40px; @@ -599,7 +577,8 @@ a.action > img { #fileList a.action.action-menu { padding: 17px 14px; } -#fileList .fileActionsMenu { + +#fileList .popovermenu { margin-right: 21px; } @@ -654,13 +633,13 @@ a.action > img { } /* properly display actions in the popover menu */ -#fileList .fileActionsMenu .action { +#fileList .popovermenu .action { -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)" !important; filter: alpha(opacity=50) !important; opacity: .5 !important; } -#fileList .fileActionsMenu .action:hover, -#fileList .fileActionsMenu .action:focus { +#fileList .popovermenu .action:hover, +#fileList .popovermenu .action:focus { -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)" !important; filter: alpha(opacity=100) !important; opacity: 1 !important; @@ -744,43 +723,49 @@ table.dragshadow td.size { opacity: 0; } -.fileActionsMenu { - padding: 4px 12px; -} -.fileActionsMenu li { - padding: 5px 0; -} -#fileList .fileActionsMenu a.action img { +#fileList .popovermenu a.action img { padding: initial; } -#fileList .fileActionsMenu a.action { + +#fileList .popovermenu a.action { padding: 10px; margin: -10px; } -.fileActionsMenu.hidden { - display: none; +.newFileMenu { + width: 140px; + margin-left: -56px; + margin-top: 25px; } -#fileList .fileActionsMenu .action { - display: block; - line-height: 30px; - padding-left: 5px; - color: #000; - padding: 0; +.newFileMenu .menuitem { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} + +.newFileMenu.bubble:after { + left: 75px; + right: auto; +} +.newFileMenu.bubble:before { + left: 75px; + right: auto; } -.fileActionsMenu .action img, -.fileActionsMenu .action .no-icon { +.newFileMenu .filenameform { display: inline-block; - width: 16px; - margin-right: 5px; } -.fileActionsMenu .action { - opacity: 0.5; +.newFileMenu .filenameform input { + width: 100px; } -.fileActionsMenu li:hover .action { - opacity: 1; +#fileList .popovermenu .action { + display: block; + line-height: 30px; + padding-left: 5px; + color: #000; + padding: 0; } + diff --git a/apps/files/css/upload.css b/apps/files/css/upload.css index bd60f831388..07b788b937f 100644 --- a/apps/files/css/upload.css +++ b/apps/files/css/upload.css @@ -24,20 +24,6 @@ } .file_upload_target { display:none; } .file_upload_form { display:inline; float:left; margin:0; padding:0; cursor:pointer; overflow:visible; } -#file_upload_start { - position: relative; - left: 0; - top: 0; - width: 44px; - height: 44px; - margin: -5px -3px; - padding: 0; - font-size: 16px; - -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0; - z-index: 20; - cursor: pointer; - overflow: hidden; -} #uploadprogresswrapper, #uploadprogresswrapper * { -moz-box-sizing: border-box; diff --git a/apps/files/index.php b/apps/files/index.php index a73caa50fbe..cc007ebdb07 100644 --- a/apps/files/index.php +++ b/apps/files/index.php @@ -38,6 +38,7 @@ OCP\Util::addStyle('files', 'upload'); OCP\Util::addStyle('files', 'mobile'); OCP\Util::addscript('files', 'app'); OCP\Util::addscript('files', 'file-upload'); +OCP\Util::addscript('files', 'newfilemenu'); OCP\Util::addscript('files', 'jquery.iframe-transport'); OCP\Util::addscript('files', 'jquery.fileupload'); OCP\Util::addscript('files', 'jquery-visibility'); diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js index 6b6acdb5e01..17f0f777169 100644 --- a/apps/files/js/file-upload.js +++ b/apps/files/js/file-upload.js @@ -551,155 +551,6 @@ OC.Upload = { $('#file_upload_start').attr('multiple', 'multiple'); } - $(document).click(function(ev) { - // do not close when clicking in the dropdown - if ($(ev.target).closest('#new').length){ - return; - } - $('#new>ul').hide(); - $('#new').removeClass('active'); - if ($('#new .error').length > 0) { - $('#new .error').tipsy('hide'); - } - $('#new li').each(function(i,element) { - if ($(element).children('p').length === 0) { - $(element).children('form').remove(); - $(element).append('

' + $(element).data('text') + '

'); - } - }); - }); - $('#new').click(function(event) { - event.stopPropagation(); - }); - $('#new>a').click(function() { - $('#new>ul').toggle(); - $('#new').toggleClass('active'); - }); - $('#new li').click(function() { - if ($(this).children('p').length === 0) { - return; - } - - $('#new .error').tipsy('hide'); - - $('#new li').each(function(i, element) { - if ($(element).children('p').length === 0) { - $(element).children('form').remove(); - $(element).append('

' + $(element).data('text') + '

'); - } - }); - - var type = $(this).data('type'); - var text = $(this).children('p').text(); - $(this).data('text', text); - $(this).children('p').remove(); - - // add input field - var form = $('
'); - var input = $(''); - var newName = $(this).attr('data-newname') || ''; - var fileType = 'input-' + $(this).attr('data-type'); - if (newName) { - input.val(newName); - input.attr('id', fileType); - } - var label = $(''); - label.attr('for', fileType); - - form.append(label).append(input); - $(this).append(form); - var lastPos; - var checkInput = function () { - var filename = input.val(); - if (!Files.isFileNameValid(filename)) { - // Files.isFileNameValid(filename) throws an exception itself - } else if (FileList.inList(filename)) { - throw t('files', '{new_name} already exists', {new_name: filename}); - } else { - return true; - } - }; - - // verify filename on typing - input.keyup(function(event) { - try { - checkInput(); - input.tipsy('hide'); - input.removeClass('error'); - } catch (error) { - input.attr('title', error); - input.tipsy({gravity: 'w', trigger: 'manual'}); - input.tipsy('show'); - input.addClass('error'); - } - }); - - input.focus(); - // pre select name up to the extension - lastPos = newName.lastIndexOf('.'); - if (lastPos === -1) { - lastPos = newName.length; - } - input.selectRange(0, lastPos); - form.submit(function(event) { - event.stopPropagation(); - event.preventDefault(); - try { - checkInput(); - var newname = input.val(); - if (FileList.lastAction) { - FileList.lastAction(); - } - var name = FileList.getUniqueName(newname); - switch(type) { - case 'file': - $.post( - OC.filePath('files', 'ajax', 'newfile.php'), - { - dir: FileList.getCurrentDirectory(), - filename: name - }, - function(result) { - if (result.status === 'success') { - FileList.add(result.data, {animate: true, scrollTo: true}); - } else { - OC.dialogs.alert(result.data.message, t('core', 'Could not create file')); - } - } - ); - break; - case 'folder': - $.post( - OC.filePath('files','ajax','newfolder.php'), - { - dir: FileList.getCurrentDirectory(), - foldername: name - }, - function(result) { - if (result.status === 'success') { - FileList.add(result.data, {animate: true, scrollTo: true}); - } else { - OC.dialogs.alert(result.data.message, t('core', 'Could not create folder')); - } - } - ); - break; - } - var li = form.parent(); - form.remove(); - /* workaround for IE 9&10 click event trap, 2 lines: */ - $('input').first().focus(); - $('#content').focus(); - li.append('

' + li.data('text') + '

'); - $('#new>a').click(); - } catch (error) { - input.attr('title', error); - input.tipsy({gravity: 'w', trigger: 'manual'}); - input.tipsy('show'); - input.addClass('error'); - } - }); - }); window.file_upload_param = file_upload_param; return file_upload_param; } diff --git a/apps/files/js/fileactionsmenu.js b/apps/files/js/fileactionsmenu.js index 623ebde5442..5ab0e42f93e 100644 --- a/apps/files/js/fileactionsmenu.js +++ b/apps/files/js/fileactionsmenu.js @@ -14,7 +14,7 @@ ''; @@ -26,7 +26,7 @@ */ var FileActionsMenu = OC.Backbone.View.extend({ tagName: 'div', - className: 'fileActionsMenu bubble hidden open menu', + className: 'fileActionsMenu popovermenu bubble hidden open menu', /** * Current context diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index ac96d587015..5f55d421430 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -9,6 +9,9 @@ */ (function() { + + var TEMPLATE_ADDBUTTON = ''; + /** * @class OCA.Files.FileList * @classdesc @@ -220,6 +223,8 @@ this.$el.find('#controls').prepend(this.breadcrumb.$el); + this._renderNewButton(); + this.$el.find('thead th .columntitle').click(_.bind(this._onClickHeader, this)); this._onResize = _.debounce(_.bind(this._onResize, this), 100); @@ -262,6 +267,9 @@ * Destroy / uninitialize this instance. */ destroy: function() { + if (this._newFileMenu) { + this._newFileMenu.remove(); + } // TODO: also unregister other event handlers this.fileActions.off('registerAction', this._onFileActionsUpdated); this.fileActions.off('setDefault', this._onFileActionsUpdated); @@ -1679,6 +1687,102 @@ form.trigger('submit'); }); }, + + /** + * Create an empty file inside the current directory. + * + * @param {string} name name of the file + * + * @return {Promise} promise that will be resolved after the + * file was created + */ + createFile: function(name) { + var self = this; + var deferred = $.Deferred(); + var promise = deferred.promise(); + + OCA.Files.Files.isFileNameValid(name); + name = this.getUniqueName(name); + + if (this.lastAction) { + this.lastAction(); + } + + $.post( + OC.filePath('files', 'ajax', 'newfile.php'), + { + dir: this.getCurrentDirectory(), + filename: name + }, + function(result) { + if (result.status === 'success') { + self.add(result.data, {animate: true, scrollTo: true}); + deferred.resolve(result.status, result.data); + } else { + if (result.data && result.data.message) { + OC.Notification.showTemporary(result.data.message); + } else { + OC.Notification.showTemporary(t('core', 'Could not create file')); + } + deferred.reject(result.status, result.data); + } + } + ); + + return promise; + }, + + /** + * Create a directory inside the current directory. + * + * @param {string} name name of the directory + * + * @return {Promise} promise that will be resolved after the + * directory was created + */ + createDirectory: function(name) { + var self = this; + var deferred = $.Deferred(); + var promise = deferred.promise(); + + OCA.Files.Files.isFileNameValid(name); + name = this.getUniqueName(name); + + if (this.lastAction) { + this.lastAction(); + } + + $.post( + OC.filePath('files','ajax','newfolder.php'), + { + dir: this.getCurrentDirectory(), + foldername: name + }, + function(result) { + if (result.status === 'success') { + self.add(result.data, {animate: true, scrollTo: true}); + deferred.resolve(result.status, result.data); + } else { + if (result.data && result.data.message) { + OC.Notification.showTemporary(result.data.message); + } else { + OC.Notification.showTemporary(t('core', 'Could not create folder')); + } + deferred.reject(result.status); + } + } + ); + + return promise; + }, + + /** + * Returns whether the given file name exists in the list + * + * @param {string} file file name + * + * @return {bool} true if the file exists in the list, false otherwise + */ inList:function(file) { return this.findFileEl(file).length; }, @@ -2340,6 +2444,47 @@ }); }, + _renderNewButton: function() { + // if an upload button (legacy) already exists, skip + if ($('#controls .button.upload').length) { + return; + } + if (!this._addButtonTemplate) { + this._addButtonTemplate = Handlebars.compile(TEMPLATE_ADDBUTTON); + } + var $newButton = $(this._addButtonTemplate({ + addText: t('files', 'New'), + iconUrl: OC.imagePath('core', 'actions/add') + })); + + $('#controls .actions').prepend($newButton); + $newButton.tooltip({'placement': 'bottom'}); + + $newButton.click(_.bind(this._onClickNewButton, this)); + this._newButton = $newButton; + }, + + _onClickNewButton: function(event) { + var $target = $(event.target); + if (!$target.hasClass('.button')) { + $target = $target.closest('.button'); + } + this._newButton.tooltip('hide'); + event.preventDefault(); + if ($target.hasClass('disabled')) { + return false; + } + if (!this._newFileMenu) { + this._newFileMenu = new OCA.Files.NewFileMenu({ + fileList: this + }); + $('body').append(this._newFileMenu.$el); + } + this._newFileMenu.showAt($target); + + return false; + }, + /** * Register a tab view to be added to all views */ diff --git a/apps/files/js/newfilemenu.js b/apps/files/js/newfilemenu.js new file mode 100644 index 00000000000..c851096bd8f --- /dev/null +++ b/apps/files/js/newfilemenu.js @@ -0,0 +1,237 @@ +/* + * Copyright (c) 2014 + * + * This file is licensed under the Affero General Public License version 3 + * or later. + * + * See the COPYING-README file. + * + */ + +/* global Files */ + +(function() { + + var TEMPLATE_MENU = + '
    ' + + '
  • ' + + '' + + '
  • ' + + '{{#each items}}' + + '
  • ' + + '{{displayName}}' + + '
  • ' + + '{{/each}}' + + '
'; + + var TEMPLATE_FILENAME_FORM = + '
' + + '' + + '' + + '
'; + + /** + * Construct a new NewFileMenu instance + * @constructs NewFileMenu + * + * @memberof OCA.Files + */ + var NewFileMenu = OC.Backbone.View.extend({ + tagName: 'div', + className: 'newFileMenu popovermenu bubble hidden open menu', + + events: { + 'click .menuitem': '_onClickAction' + }, + + initialize: function(options) { + var self = this; + var $uploadEl = $('#file_upload_start'); + if ($uploadEl.length) { + $uploadEl.on('fileuploadstart', function() { + self.trigger('actionPerformed', 'upload'); + }); + } else { + console.warn('Missing upload element "file_upload_start"'); + } + + this._fileList = options && options.fileList; + }, + + template: function(data) { + if (!OCA.Files.NewFileMenu._TEMPLATE) { + OCA.Files.NewFileMenu._TEMPLATE = Handlebars.compile(TEMPLATE_MENU); + } + return OCA.Files.NewFileMenu._TEMPLATE(data); + }, + + /** + * Event handler whenever an action has been clicked within the menu + * + * @param {Object} event event object + */ + _onClickAction: function(event) { + var $target = $(event.target); + if (!$target.hasClass('menuitem')) { + $target = $target.closest('.menuitem'); + } + var action = $target.attr('data-action'); + // note: clicking the upload label will automatically + // set the focus on the "file_upload_start" hidden field + // which itself triggers the upload dialog. + // Currently the upload logic is still in file-upload.js and filelist.js + if (action === 'upload') { + OC.hideMenus(); + } else { + event.preventDefault(); + this._promptFileName($target); + } + }, + + _promptFileName: function($target) { + var self = this; + if (!OCA.Files.NewFileMenu._TEMPLATE_FORM) { + OCA.Files.NewFileMenu._TEMPLATE_FORM = Handlebars.compile(TEMPLATE_FILENAME_FORM); + } + + if ($target.find('form').length) { + $target.find('input').focus(); + return; + } + + // discard other forms + this.$el.find('form').remove(); + this.$el.find('.displayname').removeClass('hidden'); + + $target.find('.displayname').addClass('hidden'); + + var newName = $target.attr('data-templatename'); + var fileType = $target.attr('data-filetype'); + var $form = $(OCA.Files.NewFileMenu._TEMPLATE_FORM({ + fileName: newName, + cid: this.cid, + fileType: fileType + })); + + //this.trigger('actionPerformed', action); + $target.append($form); + + // here comes the OLD code + var $input = $form.find('input'); + + var lastPos; + var checkInput = function () { + var filename = $input.val(); + try { + if (!Files.isFileNameValid(filename)) { + // Files.isFileNameValid(filename) throws an exception itself + } else if (self._fileList.inList(filename)) { + throw t('files', '{newname} already exists', {newname: filename}); + } else { + return true; + } + } catch (error) { + $input.attr('title', error); + $input.tooltip({placement: 'right', trigger: 'manual'}); + $input.tooltip('show'); + $input.addClass('error'); + } + return false; + }; + + // verify filename on typing + $input.keyup(function() { + if (checkInput()) { + $input.tooltip('hide'); + $input.removeClass('error'); + } + }); + + $input.focus(); + // pre select name up to the extension + lastPos = newName.lastIndexOf('.'); + if (lastPos === -1) { + lastPos = newName.length; + } + $input.selectRange(0, lastPos); + + $form.submit(function(event) { + event.stopPropagation(); + event.preventDefault(); + + if (checkInput()) { + var newname = $input.val(); + self._createFile(fileType, newname); + $form.remove(); + $('#content').focus(); + $target.find('.displayname').removeClass('hidden'); + OC.hideMenus(); + } + }); + }, + + /** + * Creates a file with the given type and name. + * This calls the matching methods on the attached file list. + * + * @param {string} fileType file type + * @param {string} name file name + */ + _createFile: function(fileType, name) { + switch(fileType) { + case 'file': + this._fileList.createFile(name); + break; + case 'folder': + this._fileList.createDirectory(name); + break; + default: + console.warn('Unknown file type "' + fileType + '"'); + } + }, + + /** + * Renders the menu with the currently set items + */ + render: function() { + this.$el.html(this.template({ + uploadMaxHumanFileSize: 'TODO', + uploadLabel: t('files', 'Upload'), + items: [{ + id: 'file', + displayName: t('files', 'Text file'), + templateName: t('files', 'New text file.txt'), + iconClass: 'icon-text', + fileType: 'file' + }, { + id: 'folder', + displayName: t('files', 'Folder'), + templateName: t('files', 'New folder'), + iconClass: 'icon-folder', + fileType: 'folder' + }] + })); + }, + + /** + * Displays the menu under the given element + * + * @param {Object} $target target element + */ + showAt: function($target) { + this.render(); + var targetOffset = $target.offset(); + this.$el.css({ + left: targetOffset.left, + top: targetOffset.top + $target.height() + }); + this.$el.removeClass('hidden'); + + OC.showMenu(null, this.$el); + } + }); + + OCA.Files.NewFileMenu = NewFileMenu; + +})(); + diff --git a/apps/files/templates/list.php b/apps/files/templates/list.php index 32651b261da..15af1970dc3 100644 --- a/apps/files/templates/list.php +++ b/apps/files/templates/list.php @@ -1,40 +1,16 @@