diff options
88 files changed, 1073 insertions, 117 deletions
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index 183b5e909a6..8236ef3b4ac 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -822,7 +822,9 @@ "class": "modified", "title": formatted, "style": 'color:rgb('+modifiedColor+','+modifiedColor+','+modifiedColor+')' - }).text(text)); + }).text(text) + .tooltip({placement: 'top'}) + ); tr.find('.filesize').text(simpleSize); tr.append(td); return tr; diff --git a/apps/files/l10n/sr.js b/apps/files/l10n/sr.js index 7a173fe694b..060ac4d506e 100644 --- a/apps/files/l10n/sr.js +++ b/apps/files/l10n/sr.js @@ -47,6 +47,8 @@ OC.L10N.register( "Select" : "Изабери", "Pending" : "На чекању", "Unable to determine date" : "Не могу да одредим датум", + "This operation is forbidden" : "Ова радња је забрањена", + "This directory is unavailable, please check the logs or contact the administrator" : "Овај директоријум није доступан, проверите записе или контактирајте администратора", "Error moving file." : "Грешка при премештању фајла.", "Error moving file" : "Грешка при премештању фајла", "Error" : "Грешка", diff --git a/apps/files/l10n/sr.json b/apps/files/l10n/sr.json index f535f4fb013..69fefcaf2b2 100644 --- a/apps/files/l10n/sr.json +++ b/apps/files/l10n/sr.json @@ -45,6 +45,8 @@ "Select" : "Изабери", "Pending" : "На чекању", "Unable to determine date" : "Не могу да одредим датум", + "This operation is forbidden" : "Ова радња је забрањена", + "This directory is unavailable, please check the logs or contact the administrator" : "Овај директоријум није доступан, проверите записе или контактирајте администратора", "Error moving file." : "Грешка при премештању фајла.", "Error moving file" : "Грешка при премештању фајла", "Error" : "Грешка", diff --git a/apps/files_external/lib/smb.php b/apps/files_external/lib/smb.php index 4a2eebf20b1..f58cd9849f2 100644 --- a/apps/files_external/lib/smb.php +++ b/apps/files_external/lib/smb.php @@ -78,7 +78,10 @@ class SMB extends Common { * @return string */ public function getId() { - return 'smb::' . $this->server->getUser() . '@' . $this->server->getHost() . '/' . $this->share->getName() . '/' . $this->root; + // FIXME: double slash to keep compatible with the old storage ids, + // failure to do so will lead to creation of a new storage id and + // loss of shares from the storage + return 'smb::' . $this->server->getUser() . '@' . $this->server->getHost() . '//' . $this->share->getName() . '/' . $this->root; } /** diff --git a/apps/files_external/tests/backends/smb.php b/apps/files_external/tests/backends/smb.php index 9e60a9e06e0..0da86cb824f 100644 --- a/apps/files_external/tests/backends/smb.php +++ b/apps/files_external/tests/backends/smb.php @@ -61,4 +61,16 @@ class SMB extends Storage { $this->assertTrue($result); $this->assertTrue($this->instance->is_dir('foo bar')); } + + public function testStorageId() { + $this->instance = new \OC\Files\Storage\SMB([ + 'host' => 'testhost', + 'user' => 'testuser', + 'password' => 'somepass', + 'share' => 'someshare', + 'root' => 'someroot', + ]); + $this->assertEquals('smb::testuser@testhost//someshare//someroot/', $this->instance->getId()); + $this->instance = null; + } } diff --git a/apps/user_ldap/l10n/sr.js b/apps/user_ldap/l10n/sr.js index dd570c70e5c..89ec30d6afc 100644 --- a/apps/user_ldap/l10n/sr.js +++ b/apps/user_ldap/l10n/sr.js @@ -78,6 +78,7 @@ OC.L10N.register( "Verify settings" : "Провери поставке", "1. Server" : "1. сервер", "%s. Server:" : "%s. Сервер:", + "Add a new and blank configuration" : "Додај нову празну поставу", "Copy current configuration into new directory binding" : "Копирај тренутну поставу у везивање новог директоријума", "Delete the current configuration" : "Обриши тренутне поставке", "Host" : "Домаћин", diff --git a/apps/user_ldap/l10n/sr.json b/apps/user_ldap/l10n/sr.json index 91d9520d3b6..20de66c500e 100644 --- a/apps/user_ldap/l10n/sr.json +++ b/apps/user_ldap/l10n/sr.json @@ -76,6 +76,7 @@ "Verify settings" : "Провери поставке", "1. Server" : "1. сервер", "%s. Server:" : "%s. Сервер:", + "Add a new and blank configuration" : "Додај нову празну поставу", "Copy current configuration into new directory binding" : "Копирај тренутну поставу у везивање новог директоријума", "Delete the current configuration" : "Обриши тренутне поставке", "Host" : "Домаћин", diff --git a/core/js/js.js b/core/js/js.js index 5f7df5fb551..8380d56e31e 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -1245,7 +1245,6 @@ function initCore() { $('.selectedActions a').tipsy({gravity:'s', live:true}); $('a.action.delete').tipsy({gravity:'e', live:true}); $('a.action').tipsy({gravity:'s', live:true}); - $('td .modified').tipsy({gravity:'s', live:true}); $('td.lastLogin').tipsy({gravity:'s', html:true}); $('input').tipsy({gravity:'w'}); $('.extra-data').tipsy({gravity:'w', live:true}); diff --git a/core/js/setupchecks.js b/core/js/setupchecks.js index 02d7ef94b7e..35f24b188fa 100644 --- a/core/js/setupchecks.js +++ b/core/js/setupchecks.js @@ -69,6 +69,9 @@ t('core', '/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a href="{docLink}">documentation</a>.', {docLink: data.securityDocs}) ); } + if(data.isUsedTlsLibOutdated) { + messages.push(data.isUsedTlsLibOutdated); + } } else { messages.push(t('core', 'Error occurred while checking server setup')); } diff --git a/core/l10n/sr.js b/core/l10n/sr.js index 4a645b1f1dd..50603a4caa2 100644 --- a/core/l10n/sr.js +++ b/core/l10n/sr.js @@ -12,6 +12,7 @@ OC.L10N.register( "Repair warning: " : "Упозорење о поправци :", "Repair error: " : "Грешка поправке:", "Following incompatible apps have been disabled: %s" : "Следеће неусаглашене апликације су искључене: %s", + "Following apps have been disabled: %s" : "Следеће апликације су искључене: %s", "Invalid file provided" : "Понуђени фајл је неисправан", "No image or file provided" : "Није дата ни слика ни фајл", "Unknown filetype" : "Непознат тип фајла", @@ -137,6 +138,7 @@ OC.L10N.register( "Updating {productName} to version {version}, this may take a while." : "Надограђујем {productName} на издање {version}. Ово би могло да потраје.", "Please reload the page." : "Поново учитајте страницу.", "The update was unsuccessful. " : "Ажурирање није успело.", + "The update was successful. There were warnings." : "Ажурирање је успело. Било је упозорења.", "The update was successful. Redirecting you to ownCloud now." : "Ажурирање је успело. Преусмеравам вас на оунКлауд.", "Couldn't reset password because the token is invalid" : "Није могуће ресетовати лозинку јер je токен неважећи", "Couldn't send reset email. Please make sure your username is correct." : "Не могу да пошаљем поруку за ресетовање лозинке. Проверите да ли је корисничко име исправно.", diff --git a/core/l10n/sr.json b/core/l10n/sr.json index a788d7633f3..ead0e061b96 100644 --- a/core/l10n/sr.json +++ b/core/l10n/sr.json @@ -10,6 +10,7 @@ "Repair warning: " : "Упозорење о поправци :", "Repair error: " : "Грешка поправке:", "Following incompatible apps have been disabled: %s" : "Следеће неусаглашене апликације су искључене: %s", + "Following apps have been disabled: %s" : "Следеће апликације су искључене: %s", "Invalid file provided" : "Понуђени фајл је неисправан", "No image or file provided" : "Није дата ни слика ни фајл", "Unknown filetype" : "Непознат тип фајла", @@ -135,6 +136,7 @@ "Updating {productName} to version {version}, this may take a while." : "Надограђујем {productName} на издање {version}. Ово би могло да потраје.", "Please reload the page." : "Поново учитајте страницу.", "The update was unsuccessful. " : "Ажурирање није успело.", + "The update was successful. There were warnings." : "Ажурирање је успело. Било је упозорења.", "The update was successful. Redirecting you to ownCloud now." : "Ажурирање је успело. Преусмеравам вас на оунКлауд.", "Couldn't reset password because the token is invalid" : "Није могуће ресетовати лозинку јер je токен неважећи", "Couldn't send reset email. Please make sure your username is correct." : "Не могу да пошаљем поруку за ресетовање лозинке. Проверите да ли је корисничко име исправно.", diff --git a/lib/l10n/sr.js b/lib/l10n/sr.js index 5e3e3858950..cb36007723b 100644 --- a/lib/l10n/sr.js +++ b/lib/l10n/sr.js @@ -16,6 +16,7 @@ OC.L10N.register( "Library %s with a version lower than %s is required - available version %s." : "Библиотека %s издања нижег од %s је потребна - доступно издање %s.", "Following platforms are supported: %s" : "Следеће платформе су подржане: %s", "ownCloud %s or higher is required." : "оунКлауд %s или новији је потребан.", + "ownCloud %s or lower is required." : "оунКлауд %s или старији је потребан.", "Help" : "Помоћ", "Personal" : "Лично", "Users" : "Корисници", @@ -44,6 +45,7 @@ OC.L10N.register( "File name is a reserved word" : "Назив фајла је резервисана реч", "File name contains at least one invalid character" : "Назив фајла садржи бар један недозвољен знак", "File name is too long" : "Назив фајла је предугачак", + "File is currently busy, please try again later" : "Фајл је тренутно заузет, покушајте поново касније", "Can't read file" : "Не могу да читам фајл", "App directory already exists" : "Директоријум апликација већ постоји", "Can't create app folder. Please fix permissions. %s" : "Не могу да креирам фасциклу за апликацију. Исправите дозволе. %s", @@ -84,6 +86,7 @@ OC.L10N.register( "Set an admin username." : "Поставите име за администратора.", "Set an admin password." : "Поставите лозинку за администратора.", "Can't create or write into the data directory %s" : "Не могу креирати или уписивати у директоријум података %s", + "Invalid Federated Cloud ID" : "Неисправан ИД Здруженог облака", "%s shared »%s« with you" : "%s подели „%s“ са вама", "%s via %s" : "%s путем %s", "Sharing %s failed, because the backend does not allow shares from type %i" : "Дељење %s није успело зато што поздина не дозвољава дељење од типа %i", diff --git a/lib/l10n/sr.json b/lib/l10n/sr.json index 5efb7613a42..2cc9f4de390 100644 --- a/lib/l10n/sr.json +++ b/lib/l10n/sr.json @@ -14,6 +14,7 @@ "Library %s with a version lower than %s is required - available version %s." : "Библиотека %s издања нижег од %s је потребна - доступно издање %s.", "Following platforms are supported: %s" : "Следеће платформе су подржане: %s", "ownCloud %s or higher is required." : "оунКлауд %s или новији је потребан.", + "ownCloud %s or lower is required." : "оунКлауд %s или старији је потребан.", "Help" : "Помоћ", "Personal" : "Лично", "Users" : "Корисници", @@ -42,6 +43,7 @@ "File name is a reserved word" : "Назив фајла је резервисана реч", "File name contains at least one invalid character" : "Назив фајла садржи бар један недозвољен знак", "File name is too long" : "Назив фајла је предугачак", + "File is currently busy, please try again later" : "Фајл је тренутно заузет, покушајте поново касније", "Can't read file" : "Не могу да читам фајл", "App directory already exists" : "Директоријум апликација већ постоји", "Can't create app folder. Please fix permissions. %s" : "Не могу да креирам фасциклу за апликацију. Исправите дозволе. %s", @@ -82,6 +84,7 @@ "Set an admin username." : "Поставите име за администратора.", "Set an admin password." : "Поставите лозинку за администратора.", "Can't create or write into the data directory %s" : "Не могу креирати или уписивати у директоријум података %s", + "Invalid Federated Cloud ID" : "Неисправан ИД Здруженог облака", "%s shared »%s« with you" : "%s подели „%s“ са вама", "%s via %s" : "%s путем %s", "Sharing %s failed, because the backend does not allow shares from type %i" : "Дељење %s није успело зато што поздина не дозвољава дељење од типа %i", diff --git a/lib/private/files/type/detection.php b/lib/private/files/type/detection.php index 3287375bc79..ba286637df3 100644 --- a/lib/private/files/type/detection.php +++ b/lib/private/files/type/detection.php @@ -4,6 +4,7 @@ * @author Jens-Christian Fischer <jens-christian.fischer@switch.ch> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Thomas Tanghus <thomas@tanghus.net> * * @copyright Copyright (c) 2015, ownCloud, Inc. @@ -25,6 +26,9 @@ namespace OC\Files\Type; +use OCP\Files\IMimeTypeDetector; +use OCP\IURLGenerator; + /** * Class Detection * @@ -32,9 +36,28 @@ namespace OC\Files\Type; * * @package OC\Files\Type */ -class Detection { - protected $mimetypes = array(); - protected $secureMimeTypes = array(); +class Detection implements IMimeTypeDetector { + protected $mimetypes = []; + protected $secureMimeTypes = []; + + protected $mimetypeIcons = []; + /** @var string[] */ + protected $mimeTypeAlias = []; + + /** @var IURLGenerator */ + private $urlGenerator; + + /** @var string */ + private $configDir; + + /** + * @param IURLGenerator $urlGenerator + * @param string $configDir + */ + public function __construct(IURLGenerator $urlGenerator, $configDir) { + $this->urlGenerator = $urlGenerator; + $this->configDir = $configDir; + } /** * Add an extension -> mimetype mapping @@ -71,12 +94,52 @@ class Detection { } /** + * Add the mimetype aliases if they are not yet present + */ + private function loadAliases() { + if (!empty($this->mimeTypeAlias)) { + return; + } + + $file = file_get_contents($this->configDir . '/mimetypealiases.dist.json'); + $this->mimeTypeAlias = get_object_vars(json_decode($file)); + + if (file_exists($this->configDir . '/mimetypealiases.json')) { + $custom = get_object_vars(json_decode(file_get_contents($this->configDir . '/mimetypealiases.json'))); + $this->mimeTypeAlias = array_merge($this->mimeTypeAlias, $custom); + } + } + + /** + * Add mimetype mappings if they are not yet present + */ + private function loadMappings() { + if (!empty($this->mimetypes)) { + return; + } + + $dist = file_get_contents($this->configDir . '/mimetypemapping.dist.json'); + $mimetypemapping = get_object_vars(json_decode($dist)); + + //Check if need to load custom mappings + if (file_exists($this->configDir . '/mimetypemapping.json')) { + $custom = file_get_contents($this->configDir . '/mimetypemapping.json'); + $custom_mapping = get_object_vars(json_decode($custom)); + $mimetypemapping = array_merge($mimetypemapping, $custom_mapping); + } + + $this->registerTypeArray($mimetypemapping); + } + + /** * detect mimetype only based on filename, content of file is not used * * @param string $path * @return string */ public function detectPath($path) { + $this->loadMappings(); + if (strpos($path, '.')) { //try to guess the type by the file extension $extension = strtolower(strrchr(basename($path), ".")); @@ -96,6 +159,8 @@ class Detection { * @return string */ public function detect($path) { + $this->loadMappings(); + if (@is_dir($path)) { // directories are easy return "httpd/unix-directory"; @@ -166,8 +231,64 @@ class Detection { * @return string */ public function getSecureMimeType($mimeType) { + $this->loadMappings(); + return isset($this->secureMimeTypes[$mimeType]) ? $this->secureMimeTypes[$mimeType] : 'application/octet-stream'; } + + /** + * Get path to the icon of a file type + * @param string $mimeType the MIME type + * @return string the url + */ + public function mimeTypeIcon($mimetype) { + $this->loadAliases(); + + if (isset($this->mimeTypeAlias[$mimetype])) { + $mimetype = $this->mimeTypeAlias[$mimetype]; + } + if (isset($this->mimetypeIcons[$mimetype])) { + return $this->mimetypeIcons[$mimetype]; + } + + // Replace slash and backslash with a minus + $icon = str_replace('/', '-', $mimetype); + $icon = str_replace('\\', '-', $icon); + + // Is it a dir? + if ($mimetype === 'dir') { + $this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/folder.png'); + return $this->mimetypeIcons[$mimetype]; + } + if ($mimetype === 'dir-shared') { + $this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/folder-shared.png'); + return $this->mimetypeIcons[$mimetype]; + } + if ($mimetype === 'dir-external') { + $this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/folder-external.png'); + return $this->mimetypeIcons[$mimetype]; + } + + // Icon exists? + try { + $this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/' . $icon . '.png'); + return $this->mimetypeIcons[$mimetype]; + } catch (\RuntimeException $e) { + // Specified image not found + } + + // Try only the first part of the filetype + $mimePart = substr($icon, 0, strpos($icon, '-')); + try { + $this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/' . $mimePart . '.png'); + return $this->mimetypeIcons[$mimetype]; + } catch (\RuntimeException $e) { + // Image for the first part of the mimetype not found + } + + $this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/file.png'); + return $this->mimetypeIcons[$mimetype]; + } } diff --git a/lib/private/helper.php b/lib/private/helper.php index ed954f87630..b8e4b451835 100644 --- a/lib/private/helper.php +++ b/lib/private/helper.php @@ -50,11 +50,7 @@ use Symfony\Component\Process\ExecutableFinder; * Collection of useful functions */ class OC_Helper { - private static $mimetypeIcons = array(); - private static $mimetypeDetector; private static $templateManager; - /** @var string[] */ - private static $mimeTypeAlias = []; /** * Creates an url using a defined route @@ -183,64 +179,10 @@ class OC_Helper { * @return string the url * * Returns the path to the image of this file type. + * @deprecated 8.2.0 Use \OC::$server->getMimeTypeDetector()->mimeTypeIcon($mimetype) */ public static function mimetypeIcon($mimetype) { - - // On first access load the list of mimetype aliases - if (empty(self::$mimeTypeAlias)) { - $file = file_get_contents(OC::$SERVERROOT . '/config/mimetypealiases.dist.json'); - self::$mimeTypeAlias = get_object_vars(json_decode($file)); - - if (file_exists(\OC::$SERVERROOT . '/config/mimetypealiases.json')) { - $custom = get_object_vars(json_decode(file_get_contents(\OC::$SERVERROOT . '/config/mimetypealiases.json'))); - self::$mimeTypeAlias = array_merge(self::$mimeTypeAlias, $custom); - } - } - - if (isset(self::$mimeTypeAlias[$mimetype])) { - $mimetype = self::$mimeTypeAlias[$mimetype]; - } - if (isset(self::$mimetypeIcons[$mimetype])) { - return self::$mimetypeIcons[$mimetype]; - } - - // Replace slash and backslash with a minus - $icon = str_replace('/', '-', $mimetype); - $icon = str_replace('\\', '-', $icon); - - // Is it a dir? - if ($mimetype === 'dir') { - self::$mimetypeIcons[$mimetype] = \OC::$server->getURLGenerator()->imagePath('core', 'filetypes/folder.png'); - return self::$mimetypeIcons[$mimetype]; - } - if ($mimetype === 'dir-shared') { - self::$mimetypeIcons[$mimetype] = \OC::$server->getURLGenerator()->imagePath('core', 'filetypes/folder-shared.png'); - return self::$mimetypeIcons[$mimetype]; - } - if ($mimetype === 'dir-external') { - self::$mimetypeIcons[$mimetype] = \OC::$server->getURLGenerator()->imagePath('core', 'filetypes/folder-external.png'); - return self::$mimetypeIcons[$mimetype]; - } - - // Icon exists? - try { - self::$mimetypeIcons[$mimetype] = \OC::$server->getURLGenerator()->imagePath('core', 'filetypes/' . $icon . '.png'); - return self::$mimetypeIcons[$mimetype]; - } catch (\RuntimeException $e) { - // Specified image not found - } - - // Try only the first part of the filetype - $mimePart = substr($icon, 0, strpos($icon, '-')); - try { - self::$mimetypeIcons[$mimetype] = \OC::$server->getURLGenerator()->imagePath('core', 'filetypes/' . $mimePart . '.png'); - return self::$mimetypeIcons[$mimetype]; - } catch (\RuntimeException $e) { - // Image for the first part of the mimetype not found - } - - self::$mimetypeIcons[$mimetype] = \OC::$server->getURLGenerator()->imagePath('core', 'filetypes/file.png'); - return self::$mimetypeIcons[$mimetype]; + return \OC::$server->getMimeTypeDetector()->mimeTypeIcon($mimetype); } /** @@ -431,23 +373,10 @@ class OC_Helper { /** * @return \OC\Files\Type\Detection + * @deprecated 8.2.0 use \OC::$server->getMimeTypeDetector() */ static public function getMimetypeDetector() { - if (!self::$mimetypeDetector) { - $dist = file_get_contents(OC::$configDir . '/mimetypemapping.dist.json'); - $mimetypemapping = get_object_vars(json_decode($dist)); - - //Check if need to load custom mappings - if (file_exists(OC::$configDir . '/mimetypemapping.json')) { - $custom = file_get_contents(OC::$configDir . '/mimetypemapping.json'); - $custom_mapping = get_object_vars(json_decode($custom)); - $mimetypemapping = array_merge($mimetypemapping, $custom_mapping); - } - - self::$mimetypeDetector = new \OC\Files\Type\Detection(); - self::$mimetypeDetector->registerTypeArray($mimetypemapping); - } - return self::$mimetypeDetector; + return \OC::$server->getMimeTypeDetector(); } /** @@ -465,9 +394,10 @@ class OC_Helper { * * @param string $path * @return string + * @deprecated 8.2.0 Use \OC::$server->getMimeTypeDetector()->detectPath($path) */ static public function getFileNameMimeType($path) { - return self::getMimetypeDetector()->detectPath($path); + return \OC::$server->getMimeTypeDetector()->detectPath($path); } /** @@ -476,9 +406,10 @@ class OC_Helper { * @param string $path * @return string * does NOT work for ownClouds filesystem, use OC_FileSystem::getMimeType instead + * @deprecated 8.2.0 Use \OC::$server->getMimeTypeDetector()->detect($path) */ static function getMimeType($path) { - return self::getMimetypeDetector()->detect($path); + return \OC::$server->getMimeTypeDetector()->detect($path); } /** @@ -486,9 +417,10 @@ class OC_Helper { * * @param string $mimeType * @return string + * @deprecated 8.2.0 Use \OC::$server->getMimeTypeDetector()->getSecureMimeType($mimeType) */ static function getSecureMimeType($mimeType) { - return self::getMimetypeDetector()->getSecureMimeType($mimeType); + return \OC::$server->getMimeTypeDetector()->getSecureMimeType($mimeType); } /** @@ -496,20 +428,13 @@ class OC_Helper { * * @param string $data * @return string + * @deprecated 8.2.0 Use \OC::$server->getMimeTypeDetector()->detectString($data) */ static function getStringMimeType($data) { - return self::getMimetypeDetector()->detectString($data); + return \OC::$server->getMimeTypeDetector()->detectString($data); } /** - * Checks $_REQUEST contains a var for the $s key. If so, returns the html-escaped value of this var; otherwise returns the default value provided by $d. - * @param string $s name of the var to escape, if set. - * @param string $d default value. - * @return string the print-safe value. - * - */ - - /** * detect if a given program is found in the search PATH * * @param string $name diff --git a/lib/private/server.php b/lib/private/server.php index 53949b53df7..12981fe7f19 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -12,6 +12,7 @@ * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> * @author Robin McCorkell <rmccorkell@karoshi.org.uk> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Sander <brantje@gmail.com> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Thomas Tanghus <thomas@tanghus.net> @@ -443,6 +444,11 @@ class Server extends SimpleContainer implements IServerContainer { $this->registerService('MountManager', function () { return new \OC\Files\Mount\Manager(); }); + $this->registerService('MimeTypeDetector', function(Server $c) { + return new \OC\Files\Type\Detection( + $c->getURLGenerator(), + \OC::$configDir); + }); } /** @@ -930,4 +936,13 @@ class Server extends SimpleContainer implements IServerContainer { function getMountManager() { return $this->query('MountManager'); } + + /* + * Get the MimeTypeDetector + * + * @return \OCP\Files\IMimeTypeDetector + */ + public function getMimeTypeDetector() { + return $this->query('MimeTypeDetector'); + } } diff --git a/lib/private/share/share.php b/lib/private/share/share.php index c0285125234..40fcc59f219 100644 --- a/lib/private/share/share.php +++ b/lib/private/share/share.php @@ -782,6 +782,19 @@ class Share extends Constants { \OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName), \OCP\Util::ERROR); throw new \Exception($message_t); } else if ($shareType === self::SHARE_TYPE_REMOTE) { + + /* + * Check if file is not already shared with the remote user + */ + if ($checkExists = self::getItems($itemType, $itemSource, self::SHARE_TYPE_REMOTE, + $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); + throw new \Exception($message_t); + } + + $token = \OC::$server->getSecureRandom()->getMediumStrengthGenerator()->generate(self::TOKEN_LENGTH, \OCP\Security\ISecureRandom::CHAR_LOWER . \OCP\Security\ISecureRandom::CHAR_UPPER . \OCP\Security\ISecureRandom::CHAR_DIGITS); diff --git a/lib/public/files/imimetypedetector.php b/lib/public/files/imimetypedetector.php new file mode 100644 index 00000000000..79ed8a4fac9 --- /dev/null +++ b/lib/public/files/imimetypedetector.php @@ -0,0 +1,78 @@ +<?php +/** + * @author Roeland Jago Douma <roeland@famdouma.nl> + * + * @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 <http://www.gnu.org/licenses/> + * + */ + +// use OCP namespace for all classes that are considered public. +// This means that they should be used by apps instead of the internal ownCloud classes +namespace OCP\Files; + + +/** + * Interface IMimeTypeDetector + * @package OCP\Files + * @since 8.2.0 + * + * Interface to handle mimetypes (detection and icon retrieval) + **/ +interface IMimeTypeDetector { + + /** + * detect mimetype only based on filename, content of file is not used + * @param string $path + * @return string + * @since 8.2.0 + **/ + public function detectPath($path); + + /** + * detect mimetype based on both filename and content + * + * @param string $path + * @return string + * @since 8.2.0 + */ + public function detect($path); + + /** + * Get a secure mimetype that won't expose potential XSS. + * + * @param string $mimeType + * @return string + * @since 8.2.0 + */ + public function getSecureMimeType($mimeType); + + /** + * detect mimetype based on the content of a string + * + * @param string $data + * @return string + * @since 8.2.0 + */ + public function detectString($data); + + /** + * Get path to the icon of a file type + * @param string $mimeType the MIME type + * @return string the url + * @since 8.2.0 + */ + public function mimeTypeIcon($mimeType); +} diff --git a/lib/public/iservercontainer.php b/lib/public/iservercontainer.php index 95ee853d84c..f3165db33da 100644 --- a/lib/public/iservercontainer.php +++ b/lib/public/iservercontainer.php @@ -9,6 +9,7 @@ * @author Lukas Reschke <lukas@owncloud.com> * @author Morris Jobke <hey@morrisjobke.de> * @author Robin Appelman <icewind@owncloud.com> + * @author Roeland Jago Douma <roeland@famdouma.nl> * @author Thomas Müller <thomas.mueller@tmit.eu> * @author Thomas Tanghus <thomas@tanghus.net> * @@ -429,4 +430,12 @@ interface IServerContainer { * @since 8.2.0 */ public function getMountManager(); + + /** + * Get the MimeTypeDetector + * + * @return \OCP\Files\IMimeTypeDetector + * @since 8.2.0 + */ + public function getMimeTypeDetector(); } diff --git a/settings/application.php b/settings/application.php index a2f25935e12..8da835c18d2 100644 --- a/settings/application.php +++ b/settings/application.php @@ -154,7 +154,8 @@ class Application extends App { $c->query('Config'), $c->query('ClientService'), $c->query('URLGenerator'), - $c->query('Util') + $c->query('Util'), + $c->query('L10N') ); }); diff --git a/settings/controller/checksetupcontroller.php b/settings/controller/checksetupcontroller.php index 0b4c72acab7..f849e3ed565 100644 --- a/settings/controller/checksetupcontroller.php +++ b/settings/controller/checksetupcontroller.php @@ -23,10 +23,12 @@ namespace OC\Settings\Controller; +use GuzzleHttp\Exception\ClientException; use OCP\AppFramework\Controller; use OCP\AppFramework\Http\DataResponse; use OCP\Http\Client\IClientService; use OCP\IConfig; +use OCP\IL10N; use OCP\IRequest; use OC_Util; use OCP\IURLGenerator; @@ -43,6 +45,8 @@ class CheckSetupController extends Controller { private $util; /** @var IURLGenerator */ private $urlGenerator; + /** @var IL10N */ + private $l10n; /** * @param string $AppName @@ -51,18 +55,21 @@ class CheckSetupController extends Controller { * @param IClientService $clientService * @param IURLGenerator $urlGenerator * @param \OC_Util $util + * @param IL10N $l10n */ public function __construct($AppName, IRequest $request, IConfig $config, IClientService $clientService, IURLGenerator $urlGenerator, - \OC_Util $util) { + \OC_Util $util, + IL10N $l10n) { parent::__construct($AppName, $request); $this->config = $config; $this->clientService = $clientService; $this->util = $util; $this->urlGenerator = $urlGenerator; + $this->l10n = $l10n; } /** @@ -110,6 +117,66 @@ class CheckSetupController extends Controller { } /** + * Public for the sake of unit-testing + * + * @return array + */ + public function getCurlVersion() { + return curl_version(); + } + + /** + * Check if the used SSL lib is outdated. Older OpenSSL and NSS versions do + * have multiple bugs which likely lead to problems in combination with + * functionalities required by ownCloud such as SNI. + * + * @link https://github.com/owncloud/core/issues/17446#issuecomment-122877546 + * @link https://bugzilla.redhat.com/show_bug.cgi?id=1241172 + * @return string + */ + private function isUsedTlsLibOutdated() { + $versionString = $this->getCurlVersion(); + if(isset($versionString['ssl_version'])) { + $versionString = $versionString['ssl_version']; + } else { + return ''; + } + + $features = (string)$this->l10n->t('installing and updating apps via the app store or Federated Cloud Sharing'); + if(OC_Util::getEditionString() !== '') { + $features = (string)$this->l10n->t('Federated Cloud Sharing'); + } + + // Check if at least OpenSSL after 1.01d or 1.0.2b + if(strpos($versionString, 'OpenSSL/') === 0) { + $majorVersion = substr($versionString, 8, 5); + $patchRelease = substr($versionString, 13, 6); + + if(($majorVersion === '1.0.1' && ord($patchRelease) < ord('d')) || + ($majorVersion === '1.0.2' && ord($patchRelease) < ord('b'))) { + return (string) $this->l10n->t('cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably.', ['OpenSSL', $versionString, $features]); + } + } + + // Check if NSS and perform heuristic check + if(strpos($versionString, 'NSS/') === 0) { + try { + $firstClient = $this->clientService->newClient(); + $firstClient->get('https://www.owncloud.org/'); + + $secondClient = $this->clientService->newClient(); + $secondClient->get('https://owncloud.org/'); + } catch (ClientException $e) { + if($e->getResponse()->getStatusCode() === 400) { + return (string) $this->l10n->t('cURL is using an outdated %s version (%s). Please update your operating system or features such as %s will not work reliably.', ['NSS', $versionString, $features]); + } + } + } + + return ''; + } + + /** * @return DataResponse */ public function check() { @@ -121,6 +188,7 @@ class CheckSetupController extends Controller { 'memcacheDocs' => $this->urlGenerator->linkToDocs('admin-performance'), 'isUrandomAvailable' => $this->isUrandomAvailable(), 'securityDocs' => $this->urlGenerator->linkToDocs('admin-security'), + 'isUsedTlsLibOutdated' => $this->isUsedTlsLibOutdated(), ] ); } diff --git a/settings/controller/encryptioncontroller.php b/settings/controller/encryptioncontroller.php index 7c952962c1a..7aaf184482f 100644 --- a/settings/controller/encryptioncontroller.php +++ b/settings/controller/encryptioncontroller.php @@ -78,6 +78,21 @@ class EncryptionController extends Controller { $this->connection = $connection; $this->view = $view; $this->userManager = $userManager; + $this->logger = $logger; + } + + /** + * @param IConfig $config + * @param View $view + * @param Connection $connection + * @param ILogger $logger + * @return Migration + */ + protected function getMigration(IConfig $config, + View $view, + Connection $connection, + ILogger $logger) { + return new Migration($config, $view, $connection, $logger); } /** @@ -91,12 +106,11 @@ class EncryptionController extends Controller { try { - $migration = new Migration($this->config, $this->view, $this->connection, $this->logger); + $migration = $this->getMigration($this->config, $this->view, $this->connection, $this->logger); $migration->reorganizeSystemFolderStructure(); $migration->updateDB(); foreach ($this->userManager->getBackends() as $backend) { - $limit = 500; $offset = 0; do { @@ -111,21 +125,20 @@ class EncryptionController extends Controller { $migration->finalCleanUp(); } catch (\Exception $e) { - return array( - 'data' => array( + return [ + 'data' => [ 'message' => (string)$this->l10n->t('A problem occurred, please check your log files (Error: %s)', [$e->getMessage()]), - ), + ], 'status' => 'error', - ); + ]; } - return array('data' => - array('message' => - (string) $this->l10n->t('Migration Completed') - ), - 'status' => 'success' - ); - + return [ + 'data' => [ + 'message' => (string) $this->l10n->t('Migration Completed'), + ], + 'status' => 'success', + ]; } } diff --git a/settings/l10n/az.js b/settings/l10n/az.js index 0880b291444..23805b8c88b 100644 --- a/settings/l10n/az.js +++ b/settings/l10n/az.js @@ -25,6 +25,7 @@ OC.L10N.register( "Unable to change password" : "Şifrəni dəyişmək olmur", "Enabled" : "İşə salınıb", "Not enabled" : "İşə salınıb", + "Federated Cloud Sharing" : "Federal Cloud Paylaşım", "Group already exists." : "Qrup artılq mövcduddur.", "Unable to add group." : "Qrupu əlavə etmək mümkün deyil. ", "Unable to delete group." : "Qrupu silmək mümkün deyil.", diff --git a/settings/l10n/az.json b/settings/l10n/az.json index c1b7f69b2d4..84ad2602e15 100644 --- a/settings/l10n/az.json +++ b/settings/l10n/az.json @@ -23,6 +23,7 @@ "Unable to change password" : "Şifrəni dəyişmək olmur", "Enabled" : "İşə salınıb", "Not enabled" : "İşə salınıb", + "Federated Cloud Sharing" : "Federal Cloud Paylaşım", "Group already exists." : "Qrup artılq mövcduddur.", "Unable to add group." : "Qrupu əlavə etmək mümkün deyil. ", "Unable to delete group." : "Qrupu silmək mümkün deyil.", diff --git a/settings/l10n/cs_CZ.js b/settings/l10n/cs_CZ.js index 68d6c315524..87ca48a0e9e 100644 --- a/settings/l10n/cs_CZ.js +++ b/settings/l10n/cs_CZ.js @@ -31,6 +31,7 @@ OC.L10N.register( "Unable to change password" : "Změna hesla se nezdařila", "Enabled" : "Povoleno", "Not enabled" : "Vypnuto", + "Federated Cloud Sharing" : "Propojené cloudové sdílení", "A problem occurred, please check your log files (Error: %s)" : "Došlo k chybě, zkontrolujte prosím log (Chyba: %s)", "Migration Completed" : "Migrace dokončena", "Group already exists." : "Skupina již existuje.", diff --git a/settings/l10n/cs_CZ.json b/settings/l10n/cs_CZ.json index b6fab6f0d50..523be1eaba6 100644 --- a/settings/l10n/cs_CZ.json +++ b/settings/l10n/cs_CZ.json @@ -29,6 +29,7 @@ "Unable to change password" : "Změna hesla se nezdařila", "Enabled" : "Povoleno", "Not enabled" : "Vypnuto", + "Federated Cloud Sharing" : "Propojené cloudové sdílení", "A problem occurred, please check your log files (Error: %s)" : "Došlo k chybě, zkontrolujte prosím log (Chyba: %s)", "Migration Completed" : "Migrace dokončena", "Group already exists." : "Skupina již existuje.", diff --git a/settings/l10n/da.js b/settings/l10n/da.js index 536b9ca9981..27d146c46d6 100644 --- a/settings/l10n/da.js +++ b/settings/l10n/da.js @@ -31,6 +31,7 @@ OC.L10N.register( "Unable to change password" : "Kunne ikke ændre kodeord", "Enabled" : "Aktiveret", "Not enabled" : "Slået fra", + "Federated Cloud Sharing" : "Sammensluttet Cloud deling", "A problem occurred, please check your log files (Error: %s)" : "Der opstod en fejl - tjek venligst dine logfiler (fejl: %s)", "Migration Completed" : "Overflytning blev fuldført", "Group already exists." : "Gruppen findes allerede.", diff --git a/settings/l10n/da.json b/settings/l10n/da.json index 61a15581774..9b343d50b28 100644 --- a/settings/l10n/da.json +++ b/settings/l10n/da.json @@ -29,6 +29,7 @@ "Unable to change password" : "Kunne ikke ændre kodeord", "Enabled" : "Aktiveret", "Not enabled" : "Slået fra", + "Federated Cloud Sharing" : "Sammensluttet Cloud deling", "A problem occurred, please check your log files (Error: %s)" : "Der opstod en fejl - tjek venligst dine logfiler (fejl: %s)", "Migration Completed" : "Overflytning blev fuldført", "Group already exists." : "Gruppen findes allerede.", diff --git a/settings/l10n/de.js b/settings/l10n/de.js index 46c37cf70cd..4d3d3e09b74 100644 --- a/settings/l10n/de.js +++ b/settings/l10n/de.js @@ -31,6 +31,7 @@ OC.L10N.register( "Unable to change password" : "Passwort konnte nicht geändert werden", "Enabled" : "Aktiviert", "Not enabled" : "Nicht aktiviert", + "Federated Cloud Sharing" : "Federated-Cloud-Sharing", "A problem occurred, please check your log files (Error: %s)" : "Es ist ein Problem aufgetreten, bitte überprüfe Deine Logdateien (Fehler: %s)", "Migration Completed" : "Migration komplett", "Group already exists." : "Gruppe existiert bereits.", diff --git a/settings/l10n/de.json b/settings/l10n/de.json index 11fc2c49c83..e1bfd5ae679 100644 --- a/settings/l10n/de.json +++ b/settings/l10n/de.json @@ -29,6 +29,7 @@ "Unable to change password" : "Passwort konnte nicht geändert werden", "Enabled" : "Aktiviert", "Not enabled" : "Nicht aktiviert", + "Federated Cloud Sharing" : "Federated-Cloud-Sharing", "A problem occurred, please check your log files (Error: %s)" : "Es ist ein Problem aufgetreten, bitte überprüfe Deine Logdateien (Fehler: %s)", "Migration Completed" : "Migration komplett", "Group already exists." : "Gruppe existiert bereits.", diff --git a/settings/l10n/de_DE.js b/settings/l10n/de_DE.js index 2f4bc02c4f3..aa2d887a914 100644 --- a/settings/l10n/de_DE.js +++ b/settings/l10n/de_DE.js @@ -31,6 +31,7 @@ OC.L10N.register( "Unable to change password" : "Passwort konnte nicht geändert werden", "Enabled" : "Aktiviert", "Not enabled" : "Nicht aktiviert", + "Federated Cloud Sharing" : "Federated-Cloud-Sharing", "A problem occurred, please check your log files (Error: %s)" : "Es ist ein Problem aufgetreten, bitte überprüfen Sie Ihre Logdateien (Fehler: %s)", "Migration Completed" : "Migration abgeschlossen", "Group already exists." : "Gruppe existiert bereits.", diff --git a/settings/l10n/de_DE.json b/settings/l10n/de_DE.json index 1790af8a9cb..e064a689a4a 100644 --- a/settings/l10n/de_DE.json +++ b/settings/l10n/de_DE.json @@ -29,6 +29,7 @@ "Unable to change password" : "Passwort konnte nicht geändert werden", "Enabled" : "Aktiviert", "Not enabled" : "Nicht aktiviert", + "Federated Cloud Sharing" : "Federated-Cloud-Sharing", "A problem occurred, please check your log files (Error: %s)" : "Es ist ein Problem aufgetreten, bitte überprüfen Sie Ihre Logdateien (Fehler: %s)", "Migration Completed" : "Migration abgeschlossen", "Group already exists." : "Gruppe existiert bereits.", diff --git a/settings/l10n/el.js b/settings/l10n/el.js index b62562297f0..cb425992190 100644 --- a/settings/l10n/el.js +++ b/settings/l10n/el.js @@ -31,6 +31,7 @@ OC.L10N.register( "Unable to change password" : "Αδυναμία αλλαγής συνθηματικού", "Enabled" : "Ενεργοποιημένο", "Not enabled" : "Μη ενεργοποιημένο", + "Federated Cloud Sharing" : "Διαμοιρασμός σε ομόσπονδα σύννεφα ", "A problem occurred, please check your log files (Error: %s)" : "Παρουσιάστηκε πρόβλημα, παρακαλώ ελέγξτε τα αρχεία καταγραφής σας (Σφάλμα: %s)", "Migration Completed" : "Η μετάβαση ολοκληρώθηκε", "Group already exists." : "Η ομάδα υπάρχει ήδη.", diff --git a/settings/l10n/el.json b/settings/l10n/el.json index 1052d3606c5..962d6f3f60b 100644 --- a/settings/l10n/el.json +++ b/settings/l10n/el.json @@ -29,6 +29,7 @@ "Unable to change password" : "Αδυναμία αλλαγής συνθηματικού", "Enabled" : "Ενεργοποιημένο", "Not enabled" : "Μη ενεργοποιημένο", + "Federated Cloud Sharing" : "Διαμοιρασμός σε ομόσπονδα σύννεφα ", "A problem occurred, please check your log files (Error: %s)" : "Παρουσιάστηκε πρόβλημα, παρακαλώ ελέγξτε τα αρχεία καταγραφής σας (Σφάλμα: %s)", "Migration Completed" : "Η μετάβαση ολοκληρώθηκε", "Group already exists." : "Η ομάδα υπάρχει ήδη.", diff --git a/settings/l10n/en_GB.js b/settings/l10n/en_GB.js index 0d13ce67970..da437fa2a25 100644 --- a/settings/l10n/en_GB.js +++ b/settings/l10n/en_GB.js @@ -29,6 +29,7 @@ OC.L10N.register( "Unable to change password" : "Unable to change password", "Enabled" : "Enabled", "Not enabled" : "Not enabled", + "Federated Cloud Sharing" : "Federated Cloud Sharing", "A problem occurred, please check your log files (Error: %s)" : "A problem occurred, please check your log files (Error: %s)", "Migration Completed" : "Migration Completed", "Group already exists." : "Group already exists.", diff --git a/settings/l10n/en_GB.json b/settings/l10n/en_GB.json index 9070f665b2d..6983ecaac1c 100644 --- a/settings/l10n/en_GB.json +++ b/settings/l10n/en_GB.json @@ -27,6 +27,7 @@ "Unable to change password" : "Unable to change password", "Enabled" : "Enabled", "Not enabled" : "Not enabled", + "Federated Cloud Sharing" : "Federated Cloud Sharing", "A problem occurred, please check your log files (Error: %s)" : "A problem occurred, please check your log files (Error: %s)", "Migration Completed" : "Migration Completed", "Group already exists." : "Group already exists.", diff --git a/settings/l10n/es.js b/settings/l10n/es.js index 2b317d5f0d3..f6ad23bfe92 100644 --- a/settings/l10n/es.js +++ b/settings/l10n/es.js @@ -31,6 +31,7 @@ OC.L10N.register( "Unable to change password" : "No se ha podido cambiar la contraseña", "Enabled" : "Habilitado", "Not enabled" : "No habilitado", + "Federated Cloud Sharing" : "Compartido en Cloud Federado", "A problem occurred, please check your log files (Error: %s)" : "Ocurrió un problema, por favor verifique los archivos de registro (Error: %s)", "Migration Completed" : "Migración finalizada", "Group already exists." : "El grupo ya existe.", diff --git a/settings/l10n/es.json b/settings/l10n/es.json index 07df8452971..79139bc4cbd 100644 --- a/settings/l10n/es.json +++ b/settings/l10n/es.json @@ -29,6 +29,7 @@ "Unable to change password" : "No se ha podido cambiar la contraseña", "Enabled" : "Habilitado", "Not enabled" : "No habilitado", + "Federated Cloud Sharing" : "Compartido en Cloud Federado", "A problem occurred, please check your log files (Error: %s)" : "Ocurrió un problema, por favor verifique los archivos de registro (Error: %s)", "Migration Completed" : "Migración finalizada", "Group already exists." : "El grupo ya existe.", diff --git a/settings/l10n/eu.js b/settings/l10n/eu.js index 3640ae249ee..94ea7e6312a 100644 --- a/settings/l10n/eu.js +++ b/settings/l10n/eu.js @@ -23,6 +23,7 @@ OC.L10N.register( "Unable to change password" : "Ezin izan da pasahitza aldatu", "Enabled" : "Gaitua", "Not enabled" : "Gaitu gabe", + "Federated Cloud Sharing" : "Federatutako Hodei Partekatzea", "Group already exists." : "Taldea dagoeneko existitzen da", "Unable to add group." : "Ezin izan da taldea gehitu.", "Unable to delete group." : "Ezin izan da taldea ezabatu.", diff --git a/settings/l10n/eu.json b/settings/l10n/eu.json index 6a7b1399a6c..ce14381a46c 100644 --- a/settings/l10n/eu.json +++ b/settings/l10n/eu.json @@ -21,6 +21,7 @@ "Unable to change password" : "Ezin izan da pasahitza aldatu", "Enabled" : "Gaitua", "Not enabled" : "Gaitu gabe", + "Federated Cloud Sharing" : "Federatutako Hodei Partekatzea", "Group already exists." : "Taldea dagoeneko existitzen da", "Unable to add group." : "Ezin izan da taldea gehitu.", "Unable to delete group." : "Ezin izan da taldea ezabatu.", diff --git a/settings/l10n/fi_FI.js b/settings/l10n/fi_FI.js index b5e561c2798..c5399c6149f 100644 --- a/settings/l10n/fi_FI.js +++ b/settings/l10n/fi_FI.js @@ -31,6 +31,7 @@ OC.L10N.register( "Unable to change password" : "Salasanan vaihto ei onnistunut", "Enabled" : "Käytössä", "Not enabled" : "Ei käytössä", + "Federated Cloud Sharing" : "Federoitu pilvijakaminen", "A problem occurred, please check your log files (Error: %s)" : "Tapahtui virhe, tarkista lokitiedostot (Virhe: %s)", "Migration Completed" : "Migraatio valmistui", "Group already exists." : "Ryhmä on jo olemassa.", diff --git a/settings/l10n/fi_FI.json b/settings/l10n/fi_FI.json index f7227702bbd..cd20309e2b7 100644 --- a/settings/l10n/fi_FI.json +++ b/settings/l10n/fi_FI.json @@ -29,6 +29,7 @@ "Unable to change password" : "Salasanan vaihto ei onnistunut", "Enabled" : "Käytössä", "Not enabled" : "Ei käytössä", + "Federated Cloud Sharing" : "Federoitu pilvijakaminen", "A problem occurred, please check your log files (Error: %s)" : "Tapahtui virhe, tarkista lokitiedostot (Virhe: %s)", "Migration Completed" : "Migraatio valmistui", "Group already exists." : "Ryhmä on jo olemassa.", diff --git a/settings/l10n/fr.js b/settings/l10n/fr.js index 55b14d9f41b..2cbde857389 100644 --- a/settings/l10n/fr.js +++ b/settings/l10n/fr.js @@ -31,6 +31,7 @@ OC.L10N.register( "Unable to change password" : "Impossible de modifier le mot de passe", "Enabled" : "Activées", "Not enabled" : "Désactivées", + "Federated Cloud Sharing" : "Federated Cloud Sharing", "A problem occurred, please check your log files (Error: %s)" : "Une erreur est survenue, veuillez vérifier vos fichiers de log (Erreur: %s)", "Migration Completed" : "Migration terminée", "Group already exists." : "Ce groupe existe déjà.", diff --git a/settings/l10n/fr.json b/settings/l10n/fr.json index b8d871dbaeb..85a45b36867 100644 --- a/settings/l10n/fr.json +++ b/settings/l10n/fr.json @@ -29,6 +29,7 @@ "Unable to change password" : "Impossible de modifier le mot de passe", "Enabled" : "Activées", "Not enabled" : "Désactivées", + "Federated Cloud Sharing" : "Federated Cloud Sharing", "A problem occurred, please check your log files (Error: %s)" : "Une erreur est survenue, veuillez vérifier vos fichiers de log (Erreur: %s)", "Migration Completed" : "Migration terminée", "Group already exists." : "Ce groupe existe déjà.", diff --git a/settings/l10n/gl.js b/settings/l10n/gl.js index 7e2c0228af1..947436001a8 100644 --- a/settings/l10n/gl.js +++ b/settings/l10n/gl.js @@ -31,6 +31,7 @@ OC.L10N.register( "Unable to change password" : "Non é posíbel cambiar o contrasinal", "Enabled" : "Activado", "Not enabled" : "Non activado", + "Federated Cloud Sharing" : "Compartición de nube federada", "A problem occurred, please check your log files (Error: %s)" : "Ocorreu un problema revise os ficheiros de rexistro (Erro: %s)", "Migration Completed" : "Completouse a migración", "Group already exists." : "Xa existe o grupo.", diff --git a/settings/l10n/gl.json b/settings/l10n/gl.json index 53a7e57a28c..dbe24dc7df8 100644 --- a/settings/l10n/gl.json +++ b/settings/l10n/gl.json @@ -29,6 +29,7 @@ "Unable to change password" : "Non é posíbel cambiar o contrasinal", "Enabled" : "Activado", "Not enabled" : "Non activado", + "Federated Cloud Sharing" : "Compartición de nube federada", "A problem occurred, please check your log files (Error: %s)" : "Ocorreu un problema revise os ficheiros de rexistro (Erro: %s)", "Migration Completed" : "Completouse a migración", "Group already exists." : "Xa existe o grupo.", diff --git a/settings/l10n/hu_HU.js b/settings/l10n/hu_HU.js index d31a1895a61..23ffd4adf4c 100644 --- a/settings/l10n/hu_HU.js +++ b/settings/l10n/hu_HU.js @@ -22,6 +22,7 @@ OC.L10N.register( "Wrong admin recovery password. Please check the password and try again." : "Hibás admin helyreállítási jelszó. Ellenőrizze a jelszót és próbálja újra!", "Unable to change password" : "Nem sikerült megváltoztatni a jelszót", "Enabled" : "Bekapcsolva", + "Federated Cloud Sharing" : "Megosztás Egyesített Felhőben", "Saved" : "Elmentve", "test email settings" : "e-mail beállítások ellenőrzése", "Email sent" : "Az e-mailt elküldtük", diff --git a/settings/l10n/hu_HU.json b/settings/l10n/hu_HU.json index 610a5771030..fdb1c9d3ee1 100644 --- a/settings/l10n/hu_HU.json +++ b/settings/l10n/hu_HU.json @@ -20,6 +20,7 @@ "Wrong admin recovery password. Please check the password and try again." : "Hibás admin helyreállítási jelszó. Ellenőrizze a jelszót és próbálja újra!", "Unable to change password" : "Nem sikerült megváltoztatni a jelszót", "Enabled" : "Bekapcsolva", + "Federated Cloud Sharing" : "Megosztás Egyesített Felhőben", "Saved" : "Elmentve", "test email settings" : "e-mail beállítások ellenőrzése", "Email sent" : "Az e-mailt elküldtük", diff --git a/settings/l10n/id.js b/settings/l10n/id.js index 116152e0eb8..20e07bfb90f 100644 --- a/settings/l10n/id.js +++ b/settings/l10n/id.js @@ -31,6 +31,7 @@ OC.L10N.register( "Unable to change password" : "Tidak dapat mengubah sandi", "Enabled" : "Diaktifkan", "Not enabled" : "Tidak diaktifkan", + "Federated Cloud Sharing" : "Federated Cloud Sharing", "A problem occurred, please check your log files (Error: %s)" : "Terjadi masalah, mohon periksa berkas log Anda (Kesalahan: %s)", "Migration Completed" : "Migrasi Selesai", "Group already exists." : "Grup sudah ada.", diff --git a/settings/l10n/id.json b/settings/l10n/id.json index d989fa24fa8..c150230b468 100644 --- a/settings/l10n/id.json +++ b/settings/l10n/id.json @@ -29,6 +29,7 @@ "Unable to change password" : "Tidak dapat mengubah sandi", "Enabled" : "Diaktifkan", "Not enabled" : "Tidak diaktifkan", + "Federated Cloud Sharing" : "Federated Cloud Sharing", "A problem occurred, please check your log files (Error: %s)" : "Terjadi masalah, mohon periksa berkas log Anda (Kesalahan: %s)", "Migration Completed" : "Migrasi Selesai", "Group already exists." : "Grup sudah ada.", diff --git a/settings/l10n/it.js b/settings/l10n/it.js index a5f493257b3..3258ab1a9a2 100644 --- a/settings/l10n/it.js +++ b/settings/l10n/it.js @@ -31,6 +31,7 @@ OC.L10N.register( "Unable to change password" : "Impossibile cambiare la password", "Enabled" : "Abilitata", "Not enabled" : "Non abilitata", + "Federated Cloud Sharing" : "Condivisione cloud federata", "A problem occurred, please check your log files (Error: %s)" : "Si è verificato un problema, controlla i tuoi file di log (Errore: %s)", "Migration Completed" : "Migrazione completata", "Group already exists." : "Il gruppo esiste già.", diff --git a/settings/l10n/it.json b/settings/l10n/it.json index aca18e60db8..ae2c56ba7eb 100644 --- a/settings/l10n/it.json +++ b/settings/l10n/it.json @@ -29,6 +29,7 @@ "Unable to change password" : "Impossibile cambiare la password", "Enabled" : "Abilitata", "Not enabled" : "Non abilitata", + "Federated Cloud Sharing" : "Condivisione cloud federata", "A problem occurred, please check your log files (Error: %s)" : "Si è verificato un problema, controlla i tuoi file di log (Errore: %s)", "Migration Completed" : "Migrazione completata", "Group already exists." : "Il gruppo esiste già.", diff --git a/settings/l10n/ja.js b/settings/l10n/ja.js index 988b0fea9f6..6d36075e713 100644 --- a/settings/l10n/ja.js +++ b/settings/l10n/ja.js @@ -31,6 +31,7 @@ OC.L10N.register( "Unable to change password" : "パスワードを変更できません", "Enabled" : "有効", "Not enabled" : "無効", + "Federated Cloud Sharing" : "統合されたクラウド共有", "A problem occurred, please check your log files (Error: %s)" : "問題が発生しました。ログファイルを確認してください。(Error: %s)", "Migration Completed" : "移行が完了しました", "Group already exists." : "グループはすでに存在しています", diff --git a/settings/l10n/ja.json b/settings/l10n/ja.json index 91faef72de4..771c4787b98 100644 --- a/settings/l10n/ja.json +++ b/settings/l10n/ja.json @@ -29,6 +29,7 @@ "Unable to change password" : "パスワードを変更できません", "Enabled" : "有効", "Not enabled" : "無効", + "Federated Cloud Sharing" : "統合されたクラウド共有", "A problem occurred, please check your log files (Error: %s)" : "問題が発生しました。ログファイルを確認してください。(Error: %s)", "Migration Completed" : "移行が完了しました", "Group already exists." : "グループはすでに存在しています", diff --git a/settings/l10n/ko.js b/settings/l10n/ko.js index e697f0044d7..dd7a09bff39 100644 --- a/settings/l10n/ko.js +++ b/settings/l10n/ko.js @@ -31,6 +31,7 @@ OC.L10N.register( "Unable to change password" : "암호를 변경할 수 없음", "Enabled" : "활성", "Not enabled" : "비활성", + "Federated Cloud Sharing" : "클라우드 연합 공유", "A problem occurred, please check your log files (Error: %s)" : "문제가 발생하였습니다. 로그 파일을 참조하십시오(오류: %s)", "Migration Completed" : "이전 완료됨", "Group already exists." : "그룹이 이미 존재합니다.", diff --git a/settings/l10n/ko.json b/settings/l10n/ko.json index efaf2588638..955396bff17 100644 --- a/settings/l10n/ko.json +++ b/settings/l10n/ko.json @@ -29,6 +29,7 @@ "Unable to change password" : "암호를 변경할 수 없음", "Enabled" : "활성", "Not enabled" : "비활성", + "Federated Cloud Sharing" : "클라우드 연합 공유", "A problem occurred, please check your log files (Error: %s)" : "문제가 발생하였습니다. 로그 파일을 참조하십시오(오류: %s)", "Migration Completed" : "이전 완료됨", "Group already exists." : "그룹이 이미 존재합니다.", diff --git a/settings/l10n/lt_LT.js b/settings/l10n/lt_LT.js index 72eb0fa5e3b..08676dd9156 100644 --- a/settings/l10n/lt_LT.js +++ b/settings/l10n/lt_LT.js @@ -47,6 +47,7 @@ OC.L10N.register( "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Trūksta PHP modulio „fileinfo“. Labai rekomenduojame įjungti šį modulį, kad gauti geriausius rezultatus nustatant mime-tipą.", "Allow apps to use the Share API" : "Leidžia programoms naudoti Share API", "Allow public uploads" : "Leisti viešus įkėlimus", + "days" : "dienos", "Allow resharing" : "Leisti dalintis", "Execute one task with each page loaded" : "Įvykdyti vieną užduotį su kiekvieno puslapio įkėlimu", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php yra registruotas tinklapio suplanuotų užduočių paslaugose, kad iškviesti cron.php kas 15 minučių per http.", diff --git a/settings/l10n/lt_LT.json b/settings/l10n/lt_LT.json index dd5c1ebe8b9..bff0df74f08 100644 --- a/settings/l10n/lt_LT.json +++ b/settings/l10n/lt_LT.json @@ -45,6 +45,7 @@ "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Trūksta PHP modulio „fileinfo“. Labai rekomenduojame įjungti šį modulį, kad gauti geriausius rezultatus nustatant mime-tipą.", "Allow apps to use the Share API" : "Leidžia programoms naudoti Share API", "Allow public uploads" : "Leisti viešus įkėlimus", + "days" : "dienos", "Allow resharing" : "Leisti dalintis", "Execute one task with each page loaded" : "Įvykdyti vieną užduotį su kiekvieno puslapio įkėlimu", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php yra registruotas tinklapio suplanuotų užduočių paslaugose, kad iškviesti cron.php kas 15 minučių per http.", diff --git a/settings/l10n/lv.js b/settings/l10n/lv.js index dfda986fb44..52a554b9e22 100644 --- a/settings/l10n/lv.js +++ b/settings/l10n/lv.js @@ -22,6 +22,7 @@ OC.L10N.register( "Unable to change password" : "Nav iespējams nomainīt paroli", "Enabled" : "Pievienots", "Not enabled" : "Nav pievienots", + "Federated Cloud Sharing" : "Federatīva mākoņkoplietošana", "Group already exists." : "Grupa jau eksistē.", "Unable to add group." : "Nevar pievienot grupu.", "Unable to delete group." : "Nevar izdzēst grupu.", diff --git a/settings/l10n/lv.json b/settings/l10n/lv.json index 01325e10e17..f92b1196f80 100644 --- a/settings/l10n/lv.json +++ b/settings/l10n/lv.json @@ -20,6 +20,7 @@ "Unable to change password" : "Nav iespējams nomainīt paroli", "Enabled" : "Pievienots", "Not enabled" : "Nav pievienots", + "Federated Cloud Sharing" : "Federatīva mākoņkoplietošana", "Group already exists." : "Grupa jau eksistē.", "Unable to add group." : "Nevar pievienot grupu.", "Unable to delete group." : "Nevar izdzēst grupu.", diff --git a/settings/l10n/nb_NO.js b/settings/l10n/nb_NO.js index bbe8b137881..805f1f0c328 100644 --- a/settings/l10n/nb_NO.js +++ b/settings/l10n/nb_NO.js @@ -31,6 +31,7 @@ OC.L10N.register( "Unable to change password" : "Kunne ikke endre passord", "Enabled" : "Aktiv", "Not enabled" : "Ikke aktivert", + "Federated Cloud Sharing" : "Sammenknyttet sky-deling", "A problem occurred, please check your log files (Error: %s)" : "Det oppstod et problem. Sjekk loggfilene (Feil: %s)", "Migration Completed" : "Migrering ferdig", "Group already exists." : "Gruppe finnes allerede.", diff --git a/settings/l10n/nb_NO.json b/settings/l10n/nb_NO.json index c1ad9f48886..3e92a23ec75 100644 --- a/settings/l10n/nb_NO.json +++ b/settings/l10n/nb_NO.json @@ -29,6 +29,7 @@ "Unable to change password" : "Kunne ikke endre passord", "Enabled" : "Aktiv", "Not enabled" : "Ikke aktivert", + "Federated Cloud Sharing" : "Sammenknyttet sky-deling", "A problem occurred, please check your log files (Error: %s)" : "Det oppstod et problem. Sjekk loggfilene (Feil: %s)", "Migration Completed" : "Migrering ferdig", "Group already exists." : "Gruppe finnes allerede.", diff --git a/settings/l10n/nl.js b/settings/l10n/nl.js index c34c978b9fb..2898cf5d5a6 100644 --- a/settings/l10n/nl.js +++ b/settings/l10n/nl.js @@ -31,6 +31,7 @@ OC.L10N.register( "Unable to change password" : "Kan wachtwoord niet wijzigen", "Enabled" : "Geactiveerd", "Not enabled" : "Niet ingeschakeld", + "Federated Cloud Sharing" : "Federated Cloud Sharing", "A problem occurred, please check your log files (Error: %s)" : "Er trad een een probleem op, controleer uw logbestanden (Fout: %s).", "Migration Completed" : "Migratie gereed", "Group already exists." : "Groep bestaat al.", diff --git a/settings/l10n/nl.json b/settings/l10n/nl.json index b2668ca461e..5f4b4dc208b 100644 --- a/settings/l10n/nl.json +++ b/settings/l10n/nl.json @@ -29,6 +29,7 @@ "Unable to change password" : "Kan wachtwoord niet wijzigen", "Enabled" : "Geactiveerd", "Not enabled" : "Niet ingeschakeld", + "Federated Cloud Sharing" : "Federated Cloud Sharing", "A problem occurred, please check your log files (Error: %s)" : "Er trad een een probleem op, controleer uw logbestanden (Fout: %s).", "Migration Completed" : "Migratie gereed", "Group already exists." : "Groep bestaat al.", diff --git a/settings/l10n/pt_BR.js b/settings/l10n/pt_BR.js index 332cefa3e1e..2d76cb44f6c 100644 --- a/settings/l10n/pt_BR.js +++ b/settings/l10n/pt_BR.js @@ -31,6 +31,7 @@ OC.L10N.register( "Unable to change password" : "Impossível modificar senha", "Enabled" : "Habilitado", "Not enabled" : "Desabilitado", + "Federated Cloud Sharing" : "Compartilhamento de Nuvem Conglomerada", "A problem occurred, please check your log files (Error: %s)" : "Ocorreu um problema enquanto verificava seus arquivos de log (Erro: %s)", "Migration Completed" : "Migração Concluida", "Group already exists." : "O Grupo já existe.", diff --git a/settings/l10n/pt_BR.json b/settings/l10n/pt_BR.json index e61fdfa7a90..f9df769ac35 100644 --- a/settings/l10n/pt_BR.json +++ b/settings/l10n/pt_BR.json @@ -29,6 +29,7 @@ "Unable to change password" : "Impossível modificar senha", "Enabled" : "Habilitado", "Not enabled" : "Desabilitado", + "Federated Cloud Sharing" : "Compartilhamento de Nuvem Conglomerada", "A problem occurred, please check your log files (Error: %s)" : "Ocorreu um problema enquanto verificava seus arquivos de log (Erro: %s)", "Migration Completed" : "Migração Concluida", "Group already exists." : "O Grupo já existe.", diff --git a/settings/l10n/pt_PT.js b/settings/l10n/pt_PT.js index 66a9314608b..d2ab73ce4ed 100644 --- a/settings/l10n/pt_PT.js +++ b/settings/l10n/pt_PT.js @@ -26,6 +26,7 @@ OC.L10N.register( "Unable to change password" : "Não foi possível alterar a sua palavra-passe ", "Enabled" : "Ativada", "Not enabled" : "Desativada", + "Federated Cloud Sharing" : "Partilha de Cloud Federada", "A problem occurred, please check your log files (Error: %s)" : "Ocorreu um problema, por favor, verifique os ficheiros de registo (Erro: %s)", "Migration Completed" : "Migração Concluída", "Group already exists." : "O grupo já existe.", diff --git a/settings/l10n/pt_PT.json b/settings/l10n/pt_PT.json index 70d2eeadb9f..1ab8808031e 100644 --- a/settings/l10n/pt_PT.json +++ b/settings/l10n/pt_PT.json @@ -24,6 +24,7 @@ "Unable to change password" : "Não foi possível alterar a sua palavra-passe ", "Enabled" : "Ativada", "Not enabled" : "Desativada", + "Federated Cloud Sharing" : "Partilha de Cloud Federada", "A problem occurred, please check your log files (Error: %s)" : "Ocorreu um problema, por favor, verifique os ficheiros de registo (Erro: %s)", "Migration Completed" : "Migração Concluída", "Group already exists." : "O grupo já existe.", diff --git a/settings/l10n/ru.js b/settings/l10n/ru.js index 2383ae2ecc7..64df7664ee4 100644 --- a/settings/l10n/ru.js +++ b/settings/l10n/ru.js @@ -31,6 +31,7 @@ OC.L10N.register( "Unable to change password" : "Невозможно изменить пароль", "Enabled" : "Включено", "Not enabled" : "Не включено", + "Federated Cloud Sharing" : "Объединение облачных хранилищ", "A problem occurred, please check your log files (Error: %s)" : "Возникла проблема, пожалуйста, проверьте ваши файлы журнала (Ошибка: %s)", "Migration Completed" : "Миграция завершена", "Group already exists." : "Группа уже существует.", diff --git a/settings/l10n/ru.json b/settings/l10n/ru.json index 64e1fe74410..7dc52767c7b 100644 --- a/settings/l10n/ru.json +++ b/settings/l10n/ru.json @@ -29,6 +29,7 @@ "Unable to change password" : "Невозможно изменить пароль", "Enabled" : "Включено", "Not enabled" : "Не включено", + "Federated Cloud Sharing" : "Объединение облачных хранилищ", "A problem occurred, please check your log files (Error: %s)" : "Возникла проблема, пожалуйста, проверьте ваши файлы журнала (Ошибка: %s)", "Migration Completed" : "Миграция завершена", "Group already exists." : "Группа уже существует.", diff --git a/settings/l10n/sk_SK.js b/settings/l10n/sk_SK.js index a253e3bedcd..b09ea77607e 100644 --- a/settings/l10n/sk_SK.js +++ b/settings/l10n/sk_SK.js @@ -31,6 +31,7 @@ OC.L10N.register( "Unable to change password" : "Zmena hesla sa nepodarila", "Enabled" : "Povolené", "Not enabled" : "Zakázané", + "Federated Cloud Sharing" : "Združené cloudové zdieľanie", "A problem occurred, please check your log files (Error: %s)" : "Nastala chyba, skontrolujte prosím váš log súbor (Chyba: %s)", "Migration Completed" : "Migrácia ukončená", "Group already exists." : "Skupina už existuje.", diff --git a/settings/l10n/sk_SK.json b/settings/l10n/sk_SK.json index bf5497ad5ab..0d11a98c6e1 100644 --- a/settings/l10n/sk_SK.json +++ b/settings/l10n/sk_SK.json @@ -29,6 +29,7 @@ "Unable to change password" : "Zmena hesla sa nepodarila", "Enabled" : "Povolené", "Not enabled" : "Zakázané", + "Federated Cloud Sharing" : "Združené cloudové zdieľanie", "A problem occurred, please check your log files (Error: %s)" : "Nastala chyba, skontrolujte prosím váš log súbor (Chyba: %s)", "Migration Completed" : "Migrácia ukončená", "Group already exists." : "Skupina už existuje.", diff --git a/settings/l10n/sl.js b/settings/l10n/sl.js index 3635394c026..e4fc35cd30a 100644 --- a/settings/l10n/sl.js +++ b/settings/l10n/sl.js @@ -30,6 +30,7 @@ OC.L10N.register( "Unable to change password" : "Ni mogoče spremeniti gesla", "Enabled" : "Omogočeno", "Not enabled" : "Ni omogočeno", + "Federated Cloud Sharing" : "Upravljana souporaba oblaka", "A problem occurred, please check your log files (Error: %s)" : "Pojavila se je težava. Prosimo, preverite dnevniške zapise (Napaka: %s)", "Migration Completed" : "Selitev zaključena", "Group already exists." : "Skupina že obstaja.", diff --git a/settings/l10n/sl.json b/settings/l10n/sl.json index 0f7a4982610..3d01ae0bc55 100644 --- a/settings/l10n/sl.json +++ b/settings/l10n/sl.json @@ -28,6 +28,7 @@ "Unable to change password" : "Ni mogoče spremeniti gesla", "Enabled" : "Omogočeno", "Not enabled" : "Ni omogočeno", + "Federated Cloud Sharing" : "Upravljana souporaba oblaka", "A problem occurred, please check your log files (Error: %s)" : "Pojavila se je težava. Prosimo, preverite dnevniške zapise (Napaka: %s)", "Migration Completed" : "Selitev zaključena", "Group already exists." : "Skupina že obstaja.", diff --git a/settings/l10n/sr.js b/settings/l10n/sr.js index 3b4cfcda616..ea20901670c 100644 --- a/settings/l10n/sr.js +++ b/settings/l10n/sr.js @@ -31,6 +31,7 @@ OC.L10N.register( "Unable to change password" : "Не могу да променим лозинку", "Enabled" : "Укључено", "Not enabled" : "Искључено", + "Federated Cloud Sharing" : "Здружено дељење у облаку", "A problem occurred, please check your log files (Error: %s)" : "Појавио се проблем. Проверите записнике (грешка: %s)", "Migration Completed" : "Пресељење завршено", "Group already exists." : "Група већ постоји.", @@ -62,6 +63,7 @@ OC.L10N.register( "All" : "Све", "Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Званичнe апликације су развиjене од стране и унутар оунКлауд заједнице. Оне пружају главне функционалности и спремне су и стабилне за свакодневну употребу.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Одобрене апликације су развили проверени програмери и апликације су прошле основне безбедносне провере. Оне се активно одржавају у репозиторијуму за апликације отвореног кода и њихови одржаватељи сматрају да су стабилне за уобичајену употребу.", + "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Ова апликација није проверена по питању безбедности и нова је или зна да буде нестабилна. Инсталирате је на сопствену одговорност.", "Update to %s" : "Ажурирај на %s", "Please wait...." : "Сачекајте…", "Error while disabling app" : "Грешка при искључивању апликације", @@ -185,6 +187,8 @@ OC.L10N.register( "Improving the config.php" : "Побољшање фајла поставки", "Theming" : "Теме", "Hardening and security guidance" : "Ојачавање система и безбедносне препоруке", + "Transactional File Locking is enabled." : "Трансакционо закључавање фајла је укључено.", + "Transactional File Locking is disabled." : "Трансакционо закључавање фајла је искључено.", "Version" : "Верзија", "Developer documentation" : "Програмерска документација", "Experimental applications ahead" : "Експериментална апликација", @@ -193,6 +197,7 @@ OC.L10N.register( "licensed" : "лиценцирано", "Documentation:" : "Документација:", "User documentation" : "Корисничка документација", + "Admin documentation" : "Администраторска документација", "Show description …" : "Прикажи опис…", "Hide description …" : "Сакриј опис…", "This app cannot be installed because the following dependencies are not fulfilled:" : "Апликација се не може инсталирати јер следеће зависности нису испуњене:", diff --git a/settings/l10n/sr.json b/settings/l10n/sr.json index e75f5404d6d..7ba90354f39 100644 --- a/settings/l10n/sr.json +++ b/settings/l10n/sr.json @@ -29,6 +29,7 @@ "Unable to change password" : "Не могу да променим лозинку", "Enabled" : "Укључено", "Not enabled" : "Искључено", + "Federated Cloud Sharing" : "Здружено дељење у облаку", "A problem occurred, please check your log files (Error: %s)" : "Појавио се проблем. Проверите записнике (грешка: %s)", "Migration Completed" : "Пресељење завршено", "Group already exists." : "Група већ постоји.", @@ -60,6 +61,7 @@ "All" : "Све", "Official apps are developed by and within the ownCloud community. They offer functionality central to ownCloud and are ready for production use." : "Званичнe апликације су развиjене од стране и унутар оунКлауд заједнице. Оне пружају главне функционалности и спремне су и стабилне за свакодневну употребу.", "Approved apps are developed by trusted developers and have passed a cursory security check. They are actively maintained in an open code repository and their maintainers deem them to be stable for casual to normal use." : "Одобрене апликације су развили проверени програмери и апликације су прошле основне безбедносне провере. Оне се активно одржавају у репозиторијуму за апликације отвореног кода и њихови одржаватељи сматрају да су стабилне за уобичајену употребу.", + "This app is not checked for security issues and is new or known to be unstable. Install at your own risk." : "Ова апликација није проверена по питању безбедности и нова је или зна да буде нестабилна. Инсталирате је на сопствену одговорност.", "Update to %s" : "Ажурирај на %s", "Please wait...." : "Сачекајте…", "Error while disabling app" : "Грешка при искључивању апликације", @@ -183,6 +185,8 @@ "Improving the config.php" : "Побољшање фајла поставки", "Theming" : "Теме", "Hardening and security guidance" : "Ојачавање система и безбедносне препоруке", + "Transactional File Locking is enabled." : "Трансакционо закључавање фајла је укључено.", + "Transactional File Locking is disabled." : "Трансакционо закључавање фајла је искључено.", "Version" : "Верзија", "Developer documentation" : "Програмерска документација", "Experimental applications ahead" : "Експериментална апликација", @@ -191,6 +195,7 @@ "licensed" : "лиценцирано", "Documentation:" : "Документација:", "User documentation" : "Корисничка документација", + "Admin documentation" : "Администраторска документација", "Show description …" : "Прикажи опис…", "Hide description …" : "Сакриј опис…", "This app cannot be installed because the following dependencies are not fulfilled:" : "Апликација се не може инсталирати јер следеће зависности нису испуњене:", diff --git a/settings/l10n/th_TH.js b/settings/l10n/th_TH.js index 7716b7d50e3..2ceba16a84b 100644 --- a/settings/l10n/th_TH.js +++ b/settings/l10n/th_TH.js @@ -31,6 +31,7 @@ OC.L10N.register( "Unable to change password" : "ไม่สามารถเปลี่ยนรหัสผ่าน", "Enabled" : "เปิดการใช้งาน", "Not enabled" : "ใช้งานไม่ได้", + "Federated Cloud Sharing" : "สหพันธ์การแชร์คลาวด์", "A problem occurred, please check your log files (Error: %s)" : "มีปัญหาเกิดขึ้นโปรดตรวจสอบบันทึกไฟล์ของคุณ (ข้อผิดพลาด: %s)", "Migration Completed" : "การโยกย้ายเสร็จสมบูรณ์", "Group already exists." : "มีกลุ่มนี้อยู่แล้ว", diff --git a/settings/l10n/th_TH.json b/settings/l10n/th_TH.json index d3d8dfdcd39..c0fbabfc5b7 100644 --- a/settings/l10n/th_TH.json +++ b/settings/l10n/th_TH.json @@ -29,6 +29,7 @@ "Unable to change password" : "ไม่สามารถเปลี่ยนรหัสผ่าน", "Enabled" : "เปิดการใช้งาน", "Not enabled" : "ใช้งานไม่ได้", + "Federated Cloud Sharing" : "สหพันธ์การแชร์คลาวด์", "A problem occurred, please check your log files (Error: %s)" : "มีปัญหาเกิดขึ้นโปรดตรวจสอบบันทึกไฟล์ของคุณ (ข้อผิดพลาด: %s)", "Migration Completed" : "การโยกย้ายเสร็จสมบูรณ์", "Group already exists." : "มีกลุ่มนี้อยู่แล้ว", diff --git a/settings/l10n/tr.js b/settings/l10n/tr.js index dd6ec872144..bd6e254d3ec 100644 --- a/settings/l10n/tr.js +++ b/settings/l10n/tr.js @@ -31,6 +31,7 @@ OC.L10N.register( "Unable to change password" : "Parola değiştirilemiyor", "Enabled" : "Etkin", "Not enabled" : "Etkin değil", + "Federated Cloud Sharing" : "Birleşmiş Bulut Paylaşımı", "A problem occurred, please check your log files (Error: %s)" : "Bir problem oluştu, lütfen log dosyalarını kontrol edin (Hata: %s)", "Migration Completed" : "Taşınma Tamamlandı", "Group already exists." : "Grup zaten mevcut.", diff --git a/settings/l10n/tr.json b/settings/l10n/tr.json index 413b3c0e3ab..f4a8fb93b57 100644 --- a/settings/l10n/tr.json +++ b/settings/l10n/tr.json @@ -29,6 +29,7 @@ "Unable to change password" : "Parola değiştirilemiyor", "Enabled" : "Etkin", "Not enabled" : "Etkin değil", + "Federated Cloud Sharing" : "Birleşmiş Bulut Paylaşımı", "A problem occurred, please check your log files (Error: %s)" : "Bir problem oluştu, lütfen log dosyalarını kontrol edin (Hata: %s)", "Migration Completed" : "Taşınma Tamamlandı", "Group already exists." : "Grup zaten mevcut.", diff --git a/settings/l10n/uk.js b/settings/l10n/uk.js index 724bdf53875..093e9a57e57 100644 --- a/settings/l10n/uk.js +++ b/settings/l10n/uk.js @@ -29,6 +29,7 @@ OC.L10N.register( "Unable to change password" : "Неможливо змінити пароль", "Enabled" : "Увімкнено", "Not enabled" : "Вимкнено", + "Federated Cloud Sharing" : "Об’єднання хмарних сховищ", "A problem occurred, please check your log files (Error: %s)" : "Виникла проблема, будь ласка, перевірте свої журнальні файли (Помилка:%s)", "Migration Completed" : "Міграцію завершено", "Group already exists." : "Група вже існує.", diff --git a/settings/l10n/uk.json b/settings/l10n/uk.json index ac96928b8ad..d63210e88e3 100644 --- a/settings/l10n/uk.json +++ b/settings/l10n/uk.json @@ -27,6 +27,7 @@ "Unable to change password" : "Неможливо змінити пароль", "Enabled" : "Увімкнено", "Not enabled" : "Вимкнено", + "Federated Cloud Sharing" : "Об’єднання хмарних сховищ", "A problem occurred, please check your log files (Error: %s)" : "Виникла проблема, будь ласка, перевірте свої журнальні файли (Помилка:%s)", "Migration Completed" : "Міграцію завершено", "Group already exists." : "Група вже існує.", diff --git a/settings/l10n/zh_CN.js b/settings/l10n/zh_CN.js index 9a25ee9d267..f769e00142d 100644 --- a/settings/l10n/zh_CN.js +++ b/settings/l10n/zh_CN.js @@ -27,6 +27,7 @@ OC.L10N.register( "Unable to change password" : "不能更改密码", "Enabled" : "开启", "Not enabled" : "未启用", + "Federated Cloud Sharing" : "联合云共享", "Migration Completed" : "迁移完成", "Saved" : "已保存", "test email settings" : "测试电子邮件设置", diff --git a/settings/l10n/zh_CN.json b/settings/l10n/zh_CN.json index 35ccf89f8fa..d70e7045458 100644 --- a/settings/l10n/zh_CN.json +++ b/settings/l10n/zh_CN.json @@ -25,6 +25,7 @@ "Unable to change password" : "不能更改密码", "Enabled" : "开启", "Not enabled" : "未启用", + "Federated Cloud Sharing" : "联合云共享", "Migration Completed" : "迁移完成", "Saved" : "已保存", "test email settings" : "测试电子邮件设置", diff --git a/tests/lib/files/type/detection.php b/tests/lib/files/type/detection.php new file mode 100644 index 00000000000..1997fa4dfd6 --- /dev/null +++ b/tests/lib/files/type/detection.php @@ -0,0 +1,283 @@ +<?php +/** + * @author Roeland Jago Douma <roeland@famdouma.nl> + * + * @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 <http://www.gnu.org/licenses/> + * + */ + +namespace OC\Files\Type; + +use \OC\Files\Type\Detection; + +class DetectionTest extends \Test\TestCase { + + public function testDetect() { + $detection = new Detection(\OC::$server->getURLGenerator(), \OC::$configDir); + $dir = \OC::$SERVERROOT.'/tests/data'; + + $result = $detection->detect($dir."/"); + $expected = 'httpd/unix-directory'; + $this->assertEquals($expected, $result); + + $result = $detection->detect($dir."/data.tar.gz"); + $expected = 'application/x-gzip'; + $this->assertEquals($expected, $result); + + $result = $detection->detect($dir."/data.zip"); + $expected = 'application/zip'; + $this->assertEquals($expected, $result); + + $result = $detection->detect($dir."/testimagelarge.svg"); + $expected = 'image/svg+xml'; + $this->assertEquals($expected, $result); + + $result = $detection->detect($dir."/testimage.png"); + $expected = 'image/png'; + $this->assertEquals($expected, $result); + } + + public function testGetSecureMimeType() { + $detection = new Detection(\OC::$server->getURLGenerator(), \OC::$configDir); + + $result = $detection->getSecureMimeType('image/svg+xml'); + $expected = 'text/plain'; + $this->assertEquals($expected, $result); + + $result = $detection->getSecureMimeType('image/png'); + $expected = 'image/png'; + $this->assertEquals($expected, $result); + } + + public function testDetectPath() { + $detection = new Detection(\OC::$server->getURLGenerator(), \OC::$configDir); + + $this->assertEquals('text/plain', $detection->detectPath('foo.txt')); + $this->assertEquals('image/png', $detection->detectPath('foo.png')); + $this->assertEquals('image/png', $detection->detectPath('foo.bar.png')); + $this->assertEquals('application/octet-stream', $detection->detectPath('.png')); + $this->assertEquals('application/octet-stream', $detection->detectPath('foo')); + $this->assertEquals('application/octet-stream', $detection->detectPath('')); + } + + public function testDetectString() { + if (\OC_Util::runningOnWindows()) { + $this->markTestSkipped('[Windows] Strings have mimetype application/octet-stream on Windows'); + } + + $detection = new Detection(\OC::$server->getURLGenerator(), \OC::$configDir); + + $result = $detection->detectString("/data/data.tar.gz"); + $expected = 'text/plain; charset=us-ascii'; + $this->assertEquals($expected, $result); + } + + public function testMimeTypeIcon() { + if (!class_exists('org\\bovigo\\vfs\\vfsStream')) { + $this->markTestSkipped('Pacakge vfsStream not installed'); + } + $confDir = \org\bovigo\vfs\vfsStream::setup(); + $mimetypealiases_dist = \org\bovigo\vfs\vfsStream::newFile('mimetypealiases.dist.json')->at($confDir); + + //Empty alias file + $mimetypealiases_dist->setContent(json_encode([], JSON_FORCE_OBJECT)); + + + /* + * Test dir mimetype + */ + + //Mock UrlGenerator + $urlGenerator = $this->getMockBuilder('\OCP\IURLGenerator') + ->disableOriginalConstructor() + ->getMock(); + + //Only call the url generator once + $urlGenerator->expects($this->once()) + ->method('imagePath') + ->with($this->equalTo('core'), $this->equalTo('filetypes/folder.png')) + ->willReturn('folder.svg'); + + $detection = new Detection($urlGenerator, $confDir->url()); + $mimeType = $detection->mimeTypeIcon('dir'); + $this->assertEquals('folder.svg', $mimeType); + + + /* + * Test dir-shareed mimetype + */ + //Mock UrlGenerator + $urlGenerator = $this->getMockBuilder('\OCP\IURLGenerator') + ->disableOriginalConstructor() + ->getMock(); + + //Only call the url generator once + $urlGenerator->expects($this->once()) + ->method('imagePath') + ->with($this->equalTo('core'), $this->equalTo('filetypes/folder-shared.png')) + ->willReturn('folder-shared.svg'); + + $detection = new Detection($urlGenerator, $confDir->url()); + $mimeType = $detection->mimeTypeIcon('dir-shared'); + $this->assertEquals('folder-shared.svg', $mimeType); + + + /* + * Test dir external + */ + + //Mock UrlGenerator + $urlGenerator = $this->getMockBuilder('\OCP\IURLGenerator') + ->disableOriginalConstructor() + ->getMock(); + + //Only call the url generator once + $urlGenerator->expects($this->once()) + ->method('imagePath') + ->with($this->equalTo('core'), $this->equalTo('filetypes/folder-external.png')) + ->willReturn('folder-external.svg'); + + $detection = new Detection($urlGenerator, $confDir->url()); + $mimeType = $detection->mimeTypeIcon('dir-external'); + $this->assertEquals('folder-external.svg', $mimeType); + + + /* + * Test complete mimetype + */ + + //Mock UrlGenerator + $urlGenerator = $this->getMockBuilder('\OCP\IURLGenerator') + ->disableOriginalConstructor() + ->getMock(); + + //Only call the url generator once + $urlGenerator->expects($this->once()) + ->method('imagePath') + ->with($this->equalTo('core'), $this->equalTo('filetypes/my-type.png')) + ->willReturn('my-type.svg'); + + $detection = new Detection($urlGenerator, $confDir->url()); + $mimeType = $detection->mimeTypeIcon('my-type'); + $this->assertEquals('my-type.svg', $mimeType); + + + /* + * Test subtype + */ + + //Mock UrlGenerator + $urlGenerator = $this->getMockBuilder('\OCP\IURLGenerator') + ->disableOriginalConstructor() + ->getMock(); + + //Only call the url generator once + $urlGenerator->expects($this->exactly(2)) + ->method('imagePath') + ->withConsecutive( + [$this->equalTo('core'), $this->equalTo('filetypes/my-type.png')], + [$this->equalTo('core'), $this->equalTo('filetypes/my.png')] + ) + ->will($this->returnCallback( + function($appName, $file) { + if ($file === 'filetypes/my.png') { + return 'my.svg'; + } + throw new \RuntimeException(); + } + )); + + $detection = new Detection($urlGenerator, $confDir->url()); + $mimeType = $detection->mimeTypeIcon('my-type'); + $this->assertEquals('my.svg', $mimeType); + + + /* + * Test default mimetype + */ + + //Mock UrlGenerator + $urlGenerator = $this->getMockBuilder('\OCP\IURLGenerator') + ->disableOriginalConstructor() + ->getMock(); + + //Only call the url generator once + $urlGenerator->expects($this->exactly(3)) + ->method('imagePath') + ->withConsecutive( + [$this->equalTo('core'), $this->equalTo('filetypes/foo-bar.png')], + [$this->equalTo('core'), $this->equalTo('filetypes/foo.png')], + [$this->equalTo('core'), $this->equalTo('filetypes/file.png')] + ) + ->will($this->returnCallback( + function($appName, $file) { + if ($file === 'filetypes/file.png') { + return 'file.svg'; + } + throw new \RuntimeException(); + } + )); + + $detection = new Detection($urlGenerator, $confDir->url()); + $mimeType = $detection->mimeTypeIcon('foo-bar'); + $this->assertEquals('file.svg', $mimeType); + + /* + * Test chaching + */ + + //Mock UrlGenerator + $urlGenerator = $this->getMockBuilder('\OCP\IURLGenerator') + ->disableOriginalConstructor() + ->getMock(); + + //Only call the url generator once + $urlGenerator->expects($this->once()) + ->method('imagePath') + ->with($this->equalTo('core'), $this->equalTo('filetypes/foo-bar.png')) + ->willReturn('foo-bar.svg'); + + $detection = new Detection($urlGenerator, $confDir->url()); + $mimeType = $detection->mimeTypeIcon('foo-bar'); + $this->assertEquals('foo-bar.svg', $mimeType); + $mimeType = $detection->mimeTypeIcon('foo-bar'); + $this->assertEquals('foo-bar.svg', $mimeType); + + + + /* + * Test aliases + */ + + //Put alias + $mimetypealiases_dist->setContent(json_encode(['foo' => 'foobar/baz'], JSON_FORCE_OBJECT)); + + //Mock UrlGenerator + $urlGenerator = $this->getMockBuilder('\OCP\IURLGenerator') + ->disableOriginalConstructor() + ->getMock(); + + //Only call the url generator once + $urlGenerator->expects($this->once()) + ->method('imagePath') + ->with($this->equalTo('core'), $this->equalTo('filetypes/foobar-baz.png')) + ->willReturn('foobar-baz.svg'); + + $detection = new Detection($urlGenerator, $confDir->url()); + $mimeType = $detection->mimeTypeIcon('foo'); + $this->assertEquals('foobar-baz.svg', $mimeType); + } +} diff --git a/tests/lib/share/share.php b/tests/lib/share/share.php index 52511810efa..b6d3e16826d 100644 --- a/tests/lib/share/share.php +++ b/tests/lib/share/share.php @@ -1531,6 +1531,42 @@ class Test_Share extends \Test\TestCase { \OC\Share\Share::setPassword($userSession, $connection, $config, 1, 'pass'); } + /** + * Make sure that a user cannot have multiple identical shares to remote users + */ + public function testOnlyOneRemoteShare() { + $oldHttpHelper = \OC::$server->query('HTTPHelper'); + $httpHelperMock = $this->getMockBuilder('OC\HttpHelper') + ->disableOriginalConstructor() + ->getMock(); + $this->setHttpHelper($httpHelperMock); + + $httpHelperMock->expects($this->at(0)) + ->method('post') + ->with($this->stringStartsWith('https://localhost/ocs/v1.php/cloud/shares'), $this->anything()) + ->willReturn(['success' => true, 'result' => json_encode(['ocs' => ['meta' => ['statuscode' => 100]]])]); + + \OCP\Share::shareItem('test', 'test.txt', \OCP\Share::SHARE_TYPE_REMOTE, 'foo@localhost', \OCP\Constants::PERMISSION_READ); + $shares = \OCP\Share::getItemShared('test', 'test.txt'); + $share = array_shift($shares); + + //Try share again + try { + \OCP\Share::shareItem('test', 'test.txt', \OCP\Share::SHARE_TYPE_REMOTE, 'foo@localhost', \OCP\Constants::PERMISSION_READ); + $this->fail('Identical remote shares are not allowed'); + } catch (\Exception $e) { + $this->assertEquals('Sharing test.txt failed, because this item is already shared with foo@localhost', $e->getMessage()); + } + + $httpHelperMock->expects($this->at(0)) + ->method('post') + ->with($this->stringStartsWith('https://localhost/ocs/v1.php/cloud/shares/' . $share['id'] . '/unshare'), $this->anything()) + ->willReturn(['success' => true, 'result' => json_encode(['ocs' => ['meta' => ['statuscode' => 100]]])]); + + \OCP\Share::unshare('test', 'test.txt', \OCP\Share::SHARE_TYPE_REMOTE, 'foo@localhost'); + $this->setHttpHelper($oldHttpHelper); + } + } class DummyShareClass extends \OC\Share\Share { diff --git a/tests/settings/controller/CheckSetupControllerTest.php b/tests/settings/controller/CheckSetupControllerTest.php index b39d13ac26b..6096aae8652 100644 --- a/tests/settings/controller/CheckSetupControllerTest.php +++ b/tests/settings/controller/CheckSetupControllerTest.php @@ -24,6 +24,7 @@ namespace OC\Settings\Controller; use OCP\AppFramework\Http\DataResponse; use OCP\Http\Client\IClientService; use OCP\IConfig; +use OCP\IL10N; use OCP\IRequest; use OCP\IURLGenerator; use OC_Util; @@ -47,6 +48,8 @@ class CheckSetupControllerTest extends TestCase { private $urlGenerator; /** @var OC_Util */ private $util; + /** @var IL10N */ + private $l10n; public function setUp() { parent::setUp(); @@ -63,15 +66,24 @@ class CheckSetupControllerTest extends TestCase { ->disableOriginalConstructor()->getMock(); $this->urlGenerator = $this->getMockBuilder('\OCP\IURLGenerator') ->disableOriginalConstructor()->getMock(); - - $this->checkSetupController = new CheckSetupController( - 'settings', - $this->request, - $this->config, - $this->clientService, - $this->urlGenerator, - $this->util - ); + $this->l10n = $this->getMockBuilder('\OCP\IL10N') + ->disableOriginalConstructor()->getMock(); + $this->l10n->expects($this->any()) + ->method('t') + ->will($this->returnCallback(function($message, array $replace) { + return vsprintf($message, $replace); + })); + $this->checkSetupController = $this->getMockBuilder('\OC\Settings\Controller\CheckSetupController') + ->setConstructorArgs([ + 'settings', + $this->request, + $this->config, + $this->clientService, + $this->urlGenerator, + $this->util, + $this->l10n, + ]) + ->setMethods(['getCurlVersion'])->getMock(); } public function testIsInternetConnectionWorkingDisabledViaConfig() { @@ -241,8 +253,134 @@ class CheckSetupControllerTest extends TestCase { 'memcacheDocs' => 'http://doc.owncloud.org/server/go.php?to=admin-performance', 'isUrandomAvailable' => self::invokePrivate($this->checkSetupController, 'isUrandomAvailable'), 'securityDocs' => 'https://doc.owncloud.org/server/8.1/admin_manual/configuration_server/hardening.html', + 'isUsedTlsLibOutdated' => '', ] ); $this->assertEquals($expected, $this->checkSetupController->check()); } + + public function testGetCurlVersion() { + $checkSetupController = $this->getMockBuilder('\OC\Settings\Controller\CheckSetupController') + ->setConstructorArgs([ + 'settings', + $this->request, + $this->config, + $this->clientService, + $this->urlGenerator, + $this->util, + $this->l10n, + ]) + ->setMethods(null)->getMock(); + + $this->assertArrayHasKey('ssl_version', $checkSetupController->getCurlVersion()); + } + + public function testIsUsedTlsLibOutdatedWithAnotherLibrary() { + $this->checkSetupController + ->expects($this->once()) + ->method('getCurlVersion') + ->will($this->returnValue(['ssl_version' => 'SSLlib'])); + $this->assertSame('', $this->invokePrivate($this->checkSetupController, 'isUsedTlsLibOutdated')); + } + + public function testIsUsedTlsLibOutdatedWithMisbehavingCurl() { + $this->checkSetupController + ->expects($this->once()) + ->method('getCurlVersion') + ->will($this->returnValue([])); + $this->assertSame('', $this->invokePrivate($this->checkSetupController, 'isUsedTlsLibOutdated')); + } + + public function testIsUsedTlsLibOutdatedWithOlderOpenSsl() { + $this->checkSetupController + ->expects($this->once()) + ->method('getCurlVersion') + ->will($this->returnValue(['ssl_version' => 'OpenSSL/1.0.1c'])); + $this->assertSame('cURL is using an outdated OpenSSL version (OpenSSL/1.0.1c). Please update your operating system or features such as installing and updating apps via the app store or Federated Cloud Sharing will not work reliably.', $this->invokePrivate($this->checkSetupController, 'isUsedTlsLibOutdated')); + } + + public function testIsUsedTlsLibOutdatedWithOlderOpenSsl1() { + $this->checkSetupController + ->expects($this->once()) + ->method('getCurlVersion') + ->will($this->returnValue(['ssl_version' => 'OpenSSL/1.0.2a'])); + $this->assertSame('cURL is using an outdated OpenSSL version (OpenSSL/1.0.2a). Please update your operating system or features such as installing and updating apps via the app store or Federated Cloud Sharing will not work reliably.', $this->invokePrivate($this->checkSetupController, 'isUsedTlsLibOutdated')); + } + + public function testIsUsedTlsLibOutdatedWithMatchingOpenSslVersion() { + $this->checkSetupController + ->expects($this->once()) + ->method('getCurlVersion') + ->will($this->returnValue(['ssl_version' => 'OpenSSL/1.0.1d'])); + $this->assertSame('', $this->invokePrivate($this->checkSetupController, 'isUsedTlsLibOutdated')); + } + + public function testIsUsedTlsLibOutdatedWithMatchingOpenSslVersion1() { + $this->checkSetupController + ->expects($this->once()) + ->method('getCurlVersion') + ->will($this->returnValue(['ssl_version' => 'OpenSSL/1.0.2b'])); + $this->assertSame('', $this->invokePrivate($this->checkSetupController, 'isUsedTlsLibOutdated')); + } + + public function testIsBuggyNss400() { + $this->checkSetupController + ->expects($this->once()) + ->method('getCurlVersion') + ->will($this->returnValue(['ssl_version' => 'NSS/1.0.2b'])); + $client = $this->getMockBuilder('\OCP\Http\Client\IClient') + ->disableOriginalConstructor()->getMock(); + $exception = $this->getMockBuilder('\GuzzleHttp\Exception\ClientException') + ->disableOriginalConstructor()->getMock(); + $response = $this->getMockBuilder('\GuzzleHttp\Message\ResponseInterface') + ->disableOriginalConstructor()->getMock(); + $response->expects($this->once()) + ->method('getStatusCode') + ->will($this->returnValue(400)); + $exception->expects($this->once()) + ->method('getResponse') + ->will($this->returnValue($response)); + + $client->expects($this->at(0)) + ->method('get') + ->with('https://www.owncloud.org/', []) + ->will($this->throwException($exception)); + + $this->clientService->expects($this->once()) + ->method('newClient') + ->will($this->returnValue($client)); + + $this->assertSame('cURL is using an outdated NSS version (NSS/1.0.2b). Please update your operating system or features such as installing and updating apps via the app store or Federated Cloud Sharing will not work reliably.', $this->invokePrivate($this->checkSetupController, 'isUsedTlsLibOutdated')); + } + + + public function testIsBuggyNss200() { + $this->checkSetupController + ->expects($this->once()) + ->method('getCurlVersion') + ->will($this->returnValue(['ssl_version' => 'NSS/1.0.2b'])); + $client = $this->getMockBuilder('\OCP\Http\Client\IClient') + ->disableOriginalConstructor()->getMock(); + $exception = $this->getMockBuilder('\GuzzleHttp\Exception\ClientException') + ->disableOriginalConstructor()->getMock(); + $response = $this->getMockBuilder('\GuzzleHttp\Message\ResponseInterface') + ->disableOriginalConstructor()->getMock(); + $response->expects($this->once()) + ->method('getStatusCode') + ->will($this->returnValue(200)); + $exception->expects($this->once()) + ->method('getResponse') + ->will($this->returnValue($response)); + + $client->expects($this->at(0)) + ->method('get') + ->with('https://www.owncloud.org/', []) + ->will($this->throwException($exception)); + + $this->clientService->expects($this->once()) + ->method('newClient') + ->will($this->returnValue($client)); + + $this->assertSame('', $this->invokePrivate($this->checkSetupController, 'isUsedTlsLibOutdated')); + } } diff --git a/tests/settings/controller/EncryptionControllerTest.php b/tests/settings/controller/EncryptionControllerTest.php new file mode 100644 index 00000000000..2446b8c7b9e --- /dev/null +++ b/tests/settings/controller/EncryptionControllerTest.php @@ -0,0 +1,151 @@ +<?php +/** + * @author Lukas Reschke <lukas@owncloud.com> + * + * @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 <http://www.gnu.org/licenses/> + * + */ + +namespace OC\Settings\Controller; + +use OC\DB\Connection; +use OC\Files\View; +use OCP\IConfig; +use OCP\IL10N; +use OCP\ILogger; +use OCP\IRequest; +use OCP\IUserManager; +use Test\TestCase; + +/** + * Class EncryptionControllerTest + * + * @package OC\Settings\Controller + */ +class EncryptionControllerTest extends TestCase { + /** @var IRequest */ + private $request; + /** @var IL10N */ + private $l10n; + /** @var IConfig */ + private $config; + /** @var Connection */ + private $connection; + /** @var IUserManager */ + private $userManager; + /** @var View */ + private $view; + /** @var ILogger */ + private $logger; + /** @var EncryptionController */ + private $encryptionController; + + public function setUp() { + $this->request = $this->getMockBuilder('\\OCP\\IRequest') + ->disableOriginalConstructor()->getMock(); + $this->l10n = $this->getMockBuilder('\\OCP\\IL10N') + ->disableOriginalConstructor()->getMock(); + $this->l10n->expects($this->any()) + ->method('t') + ->will($this->returnCallback(function($message, array $replace) { + return vsprintf($message, $replace); + })); + $this->config = $this->getMockBuilder('\\OCP\\IConfig') + ->disableOriginalConstructor()->getMock(); + $this->connection = $this->getMockBuilder('\\OC\\DB\\Connection') + ->disableOriginalConstructor()->getMock(); + $this->userManager = $this->getMockBuilder('\\OCP\\IUserManager') + ->disableOriginalConstructor()->getMock(); + $this->view = $this->getMockBuilder('\\OC\\Files\\View') + ->disableOriginalConstructor()->getMock(); + $this->logger = $this->getMockBuilder('\\OCP\\ILogger') + ->disableOriginalConstructor()->getMock(); + + $this->encryptionController = $this->getMockBuilder('\\OC\\Settings\\Controller\\EncryptionController') + ->setConstructorArgs([ + 'settings', + $this->request, + $this->l10n, + $this->config, + $this->connection, + $this->userManager, + $this->view, + $this->logger, + ]) + ->setMethods(['getMigration']) + ->getMock(); + } + + public function testStartMigrationSuccessful() { + $migration = $this->getMockBuilder('\\OCA\\Encryption\\Migration') + ->disableOriginalConstructor()->getMock(); + $this->encryptionController + ->expects($this->once()) + ->method('getMigration') + ->with($this->config, $this->view, $this->connection, $this->logger) + ->will($this->returnValue($migration)); + $migration + ->expects($this->once()) + ->method('reorganizeSystemFolderStructure'); + $migration + ->expects($this->once()) + ->method('updateDB'); + $backend = $this->getMockBuilder('\OCP\UserInterface') + ->getMock(); + $this->userManager + ->expects($this->once()) + ->method('getBackends') + ->will($this->returnValue([$backend])); + $backend + ->expects($this->once()) + ->method('getUsers') + ->will($this->returnValue(['User 1', 'User 2'])); + $migration + ->expects($this->exactly(2)) + ->method('reorganizeFolderStructureForUser') + ->withConsecutive( + ['User 1'], + ['User 2'] + ); + $migration + ->expects($this->once()) + ->method('finalCleanUp'); + + $expected = [ + 'data' => [ + 'message' => 'Migration Completed', + ], + 'status' => 'success', + ]; + $this->assertSame($expected, $this->encryptionController->startMigration()); + } + + public function testStartMigrationException() { + $this->encryptionController + ->expects($this->once()) + ->method('getMigration') + ->with($this->config, $this->view, $this->connection, $this->logger) + ->will($this->throwException(new \Exception('My error message'))); + + $expected = [ + 'data' => [ + 'message' => 'A problem occurred, please check your log files (Error: My error message)', + ], + 'status' => 'error', + ]; + $this->assertSame($expected, $this->encryptionController->startMigration()); + } +} |