diff options
313 files changed, 5667 insertions, 1046 deletions
diff --git a/.htaccess b/.htaccess index 9dc2983a643..f656d6de444 100644 --- a/.htaccess +++ b/.htaccess @@ -49,9 +49,6 @@ # Rewrite rules for `front_controller_active` Options -MultiViews - <IfModule mod_dir.c> - DirectorySlash off - </IfModule> RewriteRule ^core/js/oc.js$ index.php/core/js/oc.js [PT,E=PATH_INFO:$1] RewriteRule ^core/preview.png$ index.php/core/preview.png [PT,E=PATH_INFO:$1] RewriteCond %{REQUEST_FILENAME} !\.(css|js|svg|gif|png|html|ttf|woff)$ diff --git a/3rdparty b/3rdparty -Subproject a7b34d6f831c8fa363f389d27acd0150128fc0b +Subproject 8face268eb0db84b3a53b84f6c2a3d4ab555e61 diff --git a/apps/dav/lib/connector/sabre/auth.php b/apps/dav/lib/connector/sabre/auth.php index 4f319770234..7f4f4a531b1 100644 --- a/apps/dav/lib/connector/sabre/auth.php +++ b/apps/dav/lib/connector/sabre/auth.php @@ -160,7 +160,7 @@ class Auth extends AbstractBasic { return [true, $this->principalPrefix . $user]; } - if (!$this->userSession->isLoggedIn() && $request->getHeader('X-Requested-With') === 'XMLHttpRequest') { + if (!$this->userSession->isLoggedIn() && in_array('XMLHttpRequest', explode(',', $request->getHeader('X-Requested-With')))) { // do not re-authenticate over ajax, use dummy auth name to prevent browser popup $response->addHeader('WWW-Authenticate','DummyBasic realm="' . $this->realm . '"'); $response->setStatus(401); diff --git a/apps/dav/lib/connector/sabre/filesplugin.php b/apps/dav/lib/connector/sabre/filesplugin.php index 1c78e9dc845..aa756281745 100644 --- a/apps/dav/lib/connector/sabre/filesplugin.php +++ b/apps/dav/lib/connector/sabre/filesplugin.php @@ -31,6 +31,7 @@ use \Sabre\DAV\PropFind; use \Sabre\DAV\PropPatch; use \Sabre\HTTP\RequestInterface; use \Sabre\HTTP\ResponseInterface; +use OCP\Files\StorageNotAvailableException; class FilesPlugin extends \Sabre\DAV\ServerPlugin { @@ -225,9 +226,13 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin { if ($node instanceof \OCA\DAV\Connector\Sabre\File) { $propFind->handle(self::DOWNLOADURL_PROPERTYNAME, function() use ($node) { /** @var $node \OCA\DAV\Connector\Sabre\File */ - $directDownloadUrl = $node->getDirectDownload(); - if (isset($directDownloadUrl['url'])) { - return $directDownloadUrl['url']; + try { + $directDownloadUrl = $node->getDirectDownload(); + if (isset($directDownloadUrl['url'])) { + return $directDownloadUrl['url']; + } + } catch (StorageNotAvailableException $e) { + return false; } return false; }); diff --git a/apps/dav/lib/rootcollection.php b/apps/dav/lib/rootcollection.php index c1635c9cde5..9ee32822bbd 100644 --- a/apps/dav/lib/rootcollection.php +++ b/apps/dav/lib/rootcollection.php @@ -33,6 +33,13 @@ class RootCollection extends SimpleCollection { $caldavBackend = new CalDavBackend($db); $calendarRoot = new CalendarRoot($principalBackend, $caldavBackend, 'principals/users'); $calendarRoot->disableListing = $disableListing; + $systemTagCollection = new SystemTag\SystemTagsByIdCollection( + \OC::$server->getSystemTagManager() + ); + $systemTagRelationsCollection = new SystemTag\SystemTagsRelationsCollection( + \OC::$server->getSystemTagManager(), + \OC::$server->getSystemTagObjectMapper() + ); $usersCardDavBackend = new CardDavBackend($db, $principalBackend); $usersAddressBookRoot = new AddressBookRoot($principalBackend, $usersCardDavBackend, 'principals/users'); @@ -51,6 +58,8 @@ class RootCollection extends SimpleCollection { new SimpleCollection('addressbooks', [ $usersAddressBookRoot, $systemAddressBookRoot]), + $systemTagCollection, + $systemTagRelationsCollection, ]; parent::__construct('root', $children); diff --git a/apps/dav/lib/server.php b/apps/dav/lib/server.php index a031f2c442b..ffcbb02db70 100644 --- a/apps/dav/lib/server.php +++ b/apps/dav/lib/server.php @@ -60,6 +60,9 @@ class Server { // addressbook plugins $this->server->addPlugin(new \OCA\DAV\CardDAV\Plugin()); + // system tags plugins + $this->server->addPlugin(new \OCA\DAV\SystemTag\SystemTagPlugin(\OC::$server->getSystemTagManager())); + // Finder on OS X requires Class 2 WebDAV support (locking), since we do // not provide locking we emulate it using a fake locking plugin. if($request->isUserAgent(['/WebDAVFS/'])) { diff --git a/apps/dav/lib/systemtag/systemtagmappingnode.php b/apps/dav/lib/systemtag/systemtagmappingnode.php new file mode 100644 index 00000000000..cbf8542a4fd --- /dev/null +++ b/apps/dav/lib/systemtag/systemtagmappingnode.php @@ -0,0 +1,102 @@ +<?php +/** + * @author Vincent Petry <pvince81@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 OCA\DAV\SystemTag; + +use Sabre\DAV\Exception\NotFound; + +use OCP\SystemTag\ISystemTag; +use OCP\SystemTag\ISystemTagManager; +use OCP\SystemTag\ISystemTagObjectMapper; +use OCP\SystemTag\TagNotFoundException; + +/** + * Mapping node for system tag to object id + */ +class SystemTagMappingNode extends SystemTagNode { + + /** + * @var ISystemTagObjectMapper + */ + private $tagMapper; + + /** + * @var string + */ + private $objectId; + + /** + * @var string + */ + private $objectType; + + /** + * Sets up the node, expects a full path name + * + * @param ISystemTag $tag system tag + * @param string $objectId + * @param string $objectType + * @param ISystemTagManager $tagManager + * @param ISystemTagObjectMapper $tagMapper + */ + public function __construct( + ISystemTag $tag, + $objectId, + $objectType, + ISystemTagManager $tagManager, + ISystemTagObjectMapper $tagMapper + ) { + $this->objectId = $objectId; + $this->objectType = $objectType; + $this->tagMapper = $tagMapper; + parent::__construct($tag, $tagManager); + } + + /** + * Returns the object id of the relationship + * + * @return string object id + */ + public function getObjectId() { + return $this->objectId; + } + + /** + * Returns the object type of the relationship + * + * @return string object type + */ + public function getObjectType() { + return $this->objectType; + } + + /** + * Delete tag to object association + */ + public function delete() { + try { + $this->tagMapper->unassignTags($this->objectId, $this->objectType, $this->tag->getId()); + } catch (TagNotFoundException $e) { + // can happen if concurrent deletion occurred + throw new NotFound('Tag with id ' . $this->tag->getId() . ' not found', 0, $e); + } + } +} diff --git a/apps/dav/lib/systemtag/systemtagnode.php b/apps/dav/lib/systemtag/systemtagnode.php new file mode 100644 index 00000000000..7ab4a8a14f4 --- /dev/null +++ b/apps/dav/lib/systemtag/systemtagnode.php @@ -0,0 +1,126 @@ +<?php +/** + * @author Vincent Petry <pvince81@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 OCA\DAV\SystemTag; + +use Sabre\DAV\Exception\NotFound; +use Sabre\DAV\Exception\MethodNotAllowed; +use Sabre\DAV\Exception\Conflict; + +use OCP\SystemTag\ISystemTag; +use OCP\SystemTag\ISystemTagManager; +use OCP\SystemTag\TagNotFoundException; +use OCP\SystemTag\TagAlreadyExistsException; + +/** + * DAV node representing a system tag, with the name being the tag id. + */ +class SystemTagNode implements \Sabre\DAV\INode { + + /** + * @var ISystemTag + */ + protected $tag; + + /** + * @var ISystemTagManager + */ + protected $tagManager; + + /** + * Sets up the node, expects a full path name + * + * @param ISystemTag $tag system tag + * @param ISystemTagManager $tagManager + */ + public function __construct(ISystemTag $tag, ISystemTagManager $tagManager) { + $this->tag = $tag; + $this->tagManager = $tagManager; + } + + /** + * Returns the id of the tag + * + * @return string + */ + public function getName() { + return $this->tag->getId(); + } + + /** + * Returns the system tag represented by this node + * + * @return ISystemTag system tag + */ + public function getSystemTag() { + return $this->tag; + } + + /** + * Renames the node + * + * @param string $name The new name + * + * @throws MethodNotAllowed not allowed to rename node + */ + public function setName($name) { + throw new MethodNotAllowed(); + } + + /** + * Update tag + * + * @param string $name new tag name + * @param bool $userVisible user visible + * @param bool $userAssignable user assignable + * @throws NotFound whenever the given tag id does not exist + * @throws Conflict whenever a tag already exists with the given attributes + */ + public function update($name, $userVisible, $userAssignable) { + try { + $this->tagManager->updateTag($this->tag->getId(), $name, $userVisible, $userAssignable); + } catch (TagNotFoundException $e) { + throw new NotFound('Tag with id ' . $this->tag->getId() . ' does not exist'); + } catch (TagAlreadyExistsException $e) { + throw new Conflict( + 'Tag with the properties "' . $name . '", ' . + $userVisible . ', ' . $userAssignable . ' already exists' + ); + } + } + + /** + * Returns null, not supported + * + */ + public function getLastModified() { + return null; + } + + public function delete() { + try { + $this->tagManager->deleteTags($this->tag->getId()); + } catch (TagNotFoundException $e) { + // can happen if concurrent deletion occurred + throw new NotFound('Tag with id ' . $this->tag->getId() . ' not found', 0, $e); + } + } +} diff --git a/apps/dav/lib/systemtag/systemtagplugin.php b/apps/dav/lib/systemtag/systemtagplugin.php new file mode 100644 index 00000000000..51db0632549 --- /dev/null +++ b/apps/dav/lib/systemtag/systemtagplugin.php @@ -0,0 +1,249 @@ +<?php +/** + * @author Vincent Petry <pvince81@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 OCA\DAV\SystemTag; + +use Sabre\DAV\Exception\NotFound; +use Sabre\DAV\PropFind; +use Sabre\DAV\PropPatch; +use Sabre\DAV\Exception\BadRequest; +use Sabre\DAV\Exception\UnsupportedMediaType; +use Sabre\DAV\Exception\Conflict; + +use OCP\SystemTag\ISystemTag; +use OCP\SystemTag\ISystemTagManager; +use OCP\SystemTag\TagAlreadyExistsException; +use Sabre\HTTP\RequestInterface; +use Sabre\HTTP\ResponseInterface; + +/** + * Sabre plugin to handle system tags: + * + * - makes it possible to create new tags with POST operation + * - get/set Webdav properties for tags + * + */ +class SystemTagPlugin extends \Sabre\DAV\ServerPlugin { + + // namespace + const NS_OWNCLOUD = 'http://owncloud.org/ns'; + const ID_PROPERTYNAME = '{http://owncloud.org/ns}id'; + const DISPLAYNAME_PROPERTYNAME = '{http://owncloud.org/ns}display-name'; + const USERVISIBLE_PROPERTYNAME = '{http://owncloud.org/ns}user-visible'; + const USERASSIGNABLE_PROPERTYNAME = '{http://owncloud.org/ns}user-assignable'; + + /** + * @var \Sabre\DAV\Server $server + */ + private $server; + + /** + * @var ISystemTagManager + */ + protected $tagManager; + + /** + * System tags plugin + * + * @param ISystemTagManager $tagManager tag manager + */ + public function __construct(ISystemTagManager $tagManager) { + $this->tagManager = $tagManager; + } + + /** + * This initializes the plugin. + * + * This function is called by \Sabre\DAV\Server, after + * addPlugin is called. + * + * This method should set up the required event subscriptions. + * + * @param \Sabre\DAV\Server $server + * @return void + */ + public function initialize(\Sabre\DAV\Server $server) { + + $server->xml->namespaceMap[self::NS_OWNCLOUD] = 'oc'; + + $server->protectedProperties[] = self::ID_PROPERTYNAME; + + $server->on('propFind', array($this, 'handleGetProperties')); + $server->on('propPatch', array($this, 'handleUpdateProperties')); + $server->on('method:POST', [$this, 'httpPost']); + + $this->server = $server; + } + + /** + * POST operation on system tag collections + * + * @param RequestInterface $request request object + * @param ResponseInterface $response response object + * @return null|false + */ + public function httpPost(RequestInterface $request, ResponseInterface $response) { + $path = $request->getPath(); + + // Making sure the node exists + try { + $node = $this->server->tree->getNodeForPath($path); + } catch (NotFound $e) { + return null; + } + + if ($node instanceof SystemTagsByIdCollection || $node instanceof SystemTagsObjectMappingCollection) { + $data = $request->getBodyAsString(); + + $tag = $this->createTag($data, $request->getHeader('Content-Type')); + + if ($node instanceof SystemTagsObjectMappingCollection) { + // also add to collection + $node->createFile($tag->getId()); + $url = $request->getBaseUrl() . 'systemtags/'; + } else { + $url = $request->getUrl(); + } + + if ($url[strlen($url) - 1] !== '/') { + $url .= '/'; + } + + $response->setHeader('Location', $url . $tag->getId()); + + // created + $response->setStatus(201); + return false; + } + } + + /** + * Creates a new tag + * + * @param string $data JSON encoded string containing the properties of the tag to create + * @param string $contentType content type of the data + * @return ISystemTag newly created system tag + * + * @throws BadRequest if a field was missing + * @throws Conflict if a tag with the same properties already exists + * @throws UnsupportedMediaType if the content type is not supported + */ + private function createTag($data, $contentType = 'application/json') { + if ($contentType === 'application/json') { + $data = json_decode($data, true); + } else { + throw new UnsupportedMediaType(); + } + + if (!isset($data['name'])) { + throw new BadRequest('Missing "name" attribute'); + } + + $tagName = $data['name']; + $userVisible = true; + $userAssignable = true; + + if (isset($data['userVisible'])) { + $userVisible = (bool)$data['userVisible']; + } + + if (isset($data['userAssignable'])) { + $userAssignable = (bool)$data['userAssignable']; + } + try { + return $this->tagManager->createTag($tagName, $userVisible, $userAssignable); + } catch (TagAlreadyExistsException $e) { + throw new Conflict('Tag already exists', 0, $e); + } + } + + + /** + * Retrieves system tag properties + * + * @param PropFind $propFind + * @param \Sabre\DAV\INode $node + */ + public function handleGetProperties( + PropFind $propFind, + \Sabre\DAV\INode $node + ) { + if (!($node instanceof SystemTagNode)) { + return; + } + + $propFind->handle(self::ID_PROPERTYNAME, function() use ($node) { + return $node->getSystemTag()->getId(); + }); + + $propFind->handle(self::DISPLAYNAME_PROPERTYNAME, function() use ($node) { + return $node->getSystemTag()->getName(); + }); + + $propFind->handle(self::USERVISIBLE_PROPERTYNAME, function() use ($node) { + return (int)$node->getSystemTag()->isUserVisible(); + }); + + $propFind->handle(self::USERASSIGNABLE_PROPERTYNAME, function() use ($node) { + return (int)$node->getSystemTag()->isUserAssignable(); + }); + } + + /** + * Updates tag attributes + * + * @param string $path + * @param PropPatch $propPatch + * + * @return void + */ + public function handleUpdateProperties($path, PropPatch $propPatch) { + $propPatch->handle([ + self::DISPLAYNAME_PROPERTYNAME, + self::USERVISIBLE_PROPERTYNAME, + self::USERASSIGNABLE_PROPERTYNAME, + ], function($props) use ($path) { + $node = $this->server->tree->getNodeForPath($path); + if (!($node instanceof SystemTagNode)) { + return; + } + + $tag = $node->getSystemTag(); + $name = $tag->getName(); + $userVisible = $tag->isUserVisible(); + $userAssignable = $tag->isUserAssignable(); + + if (isset($props[self::DISPLAYNAME_PROPERTYNAME])) { + $name = $props[self::DISPLAYNAME_PROPERTYNAME]; + } + + if (isset($props[self::USERVISIBLE_PROPERTYNAME])) { + $userVisible = (bool)$props[self::USERVISIBLE_PROPERTYNAME]; + } + + if (isset($props[self::USERASSIGNABLE_PROPERTYNAME])) { + $userAssignable = (bool)$props[self::USERASSIGNABLE_PROPERTYNAME]; + } + + $node->update($name, $userVisible, $userAssignable); + return true; + }); + } +} diff --git a/apps/dav/lib/systemtag/systemtagsbyidcollection.php b/apps/dav/lib/systemtag/systemtagsbyidcollection.php new file mode 100644 index 00000000000..974d04efa5f --- /dev/null +++ b/apps/dav/lib/systemtag/systemtagsbyidcollection.php @@ -0,0 +1,131 @@ +<?php +/** + * @author Vincent Petry <pvince81@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 OCA\DAV\SystemTag; + +use Sabre\DAV\Exception\Forbidden; +use Sabre\DAV\Exception\NotFound; +use Sabre\DAV\Exception\BadRequest; +use Sabre\DAV\ICollection; + +use OCP\SystemTag\ISystemTagManager; +use OCP\SystemTag\ISystemTag; +use OCP\SystemTag\TagNotFoundException; + +class SystemTagsByIdCollection implements ICollection { + + /** + * @var ISystemTagManager + */ + private $tagManager; + + /** + * SystemTagsByIdCollection constructor. + * + * @param ISystemTagManager $tagManager + */ + public function __construct($tagManager) { + $this->tagManager = $tagManager; + } + + /** + * @param string $name + * @param resource|string $data Initial payload + * @throws Forbidden + */ + function createFile($name, $data = null) { + throw new Forbidden('Cannot create tags by id'); + } + + /** + * @param string $name + */ + function createDirectory($name) { + throw new Forbidden('Permission denied to create collections'); + } + + /** + * @param string $name + */ + function getChild($name) { + try { + $tags = $this->tagManager->getTagsByIds([$name]); + return $this->makeNode(current($tags)); + } catch (\InvalidArgumentException $e) { + throw new BadRequest('Invalid tag id', 0, $e); + } catch (TagNotFoundException $e) { + throw new NotFound('Tag with id ' . $name . ' not found', 0, $e); + } + } + + function getChildren() { + $tags = $this->tagManager->getAllTags(true); + return array_map(function($tag) { + return $this->makeNode($tag); + }, $tags); + } + + /** + * @param string $name + */ + function childExists($name) { + try { + $this->tagManager->getTagsByIds([$name]); + return true; + } catch (\InvalidArgumentException $e) { + throw new BadRequest('Invalid tag id', 0, $e); + } catch (TagNotFoundException $e) { + return false; + } + } + + function delete() { + throw new Forbidden('Permission denied to delete this collection'); + } + + function getName() { + return 'systemtags'; + } + + function setName($name) { + throw new Forbidden('Permission denied to rename this collection'); + } + + /** + * Returns the last modification time, as a unix timestamp + * + * @return int + */ + function getLastModified() { + return null; + } + + /** + * Create a sabre node for the given system tag + * + * @param ISystemTag $tag + * + * @return SystemTagNode + */ + private function makeNode(ISystemTag $tag) { + return new SystemTagNode($tag, $this->tagManager); + } +} diff --git a/apps/dav/lib/systemtag/systemtagsobjectmappingcollection.php b/apps/dav/lib/systemtag/systemtagsobjectmappingcollection.php new file mode 100644 index 00000000000..89e8620614b --- /dev/null +++ b/apps/dav/lib/systemtag/systemtagsobjectmappingcollection.php @@ -0,0 +1,160 @@ +<?php +/** + * @author Vincent Petry <pvince81@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 OCA\DAV\SystemTag; + +use Sabre\DAV\Exception\Forbidden; +use Sabre\DAV\Exception\NotFound; +use Sabre\DAV\Exception\BadRequest; +use Sabre\DAV\Exception\PreconditionFailed; +use Sabre\DAV\ICollection; + +use OCP\SystemTag\ISystemTagManager; +use OCP\SystemTag\ISystemTagObjectMapper; +use OCP\SystemTag\ISystemTag; +use OCP\SystemTag\TagNotFoundException; + +/** + * Collection containing tags by object id + */ +class SystemTagsObjectMappingCollection implements ICollection { + + /** + * @var string + */ + private $objectId; + + /** + * @var string + */ + private $objectType; + + /** + * @var ISystemTagManager + */ + private $tagManager; + + /** + * @var ISystemTagObjectMapper + */ + private $tagMapper; + + /** + * Constructor + * + * @param string $objectId object id + * @param string $objectType object type + * @param ISystemTagManager $tagManager + * @param ISystemTagObjectMapper $tagMapper + */ + public function __construct($objectId, $objectType, $tagManager, $tagMapper) { + $this->tagManager = $tagManager; + $this->tagMapper = $tagMapper; + $this->objectId = $objectId; + $this->objectType = $objectType; + } + + function createFile($tagId, $data = null) { + try { + $this->tagMapper->assignTags($this->objectId, $this->objectType, $tagId); + } catch (TagNotFoundException $e) { + throw new PreconditionFailed('Tag with id ' . $tagId . ' does not exist, cannot assign'); + } + } + + function createDirectory($name) { + throw new Forbidden('Permission denied to create collections'); + } + + function getChild($tagId) { + try { + if ($this->tagMapper->haveTag([$this->objectId], $this->objectType, $tagId, true)) { + $tag = $this->tagManager->getTagsByIds([$tagId]); + return $this->makeNode(current($tag)); + } + throw new NotFound('Tag with id ' . $tagId . ' not present for object ' . $this->objectId); + } catch (\InvalidArgumentException $e) { + throw new BadRequest('Invalid tag id', 0, $e); + } catch (TagNotFoundException $e) { + throw new NotFound('Tag with id ' . $tagId . ' not found', 0, $e); + } + } + + function getChildren() { + $tagIds = current($this->tagMapper->getTagIdsForObjects([$this->objectId], $this->objectType)); + if (empty($tagIds)) { + return []; + } + $tags = $this->tagManager->getTagsByIds($tagIds); + return array_values(array_map(function($tag) { + return $this->makeNode($tag); + }, $tags)); + } + + function childExists($tagId) { + try { + return ($this->tagMapper->haveTag([$this->objectId], $this->objectType, $tagId, true)); + } catch (\InvalidArgumentException $e) { + throw new BadRequest('Invalid tag id', 0, $e); + } catch (TagNotFoundException $e) { + return false; + } + } + + function delete() { + throw new Forbidden('Permission denied to delete this collection'); + } + + function getName() { + return $this->objectId; + } + + function setName($name) { + throw new Forbidden('Permission denied to rename this collection'); + } + + /** + * Returns the last modification time, as a unix timestamp + * + * @return int + */ + function getLastModified() { + return null; + } + + /** + * Create a sabre node for the mapping of the + * given system tag to the collection's object + * + * @param ISystemTag $tag + * + * @return SystemTagNode + */ + private function makeNode(ISystemTag $tag) { + return new SystemTagMappingNode( + $tag, + $this->objectId, + $this->objectType, + $this->tagManager, + $this->tagMapper + ); + } +} diff --git a/apps/dav/lib/systemtag/systemtagsobjecttypecollection.php b/apps/dav/lib/systemtag/systemtagsobjecttypecollection.php new file mode 100644 index 00000000000..2a28b9c83aa --- /dev/null +++ b/apps/dav/lib/systemtag/systemtagsobjecttypecollection.php @@ -0,0 +1,127 @@ +<?php +/** + * @author Vincent Petry <pvince81@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 OCA\DAV\SystemTag; + +use Sabre\DAV\Exception\Forbidden; +use Sabre\DAV\Exception\MethodNotAllowed; +use Sabre\DAV\ICollection; + +use OCP\SystemTag\ISystemTagManager; +use OCP\SystemTag\ISystemTagObjectMapper; + +/** + * Collection containing object ids by object type + */ +class SystemTagsObjectTypeCollection implements ICollection { + + /** + * @var string + */ + private $objectType; + + /** + * @var ISystemTagManager + */ + private $tagManager; + + /** + * @var ISystemTagObjectMapper + */ + private $tagMapper; + + /** + * Constructor + * + * @param string $objectType object type + * @param ISystemTagManager $tagManager + * @param ISystemTagObjectMapper $tagMapper + */ + public function __construct($objectType, $tagManager, $tagMapper) { + $this->tagManager = $tagManager; + $this->tagMapper = $tagMapper; + $this->objectType = $objectType; + } + + /** + * @param string $name + * @param resource|string $data Initial payload + * @throws Forbidden + */ + function createFile($name, $data = null) { + throw new Forbidden('Permission denied to create nodes'); + } + + /** + * @param string $name + */ + function createDirectory($name) { + throw new Forbidden('Permission denied to create collections'); + } + + /** + * @param string $objectId + */ + function getChild($objectId) { + return new SystemTagsObjectMappingCollection( + $objectId, + $this->objectType, + $this->tagManager, + $this->tagMapper + ); + } + + function getChildren() { + // do not list object ids + throw new MethodNotAllowed(); + } + + /** + * @param string $name + */ + function childExists($name) { + return true; + } + + function delete() { + throw new Forbidden('Permission denied to delete this collection'); + } + + function getName() { + return $this->objectType; + } + + /** + * @param string $name + */ + function setName($name) { + throw new Forbidden('Permission denied to rename this collection'); + } + + /** + * Returns the last modification time, as a unix timestamp + * + * @return int + */ + function getLastModified() { + return null; + } +} diff --git a/apps/dav/lib/systemtag/systemtagsrelationscollection.php b/apps/dav/lib/systemtag/systemtagsrelationscollection.php new file mode 100644 index 00000000000..44069bca02c --- /dev/null +++ b/apps/dav/lib/systemtag/systemtagsrelationscollection.php @@ -0,0 +1,53 @@ +<?php +/** + * @author Vincent Petry <pvince81@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 OCA\DAV\SystemTag; + +use OCP\SystemTag\ISystemTagManager; +use OCP\SystemTag\ISystemTagObjectMapper; +use Sabre\DAV\Exception\Forbidden; +use Sabre\DAV\SimpleCollection; + +class SystemTagsRelationsCollection extends SimpleCollection { + + /** + * SystemTagsRelationsCollection constructor. + * + * @param ISystemTagManager $tagManager + * @param ISystemTagObjectMapper $tagMapper + */ + public function __construct($tagManager, $tagMapper) { + $children = [ + new SystemTagsObjectTypeCollection('files', $tagManager, $tagMapper), + ]; + + parent::__construct('root', $children); + } + + function getName() { + return 'systemtags-relations'; + } + + function setName($name) { + throw new Forbidden('Permission denied to rename this collection'); + } + +} diff --git a/apps/dav/tests/unit/connector/sabre/file.php b/apps/dav/tests/unit/connector/sabre/file.php index 2a6cf46ef16..ad4c1d29ed4 100644 --- a/apps/dav/tests/unit/connector/sabre/file.php +++ b/apps/dav/tests/unit/connector/sabre/file.php @@ -48,6 +48,14 @@ class File extends \Test\TestCase { parent::tearDown(); } + private function getMockStorage() { + $storage = $this->getMock('\OCP\Files\Storage'); + $storage->expects($this->any()) + ->method('getId') + ->will($this->returnValue('home::someuser')); + return $storage; + } + /** * @param string $string */ @@ -149,7 +157,7 @@ class File extends \Test\TestCase { ->method('getRelativePath') ->will($this->returnArgument(0)); - $info = new \OC\Files\FileInfo('/test.txt', null, null, array( + $info = new \OC\Files\FileInfo('/test.txt', $this->getMockStorage(), null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); @@ -209,7 +217,7 @@ class File extends \Test\TestCase { $_SERVER['HTTP_OC_CHUNKED'] = true; - $info = new \OC\Files\FileInfo('/test.txt-chunking-12345-2-0', null, null, [ + $info = new \OC\Files\FileInfo('/test.txt-chunking-12345-2-0', $this->getMockStorage(), null, [ 'permissions' => \OCP\Constants::PERMISSION_ALL ], null); $file = new \OCA\DAV\Connector\Sabre\File($view, $info); @@ -219,7 +227,7 @@ class File extends \Test\TestCase { $this->assertNull($file->put('test data one')); $file->releaseLock(ILockingProvider::LOCK_SHARED); - $info = new \OC\Files\FileInfo('/test.txt-chunking-12345-2-1', null, null, [ + $info = new \OC\Files\FileInfo('/test.txt-chunking-12345-2-1', $this->getMockStorage(), null, [ 'permissions' => \OCP\Constants::PERMISSION_ALL ], null); $file = new \OCA\DAV\Connector\Sabre\File($view, $info); @@ -261,7 +269,7 @@ class File extends \Test\TestCase { $info = new \OC\Files\FileInfo( $viewRoot . '/' . ltrim($path, '/'), - null, + $this->getMockStorage(), null, ['permissions' => \OCP\Constants::PERMISSION_ALL], null @@ -450,7 +458,7 @@ class File extends \Test\TestCase { $_SERVER['CONTENT_LENGTH'] = 123456; $_SERVER['REQUEST_METHOD'] = 'PUT'; - $info = new \OC\Files\FileInfo('/test.txt', null, null, array( + $info = new \OC\Files\FileInfo('/test.txt', $this->getMockStorage(), null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); @@ -483,7 +491,7 @@ class File extends \Test\TestCase { // simulate situation where the target file is locked $view->lockFile('/test.txt', ILockingProvider::LOCK_EXCLUSIVE); - $info = new \OC\Files\FileInfo('/' . $this->user . '/files/test.txt', null, null, array( + $info = new \OC\Files\FileInfo('/' . $this->user . '/files/test.txt', $this->getMockStorage(), null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); @@ -518,7 +526,7 @@ class File extends \Test\TestCase { $_SERVER['HTTP_OC_CHUNKED'] = true; - $info = new \OC\Files\FileInfo('/' . $this->user . '/files/test.txt-chunking-12345-2-0', null, null, [ + $info = new \OC\Files\FileInfo('/' . $this->user . '/files/test.txt-chunking-12345-2-0', $this->getMockStorage(), null, [ 'permissions' => \OCP\Constants::PERMISSION_ALL ], null); $file = new \OCA\DAV\Connector\Sabre\File($view, $info); @@ -526,7 +534,7 @@ class File extends \Test\TestCase { $this->assertNull($file->put('test data one')); $file->releaseLock(ILockingProvider::LOCK_SHARED); - $info = new \OC\Files\FileInfo('/' . $this->user . '/files/test.txt-chunking-12345-2-1', null, null, [ + $info = new \OC\Files\FileInfo('/' . $this->user . '/files/test.txt-chunking-12345-2-1', $this->getMockStorage(), null, [ 'permissions' => \OCP\Constants::PERMISSION_ALL ], null); $file = new \OCA\DAV\Connector\Sabre\File($view, $info); @@ -555,7 +563,7 @@ class File extends \Test\TestCase { ->method('getRelativePath') ->will($this->returnArgument(0)); - $info = new \OC\Files\FileInfo('/*', null, null, array( + $info = new \OC\Files\FileInfo('/*', $this->getMockStorage(), null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); $file = new \OCA\DAV\Connector\Sabre\File($view, $info); @@ -591,7 +599,7 @@ class File extends \Test\TestCase { ->method('getRelativePath') ->will($this->returnArgument(0)); - $info = new \OC\Files\FileInfo('/*', null, null, array( + $info = new \OC\Files\FileInfo('/*', $this->getMockStorage(), null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); $file = new \OCA\DAV\Connector\Sabre\File($view, $info); @@ -618,7 +626,7 @@ class File extends \Test\TestCase { $_SERVER['CONTENT_LENGTH'] = 12345; $_SERVER['REQUEST_METHOD'] = 'PUT'; - $info = new \OC\Files\FileInfo('/test.txt', null, null, array( + $info = new \OC\Files\FileInfo('/test.txt', $this->getMockStorage(), null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); @@ -654,7 +662,7 @@ class File extends \Test\TestCase { ->method('unlink') ->will($this->returnValue(true)); - $info = new \OC\Files\FileInfo('/test.txt', null, null, array( + $info = new \OC\Files\FileInfo('/test.txt', $this->getMockStorage(), null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); @@ -672,7 +680,7 @@ class File extends \Test\TestCase { $view = $this->getMock('\OC\Files\View', array()); - $info = new \OC\Files\FileInfo('/test.txt', null, null, array( + $info = new \OC\Files\FileInfo('/test.txt', $this->getMockStorage(), null, array( 'permissions' => 0 ), null); @@ -695,7 +703,7 @@ class File extends \Test\TestCase { ->method('unlink') ->will($this->returnValue(false)); - $info = new \OC\Files\FileInfo('/test.txt', null, null, array( + $info = new \OC\Files\FileInfo('/test.txt', $this->getMockStorage(), null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); @@ -718,7 +726,7 @@ class File extends \Test\TestCase { ->method('unlink') ->willThrowException(new ForbiddenException('', true)); - $info = new \OC\Files\FileInfo('/test.txt', null, null, array( + $info = new \OC\Files\FileInfo('/test.txt', $this->getMockStorage(), null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); @@ -753,7 +761,7 @@ class File extends \Test\TestCase { $path = 'test-locking.txt'; $info = new \OC\Files\FileInfo( '/' . $this->user . '/files/' . $path, - null, + $this->getMockStorage(), null, ['permissions' => \OCP\Constants::PERMISSION_ALL], null @@ -865,7 +873,7 @@ class File extends \Test\TestCase { ->method('fopen') ->will($this->returnValue(false)); - $info = new \OC\Files\FileInfo('/test.txt', null, null, array( + $info = new \OC\Files\FileInfo('/test.txt', $this->getMockStorage(), null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); @@ -883,7 +891,7 @@ class File extends \Test\TestCase { ->method('fopen') ->willThrowException(new ForbiddenException('', true)); - $info = new \OC\Files\FileInfo('/test.txt', null, null, array( + $info = new \OC\Files\FileInfo('/test.txt', $this->getMockStorage(), null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL ), null); diff --git a/apps/dav/tests/unit/connector/sabre/filesplugin.php b/apps/dav/tests/unit/connector/sabre/filesplugin.php index b33c8340f72..642fc3258cd 100644 --- a/apps/dav/tests/unit/connector/sabre/filesplugin.php +++ b/apps/dav/tests/unit/connector/sabre/filesplugin.php @@ -2,6 +2,8 @@ namespace OCA\DAV\Tests\Unit\Connector\Sabre; +use OCP\Files\StorageNotAvailableException; + /** * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com> * This file is licensed under the Affero General Public License version 3 or @@ -143,6 +145,29 @@ class FilesPlugin extends \Test\TestCase { $this->assertEquals(array(self::SIZE_PROPERTYNAME), $propFind->get404Properties()); } + public function testGetPropertiesStorageNotAvailable() { + $node = $this->createTestNode('\OCA\DAV\Connector\Sabre\File'); + + $propFind = new \Sabre\DAV\PropFind( + '/dummyPath', + array( + self::DOWNLOADURL_PROPERTYNAME, + ), + 0 + ); + + $node->expects($this->once()) + ->method('getDirectDownload') + ->will($this->throwException(new StorageNotAvailableException())); + + $this->plugin->handleGetProperties( + $propFind, + $node + ); + + $this->assertEquals(null, $propFind->get(self::DOWNLOADURL_PROPERTYNAME)); + } + public function testGetPublicPermissions() { $this->plugin = new \OCA\DAV\Connector\Sabre\FilesPlugin($this->tree, $this->view, true); $this->plugin->initialize($this->server); diff --git a/apps/dav/tests/unit/systemtag/systemtagmappingnode.php b/apps/dav/tests/unit/systemtag/systemtagmappingnode.php new file mode 100644 index 00000000000..aef62a1acb2 --- /dev/null +++ b/apps/dav/tests/unit/systemtag/systemtagmappingnode.php @@ -0,0 +1,80 @@ +<?php +/** + * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCA\DAV\Tests\Unit\SystemTag; + +use Sabre\DAV\Exception\NotFound; +use OC\SystemTag\SystemTag; +use OCP\SystemTag\TagNotFoundException; + +class SystemTagMappingNode extends SystemTagNode { + + /** + * @var \OCA\DAV\SystemTag\SystemTagMappingNode + */ + private $node; + + /** + * @var \OCP\SystemTag\ISystemTagManager + */ + private $tagManager; + + /** + * @var \OCP\SystemTag\ISystemTagObjectMapper + */ + private $tagMapper; + + /** + * @var \OCP\SystemTag\ISystemTag + */ + private $tag; + + protected function setUp() { + parent::setUp(); + + $this->tag = new SystemTag(1, 'Test', true, false); + $this->tagManager = $this->getMock('\OCP\SystemTag\ISystemTagManager'); + $this->tagMapper = $this->getMock('\OCP\SystemTag\ISystemTagObjectMapper'); + + $this->node = new \OCA\DAV\SystemTag\SystemTagMappingNode( + $this->tag, + 123, + 'files', + $this->tagManager, + $this->tagMapper + ); + } + + public function testGetters() { + parent::testGetters(); + $this->assertEquals(123, $this->node->getObjectId()); + $this->assertEquals('files', $this->node->getObjectType()); + } + + public function testDeleteTag() { + $this->tagManager->expects($this->never()) + ->method('deleteTags'); + $this->tagMapper->expects($this->once()) + ->method('unassignTags') + ->with(123, 'files', 1); + + $this->node->delete(); + } + + /** + * @expectedException Sabre\DAV\Exception\NotFound + */ + public function testDeleteTagNotFound() { + $this->tagMapper->expects($this->once()) + ->method('unassignTags') + ->with(123, 'files', 1) + ->will($this->throwException(new TagNotFoundException())); + + $this->node->delete(); + } +} diff --git a/apps/dav/tests/unit/systemtag/systemtagnode.php b/apps/dav/tests/unit/systemtag/systemtagnode.php new file mode 100644 index 00000000000..a43dda3025d --- /dev/null +++ b/apps/dav/tests/unit/systemtag/systemtagnode.php @@ -0,0 +1,103 @@ +<?php +/** + * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCA\DAV\Tests\Unit\SystemTag; + +use Sabre\DAV\Exception\NotFound; +use Sabre\DAV\Exception\MethodNotAllowed; +use Sabre\DAV\Exception\Conflict; + +use OC\SystemTag\SystemTag; +use OCP\SystemTag\TagNotFoundException; +use OCP\SystemTag\TagAlreadyExistsException; + +class SystemTagNode extends \Test\TestCase { + + /** + * @var \OCA\DAV\SystemTag\SystemTagNode + */ + private $node; + + /** + * @var \OCP\SystemTag\ISystemTagManager + */ + private $tagManager; + + /** + * @var \OCP\SystemTag\ISystemTag + */ + private $tag; + + protected function setUp() { + parent::setUp(); + + $this->tag = new SystemTag(1, 'Test', true, false); + $this->tagManager = $this->getMock('\OCP\SystemTag\ISystemTagManager'); + + $this->node = new \OCA\DAV\SystemTag\SystemTagNode($this->tag, $this->tagManager); + } + + public function testGetters() { + $this->assertEquals('1', $this->node->getName()); + $this->assertEquals($this->tag, $this->node->getSystemTag()); + } + + /** + * @expectedException Sabre\DAV\Exception\MethodNotAllowed + */ + public function testSetName() { + $this->node->setName('2'); + } + + public function testUpdateTag() { + $this->tagManager->expects($this->once()) + ->method('updateTag') + ->with(1, 'Renamed', false, true); + $this->node->update('Renamed', false, true); + } + + /** + * @expectedException Sabre\DAV\Exception\Conflict + */ + public function testUpdateTagAlreadyExists() { + $this->tagManager->expects($this->once()) + ->method('updateTag') + ->with(1, 'Renamed', false, true) + ->will($this->throwException(new TagAlreadyExistsException())); + $this->node->update('Renamed', false, true); + } + + /** + * @expectedException Sabre\DAV\Exception\NotFound + */ + public function testUpdateTagNotFound() { + $this->tagManager->expects($this->once()) + ->method('updateTag') + ->with(1, 'Renamed', false, true) + ->will($this->throwException(new TagNotFoundException())); + $this->node->update('Renamed', false, true); + } + + public function testDeleteTag() { + $this->tagManager->expects($this->once()) + ->method('deleteTags') + ->with('1'); + $this->node->delete(); + } + + /** + * @expectedException Sabre\DAV\Exception\NotFound + */ + public function testDeleteTagNotFound() { + $this->tagManager->expects($this->once()) + ->method('deleteTags') + ->with('1') + ->will($this->throwException(new TagNotFoundException())); + $this->node->delete(); + } +} diff --git a/apps/dav/tests/unit/systemtag/systemtagplugin.php b/apps/dav/tests/unit/systemtag/systemtagplugin.php new file mode 100644 index 00000000000..48c9aa69f7b --- /dev/null +++ b/apps/dav/tests/unit/systemtag/systemtagplugin.php @@ -0,0 +1,308 @@ +<?php +/** + * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCA\DAV\Tests\Unit\SystemTag; + +use OC\SystemTag\SystemTag; +use OCP\SystemTag\TagAlreadyExistsException; + +class SystemTagPlugin extends \Test\TestCase { + + const ID_PROPERTYNAME = \OCA\DAV\SystemTag\SystemTagPlugin::ID_PROPERTYNAME; + const DISPLAYNAME_PROPERTYNAME = \OCA\DAV\SystemTag\SystemTagPlugin::DISPLAYNAME_PROPERTYNAME; + const USERVISIBLE_PROPERTYNAME = \OCA\DAV\SystemTag\SystemTagPlugin::USERVISIBLE_PROPERTYNAME; + const USERASSIGNABLE_PROPERTYNAME = \OCA\DAV\SystemTag\SystemTagPlugin::USERASSIGNABLE_PROPERTYNAME; + + /** + * @var \Sabre\DAV\Server + */ + private $server; + + /** + * @var \Sabre\DAV\Tree + */ + private $tree; + + /** + * @var \OCP\SystemTag\ISystemTagManager + */ + private $tagManager; + + /** + * @var \OCA\DAV\Connector\Sabre\TagsPlugin + */ + private $plugin; + + public function setUp() { + parent::setUp(); + $this->tree = $this->getMockBuilder('\Sabre\DAV\Tree') + ->disableOriginalConstructor() + ->getMock(); + + $this->server = new \Sabre\DAV\Server($this->tree); + + $this->tagManager = $this->getMock('\OCP\SystemTag\ISystemTagManager'); + + $this->plugin = new \OCA\DAV\SystemTag\SystemTagPlugin($this->tagManager); + $this->plugin->initialize($this->server); + } + + public function testGetProperties() { + $systemTag = new SystemTag(1, 'Test', true, true); + $requestedProperties = [ + self::ID_PROPERTYNAME, + self::DISPLAYNAME_PROPERTYNAME, + self::USERVISIBLE_PROPERTYNAME, + self::USERASSIGNABLE_PROPERTYNAME + ]; + $expectedProperties = [ + 200 => [ + self::ID_PROPERTYNAME => '1', + self::DISPLAYNAME_PROPERTYNAME => 'Test', + self::USERVISIBLE_PROPERTYNAME => 1, + self::USERASSIGNABLE_PROPERTYNAME => 1, + ] + ]; + + $node = $this->getMockBuilder('\OCA\DAV\SystemTag\SystemTagNode') + ->disableOriginalConstructor() + ->getMock(); + $node->expects($this->any()) + ->method('getSystemTag') + ->will($this->returnValue($systemTag)); + + $this->tree->expects($this->any()) + ->method('getNodeForPath') + ->with('/systemtag/1') + ->will($this->returnValue($node)); + + $propFind = new \Sabre\DAV\PropFind( + '/systemtag/1', + $requestedProperties, + 0 + ); + + $this->plugin->handleGetProperties( + $propFind, + $node + ); + + $result = $propFind->getResultForMultiStatus(); + + $this->assertEmpty($result[404]); + unset($result[404]); + $this->assertEquals($expectedProperties, $result); + } + + public function testUpdateProperties() { + $systemTag = new SystemTag(1, 'Test', true, false); + $node = $this->getMockBuilder('\OCA\DAV\SystemTag\SystemTagNode') + ->disableOriginalConstructor() + ->getMock(); + $node->expects($this->any()) + ->method('getSystemTag') + ->will($this->returnValue($systemTag)); + + $this->tree->expects($this->any()) + ->method('getNodeForPath') + ->with('/systemtag/1') + ->will($this->returnValue($node)); + + $node->expects($this->once()) + ->method('update') + ->with('Test changed', false, true); + + // properties to set + $propPatch = new \Sabre\DAV\PropPatch(array( + self::DISPLAYNAME_PROPERTYNAME => 'Test changed', + self::USERVISIBLE_PROPERTYNAME => 0, + self::USERASSIGNABLE_PROPERTYNAME => 1, + )); + + $this->plugin->handleUpdateProperties( + '/systemtag/1', + $propPatch + ); + + $propPatch->commit(); + + // all requested properties removed, as they were processed already + $this->assertEmpty($propPatch->getRemainingMutations()); + + $result = $propPatch->getResult(); + $this->assertEquals(200, $result[self::DISPLAYNAME_PROPERTYNAME]); + $this->assertEquals(200, $result[self::USERASSIGNABLE_PROPERTYNAME]); + $this->assertEquals(200, $result[self::USERVISIBLE_PROPERTYNAME]); + } + + public function testCreateTagInByIdCollection() { + $systemTag = new SystemTag(1, 'Test', true, false); + + $requestData = json_encode([ + 'name' => 'Test', + 'userVisible' => true, + 'userAssignable' => false, + ]); + + $node = $this->getMockBuilder('\OCA\DAV\SystemTag\SystemTagsByIdCollection') + ->disableOriginalConstructor() + ->getMock(); + $this->tagManager->expects($this->once()) + ->method('createTag') + ->with('Test', true, false) + ->will($this->returnValue($systemTag)); + + $this->tree->expects($this->any()) + ->method('getNodeForPath') + ->with('/systemtags') + ->will($this->returnValue($node)); + + $request = $this->getMockBuilder('Sabre\HTTP\RequestInterface') + ->disableOriginalConstructor() + ->getMock(); + $response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface') + ->disableOriginalConstructor() + ->getMock(); + + $request->expects($this->once()) + ->method('getPath') + ->will($this->returnValue('/systemtags')); + + $request->expects($this->once()) + ->method('getBodyAsString') + ->will($this->returnValue($requestData)); + + $request->expects($this->once()) + ->method('getHeader') + ->with('Content-Type') + ->will($this->returnValue('application/json')); + + $request->expects($this->once()) + ->method('getUrl') + ->will($this->returnValue('http://example.com/dav/systemtags')); + + $response->expects($this->once()) + ->method('setHeader') + ->with('Location', 'http://example.com/dav/systemtags/1'); + + $this->plugin->httpPost($request, $response); + } + + public function nodeClassProvider() { + return [ + ['\OCA\DAV\SystemTag\SystemTagsByIdCollection'], + ['\OCA\DAV\SystemTag\SystemTagsObjectMappingCollection'], + ]; + } + + public function testCreateTagInMappingCollection() { + $systemTag = new SystemTag(1, 'Test', true, false); + + $requestData = json_encode([ + 'name' => 'Test', + 'userVisible' => true, + 'userAssignable' => false, + ]); + + $node = $this->getMockBuilder('\OCA\DAV\SystemTag\SystemTagsObjectMappingCollection') + ->disableOriginalConstructor() + ->getMock(); + + $this->tagManager->expects($this->once()) + ->method('createTag') + ->with('Test', true, false) + ->will($this->returnValue($systemTag)); + + $this->tree->expects($this->any()) + ->method('getNodeForPath') + ->with('/systemtags-relations/files/12') + ->will($this->returnValue($node)); + + $node->expects($this->once()) + ->method('createFile') + ->with(1); + + $request = $this->getMockBuilder('Sabre\HTTP\RequestInterface') + ->disableOriginalConstructor() + ->getMock(); + $response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface') + ->disableOriginalConstructor() + ->getMock(); + + $request->expects($this->once()) + ->method('getPath') + ->will($this->returnValue('/systemtags-relations/files/12')); + + $request->expects($this->once()) + ->method('getBodyAsString') + ->will($this->returnValue($requestData)); + + $request->expects($this->once()) + ->method('getHeader') + ->with('Content-Type') + ->will($this->returnValue('application/json')); + + $request->expects($this->once()) + ->method('getBaseUrl') + ->will($this->returnValue('http://example.com/dav/')); + + $response->expects($this->once()) + ->method('setHeader') + ->with('Location', 'http://example.com/dav/systemtags/1'); + + $this->plugin->httpPost($request, $response); + } + + /** + * @dataProvider nodeClassProvider + * @expectedException Sabre\DAV\Exception\Conflict + */ + public function testCreateTagConflict($nodeClass) { + $requestData = json_encode([ + 'name' => 'Test', + 'userVisible' => true, + 'userAssignable' => false, + ]); + + $node = $this->getMockBuilder($nodeClass) + ->disableOriginalConstructor() + ->getMock(); + $this->tagManager->expects($this->once()) + ->method('createTag') + ->with('Test', true, false) + ->will($this->throwException(new TagAlreadyExistsException('Tag already exists'))); + + $this->tree->expects($this->any()) + ->method('getNodeForPath') + ->with('/systemtags') + ->will($this->returnValue($node)); + + $request = $this->getMockBuilder('Sabre\HTTP\RequestInterface') + ->disableOriginalConstructor() + ->getMock(); + $response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface') + ->disableOriginalConstructor() + ->getMock(); + + $request->expects($this->once()) + ->method('getPath') + ->will($this->returnValue('/systemtags')); + + $request->expects($this->once()) + ->method('getBodyAsString') + ->will($this->returnValue($requestData)); + + $request->expects($this->once()) + ->method('getHeader') + ->with('Content-Type') + ->will($this->returnValue('application/json')); + + $this->plugin->httpPost($request, $response); + } + +} diff --git a/apps/dav/tests/unit/systemtag/systemtagsbyidcollection.php b/apps/dav/tests/unit/systemtag/systemtagsbyidcollection.php new file mode 100644 index 00000000000..fa9e42d04f9 --- /dev/null +++ b/apps/dav/tests/unit/systemtag/systemtagsbyidcollection.php @@ -0,0 +1,146 @@ +<?php +/** + * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCA\DAV\Tests\Unit\SystemTag; + + +use OC\SystemTag\SystemTag; +use OCP\SystemTag\TagNotFoundException; + +class SystemTagsByIdCollection extends \Test\TestCase { + + /** + * @var \OCA\DAV\SystemTag\SystemTagsByIdCollection + */ + private $node; + + /** + * @var \OCP\SystemTag\ISystemTagManager + */ + private $tagManager; + + protected function setUp() { + parent::setUp(); + + $this->tagManager = $this->getMock('\OCP\SystemTag\ISystemTagManager'); + + $this->node = new \OCA\DAV\SystemTag\SystemTagsByIdCollection($this->tagManager); + } + + /** + * @expectedException Sabre\DAV\Exception\Forbidden + */ + public function testForbiddenCreateFile() { + $this->node->createFile('555'); + } + + /** + * @expectedException Sabre\DAV\Exception\Forbidden + */ + public function testForbiddenCreateDirectory() { + $this->node->createDirectory('789'); + } + + public function testGetChild() { + $tag = new SystemTag(123, 'Test', true, false); + + $this->tagManager->expects($this->once()) + ->method('getTagsByIds') + ->with(['123']) + ->will($this->returnValue([$tag])); + + $childNode = $this->node->getChild('123'); + + $this->assertInstanceOf('\OCA\DAV\SystemTag\SystemTagNode', $childNode); + $this->assertEquals('123', $childNode->getName()); + $this->assertEquals($tag, $childNode->getSystemTag()); + } + + /** + * @expectedException Sabre\DAV\Exception\BadRequest + */ + public function testGetChildInvalidName() { + $this->tagManager->expects($this->once()) + ->method('getTagsByIds') + ->with(['invalid']) + ->will($this->throwException(new \InvalidArgumentException())); + + $this->node->getChild('invalid'); + } + + /** + * @expectedException Sabre\DAV\Exception\NotFound + */ + public function testGetChildNotFound() { + $this->tagManager->expects($this->once()) + ->method('getTagsByIds') + ->with(['444']) + ->will($this->throwException(new TagNotFoundException())); + + $this->node->getChild('444'); + } + + public function testGetChildren() { + $tag1 = new SystemTag(123, 'One', true, false); + $tag2 = new SystemTag(456, 'Two', true, true); + + $this->tagManager->expects($this->once()) + ->method('getAllTags') + ->with(true) + ->will($this->returnValue([$tag1, $tag2])); + + $children = $this->node->getChildren(); + + $this->assertCount(2, $children); + + $this->assertInstanceOf('\OCA\DAV\SystemTag\SystemTagNode', $children[0]); + $this->assertInstanceOf('\OCA\DAV\SystemTag\SystemTagNode', $children[1]); + $this->assertEquals($tag1, $children[0]->getSystemTag()); + $this->assertEquals($tag2, $children[1]->getSystemTag()); + } + + public function testGetChildrenEmpty() { + $this->tagManager->expects($this->once()) + ->method('getAllTags') + ->with(true) + ->will($this->returnValue([])); + $this->assertCount(0, $this->node->getChildren()); + } + + public function testChildExists() { + $tag = new SystemTag(123, 'One', true, false); + + $this->tagManager->expects($this->once()) + ->method('getTagsByIds') + ->with(['123']) + ->will($this->returnValue([$tag])); + + $this->assertTrue($this->node->childExists('123')); + } + + public function testChildExistsNotFound() { + $this->tagManager->expects($this->once()) + ->method('getTagsByIds') + ->with(['123']) + ->will($this->throwException(new TagNotFoundException())); + + $this->assertFalse($this->node->childExists('123')); + } + + /** + * @expectedException Sabre\DAV\Exception\BadRequest + */ + public function testChildExistsBadRequest() { + $this->tagManager->expects($this->once()) + ->method('getTagsByIds') + ->with(['invalid']) + ->will($this->throwException(new \InvalidArgumentException())); + + $this->node->childExists('invalid'); + } +} diff --git a/apps/dav/tests/unit/systemtag/systemtagsobjectmappingcollection.php b/apps/dav/tests/unit/systemtag/systemtagsobjectmappingcollection.php new file mode 100644 index 00000000000..a9b34f5ae19 --- /dev/null +++ b/apps/dav/tests/unit/systemtag/systemtagsobjectmappingcollection.php @@ -0,0 +1,214 @@ +<?php +/** + * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCA\DAV\Tests\Unit\SystemTag; + + +use OC\SystemTag\SystemTag; +use OCP\SystemTag\TagNotFoundException; + +class SystemTagsObjectMappingCollection extends \Test\TestCase { + + /** + * @var \OCA\DAV\SystemTag\SystemTagsObjectTypeCollection + */ + private $node; + + /** + * @var \OCP\SystemTag\ISystemTagManager + */ + private $tagManager; + + /** + * @var \OCP\SystemTag\ISystemTagMapper + */ + private $tagMapper; + + protected function setUp() { + parent::setUp(); + + $this->tagManager = $this->getMock('\OCP\SystemTag\ISystemTagManager'); + $this->tagMapper = $this->getMock('\OCP\SystemTag\ISystemTagObjectMapper'); + + $this->node = new \OCA\DAV\SystemTag\SystemTagsObjectMappingCollection ( + 111, + 'files', + $this->tagManager, + $this->tagMapper + ); + } + + public function testAssignTag() { + $this->tagMapper->expects($this->once()) + ->method('assignTags') + ->with(111, 'files', '555'); + + $this->node->createFile('555'); + } + + /** + * @expectedException Sabre\DAV\Exception\PreconditionFailed + */ + public function testAssignTagNotFound() { + $this->tagMapper->expects($this->once()) + ->method('assignTags') + ->with(111, 'files', '555') + ->will($this->throwException(new TagNotFoundException())); + + $this->node->createFile('555'); + } + + /** + * @expectedException Sabre\DAV\Exception\Forbidden + */ + public function testForbiddenCreateDirectory() { + $this->node->createDirectory('789'); + } + + public function testGetChild() { + $tag = new SystemTag(555, 'TheTag', true, false); + + $this->tagMapper->expects($this->once()) + ->method('haveTag') + ->with([111], 'files', '555', true) + ->will($this->returnValue(true)); + + $this->tagManager->expects($this->once()) + ->method('getTagsByIds') + ->with(['555']) + ->will($this->returnValue(['555' => $tag])); + + $childNode = $this->node->getChild('555'); + + $this->assertInstanceOf('\OCA\DAV\SystemTag\SystemTagNode', $childNode); + $this->assertEquals('555', $childNode->getName()); + } + + /** + * @expectedException Sabre\DAV\Exception\NotFound + */ + public function testGetChildRelationNotFound() { + $this->tagMapper->expects($this->once()) + ->method('haveTag') + ->with([111], 'files', '777') + ->will($this->returnValue(false)); + + $this->node->getChild('777'); + } + + /** + * @expectedException Sabre\DAV\Exception\BadRequest + */ + public function testGetChildInvalidId() { + $this->tagMapper->expects($this->once()) + ->method('haveTag') + ->with([111], 'files', 'badid') + ->will($this->throwException(new \InvalidArgumentException())); + + $this->node->getChild('badid'); + } + + /** + * @expectedException Sabre\DAV\Exception\NotFound + */ + public function testGetChildTagDoesNotExist() { + $this->tagMapper->expects($this->once()) + ->method('haveTag') + ->with([111], 'files', '777') + ->will($this->throwException(new TagNotFoundException())); + + $this->node->getChild('777'); + } + + public function testGetChildren() { + $tag1 = new SystemTag(555, 'TagOne', true, false); + $tag2 = new SystemTag(556, 'TagTwo', true, true); + + $this->tagMapper->expects($this->once()) + ->method('getTagIdsForObjects') + ->with([111], 'files') + ->will($this->returnValue(['111' => ['555', '556']])); + + $this->tagManager->expects($this->once()) + ->method('getTagsByIds') + ->with(['555', '556']) + ->will($this->returnValue(['555' => $tag1, '666' => $tag2])); + + $children = $this->node->getChildren(); + + $this->assertCount(2, $children); + + $this->assertInstanceOf('\OCA\DAV\SystemTag\SystemTagMappingNode', $children[0]); + $this->assertInstanceOf('\OCA\DAV\SystemTag\SystemTagMappingNode', $children[1]); + + $this->assertEquals(111, $children[0]->getObjectId()); + $this->assertEquals('files', $children[0]->getObjectType()); + $this->assertEquals($tag1, $children[0]->getSystemTag()); + + $this->assertEquals(111, $children[1]->getObjectId()); + $this->assertEquals('files', $children[1]->getObjectType()); + $this->assertEquals($tag2, $children[1]->getSystemTag()); + } + + public function testChildExists() { + $this->tagMapper->expects($this->once()) + ->method('haveTag') + ->with([111], 'files', '555') + ->will($this->returnValue(true)); + + $this->assertTrue($this->node->childExists('555')); + } + + public function testChildExistsNotFound() { + $this->tagMapper->expects($this->once()) + ->method('haveTag') + ->with([111], 'files', '555') + ->will($this->returnValue(false)); + + $this->assertFalse($this->node->childExists('555')); + } + + public function testChildExistsTagNotFound() { + $this->tagMapper->expects($this->once()) + ->method('haveTag') + ->with([111], 'files', '555') + ->will($this->throwException(new TagNotFoundException())); + + $this->assertFalse($this->node->childExists('555')); + } + + /** + * @expectedException Sabre\DAV\Exception\BadRequest + */ + public function testChildExistsInvalidId() { + $this->tagMapper->expects($this->once()) + ->method('haveTag') + ->with([111], 'files', '555') + ->will($this->throwException(new \InvalidArgumentException())); + + $this->node->childExists('555'); + } + + /** + * @expectedException Sabre\DAV\Exception\Forbidden + */ + public function testDelete() { + $this->node->delete(); + } + + /** + * @expectedException Sabre\DAV\Exception\Forbidden + */ + public function testSetName() { + $this->node->setName('somethingelse'); + } + + public function testGetName() { + $this->assertEquals('111', $this->node->getName()); + } +} diff --git a/apps/dav/tests/unit/systemtag/systemtagsobjecttypecollection.php b/apps/dav/tests/unit/systemtag/systemtagsobjecttypecollection.php new file mode 100644 index 00000000000..39223ff9122 --- /dev/null +++ b/apps/dav/tests/unit/systemtag/systemtagsobjecttypecollection.php @@ -0,0 +1,90 @@ +<?php +/** + * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCA\DAV\Tests\Unit\SystemTag; + +class SystemTagsObjectTypeCollection extends \Test\TestCase { + + /** + * @var \OCA\DAV\SystemTag\SystemTagsObjectTypeCollection + */ + private $node; + + /** + * @var \OCP\SystemTag\ISystemTagManager + */ + private $tagManager; + + /** + * @var \OCP\SystemTag\ISystemTagMapper + */ + private $tagMapper; + + protected function setUp() { + parent::setUp(); + + $this->tagManager = $this->getMock('\OCP\SystemTag\ISystemTagManager'); + $this->tagMapper = $this->getMock('\OCP\SystemTag\ISystemTagObjectMapper'); + + $this->node = new \OCA\DAV\SystemTag\SystemTagsObjectTypeCollection( + 'files', + $this->tagManager, + $this->tagMapper + ); + } + + /** + * @expectedException Sabre\DAV\Exception\Forbidden + */ + public function testForbiddenCreateFile() { + $this->node->createFile('555'); + } + + /** + * @expectedException Sabre\DAV\Exception\Forbidden + */ + public function testForbiddenCreateDirectory() { + $this->node->createDirectory('789'); + } + + public function testGetChild() { + $childNode = $this->node->getChild('files'); + + $this->assertInstanceOf('\OCA\DAV\SystemTag\SystemTagsObjectMappingCollection', $childNode); + $this->assertEquals('files', $childNode->getName()); + } + + /** + * @expectedException Sabre\DAV\Exception\MethodNotAllowed + */ + public function testGetChildren() { + $this->node->getChildren(); + } + + public function testChildExists() { + $this->assertTrue($this->node->childExists('123')); + } + + /** + * @expectedException Sabre\DAV\Exception\Forbidden + */ + public function testDelete() { + $this->node->delete(); + } + + /** + * @expectedException Sabre\DAV\Exception\Forbidden + */ + public function testSetName() { + $this->node->setName('somethingelse'); + } + + public function testGetName() { + $this->assertEquals('files', $this->node->getName()); + } +} diff --git a/apps/encryption/lib/crypto/crypt.php b/apps/encryption/lib/crypto/crypt.php index dbc0364a157..12e9008545a 100644 --- a/apps/encryption/lib/crypto/crypt.php +++ b/apps/encryption/lib/crypto/crypt.php @@ -30,7 +30,6 @@ use OC\Encryption\Exceptions\DecryptionFailedException; use OC\Encryption\Exceptions\EncryptionFailedException; use OCA\Encryption\Exceptions\MultiKeyDecryptException; use OCA\Encryption\Exceptions\MultiKeyEncryptException; -use OCA\Encryption\Vendor\PBKDF2Fallback; use OCP\Encryption\Exceptions\GenericEncryptionException; use OCP\IConfig; use OCP\ILogger; @@ -293,28 +292,14 @@ class Crypt { $salt = hash('sha256', $uid . $instanceId . $instanceSecret, true); $keySize = $this->getKeySize($cipher); - if (function_exists('hash_pbkdf2')) { - $hash = hash_pbkdf2( - 'sha256', - $password, - $salt, - 100000, - $keySize, - true - ); - } else { - // fallback to 3rdparty lib for PHP <= 5.4. - // FIXME: Can be removed as soon as support for PHP 5.4 was dropped - $fallback = new PBKDF2Fallback(); - $hash = $fallback->pbkdf2( - 'sha256', - $password, - $salt, - 100000, - $keySize, - true - ); - } + $hash = hash_pbkdf2( + 'sha256', + $password, + $salt, + 100000, + $keySize, + true + ); return $hash; } diff --git a/apps/encryption/vendor/pbkdf2fallback.php b/apps/encryption/vendor/pbkdf2fallback.php deleted file mode 100644 index ca579f8e7dc..00000000000 --- a/apps/encryption/vendor/pbkdf2fallback.php +++ /dev/null @@ -1,87 +0,0 @@ -<?php -/* Note; This class can be removed as soon as we drop PHP 5.4 support. - * - * - * Password Hashing With PBKDF2 (http://crackstation.net/hashing-security.htm). - * Copyright (c) 2013, Taylor Hornby - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -namespace OCA\Encryption\Vendor; - -class PBKDF2Fallback { - - /* - * PBKDF2 key derivation function as defined by RSA's PKCS #5: https://www.ietf.org/rfc/rfc2898.txt - * $algorithm - The hash algorithm to use. Recommended: SHA256 - * $password - The password. - * $salt - A salt that is unique to the password. - * $count - Iteration count. Higher is better, but slower. Recommended: At least 1000. - * $key_length - The length of the derived key in bytes. - * $raw_output - If true, the key is returned in raw binary format. Hex encoded otherwise. - * Returns: A $key_length-byte key derived from the password and salt. - * - * Test vectors can be found here: https://www.ietf.org/rfc/rfc6070.txt - * - * This implementation of PBKDF2 was originally created by https://defuse.ca - * With improvements by http://www.variations-of-shadow.com - */ - public function pbkdf2($algorithm, $password, $salt, $count, $key_length, $raw_output = false) { - $algorithm = strtolower($algorithm); - if (!in_array($algorithm, hash_algos(), true)) - trigger_error('PBKDF2 ERROR: Invalid hash algorithm.', E_USER_ERROR); - if ($count <= 0 || $key_length <= 0) - trigger_error('PBKDF2 ERROR: Invalid parameters.', E_USER_ERROR); - - if (function_exists("hash_pbkdf2")) { - // The output length is in NIBBLES (4-bits) if $raw_output is false! - if (!$raw_output) { - $key_length = $key_length * 2; - } - return hash_pbkdf2($algorithm, $password, $salt, $count, $key_length, $raw_output); - } - - $hash_length = strlen(hash($algorithm, "", true)); - $block_count = ceil($key_length / $hash_length); - - $output = ""; - for ($i = 1; $i <= $block_count; $i++) { - // $i encoded as 4 bytes, big endian. - $last = $salt . pack("N", $i); - // first iteration - $last = $xorsum = hash_hmac($algorithm, $last, $password, true); - // perform the other $count - 1 iterations - for ($j = 1; $j < $count; $j++) { - $xorsum ^= ($last = hash_hmac($algorithm, $last, $password, true)); - } - $output .= $xorsum; - } - - if ($raw_output) - return substr($output, 0, $key_length); - else - return bin2hex(substr($output, 0, $key_length)); - } -} diff --git a/apps/federation/api/ocsauthapi.php b/apps/federation/api/ocsauthapi.php index 42d7113820d..d165a0bd22f 100644 --- a/apps/federation/api/ocsauthapi.php +++ b/apps/federation/api/ocsauthapi.php @@ -139,7 +139,7 @@ class OCSAuthAPI { protected function isValidToken($url, $token) { $storedToken = $this->dbHandler->getToken($url); - return StringUtils::equals($storedToken, $token); + return hash_equals($storedToken, $token); } } diff --git a/apps/files/l10n/lt_LT.js b/apps/files/l10n/lt_LT.js index b4001e0c8ea..e93fb079d56 100644 --- a/apps/files/l10n/lt_LT.js +++ b/apps/files/l10n/lt_LT.js @@ -40,6 +40,17 @@ OC.L10N.register( "Unable to determine date" : "Nepavyksta nustatyti datos", "This operation is forbidden" : "Ši operacija yra uždrausta", "This directory is unavailable, please check the logs or contact the administrator" : "Katalogas nepasiekiamas, prašome peržiūrėti žurnalo įrašus arba susisiekti su administratoriumi", + "Could not move \"{file}\", target exists" : "Nepavyko perkelti \"{file}\", toks jau egzistuoja", + "Could not move \"{file}\"" : "Nepavyko perkelti \"{file}\"", + "{newName} already exists" : "{newName} jau egzistuoja", + "Could not rename \"{fileName}\", it does not exist any more" : "Nepavyko pervadinti failo \"{fileName}\", nes jis jau nebeegzistuoja", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Pavadinimas \"{targetName}\" jau naudojamas aplanke \"{dir}\". Prašome pasirinkti kitokį pavadinimą.", + "Could not rename \"{fileName}\"" : "Nepavyko pervadinti failo \"{fileName}\"", + "Could not create file \"{file}\"" : "Nepavyko sukurti failo \"{file}\"", + "Could not create file \"{file}\" because it already exists" : "Nepavyko sukurti failo \"{file}\" - failas su tokiu pavadinimu jau egzistuoja", + "Could not create folder \"{dir}\"" : "Nepavyko sukurti aplanko \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "Nepavyko sukurti aplanko \"{dir}\"- aplankas su tokiu pavadinimu jau egzistuoja", + "Error deleting file \"{fileName}\"." : "Klaida trinant failą \"{fileName}\".", "No entries in this folder match '{filter}'" : "Nėra įrašų šiame aplanko atitikmeniui „{filter}“", "Name" : "Pavadinimas", "Size" : "Dydis", diff --git a/apps/files/l10n/lt_LT.json b/apps/files/l10n/lt_LT.json index ba8610da86b..e6724be98cf 100644 --- a/apps/files/l10n/lt_LT.json +++ b/apps/files/l10n/lt_LT.json @@ -38,6 +38,17 @@ "Unable to determine date" : "Nepavyksta nustatyti datos", "This operation is forbidden" : "Ši operacija yra uždrausta", "This directory is unavailable, please check the logs or contact the administrator" : "Katalogas nepasiekiamas, prašome peržiūrėti žurnalo įrašus arba susisiekti su administratoriumi", + "Could not move \"{file}\", target exists" : "Nepavyko perkelti \"{file}\", toks jau egzistuoja", + "Could not move \"{file}\"" : "Nepavyko perkelti \"{file}\"", + "{newName} already exists" : "{newName} jau egzistuoja", + "Could not rename \"{fileName}\", it does not exist any more" : "Nepavyko pervadinti failo \"{fileName}\", nes jis jau nebeegzistuoja", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Pavadinimas \"{targetName}\" jau naudojamas aplanke \"{dir}\". Prašome pasirinkti kitokį pavadinimą.", + "Could not rename \"{fileName}\"" : "Nepavyko pervadinti failo \"{fileName}\"", + "Could not create file \"{file}\"" : "Nepavyko sukurti failo \"{file}\"", + "Could not create file \"{file}\" because it already exists" : "Nepavyko sukurti failo \"{file}\" - failas su tokiu pavadinimu jau egzistuoja", + "Could not create folder \"{dir}\"" : "Nepavyko sukurti aplanko \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "Nepavyko sukurti aplanko \"{dir}\"- aplankas su tokiu pavadinimu jau egzistuoja", + "Error deleting file \"{fileName}\"." : "Klaida trinant failą \"{fileName}\".", "No entries in this folder match '{filter}'" : "Nėra įrašų šiame aplanko atitikmeniui „{filter}“", "Name" : "Pavadinimas", "Size" : "Dydis", diff --git a/apps/files/l10n/mk.js b/apps/files/l10n/mk.js index 92616a372a3..7a387afee66 100644 --- a/apps/files/l10n/mk.js +++ b/apps/files/l10n/mk.js @@ -54,6 +54,7 @@ OC.L10N.register( "Settings" : "Подесувања", "WebDAV" : "WebDAV", "Cancel upload" : "Откажи прикачување", + "No entries found in this folder" : "Нема ништо во оваа папка", "Upload too large" : "Фајлот кој се вчитува е преголем", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер.", "Files are being scanned, please wait." : "Се скенираат датотеки, ве молам почекајте.", diff --git a/apps/files/l10n/mk.json b/apps/files/l10n/mk.json index 147707256c6..acf8f546d73 100644 --- a/apps/files/l10n/mk.json +++ b/apps/files/l10n/mk.json @@ -52,6 +52,7 @@ "Settings" : "Подесувања", "WebDAV" : "WebDAV", "Cancel upload" : "Откажи прикачување", + "No entries found in this folder" : "Нема ништо во оваа папка", "Upload too large" : "Фајлот кој се вчитува е преголем", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер.", "Files are being scanned, please wait." : "Се скенираат датотеки, ве молам почекајте.", diff --git a/apps/files/tests/backgroundjob/ScanFilesTest.php b/apps/files/tests/backgroundjob/ScanFilesTest.php index 907cad64f9e..087696f0cfc 100644 --- a/apps/files/tests/backgroundjob/ScanFilesTest.php +++ b/apps/files/tests/backgroundjob/ScanFilesTest.php @@ -24,7 +24,6 @@ use Test\TestCase; use OCP\IConfig; use OCP\IUserManager; use OCA\Files\BackgroundJob\ScanFiles; -use OCP\ILogger; /** * Class ScanFilesTest diff --git a/apps/files/tests/controller/apicontrollertest.php b/apps/files/tests/controller/apicontrollertest.php index fb728d5eff0..bc66e4641b9 100644 --- a/apps/files/tests/controller/apicontrollertest.php +++ b/apps/files/tests/controller/apicontrollertest.php @@ -92,6 +92,7 @@ class ApiControllerTest extends TestCase { [ 'mtime' => 55, 'mimetype' => 'application/pdf', + 'permissions' => 31, 'size' => 1234, 'etag' => 'MyEtag', ], @@ -111,7 +112,7 @@ class ApiControllerTest extends TestCase { 'parentId' => null, 'mtime' => 55000, 'name' => 'root.txt', - 'permissions' => null, + 'permissions' => 31, 'mimetype' => 'application/pdf', 'size' => 1234, 'type' => 'file', @@ -139,6 +140,7 @@ class ApiControllerTest extends TestCase { [ 'mtime' => 55, 'mimetype' => 'application/pdf', + 'permissions' => 31, 'size' => 1234, 'etag' => 'MyEtag', ], @@ -155,6 +157,7 @@ class ApiControllerTest extends TestCase { [ 'mtime' => 999, 'mimetype' => 'application/binary', + 'permissions' => 31, 'size' => 9876, 'etag' => 'SubEtag', ], @@ -174,7 +177,7 @@ class ApiControllerTest extends TestCase { 'parentId' => null, 'mtime' => 55000, 'name' => 'root.txt', - 'permissions' => null, + 'permissions' => 31, 'mimetype' => 'application/pdf', 'size' => 1234, 'type' => 'file', @@ -191,7 +194,7 @@ class ApiControllerTest extends TestCase { 'parentId' => null, 'mtime' => 999000, 'name' => 'root.txt', - 'permissions' => null, + 'permissions' => 31, 'mimetype' => 'application/binary', 'size' => 9876, 'type' => 'file', diff --git a/apps/files_external/appinfo/database.xml b/apps/files_external/appinfo/database.xml index 27918bf9819..2c3615a4d4c 100644 --- a/apps/files_external/appinfo/database.xml +++ b/apps/files_external/appinfo/database.xml @@ -80,14 +80,12 @@ <length>64</length> </field> <index> - <name>mount_id_app_index</name> <field> <name>mount_id</name> <sorting>ascending</sorting> </field> </index> <index> - <name>applicable_value_index</name> <field> <name>type</name> <sorting>ascending</sorting> @@ -98,7 +96,6 @@ </field> </index> <index> - <name>applicable_value_mount_index</name> <unique>true</unique> <field> <name>type</name> @@ -147,14 +144,12 @@ </field> <index> - <name>config_mount_id</name> <field> <name>mount_id</name> <sorting>ascending</sorting> </field> </index> <index> - <name>config_mount_key</name> <unique>true</unique> <field> <name>mount_id</name> @@ -199,7 +194,6 @@ </field> <index> - <name>option_mount_id</name> <field> <name>mount_id</name> <sorting>ascending</sorting> diff --git a/apps/files_external/appinfo/info.xml b/apps/files_external/appinfo/info.xml index f6d583d0a5a..355d9feb4b9 100644 --- a/apps/files_external/appinfo/info.xml +++ b/apps/files_external/appinfo/info.xml @@ -14,7 +14,7 @@ <admin>admin-external-storage</admin> </documentation> <rememberlogin>false</rememberlogin> - <version>0.5.0</version> + <version>0.5.1</version> <types> <filesystem/> </types> diff --git a/apps/files_external/l10n/cs_CZ.js b/apps/files_external/l10n/cs_CZ.js index 94c8194e328..13ca22abcc9 100644 --- a/apps/files_external/l10n/cs_CZ.js +++ b/apps/files_external/l10n/cs_CZ.js @@ -36,6 +36,14 @@ OC.L10N.register( "(group)" : "(skupina)", "Admin defined" : "Nastaveno administrátorem", "Saved" : "Uloženo", + "Empty response from the server" : "Prázdná odpověď serveru", + "Couldn't access. Please logout and login to activate this mount point" : "Nelze připojit. Pro aktivaci tohoto přípojného bodu se prosím odhlašte a znovu přihlašte", + "Couldn't get the information from the ownCloud server: {code} {type}" : "Nelze obdržet informaci z ownCloud serveru: {code} {type}", + "Couldn't get the list of external mount points: {type}" : "Nelze obdržet seznam vzdálených přípojných bodů: {type}", + "There was an error with message: " : "Došlo k chybě s tímto hlášením:", + "External mount error" : "Chyba vzdáleného úložiště", + "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Nelze obdržet seznam síťových úložišť systému Windows: prázdná odpověď serveru", + "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Některá z nastavených vzdálených úložišť nejsou připojena. Pro více informací prosím klikněte na červenou šipku(y)", "Access key" : "Přístupový klíč", "Secret key" : "Tajný klíč", "Builtin" : "Zabudované", diff --git a/apps/files_external/l10n/cs_CZ.json b/apps/files_external/l10n/cs_CZ.json index 4adba2f4d04..bfcd3a30f46 100644 --- a/apps/files_external/l10n/cs_CZ.json +++ b/apps/files_external/l10n/cs_CZ.json @@ -34,6 +34,14 @@ "(group)" : "(skupina)", "Admin defined" : "Nastaveno administrátorem", "Saved" : "Uloženo", + "Empty response from the server" : "Prázdná odpověď serveru", + "Couldn't access. Please logout and login to activate this mount point" : "Nelze připojit. Pro aktivaci tohoto přípojného bodu se prosím odhlašte a znovu přihlašte", + "Couldn't get the information from the ownCloud server: {code} {type}" : "Nelze obdržet informaci z ownCloud serveru: {code} {type}", + "Couldn't get the list of external mount points: {type}" : "Nelze obdržet seznam vzdálených přípojných bodů: {type}", + "There was an error with message: " : "Došlo k chybě s tímto hlášením:", + "External mount error" : "Chyba vzdáleného úložiště", + "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Nelze obdržet seznam síťových úložišť systému Windows: prázdná odpověď serveru", + "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Některá z nastavených vzdálených úložišť nejsou připojena. Pro více informací prosím klikněte na červenou šipku(y)", "Access key" : "Přístupový klíč", "Secret key" : "Tajný klíč", "Builtin" : "Zabudované", diff --git a/apps/files_external/l10n/es.js b/apps/files_external/l10n/es.js index 1d49d7b13b8..6d8bf0d3139 100644 --- a/apps/files_external/l10n/es.js +++ b/apps/files_external/l10n/es.js @@ -1,13 +1,23 @@ OC.L10N.register( "files_external", { + "Fetching request tokens failed. Verify that your app key and secret are correct." : "Fallo al acceder a los tokens solicitados. Verfique que su clave de app y la clave secreta son correctas.", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "Fallo al acceder a los tokens solicitados. Verfique que su clave de app y la clave secreta son correctas.", + "Please provide a valid app key and secret." : "Por favor facilite una clave de app y una clave secreta válidas.", "Step 1 failed. Exception: %s" : "El paso 1 falló. Excepción: %s", "Step 2 failed. Exception: %s" : "El paso 2 falló. Excepción: %s", "External storage" : "Almacenamiento externo", "Storage with id \"%i\" not found" : "No se ha encontrado almacenamiento con id \"%i\"", + "Invalid backend or authentication mechanism class" : "Sistema o mecanismo de autentificación inválido", "Invalid mount point" : "Punto de montaje no válido", + "Objectstore forbidden" : "Objeto de almacenaje prohibido", "Invalid storage backend \"%s\"" : "Motor de almacenamiento no válido «%s»", - "Not permitted to use authentication mechanism \"%s\"" : "No está permitido usar el mecanismo de autenticación \"%s\"", + "Not permitted to use backend \"%s\"" : "No se permite usar el mecanismo \"%s\"", + "Not permitted to use authentication mechanism \"%s\"" : "No está permitido usar el mecanismo de autentificación \"%s\"", + "Unsatisfied backend parameters" : "Los parámetros del sistema no son válidos", + "Unsatisfied authentication mechanism parameters" : "Los parámetros del mecanismo de autentificación no son válidos", + "Insufficient data: %s" : "Datos insuficientes: %s", + "%s" : "%s", "Personal" : "Personal", "System" : "Sistema", "Grant access" : "Conceder acceso", @@ -84,7 +94,7 @@ OC.L10N.register( "Scope" : "Ámbito", "External Storage" : "Almacenamiento externo", "Folder name" : "Nombre de la carpeta", - "Authentication" : "Autenticación", + "Authentication" : "Autentificación", "Configuration" : "Configuración", "Available for" : "Disponible para", "Add storage" : "Añadir almacenamiento", diff --git a/apps/files_external/l10n/es.json b/apps/files_external/l10n/es.json index 1c60cd5fdea..bf0624e96db 100644 --- a/apps/files_external/l10n/es.json +++ b/apps/files_external/l10n/es.json @@ -1,11 +1,21 @@ { "translations": { + "Fetching request tokens failed. Verify that your app key and secret are correct." : "Fallo al acceder a los tokens solicitados. Verfique que su clave de app y la clave secreta son correctas.", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "Fallo al acceder a los tokens solicitados. Verfique que su clave de app y la clave secreta son correctas.", + "Please provide a valid app key and secret." : "Por favor facilite una clave de app y una clave secreta válidas.", "Step 1 failed. Exception: %s" : "El paso 1 falló. Excepción: %s", "Step 2 failed. Exception: %s" : "El paso 2 falló. Excepción: %s", "External storage" : "Almacenamiento externo", "Storage with id \"%i\" not found" : "No se ha encontrado almacenamiento con id \"%i\"", + "Invalid backend or authentication mechanism class" : "Sistema o mecanismo de autentificación inválido", "Invalid mount point" : "Punto de montaje no válido", + "Objectstore forbidden" : "Objeto de almacenaje prohibido", "Invalid storage backend \"%s\"" : "Motor de almacenamiento no válido «%s»", - "Not permitted to use authentication mechanism \"%s\"" : "No está permitido usar el mecanismo de autenticación \"%s\"", + "Not permitted to use backend \"%s\"" : "No se permite usar el mecanismo \"%s\"", + "Not permitted to use authentication mechanism \"%s\"" : "No está permitido usar el mecanismo de autentificación \"%s\"", + "Unsatisfied backend parameters" : "Los parámetros del sistema no son válidos", + "Unsatisfied authentication mechanism parameters" : "Los parámetros del mecanismo de autentificación no son válidos", + "Insufficient data: %s" : "Datos insuficientes: %s", + "%s" : "%s", "Personal" : "Personal", "System" : "Sistema", "Grant access" : "Conceder acceso", @@ -82,7 +92,7 @@ "Scope" : "Ámbito", "External Storage" : "Almacenamiento externo", "Folder name" : "Nombre de la carpeta", - "Authentication" : "Autenticación", + "Authentication" : "Autentificación", "Configuration" : "Configuración", "Available for" : "Disponible para", "Add storage" : "Añadir almacenamiento", diff --git a/apps/files_external/l10n/fi_FI.js b/apps/files_external/l10n/fi_FI.js index b56ad195ce6..c358a2b3260 100644 --- a/apps/files_external/l10n/fi_FI.js +++ b/apps/files_external/l10n/fi_FI.js @@ -25,6 +25,8 @@ OC.L10N.register( "(group)" : "(ryhmä)", "Admin defined" : "Ylläpitäjän määrittämä", "Saved" : "Tallennettu", + "Empty response from the server" : "Tyhjä vastaus palvelimelta", + "There was an error with message: " : "Tapahtui virhe viestillä:", "Builtin" : "Sisäänrakennettu", "None" : "Ei mitään", "OAuth1" : "OAuth1", @@ -39,6 +41,7 @@ OC.L10N.register( "Rackspace" : "Rackspace", "API key" : "API-avain", "Username and password" : "Käyttäjätunnus ja salasana", + "Session credentials" : "Istunnon tunnistetiedot", "RSA public key" : "Julkinen RSA-avain", "Public key" : "Julkinen avain", "Amazon S3" : "Amazon S3", diff --git a/apps/files_external/l10n/fi_FI.json b/apps/files_external/l10n/fi_FI.json index 9ff2748b7f6..4e72d861d6f 100644 --- a/apps/files_external/l10n/fi_FI.json +++ b/apps/files_external/l10n/fi_FI.json @@ -23,6 +23,8 @@ "(group)" : "(ryhmä)", "Admin defined" : "Ylläpitäjän määrittämä", "Saved" : "Tallennettu", + "Empty response from the server" : "Tyhjä vastaus palvelimelta", + "There was an error with message: " : "Tapahtui virhe viestillä:", "Builtin" : "Sisäänrakennettu", "None" : "Ei mitään", "OAuth1" : "OAuth1", @@ -37,6 +39,7 @@ "Rackspace" : "Rackspace", "API key" : "API-avain", "Username and password" : "Käyttäjätunnus ja salasana", + "Session credentials" : "Istunnon tunnistetiedot", "RSA public key" : "Julkinen RSA-avain", "Public key" : "Julkinen avain", "Amazon S3" : "Amazon S3", diff --git a/apps/files_external/l10n/fr.js b/apps/files_external/l10n/fr.js index 8ff4fcdfdd9..9ca35b46b4c 100644 --- a/apps/files_external/l10n/fr.js +++ b/apps/files_external/l10n/fr.js @@ -17,6 +17,7 @@ OC.L10N.register( "Unsatisfied backend parameters" : "Paramètres manquants pour le service", "Unsatisfied authentication mechanism parameters" : "Paramètres manquants pour la méthode d'authentification", "Insufficient data: %s" : "Données insuffisantes : %s", + "%s" : "%s", "Personal" : "Personnel", "System" : "Système", "Grant access" : "Autoriser l'accès", @@ -35,6 +36,12 @@ OC.L10N.register( "(group)" : "(groupe)", "Admin defined" : "Défini par l'administrateur", "Saved" : "Sauvegardé", + "Empty response from the server" : "Réponse vide du serveur", + "Couldn't access. Please logout and login to activate this mount point" : "Impossible d'accéder. Veuillez vous déconnecter et vous reconnecter pour activer ce point de montage.", + "Couldn't get the information from the ownCloud server: {code} {type}" : "Impossible d'obtenir l'information depuis le serveur ownCloud : {code} {type}", + "Couldn't get the list of external mount points: {type}" : "Impossible de récupérer la liste des points de montage externes : {type}", + "There was an error with message: " : "Il y a eu une erreur avec le message :", + "External mount error" : "Erreur de montage externe", "Access key" : "Clé d'accès", "Secret key" : "Clé secrète", "Builtin" : "Intégré", diff --git a/apps/files_external/l10n/fr.json b/apps/files_external/l10n/fr.json index 9a610bd964b..8be075113a8 100644 --- a/apps/files_external/l10n/fr.json +++ b/apps/files_external/l10n/fr.json @@ -15,6 +15,7 @@ "Unsatisfied backend parameters" : "Paramètres manquants pour le service", "Unsatisfied authentication mechanism parameters" : "Paramètres manquants pour la méthode d'authentification", "Insufficient data: %s" : "Données insuffisantes : %s", + "%s" : "%s", "Personal" : "Personnel", "System" : "Système", "Grant access" : "Autoriser l'accès", @@ -33,6 +34,12 @@ "(group)" : "(groupe)", "Admin defined" : "Défini par l'administrateur", "Saved" : "Sauvegardé", + "Empty response from the server" : "Réponse vide du serveur", + "Couldn't access. Please logout and login to activate this mount point" : "Impossible d'accéder. Veuillez vous déconnecter et vous reconnecter pour activer ce point de montage.", + "Couldn't get the information from the ownCloud server: {code} {type}" : "Impossible d'obtenir l'information depuis le serveur ownCloud : {code} {type}", + "Couldn't get the list of external mount points: {type}" : "Impossible de récupérer la liste des points de montage externes : {type}", + "There was an error with message: " : "Il y a eu une erreur avec le message :", + "External mount error" : "Erreur de montage externe", "Access key" : "Clé d'accès", "Secret key" : "Clé secrète", "Builtin" : "Intégré", diff --git a/apps/files_external/l10n/it.js b/apps/files_external/l10n/it.js index daca1d3a896..85fb70cf1a7 100644 --- a/apps/files_external/l10n/it.js +++ b/apps/files_external/l10n/it.js @@ -36,6 +36,15 @@ OC.L10N.register( "(group)" : "(gruppo)", "Admin defined" : "Definito dall'amministratore", "Saved" : "Salvato", + "Empty response from the server" : "Risposta vuota dal server", + "Couldn't access. Please logout and login to activate this mount point" : "Impossibile accedere. Termina la sessione e accedi nuovamente per attivare questo punto di mount", + "Couldn't get the information from the ownCloud server: {code} {type}" : "Impossibile ottenere le informazioni dal server ownCloud: {code} {type}", + "Couldn't get the list of external mount points: {type}" : "Impossibile ottenere l'elenco dei punti di mount esterni: {type}", + "There was an error with message: " : "Si è verificato un errore con il messaggio:", + "External mount error" : "Errore di mount esterno", + "goto-external-storage" : "goto-external-storage", + "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Impossibile ottenere l'elenco dei punti di mount delle unità di rete Windows: risposta vuota dal server", + "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Alcuni dei punti di mount esterni configurati non sono connessi. Fai clic sulle righe rosse per ulteriori informazioni", "Access key" : "Chiave di accesso", "Secret key" : "Chiave segreta", "Builtin" : "Integrata", diff --git a/apps/files_external/l10n/it.json b/apps/files_external/l10n/it.json index 67f7fe3595b..08da52362d6 100644 --- a/apps/files_external/l10n/it.json +++ b/apps/files_external/l10n/it.json @@ -34,6 +34,15 @@ "(group)" : "(gruppo)", "Admin defined" : "Definito dall'amministratore", "Saved" : "Salvato", + "Empty response from the server" : "Risposta vuota dal server", + "Couldn't access. Please logout and login to activate this mount point" : "Impossibile accedere. Termina la sessione e accedi nuovamente per attivare questo punto di mount", + "Couldn't get the information from the ownCloud server: {code} {type}" : "Impossibile ottenere le informazioni dal server ownCloud: {code} {type}", + "Couldn't get the list of external mount points: {type}" : "Impossibile ottenere l'elenco dei punti di mount esterni: {type}", + "There was an error with message: " : "Si è verificato un errore con il messaggio:", + "External mount error" : "Errore di mount esterno", + "goto-external-storage" : "goto-external-storage", + "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Impossibile ottenere l'elenco dei punti di mount delle unità di rete Windows: risposta vuota dal server", + "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Alcuni dei punti di mount esterni configurati non sono connessi. Fai clic sulle righe rosse per ulteriori informazioni", "Access key" : "Chiave di accesso", "Secret key" : "Chiave segreta", "Builtin" : "Integrata", diff --git a/apps/files_external/l10n/ja.js b/apps/files_external/l10n/ja.js index 5518f6afa78..8d50794e5b6 100644 --- a/apps/files_external/l10n/ja.js +++ b/apps/files_external/l10n/ja.js @@ -17,6 +17,7 @@ OC.L10N.register( "Unsatisfied backend parameters" : "バックエンドのためのパラメーターが不十分です。", "Unsatisfied authentication mechanism parameters" : "認証のためのパラメータが不十分です", "Insufficient data: %s" : "データが不足しています: %s", + "%s" : "%s", "Personal" : "個人", "System" : "システム", "Grant access" : "アクセスを許可", diff --git a/apps/files_external/l10n/ja.json b/apps/files_external/l10n/ja.json index 8134ed16cd5..b704504b088 100644 --- a/apps/files_external/l10n/ja.json +++ b/apps/files_external/l10n/ja.json @@ -15,6 +15,7 @@ "Unsatisfied backend parameters" : "バックエンドのためのパラメーターが不十分です。", "Unsatisfied authentication mechanism parameters" : "認証のためのパラメータが不十分です", "Insufficient data: %s" : "データが不足しています: %s", + "%s" : "%s", "Personal" : "個人", "System" : "システム", "Grant access" : "アクセスを許可", diff --git a/apps/files_external/l10n/nl.js b/apps/files_external/l10n/nl.js index 05d1a3f6de5..3200988ec2b 100644 --- a/apps/files_external/l10n/nl.js +++ b/apps/files_external/l10n/nl.js @@ -17,6 +17,7 @@ OC.L10N.register( "Unsatisfied backend parameters" : "Onvoldoende backend parameters", "Unsatisfied authentication mechanism parameters" : "Onvoldoende authenticatiemechanisme parameters", "Insufficient data: %s" : "Onvoldoende gegevens: %s", + "%s" : "%s", "Personal" : "Persoonlijk", "System" : "Systeem", "Grant access" : "Sta toegang toe", @@ -35,6 +36,15 @@ OC.L10N.register( "(group)" : "(groep)", "Admin defined" : "Beheerder gedefinieerd", "Saved" : "Bewaard", + "Empty response from the server" : "Lege reactie van de server", + "Couldn't access. Please logout and login to activate this mount point" : "Geen toegang. Log uit en opnieuw in om dit koppelpunt te activeren", + "Couldn't get the information from the ownCloud server: {code} {type}" : "Kon geen informatie van de ownCloud server krijgen: {code} {type}", + "Couldn't get the list of external mount points: {type}" : "Kon geen overzicht met externe koppelpunten krijgen: {type}", + "There was an error with message: " : "Er was een fout met de volgende melding:", + "External mount error" : "Extern koppelpunt fout", + "goto-external-storage" : "goto-external-storage", + "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Kon geen overzicht met Windows netwerk koppelpunten krijgen: lege reactie van de server", + "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Sommige van de geconfigureerde koppelpunten zijn niet verbonden. Klok op de rode rij(en) voor meer informatie", "Access key" : "Access Key", "Secret key" : "Geheime sleutel", "Builtin" : "Ingebouwd", diff --git a/apps/files_external/l10n/nl.json b/apps/files_external/l10n/nl.json index e30870e4ae1..09b912445c1 100644 --- a/apps/files_external/l10n/nl.json +++ b/apps/files_external/l10n/nl.json @@ -15,6 +15,7 @@ "Unsatisfied backend parameters" : "Onvoldoende backend parameters", "Unsatisfied authentication mechanism parameters" : "Onvoldoende authenticatiemechanisme parameters", "Insufficient data: %s" : "Onvoldoende gegevens: %s", + "%s" : "%s", "Personal" : "Persoonlijk", "System" : "Systeem", "Grant access" : "Sta toegang toe", @@ -33,6 +34,15 @@ "(group)" : "(groep)", "Admin defined" : "Beheerder gedefinieerd", "Saved" : "Bewaard", + "Empty response from the server" : "Lege reactie van de server", + "Couldn't access. Please logout and login to activate this mount point" : "Geen toegang. Log uit en opnieuw in om dit koppelpunt te activeren", + "Couldn't get the information from the ownCloud server: {code} {type}" : "Kon geen informatie van de ownCloud server krijgen: {code} {type}", + "Couldn't get the list of external mount points: {type}" : "Kon geen overzicht met externe koppelpunten krijgen: {type}", + "There was an error with message: " : "Er was een fout met de volgende melding:", + "External mount error" : "Extern koppelpunt fout", + "goto-external-storage" : "goto-external-storage", + "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Kon geen overzicht met Windows netwerk koppelpunten krijgen: lege reactie van de server", + "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Sommige van de geconfigureerde koppelpunten zijn niet verbonden. Klok op de rode rij(en) voor meer informatie", "Access key" : "Access Key", "Secret key" : "Geheime sleutel", "Builtin" : "Ingebouwd", diff --git a/apps/files_external/l10n/sq.js b/apps/files_external/l10n/sq.js index a708bca92d0..3e2de744b15 100644 --- a/apps/files_external/l10n/sq.js +++ b/apps/files_external/l10n/sq.js @@ -36,6 +36,14 @@ OC.L10N.register( "(group)" : "(grup)", "Admin defined" : "Përcaktuar nga përgjegjësi", "Saved" : "U ruajt", + "Empty response from the server" : "Përgjigje e zbrazët prej shërbyesit", + "Couldn't access. Please logout and login to activate this mount point" : "S’fut dot. Ju lutemi, dilni dhe hyni që të aktivizohet kjo pikë montimi", + "Couldn't get the information from the ownCloud server: {code} {type}" : "S’u morën dot të dhëna nga shërbyesi ownCloud: {code} {type}", + "Couldn't get the list of external mount points: {type}" : "S’u mor dot lista e pikave të jashtme të montimit: {type}", + "There was an error with message: " : "Pati një gabim me këtë mesazh:", + "External mount error" : "Gabim i jashtëm montimi", + "Couldn't get the list of Windows network drive mount points: empty response from the server" : "S’u mor dot lista e pikave të montimit Windows network drive: përgjigje e zbrazët nga shërbyesi", + "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Disa nga pikat e jashtme të formësuara të montimit s’janë të lidhura. Ju lutemi, klikoni në shigjetën(at) e kuqe për më tepër të dhëna", "Access key" : "Kyç hyrjesh", "Secret key" : "Kyç i fshehtë", "Builtin" : "I brendshëm", diff --git a/apps/files_external/l10n/sq.json b/apps/files_external/l10n/sq.json index 655a419c389..f184caf061e 100644 --- a/apps/files_external/l10n/sq.json +++ b/apps/files_external/l10n/sq.json @@ -34,6 +34,14 @@ "(group)" : "(grup)", "Admin defined" : "Përcaktuar nga përgjegjësi", "Saved" : "U ruajt", + "Empty response from the server" : "Përgjigje e zbrazët prej shërbyesit", + "Couldn't access. Please logout and login to activate this mount point" : "S’fut dot. Ju lutemi, dilni dhe hyni që të aktivizohet kjo pikë montimi", + "Couldn't get the information from the ownCloud server: {code} {type}" : "S’u morën dot të dhëna nga shërbyesi ownCloud: {code} {type}", + "Couldn't get the list of external mount points: {type}" : "S’u mor dot lista e pikave të jashtme të montimit: {type}", + "There was an error with message: " : "Pati një gabim me këtë mesazh:", + "External mount error" : "Gabim i jashtëm montimi", + "Couldn't get the list of Windows network drive mount points: empty response from the server" : "S’u mor dot lista e pikave të montimit Windows network drive: përgjigje e zbrazët nga shërbyesi", + "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Disa nga pikat e jashtme të formësuara të montimit s’janë të lidhura. Ju lutemi, klikoni në shigjetën(at) e kuqe për më tepër të dhëna", "Access key" : "Kyç hyrjesh", "Secret key" : "Kyç i fshehtë", "Builtin" : "I brendshëm", diff --git a/apps/files_external/l10n/th_TH.js b/apps/files_external/l10n/th_TH.js index 6c1efa5aacd..bb9c2dc909d 100644 --- a/apps/files_external/l10n/th_TH.js +++ b/apps/files_external/l10n/th_TH.js @@ -17,6 +17,7 @@ OC.L10N.register( "Unsatisfied backend parameters" : "พารามิเตอร์แบ็กเอนด์ไม่ได้รับอนุญาต", "Unsatisfied authentication mechanism parameters" : "การรับรองความถูกต้องไม่เพียงพอ", "Insufficient data: %s" : "ข้อมูลไม่เพียงพอ: %s", + "%s" : "%s", "Personal" : "ส่วนตัว", "System" : "ระบบ", "Grant access" : "อนุญาตให้เข้าถึงได้", diff --git a/apps/files_external/l10n/th_TH.json b/apps/files_external/l10n/th_TH.json index 3de48d733d3..f38d99ae88b 100644 --- a/apps/files_external/l10n/th_TH.json +++ b/apps/files_external/l10n/th_TH.json @@ -15,6 +15,7 @@ "Unsatisfied backend parameters" : "พารามิเตอร์แบ็กเอนด์ไม่ได้รับอนุญาต", "Unsatisfied authentication mechanism parameters" : "การรับรองความถูกต้องไม่เพียงพอ", "Insufficient data: %s" : "ข้อมูลไม่เพียงพอ: %s", + "%s" : "%s", "Personal" : "ส่วนตัว", "System" : "ระบบ", "Grant access" : "อนุญาตให้เข้าถึงได้", diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php index 7a869847a63..f29e08dad25 100644 --- a/apps/files_external/lib/config.php +++ b/apps/files_external/lib/config.php @@ -90,6 +90,7 @@ class OC_Mount_Config { $userStoragesService->setUser($user); foreach ($userGlobalStoragesService->getStorages() as $storage) { + /** @var \OCA\Files_external\Lib\StorageConfig $storage */ $mountPoint = '/'.$uid.'/files'.$storage->getMountPoint(); $mountEntry = self::prepareMountPointEntry($storage, false); foreach ($mountEntry['options'] as &$option) { @@ -267,26 +268,6 @@ class OC_Mount_Config { } /** - * Write the mount points to the config file - * - * @param string|null $user If not null, personal for $user, otherwise system - * @param array $data Mount points - */ - public static function writeData($user, $data) { - if (isset($user)) { - $file = \OC::$server->getUserManager()->get($user)->getHome() . '/mount.json'; - } else { - $config = \OC::$server->getConfig(); - $datadir = $config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data/'); - $file = $config->getSystemValue('mount_file', $datadir . '/mount.json'); - } - - $content = json_encode($data, JSON_PRETTY_PRINT); - @file_put_contents($file, $content); - @chmod($file, 0640); - } - - /** * Get backend dependency message * TODO: move into AppFramework along with templates * @@ -397,39 +378,9 @@ class OC_Mount_Config { } /** - * Merges mount points - * - * @param array $data Existing mount points - * @param array $mountPoint New mount point - * @param string $mountType - * @return array - */ - private static function mergeMountPoints($data, $mountPoint, $mountType) { - $applicable = key($mountPoint); - $mountPath = key($mountPoint[$applicable]); - if (isset($data[$mountType])) { - if (isset($data[$mountType][$applicable])) { - // Merge priorities - if (isset($data[$mountType][$applicable][$mountPath]) - && isset($data[$mountType][$applicable][$mountPath]['priority']) - && !isset($mountPoint[$applicable][$mountPath]['priority']) - ) { - $mountPoint[$applicable][$mountPath]['priority'] - = $data[$mountType][$applicable][$mountPath]['priority']; - } - $data[$mountType][$applicable] - = array_merge($data[$mountType][$applicable], $mountPoint[$applicable]); - } else { - $data[$mountType] = array_merge($data[$mountType], $mountPoint); - } - } else { - $data[$mountType] = $mountPoint; - } - return $data; - } - - /** * Returns the encryption cipher + * + * @return AES */ private static function getCipher() { $cipher = new AES(AES::MODE_CBC); @@ -441,6 +392,9 @@ class OC_Mount_Config { * Computes a hash based on the given configuration. * This is mostly used to find out whether configurations * are the same. + * + * @param array $config + * @return string */ public static function makeConfigHash($config) { $data = json_encode( diff --git a/apps/files_external/lib/personalmount.php b/apps/files_external/lib/personalmount.php index 26f68ba32db..34ae516ea5e 100644 --- a/apps/files_external/lib/personalmount.php +++ b/apps/files_external/lib/personalmount.php @@ -35,12 +35,12 @@ class PersonalMount extends MountPoint implements MoveableMount { protected $storagesService; /** @var int */ - protected $storageId; + protected $numericStorageId; /** * @param UserStoragesService $storagesService * @param int $storageId - * @param string|\OC\Files\Storage\Storage $storage + * @param \OCP\Files\Storage $storage * @param string $mountpoint * @param array $arguments (optional) configuration for the storage backend * @param \OCP\Files\Storage\IStorageFactory $loader @@ -57,7 +57,7 @@ class PersonalMount extends MountPoint implements MoveableMount { ) { parent::__construct($storage, $mountpoint, $arguments, $loader, $mountOptions); $this->storagesService = $storagesService; - $this->storageId = $storageId; + $this->numericStorageId = $storageId; } /** @@ -67,7 +67,7 @@ class PersonalMount extends MountPoint implements MoveableMount { * @return bool */ public function moveMount($target) { - $storage = $this->storagesService->getStorage($this->storageId); + $storage = $this->storagesService->getStorage($this->numericStorageId); // remove "/$user/files" prefix $targetParts = explode('/', trim($target, '/'), 3); $storage->setMountPoint($targetParts[2]); @@ -82,7 +82,7 @@ class PersonalMount extends MountPoint implements MoveableMount { * @return bool */ public function removeMount() { - $this->storagesService->removeStorage($this->storageId); + $this->storagesService->removeStorage($this->numericStorageId); return true; } } diff --git a/apps/files_external/lib/storageconfig.php b/apps/files_external/lib/storageconfig.php index 97e0386be73..49a40a9a5d7 100644 --- a/apps/files_external/lib/storageconfig.php +++ b/apps/files_external/lib/storageconfig.php @@ -163,7 +163,7 @@ class StorageConfig implements \JsonSerializable { } /** - * @param Backend + * @param Backend $backend */ public function setBackend(Backend $backend) { $this->backend= $backend; @@ -177,7 +177,7 @@ class StorageConfig implements \JsonSerializable { } /** - * @param AuthMechanism + * @param AuthMechanism $authMechanism */ public function setAuthMechanism(AuthMechanism $authMechanism) { $this->authMechanism = $authMechanism; diff --git a/apps/files_external/service/storagesservice.php b/apps/files_external/service/storagesservice.php index 9be6498435c..97f79c13324 100644 --- a/apps/files_external/service/storagesservice.php +++ b/apps/files_external/service/storagesservice.php @@ -185,6 +185,9 @@ abstract class StoragesService { */ abstract public function getVisibilityType(); + /** + * @return integer + */ protected function getType() { return DBConfigService::MOUNT_TYPE_ADMIN; } diff --git a/apps/files_external/service/userglobalstoragesservice.php b/apps/files_external/service/userglobalstoragesservice.php index cb49f0f6726..e58815f8a79 100644 --- a/apps/files_external/service/userglobalstoragesservice.php +++ b/apps/files_external/service/userglobalstoragesservice.php @@ -89,6 +89,9 @@ class UserGlobalStoragesService extends GlobalStoragesService { throw new \DomainException('UserGlobalStoragesService writing disallowed'); } + /** + * @param integer $id + */ public function removeStorage($id) { throw new \DomainException('UserGlobalStoragesService writing disallowed'); } diff --git a/apps/files_external/tests/env/entrypoint.sh b/apps/files_external/tests/env/entrypoint.sh new file mode 100755 index 00000000000..6dd6ef23fb6 --- /dev/null +++ b/apps/files_external/tests/env/entrypoint.sh @@ -0,0 +1,274 @@ +#!/bin/bash +set -e + +: ${CLUSTER:=ceph} +: ${RGW_NAME:=$(hostname -s)} +: ${MON_NAME:=$(hostname -s)} +: ${RGW_CIVETWEB_PORT:=80} +: ${OSD_SIZE:=100} + +: ${KEYSTONE_ADMIN_TOKEN:=admin} +: ${KEYSTONE_ADMIN_PORT:=35357} +: ${KEYSTONE_PUBLIC_PORT:=5001} + +: ${KEYSTONE_SERVICE:=${CLUSTER}} +: ${KEYSTONE_ENDPOINT_REGION:=region} + +: ${KEYSTONE_ADMIN_USER:=admin} +: ${KEYSTONE_ADMIN_TENANT:=admin} +: ${KEYSTONE_ADMIN_PASS:=admin} + +ip_address=$(head -n1 /etc/hosts | cut -d" " -f1) +: ${MON_IP:=${ip_address}} +subnet=$(ip route | grep "src ${ip_address}" | cut -d" " -f1) +: ${CEPH_NETWORK:=${subnet}} + +####### +# MON # +####### + +if [ ! -n "$CEPH_NETWORK" ]; then + echo "ERROR- CEPH_NETWORK must be defined as the name of the network for the OSDs" + exit 1 +fi + +if [ ! -n "$MON_IP" ]; then + echo "ERROR- MON_IP must be defined as the IP address of the monitor" + exit 1 +fi + +# bootstrap MON +if [ ! -e /etc/ceph/ceph.conf ]; then + fsid=$(uuidgen) + cat <<ENDHERE >/etc/ceph/${CLUSTER}.conf +[global] +fsid = $fsid +mon initial members = ${MON_NAME} +mon host = ${MON_IP} +auth cluster required = cephx +auth service required = cephx +auth client required = cephx +osd crush chooseleaf type = 0 +osd journal size = 100 +osd pool default pg num = 8 +osd pool default pgp num = 8 +osd pool default size = 1 +public network = ${CEPH_NETWORK} +cluster network = ${CEPH_NETWORK} +debug ms = 1 + +[mon] +debug mon = 20 +debug paxos = 20 +debug auth = 20 + +[osd] +debug osd = 20 +debug filestore = 20 +debug journal = 20 +debug monc = 20 + +[mds] +debug mds = 20 +debug mds balancer = 20 +debug mds log = 20 +debug mds migrator = 20 + +[client.radosgw.gateway] +rgw keystone url = http://${MON_IP}:${KEYSTONE_ADMIN_PORT} +rgw keystone admin token = ${KEYSTONE_ADMIN_TOKEN} +rgw keystone accepted roles = _member_ +ENDHERE + + # Generate administrator key + ceph-authtool /etc/ceph/${CLUSTER}.client.admin.keyring --create-keyring --gen-key -n client.admin --set-uid=0 --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow' + + # Generate the mon. key + ceph-authtool /etc/ceph/${CLUSTER}.mon.keyring --create-keyring --gen-key -n mon. --cap mon 'allow *' + + # Generate initial monitor map + monmaptool --create --add ${MON_NAME} ${MON_IP} --fsid ${fsid} /etc/ceph/monmap +fi + +# If we don't have a monitor keyring, this is a new monitor +if [ ! -e /var/lib/ceph/mon/${CLUSTER}-${MON_NAME}/keyring ]; then + + if [ ! -e /etc/ceph/${CLUSTER}.client.admin.keyring ]; then + echo "ERROR- /etc/ceph/${CLUSTER}.client.admin.keyring must exist; get it from your existing mon" + exit 2 + fi + + if [ ! -e /etc/ceph/${CLUSTER}.mon.keyring ]; then + echo "ERROR- /etc/ceph/${CLUSTER}.mon.keyring must exist. You can extract it from your current monitor by running 'ceph auth get mon. -o /tmp/${CLUSTER}.mon.keyring'" + exit 3 + fi + + if [ ! -e /etc/ceph/monmap ]; then + echo "ERROR- /etc/ceph/monmap must exist. You can extract it from your current monitor by running 'ceph mon getmap -o /tmp/monmap'" + exit 4 + fi + + # Import the client.admin keyring and the monitor keyring into a new, temporary one + ceph-authtool /tmp/${CLUSTER}.mon.keyring --create-keyring --import-keyring /etc/ceph/${CLUSTER}.client.admin.keyring + ceph-authtool /tmp/${CLUSTER}.mon.keyring --import-keyring /etc/ceph/${CLUSTER}.mon.keyring + + # Make the monitor directory + mkdir -p /var/lib/ceph/mon/${CLUSTER}-${MON_NAME} + + # Prepare the monitor daemon's directory with the map and keyring + ceph-mon --mkfs -i ${MON_NAME} --monmap /etc/ceph/monmap --keyring /tmp/${CLUSTER}.mon.keyring + + # Clean up the temporary key + rm /tmp/${CLUSTER}.mon.keyring +fi + +# start MON +ceph-mon -i ${MON_NAME} --public-addr ${MON_IP}:6789 + +# change replica size +ceph osd pool set rbd size 1 + + +####### +# OSD # +####### + +if [ ! -e /var/lib/ceph/osd/${CLUSTER}-0/keyring ]; then + # bootstrap OSD + mkdir -p /var/lib/ceph/osd/${CLUSTER}-0 + # skip btrfs HACK if btrfs is already in place + if [ "$(stat -f /var/lib/ceph/osd/${CLUSTER}-0 2>/dev/null | grep btrfs | wc -l)" == "0" ]; then + # HACK create btrfs loopback device + echo "creating osd storage image" + dd if=/dev/zero of=/tmp/osddata bs=1M count=${OSD_SIZE} + mkfs.btrfs /tmp/osddata + echo "mounting via loopback" + mount -o loop /tmp/osddata /var/lib/ceph/osd/${CLUSTER}-0 + echo "now mounted:" + mount + # end HACK + fi + echo "creating osd" + ceph osd create + echo "creating osd filesystem" + ceph-osd -i 0 --mkfs + echo "creating osd keyring" + ceph auth get-or-create osd.0 osd 'allow *' mon 'allow profile osd' -o /var/lib/ceph/osd/${CLUSTER}-0/keyring + echo "configuring osd crush" + ceph osd crush add 0 1 root=default host=$(hostname -s) + echo "adding osd keyring" + ceph-osd -i 0 -k /var/lib/ceph/osd/${CLUSTER}-0/keyring +fi + +# start OSD +echo "starting osd" +ceph-osd --cluster=${CLUSTER} -i 0 + +#sleep 10 + +####### +# MDS # +####### + +if [ ! -e /var/lib/ceph/mds/${CLUSTER}-0/keyring ]; then + # create ceph filesystem + echo "creating osd pool" + ceph osd pool create cephfs_data 8 + echo "creating osd pool metadata" + ceph osd pool create cephfs_metadata 8 + echo "creating cephfs" + ceph fs new cephfs cephfs_metadata cephfs_data + + # bootstrap MDS + mkdir -p /var/lib/ceph/mds/${CLUSTER}-0 + echo "creating mds auth" + ceph auth get-or-create mds.0 mds 'allow' osd 'allow *' mon 'allow profile mds' > /var/lib/ceph/mds/${CLUSTER}-0/keyring +fi + +# start MDS +echo "starting mds" +ceph-mds --cluster=${CLUSTER} -i 0 + +#sleep 10 + + +####### +# RGW # +####### + +if [ ! -e /var/lib/ceph/radosgw/${RGW_NAME}/keyring ]; then + # bootstrap RGW + mkdir -p /var/lib/ceph/radosgw/${RGW_NAME} + echo "creating rgw auth" + ceph auth get-or-create client.radosgw.gateway osd 'allow rwx' mon 'allow rw' -o /var/lib/ceph/radosgw/${RGW_NAME}/keyring +fi + +# start RGW +echo "starting rgw" +radosgw -c /etc/ceph/ceph.conf -n client.radosgw.gateway -k /var/lib/ceph/radosgw/${RGW_NAME}/keyring --rgw-socket-path="" --rgw-frontends="civetweb port=${RGW_CIVETWEB_PORT}" + + +####### +# API # +####### + +# start ceph-rest-api +echo "starting rest api" +ceph-rest-api -n client.admin & + +############ +# Keystone # +############ + +if [ ! -e /etc/keystone/${CLUSTER}.conf ]; then + cat <<ENDHERE > /etc/keystone/${CLUSTER}.conf +[DEFAULT] +admin_token=${KEYSTONE_ADMIN_TOKEN} +admin_port=${KEYSTONE_ADMIN_PORT} +public_port=${KEYSTONE_PUBLIC_PORT} + +[database] +connection = sqlite:////var/lib/keystone/keystone.db +ENDHERE + + # start Keystone + echo "starting keystone" + keystone-all --config-file /etc/keystone/${CLUSTER}.conf & + + # wait until up + while ! nc ${MON_IP} ${KEYSTONE_ADMIN_PORT} </dev/null; do + sleep 1 + done + + export OS_SERVICE_TOKEN=${KEYSTONE_ADMIN_TOKEN} + export OS_SERVICE_ENDPOINT=http://${MON_IP}:${KEYSTONE_ADMIN_PORT}/v2.0 + + echo "creating keystone service ${KEYSTONE_SERVICE}" + keystone service-create --name ${KEYSTONE_SERVICE} --type object-store + echo "creating keystone endpoint ${KEYSTONE_SERVICE}" + keystone endpoint-create --service ${KEYSTONE_SERVICE} \ + --region ${KEYSTONE_ENDPOINT_REGION} \ + --publicurl http://${MON_IP}:${RGW_CIVETWEB_PORT}/swift/v1 \ + --internalurl http://${MON_IP}:${RGW_CIVETWEB_PORT}/swift/v1 \ + --adminurl http://${MON_IP}:${RGW_CIVETWEB_PORT}/swift/v1 + + echo "creating keystone user ${KEYSTONE_ADMIN_USER}" + keystone user-create --name=${KEYSTONE_ADMIN_USER} --pass=${KEYSTONE_ADMIN_PASS} --email=dev@null.com + echo "creating keystone tenant ${KEYSTONE_ADMIN_TENANT}" + keystone tenant-create --name=${KEYSTONE_ADMIN_TENANT} --description=admin + echo "adding keystone role _member_" + keystone user-role-add --user=${KEYSTONE_ADMIN_USER} --tenant=${KEYSTONE_ADMIN_TENANT} --role=_member_ + + echo "creating keystone role admin" + keystone role-create --name=admin + echo "adding keystone role admin" + keystone user-role-add --user=${KEYSTONE_ADMIN_USER} --tenant=${KEYSTONE_ADMIN_TENANT} --role=admin +fi + + +######### +# WATCH # +######### + +echo "watching ceph" +exec ceph -w diff --git a/apps/files_external/tests/env/start-smb-windows.sh b/apps/files_external/tests/env/start-smb-windows.sh index 9453b4eb3e7..a23c879dd96 100755 --- a/apps/files_external/tests/env/start-smb-windows.sh +++ b/apps/files_external/tests/env/start-smb-windows.sh @@ -19,7 +19,7 @@ user=smb-test password=!owncloud123 host=WIN-9GTFAS08C15 -if ! "$thisFolder"/env/wait-for-connection ${host} 445 0; then +if ! "$thisFolder"/env/wait-for-connection ${host} 445; then echo "[ERROR] Server not reachable" >&2 exit 1 fi diff --git a/apps/files_external/tests/env/start-swift-ceph.sh b/apps/files_external/tests/env/start-swift-ceph.sh index 936bb667e94..f3707aa39f6 100755 --- a/apps/files_external/tests/env/start-swift-ceph.sh +++ b/apps/files_external/tests/env/start-swift-ceph.sh @@ -25,7 +25,7 @@ echo "Fetch recent ${docker_image} docker image" docker pull ${docker_image} # retrieve current folder to place the config in the parent folder -thisFolder=`echo $0 | replace "env/start-swift-ceph.sh" ""` +thisFolder=`echo $0 | sed 's#env/start-swift-ceph\.sh##'` if [ -z "$thisFolder" ]; then thisFolder="." @@ -38,6 +38,7 @@ pass=testing tenant=testenant region=testregion service=testceph +endpointFolder="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" container=`docker run -d \ -e KEYSTONE_PUBLIC_PORT=${port} \ @@ -46,7 +47,10 @@ container=`docker run -d \ -e KEYSTONE_ADMIN_TENANT=${tenant} \ -e KEYSTONE_ENDPOINT_REGION=${region} \ -e KEYSTONE_SERVICE=${service} \ - ${docker_image}` + -e OSD_SIZE=300 \ + -v ${endpointFolder}/entrypoint.sh:/entrypoint.sh \ + --privileged \ + --entrypoint /entrypoint.sh ${docker_image}` host=`docker inspect --format="{{.NetworkSettings.IPAddress}}" $container` @@ -57,8 +61,9 @@ echo "${docker_image} container: $container" echo $container >> $thisFolder/dockerContainerCeph.$EXECUTOR_NUMBER.swift echo -n "Waiting for ceph initialization" -if ! "$thisFolder"/env/wait-for-connection ${host} 80 60; then - echo "[ERROR] Waited 60 seconds, no response" >&2 +if ! "$thisFolder"/env/wait-for-connection ${host} 80 600; then + echo "[ERROR] Waited 600 seconds, no response" >&2 + docker logs $container exit 1 fi sleep 1 diff --git a/apps/files_external/tests/personalmounttest.php b/apps/files_external/tests/personalmounttest.php new file mode 100644 index 00000000000..b56d69aa9be --- /dev/null +++ b/apps/files_external/tests/personalmounttest.php @@ -0,0 +1,50 @@ +<?php +/** + * @author Robin Appelman <icewind@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 OCA\Files_external\Tests; + +use OC\Files\Mount\Manager; +use OCA\Files_External\Lib\PersonalMount; +use Test\TestCase; + +class PersonalMountTest extends TestCase { + public function testFindByStorageId() { + /** @var \OCA\Files_External\Service\UserStoragesService $storageService */ + $storageService = $this->getMockBuilder('\OCA\Files_External\Service\UserStoragesService') + ->disableOriginalConstructor() + ->getMock(); + + $storage = $this->getMockBuilder('\OC\Files\Storage\Storage') + ->disableOriginalConstructor() + ->getMock(); + + $storage->expects($this->any()) + ->method('getId') + ->will($this->returnValue('dummy')); + + $mount = new PersonalMount($storageService, 10, $storage, '/foo'); + + $mountManager = new Manager(); + $mountManager->addMount($mount); + + $this->assertEquals([$mount], $mountManager->findByStorageId('dummy')); + } +} diff --git a/apps/files_external/tests/service/globalstoragesservicetest.php b/apps/files_external/tests/service/globalstoragesservicetest.php index 7c77616563c..e620b05a51e 100644 --- a/apps/files_external/tests/service/globalstoragesservicetest.php +++ b/apps/files_external/tests/service/globalstoragesservicetest.php @@ -23,7 +23,6 @@ namespace OCA\Files_external\Tests\Service; use \OC\Files\Filesystem; -use OCA\Files_External\Service\DBConfigService; use \OCA\Files_external\Service\GlobalStoragesService; use \OCA\Files_external\NotFoundException; use \OCA\Files_external\Lib\StorageConfig; diff --git a/apps/files_sharing/l10n/mk.js b/apps/files_sharing/l10n/mk.js index a5de7fb5c09..5be22894b99 100644 --- a/apps/files_sharing/l10n/mk.js +++ b/apps/files_sharing/l10n/mk.js @@ -1,20 +1,44 @@ OC.L10N.register( "files_sharing", { + "Server to server sharing is not enabled on this server" : "Не е овозможено споделувањето од сервер на сервер на вашиот сервер", + "Invalid or untrusted SSL certificate" : "SSL сертификат кој е невалиден или недоверлив", + "Could not authenticate to remote share, password might be wrong" : "Не можам да се автентицирам на оддалеченото споделевање, веројатно лозинката не е исправна", + "Storage not valid" : "Сториџот не е валиден", + "Couldn't add remote share" : "Не можам да додадам оддалечено споделување", "Shared with you" : "Споделено со тебе", "Shared with others" : "Сподели со останатите", "Shared by link" : "Споделено со врска", + "Nothing shared with you yet" : "Сеуште ништо не е споделено со вас", + "Nothing shared yet" : "Уште ништо не е споделено", + "No shared links" : "Нема споделени врски/линкови", + "Remote share" : "Оддалечено споделување", + "Remote share password" : "Лозинка за оддалечаното споделување", "Cancel" : "Откажи", + "Add remote share" : "Додади оддалечно споделување", + "You can upload into this folder" : "Можете да прикачите во оваа папка", + "Invalid ownCloud url" : "Неисправен ownCloud url", "Shared by" : "Споделено од", "Sharing" : "Споделување", "A file or folder has been <strong>shared</strong>" : "Датотека или фолдер беше <strong>споделен</strong>", "You shared %1$s with %2$s" : "Вие споделивте %1$s со %2$s", "You shared %1$s with group %2$s" : "Вие споделивте %1$s со групата %2$s", "%2$s shared %1$s with you" : "%2$s споделено %1$s со вас", + "Downloaded via public link" : "Преземи преку јавен линк", + "Shared with %2$s" : "Споделено со %2$s", + "Shared with group %2$s" : "Споделено со група %2$s", + "Shared with %3$s by %2$s" : "Споделено со %3$s од %2$s", + "Shared with group %3$s by %2$s" : "Споделено со група %3$s од %2$s", + "Shared via link by %2$s" : "Споделено со врска/линк од %2$s", + "Shared by %2$s" : "Споделено од %2$s", + "Shared via public link" : "Споделено со јавна врска/линк", "Shares" : "Споделувања", + "Accept" : "Прифати", + "Decline" : "Одбиј", "This share is password-protected" : "Ова споделување е заштитено со лозинка", "The password is wrong. Try again." : "Лозинката е грешна. Обиди се повторно.", "Password" : "Лозинка", + "No entries found in this folder" : "Нема ништо во оваа папка", "Name" : "Име", "Share time" : "Сподели време", "Sorry, this link doesn’t seem to work anymore." : "Извенете, но овој линк изгледа дека повеќе не функционира.", @@ -23,8 +47,17 @@ OC.L10N.register( "the link expired" : "времетраењето на линкот е изминато", "sharing is disabled" : "споделувањето не е дозволено", "For more info, please ask the person who sent this link." : "За повеќе информации, прашајте го лицето кое ви ја испратила врската.", + "Add to your ownCloud" : "Додади во вашиот ownCloud", "Download" : "Преземи", "Download %s" : "Преземи %s", - "Direct link" : "Директна врска" + "Direct link" : "Директна врска", + "Federated Cloud Sharing" : "Федерирано клауд споделување", + "Open documentation" : "Отвори ја документацијата", + "Federated Cloud" : "Федериран клауд", + "Your Federated Cloud ID:" : "Вашиот федериран Cloud ID:", + "Share it:" : "Сподели го:", + "Add to your website" : "Додади на твојот веб сајт", + "Share with me via ownCloud" : "Сподели со мене преку ownCloud", + "HTML Code:" : "HTML код:" }, "nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"); diff --git a/apps/files_sharing/l10n/mk.json b/apps/files_sharing/l10n/mk.json index ad7eff6078b..40bcf9f8bde 100644 --- a/apps/files_sharing/l10n/mk.json +++ b/apps/files_sharing/l10n/mk.json @@ -1,18 +1,42 @@ { "translations": { + "Server to server sharing is not enabled on this server" : "Не е овозможено споделувањето од сервер на сервер на вашиот сервер", + "Invalid or untrusted SSL certificate" : "SSL сертификат кој е невалиден или недоверлив", + "Could not authenticate to remote share, password might be wrong" : "Не можам да се автентицирам на оддалеченото споделевање, веројатно лозинката не е исправна", + "Storage not valid" : "Сториџот не е валиден", + "Couldn't add remote share" : "Не можам да додадам оддалечено споделување", "Shared with you" : "Споделено со тебе", "Shared with others" : "Сподели со останатите", "Shared by link" : "Споделено со врска", + "Nothing shared with you yet" : "Сеуште ништо не е споделено со вас", + "Nothing shared yet" : "Уште ништо не е споделено", + "No shared links" : "Нема споделени врски/линкови", + "Remote share" : "Оддалечено споделување", + "Remote share password" : "Лозинка за оддалечаното споделување", "Cancel" : "Откажи", + "Add remote share" : "Додади оддалечно споделување", + "You can upload into this folder" : "Можете да прикачите во оваа папка", + "Invalid ownCloud url" : "Неисправен ownCloud url", "Shared by" : "Споделено од", "Sharing" : "Споделување", "A file or folder has been <strong>shared</strong>" : "Датотека или фолдер беше <strong>споделен</strong>", "You shared %1$s with %2$s" : "Вие споделивте %1$s со %2$s", "You shared %1$s with group %2$s" : "Вие споделивте %1$s со групата %2$s", "%2$s shared %1$s with you" : "%2$s споделено %1$s со вас", + "Downloaded via public link" : "Преземи преку јавен линк", + "Shared with %2$s" : "Споделено со %2$s", + "Shared with group %2$s" : "Споделено со група %2$s", + "Shared with %3$s by %2$s" : "Споделено со %3$s од %2$s", + "Shared with group %3$s by %2$s" : "Споделено со група %3$s од %2$s", + "Shared via link by %2$s" : "Споделено со врска/линк од %2$s", + "Shared by %2$s" : "Споделено од %2$s", + "Shared via public link" : "Споделено со јавна врска/линк", "Shares" : "Споделувања", + "Accept" : "Прифати", + "Decline" : "Одбиј", "This share is password-protected" : "Ова споделување е заштитено со лозинка", "The password is wrong. Try again." : "Лозинката е грешна. Обиди се повторно.", "Password" : "Лозинка", + "No entries found in this folder" : "Нема ништо во оваа папка", "Name" : "Име", "Share time" : "Сподели време", "Sorry, this link doesn’t seem to work anymore." : "Извенете, но овој линк изгледа дека повеќе не функционира.", @@ -21,8 +45,17 @@ "the link expired" : "времетраењето на линкот е изминато", "sharing is disabled" : "споделувањето не е дозволено", "For more info, please ask the person who sent this link." : "За повеќе информации, прашајте го лицето кое ви ја испратила врската.", + "Add to your ownCloud" : "Додади во вашиот ownCloud", "Download" : "Преземи", "Download %s" : "Преземи %s", - "Direct link" : "Директна врска" + "Direct link" : "Директна врска", + "Federated Cloud Sharing" : "Федерирано клауд споделување", + "Open documentation" : "Отвори ја документацијата", + "Federated Cloud" : "Федериран клауд", + "Your Federated Cloud ID:" : "Вашиот федериран Cloud ID:", + "Share it:" : "Сподели го:", + "Add to your website" : "Додади на твојот веб сајт", + "Share with me via ownCloud" : "Сподели со мене преку ownCloud", + "HTML Code:" : "HTML код:" },"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;" }
\ No newline at end of file diff --git a/apps/files_sharing/lib/external/storage.php b/apps/files_sharing/lib/external/storage.php index 2a0d827e064..36ff4f0c226 100644 --- a/apps/files_sharing/lib/external/storage.php +++ b/apps/files_sharing/lib/external/storage.php @@ -265,4 +265,12 @@ class Storage extends DAV implements ISharedStorage { list(, $remote) = explode('://', $this->remote, 2); return $this->remoteUser . '@' . $remote; } + + public function isSharable($path) { + if (\OCP\Util::isSharingDisabledForUser() || !\OC\Share\Share::isResharingAllowed()) { + return false; + } + return ($this->getPermissions($path) & \OCP\Constants::PERMISSION_SHARE); + } + } diff --git a/apps/files_sharing/lib/sharedmount.php b/apps/files_sharing/lib/sharedmount.php index 275fea97c7f..f205b1e78a5 100644 --- a/apps/files_sharing/lib/sharedmount.php +++ b/apps/files_sharing/lib/sharedmount.php @@ -48,6 +48,12 @@ class SharedMount extends MountPoint implements MoveableMount { */ private $user; + /** + * @param string $storage + * @param string $mountpoint + * @param array|null $arguments + * @param \OCP\Files\Storage\IStorageFactory $loader + */ public function __construct($storage, $mountpoint, $arguments = null, $loader = null) { $this->user = $arguments['user']; $this->recipientView = new View('/' . $this->user . '/files'); @@ -59,6 +65,9 @@ class SharedMount extends MountPoint implements MoveableMount { /** * check if the parent folder exists otherwise move the mount point up + * + * @param array $share + * @return string */ private function verifyMountPoint(&$share) { @@ -121,6 +130,7 @@ class SharedMount extends MountPoint implements MoveableMount { * * @param string $path the absolute path * @return string e.g. turns '/admin/files/test.txt' into '/test.txt' + * @throws \OCA\Files_Sharing\Exceptions\BrokenPath */ protected function stripUserFilesPath($path) { $trimmed = ltrim($path, '/'); @@ -183,7 +193,7 @@ class SharedMount extends MountPoint implements MoveableMount { */ public function removeMount() { $mountManager = \OC\Files\Filesystem::getMountManager(); - /** @var \OC\Files\Storage\Shared */ + /** @var $storage \OC\Files\Storage\Shared */ $storage = $this->getStorage(); $result = $storage->unshareStorage(); $mountManager->removeMount($this->mountPoint); @@ -191,7 +201,12 @@ class SharedMount extends MountPoint implements MoveableMount { return $result; } + /** + * @return array + */ public function getShare() { - return $this->getStorage()->getShare(); + /** @var $storage \OC\Files\Storage\Shared */ + $storage = $this->getStorage(); + return $storage->getShare(); } } diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php index cda3f564d5f..38f79762dc6 100644 --- a/apps/files_sharing/lib/sharedstorage.php +++ b/apps/files_sharing/lib/sharedstorage.php @@ -257,7 +257,7 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage { } public function isSharable($path) { - if (\OCP\Util::isSharingDisabledForUser()) { + if (\OCP\Util::isSharingDisabledForUser() || !\OC\Share\Share::isResharingAllowed()) { return false; } return ($this->getPermissions($path) & \OCP\Constants::PERMISSION_SHARE); diff --git a/apps/files_sharing/lib/updater.php b/apps/files_sharing/lib/updater.php index 26044cc1c8e..2d165a5df04 100644 --- a/apps/files_sharing/lib/updater.php +++ b/apps/files_sharing/lib/updater.php @@ -58,6 +58,47 @@ class Shared_Updater { */ static public function renameHook($params) { self::renameChildren($params['oldpath'], $params['newpath']); + self::moveShareToShare($params['newpath']); + } + + /** + * Fix for https://github.com/owncloud/core/issues/20769 + * + * The owner is allowed to move their files (if they are shared) into a receiving folder + * In this case we need to update the parent of the moved share. Since they are + * effectively handing over ownership of the file the rest of the code needs to know + * they need to build up the reshare tree. + * + * @param string $path + */ + static private function moveShareToShare($path) { + $userFolder = \OC::$server->getUserFolder(); + $src = $userFolder->get($path); + + $type = $src instanceof \OCP\Files\File ? 'file' : 'folder'; + $shares = \OCP\Share::getItemShared($type, $src->getId()); + + // If the path we move is not a share we don't care + if (empty($shares)) { + return; + } + + // Check if the destination is inside a share + $mountManager = \OC::$server->getMountManager(); + $dstMount = $mountManager->find($src->getPath()); + if (!($dstMount instanceof \OCA\Files_Sharing\SharedMount)) { + return; + } + + $parenShare = $dstMount->getShare(); + + foreach ($shares as $share) { + $qb = \OC::$server->getDatabaseConnection()->getQueryBuilder(); + $qb->update('share') + ->set('parent', $qb->createNamedParameter($parenShare['id'])) + ->where($qb->expr()->eq('id', $qb->createNamedParameter($share['id']))) + ->execute(); + } } /** diff --git a/apps/files_sharing/tests/api/shareestest.php b/apps/files_sharing/tests/api/shareestest.php index a3e3a6dee6d..96ffe4682c0 100644 --- a/apps/files_sharing/tests/api/shareestest.php +++ b/apps/files_sharing/tests/api/shareestest.php @@ -88,6 +88,11 @@ class ShareesTest extends TestCase { ); } + /** + * @param string $uid + * @param string $displayName + * @return \OCP\IUser|\PHPUnit_Framework_MockObject_MockObject + */ protected function getUserMock($uid, $displayName) { $user = $this->getMockBuilder('OCP\IUser') ->disableOriginalConstructor() @@ -104,6 +109,10 @@ class ShareesTest extends TestCase { return $user; } + /** + * @param string $gid + * @return \OCP\IGroup|\PHPUnit_Framework_MockObject_MockObject + */ protected function getGroupMock($gid) { $group = $this->getMockBuilder('OCP\IGroup') ->disableOriginalConstructor() diff --git a/apps/files_sharing/tests/etagpropagation.php b/apps/files_sharing/tests/etagpropagation.php index de9ce565394..5a917fd1c67 100644 --- a/apps/files_sharing/tests/etagpropagation.php +++ b/apps/files_sharing/tests/etagpropagation.php @@ -34,31 +34,7 @@ use OC\Files\View; * * @package OCA\Files_sharing\Tests */ -class EtagPropagation extends TestCase { - /** - * @var \OC\Files\View - */ - private $rootView; - protected $fileIds = []; // [$user=>[$path=>$id]] - protected $fileEtags = []; // [$id=>$etag] - - public static function setUpBeforeClass() { - parent::setUpBeforeClass(); - \OCA\Files_Sharing\Helper::registerHooks(); - } - - protected function setUp() { - parent::setUp(); - $this->setUpShares(); - } - - protected function tearDown() { - \OC_Hook::clear('OC_Filesystem', 'post_write'); - \OC_Hook::clear('OC_Filesystem', 'post_delete'); - \OC_Hook::clear('OC_Filesystem', 'post_rename'); - \OC_Hook::clear('OCP\Share', 'post_update_permissions'); - parent::tearDown(); - } +class EtagPropagation extends PropagationTestCase { /** * "user1" is the admin who shares a folder "sub1/sub2/folder" with "user2" and "user3" @@ -67,7 +43,7 @@ class EtagPropagation extends TestCase { * "user2" reshares the subdir "sub1/sub2/folder/inside" with "user4" * "user4" puts the received "inside" folder into "sub1/sub2/inside" (this is to check if it propagates across multiple subfolders) */ - private function setUpShares() { + protected function setUpShares() { $this->fileIds[self::TEST_FILES_SHARING_API_USER1] = []; $this->fileIds[self::TEST_FILES_SHARING_API_USER2] = []; $this->fileIds[self::TEST_FILES_SHARING_API_USER3] = []; @@ -136,58 +112,6 @@ class EtagPropagation extends TestCase { } } - /** - * @param string[] $users - * @param string $subPath - */ - private function assertEtagsChanged($users, $subPath = '') { - $oldUser = \OC::$server->getUserSession()->getUser(); - foreach ($users as $user) { - $this->loginAsUser($user); - $id = $this->fileIds[$user][$subPath]; - $path = $this->rootView->getPath($id); - $etag = $this->rootView->getFileInfo($path)->getEtag(); - $this->assertNotEquals($this->fileEtags[$id], $etag, 'Failed asserting that the etag for "' . $subPath . '" of user ' . $user . ' has changed'); - $this->fileEtags[$id] = $etag; - } - $this->loginAsUser($oldUser->getUID()); - } - - /** - * @param string[] $users - * @param string $subPath - */ - private function assertEtagsNotChanged($users, $subPath = '') { - $oldUser = \OC::$server->getUserSession()->getUser(); - foreach ($users as $user) { - $this->loginAsUser($user); - $id = $this->fileIds[$user][$subPath]; - $path = $this->rootView->getPath($id); - $etag = $this->rootView->getFileInfo($path)->getEtag(); - $this->assertEquals($this->fileEtags[$id], $etag, 'Failed asserting that the etag for "' . $subPath . '" of user ' . $user . ' has not changed'); - $this->fileEtags[$id] = $etag; - } - $this->loginAsUser($oldUser->getUID()); - } - - /** - * Assert that the etags for the root, /sub1 and /sub1/sub2 have changed - * - * @param string[] $users - */ - private function assertEtagsForFoldersChanged($users) { - $this->assertEtagsChanged($users); - - $this->assertEtagsChanged($users, 'sub1'); - $this->assertEtagsChanged($users, 'sub1/sub2'); - } - - private function assertAllUnchanged() { - $users = [self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2, - self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]; - $this->assertEtagsNotChanged($users); - } - public function testOwnerWritesToShare() { $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1); Filesystem::file_put_contents('/sub1/sub2/folder/asd.txt', 'bar'); diff --git a/apps/files_sharing/tests/groupetagpropagation.php b/apps/files_sharing/tests/groupetagpropagation.php new file mode 100644 index 00000000000..804d064eadb --- /dev/null +++ b/apps/files_sharing/tests/groupetagpropagation.php @@ -0,0 +1,104 @@ +<?php +/** + * @author Robin Appelman <icewind@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 OCA\Files_sharing\Tests; + +use OC\Files\Filesystem; +use OC\Files\View; + +/** + * @group DB + * + * @package OCA\Files_sharing\Tests + */ +class GroupEtagPropagation extends PropagationTestCase { + /** + * "user1" creates /test, /test/sub and shares with group1 + * "user2" (in group1) reshares /test with group2 and reshared /test/sub with group3 + * "user3" (in group 2) + * "user4" (in group 3) + */ + protected function setUpShares() { + $this->fileIds[self::TEST_FILES_SHARING_API_USER1] = []; + $this->fileIds[self::TEST_FILES_SHARING_API_USER2] = []; + $this->fileIds[self::TEST_FILES_SHARING_API_USER3] = []; + $this->fileIds[self::TEST_FILES_SHARING_API_USER4] = []; + + $this->rootView = new View(''); + $this->loginAsUser(self::TEST_FILES_SHARING_API_USER1); + $view1 = new View('/' . self::TEST_FILES_SHARING_API_USER1 . '/files'); + $view1->mkdir('/test/sub'); + $folderInfo = $view1->getFileInfo('/test'); + \OCP\Share::shareItem('folder', $folderInfo->getId(), \OCP\Share::SHARE_TYPE_GROUP, 'group1', 31); + $this->fileIds[self::TEST_FILES_SHARING_API_USER1][''] = $view1->getFileInfo('')->getId(); + $this->fileIds[self::TEST_FILES_SHARING_API_USER1]['test'] = $view1->getFileInfo('test')->getId(); + $this->fileIds[self::TEST_FILES_SHARING_API_USER1]['test/sub'] = $view1->getFileInfo('test/sub')->getId(); + + $this->loginAsUser(self::TEST_FILES_SHARING_API_USER2); + $view2 = new View('/' . self::TEST_FILES_SHARING_API_USER2 . '/files'); + $folderInfo = $view2->getFileInfo('/test'); + $subFolderInfo = $view2->getFileInfo('/test/sub'); + \OCP\Share::shareItem('folder', $folderInfo->getId(), \OCP\Share::SHARE_TYPE_GROUP, 'group2', 31); + \OCP\Share::shareItem('folder', $subFolderInfo->getId(), \OCP\Share::SHARE_TYPE_GROUP, 'group3', 31); + $this->fileIds[self::TEST_FILES_SHARING_API_USER2][''] = $view2->getFileInfo('')->getId(); + $this->fileIds[self::TEST_FILES_SHARING_API_USER2]['test'] = $view2->getFileInfo('test')->getId(); + $this->fileIds[self::TEST_FILES_SHARING_API_USER2]['test/sub'] = $view2->getFileInfo('test/sub')->getId(); + + $this->loginAsUser(self::TEST_FILES_SHARING_API_USER3); + $view3 = new View('/' . self::TEST_FILES_SHARING_API_USER3 . '/files'); + $this->fileIds[self::TEST_FILES_SHARING_API_USER3][''] = $view3->getFileInfo('')->getId(); + $this->fileIds[self::TEST_FILES_SHARING_API_USER3]['test'] = $view3->getFileInfo('test')->getId(); + $this->fileIds[self::TEST_FILES_SHARING_API_USER3]['test/sub'] = $view3->getFileInfo('test/sub')->getId(); + + $this->loginAsUser(self::TEST_FILES_SHARING_API_USER4); + $view4 = new View('/' . self::TEST_FILES_SHARING_API_USER4 . '/files'); + $this->fileIds[self::TEST_FILES_SHARING_API_USER4][''] = $view4->getFileInfo('')->getId(); + $this->fileIds[self::TEST_FILES_SHARING_API_USER4]['sub'] = $view4->getFileInfo('sub')->getId(); + + foreach ($this->fileIds as $user => $ids) { + $this->loginAsUser($user); + foreach ($ids as $id) { + $path = $this->rootView->getPath($id); + $this->fileEtags[$id] = $this->rootView->getFileInfo($path)->getEtag(); + } + } + } + + public function testGroupReShareRecipientWrites() { + $this->loginAsUser(self::TEST_FILES_SHARING_API_USER3); + + Filesystem::file_put_contents('/test/sub/file.txt', 'asd'); + + $this->assertEtagsChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2, self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]); + + $this->assertAllUnchanged(); + } + + public function testGroupReShareSubFolderRecipientWrites() { + $this->loginAsUser(self::TEST_FILES_SHARING_API_USER4); + + Filesystem::file_put_contents('/sub/file.txt', 'asd'); + + $this->assertEtagsChanged([self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2, self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]); + + $this->assertAllUnchanged(); + } +} diff --git a/apps/files_sharing/tests/propagationtestcase.php b/apps/files_sharing/tests/propagationtestcase.php new file mode 100644 index 00000000000..f397c1fb7a0 --- /dev/null +++ b/apps/files_sharing/tests/propagationtestcase.php @@ -0,0 +1,103 @@ +<?php +/** + * @author Robin Appelman <icewind@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 OCA\Files_sharing\Tests; + +abstract class PropagationTestCase extends TestCase { + /** + * @var \OC\Files\View + */ + protected $rootView; + protected $fileIds = []; // [$user=>[$path=>$id]] + protected $fileEtags = []; // [$id=>$etag] + + public static function setUpBeforeClass() { + parent::setUpBeforeClass(); + \OCA\Files_Sharing\Helper::registerHooks(); + } + + protected function setUp() { + parent::setUp(); + $this->setUpShares(); + } + + protected function tearDown() { + \OC_Hook::clear('OC_Filesystem', 'post_write'); + \OC_Hook::clear('OC_Filesystem', 'post_delete'); + \OC_Hook::clear('OC_Filesystem', 'post_rename'); + \OC_Hook::clear('OCP\Share', 'post_update_permissions'); + parent::tearDown(); + } + + abstract protected function setUpShares(); + + /** + * @param string[] $users + * @param string $subPath + */ + protected function assertEtagsChanged($users, $subPath = '') { + $oldUser = \OC::$server->getUserSession()->getUser(); + foreach ($users as $user) { + $this->loginAsUser($user); + $id = $this->fileIds[$user][$subPath]; + $path = $this->rootView->getPath($id); + $etag = $this->rootView->getFileInfo($path)->getEtag(); + $this->assertNotEquals($this->fileEtags[$id], $etag, 'Failed asserting that the etag for "' . $subPath . '" of user ' . $user . ' has changed'); + $this->fileEtags[$id] = $etag; + } + $this->loginAsUser($oldUser->getUID()); + } + + /** + * @param string[] $users + * @param string $subPath + */ + protected function assertEtagsNotChanged($users, $subPath = '') { + $oldUser = \OC::$server->getUserSession()->getUser(); + foreach ($users as $user) { + $this->loginAsUser($user); + $id = $this->fileIds[$user][$subPath]; + $path = $this->rootView->getPath($id); + $etag = $this->rootView->getFileInfo($path)->getEtag(); + $this->assertEquals($this->fileEtags[$id], $etag, 'Failed asserting that the etag for "' . $subPath . '" of user ' . $user . ' has not changed'); + $this->fileEtags[$id] = $etag; + } + $this->loginAsUser($oldUser->getUID()); + } + + /** + * Assert that the etags for the root, /sub1 and /sub1/sub2 have changed + * + * @param string[] $users + */ + protected function assertEtagsForFoldersChanged($users) { + $this->assertEtagsChanged($users); + + $this->assertEtagsChanged($users, 'sub1'); + $this->assertEtagsChanged($users, 'sub1/sub2'); + } + + protected function assertAllUnchanged() { + $users = [self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER2, + self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER4]; + $this->assertEtagsNotChanged($users); + } +} diff --git a/apps/files_sharing/tests/share.php b/apps/files_sharing/tests/share.php index b5ba0e3ad51..05013ad2e00 100644 --- a/apps/files_sharing/tests/share.php +++ b/apps/files_sharing/tests/share.php @@ -220,6 +220,10 @@ class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase { } + /** + * @param OC\Files\FileInfo[] $content + * @param string[] $expected + */ public function verifyDirContent($content, $expected) { foreach ($content as $c) { if (!in_array($c['name'], $expected)) { diff --git a/apps/files_sharing/tests/testcase.php b/apps/files_sharing/tests/testcase.php index dc5b8ed79d9..a74ee83c25b 100644 --- a/apps/files_sharing/tests/testcase.php +++ b/apps/files_sharing/tests/testcase.php @@ -84,9 +84,15 @@ abstract class TestCase extends \Test\TestCase { $groupBackend = new \OC_Group_Dummy(); $groupBackend->createGroup(self::TEST_FILES_SHARING_API_GROUP1); $groupBackend->createGroup('group'); + $groupBackend->createGroup('group1'); + $groupBackend->createGroup('group2'); + $groupBackend->createGroup('group3'); $groupBackend->addToGroup(self::TEST_FILES_SHARING_API_USER1, 'group'); $groupBackend->addToGroup(self::TEST_FILES_SHARING_API_USER2, 'group'); $groupBackend->addToGroup(self::TEST_FILES_SHARING_API_USER3, 'group'); + $groupBackend->addToGroup(self::TEST_FILES_SHARING_API_USER2, 'group1'); + $groupBackend->addToGroup(self::TEST_FILES_SHARING_API_USER3, 'group2'); + $groupBackend->addToGroup(self::TEST_FILES_SHARING_API_USER4, 'group3'); $groupBackend->addToGroup(self::TEST_FILES_SHARING_API_USER2, self::TEST_FILES_SHARING_API_GROUP1); \OC_Group::useBackend($groupBackend); diff --git a/apps/files_trashbin/l10n/mk.js b/apps/files_trashbin/l10n/mk.js index 6acb933aa80..8a4b16c52d8 100644 --- a/apps/files_trashbin/l10n/mk.js +++ b/apps/files_trashbin/l10n/mk.js @@ -9,6 +9,7 @@ OC.L10N.register( "Delete permanently" : "Трајно избришани", "Error" : "Грешка", "restored" : "повратени", + "No entries found in this folder" : "Нема ништо во оваа папка", "Name" : "Име", "Deleted" : "Избришан" }, diff --git a/apps/files_trashbin/l10n/mk.json b/apps/files_trashbin/l10n/mk.json index a9948f49ff6..2ec0b3c9500 100644 --- a/apps/files_trashbin/l10n/mk.json +++ b/apps/files_trashbin/l10n/mk.json @@ -7,6 +7,7 @@ "Delete permanently" : "Трајно избришани", "Error" : "Грешка", "restored" : "повратени", + "No entries found in this folder" : "Нема ништо во оваа папка", "Name" : "Име", "Deleted" : "Избришан" },"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;" diff --git a/apps/files_trashbin/lib/trashbin.php b/apps/files_trashbin/lib/trashbin.php index 676252e1634..bd6798f0eff 100644 --- a/apps/files_trashbin/lib/trashbin.php +++ b/apps/files_trashbin/lib/trashbin.php @@ -147,7 +147,7 @@ class Trashbin { * * @param string $sourcePath * @param string $owner - * @param $targetPath + * @param string $targetPath * @param $user * @param integer $timestamp */ @@ -410,7 +410,7 @@ class Trashbin { * @param string $uniqueFilename new file name to restore the file without overwriting existing files * @param string $location location if file * @param int $timestamp deletion time - * @return bool + * @return false|null */ private static function restoreVersions(\OC\Files\View $view, $file, $filename, $uniqueFilename, $location, $timestamp) { @@ -500,9 +500,10 @@ class Trashbin { /** * @param \OC\Files\View $view - * @param $file - * @param $filename - * @param $timestamp + * @param string $file + * @param string $filename + * @param integer|null $timestamp + * @param string $user * @return int */ private static function deleteVersions(\OC\Files\View $view, $file, $filename, $timestamp, $user) { @@ -684,7 +685,7 @@ class Trashbin { * * @param array $files list of files sorted by mtime * @param string $user - * @return array size of deleted files and number of deleted files + * @return integer[] size of deleted files and number of deleted files */ public static function deleteExpiredFiles($files, $user) { $application = new Application(); diff --git a/apps/files_trashbin/tests/trashbin.php b/apps/files_trashbin/tests/trashbin.php index c53ed8d8a9b..db7e7e6e840 100644 --- a/apps/files_trashbin/tests/trashbin.php +++ b/apps/files_trashbin/tests/trashbin.php @@ -248,8 +248,8 @@ class Test_Trashbin extends \Test\TestCase { /** * verify that the array contains the expected results - * @param array $result - * @param array $expected + * @param OCP\Files\FileInfo[] $result + * @param string[] $expected */ private function verifyArray($result, $expected) { $this->assertSame(count($expected), count($result)); @@ -268,6 +268,11 @@ class Test_Trashbin extends \Test\TestCase { } } + /** + * @param OCP\Files\FileInfo[] $files + * @param string $trashRoot + * @param integer $expireDate + */ private function manipulateDeleteTime($files, $trashRoot, $expireDate) { $counter = 0; foreach ($files as &$file) { @@ -627,7 +632,6 @@ class Test_Trashbin extends \Test\TestCase { /** * @param string $user * @param bool $create - * @param bool $password */ public static function loginHelper($user, $create = false) { if ($create) { @@ -650,11 +654,20 @@ class Test_Trashbin extends \Test\TestCase { // just a dummy class to make protected methods available for testing class TrashbinForTesting extends Files_Trashbin\Trashbin { + + /** + * @param OCP\Files\FileInfo[] $files + * @param integer $limit + */ public function dummyDeleteExpiredFiles($files, $limit) { // dummy value for $retention_obligation because it is not needed here return parent::deleteExpiredFiles($files, \Test_Trashbin::TEST_TRASHBIN_USER1, $limit, 0); } + /** + * @param OCP\Files\FileInfo[] $files + * @param integer $availableSpace + */ public function dummyDeleteFiles($files, $availableSpace) { return parent::deleteFiles($files, \Test_Trashbin::TEST_TRASHBIN_USER1, $availableSpace); } diff --git a/apps/files_versions/command/expire.php b/apps/files_versions/command/expire.php index 5db33f38772..88723690603 100644 --- a/apps/files_versions/command/expire.php +++ b/apps/files_versions/command/expire.php @@ -35,16 +35,6 @@ class Expire implements ICommand { private $fileName; /** - * @var int|null - */ - private $versionsSize; - - /** - * @var int - */ - private $neededSpace = 0; - - /** * @var string */ private $user; @@ -52,14 +42,10 @@ class Expire implements ICommand { /** * @param string $user * @param string $fileName - * @param int|null $versionsSize - * @param int $neededSpace */ - function __construct($user, $fileName, $versionsSize = null, $neededSpace = 0) { + function __construct($user, $fileName) { $this->user = $user; $this->fileName = $fileName; - $this->versionsSize = $versionsSize; - $this->neededSpace = $neededSpace; } @@ -71,7 +57,7 @@ class Expire implements ICommand { } \OC_Util::setupFS($this->user); - Storage::expire($this->fileName, $this->versionsSize, $this->neededSpace); + Storage::expire($this->fileName); \OC_Util::tearDownFS(); } } diff --git a/apps/files_versions/lib/storage.php b/apps/files_versions/lib/storage.php index 6737bf20f90..21b5e9e0e7b 100644 --- a/apps/files_versions/lib/storage.php +++ b/apps/files_versions/lib/storage.php @@ -168,14 +168,7 @@ class Storage { // create all parent folders self::createMissingDirectories($filename, $users_view); - $versionsSize = self::getVersionsSize($uid); - - // assumption: we need filesize($filename) for the new version + - // some more free space for the modified file which might be - // 1.5 times as large as the current version -> 2.5 - $neededSpace = $files_view->filesize($filename) * 2.5; - - self::scheduleExpire($uid, $filename, $versionsSize, $neededSpace); + self::scheduleExpire($uid, $filename); // store a new version of a file $mtime = $users_view->filemtime('files/' . $filename); @@ -634,14 +627,12 @@ class Storage { * * @param string $uid owner of the file * @param string $fileName file/folder for which to schedule expiration - * @param int|null $versionsSize current versions size - * @param int $neededSpace requested versions size */ - private static function scheduleExpire($uid, $fileName, $versionsSize = null, $neededSpace = 0) { + private static function scheduleExpire($uid, $fileName) { // let the admin disable auto expire $expiration = self::getExpiration(); if ($expiration->isEnabled()) { - $command = new Expire($uid, $fileName, $versionsSize, $neededSpace); + $command = new Expire($uid, $fileName); \OC::$server->getCommandBus()->push($command); } } @@ -649,12 +640,10 @@ class Storage { /** * Expire versions which exceed the quota * - * @param $filename - * @param int|null $versionsSize - * @param int $offset + * @param string $filename * @return bool|int|null */ - public static function expire($filename, $versionsSize = null, $offset = 0) { + public static function expire($filename) { $config = \OC::$server->getConfig(); $expiration = self::getExpiration(); @@ -680,9 +669,7 @@ class Storage { } // make sure that we have the current size of the version history - if ( $versionsSize === null ) { - $versionsSize = self::getVersionsSize($uid); - } + $versionsSize = self::getVersionsSize($uid); // calculate available space for version history // subtract size of files and current versions size from quota @@ -692,12 +679,12 @@ class Storage { $rootInfo = $files_view->getFileInfo('/', false); $free = $quota - $rootInfo['size']; // remaining free space for user if ($free > 0) { - $availableSpace = ($free * self::DEFAULTMAXSIZE / 100) - ($versionsSize + $offset); // how much space can be used for versions + $availableSpace = ($free * self::DEFAULTMAXSIZE / 100) - $versionsSize; // how much space can be used for versions } else { - $availableSpace = $free - $versionsSize - $offset; + $availableSpace = $free - $versionsSize; } } else { - $availableSpace = $quota - $offset; + $availableSpace = $quota; } } else { $availableSpace = PHP_INT_MAX; diff --git a/apps/provisioning_api/tests/groupstest.php b/apps/provisioning_api/tests/groupstest.php index d37f4412e20..f4f3b194944 100644 --- a/apps/provisioning_api/tests/groupstest.php +++ b/apps/provisioning_api/tests/groupstest.php @@ -30,13 +30,13 @@ use OCP\IUserSession; use OCP\IRequest; class GroupsTest extends \Test\TestCase { - /** @var IGroupManager */ + /** @var IGroupManager|\PHPUnit_Framework_MockObject_MockObject */ protected $groupManager; - /** @var IUserSession */ + /** @var IUserSession|\PHPUnit_Framework_MockObject_MockObject */ protected $userSession; - /** @var IRequest */ + /** @var IRequest|\PHPUnit_Framework_MockObject_MockObject */ protected $request; - /** @var \OC\SubAdmin */ + /** @var \OC\SubAdmin|\PHPUnit_Framework_MockObject_MockObject */ protected $subAdminManager; /** @var \OCA\Provisioning_API\Groups */ protected $api; @@ -58,6 +58,10 @@ class GroupsTest extends \Test\TestCase { ); } + /** + * @param string $gid + * @return \OCP\IGroup|\PHPUnit_Framework_MockObject_MockObject + */ private function createGroup($gid) { $group = $this->getMock('OCP\IGroup'); $group @@ -66,6 +70,10 @@ class GroupsTest extends \Test\TestCase { return $group; } + /** + * @param string $uid + * @return \OCP\IUser|\PHPUnit_Framework_MockObject_MockObject + */ private function createUser($uid) { $user = $this->getMock('OCP\IUser'); $user diff --git a/apps/user_ldap/ajax/testConfiguration.php b/apps/user_ldap/ajax/testConfiguration.php index f5fd5f23b87..47fc776983a 100644 --- a/apps/user_ldap/ajax/testConfiguration.php +++ b/apps/user_ldap/ajax/testConfiguration.php @@ -49,7 +49,7 @@ try { * pass (like e.g. expected syntax error). */ try { - $ldapWrapper->read($connection->getConnectionResource(), 'neverwhere', 'objectClass=*', array('dn')); + $ldapWrapper->read($connection->getConnectionResource(), '', 'objectClass=*', array('dn')); } catch (\Exception $e) { if($e->getCode() === 1) { OCP\JSON::error(array('message' => $l->t('The configuration is invalid: anonymous bind is not allowed.'))); diff --git a/apps/user_ldap/js/wizard/wizardTabGeneric.js b/apps/user_ldap/js/wizard/wizardTabGeneric.js index 60e7cd2ad9e..8940a8468a0 100644 --- a/apps/user_ldap/js/wizard/wizardTabGeneric.js +++ b/apps/user_ldap/js/wizard/wizardTabGeneric.js @@ -198,9 +198,13 @@ OCA = OCA || {}; return; } - // deal with text area + // special cases: deal with text area and multiselect if ($element.is('textarea') && $.isArray(value)) { value = value.join("\n"); + } else if($element.hasClass(this.multiSelectPluginClass)) { + if(!_.isArray(value)) { + value = value.split("\n"); + } } if ($element.is('span')) { diff --git a/autotest-external.sh b/autotest-external.sh index 86fb796627c..6128f68136f 100755 --- a/autotest-external.sh +++ b/autotest-external.sh @@ -193,7 +193,8 @@ EOF echo "name: $name" # execute start file - if ./$FILES_EXTERNAL_BACKEND_ENV_PATH/$startFile; then + ./$FILES_EXTERNAL_BACKEND_ENV_PATH/$startFile + if [ $? -eq 0 ]; then # getting backend to test from filename # it's the part between the dots startSomething.TestToRun.sh testToRun=`echo $startFile | cut -d '-' -f 2` @@ -209,6 +210,8 @@ EOF "$PHPUNIT" --configuration phpunit-autotest-external.xml --log-junit "autotest-external-results-$1-$name.xml" "$FILES_EXTERNAL_BACKEND_PATH/$testToRun.php" RESULT=$? fi + else + DOEXIT=1 fi # calculate stop file @@ -218,6 +221,10 @@ EOF # execute stop file if existant ./$FILES_EXTERNAL_BACKEND_ENV_PATH/$stopFile fi + if [ "$DOEXIT" ]; then + echo "Error during start file execution ... terminating" + exit $DOEXIT + fi done; } diff --git a/build/integration/features/bootstrap/CapabilitiesContext.php b/build/integration/features/bootstrap/CapabilitiesContext.php index 4e200bdf421..1b0015dce73 100644 --- a/build/integration/features/bootstrap/CapabilitiesContext.php +++ b/build/integration/features/bootstrap/CapabilitiesContext.php @@ -2,8 +2,6 @@ use Behat\Behat\Context\Context; use Behat\Behat\Context\SnippetAcceptingContext; -use GuzzleHttp\Client; -use GuzzleHttp\Message\ResponseInterface; require __DIR__ . '/../../vendor/autoload.php'; diff --git a/build/integration/features/bootstrap/WebDav.php b/build/integration/features/bootstrap/WebDav.php index a682467f52d..49cd565cf26 100644 --- a/build/integration/features/bootstrap/WebDav.php +++ b/build/integration/features/bootstrap/WebDav.php @@ -97,6 +97,15 @@ trait WebDav{ PHPUnit_Framework_Assert::assertEquals($content, (string)$this->response->getBody()); } + /** + * @Then /^Downloaded content when downloading file "([^"]*)" with range "([^"]*)" should be "([^"]*)"$/ + */ + public function downloadedContentWhenDownloadindShouldBe($fileSource, $range, $content){ + $this->downloadFileWithRange($fileSource, $range); + $this->downloadedContentShouldBe($content); + } + + /*Returns the elements of a propfind, $folderDepth requires 1 to see elements without children*/ public function listFolder($user, $path, $folderDepth){ $fullUrl = substr($this->baseUrl, 0, -4); @@ -126,7 +135,7 @@ trait WebDav{ * @param \Behat\Gherkin\Node\TableNode|null $expectedElements */ public function checkElementList($user, $expectedElements){ - $elementList = $this->listFolder($user, '/', 2); + $elementList = $this->listFolder($user, '/', 3); if ($expectedElements instanceof \Behat\Gherkin\Node\TableNode) { $elementRows = $expectedElements->getRows(); $elementsSimplified = $this->simplifyArray($elementRows); @@ -153,5 +162,17 @@ trait WebDav{ } } + /** + * @Given User :user created a folder :destination + */ + public function userCreatedAFolder($user, $destination){ + try { + $this->response = $this->makeDavRequest($user, "MKCOL", $destination, []); + } catch (\GuzzleHttp\Exception\ServerException $e) { + // 4xx and 5xx responses cause an exception + $this->response = $e->getResponse(); + } + } + } diff --git a/build/integration/features/sharing-v1.feature b/build/integration/features/sharing-v1.feature index e00fd47baeb..31ba0d4ad7f 100644 --- a/build/integration/features/sharing-v1.feature +++ b/build/integration/features/sharing-v1.feature @@ -379,6 +379,47 @@ Feature: sharing | /CHILD/child.txt | And the HTTP status code should be "200" + Scenario: Share a file by multiple channels + Given As an "admin" + And user "user0" exists + And user "user1" exists + And user "user2" exists + And group "group0" exists + And user "user1" belongs to group "group0" + And user "user2" belongs to group "group0" + And user "user0" created a folder "/common" + And user "user0" created a folder "/common/sub" + And file "common" of user "user0" is shared with group "group0" + And file "textfile0.txt" of user "user1" is shared with user "user2" + And User "user1" moved file "/textfile0.txt" to "/common/textfile0.txt" + And User "user1" moved file "/common/textfile0.txt" to "/common/sub/textfile0.txt" + And As an "user2" + When Downloading file "/common/sub/textfile0.txt" with range "bytes=9-17" + Then Downloaded content should be "test text" + And Downloaded content when downloading file "/textfile0.txt" with range "bytes=9-17" should be "test text" + And user "user2" should see following elements + | /common/sub/textfile0.txt | + + Scenario: Share a file by multiple channels + Given As an "admin" + And user "user0" exists + And user "user1" exists + And user "user2" exists + And group "group0" exists + And user "user1" belongs to group "group0" + And user "user2" belongs to group "group0" + And user "user0" created a folder "/common" + And user "user0" created a folder "/common/sub" + And file "common" of user "user0" is shared with group "group0" + And file "textfile0.txt" of user "user1" is shared with user "user2" + And User "user1" moved file "/textfile0.txt" to "/common/textfile0.txt" + And User "user1" moved file "/common/textfile0.txt" to "/common/sub/textfile0.txt" + And As an "user2" + When Downloading file "/textfile0.txt" with range "bytes=9-17" + Then Downloaded content should be "test text" + And user "user2" should see following elements + | /common/sub/textfile0.txt | + Scenario: Delete all group shares Given As an "admin" And user "user0" exists diff --git a/build/integration/run.sh b/build/integration/run.sh index 76c01068deb..5a222bda3e3 100755 --- a/build/integration/run.sh +++ b/build/integration/run.sh @@ -2,6 +2,9 @@ composer install +SCENARIO_TO_RUN=$1 +HIDE_OC_LOGS=$2 + # avoid port collision on jenkins - use $EXECUTOR_NUMBER if [ -z "$EXECUTOR_NUMBER" ]; then EXECUTOR_NUMBER=0 @@ -21,13 +24,15 @@ echo $PHPPID_FED export TEST_SERVER_URL="http://localhost:$PORT/ocs/" export TEST_SERVER_FED_URL="http://localhost:$PORT_FED/ocs/" -vendor/bin/behat -f junit -f pretty $1 +vendor/bin/behat -f junit -f pretty $SCENARIO_TO_RUN RESULT=$? kill $PHPPID kill $PHPPID_FED -tail "../../data/owncloud.log" +if [ -z $HIDE_OC_LOGS ]; then + tail "../../data/owncloud.log" +fi exit $RESULT diff --git a/config/config.sample.php b/config/config.sample.php index c3abe3a2b87..9b10792944f 100644 --- a/config/config.sample.php +++ b/config/config.sample.php @@ -815,6 +815,19 @@ $CONFIG = array( 'enforce_home_folder_naming_rule' => true, /** + * Comments + * + * Global settings for the Comments infrastructure + */ + +/** + * Replaces the default Comments Manager Factory. This can be utilized if an + * own or 3rdParty CommentsManager should be used that – for instance – uses the + * filesystem instead of the database to keep the comments. + */ +'comments.managerFactory' => '\OC\Comments\ManagerFactory', + +/** * Maintenance * * These options are for halting user activity when you are performing server diff --git a/core/command/app/getpath.php b/core/command/app/getpath.php new file mode 100644 index 00000000000..7cfa01d48af --- /dev/null +++ b/core/command/app/getpath.php @@ -0,0 +1,62 @@ +<?php +/** + * @author Victor Dubiniuk <dubiniuk@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\Core\Command\App; + +use OC\Core\Command\Base; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; + +class GetPath extends Base { + protected function configure() { + parent::configure(); + + $this + ->setName('app:getpath') + ->setDescription('Get an absolute path to the app directory') + ->addArgument( + 'app', + InputArgument::REQUIRED, + 'Name of the app' + ) + ; + } + + /** + * Executes the current command. + * + * @param InputInterface $input An InputInterface instance + * @param OutputInterface $output An OutputInterface instance + * @return null|int null or 0 if everything went fine, or an error code + */ + protected function execute(InputInterface $input, OutputInterface $output) { + $appName = $input->getArgument('app'); + $path = \OC_App::getAppPath($appName); + if ($path !== false) { + $output->writeln($path); + return 0; + } + + // App not found, exit with non-zero + return 1; + } +} diff --git a/core/command/maintenance/install.php b/core/command/maintenance/install.php index b0235c518ec..d4ef72c9fc8 100644 --- a/core/command/maintenance/install.php +++ b/core/command/maintenance/install.php @@ -68,7 +68,12 @@ class Install extends Command { $errors = $sysInfo['errors']; if (count($errors) > 0) { $this->printErrors($output, $errors); - return 1; + + // ignore the OS X setup warning + if(count($errors) !== 1 || + (string)($errors[0]['error']) !== 'Mac OS X is not supported and ownCloud will not work properly on this platform. Use it at your own risk! ') { + return 1; + } } // validate user input diff --git a/core/js/sharedialogshareelistview.js b/core/js/sharedialogshareelistview.js index dfe5789e774..daed8a439bb 100644 --- a/core/js/sharedialogshareelistview.js +++ b/core/js/sharedialogshareelistview.js @@ -245,12 +245,14 @@ onUnshare: function(event) { var $element = $(event.target); - console.log($element); + if (!$element.is('a')) { + $element = $element.closest('a'); + } - var $loading = $element.siblings('.icon-loading-small').eq(0); + var $loading = $element.find('.icon-loading-small').eq(0); if(!$loading.hasClass('hidden')) { // in process - return; + return false; } $loading.removeClass('hidden'); diff --git a/core/l10n/cs_CZ.js b/core/l10n/cs_CZ.js index 94fe0489390..c9c8ca08ebe 100644 --- a/core/l10n/cs_CZ.js +++ b/core/l10n/cs_CZ.js @@ -266,6 +266,7 @@ OC.L10N.register( "Please try again or contact your administrator." : "Prosím zkuste to znovu nebo kontaktujte vašeho správce.", "Log in" : "Přihlásit", "Wrong password. Reset it?" : "Nesprávné heslo. Resetovat?", + "Wrong password." : "Chybné heslo.", "Stay logged in" : "Neodhlašovat", "Alternative Logins" : "Alternativní přihlášení", "This ownCloud instance is currently in single user mode." : "Tato instalace ownCloudu je momentálně v jednouživatelském módu.", diff --git a/core/l10n/cs_CZ.json b/core/l10n/cs_CZ.json index 08c93b63888..4fa79ebec9c 100644 --- a/core/l10n/cs_CZ.json +++ b/core/l10n/cs_CZ.json @@ -264,6 +264,7 @@ "Please try again or contact your administrator." : "Prosím zkuste to znovu nebo kontaktujte vašeho správce.", "Log in" : "Přihlásit", "Wrong password. Reset it?" : "Nesprávné heslo. Resetovat?", + "Wrong password." : "Chybné heslo.", "Stay logged in" : "Neodhlašovat", "Alternative Logins" : "Alternativní přihlášení", "This ownCloud instance is currently in single user mode." : "Tato instalace ownCloudu je momentálně v jednouživatelském módu.", diff --git a/core/l10n/fi_FI.js b/core/l10n/fi_FI.js index f167292ec13..5291a0d1c2a 100644 --- a/core/l10n/fi_FI.js +++ b/core/l10n/fi_FI.js @@ -266,6 +266,7 @@ OC.L10N.register( "Please try again or contact your administrator." : "Yritä uudestaan tai ota yhteys ylläpitäjään.", "Log in" : "Kirjaudu sisään", "Wrong password. Reset it?" : "Väärä salasana. Haluatko palauttaa salasanan?", + "Wrong password." : "Väärä salasana.", "Stay logged in" : "Pysy sisäänkirjautuneena", "Alternative Logins" : "Vaihtoehtoiset kirjautumiset", "This ownCloud instance is currently in single user mode." : "Tämä ownCloud-asennus on parhaillaan single user -tilassa.", diff --git a/core/l10n/fi_FI.json b/core/l10n/fi_FI.json index d98473c9f59..b5312561062 100644 --- a/core/l10n/fi_FI.json +++ b/core/l10n/fi_FI.json @@ -264,6 +264,7 @@ "Please try again or contact your administrator." : "Yritä uudestaan tai ota yhteys ylläpitäjään.", "Log in" : "Kirjaudu sisään", "Wrong password. Reset it?" : "Väärä salasana. Haluatko palauttaa salasanan?", + "Wrong password." : "Väärä salasana.", "Stay logged in" : "Pysy sisäänkirjautuneena", "Alternative Logins" : "Vaihtoehtoiset kirjautumiset", "This ownCloud instance is currently in single user mode." : "Tämä ownCloud-asennus on parhaillaan single user -tilassa.", diff --git a/core/l10n/fr.js b/core/l10n/fr.js index 4bb7aa82c97..f845185c525 100644 --- a/core/l10n/fr.js +++ b/core/l10n/fr.js @@ -266,6 +266,7 @@ OC.L10N.register( "Please try again or contact your administrator." : "Veuillez réessayer ou contacter votre administrateur.", "Log in" : "Se connecter", "Wrong password. Reset it?" : "Mot de passe incorrect. Réinitialiser ?", + "Wrong password." : "Mot de passe incorrect.", "Stay logged in" : "Rester connecté", "Alternative Logins" : "Identifiants alternatifs", "This ownCloud instance is currently in single user mode." : "Cette instance de ownCloud est actuellement en mode utilisateur unique.", diff --git a/core/l10n/fr.json b/core/l10n/fr.json index 02347de1707..070e03a9587 100644 --- a/core/l10n/fr.json +++ b/core/l10n/fr.json @@ -264,6 +264,7 @@ "Please try again or contact your administrator." : "Veuillez réessayer ou contacter votre administrateur.", "Log in" : "Se connecter", "Wrong password. Reset it?" : "Mot de passe incorrect. Réinitialiser ?", + "Wrong password." : "Mot de passe incorrect.", "Stay logged in" : "Rester connecté", "Alternative Logins" : "Identifiants alternatifs", "This ownCloud instance is currently in single user mode." : "Cette instance de ownCloud est actuellement en mode utilisateur unique.", diff --git a/core/l10n/it.js b/core/l10n/it.js index c6cfb7d78d2..dd472ea6418 100644 --- a/core/l10n/it.js +++ b/core/l10n/it.js @@ -266,6 +266,7 @@ OC.L10N.register( "Please try again or contact your administrator." : "Prova ancora o contatta il tuo amministratore.", "Log in" : "Accedi", "Wrong password. Reset it?" : "Password errata. Vuoi reimpostarla?", + "Wrong password." : "Password errata.", "Stay logged in" : "Rimani collegato", "Alternative Logins" : "Accessi alternativi", "This ownCloud instance is currently in single user mode." : "Questa istanza di ownCloud è in modalità utente singolo.", diff --git a/core/l10n/it.json b/core/l10n/it.json index 4f3bc172318..37d17409e91 100644 --- a/core/l10n/it.json +++ b/core/l10n/it.json @@ -264,6 +264,7 @@ "Please try again or contact your administrator." : "Prova ancora o contatta il tuo amministratore.", "Log in" : "Accedi", "Wrong password. Reset it?" : "Password errata. Vuoi reimpostarla?", + "Wrong password." : "Password errata.", "Stay logged in" : "Rimani collegato", "Alternative Logins" : "Accessi alternativi", "This ownCloud instance is currently in single user mode." : "Questa istanza di ownCloud è in modalità utente singolo.", diff --git a/core/l10n/ja.js b/core/l10n/ja.js index 375b8c8a789..9d700b71d25 100644 --- a/core/l10n/ja.js +++ b/core/l10n/ja.js @@ -114,7 +114,7 @@ OC.L10N.register( "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "メモリキャッシュが設定されていません。パフォーマンスを向上するために、可能であれば memcache を設定してください。 より詳しい情報については、<a href=\"{docLink}\">documentation</a> を参照してください。", "/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>." : "/dev/urandom は PHP から読み取ることができず、この状態はセキュリティの観点からおすすめできません。より詳しい情報については、<a href=\"{docLink}\">documentation</a> を参照ください。", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "ご利用のPHPのバージョン ({version}) は、<a href=\"{phpLink}\">PHPでサポート</a> されていません。 我々は、PHPから提供されている新しいバージョンにアップグレードし、それによるセキュリティの確保とパフォーマンスのメリットを受けられることを強くお勧めします。", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "リバースプロキシーのヘッダー設定が間違っているか、または信頼されたプロキシーからownCloudにアクセスしていません。もし、信頼されたプロキシーからアクセスしているのでないなら、セキュリティに問題があり、ownCloudを詐称したIPアドレスから攻撃者に対して見えるよう許可していることになります。詳細な情報は、<a href=\"{docLink}\">ドキュメント</a>を確認してください。", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "リバースプロキシのヘッダー設定が間違っているか、または信頼されたプロキシからownCloudにアクセスしていません。もし、信頼されたプロキシからアクセスしているのでないなら、セキュリティに問題があり、ownCloudを詐称したIPアドレスから攻撃者に対して見えるよう許可していることになります。詳細な情報は、<a href=\"{docLink}\">ドキュメント</a>を確認してください。", "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached は分散キャッシュとして設定されていますが、間違った\"memcache\"のPHPモジュールがインストールされています。 \\OC\\Memcache\\Memcached は、\"memcached\" のみをサポートしていますが、\"memcache\" ではありません。<a href=\"{wikiLink}\">memcached wiki で両方のモジュール</a> を見てください。", "Error occurred while checking server setup" : "サーバー設定のチェック中にエラーが発生しました", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" HTTP ヘッダは \"{expected}\" に設定されていません。これは潜在的なセキュリティリスクもしくはプライバシーリスクとなる可能性があるため、この設定を見直すことをおすすめします。", @@ -261,6 +261,7 @@ OC.L10N.register( "Please try again or contact your administrator." : "もう一度試してみるか、管理者に問い合わせてください。", "Log in" : "ログイン", "Wrong password. Reset it?" : "パスワードが間違っています。リセットしますか?", + "Wrong password." : "パスワードが間違っています。", "Stay logged in" : "ログインしたままにする", "Alternative Logins" : "代替ログイン", "This ownCloud instance is currently in single user mode." : "このownCloudインスタンスは、現在シングルユーザーモードです。", diff --git a/core/l10n/ja.json b/core/l10n/ja.json index 337358d57f7..68930ad01c3 100644 --- a/core/l10n/ja.json +++ b/core/l10n/ja.json @@ -112,7 +112,7 @@ "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "メモリキャッシュが設定されていません。パフォーマンスを向上するために、可能であれば memcache を設定してください。 より詳しい情報については、<a href=\"{docLink}\">documentation</a> を参照してください。", "/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>." : "/dev/urandom は PHP から読み取ることができず、この状態はセキュリティの観点からおすすめできません。より詳しい情報については、<a href=\"{docLink}\">documentation</a> を参照ください。", "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "ご利用のPHPのバージョン ({version}) は、<a href=\"{phpLink}\">PHPでサポート</a> されていません。 我々は、PHPから提供されている新しいバージョンにアップグレードし、それによるセキュリティの確保とパフォーマンスのメリットを受けられることを強くお勧めします。", - "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "リバースプロキシーのヘッダー設定が間違っているか、または信頼されたプロキシーからownCloudにアクセスしていません。もし、信頼されたプロキシーからアクセスしているのでないなら、セキュリティに問題があり、ownCloudを詐称したIPアドレスから攻撃者に対して見えるよう許可していることになります。詳細な情報は、<a href=\"{docLink}\">ドキュメント</a>を確認してください。", + "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "リバースプロキシのヘッダー設定が間違っているか、または信頼されたプロキシからownCloudにアクセスしていません。もし、信頼されたプロキシからアクセスしているのでないなら、セキュリティに問題があり、ownCloudを詐称したIPアドレスから攻撃者に対して見えるよう許可していることになります。詳細な情報は、<a href=\"{docLink}\">ドキュメント</a>を確認してください。", "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached は分散キャッシュとして設定されていますが、間違った\"memcache\"のPHPモジュールがインストールされています。 \\OC\\Memcache\\Memcached は、\"memcached\" のみをサポートしていますが、\"memcache\" ではありません。<a href=\"{wikiLink}\">memcached wiki で両方のモジュール</a> を見てください。", "Error occurred while checking server setup" : "サーバー設定のチェック中にエラーが発生しました", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "\"{header}\" HTTP ヘッダは \"{expected}\" に設定されていません。これは潜在的なセキュリティリスクもしくはプライバシーリスクとなる可能性があるため、この設定を見直すことをおすすめします。", @@ -259,6 +259,7 @@ "Please try again or contact your administrator." : "もう一度試してみるか、管理者に問い合わせてください。", "Log in" : "ログイン", "Wrong password. Reset it?" : "パスワードが間違っています。リセットしますか?", + "Wrong password." : "パスワードが間違っています。", "Stay logged in" : "ログインしたままにする", "Alternative Logins" : "代替ログイン", "This ownCloud instance is currently in single user mode." : "このownCloudインスタンスは、現在シングルユーザーモードです。", diff --git a/core/l10n/nl.js b/core/l10n/nl.js index ffff693e95c..563a10ff409 100644 --- a/core/l10n/nl.js +++ b/core/l10n/nl.js @@ -18,6 +18,8 @@ OC.L10N.register( "Repair error: " : "Reparatiefout:", "Set log level to debug - current level: \"%s\"" : "Instellen logniveau op debug - huidige niveau: \"%s\"", "Reset log level to \"%s\"" : "Terugzetten logniveau op \"#%s\"", + "Starting code integrity check" : "Starten code betrouwbaarheidscontrole", + "Finished code integrity check" : "Gereed met code betrouwbaarheidscontrole", "%s (3rdparty)" : "%s (3rdparty)", "%s (incompatible)" : "%s (incompatibel)", "Following apps have been disabled: %s" : "De volgende apps zijn gedeactiveerd: %s", @@ -77,6 +79,7 @@ OC.L10N.register( "Oct." : "Okt.", "Nov." : "Nov.", "Dec." : "Dec.", + "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Er traden problemen op tijdens de code betrouwbaarheidscontrole. Meer informatie…</a>", "Settings" : "Instellingen", "Saving..." : "Opslaan", "seconds ago" : "seconden geleden", @@ -116,6 +119,7 @@ OC.L10N.register( "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "UwPHP versie ({version}) wordt niet langer <a href=\"{phpLink}\">ondersteund door PHP</a>. We adviseren u om uw PHP versie te upgraden voor betere prestaties en security updates geleverd door PHP.", "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "De reverse proxy headerconfiguratie is onjuist, of u hebt toegang tot ownCloud via een vertrouwde proxy. Als u ownCloud niet via een vertrouwde proxy benadert, dan levert dan een beveiligingsrisico op, waardoor een aanvaller het IP-adres dat ownCloud ziet kan spoofen. Meer informatie is te vinden in onze <a href=\"{docLink}\">documentatie</a>.", "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached is geconfigureerd als gedistribueerde cache, maar de verkeerde PHP module \"memcache\" is geïnstalleerd. \\OC\\Memcache\\Memcached ondersteunt alleen \"memcached\" en niet \"memcache\". Zie de <a href=\"{wikiLink}\">memcached wiki over beide modules</a>.", + "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Sommige bestanden kwamen niet door de code betrouwbaarheidscontrole. Meer informatie over het oplossen van dit probleem kan worden gevonden in onze <a href=\"{docLink}\">documentatie</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lijst met ongeldige bestanden…</a> / <a href=\"{rescanEndpoint}\">Opnieuw…</a>)", "Error occurred while checking server setup" : "Een fout trad op bij checken serverconfiguratie", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "De \"{header}\" HTTP header is niet overeenkomstig met \"{expected}\" geconfigureerd. Dit is een potentieel security of privacy risico en we adviseren om deze instelling te wijzigen.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "De \"Strict-Transport-Security\" HTTP header is niet geconfigureerd als minimaal \"{seconds}\" seconden. Voor verbeterde beveiliging adviseren we HSTS in te schakelen zoals beschreven in onze <a href=\"{docUrl}\">security tips</a>.", @@ -187,6 +191,7 @@ OC.L10N.register( "Couldn't reset password because the token is invalid" : "Kon het wachtwoord niet herstellen, omdat het token ongeldig is", "Couldn't reset password because the token is expired" : "Kon het wachtwoord niet herstellen, omdat het token verlopen is", "Couldn't send reset email. Please make sure your username is correct." : "Kon e-mail niet versturen. Verifieer of uw gebruikersnaam correct is.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Kon geen herstel e-mail versturen, omdat er geen e-mailadres bekend is bij deze gebruikersnaam. Neem contact op met uw beheerder.", "%s password reset" : "%s wachtwoord reset", "Use the following link to reset your password: {link}" : "Gebruik de volgende link om uw wachtwoord te resetten: {link}", "New password" : "Nieuw wachtwoord", @@ -261,6 +266,7 @@ OC.L10N.register( "Please try again or contact your administrator." : "Probeer het opnieuw of neem contact op met uw beheerder.", "Log in" : "Meld u aan", "Wrong password. Reset it?" : "Onjuist wachtwoord. Resetten?", + "Wrong password." : "Onjuist wachtwoord.", "Stay logged in" : "Ingelogd blijven", "Alternative Logins" : "Alternatieve inlogs", "This ownCloud instance is currently in single user mode." : "Deze ownCloud werkt momenteel in enkele gebruiker modus.", diff --git a/core/l10n/nl.json b/core/l10n/nl.json index a387d496092..012fd33ba90 100644 --- a/core/l10n/nl.json +++ b/core/l10n/nl.json @@ -16,6 +16,8 @@ "Repair error: " : "Reparatiefout:", "Set log level to debug - current level: \"%s\"" : "Instellen logniveau op debug - huidige niveau: \"%s\"", "Reset log level to \"%s\"" : "Terugzetten logniveau op \"#%s\"", + "Starting code integrity check" : "Starten code betrouwbaarheidscontrole", + "Finished code integrity check" : "Gereed met code betrouwbaarheidscontrole", "%s (3rdparty)" : "%s (3rdparty)", "%s (incompatible)" : "%s (incompatibel)", "Following apps have been disabled: %s" : "De volgende apps zijn gedeactiveerd: %s", @@ -75,6 +77,7 @@ "Oct." : "Okt.", "Nov." : "Nov.", "Dec." : "Dec.", + "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Er traden problemen op tijdens de code betrouwbaarheidscontrole. Meer informatie…</a>", "Settings" : "Instellingen", "Saving..." : "Opslaan", "seconds ago" : "seconden geleden", @@ -114,6 +117,7 @@ "Your PHP version ({version}) is no longer <a href=\"{phpLink}\">supported by PHP</a>. We encourage you to upgrade your PHP version to take advantage of performance and security updates provided by PHP." : "UwPHP versie ({version}) wordt niet langer <a href=\"{phpLink}\">ondersteund door PHP</a>. We adviseren u om uw PHP versie te upgraden voor betere prestaties en security updates geleverd door PHP.", "The reverse proxy headers configuration is incorrect, or you are accessing ownCloud from a trusted proxy. If you are not accessing ownCloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to ownCloud. Further information can be found in our <a href=\"{docLink}\">documentation</a>." : "De reverse proxy headerconfiguratie is onjuist, of u hebt toegang tot ownCloud via een vertrouwde proxy. Als u ownCloud niet via een vertrouwde proxy benadert, dan levert dan een beveiligingsrisico op, waardoor een aanvaller het IP-adres dat ownCloud ziet kan spoofen. Meer informatie is te vinden in onze <a href=\"{docLink}\">documentatie</a>.", "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached is geconfigureerd als gedistribueerde cache, maar de verkeerde PHP module \"memcache\" is geïnstalleerd. \\OC\\Memcache\\Memcached ondersteunt alleen \"memcached\" en niet \"memcache\". Zie de <a href=\"{wikiLink}\">memcached wiki over beide modules</a>.", + "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Sommige bestanden kwamen niet door de code betrouwbaarheidscontrole. Meer informatie over het oplossen van dit probleem kan worden gevonden in onze <a href=\"{docLink}\">documentatie</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Lijst met ongeldige bestanden…</a> / <a href=\"{rescanEndpoint}\">Opnieuw…</a>)", "Error occurred while checking server setup" : "Een fout trad op bij checken serverconfiguratie", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "De \"{header}\" HTTP header is niet overeenkomstig met \"{expected}\" geconfigureerd. Dit is een potentieel security of privacy risico en we adviseren om deze instelling te wijzigen.", "The \"Strict-Transport-Security\" HTTP header is not configured to least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\">security tips</a>." : "De \"Strict-Transport-Security\" HTTP header is niet geconfigureerd als minimaal \"{seconds}\" seconden. Voor verbeterde beveiliging adviseren we HSTS in te schakelen zoals beschreven in onze <a href=\"{docUrl}\">security tips</a>.", @@ -185,6 +189,7 @@ "Couldn't reset password because the token is invalid" : "Kon het wachtwoord niet herstellen, omdat het token ongeldig is", "Couldn't reset password because the token is expired" : "Kon het wachtwoord niet herstellen, omdat het token verlopen is", "Couldn't send reset email. Please make sure your username is correct." : "Kon e-mail niet versturen. Verifieer of uw gebruikersnaam correct is.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Kon geen herstel e-mail versturen, omdat er geen e-mailadres bekend is bij deze gebruikersnaam. Neem contact op met uw beheerder.", "%s password reset" : "%s wachtwoord reset", "Use the following link to reset your password: {link}" : "Gebruik de volgende link om uw wachtwoord te resetten: {link}", "New password" : "Nieuw wachtwoord", @@ -259,6 +264,7 @@ "Please try again or contact your administrator." : "Probeer het opnieuw of neem contact op met uw beheerder.", "Log in" : "Meld u aan", "Wrong password. Reset it?" : "Onjuist wachtwoord. Resetten?", + "Wrong password." : "Onjuist wachtwoord.", "Stay logged in" : "Ingelogd blijven", "Alternative Logins" : "Alternatieve inlogs", "This ownCloud instance is currently in single user mode." : "Deze ownCloud werkt momenteel in enkele gebruiker modus.", diff --git a/core/l10n/pt_BR.js b/core/l10n/pt_BR.js index 23963477f55..a1f0e287b7d 100644 --- a/core/l10n/pt_BR.js +++ b/core/l10n/pt_BR.js @@ -191,6 +191,7 @@ OC.L10N.register( "Couldn't reset password because the token is invalid" : "Não foi possível redefinir a senha porque o token é inválido", "Couldn't reset password because the token is expired" : "Não foi possível redefinir a senha porque o token expirou", "Couldn't send reset email. Please make sure your username is correct." : "Não foi possível enviar e-mail de redefinição. Verifique se o seu nome de usuário está correto.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Não foi possível enviar email de redefinição porque não há nenhum endereço de e-mail para este nome de usuário. Entre em contato com o administrador.", "%s password reset" : "%s redefinir senha", "Use the following link to reset your password: {link}" : "Use o seguinte link para redefinir sua senha: {link}", "New password" : "Nova senha", @@ -265,6 +266,7 @@ OC.L10N.register( "Please try again or contact your administrator." : "Por favor tente novamente ou faça contato com o seu administrador.", "Log in" : "Entrar", "Wrong password. Reset it?" : "Senha incorreta. Redefini-la?", + "Wrong password." : "Senha errada", "Stay logged in" : "Permaneça logado", "Alternative Logins" : "Logins Alternativos", "This ownCloud instance is currently in single user mode." : "Nesta instância ownCloud está em modo de usuário único.", diff --git a/core/l10n/pt_BR.json b/core/l10n/pt_BR.json index 966ec449947..fd3c4f6ac2d 100644 --- a/core/l10n/pt_BR.json +++ b/core/l10n/pt_BR.json @@ -189,6 +189,7 @@ "Couldn't reset password because the token is invalid" : "Não foi possível redefinir a senha porque o token é inválido", "Couldn't reset password because the token is expired" : "Não foi possível redefinir a senha porque o token expirou", "Couldn't send reset email. Please make sure your username is correct." : "Não foi possível enviar e-mail de redefinição. Verifique se o seu nome de usuário está correto.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Não foi possível enviar email de redefinição porque não há nenhum endereço de e-mail para este nome de usuário. Entre em contato com o administrador.", "%s password reset" : "%s redefinir senha", "Use the following link to reset your password: {link}" : "Use o seguinte link para redefinir sua senha: {link}", "New password" : "Nova senha", @@ -263,6 +264,7 @@ "Please try again or contact your administrator." : "Por favor tente novamente ou faça contato com o seu administrador.", "Log in" : "Entrar", "Wrong password. Reset it?" : "Senha incorreta. Redefini-la?", + "Wrong password." : "Senha errada", "Stay logged in" : "Permaneça logado", "Alternative Logins" : "Logins Alternativos", "This ownCloud instance is currently in single user mode." : "Nesta instância ownCloud está em modo de usuário único.", diff --git a/core/l10n/sq.js b/core/l10n/sq.js index 4f88093c46d..7a0175d6baf 100644 --- a/core/l10n/sq.js +++ b/core/l10n/sq.js @@ -266,6 +266,7 @@ OC.L10N.register( "Please try again or contact your administrator." : "Ju lutemi, riprovoni ose lidhuni me përgjegjësin tuaj.", "Log in" : "Hyni", "Wrong password. Reset it?" : "Fjalëkalim i gabuar. Të ricaktohet?", + "Wrong password." : "Fjalëkalim i gabuar.", "Stay logged in" : "Qëndro i futur", "Alternative Logins" : "Hyrje Alternative", "This ownCloud instance is currently in single user mode." : "Kjo instancë ownCloud është aktualisht në gjendje me përdorues të vetëm.", diff --git a/core/l10n/sq.json b/core/l10n/sq.json index 748e0221e90..ebe75040d54 100644 --- a/core/l10n/sq.json +++ b/core/l10n/sq.json @@ -264,6 +264,7 @@ "Please try again or contact your administrator." : "Ju lutemi, riprovoni ose lidhuni me përgjegjësin tuaj.", "Log in" : "Hyni", "Wrong password. Reset it?" : "Fjalëkalim i gabuar. Të ricaktohet?", + "Wrong password." : "Fjalëkalim i gabuar.", "Stay logged in" : "Qëndro i futur", "Alternative Logins" : "Hyrje Alternative", "This ownCloud instance is currently in single user mode." : "Kjo instancë ownCloud është aktualisht në gjendje me përdorues të vetëm.", diff --git a/core/l10n/th_TH.js b/core/l10n/th_TH.js index 33816cc7075..cdf411f24d5 100644 --- a/core/l10n/th_TH.js +++ b/core/l10n/th_TH.js @@ -191,6 +191,7 @@ OC.L10N.register( "Couldn't reset password because the token is invalid" : "ไม่สามารถตั้งรหัสผ่านใหม่เพราะโทเค็นไม่ถูกต้อง", "Couldn't reset password because the token is expired" : "ไม่สามารถตั้งค่ารหัสผ่านเพราะโทเค็นหมดอายุ", "Couldn't send reset email. Please make sure your username is correct." : "ไม่สามารถส่งการตั้งค่าอีเมลใหม่ กรุณาตรวจสอบชื่อผู้ใช้ของคุณให้ถูกต้อง", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "ไม่ควร", "%s password reset" : "%s ตั้งรหัสผ่านใหม่", "Use the following link to reset your password: {link}" : "ใช้ลิงค์ต่อไปนี้เพื่อเปลี่ยนรหัสผ่านของคุณใหม่: {link}", "New password" : "รหัสผ่านใหม่", diff --git a/core/l10n/th_TH.json b/core/l10n/th_TH.json index aa2dbc993de..2564a58ff8c 100644 --- a/core/l10n/th_TH.json +++ b/core/l10n/th_TH.json @@ -189,6 +189,7 @@ "Couldn't reset password because the token is invalid" : "ไม่สามารถตั้งรหัสผ่านใหม่เพราะโทเค็นไม่ถูกต้อง", "Couldn't reset password because the token is expired" : "ไม่สามารถตั้งค่ารหัสผ่านเพราะโทเค็นหมดอายุ", "Couldn't send reset email. Please make sure your username is correct." : "ไม่สามารถส่งการตั้งค่าอีเมลใหม่ กรุณาตรวจสอบชื่อผู้ใช้ของคุณให้ถูกต้อง", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "ไม่ควร", "%s password reset" : "%s ตั้งรหัสผ่านใหม่", "Use the following link to reset your password: {link}" : "ใช้ลิงค์ต่อไปนี้เพื่อเปลี่ยนรหัสผ่านของคุณใหม่: {link}", "New password" : "รหัสผ่านใหม่", diff --git a/core/register_command.php b/core/register_command.php index 16dda55878e..83e92a7e216 100644 --- a/core/register_command.php +++ b/core/register_command.php @@ -44,6 +44,7 @@ $application->add(new \OC\Core\Command\Integrity\SignCore( if (\OC::$server->getConfig()->getSystemValue('installed', false)) { $application->add(new OC\Core\Command\App\Disable()); $application->add(new OC\Core\Command\App\Enable()); + $application->add(new OC\Core\Command\App\GetPath()); $application->add(new OC\Core\Command\App\ListApps()); $application->add(new OC\Core\Command\Background\Cron(\OC::$server->getConfig())); diff --git a/core/templates/login.php b/core/templates/login.php index 7b09d4fac95..e87b871c67e 100644 --- a/core/templates/login.php +++ b/core/templates/login.php @@ -12,7 +12,7 @@ script('core', [ <form method="post" name="login"> <fieldset> <?php if (!empty($_['redirect_url'])) { - print_unescaped('<input type="hidden" name="redirect_url" value="' . OC_Util::sanitizeHTML($_['redirect_url']) . '">'); + print_unescaped('<input type="hidden" name="redirect_url" value="' . \OCP\Util::sanitizeHTML($_['redirect_url']) . '">'); } ?> <?php if (isset($_['apacheauthfailed']) && ($_['apacheauthfailed'])): ?> <div class="warning"> diff --git a/issue_template.md b/issue_template.md index 3859ea1c414..0295eb9c336 100644 --- a/issue_template.md +++ b/issue_template.md @@ -34,7 +34,7 @@ from within your ownCloud installation folder ``` If you have access to your command line run e.g.: -sudo -u www-data php occ config:list system --public +sudo -u www-data php occ config:list system from within your ownCloud installation folder or @@ -52,16 +52,14 @@ Insert your config.php content here #### LDAP configuration (delete this part if not used) ``` -On ownCloud 7+ with access to your command line run e.g.: +With access to your command line run e.g.: sudo -u www-data php occ ldap:show-config from within your ownCloud installation folder -On ownCloud 6 with access to your command line run e.g.: -sqlite3 data/owncloud.db or mysql -u root -p owncloud -then execute: select * from oc_appconfig where appid='user_ldap'; - Without access to your command line download the data/owncloud.db to your local -computer or access your SQL server remotely and run the select query above. +computer or access your SQL server remotely and run the select query: +SELECT * FROM `oc_appconfig` WHERE `appid` = 'user_ldap'; + Eventually replace sensitive data as the name/IP-address of your LDAP server or groups. ``` diff --git a/lib/l10n/fr.js b/lib/l10n/fr.js index e9b4b52f51f..014b6c24e59 100644 --- a/lib/l10n/fr.js +++ b/lib/l10n/fr.js @@ -149,6 +149,7 @@ OC.L10N.register( "Storage unauthorized. %s" : "Espace de stockage non autorisé. %s", "Storage incomplete configuration. %s" : "Configuration de l'espace de stockage incomplète. %s", "Storage connection error. %s" : "Erreur de connexion à l'espace stockage. %s", - "Storage not available" : "Support de stockage non disponible" + "Storage not available" : "Support de stockage non disponible", + "Storage connection timeout. %s" : "Le délai d'attente pour la connexion à l'espace de stockage a été dépassé. %s" }, "nplurals=2; plural=(n > 1);"); diff --git a/lib/l10n/fr.json b/lib/l10n/fr.json index 7da5eaedd75..feaae43bf41 100644 --- a/lib/l10n/fr.json +++ b/lib/l10n/fr.json @@ -147,6 +147,7 @@ "Storage unauthorized. %s" : "Espace de stockage non autorisé. %s", "Storage incomplete configuration. %s" : "Configuration de l'espace de stockage incomplète. %s", "Storage connection error. %s" : "Erreur de connexion à l'espace stockage. %s", - "Storage not available" : "Support de stockage non disponible" + "Storage not available" : "Support de stockage non disponible", + "Storage connection timeout. %s" : "Le délai d'attente pour la connexion à l'espace de stockage a été dépassé. %s" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/lib/l10n/nl.js b/lib/l10n/nl.js index 24e087a50f5..f4201778f7e 100644 --- a/lib/l10n/nl.js +++ b/lib/l10n/nl.js @@ -147,6 +147,10 @@ OC.L10N.register( "Data directory (%s) is invalid" : "Data directory (%s) is ongeldig", "Please check that the data directory contains a file \".ocdata\" in its root." : "Verifieer dat de data directory een bestand \".ocdata\" in de hoofdmap heeft.", "Could not obtain lock type %d on \"%s\"." : "Kon geen lock type %d krijgen op \"%s\".", - "Storage not available" : "Opslag niet beschikbaar" + "Storage unauthorized. %s" : "Opslag niet toegestaan. %s", + "Storage incomplete configuration. %s" : "Incomplete opslagconfiguratie. %s", + "Storage connection error. %s" : "Opslagverbindingsfout. %s", + "Storage not available" : "Opslag niet beschikbaar", + "Storage connection timeout. %s" : "Opslagverbinding time-out. %s" }, "nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/nl.json b/lib/l10n/nl.json index 691f3e08240..c8981f8fd4c 100644 --- a/lib/l10n/nl.json +++ b/lib/l10n/nl.json @@ -145,6 +145,10 @@ "Data directory (%s) is invalid" : "Data directory (%s) is ongeldig", "Please check that the data directory contains a file \".ocdata\" in its root." : "Verifieer dat de data directory een bestand \".ocdata\" in de hoofdmap heeft.", "Could not obtain lock type %d on \"%s\"." : "Kon geen lock type %d krijgen op \"%s\".", - "Storage not available" : "Opslag niet beschikbaar" + "Storage unauthorized. %s" : "Opslag niet toegestaan. %s", + "Storage incomplete configuration. %s" : "Incomplete opslagconfiguratie. %s", + "Storage connection error. %s" : "Opslagverbindingsfout. %s", + "Storage not available" : "Opslag niet beschikbaar", + "Storage connection timeout. %s" : "Opslagverbinding time-out. %s" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/lib/l10n/th_TH.js b/lib/l10n/th_TH.js index 4da409b7d88..da84e9758c3 100644 --- a/lib/l10n/th_TH.js +++ b/lib/l10n/th_TH.js @@ -147,6 +147,8 @@ OC.L10N.register( "Data directory (%s) is invalid" : "ไดเรกทอรีข้อมูล (%s) ไม่ถูกต้อง", "Please check that the data directory contains a file \".ocdata\" in its root." : "กรุณาตรวจสอบว่าไดเรกทอรีข้อมูลมีแฟ้ม \".ocdata\" อยู่ในราก", "Could not obtain lock type %d on \"%s\"." : "ไม่สามารถรับล็อคชนิด %d บน \"%s\"", + "Storage unauthorized. %s" : "การจัดเก็บข้อมูลไม่ได้รับอนุญาต %s", + "Storage incomplete configuration. %s" : "การตั้งค่าการจัดเก็บข้อมูลไม่สำเร็จ %s", "Storage not available" : "ไม่สามารถใช้พื้นที่จัดเก็บข้อมูลได้" }, "nplurals=1; plural=0;"); diff --git a/lib/l10n/th_TH.json b/lib/l10n/th_TH.json index a21802be63a..8a951a1468d 100644 --- a/lib/l10n/th_TH.json +++ b/lib/l10n/th_TH.json @@ -145,6 +145,8 @@ "Data directory (%s) is invalid" : "ไดเรกทอรีข้อมูล (%s) ไม่ถูกต้อง", "Please check that the data directory contains a file \".ocdata\" in its root." : "กรุณาตรวจสอบว่าไดเรกทอรีข้อมูลมีแฟ้ม \".ocdata\" อยู่ในราก", "Could not obtain lock type %d on \"%s\"." : "ไม่สามารถรับล็อคชนิด %d บน \"%s\"", + "Storage unauthorized. %s" : "การจัดเก็บข้อมูลไม่ได้รับอนุญาต %s", + "Storage incomplete configuration. %s" : "การตั้งค่าการจัดเก็บข้อมูลไม่สำเร็จ %s", "Storage not available" : "ไม่สามารถใช้พื้นที่จัดเก็บข้อมูลได้" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/lib/private/app.php b/lib/private/app.php index 145517e218a..abf12264c58 100644 --- a/lib/private/app.php +++ b/lib/private/app.php @@ -474,9 +474,13 @@ class OC_App { * search for an app in all app-directories * * @param string $appId - * @return mixed (bool|string) + * @return false|string */ protected static function findAppInDirectories($appId) { + $sanitizedAppId = self::cleanAppId($appId); + if($sanitizedAppId !== $appId) { + return false; + } static $app_dir = array(); if (isset($app_dir[$appId])) { diff --git a/lib/private/app/appmanager.php b/lib/private/app/appmanager.php index f826c8ba0c7..8ae93f98832 100644 --- a/lib/private/app/appmanager.php +++ b/lib/private/app/appmanager.php @@ -148,6 +148,13 @@ class AppManager implements IAppManager { return false; } else { $groupIds = json_decode($enabled); + + if (!is_array($groupIds)) { + $jsonError = json_last_error(); + \OC::$server->getLogger()->warning('AppManger::checkAppForUser - can\'t decode group IDs: ' . print_r($enabled, true) . ' - json error code: ' . $jsonError, ['app' => 'lib']); + return false; + } + $userGroups = $this->groupManager->getUserGroupIds($user); foreach ($userGroups as $groupId) { if (array_search($groupId, $groupIds) !== false) { diff --git a/lib/private/appframework/app.php b/lib/private/appframework/app.php index 0188d221be1..5cad32bbd09 100644 --- a/lib/private/appframework/app.php +++ b/lib/private/appframework/app.php @@ -26,6 +26,7 @@ namespace OC\AppFramework; +use OC\AppFramework\Http\Dispatcher; use OC_App; use OC\AppFramework\DependencyInjection\DIContainer; use OCP\AppFramework\QueryException; @@ -97,6 +98,7 @@ class App { } // initialize the dispatcher and run all the middleware before the controller + /** @var Dispatcher $dispatcher */ $dispatcher = $container['Dispatcher']; list( diff --git a/lib/private/appframework/http/request.php b/lib/private/appframework/http/request.php index 2bbb70db0f8..6ba1d8f644d 100644 --- a/lib/private/appframework/http/request.php +++ b/lib/private/appframework/http/request.php @@ -447,7 +447,7 @@ class Request implements \ArrayAccess, \Countable, IRequest { $deobfuscatedToken = base64_decode($obfuscatedToken) ^ $secret; // Check if the token is valid - if(\OCP\Security\StringUtils::equals($deobfuscatedToken, $this->items['requesttoken'])) { + if(hash_equals($deobfuscatedToken, $this->items['requesttoken'])) { return true; } else { return false; diff --git a/lib/private/appframework/middleware/security/securitymiddleware.php b/lib/private/appframework/middleware/security/securitymiddleware.php index d0b7202a360..725ce689b48 100644 --- a/lib/private/appframework/middleware/security/securitymiddleware.php +++ b/lib/private/appframework/middleware/security/securitymiddleware.php @@ -27,7 +27,6 @@ namespace OC\AppFramework\Middleware\Security; -use OC\AppFramework\Http; use OC\Appframework\Middleware\Security\Exceptions\AppNotEnabledException; use OC\Appframework\Middleware\Security\Exceptions\CrossSiteRequestForgeryException; use OC\Appframework\Middleware\Security\Exceptions\NotAdminException; diff --git a/lib/private/comments/comment.php b/lib/private/comments/comment.php new file mode 100644 index 00000000000..219e7ec8e4b --- /dev/null +++ b/lib/private/comments/comment.php @@ -0,0 +1,357 @@ +<?php + +namespace OC\Comments; + +use OCP\Comments\IComment; +use OCP\Comments\IllegalIDChangeException; + +class Comment implements IComment { + + protected $data = [ + 'id' => '', + 'parentId' => '0', + 'topmostParentId' => '0', + 'childrenCount' => '0', + 'message' => '', + 'verb' => '', + 'actorType' => '', + 'actorId' => '', + 'objectType' => '', + 'objectId' => '', + 'creationDT' => null, + 'latestChildDT' => null, + ]; + + /** + * Comment constructor. + * + * @param [] $data optional, array with keys according to column names from + * the comments database scheme + */ + public function __construct(array $data = null) { + if(is_array($data)) { + $this->fromArray($data); + } + } + + /** + * returns the ID of the comment + * + * It may return an empty string, if the comment was not stored. + * It is expected that the concrete Comment implementation gives an ID + * by itself (e.g. after saving). + * + * @return string + * @since 9.0.0 + */ + public function getId() { + return $this->data['id']; + } + + /** + * sets the ID of the comment and returns itself + * + * It is only allowed to set the ID only, if the current id is an empty + * string (which means it is not stored in a database, storage or whatever + * the concrete implementation does), or vice versa. Changing a given ID is + * not permitted and must result in an IllegalIDChangeException. + * + * @param string $id + * @return IComment + * @throws IllegalIDChangeException + * @since 9.0.0 + */ + public function setId($id) { + if(!is_string($id)) { + throw new \InvalidArgumentException('String expected.'); + } + + $id = trim($id); + if($this->data['id'] === '' || ($this->data['id'] !== '' && $id === '')) { + $this->data['id'] = $id; + return $this; + } + + throw new IllegalIDChangeException('Not allowed to assign a new ID to an already saved comment.'); + } + + /** + * returns the parent ID of the comment + * + * @return string + * @since 9.0.0 + */ + public function getParentId() { + return $this->data['parentId']; + } + + /** + * sets the parent ID and returns itself + * + * @param string $parentId + * @return IComment + * @since 9.0.0 + */ + public function setParentId($parentId) { + if(!is_string($parentId)) { + throw new \InvalidArgumentException('String expected.'); + } + $this->data['parentId'] = trim($parentId); + return $this; + } + + /** + * returns the topmost parent ID of the comment + * + * @return string + * @since 9.0.0 + */ + public function getTopmostParentId() { + return $this->data['topmostParentId']; + } + + + /** + * sets the topmost parent ID and returns itself + * + * @param string $id + * @return IComment + * @since 9.0.0 + */ + public function setTopmostParentId($id) { + if(!is_string($id)) { + throw new \InvalidArgumentException('String expected.'); + } + $this->data['topmostParentId'] = trim($id); + return $this; + } + + /** + * returns the number of children + * + * @return int + * @since 9.0.0 + */ + public function getChildrenCount() { + return $this->data['childrenCount']; + } + + /** + * sets the number of children + * + * @param int $count + * @return IComment + * @since 9.0.0 + */ + public function setChildrenCount($count) { + if(!is_int($count)) { + throw new \InvalidArgumentException('Integer expected.'); + } + $this->data['childrenCount'] = $count; + return $this; + } + + /** + * returns the message of the comment + * + * @return string + * @since 9.0.0 + */ + public function getMessage() { + return $this->data['message']; + } + + /** + * sets the message of the comment and returns itself + * + * @param string $message + * @return IComment + * @since 9.0.0 + */ + public function setMessage($message) { + if(!is_string($message)) { + throw new \InvalidArgumentException('String expected.'); + } + $this->data['message'] = trim($message); + return $this; + } + + /** + * returns the verb of the comment + * + * @return string + * @since 9.0.0 + */ + public function getVerb() { + return $this->data['verb']; + } + + /** + * sets the verb of the comment, e.g. 'comment' or 'like' + * + * @param string $verb + * @return IComment + * @since 9.0.0 + */ + public function setVerb($verb) { + if(!is_string($verb) || !trim($verb)) { + throw new \InvalidArgumentException('Non-empty String expected.'); + } + $this->data['verb'] = trim($verb); + return $this; + } + + /** + * returns the actor type + * + * @return string + * @since 9.0.0 + */ + public function getActorType() { + return $this->data['actorType']; + } + + /** + * returns the actor ID + * + * @return string + * @since 9.0.0 + */ + public function getActorId() { + return $this->data['actorId']; + } + + /** + * sets (overwrites) the actor type and id + * + * @param string $actorType e.g. 'user' + * @param string $actorId e.g. 'zombie234' + * @return IComment + * @since 9.0.0 + */ + public function setActor($actorType, $actorId) { + if( + !is_string($actorType) || !trim($actorType) + || !is_string($actorId) || !trim($actorId) + ) { + throw new \InvalidArgumentException('String expected.'); + } + $this->data['actorType'] = trim($actorType); + $this->data['actorId'] = trim($actorId); + return $this; + } + + /** + * returns the creation date of the comment. + * + * If not explicitly set, it shall default to the time of initialization. + * + * @return \DateTime + * @since 9.0.0 + */ + public function getCreationDateTime() { + return $this->data['creationDT']; + } + + /** + * sets the creation date of the comment and returns itself + * + * @param \DateTime $timestamp + * @return IComment + * @since 9.0.0 + */ + public function setCreationDateTime(\DateTime $timestamp) { + $this->data['creationDT'] = $timestamp; + return $this; + } + + /** + * returns the timestamp of the most recent child + * + * @return int + * @since 9.0.0 + */ + public function getLatestChildDateTime() { + return $this->data['latestChildDT']; + } + + /** + * sets the date of the most recent child + * + * @param \DateTime $dateTime + * @return IComment + * @since 9.0.0 + */ + public function setLatestChildDateTime(\DateTime $dateTime = null) { + $this->data['latestChildDT'] = $dateTime; + return $this; + } + + /** + * returns the object type the comment is attached to + * + * @return string + * @since 9.0.0 + */ + public function getObjectType() { + return $this->data['objectType']; + } + + /** + * returns the object id the comment is attached to + * + * @return string + * @since 9.0.0 + */ + public function getObjectId() { + return $this->data['objectId']; + } + + /** + * sets (overwrites) the object of the comment + * + * @param string $objectType e.g. 'file' + * @param string $objectId e.g. '16435' + * @return IComment + * @since 9.0.0 + */ + public function setObject($objectType, $objectId) { + if( + !is_string($objectType) || !trim($objectType) + || !is_string($objectId) || !trim($objectId) + ) { + throw new \InvalidArgumentException('String expected.'); + } + $this->data['objectType'] = trim($objectType); + $this->data['objectId'] = trim($objectId); + return $this; + } + + /** + * sets the comment data based on an array with keys as taken from the + * database. + * + * @param [] $data + * @return IComment + */ + protected function fromArray($data) { + foreach(array_keys($data) as $key) { + // translate DB keys to internal setter names + $setter = 'set' . str_replace('_', '', ucwords($key,'_')); + $setter = str_replace('Timestamp', 'DateTime', $setter); + + if(method_exists($this, $setter)) { + $this->$setter($data[$key]); + } + } + + foreach(['actor', 'object'] as $role) { + if(isset($data[$role . '_type']) && isset($data[$role . '_id'])) { + $setter = 'set' . ucfirst($role); + $this->$setter($data[$role . '_type'], $data[$role . '_id']); + } + } + + return $this; + } +} diff --git a/lib/private/comments/manager.php b/lib/private/comments/manager.php new file mode 100644 index 00000000000..09e59f28370 --- /dev/null +++ b/lib/private/comments/manager.php @@ -0,0 +1,549 @@ +<?php + +namespace OC\Comments; + +use Doctrine\DBAL\Exception\DriverException; +use OCP\Comments\IComment; +use OCP\Comments\ICommentsManager; +use OCP\Comments\NotFoundException; +use OCP\IDBConnection; +use OCP\ILogger; + +class Manager implements ICommentsManager { + + /** @var IDBConnection */ + protected $dbConn; + + /** @var ILogger */ + protected $logger; + + /** @var IComment[] */ + protected $commentsCache = []; + + public function __construct( + IDBConnection $dbConn, + ILogger $logger + ) { + $this->dbConn = $dbConn; + $this->logger = $logger; + } + + /** + * converts data base data into PHP native, proper types as defined by + * IComment interface. + * + * @param array $data + * @return array + */ + protected function normalizeDatabaseData(array $data) { + $data['id'] = strval($data['id']); + $data['parent_id'] = strval($data['parent_id']); + $data['topmost_parent_id'] = strval($data['topmost_parent_id']); + $data['creation_timestamp'] = new \DateTime($data['creation_timestamp']); + $data['latest_child_timestamp'] = new \DateTime($data['latest_child_timestamp']); + $data['children_count'] = intval($data['children_count']); + return $data; + } + + /** + * prepares a comment for an insert or update operation after making sure + * all necessary fields have a value assigned. + * + * @param IComment $comment + * @return IComment returns the same updated IComment instance as provided + * by parameter for convenience + * @throws \UnexpectedValueException + */ + protected function prepareCommentForDatabaseWrite(IComment $comment) { + if( !$comment->getActorType() + || !$comment->getActorId() + || !$comment->getObjectType() + || !$comment->getObjectId() + || !$comment->getVerb() + ) { + throw new \UnexpectedValueException('Actor, Object and Verb information must be provided for saving'); + } + + if($comment->getId() === '') { + $comment->setChildrenCount(0); + $comment->setLatestChildDateTime(new \DateTime('0000-00-00 00:00:00', new \DateTimeZone('UTC'))); + $comment->setLatestChildDateTime(null); + } + + if(is_null($comment->getCreationDateTime())) { + $comment->setCreationDateTime(new \DateTime()); + } + + if($comment->getParentId() !== '0') { + $comment->setTopmostParentId($this->determineTopmostParentId($comment->getParentId())); + } else { + $comment->setTopmostParentId('0'); + } + + $this->cache($comment); + + return $comment; + } + + /** + * returns the topmost parent id of a given comment identified by ID + * + * @param string $id + * @return string + * @throws NotFoundException + */ + protected function determineTopmostParentId($id) { + $comment = $this->get($id); + if($comment->getParentId() === '0') { + return $comment->getId(); + } else { + return $this->determineTopmostParentId($comment->getId()); + } + } + + /** + * updates child information of a comment + * + * @param string $id + * @param \DateTime $cDateTime the date time of the most recent child + * @throws NotFoundException + */ + protected function updateChildrenInformation($id, \DateTime $cDateTime) { + $qb = $this->dbConn->getQueryBuilder(); + $query = $qb->select($qb->createFunction('COUNT(`id`)')) + ->from('comments') + ->where($qb->expr()->eq('parent_id', $qb->createParameter('id'))) + ->setParameter('id', $id); + + $resultStatement = $query->execute(); + $data = $resultStatement->fetch(\PDO::FETCH_NUM); + $resultStatement->closeCursor(); + $children = intval($data[0]); + + $comment = $this->get($id); + $comment->setChildrenCount($children); + $comment->setLatestChildDateTime($cDateTime); + $this->save($comment); + } + + /** + * Tests whether actor or object type and id parameters are acceptable. + * Throws exception if not. + * + * @param string $role + * @param string $type + * @param string $id + * @throws \InvalidArgumentException + */ + protected function checkRoleParameters($role, $type, $id) { + if( + !is_string($type) || empty($type) + || !is_string($id) || empty($id) + ) { + throw new \InvalidArgumentException($role . ' parameters must be string and not empty'); + } + } + + /** + * run-time caches a comment + * + * @param IComment $comment + */ + protected function cache(IComment $comment) { + $id = $comment->getId(); + if(empty($id)) { + return; + } + $this->commentsCache[strval($id)] = $comment; + } + + /** + * removes an entry from the comments run time cache + * + * @param mixed $id the comment's id + */ + protected function uncache($id) { + $id = strval($id); + if (isset($this->commentsCache[$id])) { + unset($this->commentsCache[$id]); + } + } + + /** + * returns a comment instance + * + * @param string $id the ID of the comment + * @return IComment + * @throws NotFoundException + * @throws \InvalidArgumentException + * @since 9.0.0 + */ + public function get($id) { + if(intval($id) === 0) { + throw new \InvalidArgumentException('IDs must be translatable to a number in this implementation.'); + } + + if(isset($this->commentsCache[$id])) { + return $this->commentsCache[$id]; + } + + $qb = $this->dbConn->getQueryBuilder(); + $resultStatement = $qb->select('*') + ->from('comments') + ->where($qb->expr()->eq('id', $qb->createParameter('id'))) + ->setParameter('id', $id, \PDO::PARAM_INT) + ->execute(); + + $data = $resultStatement->fetch(); + $resultStatement->closeCursor(); + if(!$data) { + throw new NotFoundException(); + } + + $comment = new Comment($this->normalizeDatabaseData($data)); + $this->cache($comment); + return $comment; + } + + /** + * returns the comment specified by the id and all it's child comments. + * At this point of time, we do only support one level depth. + * + * @param string $id + * @param int $limit max number of entries to return, 0 returns all + * @param int $offset the start entry + * @return array + * @since 9.0.0 + * + * The return array looks like this + * [ + * 'comment' => IComment, // root comment + * 'replies' => + * [ + * 0 => + * [ + * 'comment' => IComment, + * 'replies' => [] + * ] + * 1 => + * [ + * 'comment' => IComment, + * 'replies'=> [] + * ], + * … + * ] + * ] + */ + public function getTree($id, $limit = 0, $offset = 0) { + $tree = []; + $tree['comment'] = $this->get($id); + $tree['replies'] = []; + + $qb = $this->dbConn->getQueryBuilder(); + $query = $qb->select('*') + ->from('comments') + ->where($qb->expr()->eq('topmost_parent_id', $qb->createParameter('id'))) + ->orderBy('creation_timestamp', 'DESC') + ->setParameter('id', $id); + + if($limit > 0) { + $query->setMaxResults($limit); + } + if($offset > 0) { + $query->setFirstResult($offset); + } + + $resultStatement = $query->execute(); + while($data = $resultStatement->fetch()) { + $comment = new Comment($this->normalizeDatabaseData($data)); + $this->cache($comment); + $tree['replies'][] = [ + 'comment' => $comment, + 'replies' => [] + ]; + } + $resultStatement->closeCursor(); + + return $tree; + } + + /** + * returns comments for a specific object (e.g. a file). + * + * The sort order is always newest to oldest. + * + * @param string $objectType the object type, e.g. 'files' + * @param string $objectId the id of the object + * @param int $limit optional, number of maximum comments to be returned. if + * not specified, all comments are returned. + * @param int $offset optional, starting point + * @param \DateTime $notOlderThan optional, timestamp of the oldest comments + * that may be returned + * @return IComment[] + * @since 9.0.0 + */ + public function getForObject( + $objectType, + $objectId, + $limit = 0, + $offset = 0, + \DateTime $notOlderThan = null + ) { + $comments = []; + + $qb = $this->dbConn->getQueryBuilder(); + $query = $qb->select('*') + ->from('comments') + ->where($qb->expr()->eq('object_type', $qb->createParameter('type'))) + ->andWhere($qb->expr()->eq('object_id', $qb->createParameter('id'))) + ->orderBy('creation_timestamp', 'DESC') + ->setParameter('type', $objectType) + ->setParameter('id', $objectId); + + if($limit > 0) { + $query->setMaxResults($limit); + } + if($offset > 0) { + $query->setFirstResult($offset); + } + if(!is_null($notOlderThan)) { + $query + ->andWhere($qb->expr()->gt('creation_timestamp', $qb->createParameter('notOlderThan'))) + ->setParameter('notOlderThan', $notOlderThan, 'datetime'); + } + + $resultStatement = $query->execute(); + while($data = $resultStatement->fetch()) { + $comment = new Comment($this->normalizeDatabaseData($data)); + $this->cache($comment); + $comments[] = $comment; + } + $resultStatement->closeCursor(); + + return $comments; + } + + /** + * @param $objectType string the object type, e.g. 'files' + * @param $objectId string the id of the object + * @return Int + * @since 9.0.0 + */ + public function getNumberOfCommentsForObject($objectType, $objectId) { + $qb = $this->dbConn->getQueryBuilder(); + $query = $qb->select($qb->createFunction('COUNT(`id`)')) + ->from('comments') + ->where($qb->expr()->eq('object_type', $qb->createParameter('type'))) + ->andWhere($qb->expr()->eq('object_id', $qb->createParameter('id'))) + ->setParameter('type', $objectType) + ->setParameter('id', $objectId); + + $resultStatement = $query->execute(); + $data = $resultStatement->fetch(\PDO::FETCH_NUM); + $resultStatement->closeCursor(); + return intval($data[0]); + } + + /** + * creates a new comment and returns it. At this point of time, it is not + * saved in the used data storage. Use save() after setting other fields + * of the comment (e.g. message or verb). + * + * @param string $actorType the actor type (e.g. 'user') + * @param string $actorId a user id + * @param string $objectType the object type the comment is attached to + * @param string $objectId the object id the comment is attached to + * @return IComment + * @since 9.0.0 + */ + public function create($actorType, $actorId, $objectType, $objectId) { + $comment = new Comment(); + $comment + ->setActor($actorType, $actorId) + ->setObject($objectType, $objectId); + return $comment; + } + + /** + * permanently deletes the comment specified by the ID + * + * When the comment has child comments, their parent ID will be changed to + * the parent ID of the item that is to be deleted. + * + * @param string $id + * @return bool + * @throws \InvalidArgumentException + * @since 9.0.0 + */ + public function delete($id) { + if(!is_string($id)) { + throw new \InvalidArgumentException('Parameter must be string'); + } + + $qb = $this->dbConn->getQueryBuilder(); + $query = $qb->delete('comments') + ->where($qb->expr()->eq('id', $qb->createParameter('id'))) + ->setParameter('id', $id); + + try { + $affectedRows = $query->execute(); + $this->uncache($id); + } catch (DriverException $e) { + $this->logger->logException($e, ['app' => 'core_comments']); + return false; + } + return ($affectedRows > 0); + } + + /** + * saves the comment permanently and returns it + * + * if the supplied comment has an empty ID, a new entry comment will be + * saved and the instance updated with the new ID. + * + * Otherwise, an existing comment will be updated. + * + * Throws NotFoundException when a comment that is to be updated does not + * exist anymore at this point of time. + * + * @param IComment $comment + * @return bool + * @throws NotFoundException + * @since 9.0.0 + */ + public function save(IComment $comment) { + if($this->prepareCommentForDatabaseWrite($comment)->getId() === '') { + $result = $this->insert($comment); + } else { + $result = $this->update($comment); + } + + if($result && !!$comment->getParentId()) { + $this->updateChildrenInformation( + $comment->getParentId(), + $comment->getCreationDateTime() + ); + $this->cache($comment); + } + + return $result; + } + + /** + * inserts the provided comment in the database + * + * @param IComment $comment + * @return bool + */ + protected function insert(IComment &$comment) { + $qb = $this->dbConn->getQueryBuilder(); + $affectedRows = $qb + ->insert('comments') + ->values([ + 'parent_id' => $qb->createNamedParameter($comment->getParentId()), + 'topmost_parent_id' => $qb->createNamedParameter($comment->getTopmostParentId()), + 'children_count' => $qb->createNamedParameter($comment->getChildrenCount()), + 'actor_type' => $qb->createNamedParameter($comment->getActorType()), + 'actor_id' => $qb->createNamedParameter($comment->getActorId()), + 'message' => $qb->createNamedParameter($comment->getMessage()), + 'verb' => $qb->createNamedParameter($comment->getVerb()), + 'creation_timestamp' => $qb->createNamedParameter($comment->getCreationDateTime(), 'datetime'), + 'latest_child_timestamp' => $qb->createNamedParameter($comment->getLatestChildDateTime(), 'datetime'), + 'object_type' => $qb->createNamedParameter($comment->getObjectType()), + 'object_id' => $qb->createNamedParameter($comment->getObjectId()), + ]) + ->execute(); + + if ($affectedRows > 0) { + $comment->setId(strval($qb->getLastInsertId())); + } + + return $affectedRows > 0; + } + + /** + * updates a Comment data row + * + * @param IComment $comment + * @return bool + * @throws NotFoundException + */ + protected function update(IComment $comment) { + $qb = $this->dbConn->getQueryBuilder(); + $affectedRows = $qb + ->update('comments') + ->set('parent_id', $qb->createNamedParameter($comment->getParentId())) + ->set('topmost_parent_id', $qb->createNamedParameter($comment->getTopmostParentId())) + ->set('children_count', $qb->createNamedParameter($comment->getChildrenCount())) + ->set('actor_type', $qb->createNamedParameter($comment->getActorType())) + ->set('actor_id', $qb->createNamedParameter($comment->getActorId())) + ->set('message', $qb->createNamedParameter($comment->getMessage())) + ->set('verb', $qb->createNamedParameter($comment->getVerb())) + ->set('creation_timestamp', $qb->createNamedParameter($comment->getCreationDateTime(), 'datetime')) + ->set('latest_child_timestamp', $qb->createNamedParameter($comment->getLatestChildDateTime(), 'datetime')) + ->set('object_type', $qb->createNamedParameter($comment->getObjectType())) + ->set('object_id', $qb->createNamedParameter($comment->getObjectId())) + ->where($qb->expr()->eq('id', $qb->createParameter('id'))) + ->setParameter('id', $comment->getId()) + ->execute(); + + if($affectedRows === 0) { + throw new NotFoundException('Comment to update does ceased to exist'); + } + + return $affectedRows > 0; + } + + /** + * removes references to specific actor (e.g. on user delete) of a comment. + * The comment itself must not get lost/deleted. + * + * @param string $actorType the actor type (e.g. 'user') + * @param string $actorId a user id + * @return boolean + * @since 9.0.0 + */ + public function deleteReferencesOfActor($actorType, $actorId) { + $this->checkRoleParameters('Actor', $actorType, $actorId); + + $qb = $this->dbConn->getQueryBuilder(); + $affectedRows = $qb + ->update('comments') + ->set('actor_type', $qb->createNamedParameter(ICommentsManager::DELETED_USER)) + ->set('actor_id', $qb->createNamedParameter(ICommentsManager::DELETED_USER)) + ->where($qb->expr()->eq('actor_type', $qb->createParameter('type'))) + ->andWhere($qb->expr()->eq('actor_id', $qb->createParameter('id'))) + ->setParameter('type', $actorType) + ->setParameter('id', $actorId) + ->execute(); + + $this->commentsCache = []; + + return is_int($affectedRows); + } + + /** + * deletes all comments made of a specific object (e.g. on file delete) + * + * @param string $objectType the object type (e.g. 'file') + * @param string $objectId e.g. the file id + * @return boolean + * @since 9.0.0 + */ + public function deleteCommentsAtObject($objectType, $objectId) { + $this->checkRoleParameters('Object', $objectType, $objectId); + + $qb = $this->dbConn->getQueryBuilder(); + $affectedRows = $qb + ->delete('comments') + ->where($qb->expr()->eq('object_type', $qb->createParameter('type'))) + ->andWhere($qb->expr()->eq('object_id', $qb->createParameter('id'))) + ->setParameter('type', $objectType) + ->setParameter('id', $objectId) + ->execute(); + + $this->commentsCache = []; + + return is_int($affectedRows); + } +} diff --git a/lib/private/comments/managerfactory.php b/lib/private/comments/managerfactory.php new file mode 100644 index 00000000000..41978d0cf4b --- /dev/null +++ b/lib/private/comments/managerfactory.php @@ -0,0 +1,23 @@ +<?php + +namespace OC\Comments; + +use OCP\Comments\ICommentsManager; +use OCP\Comments\ICommentsManagerFactory; + + +class ManagerFactory implements ICommentsManagerFactory { + + /** + * creates and returns an instance of the ICommentsManager + * + * @return ICommentsManager + * @since 9.0.0 + */ + public function getManager() { + return new Manager( + \OC::$server->getDatabaseConnection(), + \OC::$server->getLogger() + ); + } +} diff --git a/lib/private/console/application.php b/lib/private/console/application.php index 55c817d497f..e6d8677b72e 100644 --- a/lib/private/console/application.php +++ b/lib/private/console/application.php @@ -48,25 +48,31 @@ class Application { /** * @param OutputInterface $output + * @throws \Exception */ public function loadCommands(OutputInterface $output) { // $application is required to be defined in the register_command scripts $application = $this->application; - require_once \OC::$SERVERROOT . '/core/register_command.php'; + require_once __DIR__ . '/../../../core/register_command.php'; if ($this->config->getSystemValue('installed', false)) { - if (!\OCP\Util::needUpgrade()) { + if (\OCP\Util::needUpgrade()) { + $output->writeln("ownCloud or one of the apps require upgrade - only a limited number of commands are available"); + $output->writeln("You may use your browser or the occ upgrade command to do the upgrade"); + } elseif ($this->config->getSystemValue('maintenance', false)) { + $output->writeln("ownCloud is in maintenance mode - no app have been loaded"); + } else { OC_App::loadApps(); foreach (\OC::$server->getAppManager()->getInstalledApps() as $app) { $appPath = \OC_App::getAppPath($app); + if($appPath === false) { + continue; + } \OC::$loader->addValidRoot($appPath); $file = $appPath . '/appinfo/register_command.php'; if (file_exists($file)) { require $file; } } - } else { - $output->writeln("ownCloud or one of the apps require upgrade - only a limited number of commands are available"); - $output->writeln("You may use your browser or the occ upgrade command to do the upgrade"); } } else { $output->writeln("ownCloud is not installed - only a limited number of commands are available"); @@ -85,6 +91,11 @@ class Application { } } + /** + * Sets whether to automatically exit after a command execution or not. + * + * @param bool $boolean Whether to automatically exit after a command execution or not + */ public function setAutoExit($boolean) { $this->application->setAutoExit($boolean); } diff --git a/lib/private/db/querybuilder/querybuilder.php b/lib/private/db/querybuilder/querybuilder.php index 02d8ee4344d..a4cbb5abd76 100644 --- a/lib/private/db/querybuilder/querybuilder.php +++ b/lib/private/db/querybuilder/querybuilder.php @@ -40,6 +40,9 @@ class QueryBuilder implements IQueryBuilder { /** @var bool */ private $automaticTablePrefix = true; + /** @var string */ + protected $lastInsertedTable; + /** * Initializes a new QueryBuilder. * @@ -325,6 +328,28 @@ class QueryBuilder implements IQueryBuilder { } /** + * Specifies an item that is to be returned uniquely in the query result. + * + * <code> + * $qb = $conn->getQueryBuilder() + * ->selectDistinct('type') + * ->from('users'); + * </code> + * + * @param mixed $select The selection expressions. + * + * @return \OCP\DB\QueryBuilder\IQueryBuilder This QueryBuilder instance. + */ + public function selectDistinct($select) { + + $this->queryBuilder->addSelect( + 'DISTINCT ' . $this->helper->quoteColumnName($select) + ); + + return $this; + } + + /** * Adds an item that is to be returned in the query result. * * <code> @@ -423,6 +448,8 @@ class QueryBuilder implements IQueryBuilder { $this->getTableName($insert) ); + $this->lastInsertedTable = $insert; + return $this; } @@ -1024,14 +1051,57 @@ class QueryBuilder implements IQueryBuilder { } /** + * Used to get the id of the last inserted element + * @return int + * @throws \BadMethodCallException When being called before an insert query has been run. + */ + public function getLastInsertId() { + if ($this->getType() === \Doctrine\DBAL\Query\QueryBuilder::INSERT && $this->lastInsertedTable) { + // lastInsertId() needs the prefix but no quotes + $table = $this->prefixTableName($this->lastInsertedTable); + return (int) $this->connection->lastInsertId($table); + } + + throw new \BadMethodCallException('Invalid call to getLastInsertId without using insert() before.'); + } + + /** + * Returns the table name quoted and with database prefix as needed by the implementation + * + * @param string $table + * @return string + */ + public function getTableName($table) { + $table = $this->prefixTableName($table); + return $this->helper->quoteColumnName($table); + } + + /** + * Returns the table name with database prefix as needed by the implementation + * * @param string $table * @return string */ - private function getTableName($table) { + protected function prefixTableName($table) { if ($this->automaticTablePrefix === false || strpos($table, '*PREFIX*') === 0) { - return $this->helper->quoteColumnName($table); + return $table; + } + + return '*PREFIX*' . $table; + } + + /** + * Returns the column name quoted and with table alias prefix as needed by the implementation + * + * @param string $column + * @param string $tableAlias + * @return string + */ + public function getColumnName($column, $tableAlias = '') { + if ($tableAlias !== '') { + $tableAlias .= '.'; } - return $this->helper->quoteColumnName('*PREFIX*' . $table); + return $this->helper->quoteColumnName($tableAlias . $column); } } diff --git a/lib/private/db/querybuilder/quotehelper.php b/lib/private/db/querybuilder/quotehelper.php index 4b62fee6a6c..5ceb76bbf93 100644 --- a/lib/private/db/querybuilder/quotehelper.php +++ b/lib/private/db/querybuilder/quotehelper.php @@ -61,7 +61,7 @@ class QuoteHelper { } if (substr_count($string, '.')) { - list($alias, $columnName) = explode('.', $string); + list($alias, $columnName) = explode('.', $string, 2); if ($columnName === '*') { return $string; diff --git a/lib/private/files/fileinfo.php b/lib/private/files/fileinfo.php index 5b5e8697004..5ed65cd3795 100644 --- a/lib/private/files/fileinfo.php +++ b/lib/private/files/fileinfo.php @@ -100,6 +100,8 @@ class FileInfo implements \OCP\Files\FileInfo, \ArrayAccess { return $this->getType(); } else if ($offset === 'etag') { return $this->getEtag(); + } elseif ($offset === 'permissions') { + return $this->getPermissions(); } elseif (isset($this->data[$offset])) { return $this->data[$offset]; } else { @@ -193,7 +195,11 @@ class FileInfo implements \OCP\Files\FileInfo, \ArrayAccess { * @return int */ public function getPermissions() { - return $this->data['permissions']; + $perms = $this->data['permissions']; + if (\OCP\Util::isSharingDisabledForUser() || ($this->isShared() && !\OC\Share\Share::isResharingAllowed())) { + $perms = $perms & ~\OCP\Constants::PERMISSION_SHARE; + } + return $perms; } /** diff --git a/lib/private/files/storage/common.php b/lib/private/files/storage/common.php index 0cd67e343ff..b06543d0a6a 100644 --- a/lib/private/files/storage/common.php +++ b/lib/private/files/storage/common.php @@ -141,10 +141,6 @@ abstract class Common implements Storage { } public function isSharable($path) { - if (\OCP\Util::isSharingDisabledForUser()) { - return false; - } - return $this->isReadable($path); } diff --git a/lib/private/files/storage/dav.php b/lib/private/files/storage/dav.php index dda163e41a0..9afebab1dd7 100644 --- a/lib/private/files/storage/dav.php +++ b/lib/private/files/storage/dav.php @@ -34,6 +34,7 @@ namespace OC\Files\Storage; use Exception; +use GuzzleHttp\Exception\RequestException; use OC\Files\Filesystem; use OC\Files\Stream\Close; use Icewind\Streams\IteratorDirectory; @@ -339,15 +340,20 @@ class DAV extends Common { switch ($mode) { case 'r': case 'rb': - if (!$this->file_exists($path)) { - return false; + try { + $response = $this->httpClientService + ->newClient() + ->get($this->createBaseUri() . $this->encodePath($path), [ + 'auth' => [$this->user, $this->password], + 'stream' => true + ]); + } catch (RequestException $e) { + if ($e->getResponse()->getStatusCode() === 404) { + return false; + } else { + throw $e; + } } - $response = $this->httpClientService - ->newClient() - ->get($this->createBaseUri() . $this->encodePath($path), [ - 'auth' => [$this->user, $this->password], - 'stream' => true - ]); if ($response->getStatusCode() !== Http::STATUS_OK) { if ($response->getStatusCode() === Http::STATUS_LOCKED) { diff --git a/lib/private/files/storage/wrapper/availability.php b/lib/private/files/storage/wrapper/availability.php index d6ce78f6e44..d2fbbbacf75 100644 --- a/lib/private/files/storage/wrapper/availability.php +++ b/lib/private/files/storage/wrapper/availability.php @@ -399,7 +399,6 @@ class Availability extends Wrapper { /** {@inheritdoc} */ public function getOwner($path) { - $this->checkAvailability(); try { return parent::getOwner($path); } catch (\OCP\Files\StorageNotAvailableException $e) { diff --git a/lib/private/files/view.php b/lib/private/files/view.php index 6abefff4198..b8b1b8a50d6 100644 --- a/lib/private/files/view.php +++ b/lib/private/files/view.php @@ -1253,7 +1253,7 @@ class View { * @param boolean|string $includeMountPoints true to add mountpoint sizes, * 'ext' to add only ext storage mount point sizes. Defaults to true. * defaults to true - * @return \OC\Files\FileInfo|bool False if file does not exist + * @return \OC\Files\FileInfo|false False if file does not exist */ public function getFileInfo($path, $includeMountPoints = true) { $this->assertPathLength($path); diff --git a/lib/private/lock/abstractlockingprovider.php b/lib/private/lock/abstractlockingprovider.php index c7a29380efe..db5f1c72dd7 100644 --- a/lib/private/lock/abstractlockingprovider.php +++ b/lib/private/lock/abstractlockingprovider.php @@ -28,6 +28,8 @@ use OCP\Lock\ILockingProvider; * to release any left over locks at the end of the request */ abstract class AbstractLockingProvider implements ILockingProvider { + const TTL = 3600; // how long until we clear stray locks in seconds + protected $acquiredLocks = [ 'shared' => [], 'exclusive' => [] diff --git a/lib/private/lock/dblockingprovider.php b/lib/private/lock/dblockingprovider.php index 90657e6725f..1b5142a90d2 100644 --- a/lib/private/lock/dblockingprovider.php +++ b/lib/private/lock/dblockingprovider.php @@ -51,8 +51,6 @@ class DBLockingProvider extends AbstractLockingProvider { private $sharedLocks = []; - const TTL = 3600; // how long until we clear stray locks in seconds - /** * Check if we have an open shared lock for a path * @@ -235,10 +233,10 @@ class DBLockingProvider extends AbstractLockingProvider { /** * cleanup empty locks */ - public function cleanEmptyLocks() { + public function cleanExpiredLocks() { $expire = $this->timeFactory->getTime(); $this->connection->executeUpdate( - 'DELETE FROM `*PREFIX*file_locks` WHERE `lock` = 0 AND `ttl` < ?', + 'DELETE FROM `*PREFIX*file_locks` WHERE `ttl` < ?', [$expire] ); } @@ -262,7 +260,7 @@ class DBLockingProvider extends AbstractLockingProvider { public function __destruct() { try { - $this->cleanEmptyLocks(); + $this->cleanExpiredLocks(); } catch (\Exception $e) { // If the table is missing, the clean up was successful if ($this->connection->tableExists('file_locks')) { diff --git a/lib/private/lock/memcachelockingprovider.php b/lib/private/lock/memcachelockingprovider.php index e4158dcdfdf..af95200d159 100644 --- a/lib/private/lock/memcachelockingprovider.php +++ b/lib/private/lock/memcachelockingprovider.php @@ -21,6 +21,7 @@ namespace OC\Lock; +use OCP\IMemcacheTTL; use OCP\Lock\LockedException; use OCP\IMemcache; @@ -37,6 +38,12 @@ class MemcacheLockingProvider extends AbstractLockingProvider { $this->memcache = $memcache; } + private function setTTL($path) { + if ($this->memcache instanceof IMemcacheTTL) { + $this->memcache->setTTL($path, self::TTL); + } + } + /** * @param string $path * @param int $type self::LOCK_SHARED or self::LOCK_EXCLUSIVE @@ -69,6 +76,7 @@ class MemcacheLockingProvider extends AbstractLockingProvider { throw new LockedException($path); } } + $this->setTTL($path); $this->markAcquire($path, $type); } @@ -106,6 +114,7 @@ class MemcacheLockingProvider extends AbstractLockingProvider { throw new LockedException($path); } } + $this->setTTL($path); $this->markChange($path, $targetType); } } diff --git a/lib/private/log.php b/lib/private/log.php index ee5d61e98df..a722243dc69 100644 --- a/lib/private/log.php +++ b/lib/private/log.php @@ -227,7 +227,7 @@ class Log implements ILogger { $request = \OC::$server->getRequest(); // if token is found in the request change set the log condition to satisfied - if($request && StringUtils::equals($request->getParam('log_secret'), $logCondition['shared_secret'])) { + if($request && hash_equals($logCondition['shared_secret'], $request->getParam('log_secret'))) { $this->logConditionSatisfied = true; } } diff --git a/lib/private/memcache/redis.php b/lib/private/memcache/redis.php index 83be662eabf..68b62e7534a 100644 --- a/lib/private/memcache/redis.php +++ b/lib/private/memcache/redis.php @@ -25,9 +25,9 @@ namespace OC\Memcache; -use OCP\IMemcache; +use OCP\IMemcacheTTL; -class Redis extends Cache implements IMemcache { +class Redis extends Cache implements IMemcacheTTL { /** * @var \Redis $cache */ @@ -195,6 +195,10 @@ class Redis extends Cache implements IMemcache { return false; } + public function setTTL($key, $ttl) { + self::$cache->expire($this->getNamespace() . $key, $ttl); + } + static public function isAvailable() { return extension_loaded('redis') && version_compare(phpversion('redis'), '2.2.5', '>='); diff --git a/lib/private/preview.php b/lib/private/preview.php index b2accdfd00f..38c043030fc 100644 --- a/lib/private/preview.php +++ b/lib/private/preview.php @@ -1250,7 +1250,7 @@ class Preview { * @param array $args * @param string $prefix */ - public static function prepare_delete($args, $prefix = '') { + public static function prepare_delete(array $args, $prefix = '') { $path = $args['path']; if (substr($path, 0, 1) === '/') { $path = substr($path, 1); @@ -1259,7 +1259,11 @@ class Preview { $view = new \OC\Files\View('/' . \OC_User::getUser() . '/' . $prefix); $absPath = Files\Filesystem::normalizePath($view->getAbsolutePath($path)); - self::addPathToDeleteFileMapper($absPath, $view->getFileInfo($path)); + $fileInfo = $view->getFileInfo($path); + if($fileInfo === false) { + return; + } + self::addPathToDeleteFileMapper($absPath, $fileInfo); if ($view->is_dir($path)) { $children = self::getAllChildren($view, $path); self::$deleteChildrenMapper[$absPath] = $children; diff --git a/lib/private/repair.php b/lib/private/repair.php index f6ac7ebe65b..d870b472c4f 100644 --- a/lib/private/repair.php +++ b/lib/private/repair.php @@ -40,7 +40,6 @@ use OC\Repair\SqliteAutoincrement; use OC\Repair\DropOldTables; use OC\Repair\FillETags; use OC\Repair\InnoDB; -use OC\Repair\RepairConfig; use OC\Repair\RepairLegacyStorages; use OC\Repair\RepairMimeTypes; use OC\Repair\SearchLuceneTables; @@ -107,7 +106,6 @@ class Repair extends BasicEmitter { return [ new RepairMimeTypes(\OC::$server->getConfig()), new RepairLegacyStorages(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()), - new RepairConfig(), new AssetCache(), new FillETags(\OC::$server->getDatabaseConnection()), new CleanTags(\OC::$server->getDatabaseConnection()), @@ -138,13 +136,12 @@ class Repair extends BasicEmitter { * @return array of RepairStep instances */ public static function getBeforeUpgradeRepairSteps() { - $steps = array( + $steps = [ new InnoDB(), new Collation(\OC::$server->getConfig(), \OC_DB::getConnection()), new SqliteAutoincrement(\OC_DB::getConnection()), new SearchLuceneTables(), - new RepairConfig() - ); + ]; //There is no need to delete all previews on every single update //only 7.0.0 through 7.0.2 generated broken previews diff --git a/lib/private/security/crypto.php b/lib/private/security/crypto.php index 0bd34df3f36..46d0c750b2f 100644 --- a/lib/private/security/crypto.php +++ b/lib/private/security/crypto.php @@ -123,7 +123,7 @@ class Crypto implements ICrypto { $this->cipher->setIV($iv); - if(!\OCP\Security\StringUtils::equals($this->calculateHMAC($parts[0].$parts[1], $password), $hmac)) { + if(!hash_equals($this->calculateHMAC($parts[0].$parts[1], $password), $hmac)) { throw new \Exception('HMAC does not match.'); } diff --git a/lib/private/security/hasher.php b/lib/private/security/hasher.php index a5dd22e5dc8..318141b6852 100644 --- a/lib/private/security/hasher.php +++ b/lib/private/security/hasher.php @@ -109,7 +109,7 @@ class Hasher implements IHasher { // Verify whether it matches a legacy PHPass or SHA1 string $hashLength = strlen($hash); if($hashLength === 60 && password_verify($message.$this->legacySalt, $hash) || - $hashLength === 40 && StringUtils::equals($hash, sha1($message))) { + $hashLength === 40 && hash_equals($hash, sha1($message))) { $newHash = $this->hash($message); return true; } diff --git a/lib/private/security/securerandom.php b/lib/private/security/securerandom.php index 87dca68985e..24affbe8988 100644 --- a/lib/private/security/securerandom.php +++ b/lib/private/security/securerandom.php @@ -27,25 +27,15 @@ use Sabre\DAV\Exception; use OCP\Security\ISecureRandom; /** - * Class SecureRandom provides a layer around RandomLib to generate - * secure random strings. For PHP 7 the native CSPRNG is used. + * Class SecureRandom provides a wrapper around the random_int function to generate + * secure random strings. For PHP 7 the native CSPRNG is used, older versions do + * use a fallback. * * Usage: - * \OC::$server->getSecureRandom()->getMediumStrengthGenerator()->generate(10); - * + * \OC::$server->getSecureRandom()->generate(10); * @package OC\Security */ class SecureRandom implements ISecureRandom { - - /** @var \RandomLib\Factory */ - var $factory; - /** @var \RandomLib\Generator */ - var $generator; - - function __construct() { - $this->factory = new RandomLib\Factory; - } - /** * Convenience method to get a low strength random number generator. * @@ -53,10 +43,10 @@ class SecureRandom implements ISecureRandom { * in a non-cryptographical setting. They are not strong enough to be * used as keys or salts. They are however useful for one-time use tokens. * + * @deprecated 9.0.0 Use \OC\Security\SecureRandom::generate directly or random_bytes() / random_int() * @return $this */ public function getLowStrengthGenerator() { - $this->generator = $this->factory->getLowStrengthGenerator(); return $this; } @@ -67,10 +57,10 @@ class SecureRandom implements ISecureRandom { * They are strong enough to be used as keys and salts. However, they do * take some time and resources to generate, so they should not be over-used * + * @deprecated 9.0.0 Use \OC\Security\SecureRandom::generate directly or random_bytes() / random_int() * @return $this */ public function getMediumStrengthGenerator() { - $this->generator = $this->factory->getMediumStrengthGenerator(); return $this; } @@ -80,26 +70,17 @@ class SecureRandom implements ISecureRandom { * @param string $characters An optional list of characters to use if no character list is * specified all valid base64 characters are used. * @return string - * @throws \Exception If the generator is not initialized. */ public function generate($length, $characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/') { - if(is_null($this->generator)) { - throw new \Exception('Generator is not initialized.'); - } + $maxCharIndex = strlen($characters) - 1; + $randomString = ''; - if(function_exists('random_int')) { - $maxCharIndex = strlen($characters) - 1; - $randomString = ''; - - while($length > 0) { - $randomNumber = random_int(0, $maxCharIndex); - $randomString .= $characters[$randomNumber]; - $length--; - } - return $randomString; + while($length > 0) { + $randomNumber = random_int(0, $maxCharIndex); + $randomString .= $characters[$randomNumber]; + $length--; } - - return $this->generator->generateString($length, $characters); + return $randomString; } } diff --git a/lib/private/security/stringutils.php b/lib/private/security/stringutils.php deleted file mode 100644 index fa4342a2b45..00000000000 --- a/lib/private/security/stringutils.php +++ /dev/null @@ -1,60 +0,0 @@ -<?php -/** - * @author Lukas Reschke <lukas@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> - * - * @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\Security; - -class StringUtils { - - /** - * Compares whether two strings are equal. To prevent guessing of the string - * length this is done by comparing two hashes against each other and afterwards - * a comparison of the real string to prevent against the unlikely chance of - * collisions. - * - * Be aware that this function may leak whether the string to compare have a different - * length. - * - * @param string $expected The expected value - * @param string $input The input to compare against - * @return bool True if the two strings are equal, otherwise false. - */ - public static function equals($expected, $input) { - - if(!is_string($expected) || !is_string($input)) { - return false; - } - - if(function_exists('hash_equals')) { - return hash_equals($expected, $input); - } - - $randomString = \OC::$server->getSecureRandom()->getLowStrengthGenerator()->generate(10); - - if(hash('sha512', $expected.$randomString) === hash('sha512', $input.$randomString)) { - if($expected === $input) { - return true; - } - } - - return false; - } -}
\ No newline at end of file diff --git a/lib/private/security/trusteddomainhelper.php b/lib/private/security/trusteddomainhelper.php index 6dbaadfdb60..c1a397dd52d 100644 --- a/lib/private/security/trusteddomainhelper.php +++ b/lib/private/security/trusteddomainhelper.php @@ -74,16 +74,11 @@ class TrustedDomainHelper { return false; } - // TODO: Workaround for older instances still with port applied. Remove for ownCloud 9. - if(in_array($domainWithPort, $trustedList)) { - return true; - } - // Always allow access from localhost if (preg_match(Request::REGEX_LOCALHOST, $domain) === 1) { return true; } - return in_array($domain, $trustedList); + return in_array($domain, $trustedList, true); } } diff --git a/lib/private/server.php b/lib/private/server.php index 6692e6f6bbf..8439500706d 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -528,6 +528,13 @@ class Server extends SimpleContainer implements IServerContainer { }); return $manager; }); + $this->registerService('CommentsManager', function(Server $c) { + $config = $c->getConfig(); + $factoryClass = $config->getSystemValue('comments.managerFactory', '\OC\Comments\ManagerFactory'); + /** @var \OCP\Comments\ICommentsManagerFactory $factory */ + $factory = new $factoryClass(); + return $factory->getManager(); + }); $this->registerService('EventDispatcher', function() { return new EventDispatcher(); }); @@ -1122,6 +1129,13 @@ class Server extends SimpleContainer implements IServerContainer { } /** + * @return \OCP\Comments\ICommentsManager + */ + public function getCommentsManager() { + return $this->query('CommentsManager'); + } + + /** * @return \OC\IntegrityCheck\Checker */ public function getIntegrityCodeChecker() { diff --git a/lib/private/setup.php b/lib/private/setup.php index 97d01c50109..4d11cb44a83 100644 --- a/lib/private/setup.php +++ b/lib/private/setup.php @@ -422,6 +422,9 @@ class Setup { $content.="\n RewriteBase ".$webRoot; $content .= "\n <IfModule mod_env.c>"; $content .= "\n SetEnv front_controller_active true"; + $content .= "\n <IfModule mod_dir.c>"; + $content .= "\n DirectorySlash off"; + $content .= "\n </IfModule>"; $content.="\n </IfModule>"; $content.="\n</IfModule>"; diff --git a/lib/private/setup/mysql.php b/lib/private/setup/mysql.php index f2d2b15cd90..e8b88eb3489 100644 --- a/lib/private/setup/mysql.php +++ b/lib/private/setup/mysql.php @@ -89,15 +89,28 @@ class MySQL extends AbstractDatabase { * @throws \OC\DatabaseSetupException */ private function connect() { - $type = 'mysql'; + $connectionParams = array( - 'host' => $this->dbHost, - 'user' => $this->dbUser, - 'password' => $this->dbPassword, - 'tablePrefix' => $this->tablePrefix, + 'host' => $this->dbHost, + 'user' => $this->dbUser, + 'password' => $this->dbPassword, + 'tablePrefix' => $this->tablePrefix, ); + + // adding port support + if (strpos($this->dbHost, ':')) { + // Host variable may carry a port or socket. + list($host, $portOrSocket) = explode(':', $this->dbHost, 2); + if (ctype_digit($portOrSocket)) { + $connectionParams['port'] = $portOrSocket; + } else { + $connectionParams['unix_socket'] = $portOrSocket; + } + $connectionParams['host'] = $host; + } + $cf = new ConnectionFactory(); - return $cf->getConnection($type, $connectionParams); + return $cf->getConnection('mysql', $connectionParams); } /** diff --git a/lib/private/share/mailnotifications.php b/lib/private/share/mailnotifications.php index 4d282158ba4..f071c7f3a3c 100644 --- a/lib/private/share/mailnotifications.php +++ b/lib/private/share/mailnotifications.php @@ -170,7 +170,7 @@ class MailNotifications { * @param string $filename the shared file * @param string $link the public link * @param int $expiration expiration date (timestamp) - * @return array $result of failed recipients + * @return string[] $result of failed recipients */ public function sendLinkShareMail($recipient, $filename, $link, $expiration) { $subject = (string)$this->l->t('%s shared »%s« with you', [$this->senderDisplayName, $filename]); @@ -232,8 +232,8 @@ class MailNotifications { } /** - * @param $itemSource - * @param $itemType + * @param string $itemSource + * @param string $itemType * @param IUser $recipient * @return array */ diff --git a/lib/private/share/share.php b/lib/private/share/share.php index 8899df25636..3edffba8a3f 100644 --- a/lib/private/share/share.php +++ b/lib/private/share/share.php @@ -635,7 +635,7 @@ class Share extends Constants { throw new \Exception($message_t); } // verify that the user has share permission - if (!\OC\Files\Filesystem::isSharable($path)) { + if (!\OC\Files\Filesystem::isSharable($path) || \OCP\Util::isSharingDisabledForUser()) { $message = 'You are not allowed to share %s'; $message_t = $l->t('You are not allowed to share %s', [$path]); \OCP\Util::writeLog('OCP\Share', sprintf($message, $path), \OCP\Util::DEBUG); @@ -762,6 +762,11 @@ class Share extends Constants { $updateExistingShare = false; if (\OC::$server->getAppConfig()->getValue('core', 'shareapi_allow_links', 'yes') == 'yes') { + // IF the password is changed via the old ajax endpoint verify it before deleting the old share + if ($passwordChanged === true) { + self::verifyPassword($shareWith); + } + // when updating a link share // FIXME Don't delete link if we update it if ($checkExists = self::getItems($itemType, $itemSource, self::SHARE_TYPE_LINK, null, diff --git a/lib/private/systemtag/systemtagmanager.php b/lib/private/systemtag/systemtagmanager.php index 8caf10d69da..7f239dc84cf 100644 --- a/lib/private/systemtag/systemtagmanager.php +++ b/lib/private/systemtag/systemtagmanager.php @@ -63,7 +63,7 @@ class SystemTagManager implements ISystemTagManager { /** * {@inheritdoc} */ - public function getTagsById($tagIds) { + public function getTagsByIds($tagIds) { if (!is_array($tagIds)) { $tagIds = [$tagIds]; } @@ -242,7 +242,7 @@ class SystemTagManager implements ISystemTagManager { $tagNotFoundException = null; try { - $this->getTagsById($tagIds); + $this->getTagsByIds($tagIds); } catch (TagNotFoundException $e) { $tagNotFoundException = $e; } diff --git a/lib/private/systemtag/systemtagobjectmapper.php b/lib/private/systemtag/systemtagobjectmapper.php index 75f2631a010..988fa66d77e 100644 --- a/lib/private/systemtag/systemtagobjectmapper.php +++ b/lib/private/systemtag/systemtagobjectmapper.php @@ -171,6 +171,10 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper { public function haveTag($objIds, $objectType, $tagId, $all = true) { $this->assertTagsExist([$tagId]); + if (!is_array($objIds)) { + $objIds = [$objIds]; + } + $query = $this->connection->getQueryBuilder(); if (!$all) { @@ -209,7 +213,7 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper { * @throws \OCP\SystemTag\TagNotFoundException if at least one tag did not exist */ private function assertTagsExist($tagIds) { - $tags = $this->tagManager->getTagsById($tagIds); + $tags = $this->tagManager->getTagsByIds($tagIds); if (count($tags) !== count($tagIds)) { // at least one tag missing, bail out $foundTagIds = array_map( diff --git a/lib/private/template.php b/lib/private/template.php index 1476a964ef3..d794dacac23 100644 --- a/lib/private/template.php +++ b/lib/private/template.php @@ -226,12 +226,12 @@ class OC_Template extends \OC\Template\Base { // Add custom headers $headers = ''; foreach(OC_Util::$headers as $header) { - $headers .= '<'.OC_Util::sanitizeHTML($header['tag']); + $headers .= '<'.\OCP\Util::sanitizeHTML($header['tag']); foreach($header['attributes'] as $name=>$value) { - $headers .= ' '.OC_Util::sanitizeHTML($name).'="'.OC_Util::sanitizeHTML($value).'"'; + $headers .= ' '.\OCP\Util::sanitizeHTML($name).'="'.\OCP\Util::sanitizeHTML($value).'"'; } if ($header['text'] !== null) { - $headers .= '>'.OC_Util::sanitizeHTML($header['text']).'</'.OC_Util::sanitizeHTML($header['tag']).'>'; + $headers .= '>'.\OCP\Util::sanitizeHTML($header['text']).'</'.\OCP\Util::sanitizeHTML($header['tag']).'>'; } else { $headers .= '/>'; } diff --git a/lib/private/template/functions.php b/lib/private/template/functions.php index 79d18632d2f..d156d26f9ce 100644 --- a/lib/private/template/functions.php +++ b/lib/private/template/functions.php @@ -33,7 +33,7 @@ * @param string $string the string which will be escaped and printed */ function p($string) { - print(OC_Util::sanitizeHTML($string)); + print(\OCP\Util::sanitizeHTML($string)); } /** @@ -262,7 +262,7 @@ function html_select_options($options, $selected, $params=array()) { $label = $label[$label_name]; } $select = in_array($value, $selected) ? ' selected="selected"' : ''; - $html .= '<option value="' . OC_Util::sanitizeHTML($value) . '"' . $select . '>' . OC_Util::sanitizeHTML($label) . '</option>'."\n"; + $html .= '<option value="' . \OCP\Util::sanitizeHTML($value) . '"' . $select . '>' . \OCP\Util::sanitizeHTML($label) . '</option>'."\n"; } return $html; } diff --git a/lib/private/user/user.php b/lib/private/user/user.php index d827097ee39..6c89dd06f77 100644 --- a/lib/private/user/user.php +++ b/lib/private/user/user.php @@ -189,6 +189,8 @@ class User implements IUser { // Delete the users entry in the storage table \OC\Files\Cache\Storage::remove('home::' . $this->uid); + + \OC::$server->getCommentsManager()->deleteReferencesOfActor('user', $this->uid); } if ($this->emitter) { diff --git a/lib/private/util.php b/lib/private/util.php index c31ad63b9be..9016dc59751 100644 --- a/lib/private/util.php +++ b/lib/private/util.php @@ -642,13 +642,15 @@ class OC_Util { } // Check if config folder is writable. - if (!is_writable(OC::$configDir) or !is_readable(OC::$configDir)) { - $errors[] = array( - 'error' => $l->t('Cannot write into "config" directory'), - 'hint' => $l->t('This can usually be fixed by ' - . '%sgiving the webserver write access to the config directory%s.', - array('<a href="' . $urlGenerator->linkToDocs('admin-dir_permissions') . '" target="_blank">', '</a>')) - ); + if(!OC_Helper::isReadOnlyConfigEnabled()) { + if (!is_writable(OC::$configDir) or !is_readable(OC::$configDir)) { + $errors[] = array( + 'error' => $l->t('Cannot write into "config" directory'), + 'hint' => $l->t('This can usually be fixed by ' + . '%sgiving the webserver write access to the config directory%s.', + array('<a href="' . $urlGenerator->linkToDocs('admin-dir_permissions') . '" target="_blank">', '</a>')) + ); + } } // Check if there is a writable install folder. @@ -1177,14 +1179,16 @@ class OC_Util { * This function is used to sanitize HTML and should be applied on any * string or array of strings before displaying it on a web page. * - * @param string|array &$value + * @param string|array $value * @return string|array an array of sanitized strings or a single sanitized string, depends on the input parameter. */ - public static function sanitizeHTML(&$value) { + public static function sanitizeHTML($value) { if (is_array($value)) { - array_walk_recursive($value, 'OC_Util::sanitizeHTML'); + $value = array_map(function($value) { + return self::sanitizeHTML($value); + }, $value); } else { - //Specify encoding for PHP<5.4 + // Specify encoding for PHP<5.4 $value = htmlspecialchars((string)$value, ENT_QUOTES, 'UTF-8'); } return $value; diff --git a/lib/public/comments/icomment.php b/lib/public/comments/icomment.php index c8f407624a0..7924ec8d5f6 100644 --- a/lib/public/comments/icomment.php +++ b/lib/public/comments/icomment.php @@ -5,7 +5,7 @@ namespace OCP\Comments; /** * Interface IComment * - * This class represents a comment and offers methods for modification. + * This class represents a comment * * @package OCP\Comments * @since 9.0.0 @@ -49,7 +49,6 @@ interface IComment { /** * sets the parent ID and returns itself - * * @param string $parentId * @return IComment * @since 9.0.0 @@ -57,6 +56,24 @@ interface IComment { public function setParentId($parentId); /** + * returns the topmost parent ID of the comment + * + * @return string + * @since 9.0.0 + */ + public function getTopmostParentId(); + + + /** + * sets the topmost parent ID and returns itself + * + * @param string $id + * @return IComment + * @since 9.0.0 + */ + public function setTopmostParentId($id); + + /** * returns the number of children * * @return int diff --git a/lib/public/comments/icommentsmanager.php b/lib/public/comments/icommentsmanager.php index ebf7a34bf27..7626ffd6351 100644 --- a/lib/public/comments/icommentsmanager.php +++ b/lib/public/comments/icommentsmanager.php @@ -13,6 +13,17 @@ namespace OCP\Comments; interface ICommentsManager { /** + * @const DELETED_USER type and id for a user that has been deleted + * @see deleteReferencesOfActor + * @since 9.0.0 + * + * To be used as replacement for user type actors in deleteReferencesOfActor(). + * + * User interfaces shall show "Deleted user" as display name, if needed. + */ + const DELETED_USER = 'deleted_user'; + + /** * returns a comment instance * * @param string $id the ID of the comment @@ -28,7 +39,7 @@ interface ICommentsManager { * @param string $id * @param int $limit max number of entries to return, 0 returns all * @param int $offset the start entry - * @return [] + * @return array * @since 9.0.0 * * The return array looks like this @@ -73,7 +84,6 @@ interface ICommentsManager { * @param \DateTime $notOlderThan optional, timestamp of the oldest comments * that may be returned * @return IComment[] - * @throws NotFoundException in case the requested type or id is not present * @since 9.0.0 */ public function getForObject( @@ -88,7 +98,6 @@ interface ICommentsManager { * @param $objectType string the object type, e.g. 'files' * @param $objectId string the id of the object * @return Int - * @throws NotFoundException in case the requested type or id is not present * @since 9.0.0 */ public function getNumberOfCommentsForObject($objectType, $objectId); @@ -130,17 +139,20 @@ interface ICommentsManager { * Throws NotFoundException when a comment that is to be updated does not * exist anymore at this point of time. * - * @param IComment + * @param IComment $comment * @return bool * @throws NotFoundException * @since 9.0.0 */ - public function save(&$comment); + public function save(IComment $comment); /** * removes references to specific actor (e.g. on user delete) of a comment. * The comment itself must not get lost/deleted. * + * A 'user' type actor (type and id) should get replaced by the + * value of the DELETED_USER constant of this interface. + * * @param string $actorType the actor type (e.g. 'user') * @param string $actorId a user id * @return boolean diff --git a/lib/public/comments/icommentsmanagerfactory.php b/lib/public/comments/icommentsmanagerfactory.php new file mode 100644 index 00000000000..6718dd39ba0 --- /dev/null +++ b/lib/public/comments/icommentsmanagerfactory.php @@ -0,0 +1,23 @@ +<?php + +namespace OCP\Comments; + +/** + * Interface ICommentsManagerFactory + * + * This class is responsible for instantiating and returning an ICommentsManager + * instance. + * + * @package OCP\Comments + * @since 9.0.0 + */ +interface ICommentsManagerFactory { + + /** + * creates and returns an instance of the ICommentsManager + * + * @return ICommentsManager + * @since 9.0.0 + */ + public function getManager(); +} diff --git a/lib/public/db/querybuilder/iquerybuilder.php b/lib/public/db/querybuilder/iquerybuilder.php index beb922b7feb..dd3ee7da5f5 100644 --- a/lib/public/db/querybuilder/iquerybuilder.php +++ b/lib/public/db/querybuilder/iquerybuilder.php @@ -257,6 +257,22 @@ interface IQueryBuilder { public function selectAlias($select, $alias); /** + * Specifies an item that is to be returned uniquely in the query result. + * + * <code> + * $qb = $conn->getQueryBuilder() + * ->selectDistinct('type') + * ->from('users'); + * </code> + * + * @param mixed $select The selection expressions. + * + * @return \OCP\DB\QueryBuilder\IQueryBuilder This QueryBuilder instance. + * @since 9.0.0 + */ + public function selectDistinct($select); + + /** * Adds an item that is to be returned in the query result. * * <code> @@ -796,4 +812,31 @@ interface IQueryBuilder { * @since 8.2.0 */ public function createFunction($call); + + /** + * Used to get the id of the last inserted element + * @return int + * @throws \BadMethodCallException When being called before an insert query has been run. + * @since 9.0.0 + */ + public function getLastInsertId(); + + /** + * Returns the table name quoted and with database prefix as needed by the implementation + * + * @param string $table + * @return string + * @since 9.0.0 + */ + public function getTableName($table); + + /** + * Returns the column name quoted and with table alias prefix as needed by the implementation + * + * @param string $column + * @param string $tableAlias + * @return string + * @since 9.0.0 + */ + public function getColumnName($column, $tableAlias = ''); } diff --git a/lib/public/imemcachettl.php b/lib/public/imemcachettl.php new file mode 100644 index 00000000000..3c2bfe8ad27 --- /dev/null +++ b/lib/public/imemcachettl.php @@ -0,0 +1,38 @@ +<?php +/** + * @author Robin Appelman <icewind@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 OCP; + +/** + * Interface for memcache backends that support setting ttl after the value is set + * + * @since 8.2.2 + */ +interface IMemcacheTTL extends IMemcache { + /** + * Set the ttl for an existing value + * + * @param string $key + * @param int $ttl time to live in seconds + * @since 8.2.2 + */ + public function setTTL($key, $ttl); +} diff --git a/lib/public/iservercontainer.php b/lib/public/iservercontainer.php index 7cb2672254b..267e5dc4d31 100644 --- a/lib/public/iservercontainer.php +++ b/lib/public/iservercontainer.php @@ -472,6 +472,12 @@ interface IServerContainer { public function getNotificationManager(); /** + * @return \OCP\Comments\ICommentsManager + * @since 9.0.0 + */ + public function getCommentsManager(); + + /** * Returns the system-tag manager * * @return \OCP\SystemTag\ISystemTagManager diff --git a/lib/public/security/isecurerandom.php b/lib/public/security/isecurerandom.php index 1b72e4f4377..8315d0f971a 100644 --- a/lib/public/security/isecurerandom.php +++ b/lib/public/security/isecurerandom.php @@ -23,12 +23,12 @@ namespace OCP\Security; /** - * Class SecureRandom provides a layer around RandomLib to generate - * secure random strings. For PHP 7 the native CSPRNG is used. + * Class SecureRandom provides a wrapper around the random_int function to generate + * secure random strings. For PHP 7 the native CSPRNG is used, older versions do + * use a fallback. * * Usage: - * $rng = new \OC\Security\SecureRandom(); - * $randomString = $rng->getMediumStrengthGenerator()->generateString(30); + * \OC::$server->getSecureRandom()->generate(10); * * @package OCP\Security * @since 8.0.0 @@ -52,6 +52,7 @@ interface ISecureRandom { * * @return $this * @since 8.0.0 + * @deprecated 9.0.0 Use \OC\Security\SecureRandom::generate directly or random_bytes() / random_int() */ public function getLowStrengthGenerator(); @@ -64,6 +65,7 @@ interface ISecureRandom { * * @return $this * @since 8.0.0 + * @deprecated 9.0.0 Use \OC\Security\SecureRandom::generate directly or random_bytes() / random_int() */ public function getMediumStrengthGenerator(); @@ -73,7 +75,6 @@ interface ISecureRandom { * @param string $characters An optional list of characters to use if no character list is * specified all valid base64 characters are used. * @return string - * @throws \Exception If the generator is not initialized. * @since 8.0.0 */ public function generate($length, diff --git a/lib/public/security/stringutils.php b/lib/public/security/stringutils.php index 4f41fcf8262..7cf12ea2702 100644 --- a/lib/public/security/stringutils.php +++ b/lib/public/security/stringutils.php @@ -39,8 +39,9 @@ class StringUtils { * @param string $input The input to compare against * @return bool True if the two strings are equal, otherwise false. * @since 8.0.0 + * @deprecated 9.0.0 Use hash_equals */ public static function equals($expected, $input) { - return \OC\Security\StringUtils::equals($expected, $input); + return hash_equals($expected, $input); } } diff --git a/lib/public/systemtag/isystemtagmanager.php b/lib/public/systemtag/isystemtagmanager.php index 4e3b263e56c..6e8fed36dce 100644 --- a/lib/public/systemtag/isystemtagmanager.php +++ b/lib/public/systemtag/isystemtagmanager.php @@ -41,7 +41,7 @@ interface ISystemTagManager { * * @since 9.0.0 */ - public function getTagsById($tagIds); + public function getTagsByIds($tagIds); /** * Returns the tag object matching the given attributes. diff --git a/lib/public/util.php b/lib/public/util.php index 110028368d0..4e783b764ed 100644 --- a/lib/public/util.php +++ b/lib/public/util.php @@ -497,11 +497,11 @@ class Util { * string or array of strings before displaying it on a web page. * * @param string|array $value - * @return string|array an array of sanitized strings or a single sinitized string, depends on the input parameter. + * @return string|array an array of sanitized strings or a single sanitized string, depends on the input parameter. * @since 4.5.0 */ - public static function sanitizeHTML( $value ) { - return(\OC_Util::sanitizeHTML($value)); + public static function sanitizeHTML($value) { + return \OC_Util::sanitizeHTML($value); } /** diff --git a/lib/repair/repairconfig.php b/lib/repair/repairconfig.php deleted file mode 100644 index 66fdd47269e..00000000000 --- a/lib/repair/repairconfig.php +++ /dev/null @@ -1,80 +0,0 @@ -<?php -/** - * @author Lukas Reschke <lukas@owncloud.com> - * @author Morris Jobke <hey@morrisjobke.de> - * - * @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\Repair; - -use OC\Hooks\BasicEmitter; -use OC\RepairStep; -use Sabre\DAV\Exception; - -/** - * Class RepairConfig - * - * @package OC\Repair - */ -class RepairConfig extends BasicEmitter implements RepairStep { - - /** - * @return string - */ - public function getName() { - return 'Repair config'; - } - - /** - * Updates the configuration after running an update - */ - public function run() { - $this->addSecret(); - $this->removePortsFromTrustedDomains(); - } - - /** - * Adds a secret to config.php - */ - private function addSecret() { - if(\OC::$server->getConfig()->getSystemValue('secret', null) === null) { - $secret = \OC::$server->getSecureRandom()->getMediumStrengthGenerator()->generate(48); - \OC::$server->getConfig()->setSystemValue('secret', $secret); - } - } - - - /** - * Remove ports from existing trusted domains in config.php - */ - private function removePortsFromTrustedDomains() { - $trustedDomains = \OC::$server->getConfig()->getSystemValue('trusted_domains', array()); - $newTrustedDomains = array(); - foreach($trustedDomains as $domain) { - $pos = strrpos($domain, ':'); - if ($pos !== false) { - $port = substr($domain, $pos + 1); - if (is_numeric($port)) { - $domain = substr($domain, 0, $pos); - } - } - $newTrustedDomains[] = $domain; - } - \OC::$server->getConfig()->setSystemValue('trusted_domains', $newTrustedDomains); - } -} diff --git a/settings/l10n/ar.js b/settings/l10n/ar.js index 818d001b3d6..c4b24e2e4ad 100644 --- a/settings/l10n/ar.js +++ b/settings/l10n/ar.js @@ -4,11 +4,9 @@ OC.L10N.register( "Sharing" : "مشاركة", "Cron" : "مجدول", "Log" : "سجل", - "Authentication error" : "لم يتم التأكد من الشخصية بنجاح", - "Your full name has been changed." : "اسمك الكامل تم تغييره.", - "Unable to change full name" : "لم يتم التمكن من تغيير اسمك الكامل", "Language changed" : "تم تغيير اللغة", "Invalid request" : "طلب غير مفهوم", + "Authentication error" : "لم يتم التأكد من الشخصية بنجاح", "Admins can't remove themself from the admin group" : "لا يستطيع المدير إزالة حسابه من مجموعة المديرين", "Unable to add user to group %s" : "فشل إضافة المستخدم الى المجموعة %s", "Unable to remove user from group %s" : "فشل إزالة المستخدم من المجموعة %s", @@ -23,6 +21,8 @@ OC.L10N.register( "test email settings" : "إعدادات البريد التجريبي", "Email sent" : "تم ارسال البريد الالكتروني", "Email saved" : "تم حفظ البريد الإلكتروني", + "Your full name has been changed." : "اسمك الكامل تم تغييره.", + "Unable to change full name" : "لم يتم التمكن من تغيير اسمك الكامل", "Are you really sure you want add \"{domain}\" as trusted domain?" : "هل أنت متأكد انك تريد إضافة \"{domain}\" كنطاق موثوق فيه.", "Sending..." : "جاري الارسال ...", "All" : "الكل", diff --git a/settings/l10n/ar.json b/settings/l10n/ar.json index 6e2a8268b5f..18e50c1c0e3 100644 --- a/settings/l10n/ar.json +++ b/settings/l10n/ar.json @@ -2,11 +2,9 @@ "Sharing" : "مشاركة", "Cron" : "مجدول", "Log" : "سجل", - "Authentication error" : "لم يتم التأكد من الشخصية بنجاح", - "Your full name has been changed." : "اسمك الكامل تم تغييره.", - "Unable to change full name" : "لم يتم التمكن من تغيير اسمك الكامل", "Language changed" : "تم تغيير اللغة", "Invalid request" : "طلب غير مفهوم", + "Authentication error" : "لم يتم التأكد من الشخصية بنجاح", "Admins can't remove themself from the admin group" : "لا يستطيع المدير إزالة حسابه من مجموعة المديرين", "Unable to add user to group %s" : "فشل إضافة المستخدم الى المجموعة %s", "Unable to remove user from group %s" : "فشل إزالة المستخدم من المجموعة %s", @@ -21,6 +19,8 @@ "test email settings" : "إعدادات البريد التجريبي", "Email sent" : "تم ارسال البريد الالكتروني", "Email saved" : "تم حفظ البريد الإلكتروني", + "Your full name has been changed." : "اسمك الكامل تم تغييره.", + "Unable to change full name" : "لم يتم التمكن من تغيير اسمك الكامل", "Are you really sure you want add \"{domain}\" as trusted domain?" : "هل أنت متأكد انك تريد إضافة \"{domain}\" كنطاق موثوق فيه.", "Sending..." : "جاري الارسال ...", "All" : "الكل", diff --git a/settings/l10n/ast.js b/settings/l10n/ast.js index 9597cc9a522..9a5b7a4e882 100644 --- a/settings/l10n/ast.js +++ b/settings/l10n/ast.js @@ -6,12 +6,10 @@ OC.L10N.register( "Cron" : "Cron", "Log" : "Rexistru", "Updates" : "Anovamientos", - "Authentication error" : "Fallu d'autenticación", - "Your full name has been changed." : "Camudóse'l nome completu.", - "Unable to change full name" : "Nun pue camudase'l nome completu", "Couldn't remove app." : "Nun pudo desaniciase l'aplicación.", "Language changed" : "Camudóse la llingua", "Invalid request" : "Solicitú inválida", + "Authentication error" : "Fallu d'autenticación", "Admins can't remove themself from the admin group" : "Los alministradores nun puen desaniciase a ellos mesmos del grupu d'alministrador", "Unable to add user to group %s" : "Nun pudo amestase l'usuariu al grupu %s", "Unable to remove user from group %s" : "Nun pudo desaniciase al usuariu del grupu %s", @@ -28,6 +26,8 @@ OC.L10N.register( "Email sent" : "Corréu-e unviáu", "You need to set your user email before being able to send test emails." : "Tienes de configurar la direición de corréu-e enantes de poder unviar mensaxes de prueba.", "Email saved" : "Corréu-e guardáu", + "Your full name has been changed." : "Camudóse'l nome completu.", + "Unable to change full name" : "Nun pue camudase'l nome completu", "Are you really sure you want add \"{domain}\" as trusted domain?" : "¿De xuru que quies amestar \"{domain}\" como dominiu de confianza?", "Add trusted domain" : "Amestar dominiu de confianza", "Sending..." : "Unviando...", diff --git a/settings/l10n/ast.json b/settings/l10n/ast.json index c3252ba8bf5..13dd87a9434 100644 --- a/settings/l10n/ast.json +++ b/settings/l10n/ast.json @@ -4,12 +4,10 @@ "Cron" : "Cron", "Log" : "Rexistru", "Updates" : "Anovamientos", - "Authentication error" : "Fallu d'autenticación", - "Your full name has been changed." : "Camudóse'l nome completu.", - "Unable to change full name" : "Nun pue camudase'l nome completu", "Couldn't remove app." : "Nun pudo desaniciase l'aplicación.", "Language changed" : "Camudóse la llingua", "Invalid request" : "Solicitú inválida", + "Authentication error" : "Fallu d'autenticación", "Admins can't remove themself from the admin group" : "Los alministradores nun puen desaniciase a ellos mesmos del grupu d'alministrador", "Unable to add user to group %s" : "Nun pudo amestase l'usuariu al grupu %s", "Unable to remove user from group %s" : "Nun pudo desaniciase al usuariu del grupu %s", @@ -26,6 +24,8 @@ "Email sent" : "Corréu-e unviáu", "You need to set your user email before being able to send test emails." : "Tienes de configurar la direición de corréu-e enantes de poder unviar mensaxes de prueba.", "Email saved" : "Corréu-e guardáu", + "Your full name has been changed." : "Camudóse'l nome completu.", + "Unable to change full name" : "Nun pue camudase'l nome completu", "Are you really sure you want add \"{domain}\" as trusted domain?" : "¿De xuru que quies amestar \"{domain}\" como dominiu de confianza?", "Add trusted domain" : "Amestar dominiu de confianza", "Sending..." : "Unviando...", diff --git a/settings/l10n/az.js b/settings/l10n/az.js index 60a2492a282..6a354b0c9a1 100644 --- a/settings/l10n/az.js +++ b/settings/l10n/az.js @@ -7,12 +7,10 @@ OC.L10N.register( "Cron" : "Cron", "Log" : "Jurnal", "Updates" : "Yenilənmələr", - "Authentication error" : "Təyinat metodikası", - "Your full name has been changed." : "Sizin tam adınız dəyişdirildi.", - "Unable to change full name" : "Tam adı dəyişmək olmur", "Couldn't remove app." : "Proqram təminatını silmək mümkün olmadı.", "Language changed" : "Dil dəyişdirildi", "Invalid request" : "Səhv müraciət", + "Authentication error" : "Təyinat metodikası", "Admins can't remove themself from the admin group" : "İnzibatçılar özlərini inzibatçı qrupundan silə bilməz", "Unable to add user to group %s" : "İstifadəçini %s qrupuna əlavə etmək mümkün olmadı", "Unable to remove user from group %s" : "İstifadəçini %s qrupundan silmək mümkün olmadı", @@ -44,6 +42,8 @@ OC.L10N.register( "Invalid user" : "İstifadəçi adı yalnışdır", "Unable to change mail address" : "Mail ünvanını dəyişmək olmur", "Email saved" : "Məktub yadda saxlanıldı", + "Your full name has been changed." : "Sizin tam adınız dəyişdirildi.", + "Unable to change full name" : "Tam adı dəyişmək olmur", "Are you really sure you want add \"{domain}\" as trusted domain?" : "\"{domain}\" adını inamlı domainlər siyahısına əlavə etməyinizdən əminsinizmi?", "Add trusted domain" : "İnamlı domainlərə əlavə et", "Sending..." : "Göndərilir...", diff --git a/settings/l10n/az.json b/settings/l10n/az.json index 8b46a472df7..1093ff98cf1 100644 --- a/settings/l10n/az.json +++ b/settings/l10n/az.json @@ -5,12 +5,10 @@ "Cron" : "Cron", "Log" : "Jurnal", "Updates" : "Yenilənmələr", - "Authentication error" : "Təyinat metodikası", - "Your full name has been changed." : "Sizin tam adınız dəyişdirildi.", - "Unable to change full name" : "Tam adı dəyişmək olmur", "Couldn't remove app." : "Proqram təminatını silmək mümkün olmadı.", "Language changed" : "Dil dəyişdirildi", "Invalid request" : "Səhv müraciət", + "Authentication error" : "Təyinat metodikası", "Admins can't remove themself from the admin group" : "İnzibatçılar özlərini inzibatçı qrupundan silə bilməz", "Unable to add user to group %s" : "İstifadəçini %s qrupuna əlavə etmək mümkün olmadı", "Unable to remove user from group %s" : "İstifadəçini %s qrupundan silmək mümkün olmadı", @@ -42,6 +40,8 @@ "Invalid user" : "İstifadəçi adı yalnışdır", "Unable to change mail address" : "Mail ünvanını dəyişmək olmur", "Email saved" : "Məktub yadda saxlanıldı", + "Your full name has been changed." : "Sizin tam adınız dəyişdirildi.", + "Unable to change full name" : "Tam adı dəyişmək olmur", "Are you really sure you want add \"{domain}\" as trusted domain?" : "\"{domain}\" adını inamlı domainlər siyahısına əlavə etməyinizdən əminsinizmi?", "Add trusted domain" : "İnamlı domainlərə əlavə et", "Sending..." : "Göndərilir...", diff --git a/settings/l10n/bg_BG.js b/settings/l10n/bg_BG.js index 425b8f47dc7..c1d50044b3c 100644 --- a/settings/l10n/bg_BG.js +++ b/settings/l10n/bg_BG.js @@ -7,12 +7,10 @@ OC.L10N.register( "Cron" : "Крон", "Log" : "Лог", "Updates" : "Обновления", - "Authentication error" : "Възникна проблем с идентификацията", - "Your full name has been changed." : "Вашето пълно име е променено.", - "Unable to change full name" : "Неуспешна промяна на пълното име.", "Couldn't remove app." : "Неуспешно премахване на приложението.", "Language changed" : "Езикът е променен", "Invalid request" : "Невалидна заявка", + "Authentication error" : "Възникна проблем с идентификацията", "Admins can't remove themself from the admin group" : "Администраторите не могат да премахват себе си от групата \"admin\".", "Unable to add user to group %s" : "Неуспешно добавяне на потребител към групата %s.", "Unable to remove user from group %s" : "Неуспешно премахване на потребител от групата %s.", @@ -43,6 +41,8 @@ OC.L10N.register( "Invalid user" : "Невалиден протребител", "Unable to change mail address" : "Неуспешна промяна на адрес на електронна поща", "Email saved" : "Имейлът е запазен", + "Your full name has been changed." : "Вашето пълно име е променено.", + "Unable to change full name" : "Неуспешна промяна на пълното име.", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Сигурен/на ли сте, че искате \"{domain}\" да бъде добавен като сигурен домейн?", "Add trusted domain" : "Добавяне на сигурен домейн", "Sending..." : "Изпращане...", diff --git a/settings/l10n/bg_BG.json b/settings/l10n/bg_BG.json index e12faed8f69..154d832d781 100644 --- a/settings/l10n/bg_BG.json +++ b/settings/l10n/bg_BG.json @@ -5,12 +5,10 @@ "Cron" : "Крон", "Log" : "Лог", "Updates" : "Обновления", - "Authentication error" : "Възникна проблем с идентификацията", - "Your full name has been changed." : "Вашето пълно име е променено.", - "Unable to change full name" : "Неуспешна промяна на пълното име.", "Couldn't remove app." : "Неуспешно премахване на приложението.", "Language changed" : "Езикът е променен", "Invalid request" : "Невалидна заявка", + "Authentication error" : "Възникна проблем с идентификацията", "Admins can't remove themself from the admin group" : "Администраторите не могат да премахват себе си от групата \"admin\".", "Unable to add user to group %s" : "Неуспешно добавяне на потребител към групата %s.", "Unable to remove user from group %s" : "Неуспешно премахване на потребител от групата %s.", @@ -41,6 +39,8 @@ "Invalid user" : "Невалиден протребител", "Unable to change mail address" : "Неуспешна промяна на адрес на електронна поща", "Email saved" : "Имейлът е запазен", + "Your full name has been changed." : "Вашето пълно име е променено.", + "Unable to change full name" : "Неуспешна промяна на пълното име.", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Сигурен/на ли сте, че искате \"{domain}\" да бъде добавен като сигурен домейн?", "Add trusted domain" : "Добавяне на сигурен домейн", "Sending..." : "Изпращане...", diff --git a/settings/l10n/bn_BD.js b/settings/l10n/bn_BD.js index b83657ea346..aecaf471c85 100644 --- a/settings/l10n/bn_BD.js +++ b/settings/l10n/bn_BD.js @@ -3,11 +3,10 @@ OC.L10N.register( { "Sharing" : "ভাগাভাগিরত", "External Storage" : "বাহ্যিক সংরক্ষণাগার", - "Authentication error" : "অনুমোদন ঘটিত সমস্যা", - "Your full name has been changed." : "আপনার পূর্ণ নাম পরিবর্তন করা হয়েছে।", "Couldn't remove app." : "অ্যাপ অপসারণ করা গেলনা", "Language changed" : "ভাষা পরিবর্তন করা হয়েছে", "Invalid request" : "অনুরোধটি সঠিক নয়", + "Authentication error" : "অনুমোদন ঘটিত সমস্যা", "Admins can't remove themself from the admin group" : "প্রশাসকবৃন্দ তাদেরকে প্রশাসক গোষ্ঠী থেকে মুছে ফেলতে পারবেন না", "Unable to add user to group %s" : " %s গোষ্ঠীতে ব্যবহারকারী যোগ করা সম্ভব হলো না ", "Unable to remove user from group %s" : "%s গোষ্ঠী থেকে ব্যবহারকারীকে অপসারণ করা সম্ভব হলো না", @@ -19,6 +18,7 @@ OC.L10N.register( "test email settings" : "ইমেইল নিয়ামকসমূহ পরীক্ষা করুন", "Email sent" : "ই-মেইল পাঠানো হয়েছে", "Email saved" : "ই-মেইল সংরক্ষন করা হয়েছে", + "Your full name has been changed." : "আপনার পূর্ণ নাম পরিবর্তন করা হয়েছে।", "All" : "সবাই", "Error while disabling app" : "অ্যাপ অকার্যকর করতে সমস্যা দেখা দিয়েছে ", "Disable" : "নিষ্ক্রিয়", diff --git a/settings/l10n/bn_BD.json b/settings/l10n/bn_BD.json index daa17c9fa93..bb06c3f2fac 100644 --- a/settings/l10n/bn_BD.json +++ b/settings/l10n/bn_BD.json @@ -1,11 +1,10 @@ { "translations": { "Sharing" : "ভাগাভাগিরত", "External Storage" : "বাহ্যিক সংরক্ষণাগার", - "Authentication error" : "অনুমোদন ঘটিত সমস্যা", - "Your full name has been changed." : "আপনার পূর্ণ নাম পরিবর্তন করা হয়েছে।", "Couldn't remove app." : "অ্যাপ অপসারণ করা গেলনা", "Language changed" : "ভাষা পরিবর্তন করা হয়েছে", "Invalid request" : "অনুরোধটি সঠিক নয়", + "Authentication error" : "অনুমোদন ঘটিত সমস্যা", "Admins can't remove themself from the admin group" : "প্রশাসকবৃন্দ তাদেরকে প্রশাসক গোষ্ঠী থেকে মুছে ফেলতে পারবেন না", "Unable to add user to group %s" : " %s গোষ্ঠীতে ব্যবহারকারী যোগ করা সম্ভব হলো না ", "Unable to remove user from group %s" : "%s গোষ্ঠী থেকে ব্যবহারকারীকে অপসারণ করা সম্ভব হলো না", @@ -17,6 +16,7 @@ "test email settings" : "ইমেইল নিয়ামকসমূহ পরীক্ষা করুন", "Email sent" : "ই-মেইল পাঠানো হয়েছে", "Email saved" : "ই-মেইল সংরক্ষন করা হয়েছে", + "Your full name has been changed." : "আপনার পূর্ণ নাম পরিবর্তন করা হয়েছে।", "All" : "সবাই", "Error while disabling app" : "অ্যাপ অকার্যকর করতে সমস্যা দেখা দিয়েছে ", "Disable" : "নিষ্ক্রিয়", diff --git a/settings/l10n/bs.js b/settings/l10n/bs.js index feafcfe9661..7dad6db6875 100644 --- a/settings/l10n/bs.js +++ b/settings/l10n/bs.js @@ -5,12 +5,10 @@ OC.L10N.register( "Cron" : "Cron", "Log" : "Zapisnik", "Updates" : "Ažuriranja", - "Authentication error" : "Grešna autentifikacije", - "Your full name has been changed." : "Vaše puno ime je promijenjeno.", - "Unable to change full name" : "Puno ime nije moguće promijeniti", "Couldn't remove app." : "Nije moguće ukloniti aplikaciju.", "Language changed" : "Jezik je promijenjen", "Invalid request" : "Neispravan zahtjev", + "Authentication error" : "Grešna autentifikacije", "Admins can't remove themself from the admin group" : "Administratori ne mogu sami sebe ukloniti iz admin grupe", "Unable to add user to group %s" : "Dodavanje korisnika grupi %s nije moguće", "Unable to remove user from group %s" : "Uklanjanje korisnika iz grupe %s nije moguće", @@ -37,6 +35,8 @@ OC.L10N.register( "Invalid user" : "Nevažeči korisnik", "Unable to change mail address" : "Nemoguće je izmjeniti adresu e-pošte", "Email saved" : "E-pošta je spremljena", + "Your full name has been changed." : "Vaše puno ime je promijenjeno.", + "Unable to change full name" : "Puno ime nije moguće promijeniti", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Jeste li zaista sigurni da želite dodati \"{domain}\" kao pouzdanu domenu?", "Add trusted domain" : "Dodaj pouzdanu domenu", "Sending..." : "Slanje...", diff --git a/settings/l10n/bs.json b/settings/l10n/bs.json index ece2026bc23..5cae7661981 100644 --- a/settings/l10n/bs.json +++ b/settings/l10n/bs.json @@ -3,12 +3,10 @@ "Cron" : "Cron", "Log" : "Zapisnik", "Updates" : "Ažuriranja", - "Authentication error" : "Grešna autentifikacije", - "Your full name has been changed." : "Vaše puno ime je promijenjeno.", - "Unable to change full name" : "Puno ime nije moguće promijeniti", "Couldn't remove app." : "Nije moguće ukloniti aplikaciju.", "Language changed" : "Jezik je promijenjen", "Invalid request" : "Neispravan zahtjev", + "Authentication error" : "Grešna autentifikacije", "Admins can't remove themself from the admin group" : "Administratori ne mogu sami sebe ukloniti iz admin grupe", "Unable to add user to group %s" : "Dodavanje korisnika grupi %s nije moguće", "Unable to remove user from group %s" : "Uklanjanje korisnika iz grupe %s nije moguće", @@ -35,6 +33,8 @@ "Invalid user" : "Nevažeči korisnik", "Unable to change mail address" : "Nemoguće je izmjeniti adresu e-pošte", "Email saved" : "E-pošta je spremljena", + "Your full name has been changed." : "Vaše puno ime je promijenjeno.", + "Unable to change full name" : "Puno ime nije moguće promijeniti", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Jeste li zaista sigurni da želite dodati \"{domain}\" kao pouzdanu domenu?", "Add trusted domain" : "Dodaj pouzdanu domenu", "Sending..." : "Slanje...", diff --git a/settings/l10n/ca.js b/settings/l10n/ca.js index 1725d278b4f..b3ea1aa7cf2 100644 --- a/settings/l10n/ca.js +++ b/settings/l10n/ca.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Registre", "Tips & tricks" : "Consells i trucs", "Updates" : "Actualitzacions", - "Authentication error" : "Error d'autenticació", - "Your full name has been changed." : "El vostre nom complet ha canviat.", - "Unable to change full name" : "No s'ha pogut canviar el nom complet", "Couldn't remove app." : "No s'ha pogut eliminar l'aplicació", "Language changed" : "S'ha canviat l'idioma", "Invalid request" : "Sol·licitud no vàlida", + "Authentication error" : "Error d'autenticació", "Admins can't remove themself from the admin group" : "Els administradors no es poden eliminar del grup admin", "Unable to add user to group %s" : "No es pot afegir l'usuari al grup %s", "Unable to remove user from group %s" : "No es pot eliminar l'usuari del grup %s", @@ -50,6 +48,8 @@ OC.L10N.register( "Invalid user" : "Usuari no vàlid", "Unable to change mail address" : "No es pot canviar l'adreça de correu electrònic", "Email saved" : "S'ha desat el correu electrònic", + "Your full name has been changed." : "El vostre nom complet ha canviat.", + "Unable to change full name" : "No s'ha pogut canviar el nom complet", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Esteu seguir que voleu afegir \"{domain}\" com a un domini de confiança?", "Add trusted domain" : "Afegir domini de confiança", "Migration in progress. Please wait until the migration is finished" : "Migració en progrés. Si us plau, espereu fins que finalitzi la migració", diff --git a/settings/l10n/ca.json b/settings/l10n/ca.json index 39f569a4a11..3cb8c962c30 100644 --- a/settings/l10n/ca.json +++ b/settings/l10n/ca.json @@ -10,12 +10,10 @@ "Log" : "Registre", "Tips & tricks" : "Consells i trucs", "Updates" : "Actualitzacions", - "Authentication error" : "Error d'autenticació", - "Your full name has been changed." : "El vostre nom complet ha canviat.", - "Unable to change full name" : "No s'ha pogut canviar el nom complet", "Couldn't remove app." : "No s'ha pogut eliminar l'aplicació", "Language changed" : "S'ha canviat l'idioma", "Invalid request" : "Sol·licitud no vàlida", + "Authentication error" : "Error d'autenticació", "Admins can't remove themself from the admin group" : "Els administradors no es poden eliminar del grup admin", "Unable to add user to group %s" : "No es pot afegir l'usuari al grup %s", "Unable to remove user from group %s" : "No es pot eliminar l'usuari del grup %s", @@ -48,6 +46,8 @@ "Invalid user" : "Usuari no vàlid", "Unable to change mail address" : "No es pot canviar l'adreça de correu electrònic", "Email saved" : "S'ha desat el correu electrònic", + "Your full name has been changed." : "El vostre nom complet ha canviat.", + "Unable to change full name" : "No s'ha pogut canviar el nom complet", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Esteu seguir que voleu afegir \"{domain}\" com a un domini de confiança?", "Add trusted domain" : "Afegir domini de confiança", "Migration in progress. Please wait until the migration is finished" : "Migració en progrés. Si us plau, espereu fins que finalitzi la migració", diff --git a/settings/l10n/cs_CZ.js b/settings/l10n/cs_CZ.js index 3e5d3867c65..84939c5ca5d 100644 --- a/settings/l10n/cs_CZ.js +++ b/settings/l10n/cs_CZ.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Záznam", "Tips & tricks" : "Tipy a triky", "Updates" : "Aktualizace", - "Authentication error" : "Chyba přihlášení", - "Your full name has been changed." : "Vaše celé jméno bylo změněno.", - "Unable to change full name" : "Nelze změnit celé jméno", "Couldn't remove app." : "Nepodařilo se odebrat aplikaci.", "Language changed" : "Jazyk byl změněn", "Invalid request" : "Neplatný požadavek", + "Authentication error" : "Chyba přihlášení", "Admins can't remove themself from the admin group" : "Správci se nemohou odebrat sami ze skupiny správců", "Unable to add user to group %s" : "Nelze přidat uživatele do skupiny %s", "Unable to remove user from group %s" : "Nelze odebrat uživatele ze skupiny %s", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "Neplatný uživatel", "Unable to change mail address" : "Nelze změnit emailovou adresu", "Email saved" : "Email uložen", + "Your full name has been changed." : "Vaše celé jméno bylo změněno.", + "Unable to change full name" : "Nelze změnit celé jméno", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Jste si jisti, že chcete přidat \"{domain}\" mezi důvěryhodné domény?", "Add trusted domain" : "Přidat důvěryhodnou doménu", "Migration in progress. Please wait until the migration is finished" : "Migrace probíhá. Počkejte prosím než bude dokončena", @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Velmi doporučujeme nainstalovat požadované balíčky do systému, pro podporu jednoho z následujících národních prostředí: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Instalace mimo kořenový adresář domény a používání systémového příkazu cron může způsobit problém s generováním správné URL. Pro zabránění těmto chybám nastavte prosím správnou cestu ve svém config.php souboru v hodnotě \"overwrite.cli.url\" (Je doporučena tato: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Nebylo možné spustit službu cron v CLI. Došlo k následujícím technickým chybám:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Transakční uzamykání souborů používá databázi jako uzamykací mechanismus, pro co nejlepší výkon nakonfigurujte uzamykání pomocí memcache. Více informací najdete v <a target=\"_blank\" href=\"%s\">dokumentaci ↗</a>.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Ověřte znovu prosím informace z <a target=\"_blank\" href=\"%s\">instalační příručky ↗</a> a zkontrolujte <a href=\"#log-section\">log</a> na výskyt chyb a varování.", "All checks passed." : "Všechny testy byly úspěšné.", "Open documentation" : "Otevřít dokumentaci", diff --git a/settings/l10n/cs_CZ.json b/settings/l10n/cs_CZ.json index 42771f82ba2..c5c95cfc119 100644 --- a/settings/l10n/cs_CZ.json +++ b/settings/l10n/cs_CZ.json @@ -10,12 +10,10 @@ "Log" : "Záznam", "Tips & tricks" : "Tipy a triky", "Updates" : "Aktualizace", - "Authentication error" : "Chyba přihlášení", - "Your full name has been changed." : "Vaše celé jméno bylo změněno.", - "Unable to change full name" : "Nelze změnit celé jméno", "Couldn't remove app." : "Nepodařilo se odebrat aplikaci.", "Language changed" : "Jazyk byl změněn", "Invalid request" : "Neplatný požadavek", + "Authentication error" : "Chyba přihlášení", "Admins can't remove themself from the admin group" : "Správci se nemohou odebrat sami ze skupiny správců", "Unable to add user to group %s" : "Nelze přidat uživatele do skupiny %s", "Unable to remove user from group %s" : "Nelze odebrat uživatele ze skupiny %s", @@ -51,6 +49,8 @@ "Invalid user" : "Neplatný uživatel", "Unable to change mail address" : "Nelze změnit emailovou adresu", "Email saved" : "Email uložen", + "Your full name has been changed." : "Vaše celé jméno bylo změněno.", + "Unable to change full name" : "Nelze změnit celé jméno", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Jste si jisti, že chcete přidat \"{domain}\" mezi důvěryhodné domény?", "Add trusted domain" : "Přidat důvěryhodnou doménu", "Migration in progress. Please wait until the migration is finished" : "Migrace probíhá. Počkejte prosím než bude dokončena", @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Velmi doporučujeme nainstalovat požadované balíčky do systému, pro podporu jednoho z následujících národních prostředí: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Instalace mimo kořenový adresář domény a používání systémového příkazu cron může způsobit problém s generováním správné URL. Pro zabránění těmto chybám nastavte prosím správnou cestu ve svém config.php souboru v hodnotě \"overwrite.cli.url\" (Je doporučena tato: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Nebylo možné spustit službu cron v CLI. Došlo k následujícím technickým chybám:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Transakční uzamykání souborů používá databázi jako uzamykací mechanismus, pro co nejlepší výkon nakonfigurujte uzamykání pomocí memcache. Více informací najdete v <a target=\"_blank\" href=\"%s\">dokumentaci ↗</a>.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Ověřte znovu prosím informace z <a target=\"_blank\" href=\"%s\">instalační příručky ↗</a> a zkontrolujte <a href=\"#log-section\">log</a> na výskyt chyb a varování.", "All checks passed." : "Všechny testy byly úspěšné.", "Open documentation" : "Otevřít dokumentaci", diff --git a/settings/l10n/cy_GB.js b/settings/l10n/cy_GB.js index 590745e735d..74cb40cf890 100644 --- a/settings/l10n/cy_GB.js +++ b/settings/l10n/cy_GB.js @@ -1,8 +1,8 @@ OC.L10N.register( "settings", { - "Authentication error" : "Gwall dilysu", "Invalid request" : "Cais annilys", + "Authentication error" : "Gwall dilysu", "Email sent" : "Anfonwyd yr e-bost", "Delete" : "Dileu", "Groups" : "Grwpiau", diff --git a/settings/l10n/cy_GB.json b/settings/l10n/cy_GB.json index 41535c5c9cf..537395458bd 100644 --- a/settings/l10n/cy_GB.json +++ b/settings/l10n/cy_GB.json @@ -1,6 +1,6 @@ { "translations": { - "Authentication error" : "Gwall dilysu", "Invalid request" : "Cais annilys", + "Authentication error" : "Gwall dilysu", "Email sent" : "Anfonwyd yr e-bost", "Delete" : "Dileu", "Groups" : "Grwpiau", diff --git a/settings/l10n/da.js b/settings/l10n/da.js index b69c9d248de..4fef120f1bc 100644 --- a/settings/l10n/da.js +++ b/settings/l10n/da.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Log", "Tips & tricks" : "Tips & tricks", "Updates" : "Opdateringer", - "Authentication error" : "Adgangsfejl", - "Your full name has been changed." : "Dit fulde navn er blevet ændret.", - "Unable to change full name" : "Ikke i stand til at ændre dit fulde navn", "Couldn't remove app." : "Kunne ikke fjerne app'en.", "Language changed" : "Sprog ændret", "Invalid request" : "Ugyldig forespørgsel", + "Authentication error" : "Adgangsfejl", "Admins can't remove themself from the admin group" : "Administratorer kan ikke fjerne dem selv fra admin gruppen", "Unable to add user to group %s" : "Brugeren kan ikke tilføjes til gruppen %s", "Unable to remove user from group %s" : "Brugeren kan ikke fjernes fra gruppen %s", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "Ugyldig bruger", "Unable to change mail address" : "Kan ikke ændre mailadresse", "Email saved" : "E-mailadressen er gemt", + "Your full name has been changed." : "Dit fulde navn er blevet ændret.", + "Unable to change full name" : "Ikke i stand til at ændre dit fulde navn", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Sikker på at du vil tilføje \"{domain}\" som et domæne du har tiilid til?", "Add trusted domain" : "Tilføj et domæne som du har tillid til", "Migration in progress. Please wait until the migration is finished" : "Immigration er i gang. Vent venligst indtil overflytningen er afsluttet", @@ -132,7 +132,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Vi anbefaler kraftigt, at du installerer den krævede pakke på dit system, for at understøtte følgende lokaliteter: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Hvis din installation ikke er installeret i roden af domænet, og bruger systemets cron, så kan der være problemer med URL-oprettelsen. For at undgå disse problemer, så angiv tilvalget \"overwrite.cli.url\" i din fil config.php til webrodens sti for din installation (foreslået værdi: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Det var ikke muligt at udføre cronjobbet via kommandolinjefladen CLI. Følgende tekniske fejl fremkom:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Transaktions låsning af filer bliver brugt af databasen som lås til backend, for den bedste ydelse tilrådes det at konfigurere memcache. Se <a target=\"_blank\" href=\"%s\">documentation ↗</a> for mere information", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Dobbelttjek venligst <a target=\"_blank\" href=\"%s\">, og tjek om der er fejl eller advarsler i <a href=\"#log-section\">loggen</a>.", "All checks passed." : "Alle tjek blev bestået.", "Open documentation" : "Åben dokumentation", diff --git a/settings/l10n/da.json b/settings/l10n/da.json index 1519317def9..d535bdb38af 100644 --- a/settings/l10n/da.json +++ b/settings/l10n/da.json @@ -10,12 +10,10 @@ "Log" : "Log", "Tips & tricks" : "Tips & tricks", "Updates" : "Opdateringer", - "Authentication error" : "Adgangsfejl", - "Your full name has been changed." : "Dit fulde navn er blevet ændret.", - "Unable to change full name" : "Ikke i stand til at ændre dit fulde navn", "Couldn't remove app." : "Kunne ikke fjerne app'en.", "Language changed" : "Sprog ændret", "Invalid request" : "Ugyldig forespørgsel", + "Authentication error" : "Adgangsfejl", "Admins can't remove themself from the admin group" : "Administratorer kan ikke fjerne dem selv fra admin gruppen", "Unable to add user to group %s" : "Brugeren kan ikke tilføjes til gruppen %s", "Unable to remove user from group %s" : "Brugeren kan ikke fjernes fra gruppen %s", @@ -51,6 +49,8 @@ "Invalid user" : "Ugyldig bruger", "Unable to change mail address" : "Kan ikke ændre mailadresse", "Email saved" : "E-mailadressen er gemt", + "Your full name has been changed." : "Dit fulde navn er blevet ændret.", + "Unable to change full name" : "Ikke i stand til at ændre dit fulde navn", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Sikker på at du vil tilføje \"{domain}\" som et domæne du har tiilid til?", "Add trusted domain" : "Tilføj et domæne som du har tillid til", "Migration in progress. Please wait until the migration is finished" : "Immigration er i gang. Vent venligst indtil overflytningen er afsluttet", @@ -130,7 +130,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Vi anbefaler kraftigt, at du installerer den krævede pakke på dit system, for at understøtte følgende lokaliteter: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Hvis din installation ikke er installeret i roden af domænet, og bruger systemets cron, så kan der være problemer med URL-oprettelsen. For at undgå disse problemer, så angiv tilvalget \"overwrite.cli.url\" i din fil config.php til webrodens sti for din installation (foreslået værdi: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Det var ikke muligt at udføre cronjobbet via kommandolinjefladen CLI. Følgende tekniske fejl fremkom:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Transaktions låsning af filer bliver brugt af databasen som lås til backend, for den bedste ydelse tilrådes det at konfigurere memcache. Se <a target=\"_blank\" href=\"%s\">documentation ↗</a> for mere information", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Dobbelttjek venligst <a target=\"_blank\" href=\"%s\">, og tjek om der er fejl eller advarsler i <a href=\"#log-section\">loggen</a>.", "All checks passed." : "Alle tjek blev bestået.", "Open documentation" : "Åben dokumentation", diff --git a/settings/l10n/el.js b/settings/l10n/el.js index acb9dca3dfd..1c7212d2ecd 100644 --- a/settings/l10n/el.js +++ b/settings/l10n/el.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Καταγραφές", "Tips & tricks" : "Συμβουλές & τεχνάσματα", "Updates" : "Ενημερώσεις", - "Authentication error" : "Σφάλμα πιστοποίησης", - "Your full name has been changed." : "Το πλήρες όνομά σας άλλαξε.", - "Unable to change full name" : "Δεν ήταν δυνατή η αλλαγή του πλήρους ονόματός σας", "Couldn't remove app." : "Αδυναμία αφαίρεσης εφαρμογής.", "Language changed" : "Η γλώσσα άλλαξε", "Invalid request" : "Μη έγκυρο αίτημα", + "Authentication error" : "Σφάλμα πιστοποίησης", "Admins can't remove themself from the admin group" : "Οι διαχειριστές δεν μπορούν να αφαιρέσουν τους εαυτούς τους από την ομάδα των διαχειριστών", "Unable to add user to group %s" : "Αδυναμία προσθήκη χρήστη στην ομάδα %s", "Unable to remove user from group %s" : "Αδυναμία αφαίρεσης χρήστη από την ομάδα %s", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "Μη έγκυρος χρήστης", "Unable to change mail address" : "Αδυναμία αλλαγής διεύθυνσης αλληλογραφίας", "Email saved" : "Το email αποθηκεύτηκε ", + "Your full name has been changed." : "Το πλήρες όνομά σας άλλαξε.", + "Unable to change full name" : "Δεν ήταν δυνατή η αλλαγή του πλήρους ονόματός σας", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Είστε πραγματικά σίγουροι ότι θέλετε να προσθέσετε το \"{domain}\" σαν αξιόπιστη περιοχή;", "Add trusted domain" : "Προσθέστε αξιόπιστη περιοχή", "Migration in progress. Please wait until the migration is finished" : "Μετάβαση σε εξέλιξη. Παρακαλούμε περιμένετε μέχρι να ολοκληρωθεί η μετάβαση", @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Προτείνουμε ανεπιφύλακτα να εγκαταστήσετε στο σύστημά σας τα απαιτούμενα πακέτα έτσι ώστε να υποστηρίζεται μια από τις ακόλουθες ρυθμίσεις τοποθεσίας: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Αν η εγκατάστασή σας δεν έχει γίνει στο root του τομέα και χρησιμοποιείται το cron του συστήματος, μπορεί να υπάρξουν ζητήματα με τη δημιουργία URL. Για να αποφύγετε αυτά τα προβλήματα, παρακαλώ ρυθμίστε την επιλογή \"overwrite.cli.url\" στο αρχείο config.php που βρίσκεται στη διαδρομή webroot της εγκατάστασής σας (Suggested: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Δεν ήταν δυνατή η εκτέλεση της cronjob μέσω τερματικού. Εμφανίστηκαν τα παρακάτω τεχνικά σφάλματα:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Το Transactional file locking χρησιμοποιεί τη βάση δεδομένων ως locking backend, για καλύτερες επιδόσεις συστήνουμς τη διαμόρφωση μιας memcache για το κλείδωμα. Δείτε την <a target=\"_blank\" href=\"%s\">τεκμηρίωση ↗</a> για περισσότερες πληροφορίες.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Παρακαλώ ελέγξτε ξανά <a target=\"_blank\" href=\"%s\">τους οδηγούς εγκατάστασης, καθώς επίσης και για τυχόν σφάλματα ή προειδοποιήσεις στο <a href=\"#log-section\">log</a>.", "All checks passed." : "Όλοι οι έλεγχοι επιτυχείς.", "Open documentation" : "Ανοιχτή τεκμηρίωση.", diff --git a/settings/l10n/el.json b/settings/l10n/el.json index 42d6dd01ceb..e4d0876661a 100644 --- a/settings/l10n/el.json +++ b/settings/l10n/el.json @@ -10,12 +10,10 @@ "Log" : "Καταγραφές", "Tips & tricks" : "Συμβουλές & τεχνάσματα", "Updates" : "Ενημερώσεις", - "Authentication error" : "Σφάλμα πιστοποίησης", - "Your full name has been changed." : "Το πλήρες όνομά σας άλλαξε.", - "Unable to change full name" : "Δεν ήταν δυνατή η αλλαγή του πλήρους ονόματός σας", "Couldn't remove app." : "Αδυναμία αφαίρεσης εφαρμογής.", "Language changed" : "Η γλώσσα άλλαξε", "Invalid request" : "Μη έγκυρο αίτημα", + "Authentication error" : "Σφάλμα πιστοποίησης", "Admins can't remove themself from the admin group" : "Οι διαχειριστές δεν μπορούν να αφαιρέσουν τους εαυτούς τους από την ομάδα των διαχειριστών", "Unable to add user to group %s" : "Αδυναμία προσθήκη χρήστη στην ομάδα %s", "Unable to remove user from group %s" : "Αδυναμία αφαίρεσης χρήστη από την ομάδα %s", @@ -51,6 +49,8 @@ "Invalid user" : "Μη έγκυρος χρήστης", "Unable to change mail address" : "Αδυναμία αλλαγής διεύθυνσης αλληλογραφίας", "Email saved" : "Το email αποθηκεύτηκε ", + "Your full name has been changed." : "Το πλήρες όνομά σας άλλαξε.", + "Unable to change full name" : "Δεν ήταν δυνατή η αλλαγή του πλήρους ονόματός σας", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Είστε πραγματικά σίγουροι ότι θέλετε να προσθέσετε το \"{domain}\" σαν αξιόπιστη περιοχή;", "Add trusted domain" : "Προσθέστε αξιόπιστη περιοχή", "Migration in progress. Please wait until the migration is finished" : "Μετάβαση σε εξέλιξη. Παρακαλούμε περιμένετε μέχρι να ολοκληρωθεί η μετάβαση", @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Προτείνουμε ανεπιφύλακτα να εγκαταστήσετε στο σύστημά σας τα απαιτούμενα πακέτα έτσι ώστε να υποστηρίζεται μια από τις ακόλουθες ρυθμίσεις τοποθεσίας: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Αν η εγκατάστασή σας δεν έχει γίνει στο root του τομέα και χρησιμοποιείται το cron του συστήματος, μπορεί να υπάρξουν ζητήματα με τη δημιουργία URL. Για να αποφύγετε αυτά τα προβλήματα, παρακαλώ ρυθμίστε την επιλογή \"overwrite.cli.url\" στο αρχείο config.php που βρίσκεται στη διαδρομή webroot της εγκατάστασής σας (Suggested: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Δεν ήταν δυνατή η εκτέλεση της cronjob μέσω τερματικού. Εμφανίστηκαν τα παρακάτω τεχνικά σφάλματα:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Το Transactional file locking χρησιμοποιεί τη βάση δεδομένων ως locking backend, για καλύτερες επιδόσεις συστήνουμς τη διαμόρφωση μιας memcache για το κλείδωμα. Δείτε την <a target=\"_blank\" href=\"%s\">τεκμηρίωση ↗</a> για περισσότερες πληροφορίες.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Παρακαλώ ελέγξτε ξανά <a target=\"_blank\" href=\"%s\">τους οδηγούς εγκατάστασης, καθώς επίσης και για τυχόν σφάλματα ή προειδοποιήσεις στο <a href=\"#log-section\">log</a>.", "All checks passed." : "Όλοι οι έλεγχοι επιτυχείς.", "Open documentation" : "Ανοιχτή τεκμηρίωση.", diff --git a/settings/l10n/en_GB.js b/settings/l10n/en_GB.js index 5a4a1a3c998..d79cc98dc07 100644 --- a/settings/l10n/en_GB.js +++ b/settings/l10n/en_GB.js @@ -10,12 +10,10 @@ OC.L10N.register( "Log" : "Log", "Tips & tricks" : "Tips & tricks", "Updates" : "Updates", - "Authentication error" : "Authentication error", - "Your full name has been changed." : "Your full name has been changed.", - "Unable to change full name" : "Unable to change full name", "Couldn't remove app." : "Couldn't remove app.", "Language changed" : "Language changed", "Invalid request" : "Invalid request", + "Authentication error" : "Authentication error", "Admins can't remove themself from the admin group" : "Admins can't remove themselves from the admin group", "Unable to add user to group %s" : "Unable to add user to group %s", "Unable to remove user from group %s" : "Unable to remove user from group %s", @@ -49,6 +47,8 @@ OC.L10N.register( "Invalid user" : "Invalid user", "Unable to change mail address" : "Unable to change mail address", "Email saved" : "Email saved", + "Your full name has been changed." : "Your full name has been changed.", + "Unable to change full name" : "Unable to change full name", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Are you really sure you want add \"{domain}\" as a trusted domain?", "Add trusted domain" : "Add trusted domain", "Migration in progress. Please wait until the migration is finished" : "Migration in progress. Please wait until the migration is finished", diff --git a/settings/l10n/en_GB.json b/settings/l10n/en_GB.json index 4f1e2efc456..dcfbf01467f 100644 --- a/settings/l10n/en_GB.json +++ b/settings/l10n/en_GB.json @@ -8,12 +8,10 @@ "Log" : "Log", "Tips & tricks" : "Tips & tricks", "Updates" : "Updates", - "Authentication error" : "Authentication error", - "Your full name has been changed." : "Your full name has been changed.", - "Unable to change full name" : "Unable to change full name", "Couldn't remove app." : "Couldn't remove app.", "Language changed" : "Language changed", "Invalid request" : "Invalid request", + "Authentication error" : "Authentication error", "Admins can't remove themself from the admin group" : "Admins can't remove themselves from the admin group", "Unable to add user to group %s" : "Unable to add user to group %s", "Unable to remove user from group %s" : "Unable to remove user from group %s", @@ -47,6 +45,8 @@ "Invalid user" : "Invalid user", "Unable to change mail address" : "Unable to change mail address", "Email saved" : "Email saved", + "Your full name has been changed." : "Your full name has been changed.", + "Unable to change full name" : "Unable to change full name", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Are you really sure you want add \"{domain}\" as a trusted domain?", "Add trusted domain" : "Add trusted domain", "Migration in progress. Please wait until the migration is finished" : "Migration in progress. Please wait until the migration is finished", diff --git a/settings/l10n/eo.js b/settings/l10n/eo.js index ca4b5485d50..1f937b22aa3 100644 --- a/settings/l10n/eo.js +++ b/settings/l10n/eo.js @@ -6,11 +6,9 @@ OC.L10N.register( "Cron" : "Cron", "Log" : "Protokolo", "Updates" : "Ĝisdatigoj", - "Authentication error" : "Aŭtentiga eraro", - "Your full name has been changed." : "Via plena nomo ŝanĝitas.", - "Unable to change full name" : "Ne eblis ŝanĝi la plenan nomon", "Language changed" : "La lingvo estas ŝanĝita", "Invalid request" : "Nevalida peto", + "Authentication error" : "Aŭtentiga eraro", "Admins can't remove themself from the admin group" : "Administrantoj ne povas forigi sin mem el la administra grupo.", "Unable to add user to group %s" : "Ne eblis aldoni la uzanton al la grupo %s", "Unable to remove user from group %s" : "Ne eblis forigi la uzantan el la grupo %s", @@ -21,6 +19,8 @@ OC.L10N.register( "Saved" : "Konservita", "Email sent" : "La retpoŝtaĵo sendiĝis", "Email saved" : "La retpoŝtadreso konserviĝis", + "Your full name has been changed." : "Via plena nomo ŝanĝitas.", + "Unable to change full name" : "Ne eblis ŝanĝi la plenan nomon", "Sending..." : "Sendante...", "All" : "Ĉio", "Please wait...." : "Bonvolu atendi...", diff --git a/settings/l10n/eo.json b/settings/l10n/eo.json index 3df0eda6e8e..dad80fad168 100644 --- a/settings/l10n/eo.json +++ b/settings/l10n/eo.json @@ -4,11 +4,9 @@ "Cron" : "Cron", "Log" : "Protokolo", "Updates" : "Ĝisdatigoj", - "Authentication error" : "Aŭtentiga eraro", - "Your full name has been changed." : "Via plena nomo ŝanĝitas.", - "Unable to change full name" : "Ne eblis ŝanĝi la plenan nomon", "Language changed" : "La lingvo estas ŝanĝita", "Invalid request" : "Nevalida peto", + "Authentication error" : "Aŭtentiga eraro", "Admins can't remove themself from the admin group" : "Administrantoj ne povas forigi sin mem el la administra grupo.", "Unable to add user to group %s" : "Ne eblis aldoni la uzanton al la grupo %s", "Unable to remove user from group %s" : "Ne eblis forigi la uzantan el la grupo %s", @@ -19,6 +17,8 @@ "Saved" : "Konservita", "Email sent" : "La retpoŝtaĵo sendiĝis", "Email saved" : "La retpoŝtadreso konserviĝis", + "Your full name has been changed." : "Via plena nomo ŝanĝitas.", + "Unable to change full name" : "Ne eblis ŝanĝi la plenan nomon", "Sending..." : "Sendante...", "All" : "Ĉio", "Please wait...." : "Bonvolu atendi...", diff --git a/settings/l10n/es.js b/settings/l10n/es.js index 36d9d9392e1..27a87685f2e 100644 --- a/settings/l10n/es.js +++ b/settings/l10n/es.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Registro", "Tips & tricks" : "Sugerencias y trucos", "Updates" : "Actualizaciones", - "Authentication error" : "Error de autenticación", - "Your full name has been changed." : "Se ha cambiado su nombre completo.", - "Unable to change full name" : "No se puede cambiar el nombre completo", "Couldn't remove app." : "No se pudo eliminar la aplicación.", "Language changed" : "Idioma cambiado", "Invalid request" : "Petición no válida", + "Authentication error" : "Error de autenticación", "Admins can't remove themself from the admin group" : "Los administradores no se pueden eliminar a ellos mismos del grupo de administrador", "Unable to add user to group %s" : "No se pudo añadir el usuario al grupo %s", "Unable to remove user from group %s" : "No se pudo eliminar al usuario del grupo %s", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "Usuario no válido", "Unable to change mail address" : "No se pudo cambiar la dirección de correo electrónico", "Email saved" : "Correo electrónico guardado", + "Your full name has been changed." : "Se ha cambiado su nombre completo.", + "Unable to change full name" : "No se puede cambiar el nombre completo", "Are you really sure you want add \"{domain}\" as trusted domain?" : "¿Está seguro de querer agregar \"{domain}\" como un dominio de confianza?", "Add trusted domain" : "Agregar dominio de confianza", "Migration in progress. Please wait until the migration is finished" : "Migración en curso. Por favor, espere hasta que la migración esté finalizada.", @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Es muy recomendable instalar los paquetes necesarios para poder soportar una de las siguientes configuraciones regionales: %s. ", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Si su instalación no está ubicada en la raíz del dominio y usa el cron del sistema, puede haber problemas al generarse los URL. Para evitarlos, configure la opción \"overwrite.cli.url\" en su archivo config.php para que use la ruta de la raíz del sitio web de su instalación (sugerencia: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "No fue posible ejecutar cronjob vía CLI. Han aparecido los siguientes errores técnicos:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "El fichero de bloqueo de transaciones esta usando la base de datos como mecanismo de bloqueo, para mejorar el rendimiento es recomendable usar cacheo de memoria para los bloqueos. Visita la <a target=\"_blank\" href=\"%s\">documentación ↗</a> para mas información.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Por favor revise las <a target=\"_blank\" href=\"%s\">guías de instalación ↗</a>, y compruebe los errores o avisos en el <a ref=\"#log-section\">registro</a>.", "All checks passed." : "Ha pasado todos los controles", "Open documentation" : "Documentación abierta", diff --git a/settings/l10n/es.json b/settings/l10n/es.json index 87cf83a55f0..1213c099622 100644 --- a/settings/l10n/es.json +++ b/settings/l10n/es.json @@ -10,12 +10,10 @@ "Log" : "Registro", "Tips & tricks" : "Sugerencias y trucos", "Updates" : "Actualizaciones", - "Authentication error" : "Error de autenticación", - "Your full name has been changed." : "Se ha cambiado su nombre completo.", - "Unable to change full name" : "No se puede cambiar el nombre completo", "Couldn't remove app." : "No se pudo eliminar la aplicación.", "Language changed" : "Idioma cambiado", "Invalid request" : "Petición no válida", + "Authentication error" : "Error de autenticación", "Admins can't remove themself from the admin group" : "Los administradores no se pueden eliminar a ellos mismos del grupo de administrador", "Unable to add user to group %s" : "No se pudo añadir el usuario al grupo %s", "Unable to remove user from group %s" : "No se pudo eliminar al usuario del grupo %s", @@ -51,6 +49,8 @@ "Invalid user" : "Usuario no válido", "Unable to change mail address" : "No se pudo cambiar la dirección de correo electrónico", "Email saved" : "Correo electrónico guardado", + "Your full name has been changed." : "Se ha cambiado su nombre completo.", + "Unable to change full name" : "No se puede cambiar el nombre completo", "Are you really sure you want add \"{domain}\" as trusted domain?" : "¿Está seguro de querer agregar \"{domain}\" como un dominio de confianza?", "Add trusted domain" : "Agregar dominio de confianza", "Migration in progress. Please wait until the migration is finished" : "Migración en curso. Por favor, espere hasta que la migración esté finalizada.", @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Es muy recomendable instalar los paquetes necesarios para poder soportar una de las siguientes configuraciones regionales: %s. ", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Si su instalación no está ubicada en la raíz del dominio y usa el cron del sistema, puede haber problemas al generarse los URL. Para evitarlos, configure la opción \"overwrite.cli.url\" en su archivo config.php para que use la ruta de la raíz del sitio web de su instalación (sugerencia: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "No fue posible ejecutar cronjob vía CLI. Han aparecido los siguientes errores técnicos:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "El fichero de bloqueo de transaciones esta usando la base de datos como mecanismo de bloqueo, para mejorar el rendimiento es recomendable usar cacheo de memoria para los bloqueos. Visita la <a target=\"_blank\" href=\"%s\">documentación ↗</a> para mas información.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Por favor revise las <a target=\"_blank\" href=\"%s\">guías de instalación ↗</a>, y compruebe los errores o avisos en el <a ref=\"#log-section\">registro</a>.", "All checks passed." : "Ha pasado todos los controles", "Open documentation" : "Documentación abierta", diff --git a/settings/l10n/es_MX.js b/settings/l10n/es_MX.js index 0a83ff50f1a..1b3a2ffff59 100644 --- a/settings/l10n/es_MX.js +++ b/settings/l10n/es_MX.js @@ -5,11 +5,9 @@ OC.L10N.register( "External Storage" : "Almacenamiento externo", "Cron" : "Cron", "Log" : "Registro", - "Authentication error" : "Error de autenticación", - "Your full name has been changed." : "Se ha cambiado su nombre completo.", - "Unable to change full name" : "No se puede cambiar el nombre completo", "Language changed" : "Idioma cambiado", "Invalid request" : "Petición no válida", + "Authentication error" : "Error de autenticación", "Admins can't remove themself from the admin group" : "Los administradores no se pueden eliminar a ellos mismos del grupo de administrador", "Unable to add user to group %s" : "No se pudo añadir el usuario al grupo %s", "Unable to remove user from group %s" : "No se pudo eliminar al usuario del grupo %s", @@ -23,6 +21,8 @@ OC.L10N.register( "Saved" : "Guardado", "Email sent" : "Correo electrónico enviado", "Email saved" : "Correo electrónico guardado", + "Your full name has been changed." : "Se ha cambiado su nombre completo.", + "Unable to change full name" : "No se puede cambiar el nombre completo", "All" : "Todos", "Please wait...." : "Espere, por favor....", "Error while disabling app" : "Error mientras se desactivaba la aplicación", diff --git a/settings/l10n/es_MX.json b/settings/l10n/es_MX.json index a83dfef8048..d7a6527f4f7 100644 --- a/settings/l10n/es_MX.json +++ b/settings/l10n/es_MX.json @@ -3,11 +3,9 @@ "External Storage" : "Almacenamiento externo", "Cron" : "Cron", "Log" : "Registro", - "Authentication error" : "Error de autenticación", - "Your full name has been changed." : "Se ha cambiado su nombre completo.", - "Unable to change full name" : "No se puede cambiar el nombre completo", "Language changed" : "Idioma cambiado", "Invalid request" : "Petición no válida", + "Authentication error" : "Error de autenticación", "Admins can't remove themself from the admin group" : "Los administradores no se pueden eliminar a ellos mismos del grupo de administrador", "Unable to add user to group %s" : "No se pudo añadir el usuario al grupo %s", "Unable to remove user from group %s" : "No se pudo eliminar al usuario del grupo %s", @@ -21,6 +19,8 @@ "Saved" : "Guardado", "Email sent" : "Correo electrónico enviado", "Email saved" : "Correo electrónico guardado", + "Your full name has been changed." : "Se ha cambiado su nombre completo.", + "Unable to change full name" : "No se puede cambiar el nombre completo", "All" : "Todos", "Please wait...." : "Espere, por favor....", "Error while disabling app" : "Error mientras se desactivaba la aplicación", diff --git a/settings/l10n/et_EE.js b/settings/l10n/et_EE.js index e783531d6cf..a9e616b0d82 100644 --- a/settings/l10n/et_EE.js +++ b/settings/l10n/et_EE.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Logi", "Tips & tricks" : "Nõuanded ja trikid", "Updates" : "Uuendused", - "Authentication error" : "Autentimise viga", - "Your full name has been changed." : "Sinu täispikk nimi on muudetud.", - "Unable to change full name" : "Täispika nime muutmine ebaõnnestus", "Couldn't remove app." : "Ei suutnud rakendit eemaldada.", "Language changed" : "Keel on muudetud", "Invalid request" : "Vigane päring", + "Authentication error" : "Autentimise viga", "Admins can't remove themself from the admin group" : "Administraatorid ei saa ise end admin grupist eemaldada", "Unable to add user to group %s" : "Kasutajat ei saa lisada gruppi %s", "Unable to remove user from group %s" : "Kasutajat ei saa eemaldada grupist %s", @@ -46,6 +44,8 @@ OC.L10N.register( "Invalid user" : "Vigane kasutaja", "Unable to change mail address" : "E-posti aadressi muutmine ebaõnnestus", "Email saved" : "Kiri on salvestatud", + "Your full name has been changed." : "Sinu täispikk nimi on muudetud.", + "Unable to change full name" : "Täispika nime muutmine ebaõnnestus", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Oled sa kindel, et soovid lisada domeeni \"{domain}\" usaldusväärseks domeeniks?", "Add trusted domain" : "Lis ausaldusväärne domeen", "Migration started …" : "Kolimist on alustatud ...", diff --git a/settings/l10n/et_EE.json b/settings/l10n/et_EE.json index 95416aad773..019fc765586 100644 --- a/settings/l10n/et_EE.json +++ b/settings/l10n/et_EE.json @@ -10,12 +10,10 @@ "Log" : "Logi", "Tips & tricks" : "Nõuanded ja trikid", "Updates" : "Uuendused", - "Authentication error" : "Autentimise viga", - "Your full name has been changed." : "Sinu täispikk nimi on muudetud.", - "Unable to change full name" : "Täispika nime muutmine ebaõnnestus", "Couldn't remove app." : "Ei suutnud rakendit eemaldada.", "Language changed" : "Keel on muudetud", "Invalid request" : "Vigane päring", + "Authentication error" : "Autentimise viga", "Admins can't remove themself from the admin group" : "Administraatorid ei saa ise end admin grupist eemaldada", "Unable to add user to group %s" : "Kasutajat ei saa lisada gruppi %s", "Unable to remove user from group %s" : "Kasutajat ei saa eemaldada grupist %s", @@ -44,6 +42,8 @@ "Invalid user" : "Vigane kasutaja", "Unable to change mail address" : "E-posti aadressi muutmine ebaõnnestus", "Email saved" : "Kiri on salvestatud", + "Your full name has been changed." : "Sinu täispikk nimi on muudetud.", + "Unable to change full name" : "Täispika nime muutmine ebaõnnestus", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Oled sa kindel, et soovid lisada domeeni \"{domain}\" usaldusväärseks domeeniks?", "Add trusted domain" : "Lis ausaldusväärne domeen", "Migration started …" : "Kolimist on alustatud ...", diff --git a/settings/l10n/eu.js b/settings/l10n/eu.js index 486cdc74817..f22c7d6e654 100644 --- a/settings/l10n/eu.js +++ b/settings/l10n/eu.js @@ -6,12 +6,10 @@ OC.L10N.register( "Cron" : "Cron", "Log" : "Log", "Updates" : "Eguneraketak", - "Authentication error" : "Autentifikazio errorea", - "Your full name has been changed." : "Zure izena aldatu egin da.", - "Unable to change full name" : "Ezin izan da izena aldatu", "Couldn't remove app." : "Ezin izan da aplikazioa ezabatu..", "Language changed" : "Hizkuntza aldatuta", "Invalid request" : "Baliogabeko eskaera", + "Authentication error" : "Autentifikazio errorea", "Admins can't remove themself from the admin group" : "Kudeatzaileak ezin du bere burua kendu kudeatzaile taldetik", "Unable to add user to group %s" : "Ezin izan da erabiltzailea %s taldera gehitu", "Unable to remove user from group %s" : "Ezin izan da erabiltzailea %s taldetik ezabatu", @@ -40,6 +38,8 @@ OC.L10N.register( "Invalid user" : "Baliogabeko erabiiltzailea", "Unable to change mail address" : "Ezin izan da posta helbidea aldatu", "Email saved" : "Eposta gorde da", + "Your full name has been changed." : "Zure izena aldatu egin da.", + "Unable to change full name" : "Ezin izan da izena aldatu", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ziur zaude gehitu nahi duzula \"{domain}\" domeinu fidagarri gisa?", "Add trusted domain" : "Gehitu domeinu fidagarria", "Sending..." : "Bidaltzen...", diff --git a/settings/l10n/eu.json b/settings/l10n/eu.json index 218241db953..f3387446a85 100644 --- a/settings/l10n/eu.json +++ b/settings/l10n/eu.json @@ -4,12 +4,10 @@ "Cron" : "Cron", "Log" : "Log", "Updates" : "Eguneraketak", - "Authentication error" : "Autentifikazio errorea", - "Your full name has been changed." : "Zure izena aldatu egin da.", - "Unable to change full name" : "Ezin izan da izena aldatu", "Couldn't remove app." : "Ezin izan da aplikazioa ezabatu..", "Language changed" : "Hizkuntza aldatuta", "Invalid request" : "Baliogabeko eskaera", + "Authentication error" : "Autentifikazio errorea", "Admins can't remove themself from the admin group" : "Kudeatzaileak ezin du bere burua kendu kudeatzaile taldetik", "Unable to add user to group %s" : "Ezin izan da erabiltzailea %s taldera gehitu", "Unable to remove user from group %s" : "Ezin izan da erabiltzailea %s taldetik ezabatu", @@ -38,6 +36,8 @@ "Invalid user" : "Baliogabeko erabiiltzailea", "Unable to change mail address" : "Ezin izan da posta helbidea aldatu", "Email saved" : "Eposta gorde da", + "Your full name has been changed." : "Zure izena aldatu egin da.", + "Unable to change full name" : "Ezin izan da izena aldatu", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ziur zaude gehitu nahi duzula \"{domain}\" domeinu fidagarri gisa?", "Add trusted domain" : "Gehitu domeinu fidagarria", "Sending..." : "Bidaltzen...", diff --git a/settings/l10n/fa.js b/settings/l10n/fa.js index 299505e1560..4ab82f8551c 100644 --- a/settings/l10n/fa.js +++ b/settings/l10n/fa.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "کارنامه", "Tips & tricks" : "نکات و راهنماییها", "Updates" : "به روز رسانی ها", - "Authentication error" : "خطا در اعتبار سنجی", - "Your full name has been changed." : "نام کامل شما تغییر یافت", - "Unable to change full name" : "امکان تغییر نام کامل وجود ندارد", "Couldn't remove app." : "امکان حذف برنامه وجود ندارد.", "Language changed" : "زبان تغییر کرد", "Invalid request" : "درخواست نامعتبر", + "Authentication error" : "خطا در اعتبار سنجی", "Admins can't remove themself from the admin group" : "مدیران نمی توانند خود را از گروه مدیریت حذف کنند", "Unable to add user to group %s" : "امکان افزودن کاربر به گروه %s نیست", "Unable to remove user from group %s" : "امکان حذف کاربر از گروه %s نیست", @@ -44,6 +42,8 @@ OC.L10N.register( "Invalid user" : "کاربر نامعتبر", "Unable to change mail address" : "تغییر آدرس ایمیل امکانپذیر نیست", "Email saved" : "ایمیل ذخیره شد", + "Your full name has been changed." : "نام کامل شما تغییر یافت", + "Unable to change full name" : "امکان تغییر نام کامل وجود ندارد", "Add trusted domain" : "افزودن دامنه مورد اعتماد", "Migration in progress. Please wait until the migration is finished" : "مهاجرت در حال اجراست. لطفا تا اتمام مهاجرت صبر کنید", "Migration started …" : "مهاجرت شروع شد...", diff --git a/settings/l10n/fa.json b/settings/l10n/fa.json index e07f0633e9f..208bff21057 100644 --- a/settings/l10n/fa.json +++ b/settings/l10n/fa.json @@ -10,12 +10,10 @@ "Log" : "کارنامه", "Tips & tricks" : "نکات و راهنماییها", "Updates" : "به روز رسانی ها", - "Authentication error" : "خطا در اعتبار سنجی", - "Your full name has been changed." : "نام کامل شما تغییر یافت", - "Unable to change full name" : "امکان تغییر نام کامل وجود ندارد", "Couldn't remove app." : "امکان حذف برنامه وجود ندارد.", "Language changed" : "زبان تغییر کرد", "Invalid request" : "درخواست نامعتبر", + "Authentication error" : "خطا در اعتبار سنجی", "Admins can't remove themself from the admin group" : "مدیران نمی توانند خود را از گروه مدیریت حذف کنند", "Unable to add user to group %s" : "امکان افزودن کاربر به گروه %s نیست", "Unable to remove user from group %s" : "امکان حذف کاربر از گروه %s نیست", @@ -42,6 +40,8 @@ "Invalid user" : "کاربر نامعتبر", "Unable to change mail address" : "تغییر آدرس ایمیل امکانپذیر نیست", "Email saved" : "ایمیل ذخیره شد", + "Your full name has been changed." : "نام کامل شما تغییر یافت", + "Unable to change full name" : "امکان تغییر نام کامل وجود ندارد", "Add trusted domain" : "افزودن دامنه مورد اعتماد", "Migration in progress. Please wait until the migration is finished" : "مهاجرت در حال اجراست. لطفا تا اتمام مهاجرت صبر کنید", "Migration started …" : "مهاجرت شروع شد...", diff --git a/settings/l10n/fi_FI.js b/settings/l10n/fi_FI.js index 9d0ca9371b5..7f4889bb487 100644 --- a/settings/l10n/fi_FI.js +++ b/settings/l10n/fi_FI.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Loki", "Tips & tricks" : "Vinkit", "Updates" : "Päivitykset", - "Authentication error" : "Tunnistautumisvirhe", - "Your full name has been changed." : "Koko nimesi on muutettu.", - "Unable to change full name" : "Koko nimen muuttaminen epäonnistui", "Couldn't remove app." : "Sovelluksen poistaminen epäonnistui.", "Language changed" : "Kieli on vaihdettu", "Invalid request" : "Virheellinen pyyntö", + "Authentication error" : "Tunnistautumisvirhe", "Admins can't remove themself from the admin group" : "Ylläpitäjät eivät poistaa omia tunnuksiaan ylläpitäjien ryhmästä", "Unable to add user to group %s" : "Käyttäjän tai ryhmän %s lisääminen ei onnistu", "Unable to remove user from group %s" : "Käyttäjän poistaminen ryhmästä %s ei onnistu", @@ -52,6 +50,8 @@ OC.L10N.register( "Invalid user" : "Virheellinen käyttäjä", "Unable to change mail address" : "Sähköpostiosoitteen vaihtaminen ei onnistunut", "Email saved" : "Sähköposti tallennettu", + "Your full name has been changed." : "Koko nimesi on muutettu.", + "Unable to change full name" : "Koko nimen muuttaminen epäonnistui", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Haluatko varmasti liittää kohteen \"{domain}\" luotetuksi toimialueeksi?", "Add trusted domain" : "Lisää luotettu toimialue", "Migration in progress. Please wait until the migration is finished" : "Migraatio on kesken. Odota kunnes migraatio valmistuu", diff --git a/settings/l10n/fi_FI.json b/settings/l10n/fi_FI.json index a517c3d2f16..e64246df9f8 100644 --- a/settings/l10n/fi_FI.json +++ b/settings/l10n/fi_FI.json @@ -10,12 +10,10 @@ "Log" : "Loki", "Tips & tricks" : "Vinkit", "Updates" : "Päivitykset", - "Authentication error" : "Tunnistautumisvirhe", - "Your full name has been changed." : "Koko nimesi on muutettu.", - "Unable to change full name" : "Koko nimen muuttaminen epäonnistui", "Couldn't remove app." : "Sovelluksen poistaminen epäonnistui.", "Language changed" : "Kieli on vaihdettu", "Invalid request" : "Virheellinen pyyntö", + "Authentication error" : "Tunnistautumisvirhe", "Admins can't remove themself from the admin group" : "Ylläpitäjät eivät poistaa omia tunnuksiaan ylläpitäjien ryhmästä", "Unable to add user to group %s" : "Käyttäjän tai ryhmän %s lisääminen ei onnistu", "Unable to remove user from group %s" : "Käyttäjän poistaminen ryhmästä %s ei onnistu", @@ -50,6 +48,8 @@ "Invalid user" : "Virheellinen käyttäjä", "Unable to change mail address" : "Sähköpostiosoitteen vaihtaminen ei onnistunut", "Email saved" : "Sähköposti tallennettu", + "Your full name has been changed." : "Koko nimesi on muutettu.", + "Unable to change full name" : "Koko nimen muuttaminen epäonnistui", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Haluatko varmasti liittää kohteen \"{domain}\" luotetuksi toimialueeksi?", "Add trusted domain" : "Lisää luotettu toimialue", "Migration in progress. Please wait until the migration is finished" : "Migraatio on kesken. Odota kunnes migraatio valmistuu", diff --git a/settings/l10n/fr.js b/settings/l10n/fr.js index 805b5c05d5c..f3ccc491cd6 100644 --- a/settings/l10n/fr.js +++ b/settings/l10n/fr.js @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Nous vous recommandons d'installer sur votre système les paquets nécessaires à la prise en charge de l'un des paramètres régionaux suivants : %s", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Si votre installation n'a pas été effectuée à la racine du domaine et qu'elle utilise le cron du système, il peut y avoir des problèmes avec la génération d'URL. Pour les éviter, veuillez configurer l'option \"overwrite.cli.url\" de votre fichier config.php avec le chemin de la racine de votre installation (suggéré : \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "La tâche cron n'a pu s'exécuter via CLI. Ces erreurs techniques sont apparues :", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Le verrouillage transactionnel de fichiers utilise la base de données. Pour obtenir de meilleures performances il est recommandé d'utiliser plutôt memcache. Consultez la <a target=\"_blank\" href=\"%s\">documentation ↗</a> pour plus d'informations.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Consultez les <a target=\"_blank\" href=\"%s\">guides d'installation ↗</a>, et cherchez des erreurs ou avertissements dans <a href=\"#log-section\">les logs</a>.", "All checks passed." : "Tous les tests ont réussi.", "Open documentation" : "Voir la documentation", diff --git a/settings/l10n/fr.json b/settings/l10n/fr.json index 61c3129a8c1..fa859c6e438 100644 --- a/settings/l10n/fr.json +++ b/settings/l10n/fr.json @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Nous vous recommandons d'installer sur votre système les paquets nécessaires à la prise en charge de l'un des paramètres régionaux suivants : %s", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Si votre installation n'a pas été effectuée à la racine du domaine et qu'elle utilise le cron du système, il peut y avoir des problèmes avec la génération d'URL. Pour les éviter, veuillez configurer l'option \"overwrite.cli.url\" de votre fichier config.php avec le chemin de la racine de votre installation (suggéré : \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "La tâche cron n'a pu s'exécuter via CLI. Ces erreurs techniques sont apparues :", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Le verrouillage transactionnel de fichiers utilise la base de données. Pour obtenir de meilleures performances il est recommandé d'utiliser plutôt memcache. Consultez la <a target=\"_blank\" href=\"%s\">documentation ↗</a> pour plus d'informations.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Consultez les <a target=\"_blank\" href=\"%s\">guides d'installation ↗</a>, et cherchez des erreurs ou avertissements dans <a href=\"#log-section\">les logs</a>.", "All checks passed." : "Tous les tests ont réussi.", "Open documentation" : "Voir la documentation", diff --git a/settings/l10n/gl.js b/settings/l10n/gl.js index 633e877bd5a..ecb31a6a7a7 100644 --- a/settings/l10n/gl.js +++ b/settings/l10n/gl.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Rexistro", "Tips & tricks" : "Trucos e consellos", "Updates" : "Actualizacións", - "Authentication error" : "Produciuse un erro de autenticación", - "Your full name has been changed." : "O seu nome completo foi cambiado", - "Unable to change full name" : "Non é posíbel cambiar o nome completo", "Couldn't remove app." : "Non foi posíbel retirar a aplicación.", "Language changed" : "O idioma cambiou", "Invalid request" : "Petición incorrecta", + "Authentication error" : "Produciuse un erro de autenticación", "Admins can't remove themself from the admin group" : "Os administradores non poden eliminarse a si mesmos do grupo admin", "Unable to add user to group %s" : "Non é posíbel engadir o usuario ao grupo %s", "Unable to remove user from group %s" : "Non é posíbel eliminar o usuario do grupo %s", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "Usuario incorrecto", "Unable to change mail address" : "Non é posíbel cambiar o enderezo de correo.", "Email saved" : "Correo gardado", + "Your full name has been changed." : "O seu nome completo foi cambiado", + "Unable to change full name" : "Non é posíbel cambiar o nome completo", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Confirma que quere engadir «{domain}» como dominio de confianza?", "Add trusted domain" : "Engadir dominio de confianza", "Migration in progress. Please wait until the migration is finished" : "A migración está en proceso. Agarde a que remate.", diff --git a/settings/l10n/gl.json b/settings/l10n/gl.json index e8f78c560f2..06b0277fda7 100644 --- a/settings/l10n/gl.json +++ b/settings/l10n/gl.json @@ -10,12 +10,10 @@ "Log" : "Rexistro", "Tips & tricks" : "Trucos e consellos", "Updates" : "Actualizacións", - "Authentication error" : "Produciuse un erro de autenticación", - "Your full name has been changed." : "O seu nome completo foi cambiado", - "Unable to change full name" : "Non é posíbel cambiar o nome completo", "Couldn't remove app." : "Non foi posíbel retirar a aplicación.", "Language changed" : "O idioma cambiou", "Invalid request" : "Petición incorrecta", + "Authentication error" : "Produciuse un erro de autenticación", "Admins can't remove themself from the admin group" : "Os administradores non poden eliminarse a si mesmos do grupo admin", "Unable to add user to group %s" : "Non é posíbel engadir o usuario ao grupo %s", "Unable to remove user from group %s" : "Non é posíbel eliminar o usuario do grupo %s", @@ -51,6 +49,8 @@ "Invalid user" : "Usuario incorrecto", "Unable to change mail address" : "Non é posíbel cambiar o enderezo de correo.", "Email saved" : "Correo gardado", + "Your full name has been changed." : "O seu nome completo foi cambiado", + "Unable to change full name" : "Non é posíbel cambiar o nome completo", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Confirma que quere engadir «{domain}» como dominio de confianza?", "Add trusted domain" : "Engadir dominio de confianza", "Migration in progress. Please wait until the migration is finished" : "A migración está en proceso. Agarde a que remate.", diff --git a/settings/l10n/he.js b/settings/l10n/he.js index cfffdc8b967..9fd78e6b02d 100644 --- a/settings/l10n/he.js +++ b/settings/l10n/he.js @@ -5,9 +5,9 @@ OC.L10N.register( "External Storage" : "אחסון חיצוני", "Cron" : "Cron", "Log" : "יומן", - "Authentication error" : "שגיאת הזדהות", "Language changed" : "שפה השתנתה", "Invalid request" : "בקשה לא חוקית", + "Authentication error" : "שגיאת הזדהות", "Admins can't remove themself from the admin group" : "מנהלים לא יכולים להסיר את עצמם מקבוצת המנהלים", "Unable to add user to group %s" : "לא ניתן להוסיף משתמש לקבוצה %s", "Unable to remove user from group %s" : "לא ניתן להסיר משתמש מהקבוצה %s", diff --git a/settings/l10n/he.json b/settings/l10n/he.json index b38203e3d0e..03711901376 100644 --- a/settings/l10n/he.json +++ b/settings/l10n/he.json @@ -3,9 +3,9 @@ "External Storage" : "אחסון חיצוני", "Cron" : "Cron", "Log" : "יומן", - "Authentication error" : "שגיאת הזדהות", "Language changed" : "שפה השתנתה", "Invalid request" : "בקשה לא חוקית", + "Authentication error" : "שגיאת הזדהות", "Admins can't remove themself from the admin group" : "מנהלים לא יכולים להסיר את עצמם מקבוצת המנהלים", "Unable to add user to group %s" : "לא ניתן להוסיף משתמש לקבוצה %s", "Unable to remove user from group %s" : "לא ניתן להסיר משתמש מהקבוצה %s", diff --git a/settings/l10n/hr.js b/settings/l10n/hr.js index d9c1bb3f4f9..3bfb3ef79a7 100644 --- a/settings/l10n/hr.js +++ b/settings/l10n/hr.js @@ -6,12 +6,10 @@ OC.L10N.register( "Cron" : "Cron", "Log" : "Zapisnik", "Updates" : "nadogradnje", - "Authentication error" : "Pogrešna autentikacija", - "Your full name has been changed." : "Vaše puno ime je promijenjeno.", - "Unable to change full name" : "Puno ime nije moguće promijeniti.", "Couldn't remove app." : "Nije moguće ukloniti app.", "Language changed" : "Promjena jezika", "Invalid request" : "Zahtjev neispravan", + "Authentication error" : "Pogrešna autentikacija", "Admins can't remove themself from the admin group" : "Administratori ne mogu sami sebe ukloniti iz admin grupe", "Unable to add user to group %s" : "Dodavanje korisnika grupi %s nije moguće", "Unable to remove user from group %s" : "Uklanjanje korisnika iz grupe %s nije moguće", @@ -27,6 +25,8 @@ OC.L10N.register( "Email sent" : "E-pošta je poslana", "You need to set your user email before being able to send test emails." : "Prije nego li ste u mogućnosti slati testnu e-poštu trebate postaviti svoj korisnički email.", "Email saved" : "E-pošta spremljena", + "Your full name has been changed." : "Vaše puno ime je promijenjeno.", + "Unable to change full name" : "Puno ime nije moguće promijeniti.", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Jeste li doista sigurni da želite dodati \"{domain}\" kao pouzdanu domenu?", "Add trusted domain" : "Dodajte pouzdanu domenu", "Sending..." : "Slanje...", diff --git a/settings/l10n/hr.json b/settings/l10n/hr.json index 8867813b963..8a7f427ad95 100644 --- a/settings/l10n/hr.json +++ b/settings/l10n/hr.json @@ -4,12 +4,10 @@ "Cron" : "Cron", "Log" : "Zapisnik", "Updates" : "nadogradnje", - "Authentication error" : "Pogrešna autentikacija", - "Your full name has been changed." : "Vaše puno ime je promijenjeno.", - "Unable to change full name" : "Puno ime nije moguće promijeniti.", "Couldn't remove app." : "Nije moguće ukloniti app.", "Language changed" : "Promjena jezika", "Invalid request" : "Zahtjev neispravan", + "Authentication error" : "Pogrešna autentikacija", "Admins can't remove themself from the admin group" : "Administratori ne mogu sami sebe ukloniti iz admin grupe", "Unable to add user to group %s" : "Dodavanje korisnika grupi %s nije moguće", "Unable to remove user from group %s" : "Uklanjanje korisnika iz grupe %s nije moguće", @@ -25,6 +23,8 @@ "Email sent" : "E-pošta je poslana", "You need to set your user email before being able to send test emails." : "Prije nego li ste u mogućnosti slati testnu e-poštu trebate postaviti svoj korisnički email.", "Email saved" : "E-pošta spremljena", + "Your full name has been changed." : "Vaše puno ime je promijenjeno.", + "Unable to change full name" : "Puno ime nije moguće promijeniti.", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Jeste li doista sigurni da želite dodati \"{domain}\" kao pouzdanu domenu?", "Add trusted domain" : "Dodajte pouzdanu domenu", "Sending..." : "Slanje...", diff --git a/settings/l10n/hu_HU.js b/settings/l10n/hu_HU.js index 399129eda49..6f5900ed911 100644 --- a/settings/l10n/hu_HU.js +++ b/settings/l10n/hu_HU.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Naplózás", "Tips & tricks" : "Tippek és trükkök", "Updates" : "Frissítések", - "Authentication error" : "Azonosítási hiba", - "Your full name has been changed." : "Az Ön teljes nevét módosítottuk.", - "Unable to change full name" : "Nem sikerült megváltoztatni a teljes nevét", "Couldn't remove app." : "Az alkalmazást nem sikerült eltávolítani.", "Language changed" : "A nyelv megváltozott", "Invalid request" : "Érvénytelen kérés", + "Authentication error" : "Azonosítási hiba", "Admins can't remove themself from the admin group" : "Adminisztrátorok nem távolíthatják el magukat az admin csoportból.", "Unable to add user to group %s" : "A felhasználó nem adható hozzá ehhez a csoporthoz: %s", "Unable to remove user from group %s" : "A felhasználó nem távolítható el ebből a csoportból: %s", @@ -51,6 +49,8 @@ OC.L10N.register( "Invalid user" : "Érvénytelen felhasználó", "Unable to change mail address" : "Nem lehet megváltoztatni az e-mail címet", "Email saved" : "E-mail elmentve!", + "Your full name has been changed." : "Az Ön teljes nevét módosítottuk.", + "Unable to change full name" : "Nem sikerült megváltoztatni a teljes nevét", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Biztos abban, hogy hozzá akarja adni \"{domain}\"-t a megbízható tartományokhoz?", "Add trusted domain" : "Megbízható tartomány hozzáadása", "Migration in progress. Please wait until the migration is finished" : "Migráció folyamatban. Kérjük várj, míg a migráció befejeződik.", diff --git a/settings/l10n/hu_HU.json b/settings/l10n/hu_HU.json index fe9f17f14ab..7c6a79c3dae 100644 --- a/settings/l10n/hu_HU.json +++ b/settings/l10n/hu_HU.json @@ -10,12 +10,10 @@ "Log" : "Naplózás", "Tips & tricks" : "Tippek és trükkök", "Updates" : "Frissítések", - "Authentication error" : "Azonosítási hiba", - "Your full name has been changed." : "Az Ön teljes nevét módosítottuk.", - "Unable to change full name" : "Nem sikerült megváltoztatni a teljes nevét", "Couldn't remove app." : "Az alkalmazást nem sikerült eltávolítani.", "Language changed" : "A nyelv megváltozott", "Invalid request" : "Érvénytelen kérés", + "Authentication error" : "Azonosítási hiba", "Admins can't remove themself from the admin group" : "Adminisztrátorok nem távolíthatják el magukat az admin csoportból.", "Unable to add user to group %s" : "A felhasználó nem adható hozzá ehhez a csoporthoz: %s", "Unable to remove user from group %s" : "A felhasználó nem távolítható el ebből a csoportból: %s", @@ -49,6 +47,8 @@ "Invalid user" : "Érvénytelen felhasználó", "Unable to change mail address" : "Nem lehet megváltoztatni az e-mail címet", "Email saved" : "E-mail elmentve!", + "Your full name has been changed." : "Az Ön teljes nevét módosítottuk.", + "Unable to change full name" : "Nem sikerült megváltoztatni a teljes nevét", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Biztos abban, hogy hozzá akarja adni \"{domain}\"-t a megbízható tartományokhoz?", "Add trusted domain" : "Megbízható tartomány hozzáadása", "Migration in progress. Please wait until the migration is finished" : "Migráció folyamatban. Kérjük várj, míg a migráció befejeződik.", diff --git a/settings/l10n/id.js b/settings/l10n/id.js index e5efe797e69..5b4f9f5c6b5 100644 --- a/settings/l10n/id.js +++ b/settings/l10n/id.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Log", "Tips & tricks" : "Tips & trik", "Updates" : "Pembaruan", - "Authentication error" : "Terjadi kesalahan saat otentikasi", - "Your full name has been changed." : "Nama lengkap Anda telah diubah", - "Unable to change full name" : "Tidak dapat mengubah nama lengkap", "Couldn't remove app." : "Tidak dapat menghapus aplikasi.", "Language changed" : "Bahasa telah diubah", "Invalid request" : "Permintaan tidak valid", + "Authentication error" : "Terjadi kesalahan saat otentikasi", "Admins can't remove themself from the admin group" : "Admin tidak dapat menghapus dirinya sendiri dari grup admin", "Unable to add user to group %s" : "Tidak dapat menambahkan pengguna ke grup %s", "Unable to remove user from group %s" : "Tidak dapat menghapus pengguna dari grup %s", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "Pengguna salah", "Unable to change mail address" : "Tidak dapat mengubah alamat email", "Email saved" : "Email disimpan", + "Your full name has been changed." : "Nama lengkap Anda telah diubah", + "Unable to change full name" : "Tidak dapat mengubah nama lengkap", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Apakah Anda yakin ingin menambahkan \"{domain}\" sebagai domain terpercaya?", "Add trusted domain" : "Tambah domain terpercaya", "Migration in progress. Please wait until the migration is finished" : "Migrasi sedang dalam proses. Mohon tunggu sampai migrasi selesai.", @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Kamu sangat menyarankan untuk menginstal paket-paket yang dibutuhkan pada sistem agar mendukung lokal berikut: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Jika instalasi Anda tidak di root domain dan menggunakan sistem cron, hal tersebut dapat menyebabkan masalah dengan pembuatan URL. Untuk mencegah masalah tersebut, mohon atur opsi \"overwrite.cli.url\" pada berkas config.php Anda ke jalur lokasi webroot instalasi Anda (Disarankan: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Tidak mungkin untuk mengeksekusi cronjob via CLI. Kesalahan teknis berikut muncul:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Transaksi penguncian berkas menggunakan basis data sebagai backend penguncian, untuk mendapatkan kinerja terbaik, disarankan mengkonfigurasi memcache sebagai penguncian. Baca <a target=\"_blank\" href=\"%s\">dokumentasi ↗</a> untuk informasi lebih lanjut.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Mohon periksa dua kali <a target=\"_blank\" href=\"%s\">panduan instalasi ↗</a>, dan periksa segala kesalahan atau peringatan pada <a href=\"#log-section\">log</a>.", "All checks passed." : "Semua pemeriksaan lulus.", "Open documentation" : "Buka dokumentasi", diff --git a/settings/l10n/id.json b/settings/l10n/id.json index 8a30d825bc1..b6d1f9f7501 100644 --- a/settings/l10n/id.json +++ b/settings/l10n/id.json @@ -10,12 +10,10 @@ "Log" : "Log", "Tips & tricks" : "Tips & trik", "Updates" : "Pembaruan", - "Authentication error" : "Terjadi kesalahan saat otentikasi", - "Your full name has been changed." : "Nama lengkap Anda telah diubah", - "Unable to change full name" : "Tidak dapat mengubah nama lengkap", "Couldn't remove app." : "Tidak dapat menghapus aplikasi.", "Language changed" : "Bahasa telah diubah", "Invalid request" : "Permintaan tidak valid", + "Authentication error" : "Terjadi kesalahan saat otentikasi", "Admins can't remove themself from the admin group" : "Admin tidak dapat menghapus dirinya sendiri dari grup admin", "Unable to add user to group %s" : "Tidak dapat menambahkan pengguna ke grup %s", "Unable to remove user from group %s" : "Tidak dapat menghapus pengguna dari grup %s", @@ -51,6 +49,8 @@ "Invalid user" : "Pengguna salah", "Unable to change mail address" : "Tidak dapat mengubah alamat email", "Email saved" : "Email disimpan", + "Your full name has been changed." : "Nama lengkap Anda telah diubah", + "Unable to change full name" : "Tidak dapat mengubah nama lengkap", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Apakah Anda yakin ingin menambahkan \"{domain}\" sebagai domain terpercaya?", "Add trusted domain" : "Tambah domain terpercaya", "Migration in progress. Please wait until the migration is finished" : "Migrasi sedang dalam proses. Mohon tunggu sampai migrasi selesai.", @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Kamu sangat menyarankan untuk menginstal paket-paket yang dibutuhkan pada sistem agar mendukung lokal berikut: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Jika instalasi Anda tidak di root domain dan menggunakan sistem cron, hal tersebut dapat menyebabkan masalah dengan pembuatan URL. Untuk mencegah masalah tersebut, mohon atur opsi \"overwrite.cli.url\" pada berkas config.php Anda ke jalur lokasi webroot instalasi Anda (Disarankan: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Tidak mungkin untuk mengeksekusi cronjob via CLI. Kesalahan teknis berikut muncul:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Transaksi penguncian berkas menggunakan basis data sebagai backend penguncian, untuk mendapatkan kinerja terbaik, disarankan mengkonfigurasi memcache sebagai penguncian. Baca <a target=\"_blank\" href=\"%s\">dokumentasi ↗</a> untuk informasi lebih lanjut.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Mohon periksa dua kali <a target=\"_blank\" href=\"%s\">panduan instalasi ↗</a>, dan periksa segala kesalahan atau peringatan pada <a href=\"#log-section\">log</a>.", "All checks passed." : "Semua pemeriksaan lulus.", "Open documentation" : "Buka dokumentasi", diff --git a/settings/l10n/is.js b/settings/l10n/is.js index 994011a098e..ffde7f98b5f 100644 --- a/settings/l10n/is.js +++ b/settings/l10n/is.js @@ -2,9 +2,9 @@ OC.L10N.register( "settings", { "External Storage" : "Ytri gagnageymsla", - "Authentication error" : "Villa við auðkenningu", "Language changed" : "Tungumáli breytt", "Invalid request" : "Ógild fyrirspurn", + "Authentication error" : "Villa við auðkenningu", "Admins can't remove themself from the admin group" : "Stjórnendur geta ekki fjarlægt sjálfa sig úr stjórnendahóp", "Unable to add user to group %s" : "Ekki tókst að bæta notenda við hópinn %s", "Unable to remove user from group %s" : "Ekki tókst að fjarlægja notanda úr hópnum %s", diff --git a/settings/l10n/is.json b/settings/l10n/is.json index 5e2507a5499..15d7cbb4a93 100644 --- a/settings/l10n/is.json +++ b/settings/l10n/is.json @@ -1,8 +1,8 @@ { "translations": { "External Storage" : "Ytri gagnageymsla", - "Authentication error" : "Villa við auðkenningu", "Language changed" : "Tungumáli breytt", "Invalid request" : "Ógild fyrirspurn", + "Authentication error" : "Villa við auðkenningu", "Admins can't remove themself from the admin group" : "Stjórnendur geta ekki fjarlægt sjálfa sig úr stjórnendahóp", "Unable to add user to group %s" : "Ekki tókst að bæta notenda við hópinn %s", "Unable to remove user from group %s" : "Ekki tókst að fjarlægja notanda úr hópnum %s", diff --git a/settings/l10n/it.js b/settings/l10n/it.js index 4d73fe6100a..b2881fea3a4 100644 --- a/settings/l10n/it.js +++ b/settings/l10n/it.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Log", "Tips & tricks" : "Suggerimenti e trucchi", "Updates" : "Aggiornamenti", - "Authentication error" : "Errore di autenticazione", - "Your full name has been changed." : "Il tuo nome completo è stato cambiato.", - "Unable to change full name" : "Impossibile cambiare il nome completo", "Couldn't remove app." : "Impossibile rimuovere l'applicazione.", "Language changed" : "Lingua modificata", "Invalid request" : "Richiesta non valida", + "Authentication error" : "Errore di autenticazione", "Admins can't remove themself from the admin group" : "Gli amministratori non possono rimuovere se stessi dal gruppo di amministrazione", "Unable to add user to group %s" : "Impossibile aggiungere l'utente al gruppo %s", "Unable to remove user from group %s" : "Impossibile rimuovere l'utente dal gruppo %s", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "Utente non valido", "Unable to change mail address" : "Impossibile cambiare l'indirizzo di posta", "Email saved" : "Email salvata", + "Your full name has been changed." : "Il tuo nome completo è stato cambiato.", + "Unable to change full name" : "Impossibile cambiare il nome completo", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Sei sicuro di voler aggiungere \"{domain}\" come dominio attendibile?", "Add trusted domain" : "Aggiungi dominio attendibile", "Migration in progress. Please wait until the migration is finished" : "Migrazione in corso. Attendi fino al completamento della migrazione", @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Consigliamo vivamente di installare i pacchetti richiesti sul tuo sistema per supportare una delle localizzazioni seguenti: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Se la tua installazione non si trova nella radice del dominio e utilizza il cron di sistema, potrebbero esserci problemi con la generazione degli URL. Per evitare questi problemi, imposta l'opzione \"overwrite.cli.url\" nel file config.php al percorso della radice del sito della tua installazione (Consigliato: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Non è stato possibile eseguire il job di cron tramite CLI. Sono apparsi i seguenti errori tecnici:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Il blocco del file transazionale sta utilizzando il database come motore di blocco, per avere prestazioni migliori, è consigliato configurare una cache di memoria per il blocco. Vedi la <a target=\"_blank\" href=\"%s\">documentazione ↗</a> per ulteriori informazioni.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Leggi attentamente le <a target=\"_blank\" href=\"%s\">guide d'installazione ↗</a>, e controlla gli errori o gli avvisi nel <a href=\"#log-section\">log</a>.", "All checks passed." : "Tutti i controlli passati.", "Open documentation" : "Apri la documentazione", diff --git a/settings/l10n/it.json b/settings/l10n/it.json index 1090780f966..72ac8fa95e1 100644 --- a/settings/l10n/it.json +++ b/settings/l10n/it.json @@ -10,12 +10,10 @@ "Log" : "Log", "Tips & tricks" : "Suggerimenti e trucchi", "Updates" : "Aggiornamenti", - "Authentication error" : "Errore di autenticazione", - "Your full name has been changed." : "Il tuo nome completo è stato cambiato.", - "Unable to change full name" : "Impossibile cambiare il nome completo", "Couldn't remove app." : "Impossibile rimuovere l'applicazione.", "Language changed" : "Lingua modificata", "Invalid request" : "Richiesta non valida", + "Authentication error" : "Errore di autenticazione", "Admins can't remove themself from the admin group" : "Gli amministratori non possono rimuovere se stessi dal gruppo di amministrazione", "Unable to add user to group %s" : "Impossibile aggiungere l'utente al gruppo %s", "Unable to remove user from group %s" : "Impossibile rimuovere l'utente dal gruppo %s", @@ -51,6 +49,8 @@ "Invalid user" : "Utente non valido", "Unable to change mail address" : "Impossibile cambiare l'indirizzo di posta", "Email saved" : "Email salvata", + "Your full name has been changed." : "Il tuo nome completo è stato cambiato.", + "Unable to change full name" : "Impossibile cambiare il nome completo", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Sei sicuro di voler aggiungere \"{domain}\" come dominio attendibile?", "Add trusted domain" : "Aggiungi dominio attendibile", "Migration in progress. Please wait until the migration is finished" : "Migrazione in corso. Attendi fino al completamento della migrazione", @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Consigliamo vivamente di installare i pacchetti richiesti sul tuo sistema per supportare una delle localizzazioni seguenti: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Se la tua installazione non si trova nella radice del dominio e utilizza il cron di sistema, potrebbero esserci problemi con la generazione degli URL. Per evitare questi problemi, imposta l'opzione \"overwrite.cli.url\" nel file config.php al percorso della radice del sito della tua installazione (Consigliato: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Non è stato possibile eseguire il job di cron tramite CLI. Sono apparsi i seguenti errori tecnici:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Il blocco del file transazionale sta utilizzando il database come motore di blocco, per avere prestazioni migliori, è consigliato configurare una cache di memoria per il blocco. Vedi la <a target=\"_blank\" href=\"%s\">documentazione ↗</a> per ulteriori informazioni.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Leggi attentamente le <a target=\"_blank\" href=\"%s\">guide d'installazione ↗</a>, e controlla gli errori o gli avvisi nel <a href=\"#log-section\">log</a>.", "All checks passed." : "Tutti i controlli passati.", "Open documentation" : "Apri la documentazione", diff --git a/settings/l10n/ja.js b/settings/l10n/ja.js index 9d6705aff3f..5b3643eea80 100644 --- a/settings/l10n/ja.js +++ b/settings/l10n/ja.js @@ -20,7 +20,7 @@ OC.L10N.register( "Unable to add user to group %s" : "ユーザーをグループ %s に追加できません", "Unable to remove user from group %s" : "ユーザーをグループ %s から削除できません", "Couldn't update app." : "アプリをアップデートできませんでした。", - "Wrong password" : "無効なパスワード", + "Wrong password" : "パスワードが間違っています", "No user supplied" : "ユーザーが指定されていません", "Please provide an admin recovery password, otherwise all user data will be lost" : "リカバリ用の管理者パスワードを入力してください。そうでない場合は、全ユーザーのデータが失われます。", "Wrong admin recovery password. Please check the password and try again." : "リカバリ用の管理者パスワードが間違っています。パスワードを確認して再度実行してください。", @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "次のロケールをサポートするには、システムに必要なパッケージをインストールすることを強くおすすめします: %s。", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "URLがドメインのルート(/)で終わっていない場合で、システムのcronを利用している場合は、URLの生成に問題が発生します。その場合は、config.php ファイルの中の \"overwrite.cli.url\" オプションをインストールしたwebrootのパスに設定してください。(推奨: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "CLI から cronジョブを実行することができませんでした。次の技術的なエラーが発生しています:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "トランザクションファイルのロックは、データベースを使用してバックエンドのロックをしています。最高のパフォーマンスのためには、ロック用に memcache を設定することをお勧めします。詳細については、<a target=\"_blank\" href=\"%s\">ドキュメント↗ </a>を参照してください。", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "<a target=\"_blank\" href=\"%s\">インストールガイド ↗</a>をもう一度チェックして、<a href=\"#log-section\">ログ</a> にあるエラーまたは警告について確認してください。", "All checks passed." : "すべてのチェックに合格しました。", "Open documentation" : "ドキュメントを開く", diff --git a/settings/l10n/ja.json b/settings/l10n/ja.json index aa22a5ce9b3..f8daf2d7987 100644 --- a/settings/l10n/ja.json +++ b/settings/l10n/ja.json @@ -18,7 +18,7 @@ "Unable to add user to group %s" : "ユーザーをグループ %s に追加できません", "Unable to remove user from group %s" : "ユーザーをグループ %s から削除できません", "Couldn't update app." : "アプリをアップデートできませんでした。", - "Wrong password" : "無効なパスワード", + "Wrong password" : "パスワードが間違っています", "No user supplied" : "ユーザーが指定されていません", "Please provide an admin recovery password, otherwise all user data will be lost" : "リカバリ用の管理者パスワードを入力してください。そうでない場合は、全ユーザーのデータが失われます。", "Wrong admin recovery password. Please check the password and try again." : "リカバリ用の管理者パスワードが間違っています。パスワードを確認して再度実行してください。", @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "次のロケールをサポートするには、システムに必要なパッケージをインストールすることを強くおすすめします: %s。", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "URLがドメインのルート(/)で終わっていない場合で、システムのcronを利用している場合は、URLの生成に問題が発生します。その場合は、config.php ファイルの中の \"overwrite.cli.url\" オプションをインストールしたwebrootのパスに設定してください。(推奨: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "CLI から cronジョブを実行することができませんでした。次の技術的なエラーが発生しています:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "トランザクションファイルのロックは、データベースを使用してバックエンドのロックをしています。最高のパフォーマンスのためには、ロック用に memcache を設定することをお勧めします。詳細については、<a target=\"_blank\" href=\"%s\">ドキュメント↗ </a>を参照してください。", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "<a target=\"_blank\" href=\"%s\">インストールガイド ↗</a>をもう一度チェックして、<a href=\"#log-section\">ログ</a> にあるエラーまたは警告について確認してください。", "All checks passed." : "すべてのチェックに合格しました。", "Open documentation" : "ドキュメントを開く", diff --git a/settings/l10n/ka_GE.js b/settings/l10n/ka_GE.js index 0c6ad6fd82d..636954b6d7d 100644 --- a/settings/l10n/ka_GE.js +++ b/settings/l10n/ka_GE.js @@ -5,9 +5,9 @@ OC.L10N.register( "External Storage" : "ექსტერნალ საცავი", "Cron" : "Cron–ი", "Log" : "ლოგი", - "Authentication error" : "ავთენტიფიკაციის შეცდომა", "Language changed" : "ენა შეცვლილია", "Invalid request" : "არასწორი მოთხოვნა", + "Authentication error" : "ავთენტიფიკაციის შეცდომა", "Admins can't remove themself from the admin group" : "ადმინისტრატორებს არ შეუძლიათ საკუთარი თავის წაშლა ადმინ ჯგუფიდან", "Unable to add user to group %s" : "მომხმარებლის დამატება ვერ მოხეხდა ჯგუფში %s", "Unable to remove user from group %s" : "მომხმარებლის წაშლა ვერ მოხეხდა ჯგუფიდან %s", diff --git a/settings/l10n/ka_GE.json b/settings/l10n/ka_GE.json index 5892c19547f..a1a3bb241e9 100644 --- a/settings/l10n/ka_GE.json +++ b/settings/l10n/ka_GE.json @@ -3,9 +3,9 @@ "External Storage" : "ექსტერნალ საცავი", "Cron" : "Cron–ი", "Log" : "ლოგი", - "Authentication error" : "ავთენტიფიკაციის შეცდომა", "Language changed" : "ენა შეცვლილია", "Invalid request" : "არასწორი მოთხოვნა", + "Authentication error" : "ავთენტიფიკაციის შეცდომა", "Admins can't remove themself from the admin group" : "ადმინისტრატორებს არ შეუძლიათ საკუთარი თავის წაშლა ადმინ ჯგუფიდან", "Unable to add user to group %s" : "მომხმარებლის დამატება ვერ მოხეხდა ჯგუფში %s", "Unable to remove user from group %s" : "მომხმარებლის წაშლა ვერ მოხეხდა ჯგუფიდან %s", diff --git a/settings/l10n/km.js b/settings/l10n/km.js index bba9783e9a0..c816d5bed33 100644 --- a/settings/l10n/km.js +++ b/settings/l10n/km.js @@ -5,9 +5,9 @@ OC.L10N.register( "External Storage" : "ឃ្លាំងផ្ទុកខាងក្រៅ", "Cron" : "Cron", "Log" : "Log", - "Authentication error" : "កំហុសការផ្ទៀងផ្ទាត់ភាពត្រឹមត្រូវ", "Language changed" : "បានប្ដូរភាសា", "Invalid request" : "សំណើមិនត្រឹមត្រូវ", + "Authentication error" : "កំហុសការផ្ទៀងផ្ទាត់ភាពត្រឹមត្រូវ", "Admins can't remove themself from the admin group" : "អ្នកគ្រប់គ្រងមិនអាចលុបខ្លួនឯងចេញពីក្រុមអ្នកគ្រប់គ្រងឡើយ", "Unable to add user to group %s" : "មិនអាចបន្ថែមអ្នកប្រើទៅក្រុម %s", "Unable to remove user from group %s" : "មិនអាចដកអ្នកប្រើចេញពីក្រុម %s", diff --git a/settings/l10n/km.json b/settings/l10n/km.json index 89cd82da01a..b57c054faa0 100644 --- a/settings/l10n/km.json +++ b/settings/l10n/km.json @@ -3,9 +3,9 @@ "External Storage" : "ឃ្លាំងផ្ទុកខាងក្រៅ", "Cron" : "Cron", "Log" : "Log", - "Authentication error" : "កំហុសការផ្ទៀងផ្ទាត់ភាពត្រឹមត្រូវ", "Language changed" : "បានប្ដូរភាសា", "Invalid request" : "សំណើមិនត្រឹមត្រូវ", + "Authentication error" : "កំហុសការផ្ទៀងផ្ទាត់ភាពត្រឹមត្រូវ", "Admins can't remove themself from the admin group" : "អ្នកគ្រប់គ្រងមិនអាចលុបខ្លួនឯងចេញពីក្រុមអ្នកគ្រប់គ្រងឡើយ", "Unable to add user to group %s" : "មិនអាចបន្ថែមអ្នកប្រើទៅក្រុម %s", "Unable to remove user from group %s" : "មិនអាចដកអ្នកប្រើចេញពីក្រុម %s", diff --git a/settings/l10n/kn.js b/settings/l10n/kn.js index 4ef7313b3bf..673081e5f01 100644 --- a/settings/l10n/kn.js +++ b/settings/l10n/kn.js @@ -3,12 +3,10 @@ OC.L10N.register( { "Sharing" : "ಹಂಚಿಕೆ", "Log" : "ಹಿನ್ನೆಲೆಯ ದಾಖಲೆ", - "Authentication error" : "ದೃಢೀಕರಣ ದೋಷ", - "Your full name has been changed." : "ನಿಮ್ಮ ಪೂರ್ಣ ಹೆಸರನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ.", - "Unable to change full name" : "ಪೂರ್ಣ ಹೆಸರನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ", "Couldn't remove app." : "ಅಳಿಸುವಾಗ ಏನೊ ಲೋಪವಾಗಿದೆ", "Language changed" : "ಭಾಷೆಯನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ", "Invalid request" : "ಅಮಾನ್ಯ ಕೋರಿಕೆ", + "Authentication error" : "ದೃಢೀಕರಣ ದೋಷ", "Admins can't remove themself from the admin group" : "ನಿರ್ವಾಹಕರು ನಿರ್ವಹಣೆ ಗುಂಪಿನಿಂದ ತಮ್ಮನ್ನೇ ತಾವು ತೆಗೆದುಹಾಕಿಕೊಳ್ಳಲು ಸಾಧ್ಯವಿಲ್ಲ", "Unable to add user to group %s" : "%s ಗುಂಪಿಗೆ ಹೂಸ ಬಳಕೆದಾರನನ್ನು ಸೇರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ", "Unable to remove user from group %s" : "%s ಗುಂಪು ಬಳಕೆದಾರ ತೆಗೆದುಹಾಕಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ", @@ -33,6 +31,8 @@ OC.L10N.register( "Invalid user" : "ಅಮಾನ್ಯ ಬಳಕೆದಾರ", "Unable to change mail address" : "ಇ-ಅಂಚೆ ವಿಳಾಸ ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ", "Email saved" : "ಇ-ಅಂಚೆಯನ್ನು ಉಳಿಸಿದೆ", + "Your full name has been changed." : "ನಿಮ್ಮ ಪೂರ್ಣ ಹೆಸರನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ.", + "Unable to change full name" : "ಪೂರ್ಣ ಹೆಸರನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ", "Sending..." : "ಕಳುಹಿಸಲಾಗುತ್ತಿದೆ ...", "All" : "ಎಲ್ಲಾ", "Please wait...." : "ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ ....", diff --git a/settings/l10n/kn.json b/settings/l10n/kn.json index cbae632d1ce..5942e8a8dc7 100644 --- a/settings/l10n/kn.json +++ b/settings/l10n/kn.json @@ -1,12 +1,10 @@ { "translations": { "Sharing" : "ಹಂಚಿಕೆ", "Log" : "ಹಿನ್ನೆಲೆಯ ದಾಖಲೆ", - "Authentication error" : "ದೃಢೀಕರಣ ದೋಷ", - "Your full name has been changed." : "ನಿಮ್ಮ ಪೂರ್ಣ ಹೆಸರನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ.", - "Unable to change full name" : "ಪೂರ್ಣ ಹೆಸರನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ", "Couldn't remove app." : "ಅಳಿಸುವಾಗ ಏನೊ ಲೋಪವಾಗಿದೆ", "Language changed" : "ಭಾಷೆಯನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ", "Invalid request" : "ಅಮಾನ್ಯ ಕೋರಿಕೆ", + "Authentication error" : "ದೃಢೀಕರಣ ದೋಷ", "Admins can't remove themself from the admin group" : "ನಿರ್ವಾಹಕರು ನಿರ್ವಹಣೆ ಗುಂಪಿನಿಂದ ತಮ್ಮನ್ನೇ ತಾವು ತೆಗೆದುಹಾಕಿಕೊಳ್ಳಲು ಸಾಧ್ಯವಿಲ್ಲ", "Unable to add user to group %s" : "%s ಗುಂಪಿಗೆ ಹೂಸ ಬಳಕೆದಾರನನ್ನು ಸೇರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ", "Unable to remove user from group %s" : "%s ಗುಂಪು ಬಳಕೆದಾರ ತೆಗೆದುಹಾಕಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ", @@ -31,6 +29,8 @@ "Invalid user" : "ಅಮಾನ್ಯ ಬಳಕೆದಾರ", "Unable to change mail address" : "ಇ-ಅಂಚೆ ವಿಳಾಸ ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ", "Email saved" : "ಇ-ಅಂಚೆಯನ್ನು ಉಳಿಸಿದೆ", + "Your full name has been changed." : "ನಿಮ್ಮ ಪೂರ್ಣ ಹೆಸರನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ.", + "Unable to change full name" : "ಪೂರ್ಣ ಹೆಸರನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ", "Sending..." : "ಕಳುಹಿಸಲಾಗುತ್ತಿದೆ ...", "All" : "ಎಲ್ಲಾ", "Please wait...." : "ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ ....", diff --git a/settings/l10n/ko.js b/settings/l10n/ko.js index 6eea3ecede7..56d7b315fbd 100644 --- a/settings/l10n/ko.js +++ b/settings/l10n/ko.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "로그", "Tips & tricks" : "팁과 추가 정보", "Updates" : "업데이트", - "Authentication error" : "인증 오류", - "Your full name has been changed." : "전체 이름이 변경되었습니다.", - "Unable to change full name" : "전체 이름을 변경할 수 없음", "Couldn't remove app." : "앱을 삭제할 수 없습니다.", "Language changed" : "언어가 변경됨", "Invalid request" : "잘못된 요청", + "Authentication error" : "인증 오류", "Admins can't remove themself from the admin group" : "관리자 자신을 관리자 그룹에서 삭제할 수 없음", "Unable to add user to group %s" : "그룹 %s에 사용자를 추가할 수 없음", "Unable to remove user from group %s" : "그룹 %s에서 사용자를 삭제할 수 없음", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "잘못된 사용자", "Unable to change mail address" : "이메일 주소를 변경할 수 없음", "Email saved" : "이메일 저장됨", + "Your full name has been changed." : "전체 이름이 변경되었습니다.", + "Unable to change full name" : "전체 이름을 변경할 수 없음", "Are you really sure you want add \"{domain}\" as trusted domain?" : "신뢰할 수 있는 도메인 목록에 \"{domain}\"을(를) 추가하시겠습니까?", "Add trusted domain" : "신뢰할 수 있는 도메인 추가", "Migration in progress. Please wait until the migration is finished" : "이전 작업 중입니다. 작업이 완료될 때까지 기다려 주십시오", @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "다음 중 하나 이상의 로캘을 지원하기 위하여 필요한 패키지를 시스템에 설치하는 것을 추천합니다: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "도메인의 루트 디렉터리 아래에 설치되어 있지 않고 시스템 cron을 사용한다면 URL 생성에 문제가 발생할 수도 있습니다. 이 문제를 해결하려면 설치본의 웹 루트 경로에 있는 config.php 파일의 \"overwrite.cli.url\" 옵션을 변경하십시오(제안: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "CLI로 cronjob을 실행할 수 없었습니다. 다음 기술적 오류가 발생했습니다:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "잠금 백엔드로 데이터베이스를 사용하고 있으므로 트랜잭션 기반 파일 잠금을 사용합니다. 더 좋은 성능을 내려면 memcache 기반 잠금 사용을 추천합니다. 더 많은 정보를 보려면 <a target=\"_blank\" href=\"%s\">문서 ↗</a>를 참고하십시오.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "<a target=\"_blank\" href=\"%s\">설치 가이드 ↗</a>를 다시 확인하시고 <a href=\"#log-section\">로그</a>의 오류 및 경고를 확인하십시오.", "All checks passed." : "모든 검사를 통과했습니다.", "Open documentation" : "문서 열기", diff --git a/settings/l10n/ko.json b/settings/l10n/ko.json index 1fb664b2138..07e8b253e73 100644 --- a/settings/l10n/ko.json +++ b/settings/l10n/ko.json @@ -10,12 +10,10 @@ "Log" : "로그", "Tips & tricks" : "팁과 추가 정보", "Updates" : "업데이트", - "Authentication error" : "인증 오류", - "Your full name has been changed." : "전체 이름이 변경되었습니다.", - "Unable to change full name" : "전체 이름을 변경할 수 없음", "Couldn't remove app." : "앱을 삭제할 수 없습니다.", "Language changed" : "언어가 변경됨", "Invalid request" : "잘못된 요청", + "Authentication error" : "인증 오류", "Admins can't remove themself from the admin group" : "관리자 자신을 관리자 그룹에서 삭제할 수 없음", "Unable to add user to group %s" : "그룹 %s에 사용자를 추가할 수 없음", "Unable to remove user from group %s" : "그룹 %s에서 사용자를 삭제할 수 없음", @@ -51,6 +49,8 @@ "Invalid user" : "잘못된 사용자", "Unable to change mail address" : "이메일 주소를 변경할 수 없음", "Email saved" : "이메일 저장됨", + "Your full name has been changed." : "전체 이름이 변경되었습니다.", + "Unable to change full name" : "전체 이름을 변경할 수 없음", "Are you really sure you want add \"{domain}\" as trusted domain?" : "신뢰할 수 있는 도메인 목록에 \"{domain}\"을(를) 추가하시겠습니까?", "Add trusted domain" : "신뢰할 수 있는 도메인 추가", "Migration in progress. Please wait until the migration is finished" : "이전 작업 중입니다. 작업이 완료될 때까지 기다려 주십시오", @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "다음 중 하나 이상의 로캘을 지원하기 위하여 필요한 패키지를 시스템에 설치하는 것을 추천합니다: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "도메인의 루트 디렉터리 아래에 설치되어 있지 않고 시스템 cron을 사용한다면 URL 생성에 문제가 발생할 수도 있습니다. 이 문제를 해결하려면 설치본의 웹 루트 경로에 있는 config.php 파일의 \"overwrite.cli.url\" 옵션을 변경하십시오(제안: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "CLI로 cronjob을 실행할 수 없었습니다. 다음 기술적 오류가 발생했습니다:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "잠금 백엔드로 데이터베이스를 사용하고 있으므로 트랜잭션 기반 파일 잠금을 사용합니다. 더 좋은 성능을 내려면 memcache 기반 잠금 사용을 추천합니다. 더 많은 정보를 보려면 <a target=\"_blank\" href=\"%s\">문서 ↗</a>를 참고하십시오.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "<a target=\"_blank\" href=\"%s\">설치 가이드 ↗</a>를 다시 확인하시고 <a href=\"#log-section\">로그</a>의 오류 및 경고를 확인하십시오.", "All checks passed." : "모든 검사를 통과했습니다.", "Open documentation" : "문서 열기", diff --git a/settings/l10n/lb.js b/settings/l10n/lb.js index 79643dc416a..43f9705baa1 100644 --- a/settings/l10n/lb.js +++ b/settings/l10n/lb.js @@ -5,9 +5,9 @@ OC.L10N.register( "Redis" : "Redis", "Cron" : "Cron", "Log" : "Log", - "Authentication error" : "Authentifikatioun's Fehler", "Language changed" : "Sprooch huet geännert", "Invalid request" : "Ongülteg Requête", + "Authentication error" : "Authentifikatioun's Fehler", "Admins can't remove themself from the admin group" : "Admins kennen sech selwer net aus enger Admin Group läschen.", "Unable to add user to group %s" : "Onmeiglech User an Grupp ze sätzen %s", "Wrong password" : "Falscht Passwuert", diff --git a/settings/l10n/lb.json b/settings/l10n/lb.json index 26af461d141..1d408deb079 100644 --- a/settings/l10n/lb.json +++ b/settings/l10n/lb.json @@ -3,9 +3,9 @@ "Redis" : "Redis", "Cron" : "Cron", "Log" : "Log", - "Authentication error" : "Authentifikatioun's Fehler", "Language changed" : "Sprooch huet geännert", "Invalid request" : "Ongülteg Requête", + "Authentication error" : "Authentifikatioun's Fehler", "Admins can't remove themself from the admin group" : "Admins kennen sech selwer net aus enger Admin Group läschen.", "Unable to add user to group %s" : "Onmeiglech User an Grupp ze sätzen %s", "Wrong password" : "Falscht Passwuert", diff --git a/settings/l10n/lo.js b/settings/l10n/lo.js index 862f93e195f..43069818133 100644 --- a/settings/l10n/lo.js +++ b/settings/l10n/lo.js @@ -3,7 +3,7 @@ OC.L10N.register( { "Sharing" : "ການແບ່ງປັນ", "Log" : "ບັນທຶກ", - "Unable to change full name" : "ບໍ່ສາມາດປ່ຽນຊື່ເຕັມໄດ້", - "Couldn't remove app." : "ບໍ່ສາມາດລຶບແອັບຯອອກໄດ້" + "Couldn't remove app." : "ບໍ່ສາມາດລຶບແອັບຯອອກໄດ້", + "Unable to change full name" : "ບໍ່ສາມາດປ່ຽນຊື່ເຕັມໄດ້" }, "nplurals=1; plural=0;"); diff --git a/settings/l10n/lo.json b/settings/l10n/lo.json index 75515944189..942e427821e 100644 --- a/settings/l10n/lo.json +++ b/settings/l10n/lo.json @@ -1,7 +1,7 @@ { "translations": { "Sharing" : "ການແບ່ງປັນ", "Log" : "ບັນທຶກ", - "Unable to change full name" : "ບໍ່ສາມາດປ່ຽນຊື່ເຕັມໄດ້", - "Couldn't remove app." : "ບໍ່ສາມາດລຶບແອັບຯອອກໄດ້" + "Couldn't remove app." : "ບໍ່ສາມາດລຶບແອັບຯອອກໄດ້", + "Unable to change full name" : "ບໍ່ສາມາດປ່ຽນຊື່ເຕັມໄດ້" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/settings/l10n/lt_LT.js b/settings/l10n/lt_LT.js index c1ec5be2214..41fa2256deb 100644 --- a/settings/l10n/lt_LT.js +++ b/settings/l10n/lt_LT.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Žurnalas", "Tips & tricks" : "Patarimai ir gudrybės", "Updates" : "Atnaujinimai", - "Authentication error" : "Autentikacijos klaida", - "Your full name has been changed." : "Pilnas vardas pakeistas.", - "Unable to change full name" : "Nepavyko pakeisti pilno vardo", "Couldn't remove app." : "Nepavyko pašalinti programėlės.", "Language changed" : "Kalba pakeista", "Invalid request" : "Klaidinga užklausa", + "Authentication error" : "Autentikacijos klaida", "Admins can't remove themself from the admin group" : "Administratoriai negali pašalinti savęs iš administratorių grupės", "Unable to add user to group %s" : "Nepavyko pridėti vartotojo prie grupės %s", "Unable to remove user from group %s" : "Nepavyko ištrinti vartotojo iš grupės %s", @@ -37,6 +35,8 @@ OC.L10N.register( "Your %s account was created" : "Tavo paskyra %s sukurta", "Unable to delete user." : "Nepavyko ištrinti vartotojo.", "Email saved" : "El. paštas išsaugotas", + "Your full name has been changed." : "Pilnas vardas pakeistas.", + "Unable to change full name" : "Nepavyko pakeisti pilno vardo", "All" : "Viskas", "Please wait...." : "Prašome palaukti...", "Error while disabling app" : "Klaida išjungiant programą", diff --git a/settings/l10n/lt_LT.json b/settings/l10n/lt_LT.json index cf389512098..dab231151a3 100644 --- a/settings/l10n/lt_LT.json +++ b/settings/l10n/lt_LT.json @@ -10,12 +10,10 @@ "Log" : "Žurnalas", "Tips & tricks" : "Patarimai ir gudrybės", "Updates" : "Atnaujinimai", - "Authentication error" : "Autentikacijos klaida", - "Your full name has been changed." : "Pilnas vardas pakeistas.", - "Unable to change full name" : "Nepavyko pakeisti pilno vardo", "Couldn't remove app." : "Nepavyko pašalinti programėlės.", "Language changed" : "Kalba pakeista", "Invalid request" : "Klaidinga užklausa", + "Authentication error" : "Autentikacijos klaida", "Admins can't remove themself from the admin group" : "Administratoriai negali pašalinti savęs iš administratorių grupės", "Unable to add user to group %s" : "Nepavyko pridėti vartotojo prie grupės %s", "Unable to remove user from group %s" : "Nepavyko ištrinti vartotojo iš grupės %s", @@ -35,6 +33,8 @@ "Your %s account was created" : "Tavo paskyra %s sukurta", "Unable to delete user." : "Nepavyko ištrinti vartotojo.", "Email saved" : "El. paštas išsaugotas", + "Your full name has been changed." : "Pilnas vardas pakeistas.", + "Unable to change full name" : "Nepavyko pakeisti pilno vardo", "All" : "Viskas", "Please wait...." : "Prašome palaukti...", "Error while disabling app" : "Klaida išjungiant programą", diff --git a/settings/l10n/lv.js b/settings/l10n/lv.js index 30cb20b6452..f5c3214b573 100644 --- a/settings/l10n/lv.js +++ b/settings/l10n/lv.js @@ -6,12 +6,10 @@ OC.L10N.register( "Cron" : "Cron", "Log" : "Žurnāls", "Updates" : "Atjauninājumi", - "Authentication error" : "Autentifikācijas kļūda", - "Your full name has been changed." : "Jūsu pilnais vārds tika mainīts.", - "Unable to change full name" : "Nav iespējams nomainīt jūsu pilno vārdu", "Couldn't remove app." : "Nebija iespējams atslēgt lietoni.", "Language changed" : "Valoda tika nomainīta", "Invalid request" : "Nederīgs vaicājums", + "Authentication error" : "Autentifikācijas kļūda", "Admins can't remove themself from the admin group" : "Administratori nevar izņemt paši sevi no administratoru grupas", "Unable to add user to group %s" : "Nevar pievienot lietotāju grupai %s", "Unable to remove user from group %s" : "Nevar izņemt lietotāju no grupas %s", @@ -40,6 +38,8 @@ OC.L10N.register( "Invalid user" : "Nepareizs lietotājs", "Unable to change mail address" : "Nevar nomainīt e-pasta adresi", "Email saved" : "E-pasts tika saglabāts", + "Your full name has been changed." : "Jūsu pilnais vārds tika mainīts.", + "Unable to change full name" : "Nav iespējams nomainīt jūsu pilno vārdu", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Vai esat pārliecināts, ka vēlaties pievienot \"{domain}\" kā uzticamu domēnu?", "Add trusted domain" : "Pievienot uzticamu domēnu", "Sending..." : "Sūta...", diff --git a/settings/l10n/lv.json b/settings/l10n/lv.json index 18b41b82f97..db564c9ae11 100644 --- a/settings/l10n/lv.json +++ b/settings/l10n/lv.json @@ -4,12 +4,10 @@ "Cron" : "Cron", "Log" : "Žurnāls", "Updates" : "Atjauninājumi", - "Authentication error" : "Autentifikācijas kļūda", - "Your full name has been changed." : "Jūsu pilnais vārds tika mainīts.", - "Unable to change full name" : "Nav iespējams nomainīt jūsu pilno vārdu", "Couldn't remove app." : "Nebija iespējams atslēgt lietoni.", "Language changed" : "Valoda tika nomainīta", "Invalid request" : "Nederīgs vaicājums", + "Authentication error" : "Autentifikācijas kļūda", "Admins can't remove themself from the admin group" : "Administratori nevar izņemt paši sevi no administratoru grupas", "Unable to add user to group %s" : "Nevar pievienot lietotāju grupai %s", "Unable to remove user from group %s" : "Nevar izņemt lietotāju no grupas %s", @@ -38,6 +36,8 @@ "Invalid user" : "Nepareizs lietotājs", "Unable to change mail address" : "Nevar nomainīt e-pasta adresi", "Email saved" : "E-pasts tika saglabāts", + "Your full name has been changed." : "Jūsu pilnais vārds tika mainīts.", + "Unable to change full name" : "Nav iespējams nomainīt jūsu pilno vārdu", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Vai esat pārliecināts, ka vēlaties pievienot \"{domain}\" kā uzticamu domēnu?", "Add trusted domain" : "Pievienot uzticamu domēnu", "Sending..." : "Sūta...", diff --git a/settings/l10n/mk.js b/settings/l10n/mk.js index 65e9d4c09a8..29d21c8f40e 100644 --- a/settings/l10n/mk.js +++ b/settings/l10n/mk.js @@ -10,12 +10,10 @@ OC.L10N.register( "Log" : "Записник", "Tips & tricks" : "Совети и трикови", "Updates" : "Ажурирања", - "Authentication error" : "Грешка во автентикација", - "Your full name has been changed." : "Вашето целосно име е променето.", - "Unable to change full name" : "Не можам да го променам целото име", "Couldn't remove app." : "Не можам да ја отстранам апликацијата.", "Language changed" : "Јазикот е сменет", "Invalid request" : "Неправилно барање", + "Authentication error" : "Грешка во автентикација", "Admins can't remove themself from the admin group" : "Администраторите неможе да се избришат себеси од админ групата", "Unable to add user to group %s" : "Неможе да додадам корисник во група %s", "Unable to remove user from group %s" : "Неможе да избришам корисник од група %s", @@ -28,6 +26,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." : "Групата веќе постои.", @@ -38,9 +37,24 @@ OC.L10N.register( "test email settings" : "провери ги нагодувањата за електронска пошта", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Се случи грешка при праќање на порака. Ве молам проверете ги вашите подесувања. (Error: %s)", "Email sent" : "Е-порака пратена", + "Invalid mail address" : "Неправилна електронска адреса/пошта", + "A user with that name already exists." : "Корисник со ова име веќе постои.", + "Unable to create user." : "Неможе да додадам корисник.", + "Your %s account was created" : "Вашата %s сметка е креирана", + "Unable to delete user." : "Неможам да избришам корисник", + "Forbidden" : "Забрането", + "Invalid user" : "Неправилен корисник", + "Unable to change mail address" : "Не можам да ја променам електронската адреса/пошта", "Email saved" : "Електронската пошта е снимена", + "Your full name has been changed." : "Вашето целосно име е променето.", + "Unable to change full name" : "Не можам да го променам целото име", + "Migration started …" : "Миграцијата е започнаа ...", "Sending..." : "Испраќам...", + "Official" : "Официјален", + "Approved" : "Одобрен", + "Experimental" : "Експериментален", "All" : "Сите", + "No apps found for your version" : "За вашата верзија не се пронајдени апликации", "Please wait...." : "Ве молам почекајте ...", "Error while disabling app" : "Грешка при исклучувањето на апликацијата", "Disable" : "Оневозможи", @@ -49,23 +63,34 @@ OC.L10N.register( "Updating...." : "Надградувам ...", "Error while updating app" : "Грешка додека ја надградувам апликацијата", "Updated" : "Надграден", + "Uninstalling ...." : "Деинсталирам ...", + "Error while uninstalling app" : "Грешка при деинсталација на апликацијата", + "Uninstall" : "Деинсталирај", + "App update" : "Надградба на апликацијата", + "An error occurred: {message}" : "Се случи грешка: {message}", "Select a profile picture" : "Одбери фотографија за профилот", "Very weak password" : "Многу слаба лозинка", "Weak password" : "Слаба лозинка", "So-so password" : "Така така лозинка", "Good password" : "Добра лозинка", "Strong password" : "Јака лозинка", + "Valid until {date}" : "Валидно до {date}", "Delete" : "Избриши", "Groups" : "Групи", + "Unable to delete {objName}" : "Не можам да избришам {objName}", "Error creating group" : "Грешка при креирање на група", "A valid group name must be provided" : "Мора да се обезбеди валидно име на група", "undo" : "врати", + "no group" : "нема група", "never" : "никогаш", + "deleted {userName}" : "избришан {userName}", "add group" : "додади група", "A valid username must be provided" : "Мора да се обезбеди валидно корисничко име ", "Error creating user" : "Грешка при креирање на корисникот", "A valid password must be provided" : "Мора да се обезбеди валидна лозинка", "__language_name__" : "__language_name__", + "Sync clients" : "Клиенти за синхронизација", + "Personal info" : "Лични податоци", "SSL root certificates" : "SSL root сертификати", "Info, warnings, errors and fatal issues" : "Информации, предупредувања, грешки и фатални работи", "Warnings, errors and fatal issues" : "Предупредувања, грешки и фатални работи", @@ -77,6 +102,7 @@ OC.L10N.register( "NT LAN Manager" : "NT LAN Менаџер", "SSL" : "SSL", "TLS" : "TLS", + "Open documentation" : "Отвори ја документацијата", "Allow apps to use the Share API" : "Дозволете апликациите да го користат API-то за споделување", "Allow users to share via link" : "Допушти корисниците да споделуваат со линкови", "Enforce password protection" : "Наметни заштита на лозинка", diff --git a/settings/l10n/mk.json b/settings/l10n/mk.json index 607808c7367..b3dc7a8ceef 100644 --- a/settings/l10n/mk.json +++ b/settings/l10n/mk.json @@ -8,12 +8,10 @@ "Log" : "Записник", "Tips & tricks" : "Совети и трикови", "Updates" : "Ажурирања", - "Authentication error" : "Грешка во автентикација", - "Your full name has been changed." : "Вашето целосно име е променето.", - "Unable to change full name" : "Не можам да го променам целото име", "Couldn't remove app." : "Не можам да ја отстранам апликацијата.", "Language changed" : "Јазикот е сменет", "Invalid request" : "Неправилно барање", + "Authentication error" : "Грешка во автентикација", "Admins can't remove themself from the admin group" : "Администраторите неможе да се избришат себеси од админ групата", "Unable to add user to group %s" : "Неможе да додадам корисник во група %s", "Unable to remove user from group %s" : "Неможе да избришам корисник од група %s", @@ -26,6 +24,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." : "Групата веќе постои.", @@ -36,9 +35,24 @@ "test email settings" : "провери ги нагодувањата за електронска пошта", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Се случи грешка при праќање на порака. Ве молам проверете ги вашите подесувања. (Error: %s)", "Email sent" : "Е-порака пратена", + "Invalid mail address" : "Неправилна електронска адреса/пошта", + "A user with that name already exists." : "Корисник со ова име веќе постои.", + "Unable to create user." : "Неможе да додадам корисник.", + "Your %s account was created" : "Вашата %s сметка е креирана", + "Unable to delete user." : "Неможам да избришам корисник", + "Forbidden" : "Забрането", + "Invalid user" : "Неправилен корисник", + "Unable to change mail address" : "Не можам да ја променам електронската адреса/пошта", "Email saved" : "Електронската пошта е снимена", + "Your full name has been changed." : "Вашето целосно име е променето.", + "Unable to change full name" : "Не можам да го променам целото име", + "Migration started …" : "Миграцијата е започнаа ...", "Sending..." : "Испраќам...", + "Official" : "Официјален", + "Approved" : "Одобрен", + "Experimental" : "Експериментален", "All" : "Сите", + "No apps found for your version" : "За вашата верзија не се пронајдени апликации", "Please wait...." : "Ве молам почекајте ...", "Error while disabling app" : "Грешка при исклучувањето на апликацијата", "Disable" : "Оневозможи", @@ -47,23 +61,34 @@ "Updating...." : "Надградувам ...", "Error while updating app" : "Грешка додека ја надградувам апликацијата", "Updated" : "Надграден", + "Uninstalling ...." : "Деинсталирам ...", + "Error while uninstalling app" : "Грешка при деинсталација на апликацијата", + "Uninstall" : "Деинсталирај", + "App update" : "Надградба на апликацијата", + "An error occurred: {message}" : "Се случи грешка: {message}", "Select a profile picture" : "Одбери фотографија за профилот", "Very weak password" : "Многу слаба лозинка", "Weak password" : "Слаба лозинка", "So-so password" : "Така така лозинка", "Good password" : "Добра лозинка", "Strong password" : "Јака лозинка", + "Valid until {date}" : "Валидно до {date}", "Delete" : "Избриши", "Groups" : "Групи", + "Unable to delete {objName}" : "Не можам да избришам {objName}", "Error creating group" : "Грешка при креирање на група", "A valid group name must be provided" : "Мора да се обезбеди валидно име на група", "undo" : "врати", + "no group" : "нема група", "never" : "никогаш", + "deleted {userName}" : "избришан {userName}", "add group" : "додади група", "A valid username must be provided" : "Мора да се обезбеди валидно корисничко име ", "Error creating user" : "Грешка при креирање на корисникот", "A valid password must be provided" : "Мора да се обезбеди валидна лозинка", "__language_name__" : "__language_name__", + "Sync clients" : "Клиенти за синхронизација", + "Personal info" : "Лични податоци", "SSL root certificates" : "SSL root сертификати", "Info, warnings, errors and fatal issues" : "Информации, предупредувања, грешки и фатални работи", "Warnings, errors and fatal issues" : "Предупредувања, грешки и фатални работи", @@ -75,6 +100,7 @@ "NT LAN Manager" : "NT LAN Менаџер", "SSL" : "SSL", "TLS" : "TLS", + "Open documentation" : "Отвори ја документацијата", "Allow apps to use the Share API" : "Дозволете апликациите да го користат API-то за споделување", "Allow users to share via link" : "Допушти корисниците да споделуваат со линкови", "Enforce password protection" : "Наметни заштита на лозинка", diff --git a/settings/l10n/mn.js b/settings/l10n/mn.js index 30c8a71df7a..56695ede7ae 100644 --- a/settings/l10n/mn.js +++ b/settings/l10n/mn.js @@ -4,14 +4,14 @@ OC.L10N.register( "Sharing" : "Түгээлт", "Cron" : "Крон", "Log" : "Лог бичилт", - "Authentication error" : "Нотолгооны алдаа", - "Your full name has been changed." : "Таны бүтэн нэр солигдлоо.", - "Unable to change full name" : "Бүтэн нэр солих боломжгүй байна", "Couldn't remove app." : "Апп-ыг устгаж чадсангүй", "Language changed" : "Хэл солигдлоо", "Invalid request" : "Буруу хүсэлт", + "Authentication error" : "Нотолгооны алдаа", "Admins can't remove themself from the admin group" : "Админууд өөрсдийгөө Админ бүлгээс хасаж чадахгүй", "Wrong password" : "Нууц үг буруу", + "Your full name has been changed." : "Таны бүтэн нэр солигдлоо.", + "Unable to change full name" : "Бүтэн нэр солих боломжгүй байна", "All" : "Бүгд", "Password" : "Нууц үг", "Email" : "И-мэйл", diff --git a/settings/l10n/mn.json b/settings/l10n/mn.json index 95400f3893c..560c7c9cb2e 100644 --- a/settings/l10n/mn.json +++ b/settings/l10n/mn.json @@ -2,14 +2,14 @@ "Sharing" : "Түгээлт", "Cron" : "Крон", "Log" : "Лог бичилт", - "Authentication error" : "Нотолгооны алдаа", - "Your full name has been changed." : "Таны бүтэн нэр солигдлоо.", - "Unable to change full name" : "Бүтэн нэр солих боломжгүй байна", "Couldn't remove app." : "Апп-ыг устгаж чадсангүй", "Language changed" : "Хэл солигдлоо", "Invalid request" : "Буруу хүсэлт", + "Authentication error" : "Нотолгооны алдаа", "Admins can't remove themself from the admin group" : "Админууд өөрсдийгөө Админ бүлгээс хасаж чадахгүй", "Wrong password" : "Нууц үг буруу", + "Your full name has been changed." : "Таны бүтэн нэр солигдлоо.", + "Unable to change full name" : "Бүтэн нэр солих боломжгүй байна", "All" : "Бүгд", "Password" : "Нууц үг", "Email" : "И-мэйл", diff --git a/settings/l10n/ms_MY.js b/settings/l10n/ms_MY.js index db26c502d3e..a4c28176fc5 100644 --- a/settings/l10n/ms_MY.js +++ b/settings/l10n/ms_MY.js @@ -2,9 +2,9 @@ OC.L10N.register( "settings", { "Log" : "Log", - "Authentication error" : "Ralat pengesahan", "Language changed" : "Bahasa diubah", "Invalid request" : "Permintaan tidak sah", + "Authentication error" : "Ralat pengesahan", "Email saved" : "Emel disimpan", "Disable" : "Nyahaktif", "Enable" : "Aktif", diff --git a/settings/l10n/ms_MY.json b/settings/l10n/ms_MY.json index 342d679ecb4..9ee8415ef8f 100644 --- a/settings/l10n/ms_MY.json +++ b/settings/l10n/ms_MY.json @@ -1,8 +1,8 @@ { "translations": { "Log" : "Log", - "Authentication error" : "Ralat pengesahan", "Language changed" : "Bahasa diubah", "Invalid request" : "Permintaan tidak sah", + "Authentication error" : "Ralat pengesahan", "Email saved" : "Emel disimpan", "Disable" : "Nyahaktif", "Enable" : "Aktif", diff --git a/settings/l10n/my_MM.js b/settings/l10n/my_MM.js index 88ad33d0057..f95325bb8db 100644 --- a/settings/l10n/my_MM.js +++ b/settings/l10n/my_MM.js @@ -1,8 +1,8 @@ OC.L10N.register( "settings", { - "Authentication error" : "ခွင့်ပြုချက်မအောင်မြင်", "Invalid request" : "တောင်းဆိုချက်မမှန်ကန်ပါ", + "Authentication error" : "ခွင့်ပြုချက်မအောင်မြင်", "Password" : "စကားဝှက်", "New password" : "စကားဝှက်အသစ်", "Cancel" : "ပယ်ဖျက်မည်", diff --git a/settings/l10n/my_MM.json b/settings/l10n/my_MM.json index 0ded957958f..503f7fcb4d9 100644 --- a/settings/l10n/my_MM.json +++ b/settings/l10n/my_MM.json @@ -1,6 +1,6 @@ { "translations": { - "Authentication error" : "ခွင့်ပြုချက်မအောင်မြင်", "Invalid request" : "တောင်းဆိုချက်မမှန်ကန်ပါ", + "Authentication error" : "ခွင့်ပြုချက်မအောင်မြင်", "Password" : "စကားဝှက်", "New password" : "စကားဝှက်အသစ်", "Cancel" : "ပယ်ဖျက်မည်", diff --git a/settings/l10n/nb_NO.js b/settings/l10n/nb_NO.js index 0cea17dbb48..9d02c085f05 100644 --- a/settings/l10n/nb_NO.js +++ b/settings/l10n/nb_NO.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Logg", "Tips & tricks" : "Tips og triks", "Updates" : "Oppdateringer", - "Authentication error" : "Autentiseringsfeil", - "Your full name has been changed." : "Ditt fulle navn er blitt endret.", - "Unable to change full name" : "Klarte ikke å endre fullt navn", "Couldn't remove app." : "Klarte ikke å fjerne app.", "Language changed" : "Språk endret", "Invalid request" : "Ugyldig forespørsel", + "Authentication error" : "Autentiseringsfeil", "Admins can't remove themself from the admin group" : "Admin kan ikke flytte seg selv fra admingruppen", "Unable to add user to group %s" : "Kan ikke legge bruker til gruppen %s", "Unable to remove user from group %s" : "Kan ikke slette bruker fra gruppen %s", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "Ugyldig bruker", "Unable to change mail address" : "Kan ikke endre epost-adresse", "Email saved" : "Epost lagret", + "Your full name has been changed." : "Ditt fulle navn er blitt endret.", + "Unable to change full name" : "Klarte ikke å endre fullt navn", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ønsker du virkelig å legge til \"{domain}\" som tiltrodd domene?", "Add trusted domain" : "Legg til et tiltrodd domene", "Migration in progress. Please wait until the migration is finished" : "Migrering utføres. Vent til migreringen er ferdig.", @@ -134,7 +134,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Vi anbefaler sterkt å installere de påkrevde pakkene på systemet ditt for å støtte en av følgende nasjonale innstillinger: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Hvis installasjonen din ikke er installert i roten av domenet og bruker systemets cron, kan det bli problemer med URL-genereringen. For å unngå disse problemene, sett \"overwrite.cli.url\" i filen config.php til web-roten for installasjonen din (Foreslått: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Det var ikke mulig å kjøre cron-jobben vi CLI. Følgende tekniske feil oppstod:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Transaksjonsbasert fil-låsing bruker databasen som låsemekanisme. For best ytelse anbefales det å konfigurerer en memcache for låsing. Se <a target=\"_blank\" href=\"%s\">dokumentasjonen ↗</a> for mer informasjon.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Vennligst dobbeltsjekk <a target=\"_blank\" href=\"%s\">Installasjonsveiledningene ↗</a> og se etter feil og advarsler i <a href=\"#log-section\">loggen</a>.", "All checks passed." : "Alle sjekker bestått.", "Open documentation" : "Åpne dokumentasjonen", diff --git a/settings/l10n/nb_NO.json b/settings/l10n/nb_NO.json index 0eca73177d3..7a6e0c6867d 100644 --- a/settings/l10n/nb_NO.json +++ b/settings/l10n/nb_NO.json @@ -10,12 +10,10 @@ "Log" : "Logg", "Tips & tricks" : "Tips og triks", "Updates" : "Oppdateringer", - "Authentication error" : "Autentiseringsfeil", - "Your full name has been changed." : "Ditt fulle navn er blitt endret.", - "Unable to change full name" : "Klarte ikke å endre fullt navn", "Couldn't remove app." : "Klarte ikke å fjerne app.", "Language changed" : "Språk endret", "Invalid request" : "Ugyldig forespørsel", + "Authentication error" : "Autentiseringsfeil", "Admins can't remove themself from the admin group" : "Admin kan ikke flytte seg selv fra admingruppen", "Unable to add user to group %s" : "Kan ikke legge bruker til gruppen %s", "Unable to remove user from group %s" : "Kan ikke slette bruker fra gruppen %s", @@ -51,6 +49,8 @@ "Invalid user" : "Ugyldig bruker", "Unable to change mail address" : "Kan ikke endre epost-adresse", "Email saved" : "Epost lagret", + "Your full name has been changed." : "Ditt fulle navn er blitt endret.", + "Unable to change full name" : "Klarte ikke å endre fullt navn", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ønsker du virkelig å legge til \"{domain}\" som tiltrodd domene?", "Add trusted domain" : "Legg til et tiltrodd domene", "Migration in progress. Please wait until the migration is finished" : "Migrering utføres. Vent til migreringen er ferdig.", @@ -132,7 +132,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Vi anbefaler sterkt å installere de påkrevde pakkene på systemet ditt for å støtte en av følgende nasjonale innstillinger: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Hvis installasjonen din ikke er installert i roten av domenet og bruker systemets cron, kan det bli problemer med URL-genereringen. For å unngå disse problemene, sett \"overwrite.cli.url\" i filen config.php til web-roten for installasjonen din (Foreslått: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Det var ikke mulig å kjøre cron-jobben vi CLI. Følgende tekniske feil oppstod:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Transaksjonsbasert fil-låsing bruker databasen som låsemekanisme. For best ytelse anbefales det å konfigurerer en memcache for låsing. Se <a target=\"_blank\" href=\"%s\">dokumentasjonen ↗</a> for mer informasjon.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Vennligst dobbeltsjekk <a target=\"_blank\" href=\"%s\">Installasjonsveiledningene ↗</a> og se etter feil og advarsler i <a href=\"#log-section\">loggen</a>.", "All checks passed." : "Alle sjekker bestått.", "Open documentation" : "Åpne dokumentasjonen", diff --git a/settings/l10n/nl.js b/settings/l10n/nl.js index f28a9f3b17e..3162fc61305 100644 --- a/settings/l10n/nl.js +++ b/settings/l10n/nl.js @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "We adviseren met klem om de noodzakelijke pakketten op uw systeem te installeren om een van de volgende talen te ondersteunen: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Als uw installatie niet in de hoofddirectory van het domein staat, maar wel cron gebruikt, dan kunnen er problemen ontstaan bij het genereren van URL's. Om deze problemen te voorkomen zou u de \"overwrite.cli.url\" optie in config.php moeten instellen op het webroot pad van uw ownCloud (aanbevolen: \"%s\") ", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "het was niet mogelijk om de cronjob via CLI uit te voeren. De volgende technische problemen traden op:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Transactionele bestandslocking gebruikt de database als blokkeermechanisme. Voor de beste prestaties wordt geadviseerd om een memcache voor locking te configureren. Zie de <a target=\"_blank\" href=\"%s\">documentatie ↗</a> voor meer informatie.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Lees de <a href='%s'>installatie handleiding</a> goed door en controleer op fouten en waarschuwingen in de <a href=\"#log-section\">logging</a>.", "All checks passed." : "Alle checks geslaagd", "Open documentation" : "Open documentatie", diff --git a/settings/l10n/nl.json b/settings/l10n/nl.json index b9a7baadde1..d629588a401 100644 --- a/settings/l10n/nl.json +++ b/settings/l10n/nl.json @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "We adviseren met klem om de noodzakelijke pakketten op uw systeem te installeren om een van de volgende talen te ondersteunen: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Als uw installatie niet in de hoofddirectory van het domein staat, maar wel cron gebruikt, dan kunnen er problemen ontstaan bij het genereren van URL's. Om deze problemen te voorkomen zou u de \"overwrite.cli.url\" optie in config.php moeten instellen op het webroot pad van uw ownCloud (aanbevolen: \"%s\") ", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "het was niet mogelijk om de cronjob via CLI uit te voeren. De volgende technische problemen traden op:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Transactionele bestandslocking gebruikt de database als blokkeermechanisme. Voor de beste prestaties wordt geadviseerd om een memcache voor locking te configureren. Zie de <a target=\"_blank\" href=\"%s\">documentatie ↗</a> voor meer informatie.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Lees de <a href='%s'>installatie handleiding</a> goed door en controleer op fouten en waarschuwingen in de <a href=\"#log-section\">logging</a>.", "All checks passed." : "Alle checks geslaagd", "Open documentation" : "Open documentatie", diff --git a/settings/l10n/nn_NO.js b/settings/l10n/nn_NO.js index 7539ca7f099..62871d4ac2d 100644 --- a/settings/l10n/nn_NO.js +++ b/settings/l10n/nn_NO.js @@ -4,9 +4,9 @@ OC.L10N.register( "Sharing" : "Deling", "Cron" : "Cron", "Log" : "Logg", - "Authentication error" : "Autentiseringsfeil", "Language changed" : "Språk endra", "Invalid request" : "Ugyldig førespurnad", + "Authentication error" : "Autentiseringsfeil", "Admins can't remove themself from the admin group" : "Administratorar kan ikkje fjerna seg sjølve frå admin-gruppa", "Unable to add user to group %s" : "Klarte ikkje leggja til brukaren til gruppa %s", "Unable to remove user from group %s" : "Klarte ikkje fjerna brukaren frå gruppa %s", diff --git a/settings/l10n/nn_NO.json b/settings/l10n/nn_NO.json index 8d30f4c3612..02497c840a9 100644 --- a/settings/l10n/nn_NO.json +++ b/settings/l10n/nn_NO.json @@ -2,9 +2,9 @@ "Sharing" : "Deling", "Cron" : "Cron", "Log" : "Logg", - "Authentication error" : "Autentiseringsfeil", "Language changed" : "Språk endra", "Invalid request" : "Ugyldig førespurnad", + "Authentication error" : "Autentiseringsfeil", "Admins can't remove themself from the admin group" : "Administratorar kan ikkje fjerna seg sjølve frå admin-gruppa", "Unable to add user to group %s" : "Klarte ikkje leggja til brukaren til gruppa %s", "Unable to remove user from group %s" : "Klarte ikkje fjerna brukaren frå gruppa %s", diff --git a/settings/l10n/oc.js b/settings/l10n/oc.js index 38055739443..dc6acaf5dee 100644 --- a/settings/l10n/oc.js +++ b/settings/l10n/oc.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Log", "Tips & tricks" : "Estècs e astúcias", "Updates" : "Mesas a jorn", - "Authentication error" : "Error d'autentificacion", - "Your full name has been changed." : "Vòstre nom complet es estat modificat.", - "Unable to change full name" : "Impossible de cambiar lo nom complet", "Couldn't remove app." : "Impossible de suprimir l'aplicacion.", "Language changed" : "Lenga cambiada", "Invalid request" : "Requèsta invalida", + "Authentication error" : "Error d'autentificacion", "Admins can't remove themself from the admin group" : "Los administrators se pòdon pas levar eles-meteisses del grop admin", "Unable to add user to group %s" : "Impossible d'apondre l'utilizaire al grop %s", "Unable to remove user from group %s" : "Impossible de suprimir l'utilizaire del grop %s", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "Utilizaire invalid", "Unable to change mail address" : "Impossible de modificar l'adreça de corrièl", "Email saved" : "Email salvat", + "Your full name has been changed." : "Vòstre nom complet es estat modificat.", + "Unable to change full name" : "Impossible de cambiar lo nom complet", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Sètz segur que volètz apondre \"{domain}\" coma domeni de fisança ?", "Add trusted domain" : "Apondre un domeni de fisança", "Migration in progress. Please wait until the migration is finished" : "Migracion en cors. Esperatz qu'aquela s'acabe", @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Vos recomandam d'installar sus vòstre sistèma los paquets requesits a la presa en carga d'un dels paramètres regionals seguents : %s", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Se vòstra installacion es pas estada efectuada a la raiç del domeni e qu'utiliza lo cron del sistèma, i pòt aver de problèmas amb la generacion d'URL. Per los evitar, configuratz l'opcion \"overwrite.cli.url\" de vòstre fichièr config.php amb lo camin de la raiç de vòstra installacion (suggerit : \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Lo prètzfach cron a pas pogut s'executar via CLI. Aquelas errors tecnicas son aparegudas :", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Lo verrolhatge transaccional de fichièrs utiliza la banca de donadas. Per obténer de performànciasmelhor il est recommandé d'utiliser plutôt memcache. Consultez la <a target=\"_blank\" href=\"%s\">documentation ↗</a> pour plus d'informations.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Consultatz los <a target=\"_blank\" href=\"%s\">guidas d'installacion ↗</a>, e cercatz d'errors o avertiments dins <a href=\"#log-section\">los logs</a>.", "All checks passed." : "Totes los tèsts an capitat.", "Open documentation" : "Veire la documentacion", diff --git a/settings/l10n/oc.json b/settings/l10n/oc.json index e60cfb45ed3..30fa894cae1 100644 --- a/settings/l10n/oc.json +++ b/settings/l10n/oc.json @@ -10,12 +10,10 @@ "Log" : "Log", "Tips & tricks" : "Estècs e astúcias", "Updates" : "Mesas a jorn", - "Authentication error" : "Error d'autentificacion", - "Your full name has been changed." : "Vòstre nom complet es estat modificat.", - "Unable to change full name" : "Impossible de cambiar lo nom complet", "Couldn't remove app." : "Impossible de suprimir l'aplicacion.", "Language changed" : "Lenga cambiada", "Invalid request" : "Requèsta invalida", + "Authentication error" : "Error d'autentificacion", "Admins can't remove themself from the admin group" : "Los administrators se pòdon pas levar eles-meteisses del grop admin", "Unable to add user to group %s" : "Impossible d'apondre l'utilizaire al grop %s", "Unable to remove user from group %s" : "Impossible de suprimir l'utilizaire del grop %s", @@ -51,6 +49,8 @@ "Invalid user" : "Utilizaire invalid", "Unable to change mail address" : "Impossible de modificar l'adreça de corrièl", "Email saved" : "Email salvat", + "Your full name has been changed." : "Vòstre nom complet es estat modificat.", + "Unable to change full name" : "Impossible de cambiar lo nom complet", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Sètz segur que volètz apondre \"{domain}\" coma domeni de fisança ?", "Add trusted domain" : "Apondre un domeni de fisança", "Migration in progress. Please wait until the migration is finished" : "Migracion en cors. Esperatz qu'aquela s'acabe", @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Vos recomandam d'installar sus vòstre sistèma los paquets requesits a la presa en carga d'un dels paramètres regionals seguents : %s", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Se vòstra installacion es pas estada efectuada a la raiç del domeni e qu'utiliza lo cron del sistèma, i pòt aver de problèmas amb la generacion d'URL. Per los evitar, configuratz l'opcion \"overwrite.cli.url\" de vòstre fichièr config.php amb lo camin de la raiç de vòstra installacion (suggerit : \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Lo prètzfach cron a pas pogut s'executar via CLI. Aquelas errors tecnicas son aparegudas :", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Lo verrolhatge transaccional de fichièrs utiliza la banca de donadas. Per obténer de performànciasmelhor il est recommandé d'utiliser plutôt memcache. Consultez la <a target=\"_blank\" href=\"%s\">documentation ↗</a> pour plus d'informations.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Consultatz los <a target=\"_blank\" href=\"%s\">guidas d'installacion ↗</a>, e cercatz d'errors o avertiments dins <a href=\"#log-section\">los logs</a>.", "All checks passed." : "Totes los tèsts an capitat.", "Open documentation" : "Veire la documentacion", diff --git a/settings/l10n/pl.js b/settings/l10n/pl.js index 862d56fc848..a7535c540a9 100644 --- a/settings/l10n/pl.js +++ b/settings/l10n/pl.js @@ -7,12 +7,10 @@ OC.L10N.register( "Cron" : "Cron", "Log" : "Logi", "Updates" : "Aktualizacje", - "Authentication error" : "Błąd uwierzytelniania", - "Your full name has been changed." : "Twoja pełna nazwa została zmieniona.", - "Unable to change full name" : "Nie można zmienić pełnej nazwy", "Couldn't remove app." : "Nie można usunąć aplikacji.", "Language changed" : "Zmieniono język", "Invalid request" : "Nieprawidłowe żądanie", + "Authentication error" : "Błąd uwierzytelniania", "Admins can't remove themself from the admin group" : "Administratorzy nie mogą usunąć siebie samych z grupy administratorów", "Unable to add user to group %s" : "Nie można dodać użytkownika do grupy %s", "Unable to remove user from group %s" : "Nie można usunąć użytkownika z grupy %s", @@ -40,6 +38,8 @@ OC.L10N.register( "Invalid user" : "Nieprawidłowy użytkownik", "Unable to change mail address" : "Nie można zmienić adresu email", "Email saved" : "E-mail zapisany", + "Your full name has been changed." : "Twoja pełna nazwa została zmieniona.", + "Unable to change full name" : "Nie można zmienić pełnej nazwy", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Czy jesteś pewien/pewna że chcesz dodać \"{domain}\" jako zaufaną domenę?", "Add trusted domain" : "Dodaj zaufaną domenę", "Sending..." : "Wysyłam...", diff --git a/settings/l10n/pl.json b/settings/l10n/pl.json index db527fa4517..f14377903d2 100644 --- a/settings/l10n/pl.json +++ b/settings/l10n/pl.json @@ -5,12 +5,10 @@ "Cron" : "Cron", "Log" : "Logi", "Updates" : "Aktualizacje", - "Authentication error" : "Błąd uwierzytelniania", - "Your full name has been changed." : "Twoja pełna nazwa została zmieniona.", - "Unable to change full name" : "Nie można zmienić pełnej nazwy", "Couldn't remove app." : "Nie można usunąć aplikacji.", "Language changed" : "Zmieniono język", "Invalid request" : "Nieprawidłowe żądanie", + "Authentication error" : "Błąd uwierzytelniania", "Admins can't remove themself from the admin group" : "Administratorzy nie mogą usunąć siebie samych z grupy administratorów", "Unable to add user to group %s" : "Nie można dodać użytkownika do grupy %s", "Unable to remove user from group %s" : "Nie można usunąć użytkownika z grupy %s", @@ -38,6 +36,8 @@ "Invalid user" : "Nieprawidłowy użytkownik", "Unable to change mail address" : "Nie można zmienić adresu email", "Email saved" : "E-mail zapisany", + "Your full name has been changed." : "Twoja pełna nazwa została zmieniona.", + "Unable to change full name" : "Nie można zmienić pełnej nazwy", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Czy jesteś pewien/pewna że chcesz dodać \"{domain}\" jako zaufaną domenę?", "Add trusted domain" : "Dodaj zaufaną domenę", "Sending..." : "Wysyłam...", diff --git a/settings/l10n/pt_BR.js b/settings/l10n/pt_BR.js index 1e33ffb10cc..e7ea47e6b7d 100644 --- a/settings/l10n/pt_BR.js +++ b/settings/l10n/pt_BR.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Registro", "Tips & tricks" : "Dicas & Truques", "Updates" : "Atualizações", - "Authentication error" : "Erro de autenticação", - "Your full name has been changed." : "Seu nome completo foi alterado.", - "Unable to change full name" : "Não é possível alterar o nome completo", "Couldn't remove app." : "Não foi possível remover aplicativos.", "Language changed" : "Idioma alterado", "Invalid request" : "Pedido inválido", + "Authentication error" : "Erro de autenticação", "Admins can't remove themself from the admin group" : "Administradores não pode remover a si mesmos do grupo de administração", "Unable to add user to group %s" : "Não foi possível adicionar usuário ao grupo %s", "Unable to remove user from group %s" : "Não foi possível remover usuário do grupo %s", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "Usuário inválido", "Unable to change mail address" : "Não é possível trocar o endereço de email", "Email saved" : "E-mail salvo", + "Your full name has been changed." : "Seu nome completo foi alterado.", + "Unable to change full name" : "Não é possível alterar o nome completo", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Você tem certeza que você quer adicionar \"{domain}\" como domínio confiável?", "Add trusted domain" : "Adicionar domínio confiável", "Migration in progress. Please wait until the migration is finished" : "Migração em progresso. Por favor aguarde até que a migração seja finalizada", @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Nós sugerimos a instalação dos pacotes necessários em seu sistema para suportar um dos seguintes locais: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Se a sua instalação não estiver instalada na raiz do domínio e usa cron do sistema, pode haver problemas com a geração de URL. Para evitar esses problemas, por favor, defina a opção \"overwrite.cli.url\" em seu arquivo config.php para o caminho webroot de sua instalação (Sugestão: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Não foi possível executar o cron via CLI. Os seguintes erros técnicos têm aparecido:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Bloqueio de arquivos transacional está usando o banco de dados como bloqueio de back-end, para o melhor o desempenho é aconselhável configurar um cache de memória para bloqueio. Veja a <a target=\"_blank\" href=\"%s\">documentação ↗</a> para mais informação.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Por favor, verifique os <a target=\"_blank\" href=\"%s\">guias de instalação ↗</a>, e verificar se há erros ou avisos no <a href=\"#log-section\">log</a>.", "All checks passed." : "Todas as verificações passaram.", "Open documentation" : "Abrir documentação", diff --git a/settings/l10n/pt_BR.json b/settings/l10n/pt_BR.json index eaaf84d3739..89fd6bbbb19 100644 --- a/settings/l10n/pt_BR.json +++ b/settings/l10n/pt_BR.json @@ -10,12 +10,10 @@ "Log" : "Registro", "Tips & tricks" : "Dicas & Truques", "Updates" : "Atualizações", - "Authentication error" : "Erro de autenticação", - "Your full name has been changed." : "Seu nome completo foi alterado.", - "Unable to change full name" : "Não é possível alterar o nome completo", "Couldn't remove app." : "Não foi possível remover aplicativos.", "Language changed" : "Idioma alterado", "Invalid request" : "Pedido inválido", + "Authentication error" : "Erro de autenticação", "Admins can't remove themself from the admin group" : "Administradores não pode remover a si mesmos do grupo de administração", "Unable to add user to group %s" : "Não foi possível adicionar usuário ao grupo %s", "Unable to remove user from group %s" : "Não foi possível remover usuário do grupo %s", @@ -51,6 +49,8 @@ "Invalid user" : "Usuário inválido", "Unable to change mail address" : "Não é possível trocar o endereço de email", "Email saved" : "E-mail salvo", + "Your full name has been changed." : "Seu nome completo foi alterado.", + "Unable to change full name" : "Não é possível alterar o nome completo", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Você tem certeza que você quer adicionar \"{domain}\" como domínio confiável?", "Add trusted domain" : "Adicionar domínio confiável", "Migration in progress. Please wait until the migration is finished" : "Migração em progresso. Por favor aguarde até que a migração seja finalizada", @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Nós sugerimos a instalação dos pacotes necessários em seu sistema para suportar um dos seguintes locais: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Se a sua instalação não estiver instalada na raiz do domínio e usa cron do sistema, pode haver problemas com a geração de URL. Para evitar esses problemas, por favor, defina a opção \"overwrite.cli.url\" em seu arquivo config.php para o caminho webroot de sua instalação (Sugestão: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Não foi possível executar o cron via CLI. Os seguintes erros técnicos têm aparecido:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Bloqueio de arquivos transacional está usando o banco de dados como bloqueio de back-end, para o melhor o desempenho é aconselhável configurar um cache de memória para bloqueio. Veja a <a target=\"_blank\" href=\"%s\">documentação ↗</a> para mais informação.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Por favor, verifique os <a target=\"_blank\" href=\"%s\">guias de instalação ↗</a>, e verificar se há erros ou avisos no <a href=\"#log-section\">log</a>.", "All checks passed." : "Todas as verificações passaram.", "Open documentation" : "Abrir documentação", diff --git a/settings/l10n/pt_PT.js b/settings/l10n/pt_PT.js index b0f25796901..37126e2e779 100644 --- a/settings/l10n/pt_PT.js +++ b/settings/l10n/pt_PT.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Registo", "Tips & tricks" : "Dicas e truqes", "Updates" : "Atualizações", - "Authentication error" : "Erro na autenticação", - "Your full name has been changed." : "O seu nome completo foi alterado.", - "Unable to change full name" : "Não foi possível alterar o seu nome completo", "Couldn't remove app." : "Não foi possível remover a aplicação.", "Language changed" : "Idioma alterado", "Invalid request" : "Pedido Inválido", + "Authentication error" : "Erro na autenticação", "Admins can't remove themself from the admin group" : "Os administradores não se podem remover a eles próprios do grupo 'admin'.", "Unable to add user to group %s" : "Não é possível adicionar o utilizador ao grupo %s", "Unable to remove user from group %s" : "Não é possível remover o utilizador do grupo %s", @@ -51,6 +49,8 @@ OC.L10N.register( "Invalid user" : "Utilizador inválido", "Unable to change mail address" : "Não foi possível alterar o teu endereço de email", "Email saved" : "E-mail guardado", + "Your full name has been changed." : "O seu nome completo foi alterado.", + "Unable to change full name" : "Não foi possível alterar o seu nome completo", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Você tem certeza que quer adicionar \"{domain}\" como domínio confiável?", "Add trusted domain" : "Adicionar domínio confiável ", "Migration in progress. Please wait until the migration is finished" : "Migração em progresso. Por favor, aguarde até que a mesma esteja concluída..", diff --git a/settings/l10n/pt_PT.json b/settings/l10n/pt_PT.json index 4df54b81008..89357332ce5 100644 --- a/settings/l10n/pt_PT.json +++ b/settings/l10n/pt_PT.json @@ -10,12 +10,10 @@ "Log" : "Registo", "Tips & tricks" : "Dicas e truqes", "Updates" : "Atualizações", - "Authentication error" : "Erro na autenticação", - "Your full name has been changed." : "O seu nome completo foi alterado.", - "Unable to change full name" : "Não foi possível alterar o seu nome completo", "Couldn't remove app." : "Não foi possível remover a aplicação.", "Language changed" : "Idioma alterado", "Invalid request" : "Pedido Inválido", + "Authentication error" : "Erro na autenticação", "Admins can't remove themself from the admin group" : "Os administradores não se podem remover a eles próprios do grupo 'admin'.", "Unable to add user to group %s" : "Não é possível adicionar o utilizador ao grupo %s", "Unable to remove user from group %s" : "Não é possível remover o utilizador do grupo %s", @@ -49,6 +47,8 @@ "Invalid user" : "Utilizador inválido", "Unable to change mail address" : "Não foi possível alterar o teu endereço de email", "Email saved" : "E-mail guardado", + "Your full name has been changed." : "O seu nome completo foi alterado.", + "Unable to change full name" : "Não foi possível alterar o seu nome completo", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Você tem certeza que quer adicionar \"{domain}\" como domínio confiável?", "Add trusted domain" : "Adicionar domínio confiável ", "Migration in progress. Please wait until the migration is finished" : "Migração em progresso. Por favor, aguarde até que a mesma esteja concluída..", diff --git a/settings/l10n/ro.js b/settings/l10n/ro.js index 354c45092b7..54666e90862 100644 --- a/settings/l10n/ro.js +++ b/settings/l10n/ro.js @@ -8,11 +8,9 @@ OC.L10N.register( "Log" : "Jurnal de activitate", "Tips & tricks" : "Tips & tricks", "Updates" : "Actualizări", - "Authentication error" : "Eroare la autentificare", - "Your full name has been changed." : "Numele tău complet a fost schimbat.", - "Unable to change full name" : "Nu s-a puput schimba numele complet", "Language changed" : "Limba a fost schimbată", "Invalid request" : "Cerere eronată", + "Authentication error" : "Eroare la autentificare", "Admins can't remove themself from the admin group" : "Administratorii nu se pot șterge singuri din grupul admin", "Unable to add user to group %s" : "Nu s-a putut adăuga utilizatorul la grupul %s", "Unable to remove user from group %s" : "Nu s-a putut elimina utilizatorul din grupul %s", @@ -34,6 +32,8 @@ OC.L10N.register( "Forbidden" : "Interzis", "Invalid user" : "Utilizator nevalid", "Email saved" : "E-mail salvat", + "Your full name has been changed." : "Numele tău complet a fost schimbat.", + "Unable to change full name" : "Nu s-a puput schimba numele complet", "Sending..." : "Se expediază...", "All" : "Toate ", "Please wait...." : "Aşteptaţi vă rog....", diff --git a/settings/l10n/ro.json b/settings/l10n/ro.json index 05a736d9fdf..2f1edea71c0 100644 --- a/settings/l10n/ro.json +++ b/settings/l10n/ro.json @@ -6,11 +6,9 @@ "Log" : "Jurnal de activitate", "Tips & tricks" : "Tips & tricks", "Updates" : "Actualizări", - "Authentication error" : "Eroare la autentificare", - "Your full name has been changed." : "Numele tău complet a fost schimbat.", - "Unable to change full name" : "Nu s-a puput schimba numele complet", "Language changed" : "Limba a fost schimbată", "Invalid request" : "Cerere eronată", + "Authentication error" : "Eroare la autentificare", "Admins can't remove themself from the admin group" : "Administratorii nu se pot șterge singuri din grupul admin", "Unable to add user to group %s" : "Nu s-a putut adăuga utilizatorul la grupul %s", "Unable to remove user from group %s" : "Nu s-a putut elimina utilizatorul din grupul %s", @@ -32,6 +30,8 @@ "Forbidden" : "Interzis", "Invalid user" : "Utilizator nevalid", "Email saved" : "E-mail salvat", + "Your full name has been changed." : "Numele tău complet a fost schimbat.", + "Unable to change full name" : "Nu s-a puput schimba numele complet", "Sending..." : "Se expediază...", "All" : "Toate ", "Please wait...." : "Aşteptaţi vă rog....", diff --git a/settings/l10n/ru.js b/settings/l10n/ru.js index a6f62fd5e9f..78a5525eb0a 100644 --- a/settings/l10n/ru.js +++ b/settings/l10n/ru.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Журнал", "Tips & tricks" : "Советы и трюки", "Updates" : "Обновления", - "Authentication error" : "Ошибка аутентификации", - "Your full name has been changed." : "Ваше полное имя было изменено.", - "Unable to change full name" : "Невозможно изменить полное имя", "Couldn't remove app." : "Невозможно удалить приложение.", "Language changed" : "Язык изменён", "Invalid request" : "Неправильный запрос", + "Authentication error" : "Ошибка аутентификации", "Admins can't remove themself from the admin group" : "Администратор не может удалить сам себя из группы администраторов", "Unable to add user to group %s" : "Невозможно добавить пользователя в группу %s", "Unable to remove user from group %s" : "Невозможно удалить пользователя из группы %s", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "Неверный пользователь", "Unable to change mail address" : "Невозможно изменить адрес электронной почты", "Email saved" : "Email сохранен", + "Your full name has been changed." : "Ваше полное имя было изменено.", + "Unable to change full name" : "Невозможно изменить полное имя", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Вы действительно хотите добавить домен \"{domain}\" как доверенный?", "Add trusted domain" : "Добавить доверенный домен", "Migration in progress. Please wait until the migration is finished" : "Миграция в процессе. Пожалуйста, подождите завершения миграции", @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Мы рекомендуем установить требуемые пакеты для вашей системы для поддержки одного из следующих языков: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Если ваша копия ownCloud установлена не в корне домена и использует системный планировщик cron, возможны проблемы с правильной генерацией URL. Чтобы избежать этого, установите опцию \"overwrite.cli.url\" в файле config.php равной пути папки установки. (Предположительно: \"%s\".)", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Не удается запустить задачу планировщика через CLI. Произошли следующие технические ошибки:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Механизм блокировки файлов во время передачи основан на базе данных, для лучшей производительности рекомендуется использование memcache. За подробной информацией обратитесь к <a target=\"_blank\" href=\"%s\">документации</a>.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Пожалуйста, перепроверьте <a href=\"%s\">инструкцию по установке</a> и проверьте ошибки или предупреждения в <a href=\"#log-section\">журнале</a>", "All checks passed." : "Все проверки пройдены.", "Open documentation" : "Открыть документацию", diff --git a/settings/l10n/ru.json b/settings/l10n/ru.json index 4ecc1dd6195..fd9af89039d 100644 --- a/settings/l10n/ru.json +++ b/settings/l10n/ru.json @@ -10,12 +10,10 @@ "Log" : "Журнал", "Tips & tricks" : "Советы и трюки", "Updates" : "Обновления", - "Authentication error" : "Ошибка аутентификации", - "Your full name has been changed." : "Ваше полное имя было изменено.", - "Unable to change full name" : "Невозможно изменить полное имя", "Couldn't remove app." : "Невозможно удалить приложение.", "Language changed" : "Язык изменён", "Invalid request" : "Неправильный запрос", + "Authentication error" : "Ошибка аутентификации", "Admins can't remove themself from the admin group" : "Администратор не может удалить сам себя из группы администраторов", "Unable to add user to group %s" : "Невозможно добавить пользователя в группу %s", "Unable to remove user from group %s" : "Невозможно удалить пользователя из группы %s", @@ -51,6 +49,8 @@ "Invalid user" : "Неверный пользователь", "Unable to change mail address" : "Невозможно изменить адрес электронной почты", "Email saved" : "Email сохранен", + "Your full name has been changed." : "Ваше полное имя было изменено.", + "Unable to change full name" : "Невозможно изменить полное имя", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Вы действительно хотите добавить домен \"{domain}\" как доверенный?", "Add trusted domain" : "Добавить доверенный домен", "Migration in progress. Please wait until the migration is finished" : "Миграция в процессе. Пожалуйста, подождите завершения миграции", @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Мы рекомендуем установить требуемые пакеты для вашей системы для поддержки одного из следующих языков: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Если ваша копия ownCloud установлена не в корне домена и использует системный планировщик cron, возможны проблемы с правильной генерацией URL. Чтобы избежать этого, установите опцию \"overwrite.cli.url\" в файле config.php равной пути папки установки. (Предположительно: \"%s\".)", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Не удается запустить задачу планировщика через CLI. Произошли следующие технические ошибки:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "Механизм блокировки файлов во время передачи основан на базе данных, для лучшей производительности рекомендуется использование memcache. За подробной информацией обратитесь к <a target=\"_blank\" href=\"%s\">документации</a>.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Пожалуйста, перепроверьте <a href=\"%s\">инструкцию по установке</a> и проверьте ошибки или предупреждения в <a href=\"#log-section\">журнале</a>", "All checks passed." : "Все проверки пройдены.", "Open documentation" : "Открыть документацию", diff --git a/settings/l10n/si_LK.js b/settings/l10n/si_LK.js index 8dc28f5ab1f..9207b5ab189 100644 --- a/settings/l10n/si_LK.js +++ b/settings/l10n/si_LK.js @@ -4,9 +4,9 @@ OC.L10N.register( "Sharing" : "හුවමාරු කිරීම", "External Storage" : "භාහිර ගබඩාව", "Log" : "ලඝුව", - "Authentication error" : "සත්යාපන දෝෂයක්", "Language changed" : "භාෂාව ාවනස් කිරීම", "Invalid request" : "අවලංගු අයැදුමක්", + "Authentication error" : "සත්යාපන දෝෂයක්", "Unable to add user to group %s" : "පරිශීලකයා %s කණ්ඩායමට එකතු කළ නොහැක", "Unable to remove user from group %s" : "පරිශීලකයා %s කණ්ඩායමින් ඉවත් කළ නොහැක", "Email saved" : "වි-තැපෑල සුරකින ලදී", diff --git a/settings/l10n/si_LK.json b/settings/l10n/si_LK.json index afded14ebf1..9b2287b13be 100644 --- a/settings/l10n/si_LK.json +++ b/settings/l10n/si_LK.json @@ -2,9 +2,9 @@ "Sharing" : "හුවමාරු කිරීම", "External Storage" : "භාහිර ගබඩාව", "Log" : "ලඝුව", - "Authentication error" : "සත්යාපන දෝෂයක්", "Language changed" : "භාෂාව ාවනස් කිරීම", "Invalid request" : "අවලංගු අයැදුමක්", + "Authentication error" : "සත්යාපන දෝෂයක්", "Unable to add user to group %s" : "පරිශීලකයා %s කණ්ඩායමට එකතු කළ නොහැක", "Unable to remove user from group %s" : "පරිශීලකයා %s කණ්ඩායමින් ඉවත් කළ නොහැක", "Email saved" : "වි-තැපෑල සුරකින ලදී", diff --git a/settings/l10n/sk_SK.js b/settings/l10n/sk_SK.js index 2de64dd5a56..ea1887a92dd 100644 --- a/settings/l10n/sk_SK.js +++ b/settings/l10n/sk_SK.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Záznam", "Tips & tricks" : "Tipy a triky", "Updates" : "Aktualizácie", - "Authentication error" : "Chyba autentifikácie", - "Your full name has been changed." : "Vaše meno a priezvisko bolo zmenené.", - "Unable to change full name" : "Nemožno zmeniť meno a priezvisko", "Couldn't remove app." : "Nemožno odstrániť aplikáciu.", "Language changed" : "Jazyk zmenený", "Invalid request" : "Neplatná požiadavka", + "Authentication error" : "Chyba autentifikácie", "Admins can't remove themself from the admin group" : "Administrátori nesmú odstrániť sami seba zo skupiny admin", "Unable to add user to group %s" : "Nie je možné pridať používateľa do skupiny %s", "Unable to remove user from group %s" : "Nie je možné odstrániť používateľa zo skupiny %s", @@ -51,6 +49,8 @@ OC.L10N.register( "Invalid user" : "Neplatný používateľ", "Unable to change mail address" : "Nemožno zmeniť emailovú adresu", "Email saved" : "Email uložený", + "Your full name has been changed." : "Vaše meno a priezvisko bolo zmenené.", + "Unable to change full name" : "Nemožno zmeniť meno a priezvisko", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ste si istí, že chcete pridať \"{domain}\" medzi dôveryhodné domény?", "Add trusted domain" : "Pridať dôveryhodnú doménu", "Migration in progress. Please wait until the migration is finished" : "Prebieha migrácia. Počkajte prosím, kým sa skončí", diff --git a/settings/l10n/sk_SK.json b/settings/l10n/sk_SK.json index 2fc4064a033..784a46fe080 100644 --- a/settings/l10n/sk_SK.json +++ b/settings/l10n/sk_SK.json @@ -10,12 +10,10 @@ "Log" : "Záznam", "Tips & tricks" : "Tipy a triky", "Updates" : "Aktualizácie", - "Authentication error" : "Chyba autentifikácie", - "Your full name has been changed." : "Vaše meno a priezvisko bolo zmenené.", - "Unable to change full name" : "Nemožno zmeniť meno a priezvisko", "Couldn't remove app." : "Nemožno odstrániť aplikáciu.", "Language changed" : "Jazyk zmenený", "Invalid request" : "Neplatná požiadavka", + "Authentication error" : "Chyba autentifikácie", "Admins can't remove themself from the admin group" : "Administrátori nesmú odstrániť sami seba zo skupiny admin", "Unable to add user to group %s" : "Nie je možné pridať používateľa do skupiny %s", "Unable to remove user from group %s" : "Nie je možné odstrániť používateľa zo skupiny %s", @@ -49,6 +47,8 @@ "Invalid user" : "Neplatný používateľ", "Unable to change mail address" : "Nemožno zmeniť emailovú adresu", "Email saved" : "Email uložený", + "Your full name has been changed." : "Vaše meno a priezvisko bolo zmenené.", + "Unable to change full name" : "Nemožno zmeniť meno a priezvisko", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ste si istí, že chcete pridať \"{domain}\" medzi dôveryhodné domény?", "Add trusted domain" : "Pridať dôveryhodnú doménu", "Migration in progress. Please wait until the migration is finished" : "Prebieha migrácia. Počkajte prosím, kým sa skončí", diff --git a/settings/l10n/sq.js b/settings/l10n/sq.js index 7addd9d7d3e..7248797b6f2 100644 --- a/settings/l10n/sq.js +++ b/settings/l10n/sq.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Regjistër", "Tips & tricks" : "Ndihmëza & rrengje", "Updates" : "Përditësime", - "Authentication error" : "Gabim mirëfilltësimi", - "Your full name has been changed." : "Emri juaj i plotë u ndryshua.", - "Unable to change full name" : "S’arrin të ndryshojë emrin e plotë", "Couldn't remove app." : "S’hoqi dot aplikacionin.", "Language changed" : "Gjuha u ndryshua", "Invalid request" : "Kërkesë e pavlefshme", + "Authentication error" : "Gabim mirëfilltësimi", "Admins can't remove themself from the admin group" : "Administratorët s’mund të heqin veten prej grupit admin", "Unable to add user to group %s" : "S’arrin të shtojë përdorues te grupi %s", "Unable to remove user from group %s" : "S’arrin të heqë përdorues nga grupi %s", @@ -52,6 +50,8 @@ OC.L10N.register( "Invalid user" : "Përdorues i pavlefshëm", "Unable to change mail address" : "S’arrin të ndryshojë adresë email", "Email saved" : "Email-i u ruajt", + "Your full name has been changed." : "Emri juaj i plotë u ndryshua.", + "Unable to change full name" : "S’arrin të ndryshojë emrin e plotë", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Jeni vërtet i sigurt se doni të shtoni \"{domain}\" si përkatësi të besuar?", "Add trusted domain" : "Shtoni përkatësi të besuar", "Migration in progress. Please wait until the migration is finished" : "Migrimi në rrugë e sipër. Ju lutemi, pritni, teksa migrimi përfundon", diff --git a/settings/l10n/sq.json b/settings/l10n/sq.json index c5017a053a5..1b27cb6d31f 100644 --- a/settings/l10n/sq.json +++ b/settings/l10n/sq.json @@ -10,12 +10,10 @@ "Log" : "Regjistër", "Tips & tricks" : "Ndihmëza & rrengje", "Updates" : "Përditësime", - "Authentication error" : "Gabim mirëfilltësimi", - "Your full name has been changed." : "Emri juaj i plotë u ndryshua.", - "Unable to change full name" : "S’arrin të ndryshojë emrin e plotë", "Couldn't remove app." : "S’hoqi dot aplikacionin.", "Language changed" : "Gjuha u ndryshua", "Invalid request" : "Kërkesë e pavlefshme", + "Authentication error" : "Gabim mirëfilltësimi", "Admins can't remove themself from the admin group" : "Administratorët s’mund të heqin veten prej grupit admin", "Unable to add user to group %s" : "S’arrin të shtojë përdorues te grupi %s", "Unable to remove user from group %s" : "S’arrin të heqë përdorues nga grupi %s", @@ -50,6 +48,8 @@ "Invalid user" : "Përdorues i pavlefshëm", "Unable to change mail address" : "S’arrin të ndryshojë adresë email", "Email saved" : "Email-i u ruajt", + "Your full name has been changed." : "Emri juaj i plotë u ndryshua.", + "Unable to change full name" : "S’arrin të ndryshojë emrin e plotë", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Jeni vërtet i sigurt se doni të shtoni \"{domain}\" si përkatësi të besuar?", "Add trusted domain" : "Shtoni përkatësi të besuar", "Migration in progress. Please wait until the migration is finished" : "Migrimi në rrugë e sipër. Ju lutemi, pritni, teksa migrimi përfundon", diff --git a/settings/l10n/sr.js b/settings/l10n/sr.js index 3a3bc293473..f0fc5eb3388 100644 --- a/settings/l10n/sr.js +++ b/settings/l10n/sr.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Бележење", "Tips & tricks" : "Савети и трикови", "Updates" : "Ажурирања", - "Authentication error" : "Грешка при провери идентитета", - "Your full name has been changed." : "Ваше пуно име је промењено.", - "Unable to change full name" : "Не могу да променим пуно име", "Couldn't remove app." : "Не могу да уклоним апликацију.", "Language changed" : "Језик је промењен", "Invalid request" : "Неисправан захтев", + "Authentication error" : "Грешка при провери идентитета", "Admins can't remove themself from the admin group" : "Администратор не може себе да уклони из admin групе", "Unable to add user to group %s" : "Не могу да додам корисника у групу %s", "Unable to remove user from group %s" : "Не могу да уклоним корисника из групе %s", @@ -51,6 +49,8 @@ OC.L10N.register( "Invalid user" : "Неисправан корисник", "Unable to change mail address" : "Не могу да изменим е-адресу", "Email saved" : "Е-порука сачувана", + "Your full name has been changed." : "Ваше пуно име је промењено.", + "Unable to change full name" : "Не могу да променим пуно име", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Да ли заиста желите да додате „{domain}“ као поуздан домен?", "Add trusted domain" : "Додај поуздан домен", "Migration in progress. Please wait until the migration is finished" : "Пресељење је у току. Сачекајте док се не заврши", diff --git a/settings/l10n/sr.json b/settings/l10n/sr.json index 5003066df7b..ec0d3f078dc 100644 --- a/settings/l10n/sr.json +++ b/settings/l10n/sr.json @@ -10,12 +10,10 @@ "Log" : "Бележење", "Tips & tricks" : "Савети и трикови", "Updates" : "Ажурирања", - "Authentication error" : "Грешка при провери идентитета", - "Your full name has been changed." : "Ваше пуно име је промењено.", - "Unable to change full name" : "Не могу да променим пуно име", "Couldn't remove app." : "Не могу да уклоним апликацију.", "Language changed" : "Језик је промењен", "Invalid request" : "Неисправан захтев", + "Authentication error" : "Грешка при провери идентитета", "Admins can't remove themself from the admin group" : "Администратор не може себе да уклони из admin групе", "Unable to add user to group %s" : "Не могу да додам корисника у групу %s", "Unable to remove user from group %s" : "Не могу да уклоним корисника из групе %s", @@ -49,6 +47,8 @@ "Invalid user" : "Неисправан корисник", "Unable to change mail address" : "Не могу да изменим е-адресу", "Email saved" : "Е-порука сачувана", + "Your full name has been changed." : "Ваше пуно име је промењено.", + "Unable to change full name" : "Не могу да променим пуно име", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Да ли заиста желите да додате „{domain}“ као поуздан домен?", "Add trusted domain" : "Додај поуздан домен", "Migration in progress. Please wait until the migration is finished" : "Пресељење је у току. Сачекајте док се не заврши", diff --git a/settings/l10n/sr@latin.js b/settings/l10n/sr@latin.js index baacd0efddb..e7319b531fb 100644 --- a/settings/l10n/sr@latin.js +++ b/settings/l10n/sr@latin.js @@ -3,9 +3,9 @@ OC.L10N.register( { "External Storage" : "Spoljašnje skladište", "Updates" : "Ažuriranja", - "Authentication error" : "Greška pri autentifikaciji", "Language changed" : "Jezik je izmenjen", "Invalid request" : "Neispravan zahtev", + "Authentication error" : "Greška pri autentifikaciji", "Saved" : "Sačuvano", "Email sent" : "Email poslat", "Very weak password" : "Veoma slaba lozinka", diff --git a/settings/l10n/sr@latin.json b/settings/l10n/sr@latin.json index 70392768da4..f53b0f418c6 100644 --- a/settings/l10n/sr@latin.json +++ b/settings/l10n/sr@latin.json @@ -1,9 +1,9 @@ { "translations": { "External Storage" : "Spoljašnje skladište", "Updates" : "Ažuriranja", - "Authentication error" : "Greška pri autentifikaciji", "Language changed" : "Jezik je izmenjen", "Invalid request" : "Neispravan zahtev", + "Authentication error" : "Greška pri autentifikaciji", "Saved" : "Sačuvano", "Email sent" : "Email poslat", "Very weak password" : "Veoma slaba lozinka", diff --git a/settings/l10n/ta_LK.js b/settings/l10n/ta_LK.js index f611af9eb14..e1c01ee9d53 100644 --- a/settings/l10n/ta_LK.js +++ b/settings/l10n/ta_LK.js @@ -2,9 +2,9 @@ OC.L10N.register( "settings", { "External Storage" : "வெளி சேமிப்பு", - "Authentication error" : "அத்தாட்சிப்படுத்தலில் வழு", "Language changed" : "மொழி மாற்றப்பட்டது", "Invalid request" : "செல்லுபடியற்ற வேண்டுகோள்", + "Authentication error" : "அத்தாட்சிப்படுத்தலில் வழு", "Unable to add user to group %s" : "குழு %s இல் பயனாளரை சேர்க்க முடியாது", "Unable to remove user from group %s" : "குழு %s இலிருந்து பயனாளரை நீக்கமுடியாது", "Email saved" : "மின்னஞ்சல் சேமிக்கப்பட்டது", diff --git a/settings/l10n/ta_LK.json b/settings/l10n/ta_LK.json index 1a16f5f7b3e..84c2acbe2ac 100644 --- a/settings/l10n/ta_LK.json +++ b/settings/l10n/ta_LK.json @@ -1,8 +1,8 @@ { "translations": { "External Storage" : "வெளி சேமிப்பு", - "Authentication error" : "அத்தாட்சிப்படுத்தலில் வழு", "Language changed" : "மொழி மாற்றப்பட்டது", "Invalid request" : "செல்லுபடியற்ற வேண்டுகோள்", + "Authentication error" : "அத்தாட்சிப்படுத்தலில் வழு", "Unable to add user to group %s" : "குழு %s இல் பயனாளரை சேர்க்க முடியாது", "Unable to remove user from group %s" : "குழு %s இலிருந்து பயனாளரை நீக்கமுடியாது", "Email saved" : "மின்னஞ்சல் சேமிக்கப்பட்டது", diff --git a/settings/l10n/th_TH.js b/settings/l10n/th_TH.js index f5fa8a547d0..28cc6d0e3b0 100644 --- a/settings/l10n/th_TH.js +++ b/settings/l10n/th_TH.js @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "เราขอแนะนำให้ติดตั้งแพคเกจที่จำเป็นต้องใช้ในระบบของคุณ ให้การสนับสนุนตำแหน่งที่ตั้งดังต่อไปนี้: %s", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "หากการติดตั้งของคุณไม่ได้ติดตั้งในรากของโดเมนและใช้ระบบ cron อาจมีปัญหาเกี่ยวกับการสร้าง URL เพื่อหลีกเลี่ยงปัญหาเหล่านี้โปรดไปตั้งค่า \"overwrite.cli.url\" ในไฟล์ config.php ของคุณไปยังเส้นทาง webroot ของการติดตั้งของคุณ (แนะนำ: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "มันเป็นไปไม่ได้ที่จะดำเนินการ cronjob ผ่านทาง CLI ข้อผิดพลาดทางเทคนิคต่อไปนี้จะปรากฏ:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "การทำธุรกรรมล็อคไฟล์จะใช้ฐานข้อมูลเป็นล็อคแบ็กเอนด์ สำหรับประสิทธิภาพที่ดีที่สุดก็ควรที่จะกำหนดค่า memcache สำหรับล็อค ดูเพิ่มเติมได้จาก <a target=\"_blank\" href=\"%s\">เอกสาร</a>", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "กรุณาตรวจสอบ <a target=\"_blank\" href=\"%s\">คู่มือการติดตั้ง</a> และตรวจสอบข้อผิดพลาดหรือคำเตือนใน <a href=\"#log-section\">บันทึก</a>", "All checks passed." : "ผ่านการตรวจสอบทั้งหมด", "Open documentation" : "เปิดเอกสาร", diff --git a/settings/l10n/th_TH.json b/settings/l10n/th_TH.json index 90eaa41ea93..16757eda425 100644 --- a/settings/l10n/th_TH.json +++ b/settings/l10n/th_TH.json @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "เราขอแนะนำให้ติดตั้งแพคเกจที่จำเป็นต้องใช้ในระบบของคุณ ให้การสนับสนุนตำแหน่งที่ตั้งดังต่อไปนี้: %s", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "หากการติดตั้งของคุณไม่ได้ติดตั้งในรากของโดเมนและใช้ระบบ cron อาจมีปัญหาเกี่ยวกับการสร้าง URL เพื่อหลีกเลี่ยงปัญหาเหล่านี้โปรดไปตั้งค่า \"overwrite.cli.url\" ในไฟล์ config.php ของคุณไปยังเส้นทาง webroot ของการติดตั้งของคุณ (แนะนำ: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "มันเป็นไปไม่ได้ที่จะดำเนินการ cronjob ผ่านทาง CLI ข้อผิดพลาดทางเทคนิคต่อไปนี้จะปรากฏ:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "การทำธุรกรรมล็อคไฟล์จะใช้ฐานข้อมูลเป็นล็อคแบ็กเอนด์ สำหรับประสิทธิภาพที่ดีที่สุดก็ควรที่จะกำหนดค่า memcache สำหรับล็อค ดูเพิ่มเติมได้จาก <a target=\"_blank\" href=\"%s\">เอกสาร</a>", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "กรุณาตรวจสอบ <a target=\"_blank\" href=\"%s\">คู่มือการติดตั้ง</a> และตรวจสอบข้อผิดพลาดหรือคำเตือนใน <a href=\"#log-section\">บันทึก</a>", "All checks passed." : "ผ่านการตรวจสอบทั้งหมด", "Open documentation" : "เปิดเอกสาร", diff --git a/settings/l10n/tr.js b/settings/l10n/tr.js index eb003a1f2f7..0e8bbe28b17 100644 --- a/settings/l10n/tr.js +++ b/settings/l10n/tr.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "Günlük", "Tips & tricks" : "İpuçları ve hileler", "Updates" : "Güncellemeler", - "Authentication error" : "Kimlik doğrulama hatası", - "Your full name has been changed." : "Tam adınız değiştirildi.", - "Unable to change full name" : "Tam adınız değiştirilirken hata", "Couldn't remove app." : "Uygulama kaldırılamadı.", "Language changed" : "Dil değiştirildi", "Invalid request" : "Geçersiz istek", + "Authentication error" : "Kimlik doğrulama hatası", "Admins can't remove themself from the admin group" : "Yöneticiler kendilerini admin grubundan kaldıramaz", "Unable to add user to group %s" : "Kullanıcı %s grubuna eklenemiyor", "Unable to remove user from group %s" : "%s grubundan kullanıcı kaldırılamıyor", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "Geçersiz kullanıcı", "Unable to change mail address" : "Posta adresini değiştirme başarısız", "Email saved" : "E-posta kaydedildi", + "Your full name has been changed." : "Tam adınız değiştirildi.", + "Unable to change full name" : "Tam adınız değiştirilirken hata", "Are you really sure you want add \"{domain}\" as trusted domain?" : "\"{domain}\" alan adını güvenilir alan adı olarak eklemek istediğinizden emin misiniz?", "Add trusted domain" : "Güvenilir alan adı ekle", "Migration in progress. Please wait until the migration is finished" : "Taşınma sürüyor. Lütfen taşınma tamamlanana kadar bekleyin", @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Şu dillerden birini desteklemesi için sisteminize gerekli paketleri kurmanızı şiddetle tavsiye ederiz: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Eğer kurulumunuz alan adının köküne yapılmamışsa ve sistem cron'u kullanıyorsa, URL oluşturma ile ilgili sorunlar oluşabilir. Bu sorunların önüne geçmek için, kurulumunuzun web kök yolundaki config.php dosyasında \"overwrite.cli.url\" seçeneğini ayarlayın (Önerilen: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Bu CLI ile cronjobı çalıştırmak mümkün değildi. Aşağıdaki teknik hatalar ortaya çıkmıştır:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "İşlemsel dosya kilidi, kilitleme arkaucu olarak veritabanını kullanıyor. En iyi performans için kilitleme adına memcache yapılandırılması önerilir. Daha fazla bilgi için <a target=\"_blank\" href=\"%s\">belgelendirmeye ↗</a> bakın.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Lütfen <a target=\"_blank\" href=\"%s\">kurulum rehberlerini ↗</a> iki kez denetleyip <a href=\"#log-section\">günlük</a> içerisindeki hata ve uyarılara bakın.", "All checks passed." : "Tüm kontroller geçildi.", "Open documentation" : "Belgelendirmeyi aç", diff --git a/settings/l10n/tr.json b/settings/l10n/tr.json index c96a4f566c4..4774d4dc48f 100644 --- a/settings/l10n/tr.json +++ b/settings/l10n/tr.json @@ -10,12 +10,10 @@ "Log" : "Günlük", "Tips & tricks" : "İpuçları ve hileler", "Updates" : "Güncellemeler", - "Authentication error" : "Kimlik doğrulama hatası", - "Your full name has been changed." : "Tam adınız değiştirildi.", - "Unable to change full name" : "Tam adınız değiştirilirken hata", "Couldn't remove app." : "Uygulama kaldırılamadı.", "Language changed" : "Dil değiştirildi", "Invalid request" : "Geçersiz istek", + "Authentication error" : "Kimlik doğrulama hatası", "Admins can't remove themself from the admin group" : "Yöneticiler kendilerini admin grubundan kaldıramaz", "Unable to add user to group %s" : "Kullanıcı %s grubuna eklenemiyor", "Unable to remove user from group %s" : "%s grubundan kullanıcı kaldırılamıyor", @@ -51,6 +49,8 @@ "Invalid user" : "Geçersiz kullanıcı", "Unable to change mail address" : "Posta adresini değiştirme başarısız", "Email saved" : "E-posta kaydedildi", + "Your full name has been changed." : "Tam adınız değiştirildi.", + "Unable to change full name" : "Tam adınız değiştirilirken hata", "Are you really sure you want add \"{domain}\" as trusted domain?" : "\"{domain}\" alan adını güvenilir alan adı olarak eklemek istediğinizden emin misiniz?", "Add trusted domain" : "Güvenilir alan adı ekle", "Migration in progress. Please wait until the migration is finished" : "Taşınma sürüyor. Lütfen taşınma tamamlanana kadar bekleyin", @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "Şu dillerden birini desteklemesi için sisteminize gerekli paketleri kurmanızı şiddetle tavsiye ederiz: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "Eğer kurulumunuz alan adının köküne yapılmamışsa ve sistem cron'u kullanıyorsa, URL oluşturma ile ilgili sorunlar oluşabilir. Bu sorunların önüne geçmek için, kurulumunuzun web kök yolundaki config.php dosyasında \"overwrite.cli.url\" seçeneğini ayarlayın (Önerilen: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "Bu CLI ile cronjobı çalıştırmak mümkün değildi. Aşağıdaki teknik hatalar ortaya çıkmıştır:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "İşlemsel dosya kilidi, kilitleme arkaucu olarak veritabanını kullanıyor. En iyi performans için kilitleme adına memcache yapılandırılması önerilir. Daha fazla bilgi için <a target=\"_blank\" href=\"%s\">belgelendirmeye ↗</a> bakın.", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "Lütfen <a target=\"_blank\" href=\"%s\">kurulum rehberlerini ↗</a> iki kez denetleyip <a href=\"#log-section\">günlük</a> içerisindeki hata ve uyarılara bakın.", "All checks passed." : "Tüm kontroller geçildi.", "Open documentation" : "Belgelendirmeyi aç", diff --git a/settings/l10n/ug.js b/settings/l10n/ug.js index fafe6cf559d..0182ed481c6 100644 --- a/settings/l10n/ug.js +++ b/settings/l10n/ug.js @@ -3,9 +3,9 @@ OC.L10N.register( { "Sharing" : "ھەمبەھىر", "Log" : "خاتىرە", - "Authentication error" : "سالاھىيەت دەلىللەش خاتالىقى", "Language changed" : "تىل ئۆزگەردى", "Invalid request" : "ئىناۋەتسىز ئىلتىماس", + "Authentication error" : "سالاھىيەت دەلىللەش خاتالىقى", "Admins can't remove themself from the admin group" : "باشقۇرغۇچى ئۆزىنى باشقۇرۇش گۇرۇپپىسىدىن چىقىرىۋېتەلمەيدۇ", "Unable to add user to group %s" : "ئىشلەتكۈچىنى %s گۇرۇپپىغا قوشالمايدۇ", "Unable to remove user from group %s" : "ئىشلەتكۈچىنى %s گۇرۇپپىدىن چىقىرىۋېتەلمەيدۇ", diff --git a/settings/l10n/ug.json b/settings/l10n/ug.json index f81f82ab704..30a13dd57f7 100644 --- a/settings/l10n/ug.json +++ b/settings/l10n/ug.json @@ -1,9 +1,9 @@ { "translations": { "Sharing" : "ھەمبەھىر", "Log" : "خاتىرە", - "Authentication error" : "سالاھىيەت دەلىللەش خاتالىقى", "Language changed" : "تىل ئۆزگەردى", "Invalid request" : "ئىناۋەتسىز ئىلتىماس", + "Authentication error" : "سالاھىيەت دەلىللەش خاتالىقى", "Admins can't remove themself from the admin group" : "باشقۇرغۇچى ئۆزىنى باشقۇرۇش گۇرۇپپىسىدىن چىقىرىۋېتەلمەيدۇ", "Unable to add user to group %s" : "ئىشلەتكۈچىنى %s گۇرۇپپىغا قوشالمايدۇ", "Unable to remove user from group %s" : "ئىشلەتكۈچىنى %s گۇرۇپپىدىن چىقىرىۋېتەلمەيدۇ", diff --git a/settings/l10n/uk.js b/settings/l10n/uk.js index 2775efd8fa9..6818791d109 100644 --- a/settings/l10n/uk.js +++ b/settings/l10n/uk.js @@ -11,12 +11,10 @@ OC.L10N.register( "Log" : "Журнал", "Tips & tricks" : "Поради і трюки", "Updates" : "Оновлення", - "Authentication error" : "Помилка автентифікації", - "Your full name has been changed." : "Ваше повне ім'я було змінено", - "Unable to change full name" : "Неможливо змінити повне ім'я", "Couldn't remove app." : "Неможливо видалити додаток.", "Language changed" : "Мову змінено", "Invalid request" : "Некоректний запит", + "Authentication error" : "Помилка автентифікації", "Admins can't remove themself from the admin group" : "Адміністратор не може видалити себе з групи адміністраторів", "Unable to add user to group %s" : "Не вдалося додати користувача у групу %s", "Unable to remove user from group %s" : "Не вдалося видалити користувача із групи %s", @@ -52,6 +50,8 @@ OC.L10N.register( "Invalid user" : "Неправильний користувач", "Unable to change mail address" : "Неможливо поміняти email адресу", "Email saved" : "Адресу збережено", + "Your full name has been changed." : "Ваше повне ім'я було змінено", + "Unable to change full name" : "Неможливо змінити повне ім'я", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ви дійсно бажаєте додати \"{domain}\" як довірений домен?", "Add trusted domain" : "Додати довірений домен", "Migration in progress. Please wait until the migration is finished" : "Міграція триває. Будь ласка, зачекайте доки процес міграції завершиться", diff --git a/settings/l10n/uk.json b/settings/l10n/uk.json index d2a594fffc0..1b75667fd39 100644 --- a/settings/l10n/uk.json +++ b/settings/l10n/uk.json @@ -9,12 +9,10 @@ "Log" : "Журнал", "Tips & tricks" : "Поради і трюки", "Updates" : "Оновлення", - "Authentication error" : "Помилка автентифікації", - "Your full name has been changed." : "Ваше повне ім'я було змінено", - "Unable to change full name" : "Неможливо змінити повне ім'я", "Couldn't remove app." : "Неможливо видалити додаток.", "Language changed" : "Мову змінено", "Invalid request" : "Некоректний запит", + "Authentication error" : "Помилка автентифікації", "Admins can't remove themself from the admin group" : "Адміністратор не може видалити себе з групи адміністраторів", "Unable to add user to group %s" : "Не вдалося додати користувача у групу %s", "Unable to remove user from group %s" : "Не вдалося видалити користувача із групи %s", @@ -50,6 +48,8 @@ "Invalid user" : "Неправильний користувач", "Unable to change mail address" : "Неможливо поміняти email адресу", "Email saved" : "Адресу збережено", + "Your full name has been changed." : "Ваше повне ім'я було змінено", + "Unable to change full name" : "Неможливо змінити повне ім'я", "Are you really sure you want add \"{domain}\" as trusted domain?" : "Ви дійсно бажаєте додати \"{domain}\" як довірений домен?", "Add trusted domain" : "Додати довірений домен", "Migration in progress. Please wait until the migration is finished" : "Міграція триває. Будь ласка, зачекайте доки процес міграції завершиться", diff --git a/settings/l10n/vi.js b/settings/l10n/vi.js index c451a11e489..ff82c3e6ca0 100644 --- a/settings/l10n/vi.js +++ b/settings/l10n/vi.js @@ -6,11 +6,9 @@ OC.L10N.register( "External Storage" : "Lưu trữ ngoài", "Cron" : "Cron", "Log" : "Log", - "Authentication error" : "Lỗi xác thực", - "Your full name has been changed." : "Họ và tên đã được thay đổi.", - "Unable to change full name" : "Họ và tên không thể đổi ", "Language changed" : "Ngôn ngữ đã được thay đổi", "Invalid request" : "Yêu cầu không hợp lệ", + "Authentication error" : "Lỗi xác thực", "Admins can't remove themself from the admin group" : "Quản trị viên không thể loại bỏ chính họ khỏi nhóm quản lý", "Unable to add user to group %s" : "Không thể thêm người dùng vào nhóm %s", "Unable to remove user from group %s" : "Không thể xóa người dùng từ nhóm %s", @@ -19,6 +17,8 @@ OC.L10N.register( "Saved" : "Đã lưu", "Email sent" : "Email đã được gửi", "Email saved" : "Lưu email", + "Your full name has been changed." : "Họ và tên đã được thay đổi.", + "Unable to change full name" : "Họ và tên không thể đổi ", "All" : "Tất cả", "Please wait...." : "Xin hãy đợi...", "Disable" : "Tắt", diff --git a/settings/l10n/vi.json b/settings/l10n/vi.json index a86e778713b..95674c8fb37 100644 --- a/settings/l10n/vi.json +++ b/settings/l10n/vi.json @@ -4,11 +4,9 @@ "External Storage" : "Lưu trữ ngoài", "Cron" : "Cron", "Log" : "Log", - "Authentication error" : "Lỗi xác thực", - "Your full name has been changed." : "Họ và tên đã được thay đổi.", - "Unable to change full name" : "Họ và tên không thể đổi ", "Language changed" : "Ngôn ngữ đã được thay đổi", "Invalid request" : "Yêu cầu không hợp lệ", + "Authentication error" : "Lỗi xác thực", "Admins can't remove themself from the admin group" : "Quản trị viên không thể loại bỏ chính họ khỏi nhóm quản lý", "Unable to add user to group %s" : "Không thể thêm người dùng vào nhóm %s", "Unable to remove user from group %s" : "Không thể xóa người dùng từ nhóm %s", @@ -17,6 +15,8 @@ "Saved" : "Đã lưu", "Email sent" : "Email đã được gửi", "Email saved" : "Lưu email", + "Your full name has been changed." : "Họ và tên đã được thay đổi.", + "Unable to change full name" : "Họ và tên không thể đổi ", "All" : "Tất cả", "Please wait...." : "Xin hãy đợi...", "Disable" : "Tắt", diff --git a/settings/l10n/zh_CN.js b/settings/l10n/zh_CN.js index 624858c8429..cc01afbf24c 100644 --- a/settings/l10n/zh_CN.js +++ b/settings/l10n/zh_CN.js @@ -135,7 +135,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "我们强烈建议安装在系统上所需的软件包支持以下区域设置之一: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "如果你不是安装在网域根目录而且又使用系统定时计划任务,那么可以导致 URL 链接生成问题。为了避免这些问题,请在你的 Config.php 文件中设置 \\\"overwrite.cli.url\\\" 选项为 webroot 安装根目录 (建议: \\\"%s\\\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "由于下面的错误,无法通过 CLI 执行定时计划任务:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "事务文件锁定正在使用的数据库作为锁定后端,为获得最佳的性能建议配置的 memcache 用来锁定。请参阅<a target=\"_blank\" href=\"%s\">文档↗</a>了解详情。", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "请点击检查 <a target=\\\"_blank\\\" href=\\\"%s\\\"> 安装向导 ↗</a>, 点击 <a href=\\\"#log-section\\\"> 日志 </a>查看详细错误和警告。", "All checks passed." : "所有检查已通过。", "Open documentation" : "打开文档", diff --git a/settings/l10n/zh_CN.json b/settings/l10n/zh_CN.json index f927bb35a40..e5532b98a5d 100644 --- a/settings/l10n/zh_CN.json +++ b/settings/l10n/zh_CN.json @@ -133,7 +133,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "我们强烈建议安装在系统上所需的软件包支持以下区域设置之一: %s.", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "如果你不是安装在网域根目录而且又使用系统定时计划任务,那么可以导致 URL 链接生成问题。为了避免这些问题,请在你的 Config.php 文件中设置 \\\"overwrite.cli.url\\\" 选项为 webroot 安装根目录 (建议: \\\"%s\\\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : "由于下面的错误,无法通过 CLI 执行定时计划任务:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "事务文件锁定正在使用的数据库作为锁定后端,为获得最佳的性能建议配置的 memcache 用来锁定。请参阅<a target=\"_blank\" href=\"%s\">文档↗</a>了解详情。", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "请点击检查 <a target=\\\"_blank\\\" href=\\\"%s\\\"> 安装向导 ↗</a>, 点击 <a href=\\\"#log-section\\\"> 日志 </a>查看详细错误和警告。", "All checks passed." : "所有检查已通过。", "Open documentation" : "打开文档", diff --git a/settings/l10n/zh_TW.js b/settings/l10n/zh_TW.js index e863891e042..c0cf5ad4024 100644 --- a/settings/l10n/zh_TW.js +++ b/settings/l10n/zh_TW.js @@ -12,12 +12,10 @@ OC.L10N.register( "Log" : "紀錄檔", "Tips & tricks" : "技巧 & 提示", "Updates" : "更新", - "Authentication error" : "認證錯誤", - "Your full name has been changed." : "您的全名已變更。", - "Unable to change full name" : "無法變更全名", "Couldn't remove app." : "無法移除應用程式", "Language changed" : "語言已變更", "Invalid request" : "無效請求", + "Authentication error" : "認證錯誤", "Admins can't remove themself from the admin group" : "管理者帳號無法從管理者群組中移除", "Unable to add user to group %s" : "使用者加入群組 %s 錯誤", "Unable to remove user from group %s" : "使用者移出群組 %s 錯誤", @@ -53,6 +51,8 @@ OC.L10N.register( "Invalid user" : "無效的使用者", "Unable to change mail address" : "無法更改 email 地址", "Email saved" : "Email 已儲存", + "Your full name has been changed." : "您的全名已變更。", + "Unable to change full name" : "無法變更全名", "Are you really sure you want add \"{domain}\" as trusted domain?" : "您確定要新增 \"{domain}' 為信任的網域?", "Add trusted domain" : "新增信任的網域", "Migration in progress. Please wait until the migration is finished" : "資料搬移中,請耐心等候直到資料搬移結束", @@ -133,7 +133,6 @@ OC.L10N.register( "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "我們強烈建議在您的系統上安裝必要的套件來支援以下的語系: %s", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "如果您不是使用root來安裝,而是透過系統自定義的排程的話,URL的生成可能會有問題,為了避免這樣的狀況,請您在config.php檔案裡設置 \"overwrite.cli.url\",設定您安裝的webroot的路徑 (建議值: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : " 不可能透過CLI來執行cronjob,發生以下技術性錯誤:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "事務型文件鎖定目前是使用後端資料庫的鎖定功能,為了達到最好的效能,建議鎖定功能使用記憶體快取,請看<a target=\"_blank\" href=\"%s\">文件手冊 ↗</a> 來獲得更多的資訊。", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "請再次檢查 <a target=\"_blank\" href=\"%s\">安裝導引手冊 ↗</a>,並且確定沒有任何的錯誤或是警告訊息在 <a href=\"#log-section\">記錄檔</a>。", "All checks passed." : "通過所有的檢查。", "Open documentation" : "開啟文件", diff --git a/settings/l10n/zh_TW.json b/settings/l10n/zh_TW.json index 312d93ea258..aaa5881d449 100644 --- a/settings/l10n/zh_TW.json +++ b/settings/l10n/zh_TW.json @@ -10,12 +10,10 @@ "Log" : "紀錄檔", "Tips & tricks" : "技巧 & 提示", "Updates" : "更新", - "Authentication error" : "認證錯誤", - "Your full name has been changed." : "您的全名已變更。", - "Unable to change full name" : "無法變更全名", "Couldn't remove app." : "無法移除應用程式", "Language changed" : "語言已變更", "Invalid request" : "無效請求", + "Authentication error" : "認證錯誤", "Admins can't remove themself from the admin group" : "管理者帳號無法從管理者群組中移除", "Unable to add user to group %s" : "使用者加入群組 %s 錯誤", "Unable to remove user from group %s" : "使用者移出群組 %s 錯誤", @@ -51,6 +49,8 @@ "Invalid user" : "無效的使用者", "Unable to change mail address" : "無法更改 email 地址", "Email saved" : "Email 已儲存", + "Your full name has been changed." : "您的全名已變更。", + "Unable to change full name" : "無法變更全名", "Are you really sure you want add \"{domain}\" as trusted domain?" : "您確定要新增 \"{domain}' 為信任的網域?", "Add trusted domain" : "新增信任的網域", "Migration in progress. Please wait until the migration is finished" : "資料搬移中,請耐心等候直到資料搬移結束", @@ -131,7 +131,6 @@ "We strongly suggest installing the required packages on your system to support one of the following locales: %s." : "我們強烈建議在您的系統上安裝必要的套件來支援以下的語系: %s", "If your installation is not installed in the root of the domain and uses system cron, there can be issues with the URL generation. To avoid these problems, please set the \"overwrite.cli.url\" option in your config.php file to the webroot path of your installation (Suggested: \"%s\")" : "如果您不是使用root來安裝,而是透過系統自定義的排程的話,URL的生成可能會有問題,為了避免這樣的狀況,請您在config.php檔案裡設置 \"overwrite.cli.url\",設定您安裝的webroot的路徑 (建議值: \"%s\")", "It was not possible to execute the cronjob via CLI. The following technical errors have appeared:" : " 不可能透過CLI來執行cronjob,發生以下技術性錯誤:", - "Transactional file locking is using the database as locking backend, for best performance it's advised to configure a memcache for locking. See the <a target=\"_blank\" href=\"%s\">documentation ↗</a> for more information." : "事務型文件鎖定目前是使用後端資料庫的鎖定功能,為了達到最好的效能,建議鎖定功能使用記憶體快取,請看<a target=\"_blank\" href=\"%s\">文件手冊 ↗</a> 來獲得更多的資訊。", "Please double check the <a target=\"_blank\" href=\"%s\">installation guides ↗</a>, and check for any errors or warnings in the <a href=\"#log-section\">log</a>." : "請再次檢查 <a target=\"_blank\" href=\"%s\">安裝導引手冊 ↗</a>,並且確定沒有任何的錯誤或是警告訊息在 <a href=\"#log-section\">記錄檔</a>。", "All checks passed." : "通過所有的檢查。", "Open documentation" : "開啟文件", diff --git a/settings/personal.php b/settings/personal.php index 6c2ac351456..9a714393585 100644 --- a/settings/personal.php +++ b/settings/personal.php @@ -165,6 +165,7 @@ $l = \OC::$server->getL10N('settings'); $formsAndMore = []; $formsAndMore[]= ['anchor' => 'clientsbox', 'section-name' => $l->t('Sync clients')]; $formsAndMore[]= ['anchor' => 'passwordform', 'section-name' => $l->t('Personal info')]; +$formsAndMore[]= ['anchor' => 'groups', 'section-name' => $l->t('Groups')]; $forms=OC_App::getForms('personal'); diff --git a/settings/templates/admin.php b/settings/templates/admin.php index 0721c0e0afb..2b813257a77 100644 --- a/settings/templates/admin.php +++ b/settings/templates/admin.php @@ -56,7 +56,7 @@ if ($_['mail_smtpmode'] == 'qmail') { if (isset($form['anchor'])) { $anchor = '#' . $form['anchor']; $sectionName = $form['section-name']; - print_unescaped(sprintf("<li><a href='%s'>%s</a></li>", OC_Util::sanitizeHTML($anchor), OC_Util::sanitizeHTML($sectionName))); + print_unescaped(sprintf("<li><a href='%s'>%s</a></li>", \OCP\Util::sanitizeHTML($anchor), \OCP\Util::sanitizeHTML($sectionName))); } }?> </ul> @@ -181,13 +181,7 @@ if ($_['cronErrors']) { <div class="loading"></div> <ul class="errors hidden"></ul> <ul class="warnings hidden"></ul> - <ul class="info hidden"> - <?php if ($_['fileLockingType'] === 'db'):?> - <li> - <?php print_unescaped($l->t('Transactional file locking is using the database as locking backend, for best performance it\'s advised to configure a memcache for locking. See the <a target="_blank" href="%s">documentation ↗</a> for more information.', link_to_docs('admin-transactional-locking'))); ?> - </li> - <?php endif; ?> - </ul> + <ul class="info hidden"></ul> <p class="hint hidden"> <?php print_unescaped($l->t('Please double check the <a target="_blank" href="%s">installation guides ↗</a>, and check for any errors or warnings in the <a href="#log-section">log</a>.', link_to_docs('admin-install'))); ?> </p> diff --git a/settings/templates/personal.php b/settings/templates/personal.php index 0eba71d77d1..09194ea3e39 100644 --- a/settings/templates/personal.php +++ b/settings/templates/personal.php @@ -14,7 +14,7 @@ if (isset($form['anchor'])) { $anchor = '#' . $form['anchor']; $sectionName = $form['section-name']; - print_unescaped(sprintf("<li><a href='%s'>%s</a></li>", OC_Util::sanitizeHTML($anchor), OC_Util::sanitizeHTML($sectionName))); + print_unescaped(sprintf("<li><a href='%s'>%s</a></li>", \OCP\Util::sanitizeHTML($anchor), \OCP\Util::sanitizeHTML($sectionName))); } }?> </ul> diff --git a/tests/lib/comments/comment.php b/tests/lib/comments/comment.php new file mode 100644 index 00000000000..02adea8729e --- /dev/null +++ b/tests/lib/comments/comment.php @@ -0,0 +1,112 @@ +<?php + +namespace Test\Comments; + +use Test\TestCase; + +class Test_Comments_Comment extends TestCase +{ + + public function testSettersValidInput() { + $comment = new \OC\Comments\Comment(); + + $id = 'comment23'; + $parentId = 'comment11.5'; + $childrenCount = 6; + $message = 'I like to comment comment'; + $verb = 'comment'; + $actor = ['type' => 'user', 'id' => 'alice']; + $creationDT = new \DateTime(); + $latestChildDT = new \DateTime('yesterday'); + $object = ['type' => 'file', 'id' => 'file64']; + + $comment + ->setId($id) + ->setParentId($parentId) + ->setChildrenCount($childrenCount) + ->setMessage($message) + ->setVerb($verb) + ->setActor($actor['type'], $actor['id']) + ->setCreationDateTime($creationDT) + ->setLatestChildDateTime($latestChildDT) + ->setObject($object['type'], $object['id']); + + $this->assertSame($id, $comment->getId()); + $this->assertSame($parentId, $comment->getParentId()); + $this->assertSame($childrenCount, $comment->getChildrenCount()); + $this->assertSame($message, $comment->getMessage()); + $this->assertSame($verb, $comment->getVerb()); + $this->assertSame($actor['type'], $comment->getActorType()); + $this->assertSame($actor['id'], $comment->getActorId()); + $this->assertSame($creationDT, $comment->getCreationDateTime()); + $this->assertSame($latestChildDT, $comment->getLatestChildDateTime()); + $this->assertSame($object['type'], $comment->getObjectType()); + $this->assertSame($object['id'], $comment->getObjectId()); + } + + /** + * @expectedException \OCP\Comments\IllegalIDChangeException + */ + public function testSetIdIllegalInput() { + $comment = new \OC\Comments\Comment(); + + $comment->setId('c23'); + $comment->setId('c17'); + } + + public function testResetId() { + $comment = new \OC\Comments\Comment(); + $comment->setId('c23'); + $comment->setId(''); + + $this->assertSame('', $comment->getId()); + } + + public function simpleSetterProvider() { + return [ + ['Id', true], + ['ParentId', true], + ['Message', true], + ['Verb', true], + ['Verb', ''], + ['ChildrenCount', true], + ]; + } + + /** + * @dataProvider simpleSetterProvider + * @expectedException \InvalidArgumentException + */ + public function testSimpleSetterInvalidInput($field, $input) { + $comment = new \OC\Comments\Comment(); + $setter = 'set' . $field; + + $comment->$setter($input); + } + + public function roleSetterProvider() { + return [ + ['Actor', true, true], + ['Actor', 'user', true], + ['Actor', true, 'alice'], + ['Actor', ' ', ' '], + ['Object', true, true], + ['Object', 'file', true], + ['Object', true, 'file64'], + ['Object', ' ', ' '], + ]; + } + + /** + * @dataProvider roleSetterProvider + * @expectedException \InvalidArgumentException + */ + public function testSetRoleInvalidInput($role, $type, $id){ + $comment = new \OC\Comments\Comment(); + $setter = 'set' . $role; + $comment->$setter($type, $id); + } + + + +} diff --git a/tests/lib/comments/fakefactory.php b/tests/lib/comments/fakefactory.php new file mode 100644 index 00000000000..837bcb10585 --- /dev/null +++ b/tests/lib/comments/fakefactory.php @@ -0,0 +1,13 @@ +<?php + +namespace Test\Comments; + +/** + * Class FakeFactory + */ +class FakeFactory implements \OCP\Comments\ICommentsManagerFactory { + + public function getManager() { + return new FakeManager(); + } +} diff --git a/tests/lib/comments/fakemanager.php b/tests/lib/comments/fakemanager.php new file mode 100644 index 00000000000..e5cf58dda4f --- /dev/null +++ b/tests/lib/comments/fakemanager.php @@ -0,0 +1,33 @@ +<?php + +namespace Test\Comments; + +/** + * Class FakeManager + */ +class FakeManager implements \OCP\Comments\ICommentsManager { + + public function get($id) {} + + public function getTree($id, $limit = 0, $offset = 0) {} + + public function getForObject( + $objectType, + $objectId, + $limit = 0, + $offset = 0, + \DateTime $notOlderThan = null + ) {} + + public function getNumberOfCommentsForObject($objectType, $objectId) {} + + public function create($actorType, $actorId, $objectType, $objectId) {} + + public function delete($id) {} + + public function save(\OCP\Comments\IComment $comment) {} + + public function deleteReferencesOfActor($actorType, $actorId) {} + + public function deleteCommentsAtObject($objectType, $objectId) {} +} diff --git a/tests/lib/comments/manager.php b/tests/lib/comments/manager.php new file mode 100644 index 00000000000..248de683253 --- /dev/null +++ b/tests/lib/comments/manager.php @@ -0,0 +1,564 @@ +<?php + +namespace Test\Comments; + +use OCP\Comments\ICommentsManager; +use Test\TestCase; + +/** + * Class Test_Comments_Manager + * + * @group DB + */ +class Test_Comments_Manager extends TestCase +{ + + public function setUp() { + parent::setUp(); + + $sql = \OC::$server->getDatabaseConnection()->getDatabasePlatform()->getTruncateTableSQL('`*PREFIX*comments`'); + \OC::$server->getDatabaseConnection()->prepare($sql)->execute(); + } + + protected function addDatabaseEntry($parentId, $topmostParentId, $creationDT = null, $latestChildDT = null) { + if(is_null($creationDT)) { + $creationDT = new \DateTime(); + } + if(is_null($latestChildDT)) { + $latestChildDT = new \DateTime('yesterday'); + } + + $qb = \OC::$server->getDatabaseConnection()->getQueryBuilder(); + $qb + ->insert('comments') + ->values([ + 'parent_id' => $qb->createNamedParameter($parentId), + 'topmost_parent_id' => $qb->createNamedParameter($topmostParentId), + 'children_count' => $qb->createNamedParameter(2), + 'actor_type' => $qb->createNamedParameter('user'), + 'actor_id' => $qb->createNamedParameter('alice'), + 'message' => $qb->createNamedParameter('nice one'), + 'verb' => $qb->createNamedParameter('comment'), + 'creation_timestamp' => $qb->createNamedParameter($creationDT, 'datetime'), + 'latest_child_timestamp' => $qb->createNamedParameter($latestChildDT, 'datetime'), + 'object_type' => $qb->createNamedParameter('file'), + 'object_id' => $qb->createNamedParameter('file64'), + ]) + ->execute(); + + return $qb->getLastInsertId(); + } + + protected function getManager() { + $factory = new \OC\Comments\ManagerFactory(); + return $factory->getManager(); + } + + /** + * @expectedException \OCP\Comments\NotFoundException + */ + public function testGetCommentNotFound() { + $manager = $this->getManager(); + $manager->get('22'); + } + + /** + * @expectedException \InvalidArgumentException + */ + public function testGetCommentNotFoundInvalidInput() { + $manager = $this->getManager(); + $manager->get('unexisting22'); + } + + public function testGetComment() { + $manager = $this->getManager(); + + $creationDT = new \DateTime(); + $latestChildDT = new \DateTime('yesterday'); + + $qb = \OC::$server->getDatabaseConnection()->getQueryBuilder(); + $qb + ->insert('comments') + ->values([ + 'parent_id' => $qb->createNamedParameter('2'), + 'topmost_parent_id' => $qb->createNamedParameter('1'), + 'children_count' => $qb->createNamedParameter(2), + 'actor_type' => $qb->createNamedParameter('user'), + 'actor_id' => $qb->createNamedParameter('alice'), + 'message' => $qb->createNamedParameter('nice one'), + 'verb' => $qb->createNamedParameter('comment'), + 'creation_timestamp' => $qb->createNamedParameter($creationDT, 'datetime'), + 'latest_child_timestamp' => $qb->createNamedParameter($latestChildDT, 'datetime'), + 'object_type' => $qb->createNamedParameter('file'), + 'object_id' => $qb->createNamedParameter('file64'), + ]) + ->execute(); + + $id = strval($qb->getLastInsertId()); + + $comment = $manager->get($id); + $this->assertTrue($comment instanceof \OCP\Comments\IComment); + $this->assertSame($comment->getId(), $id); + $this->assertSame($comment->getParentId(), '2'); + $this->assertSame($comment->getTopmostParentId(), '1'); + $this->assertSame($comment->getChildrenCount(), 2); + $this->assertSame($comment->getActorType(), 'user'); + $this->assertSame($comment->getActorId(), 'alice'); + $this->assertSame($comment->getMessage(), 'nice one'); + $this->assertSame($comment->getVerb(), 'comment'); + $this->assertSame($comment->getObjectType(), 'file'); + $this->assertSame($comment->getObjectId(), 'file64'); + $this->assertEquals($comment->getCreationDateTime(), $creationDT); + $this->assertEquals($comment->getLatestChildDateTime(), $latestChildDT); + } + + /** + * @expectedException \OCP\Comments\NotFoundException + */ + public function testGetTreeNotFound() { + $manager = $this->getManager(); + $manager->getTree('22'); + } + + /** + * @expectedException \InvalidArgumentException + */ + public function testGetTreeNotFoundInvalidIpnut() { + $manager = $this->getManager(); + $manager->getTree('unexisting22'); + } + + public function testGetTree() { + $headId = $this->addDatabaseEntry(0, 0); + + $this->addDatabaseEntry($headId, $headId, new \DateTime('-3 hours')); + $this->addDatabaseEntry($headId, $headId, new \DateTime('-2 hours')); + $id = $this->addDatabaseEntry($headId, $headId, new \DateTime('-1 hour')); + + $manager = $this->getManager(); + $tree = $manager->getTree($headId); + + // Verifying the root comment + $this->assertTrue(isset($tree['comment'])); + $this->assertTrue($tree['comment'] instanceof \OCP\Comments\IComment); + $this->assertSame($tree['comment']->getId(), strval($headId)); + $this->assertTrue(isset($tree['replies'])); + $this->assertSame(count($tree['replies']), 3); + + // one level deep + foreach($tree['replies'] as $reply) { + $this->assertTrue($reply['comment'] instanceof \OCP\Comments\IComment); + $this->assertSame($reply['comment']->getId(), strval($id)); + $this->assertSame(count($reply['replies']), 0); + $id--; + } + } + + public function testGetTreeNoReplies() { + $id = $this->addDatabaseEntry(0, 0); + + $manager = $this->getManager(); + $tree = $manager->getTree($id); + + // Verifying the root comment + $this->assertTrue(isset($tree['comment'])); + $this->assertTrue($tree['comment'] instanceof \OCP\Comments\IComment); + $this->assertSame($tree['comment']->getId(), strval($id)); + $this->assertTrue(isset($tree['replies'])); + $this->assertSame(count($tree['replies']), 0); + + // one level deep + foreach($tree['replies'] as $reply) { + throw new \Exception('This ain`t happen'); + } + } + + public function testGetTreeWithLimitAndOffset() { + $headId = $this->addDatabaseEntry(0, 0); + + $this->addDatabaseEntry($headId, $headId, new \DateTime('-3 hours')); + $this->addDatabaseEntry($headId, $headId, new \DateTime('-2 hours')); + $this->addDatabaseEntry($headId, $headId, new \DateTime('-1 hour')); + $idToVerify = $this->addDatabaseEntry($headId, $headId, new \DateTime()); + + $manager = $this->getManager(); + + for ($offset = 0; $offset < 3; $offset += 2) { + $tree = $manager->getTree(strval($headId), 2, $offset); + + // Verifying the root comment + $this->assertTrue(isset($tree['comment'])); + $this->assertTrue($tree['comment'] instanceof \OCP\Comments\IComment); + $this->assertSame($tree['comment']->getId(), strval($headId)); + $this->assertTrue(isset($tree['replies'])); + $this->assertSame(count($tree['replies']), 2); + + // one level deep + foreach ($tree['replies'] as $reply) { + $this->assertTrue($reply['comment'] instanceof \OCP\Comments\IComment); + $this->assertSame($reply['comment']->getId(), strval($idToVerify)); + $this->assertSame(count($reply['replies']), 0); + $idToVerify--; + } + } + } + + public function testGetForObject() { + $this->addDatabaseEntry(0, 0); + + $manager = $this->getManager(); + $comments = $manager->getForObject('file', 'file64'); + + $this->assertTrue(is_array($comments)); + $this->assertSame(count($comments), 1); + $this->assertTrue($comments[0] instanceof \OCP\Comments\IComment); + $this->assertSame($comments[0]->getMessage(), 'nice one'); + } + + public function testGetForObjectWithLimitAndOffset() { + $this->addDatabaseEntry(0, 0, new \DateTime('-6 hours')); + $this->addDatabaseEntry(0, 0, new \DateTime('-5 hours')); + $this->addDatabaseEntry(1, 1, new \DateTime('-4 hours')); + $this->addDatabaseEntry(0, 0, new \DateTime('-3 hours')); + $this->addDatabaseEntry(2, 2, new \DateTime('-2 hours')); + $this->addDatabaseEntry(2, 2, new \DateTime('-1 hours')); + $idToVerify = $this->addDatabaseEntry(3, 1, new \DateTime()); + + $manager = $this->getManager(); + $offset = 0; + do { + $comments = $manager->getForObject('file', 'file64', 3, $offset); + + $this->assertTrue(is_array($comments)); + foreach($comments as $comment) { + $this->assertTrue($comment instanceof \OCP\Comments\IComment); + $this->assertSame($comment->getMessage(), 'nice one'); + $this->assertSame($comment->getId(), strval($idToVerify)); + $idToVerify--; + } + $offset += 3; + } while(count($comments) > 0); + } + + public function testGetForObjectWithDateTimeConstraint() { + $this->addDatabaseEntry(0, 0, new \DateTime('-6 hours')); + $this->addDatabaseEntry(0, 0, new \DateTime('-5 hours')); + $id1 = $this->addDatabaseEntry(0, 0, new \DateTime('-3 hours')); + $id2 = $this->addDatabaseEntry(2, 2, new \DateTime('-2 hours')); + + $manager = $this->getManager(); + $comments = $manager->getForObject('file', 'file64', 0, 0, new \DateTime('-4 hours')); + + $this->assertSame(count($comments), 2); + $this->assertSame($comments[0]->getId(), strval($id2)); + $this->assertSame($comments[1]->getId(), strval($id1)); + } + + public function testGetForObjectWithLimitAndOffsetAndDateTimeConstraint() { + $this->addDatabaseEntry(0, 0, new \DateTime('-7 hours')); + $this->addDatabaseEntry(0, 0, new \DateTime('-6 hours')); + $this->addDatabaseEntry(1, 1, new \DateTime('-5 hours')); + $this->addDatabaseEntry(0, 0, new \DateTime('-3 hours')); + $this->addDatabaseEntry(2, 2, new \DateTime('-2 hours')); + $this->addDatabaseEntry(2, 2, new \DateTime('-1 hours')); + $idToVerify = $this->addDatabaseEntry(3, 1, new \DateTime()); + + $manager = $this->getManager(); + $offset = 0; + do { + $comments = $manager->getForObject('file', 'file64', 3, $offset, new \DateTime('-4 hours')); + + $this->assertTrue(is_array($comments)); + foreach($comments as $comment) { + $this->assertTrue($comment instanceof \OCP\Comments\IComment); + $this->assertSame($comment->getMessage(), 'nice one'); + $this->assertSame($comment->getId(), strval($idToVerify)); + $this->assertTrue(intval($comment->getId()) >= 4); + $idToVerify--; + } + $offset += 3; + } while(count($comments) > 0); + } + + public function testGetNumberOfCommentsForObject() { + for($i = 1; $i < 5; $i++) { + $this->addDatabaseEntry(0, 0); + } + + $manager = $this->getManager(); + + $amount = $manager->getNumberOfCommentsForObject('untype', '00'); + $this->assertSame($amount, 0); + + $amount = $manager->getNumberOfCommentsForObject('file', 'file64'); + $this->assertSame($amount, 4); + } + + public function invalidCreateArgsProvider() { + return [ + ['', 'aId-1', 'oType-1', 'oId-1'], + ['aType-1', '', 'oType-1', 'oId-1'], + ['aType-1', 'aId-1', '', 'oId-1'], + ['aType-1', 'aId-1', 'oType-1', ''], + [1, 'aId-1', 'oType-1', 'oId-1'], + ['aType-1', 1, 'oType-1', 'oId-1'], + ['aType-1', 'aId-1', 1, 'oId-1'], + ['aType-1', 'aId-1', 'oType-1', 1], + ]; + } + + /** + * @dataProvider invalidCreateArgsProvider + * @expectedException \InvalidArgumentException + */ + public function testCreateCommentInvalidArguments($aType, $aId, $oType, $oId) { + $manager = $this->getManager(); + $manager->create($aType, $aId, $oType, $oId); + } + + public function testCreateComment() { + $actorType = 'bot'; + $actorId = 'bob'; + $objectType = 'weather'; + $objectId = 'bielefeld'; + + $comment = $this->getManager()->create($actorType, $actorId, $objectType, $objectId); + $this->assertTrue($comment instanceof \OCP\Comments\IComment); + $this->assertSame($comment->getActorType(), $actorType); + $this->assertSame($comment->getActorId(), $actorId); + $this->assertSame($comment->getObjectType(), $objectType); + $this->assertSame($comment->getObjectId(), $objectId); + } + + /** + * @expectedException \OCP\Comments\NotFoundException + */ + public function testDelete() { + $manager = $this->getManager(); + + $done = $manager->delete('404'); + $this->assertFalse($done); + + $done = $manager->delete('%'); + $this->assertFalse($done); + + $done = $manager->delete(''); + $this->assertFalse($done); + + $id = strval($this->addDatabaseEntry(0, 0)); + $comment = $manager->get($id); + $this->assertTrue($comment instanceof \OCP\Comments\IComment); + $done = $manager->delete($id); + $this->assertTrue($done); + $manager->get($id); + } + + public function testSaveNew() { + $manager = $this->getManager(); + $comment = new \OC\Comments\Comment(); + $comment + ->setActor('user', 'alice') + ->setObject('file', 'file64') + ->setMessage('very beautiful, I am impressed!') + ->setVerb('comment'); + + $saveSuccessful = $manager->save($comment); + $this->assertTrue($saveSuccessful); + $this->assertTrue($comment->getId() !== ''); + $this->assertTrue($comment->getId() !== '0'); + $this->assertTrue(!is_null($comment->getCreationDateTime())); + + $loadedComment = $manager->get($comment->getId()); + $this->assertSame($comment->getMessage(), $loadedComment->getMessage()); + $this->assertEquals($comment->getCreationDateTime(), $loadedComment->getCreationDateTime()); + } + + public function testSaveUpdate() { + $manager = $this->getManager(); + $comment = new \OC\Comments\Comment(); + $comment + ->setActor('user', 'alice') + ->setObject('file', 'file64') + ->setMessage('very beautiful, I am impressed!') + ->setVerb('comment'); + + $manager->save($comment); + + $comment->setMessage('very beautiful, I am really so much impressed!'); + $manager->save($comment); + + $loadedComment = $manager->get($comment->getId()); + $this->assertSame($comment->getMessage(), $loadedComment->getMessage()); + } + + /** + * @expectedException \OCP\Comments\NotFoundException + */ + public function testSaveUpdateException() { + $manager = $this->getManager(); + $comment = new \OC\Comments\Comment(); + $comment + ->setActor('user', 'alice') + ->setObject('file', 'file64') + ->setMessage('very beautiful, I am impressed!') + ->setVerb('comment'); + + $manager->save($comment); + + $manager->delete($comment->getId()); + $comment->setMessage('very beautiful, I am really so much impressed!'); + $manager->save($comment); + } + + /** + * @expectedException \UnexpectedValueException + */ + public function testSaveIncomplete() { + $manager = $this->getManager(); + $comment = new \OC\Comments\Comment(); + $comment->setMessage('from no one to nothing'); + $manager->save($comment); + } + + public function testSaveAsChild() { + $id = $this->addDatabaseEntry(0, 0); + + $manager = $this->getManager(); + + for($i = 0; $i < 3; $i++) { + $comment = new \OC\Comments\Comment(); + $comment + ->setActor('user', 'alice') + ->setObject('file', 'file64') + ->setParentId(strval($id)) + ->setMessage('full ack') + ->setVerb('comment') + // setting the creation time avoids using sleep() while making sure to test with different timestamps + ->setCreationDateTime(new \DateTime('+' . $i . ' minutes')); + + $manager->save($comment); + + $this->assertSame($comment->getTopmostParentId(), strval($id)); + $parentComment = $manager->get(strval($id)); + $this->assertSame($parentComment->getChildrenCount(), $i + 1); + $this->assertEquals($parentComment->getLatestChildDateTime(), $comment->getCreationDateTime()); + } + } + + public function invalidActorArgsProvider() { + return + [ + ['', ''], + [1, 'alice'], + ['user', 1], + ]; + } + + /** + * @dataProvider invalidActorArgsProvider + * @expectedException \InvalidArgumentException + */ + public function testDeleteReferencesOfActorInvalidInput($type, $id) { + $manager = $this->getManager(); + $manager->deleteReferencesOfActor($type, $id); + } + + public function testDeleteReferencesOfActor() { + $ids = []; + $ids[] = $this->addDatabaseEntry(0, 0); + $ids[] = $this->addDatabaseEntry(0, 0); + $ids[] = $this->addDatabaseEntry(0, 0); + + $manager = $this->getManager(); + + // just to make sure they are really set, with correct actor data + $comment = $manager->get(strval($ids[1])); + $this->assertSame($comment->getActorType(), 'user'); + $this->assertSame($comment->getActorId(), 'alice'); + + $wasSuccessful = $manager->deleteReferencesOfActor('user', 'alice'); + $this->assertTrue($wasSuccessful); + + foreach($ids as $id) { + $comment = $manager->get(strval($id)); + $this->assertSame($comment->getActorType(), ICommentsManager::DELETED_USER); + $this->assertSame($comment->getActorId(), ICommentsManager::DELETED_USER); + } + + // actor info is gone from DB, but when database interaction is alright, + // we still expect to get true back + $wasSuccessful = $manager->deleteReferencesOfActor('user', 'alice'); + $this->assertTrue($wasSuccessful); + } + + public function testDeleteReferencesOfActorWithUserManagement() { + $user = \OC::$server->getUserManager()->createUser('xenia', '123456'); + $this->assertTrue($user instanceof \OCP\IUser); + + $manager = \OC::$server->getCommentsManager(); + $comment = $manager->create('user', $user->getUID(), 'file', 'file64'); + $comment + ->setMessage('Most important comment I ever left on the Internet.') + ->setVerb('comment'); + $status = $manager->save($comment); + $this->assertTrue($status); + + $commentID = $comment->getId(); + $user->delete(); + + $comment = $manager->get($commentID); + $this->assertSame($comment->getActorType(), \OCP\Comments\ICommentsManager::DELETED_USER); + $this->assertSame($comment->getActorId(), \OCP\Comments\ICommentsManager::DELETED_USER); + } + + public function invalidObjectArgsProvider() { + return + [ + ['', ''], + [1, 'file64'], + ['file', 1], + ]; + } + + /** + * @dataProvider invalidObjectArgsProvider + * @expectedException \InvalidArgumentException + */ + public function testDeleteCommentsAtObjectInvalidInput($type, $id) { + $manager = $this->getManager(); + $manager->deleteCommentsAtObject($type, $id); + } + + public function testDeleteCommentsAtObject() { + $ids = []; + $ids[] = $this->addDatabaseEntry(0, 0); + $ids[] = $this->addDatabaseEntry(0, 0); + $ids[] = $this->addDatabaseEntry(0, 0); + + $manager = $this->getManager(); + + // just to make sure they are really set, with correct actor data + $comment = $manager->get(strval($ids[1])); + $this->assertSame($comment->getObjectType(), 'file'); + $this->assertSame($comment->getObjectId(), 'file64'); + + $wasSuccessful = $manager->deleteCommentsAtObject('file', 'file64'); + $this->assertTrue($wasSuccessful); + + $verified = 0; + foreach($ids as $id) { + try { + $manager->get(strval($id)); + } catch (\OCP\Comments\NotFoundException $e) { + $verified++; + } + } + $this->assertSame($verified, 3); + + // actor info is gone from DB, but when database interaction is alright, + // we still expect to get true back + $wasSuccessful = $manager->deleteCommentsAtObject('file', 'file64'); + $this->assertTrue($wasSuccessful); + } + +} diff --git a/tests/lib/db/querybuilder/querybuildertest.php b/tests/lib/db/querybuilder/querybuildertest.php index ca3901ad049..de8f84ac345 100644 --- a/tests/lib/db/querybuilder/querybuildertest.php +++ b/tests/lib/db/querybuilder/querybuildertest.php @@ -48,12 +48,12 @@ class QueryBuilderTest extends \Test\TestCase { $this->queryBuilder = new QueryBuilder($this->connection); } - protected function createTestingRows() { + protected function createTestingRows($appId = 'testFirstResult') { $qB = $this->connection->getQueryBuilder(); for ($i = 1; $i < 10; $i++) { $qB->insert('*PREFIX*appconfig') ->values([ - 'appid' => $qB->expr()->literal('testFirstResult'), + 'appid' => $qB->expr()->literal($appId), 'configkey' => $qB->expr()->literal('testing' . $i), 'configvalue' => $qB->expr()->literal(100 - $i), ]) @@ -80,11 +80,11 @@ class QueryBuilderTest extends \Test\TestCase { return $rows; } - protected function deleteTestingRows() { + protected function deleteTestingRows($appId = 'testFirstResult') { $qB = $this->connection->getQueryBuilder(); $qB->delete('*PREFIX*appconfig') - ->where($qB->expr()->eq('appid', $qB->expr()->literal('testFirstResult'))) + ->where($qB->expr()->eq('appid', $qB->expr()->literal($appId))) ->execute(); } @@ -272,6 +272,34 @@ class QueryBuilderTest extends \Test\TestCase { $this->deleteTestingRows(); } + public function testSelectDistinct() { + $this->deleteTestingRows('testFirstResult1'); + $this->deleteTestingRows('testFirstResult2'); + $this->createTestingRows('testFirstResult1'); + $this->createTestingRows('testFirstResult2'); + + $this->queryBuilder->selectDistinct('appid'); + + $this->queryBuilder->from('*PREFIX*appconfig') + ->where($this->queryBuilder->expr()->in( + 'appid', + [$this->queryBuilder->expr()->literal('testFirstResult1'), $this->queryBuilder->expr()->literal('testFirstResult2')] + )) + ->orderBy('appid', 'DESC'); + + $query = $this->queryBuilder->execute(); + $rows = $query->fetchAll(); + $query->closeCursor(); + + $this->assertEquals( + [['appid' => 'testFirstResult2'], ['appid' => 'testFirstResult1']], + $rows + ); + + $this->deleteTestingRows('testFirstResult1'); + $this->deleteTestingRows('testFirstResult2'); + } + public function dataAddSelect() { $queryBuilder = new QueryBuilder(\OC::$server->getDatabaseConnection()); return [ @@ -1086,6 +1114,43 @@ class QueryBuilderTest extends \Test\TestCase { ); } + public function testGetLastInsertId() { + $qB = $this->connection->getQueryBuilder(); + + try { + $qB->getLastInsertId(); + $this->fail('getLastInsertId() should throw an exception, when being called before insert()'); + } catch (\BadMethodCallException $e) { + $this->assertTrue(true); + } + + $qB->insert('properties') + ->values([ + 'userid' => $qB->expr()->literal('testFirstResult'), + 'propertypath' => $qB->expr()->literal('testing'), + 'propertyname' => $qB->expr()->literal('testing'), + 'propertyvalue' => $qB->expr()->literal('testing'), + ]) + ->execute(); + + $actual = $qB->getLastInsertId(); + + $this->assertNotNull($actual); + $this->assertInternalType('int', $actual); + $this->assertEquals($this->connection->lastInsertId('*PREFIX*properties'), $actual); + + $qB->delete('properties') + ->where($qB->expr()->eq('userid', $qB->expr()->literal('testFirstResult'))) + ->execute(); + + try { + $qB->getLastInsertId(); + $this->fail('getLastInsertId() should throw an exception, when being called after delete()'); + } catch (\BadMethodCallException $e) { + $this->assertTrue(true); + } + } + public function dataGetTableName() { return [ ['*PREFIX*table', null, '`*PREFIX*table`'], @@ -1112,7 +1177,27 @@ class QueryBuilderTest extends \Test\TestCase { $this->assertSame( $expected, - $this->invokePrivate($this->queryBuilder, 'getTableName', [$tableName]) + $this->queryBuilder->getTableName($tableName) + ); + } + + public function dataGetColumnName() { + return [ + ['column', '', '`column`'], + ['column', 'a', 'a.`column`'], + ]; + } + + /** + * @dataProvider dataGetColumnName + * @param string $column + * @param string $prefix + * @param string $expected + */ + public function testGetColumnName($column, $prefix, $expected) { + $this->assertSame( + $expected, + $this->queryBuilder->getColumnName($column, $prefix) ); } } diff --git a/tests/lib/files/node/file.php b/tests/lib/files/node/file.php index d0072949c7f..ccc777c499f 100644 --- a/tests/lib/files/node/file.php +++ b/tests/lib/files/node/file.php @@ -21,8 +21,16 @@ class File extends \Test\TestCase { $this->user = new \OC\User\User('', new \Test\Util\User\Dummy); } + protected function getMockStorage() { + $storage = $this->getMock('\OCP\Files\Storage'); + $storage->expects($this->any()) + ->method('getId') + ->will($this->returnValue('home::someuser')); + return $storage; + } + protected function getFileInfo($data) { - return new FileInfo('', null, '', $data, null); + return new FileInfo('', $this->getMockStorage(), '', $data, null); } public function testDelete() { diff --git a/tests/lib/files/node/folder.php b/tests/lib/files/node/folder.php index d95e1b5d2b2..09bf32561e6 100644 --- a/tests/lib/files/node/folder.php +++ b/tests/lib/files/node/folder.php @@ -31,8 +31,16 @@ class Folder extends \Test\TestCase { $this->user = new \OC\User\User('', new \Test\Util\User\Dummy); } + protected function getMockStorage() { + $storage = $this->getMock('\OCP\Files\Storage'); + $storage->expects($this->any()) + ->method('getId') + ->will($this->returnValue('home::someuser')); + return $storage; + } + protected function getFileInfo($data) { - return new FileInfo('', null, '', $data, null); + return new FileInfo('', $this->getMockStorage(), '', $data, null); } public function testDelete() { diff --git a/tests/lib/files/node/node.php b/tests/lib/files/node/node.php index afcf4cbabaa..a1693b034fa 100644 --- a/tests/lib/files/node/node.php +++ b/tests/lib/files/node/node.php @@ -18,8 +18,16 @@ class Node extends \Test\TestCase { $this->user = new \OC\User\User('', new \Test\Util\User\Dummy); } + protected function getMockStorage() { + $storage = $this->getMock('\OCP\Files\Storage'); + $storage->expects($this->any()) + ->method('getId') + ->will($this->returnValue('home::someuser')); + return $storage; + } + protected function getFileInfo($data) { - return new FileInfo('', null, '', $data, null); + return new FileInfo('', $this->getMockStorage(), '', $data, null); } public function testStat() { diff --git a/tests/lib/lock/dblockingprovider.php b/tests/lib/lock/dblockingprovider.php index d679b1ea677..2032110f4f0 100644 --- a/tests/lib/lock/dblockingprovider.php +++ b/tests/lib/lock/dblockingprovider.php @@ -85,13 +85,7 @@ class DBLockingProvider extends LockingProvider { $this->assertEquals(3, $this->getLockEntryCount()); - $this->instance->cleanEmptyLocks(); - - $this->assertEquals(3, $this->getLockEntryCount()); - - $this->instance->releaseAll(); - - $this->instance->cleanEmptyLocks(); + $this->instance->cleanExpiredLocks(); $this->assertEquals(2, $this->getLockEntryCount()); } diff --git a/tests/lib/security/securerandom.php b/tests/lib/security/securerandom.php index d9bbd0e71e5..af437640805 100644 --- a/tests/lib/security/securerandom.php +++ b/tests/lib/security/securerandom.php @@ -57,11 +57,10 @@ class SecureRandomTest extends \Test\TestCase { } /** - * @expectedException \Exception - * @expectedExceptionMessage Generator is not initialized + * @dataProvider stringGenerationProvider */ - function testUninitializedGenerate() { - $this->rng->generate(30); + function testUninitializedGenerate($length, $expectedLength) { + $this->assertEquals($expectedLength, strlen($this->rng->generate($length))); } /** diff --git a/tests/lib/security/stringutils.php b/tests/lib/security/stringutils.php deleted file mode 100644 index 060315debb4..00000000000 --- a/tests/lib/security/stringutils.php +++ /dev/null @@ -1,38 +0,0 @@ -<?php -/** - * Copyright (c) 2014 Lukas Reschke <lukas@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -use \OC\Security\StringUtils; - -class StringUtilsTest extends \Test\TestCase { - - public function dataProvider() - { - return array( - array('Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt.', 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt.'), - array('', ''), - array('我看这本书。 我看這本書', '我看这本书。 我看這本書'), - array('GpKY9fSnWNJbES99zVGvA', 'GpKY9fSnWNJbES99zVGvA') - ); - } - - /** - * @dataProvider dataProvider - */ - function testWrongEquals($string) { - $this->assertFalse(StringUtils::equals($string, 'A Completely Wrong String')); - $this->assertFalse(StringUtils::equals($string, null)); - } - - /** - * @dataProvider dataProvider - */ - function testTrueEquals($string, $expected) { - $this->assertTrue(StringUtils::equals($string, $expected)); - } - -} diff --git a/tests/lib/security/trusteddomainhelper.php b/tests/lib/security/trusteddomainhelper.php index c8d5ffa587b..52a8f1be630 100644 --- a/tests/lib/security/trusteddomainhelper.php +++ b/tests/lib/security/trusteddomainhelper.php @@ -64,6 +64,8 @@ class TrustedDomainHelperTest extends \Test\TestCase { // do not trust invalid localhosts [$trustedHostTestList, 'localhost:1:2', false], [$trustedHostTestList, 'localhost: evil.host', false], + // do not trust casting + [[1], '1', false], ]; } diff --git a/tests/lib/server.php b/tests/lib/server.php index b72bef82036..6b569e77dd9 100644 --- a/tests/lib/server.php +++ b/tests/lib/server.php @@ -61,6 +61,7 @@ class Server extends \Test\TestCase { ['CapabilitiesManager', '\OC\CapabilitiesManager'], ['ContactsManager', '\OC\ContactsManager'], ['ContactsManager', '\OCP\Contacts\IManager'], + ['CommentsManager', '\OCP\Comments\ICommentsManager'], ['Crypto', '\OC\Security\Crypto'], ['Crypto', '\OCP\Security\ICrypto'], ['CryptoWrapper', '\OC\Session\CryptoWrapper'], @@ -173,4 +174,16 @@ class Server extends \Test\TestCase { $this->assertInstanceOf('\OC_EventSource', $this->server->createEventSource(), 'service returned by "createEventSource" did not return the right class'); $this->assertInstanceOf('\OCP\IEventSource', $this->server->createEventSource(), 'service returned by "createEventSource" did not return the right class'); } + + public function testOverwriteDefaultCommentsManager() { + $config = $this->server->getConfig(); + $defaultManagerFactory = $config->getSystemValue('comments.managerFactory', '\OC\Comments\ManagerFactory'); + + $config->setSystemValue('comments.managerFactory', '\Test\Comments\FakeFactory'); + + $manager = $this->server->getCommentsManager(); + $this->assertInstanceOf('\OCP\Comments\ICommentsManager', $manager); + + $config->setSystemValue('comments.managerFactory', $defaultManagerFactory); + } } diff --git a/tests/lib/share/MailNotificationsTest.php b/tests/lib/share/MailNotificationsTest.php index 8684886e798..66bec8653fb 100644 --- a/tests/lib/share/MailNotificationsTest.php +++ b/tests/lib/share/MailNotificationsTest.php @@ -20,7 +20,6 @@ */ use OC\Share\MailNotifications; -use OCP\IConfig; use OCP\IL10N; use OCP\IUser; use OCP\Mail\IMailer; @@ -234,6 +233,9 @@ class MailNotificationsTest extends \Test\TestCase { } + /** + * @param string $subject + */ protected function setupMailerMock($subject, $to, $exceptionOnSend = true) { $message = $this->getMockBuilder('\OC\Mail\Message') ->disableOriginalConstructor()->getMock(); diff --git a/tests/lib/systemtag/systemtagmanagertest.php b/tests/lib/systemtag/systemtagmanagertest.php index 8498b85519f..97c072f33f6 100644 --- a/tests/lib/systemtag/systemtagmanagertest.php +++ b/tests/lib/systemtag/systemtagmanagertest.php @@ -250,7 +250,7 @@ class SystemTagManagerTest extends TestCase { $tag1 = $this->tagManager->createTag('one', true, false); $tag2 = $this->tagManager->createTag('two', false, true); - $tagList = $this->tagManager->getTagsById([$tag1->getId(), $tag2->getId()]); + $tagList = $this->tagManager->getTagsByIds([$tag1->getId(), $tag2->getId()]); $this->assertCount(2, $tagList); @@ -270,7 +270,7 @@ class SystemTagManagerTest extends TestCase { */ public function testGetNonExistingTagsById() { $tag1 = $this->tagManager->createTag('one', true, false); - $this->tagManager->getTagsById([$tag1->getId(), 100, 101]); + $this->tagManager->getTagsByIds([$tag1->getId(), 100, 101]); } /** @@ -278,7 +278,7 @@ class SystemTagManagerTest extends TestCase { */ public function testGetInvalidTagIdFormat() { $tag1 = $this->tagManager->createTag('one', true, false); - $this->tagManager->getTagsById([$tag1->getId() . 'suffix']); + $this->tagManager->getTagsByIds([$tag1->getId() . 'suffix']); } public function updateTagProvider() { diff --git a/tests/lib/systemtag/systemtagobjectmappertest.php b/tests/lib/systemtag/systemtagobjectmappertest.php index 43d0b8c6960..4ea80c216ed 100644 --- a/tests/lib/systemtag/systemtagobjectmappertest.php +++ b/tests/lib/systemtag/systemtagobjectmappertest.php @@ -74,7 +74,7 @@ class SystemTagObjectMapperTest extends TestCase { $this->tag3 = new SystemTag(3, 'testtag3', false, false); $this->tagManager->expects($this->any()) - ->method('getTagsById') + ->method('getTagsByIds') ->will($this->returnCallback(function($tagIds) { $result = []; if (in_array(1, $tagIds)) { diff --git a/tests/lib/util.php b/tests/lib/util.php index 9b82be36955..fa559c17c80 100644 --- a/tests/lib/util.php +++ b/tests/lib/util.php @@ -95,16 +95,22 @@ class Test_Util extends \Test\TestCase { } function testSanitizeHTML() { - $badArray = array( + $badArray = [ 'While it is unusual to pass an array', 'this function actually <blink>supports</blink> it.', - 'And therefore there needs to be a <script>alert("Unit"+\'test\')</script> for it!' - ); - $goodArray = array( + 'And therefore there needs to be a <script>alert("Unit"+\'test\')</script> for it!', + [ + 'And It Even May <strong>Nest</strong>', + ], + ]; + $goodArray = [ 'While it is unusual to pass an array', 'this function actually <blink>supports</blink> it.', - 'And therefore there needs to be a <script>alert("Unit"+'test')</script> for it!' - ); + 'And therefore there needs to be a <script>alert("Unit"+'test')</script> for it!', + [ + 'And It Even May <strong>Nest</strong>' + ], + ]; $result = OC_Util::sanitizeHTML($badArray); $this->assertEquals($goodArray, $result); diff --git a/tests/phpunit-autotest-external.xml b/tests/phpunit-autotest-external.xml index b9402bfa572..31d2e395a01 100644 --- a/tests/phpunit-autotest-external.xml +++ b/tests/phpunit-autotest-external.xml @@ -1,6 +1,5 @@ <?xml version="1.0" encoding="utf-8" ?> <phpunit bootstrap="bootstrap.php" - strict="true" verbose="true" timeoutForSmallTests="900" timeoutForMediumTests="900" diff --git a/tests/startsessionlistener.php b/tests/startsessionlistener.php index 1f3573555ca..88544cc6ce9 100644 --- a/tests/startsessionlistener.php +++ b/tests/startsessionlistener.php @@ -44,4 +44,7 @@ class StartSessionListener implements PHPUnit_Framework_TestListener { public function endTestSuite(PHPUnit_Framework_TestSuite $suite) { } + public function addWarning(\PHPUnit_Framework_Test $test, \PHPUnit_Framework_Warning $e, $time) { + } + } |