diff options
Diffstat (limited to 'apps')
26 files changed, 555 insertions, 378 deletions
diff --git a/apps/dav/l10n/nl.js b/apps/dav/l10n/nl.js index 850411957ce..0df7cc22374 100644 --- a/apps/dav/l10n/nl.js +++ b/apps/dav/l10n/nl.js @@ -20,18 +20,20 @@ OC.L10N.register( "You deleted calendar {calendar}" : "Je verwijderde agenda {calendar}", "{actor} updated calendar {calendar}" : "{actor} werkte agenda {calendar} bij", "You updated calendar {calendar}" : "Je werkte agenda {calendar} bij", + "{actor} restored calendar {calendar}" : "{actor} herstelde agenda {calendar}", + "You restored calendar {calendar}" : "Jij herstelde agenda {calendar}", "You shared calendar {calendar} as public link" : "Je deelde de agenda {calendar} als openbare link", "You removed public link for calendar {calendar}" : "Je verwijderde de openbare link voor de agenda {calendar}", "{actor} shared calendar {calendar} with you" : "{actor} deelde agenda {calendar} met je", "You shared calendar {calendar} with {user}" : "Je deelde agenda {calendar} met {user}", "{actor} shared calendar {calendar} with {user}" : "{actor} deelde agenda {calendar} met {user}", "{actor} unshared calendar {calendar} from you" : "{actor} is gestop de agenda {calendar} met je te delen", - "You unshared calendar {calendar} from {user}" : "Je stopte met delen agenda {calendar} met {user}", - "{actor} unshared calendar {calendar} from {user}" : "{actor} stopte met delen agenda {calendar} met {user}", - "{actor} unshared calendar {calendar} from themselves" : "{actor} stopte het delen van agenda {calendar} met zichzelf", + "You unshared calendar {calendar} from {user}" : "Je stopte met delen agenda {calendar} van {user}", + "{actor} unshared calendar {calendar} from {user}" : "{actor} stopte met delen agenda {calendar} van {user}", + "{actor} unshared calendar {calendar} from themselves" : "{actor} stopte het delen van agenda {calendar} van zichzelf", "You shared calendar {calendar} with group {group}" : "Je deelde agenda {calendar} met groep {group}", "{actor} shared calendar {calendar} with group {group}" : "{actor} deelde agenda {calendar} met groep {group}", - "You unshared calendar {calendar} from group {group}" : "Je stopte het delen van agenda {calendar} met groep {group}", + "You unshared calendar {calendar} from group {group}" : "Je stopte het delen van agenda {calendar} van groep {group}", "{actor} unshared calendar {calendar} from group {group}" : "{actor} stopte het delen van agenda {calendar} met groep {group}", "{actor} created event {event} in calendar {calendar}" : "{actor} creëerde afspraak {event} in agenda {calendar}", "You created event {event} in calendar {calendar}" : "Je creëerde afspraak {event} in agenda {calendar}", @@ -39,6 +41,8 @@ OC.L10N.register( "You deleted event {event} from calendar {calendar}" : "Je verwijderde afspraak {event} uit agenda {calendar}", "{actor} updated event {event} in calendar {calendar}" : "{actor} heeft afspraak {event} in agenda {calendar} bijgewerkt", "You updated event {event} in calendar {calendar}" : "Je hebt afspraak {event} in agenda {calendar} bijgewerkt", + "{actor} restored event {event} of calendar {calendar}" : "{actor} herstelde afspraak {event} in agenda {calendar}", + "You restored event {event} of calendar {calendar}" : "Je herstelde afspraak {event} in agenda {calendar}", "Busy" : "Bezig", "{actor} created todo {todo} in list {calendar}" : "{actor} creëerde taak {todo} in lijst {calendar}", "You created todo {todo} in list {calendar}" : "Jij creëerde taak {todo} in lijst {calendar}", @@ -50,6 +54,7 @@ OC.L10N.register( "You solved todo {todo} in list {calendar}" : "Je hebt taak {todo} in lijst {calendar} afgewerkt", "{actor} reopened todo {todo} in list {calendar}" : "{actor} heropende taak {todo} in lijst {calendar}", "You reopened todo {todo} in list {calendar}" : "Je heropende taak {todo} in lijst {calendar}", + "Calendar, contacts and tasks" : "Agenda, contactpersonen en taken", "A <strong>calendar</strong> was modified" : "Een <strong>agenda</strong> is aangepast", "A calendar <strong>event</strong> was modified" : "Een agenda <strong>gebeurtenis</strong> is aangepast", "A calendar <strong>todo</strong> was modified" : "Een agenda <strong>Te doen</strong> was aangepast", @@ -86,6 +91,30 @@ OC.L10N.register( "More options …" : "Meer opties …", "More options at %s" : "Meer opties op %s", "Contacts" : "Contactpersonen", + "{actor} created addressbook {addressbook}" : "{actor} creëerde adresboek {addressbook}", + "You created addressbook {addressbook}" : "Je creëere adresboek {addressbook}", + "{actor} deleted addressbook {addressbook}" : "{actor} verwijdede adresboek {addressbook}", + "You deleted addressbook {addressbook}" : "Je verwijderde adresboek {addressbook}", + "{actor} updated addressbook {addressbook}" : "{actor} wijzigde adresboek {addressbook}", + "You updated addressbook {addressbook}" : "Je wijzigde adresboek {addressbook}", + "{actor} shared addressbook {addressbook} with you" : "{actor} deelde adresboek {addressbook} met jou", + "You shared addressbook {addressbook} with {user}" : "Jij deelde adresboek {addressbook} met {user}", + "{actor} shared addressbook {addressbook} with {user}" : "{actor} deelde adresboek {addressbook} met {user}", + "{actor} unshared addressbook {addressbook} from you" : "{actor} stopte met delen adresboek {addressbook} van jou", + "You unshared addressbook {addressbook} from {user}" : "Je stopte met delen adresboek {calendar} van {user}", + "{actor} unshared addressbook {addressbook} from {user}" : " stopte met delen adresboek {addressbook} van {user}", + "{actor} unshared addressbook {addressbook} from themselves" : "{actor} stopte het delen van het adresboek {addressbook} van zichzelf", + "You shared addressbook {addressbook} with group {group}" : "Je deelde adresboek {addressbook } met groep {group}", + "{actor} shared addressbook {addressbook} with group {group}" : "{actor} deelde adresboek {addressbook} met groep {group}", + "You unshared addressbook {addressbook} from group {group}" : "Je stopte het delen van adresboek {addressbook} van groep {group}", + "{actor} unshared addressbook {addressbook} from group {group}" : "{actor} stopte het delen van adresboek {addressbook} van groep {group}", + "{actor} created contact {card} in addressbook {addressbook}" : "{actor} creëerde contact {card} in adresboek {addressbook}", + "You created contact {card} in addressbook {addressbook}" : "Je creëerde contact {card} in adresboek {addressbook}", + "{actor} deleted contact {card} from addressbook {addressbook}" : "{actor} verwijderde contact {card} uit adresboek {addressbook}", + "You deleted contact {card} from addressbook {addressbook}" : "Je verwijderde contact {card} uit adresboek {addressbook}", + "{actor} updated contact {card} in addressbook {addressbook}" : "{actor} wijzigde contact {card} in adresboek {addressbook}", + "You updated contact {card} in addressbook {addressbook}" : "Je wijzigde contact {card} in adresboek {addressbook}", + "A <strong>contact</strong> or <strong>addressbook</strong> was modified" : "Een <strong>contact</strong> uit adresboek </strong> is gewijzigd", "System is in maintenance mode." : "Systeem in onderhoudsmodus.", "Upgrade needed" : "Upgrade vereist", "Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "Je %s moet worden geconfigureerd voor gebruik van HTTPS om CalDAV en CardDAV met iOS/macOS te kunnen gebruiken.", diff --git a/apps/dav/l10n/nl.json b/apps/dav/l10n/nl.json index dec7e00d9ad..ba3340ca801 100644 --- a/apps/dav/l10n/nl.json +++ b/apps/dav/l10n/nl.json @@ -18,18 +18,20 @@ "You deleted calendar {calendar}" : "Je verwijderde agenda {calendar}", "{actor} updated calendar {calendar}" : "{actor} werkte agenda {calendar} bij", "You updated calendar {calendar}" : "Je werkte agenda {calendar} bij", + "{actor} restored calendar {calendar}" : "{actor} herstelde agenda {calendar}", + "You restored calendar {calendar}" : "Jij herstelde agenda {calendar}", "You shared calendar {calendar} as public link" : "Je deelde de agenda {calendar} als openbare link", "You removed public link for calendar {calendar}" : "Je verwijderde de openbare link voor de agenda {calendar}", "{actor} shared calendar {calendar} with you" : "{actor} deelde agenda {calendar} met je", "You shared calendar {calendar} with {user}" : "Je deelde agenda {calendar} met {user}", "{actor} shared calendar {calendar} with {user}" : "{actor} deelde agenda {calendar} met {user}", "{actor} unshared calendar {calendar} from you" : "{actor} is gestop de agenda {calendar} met je te delen", - "You unshared calendar {calendar} from {user}" : "Je stopte met delen agenda {calendar} met {user}", - "{actor} unshared calendar {calendar} from {user}" : "{actor} stopte met delen agenda {calendar} met {user}", - "{actor} unshared calendar {calendar} from themselves" : "{actor} stopte het delen van agenda {calendar} met zichzelf", + "You unshared calendar {calendar} from {user}" : "Je stopte met delen agenda {calendar} van {user}", + "{actor} unshared calendar {calendar} from {user}" : "{actor} stopte met delen agenda {calendar} van {user}", + "{actor} unshared calendar {calendar} from themselves" : "{actor} stopte het delen van agenda {calendar} van zichzelf", "You shared calendar {calendar} with group {group}" : "Je deelde agenda {calendar} met groep {group}", "{actor} shared calendar {calendar} with group {group}" : "{actor} deelde agenda {calendar} met groep {group}", - "You unshared calendar {calendar} from group {group}" : "Je stopte het delen van agenda {calendar} met groep {group}", + "You unshared calendar {calendar} from group {group}" : "Je stopte het delen van agenda {calendar} van groep {group}", "{actor} unshared calendar {calendar} from group {group}" : "{actor} stopte het delen van agenda {calendar} met groep {group}", "{actor} created event {event} in calendar {calendar}" : "{actor} creëerde afspraak {event} in agenda {calendar}", "You created event {event} in calendar {calendar}" : "Je creëerde afspraak {event} in agenda {calendar}", @@ -37,6 +39,8 @@ "You deleted event {event} from calendar {calendar}" : "Je verwijderde afspraak {event} uit agenda {calendar}", "{actor} updated event {event} in calendar {calendar}" : "{actor} heeft afspraak {event} in agenda {calendar} bijgewerkt", "You updated event {event} in calendar {calendar}" : "Je hebt afspraak {event} in agenda {calendar} bijgewerkt", + "{actor} restored event {event} of calendar {calendar}" : "{actor} herstelde afspraak {event} in agenda {calendar}", + "You restored event {event} of calendar {calendar}" : "Je herstelde afspraak {event} in agenda {calendar}", "Busy" : "Bezig", "{actor} created todo {todo} in list {calendar}" : "{actor} creëerde taak {todo} in lijst {calendar}", "You created todo {todo} in list {calendar}" : "Jij creëerde taak {todo} in lijst {calendar}", @@ -48,6 +52,7 @@ "You solved todo {todo} in list {calendar}" : "Je hebt taak {todo} in lijst {calendar} afgewerkt", "{actor} reopened todo {todo} in list {calendar}" : "{actor} heropende taak {todo} in lijst {calendar}", "You reopened todo {todo} in list {calendar}" : "Je heropende taak {todo} in lijst {calendar}", + "Calendar, contacts and tasks" : "Agenda, contactpersonen en taken", "A <strong>calendar</strong> was modified" : "Een <strong>agenda</strong> is aangepast", "A calendar <strong>event</strong> was modified" : "Een agenda <strong>gebeurtenis</strong> is aangepast", "A calendar <strong>todo</strong> was modified" : "Een agenda <strong>Te doen</strong> was aangepast", @@ -84,6 +89,30 @@ "More options …" : "Meer opties …", "More options at %s" : "Meer opties op %s", "Contacts" : "Contactpersonen", + "{actor} created addressbook {addressbook}" : "{actor} creëerde adresboek {addressbook}", + "You created addressbook {addressbook}" : "Je creëere adresboek {addressbook}", + "{actor} deleted addressbook {addressbook}" : "{actor} verwijdede adresboek {addressbook}", + "You deleted addressbook {addressbook}" : "Je verwijderde adresboek {addressbook}", + "{actor} updated addressbook {addressbook}" : "{actor} wijzigde adresboek {addressbook}", + "You updated addressbook {addressbook}" : "Je wijzigde adresboek {addressbook}", + "{actor} shared addressbook {addressbook} with you" : "{actor} deelde adresboek {addressbook} met jou", + "You shared addressbook {addressbook} with {user}" : "Jij deelde adresboek {addressbook} met {user}", + "{actor} shared addressbook {addressbook} with {user}" : "{actor} deelde adresboek {addressbook} met {user}", + "{actor} unshared addressbook {addressbook} from you" : "{actor} stopte met delen adresboek {addressbook} van jou", + "You unshared addressbook {addressbook} from {user}" : "Je stopte met delen adresboek {calendar} van {user}", + "{actor} unshared addressbook {addressbook} from {user}" : " stopte met delen adresboek {addressbook} van {user}", + "{actor} unshared addressbook {addressbook} from themselves" : "{actor} stopte het delen van het adresboek {addressbook} van zichzelf", + "You shared addressbook {addressbook} with group {group}" : "Je deelde adresboek {addressbook } met groep {group}", + "{actor} shared addressbook {addressbook} with group {group}" : "{actor} deelde adresboek {addressbook} met groep {group}", + "You unshared addressbook {addressbook} from group {group}" : "Je stopte het delen van adresboek {addressbook} van groep {group}", + "{actor} unshared addressbook {addressbook} from group {group}" : "{actor} stopte het delen van adresboek {addressbook} van groep {group}", + "{actor} created contact {card} in addressbook {addressbook}" : "{actor} creëerde contact {card} in adresboek {addressbook}", + "You created contact {card} in addressbook {addressbook}" : "Je creëerde contact {card} in adresboek {addressbook}", + "{actor} deleted contact {card} from addressbook {addressbook}" : "{actor} verwijderde contact {card} uit adresboek {addressbook}", + "You deleted contact {card} from addressbook {addressbook}" : "Je verwijderde contact {card} uit adresboek {addressbook}", + "{actor} updated contact {card} in addressbook {addressbook}" : "{actor} wijzigde contact {card} in adresboek {addressbook}", + "You updated contact {card} in addressbook {addressbook}" : "Je wijzigde contact {card} in adresboek {addressbook}", + "A <strong>contact</strong> or <strong>addressbook</strong> was modified" : "Een <strong>contact</strong> uit adresboek </strong> is gewijzigd", "System is in maintenance mode." : "Systeem in onderhoudsmodus.", "Upgrade needed" : "Upgrade vereist", "Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "Je %s moet worden geconfigureerd voor gebruik van HTTPS om CalDAV en CardDAV met iOS/macOS te kunnen gebruiken.", diff --git a/apps/dav/lib/DAV/CustomPropertiesBackend.php b/apps/dav/lib/DAV/CustomPropertiesBackend.php index d60bfddabfb..1bd207e0967 100644 --- a/apps/dav/lib/DAV/CustomPropertiesBackend.php +++ b/apps/dav/lib/DAV/CustomPropertiesBackend.php @@ -31,15 +31,19 @@ use Sabre\DAV\PropertyStorage\Backend\BackendInterface; use Sabre\DAV\PropFind; use Sabre\DAV\PropPatch; use Sabre\DAV\Tree; +use function array_intersect; class CustomPropertiesBackend implements BackendInterface { + /** @var string */ + private const TABLE_NAME = 'properties'; + /** * Ignored properties * - * @var array + * @var string[] */ - private $ignoredProperties = [ + private const IGNORED_PROPERTIES = [ '{DAV:}getcontentlength', '{DAV:}getcontenttype', '{DAV:}getetag', @@ -53,6 +57,15 @@ class CustomPropertiesBackend implements BackendInterface { ]; /** + * Properties set by one user, readable by all others + * + * @var array[] + */ + private const PUBLISHED_READ_ONLY_PROPERTIES = [ + '{urn:ietf:params:xml:ns:caldav}calendar-availability', + ]; + + /** * @var Tree */ private $tree; @@ -72,7 +85,7 @@ class CustomPropertiesBackend implements BackendInterface { * * @var array */ - private $cache = []; + private $userCache = []; /** * @param Tree $tree node tree @@ -101,7 +114,7 @@ class CustomPropertiesBackend implements BackendInterface { // these might appear $requestedProps = array_diff( $requestedProps, - $this->ignoredProperties + self::IGNORED_PROPERTIES ); // substr of calendars/ => path is inside the CalDAV component @@ -128,8 +141,12 @@ class CustomPropertiesBackend implements BackendInterface { return; } - $props = $this->getProperties($path, $requestedProps); - foreach ($props as $propName => $propValue) { + // First fetch the published properties (set by another user), then get the ones set by + // the current user. If both are set then the latter as priority. + foreach ($this->getPublishedProperties($path, $requestedProps) as $propName => $propValue) { + $propFind->set($propName, $propValue); + } + foreach ($this->getUserProperties($path, $requestedProps) as $propName => $propValue) { $propFind->set($propName, $propValue); } } @@ -160,7 +177,7 @@ class CustomPropertiesBackend implements BackendInterface { $statement->execute([$this->user->getUID(), $this->formatPath($path)]); $statement->closeCursor(); - unset($this->cache[$path]); + unset($this->userCache[$path]); } /** @@ -181,7 +198,33 @@ class CustomPropertiesBackend implements BackendInterface { } /** - * Returns a list of properties for this nodes.; + * @param string $path + * @param string[] $requestedProperties + * + * @return array + */ + private function getPublishedProperties(string $path, array $requestedProperties): array { + $allowedProps = array_intersect(self::PUBLISHED_READ_ONLY_PROPERTIES, $requestedProperties); + + if (empty($allowedProps)) { + return []; + } + + $qb = $this->connection->getQueryBuilder(); + $qb->select('*') + ->from(self::TABLE_NAME) + ->where($qb->expr()->eq('propertypath', $qb->createNamedParameter($path))); + $result = $qb->executeQuery(); + $props = []; + while ($row = $result->fetch()) { + $props[$row['propertyname']] = $row['propertyvalue']; + } + $result->closeCursor(); + return $props; + } + + /** + * Returns a list of properties for the given path and current user * * @param string $path * @param array $requestedProperties requested properties or empty array for "all" @@ -191,9 +234,9 @@ class CustomPropertiesBackend implements BackendInterface { * http://www.example.org/namespace#author If the array is empty, all * properties should be returned */ - private function getProperties(string $path, array $requestedProperties) { - if (isset($this->cache[$path])) { - return $this->cache[$path]; + private function getUserProperties(string $path, array $requestedProperties) { + if (isset($this->userCache[$path])) { + return $this->userCache[$path]; } // TODO: chunking if more than 1000 properties @@ -222,7 +265,7 @@ class CustomPropertiesBackend implements BackendInterface { $result->closeCursor(); - $this->cache[$path] = $props; + $this->userCache[$path] = $props; return $props; } @@ -245,7 +288,7 @@ class CustomPropertiesBackend implements BackendInterface { ' WHERE `userid` = ? AND `propertypath` = ? AND `propertyname` = ?'; // TODO: use "insert or update" strategy ? - $existing = $this->getProperties($path, []); + $existing = $this->getUserProperties($path, []); $this->connection->beginTransaction(); foreach ($properties as $propertyName => $propertyValue) { // If it was null, we need to delete the property @@ -283,7 +326,7 @@ class CustomPropertiesBackend implements BackendInterface { } $this->connection->commit(); - unset($this->cache[$path]); + unset($this->userCache[$path]); return true; } diff --git a/apps/federatedfilesharing/lib/Notifications.php b/apps/federatedfilesharing/lib/Notifications.php index b3d41cde851..c72a0691fad 100644 --- a/apps/federatedfilesharing/lib/Notifications.php +++ b/apps/federatedfilesharing/lib/Notifications.php @@ -405,7 +405,7 @@ class Notifications { * @param $fields * @param $action * - * @return bool + * @return array|false */ protected function tryOCMEndPoint($remoteDomain, $fields, $action) { switch ($action) { diff --git a/apps/files_external/3rdparty/composer.json b/apps/files_external/3rdparty/composer.json index b70bf2931ca..d8854aa976a 100644 --- a/apps/files_external/3rdparty/composer.json +++ b/apps/files_external/3rdparty/composer.json @@ -8,7 +8,7 @@ "classmap-authoritative": true }, "require": { - "icewind/streams": "0.7.3", + "icewind/streams": "0.7.4", "icewind/smb": "3.4.1" } } diff --git a/apps/files_external/3rdparty/composer.lock b/apps/files_external/3rdparty/composer.lock index 98afd1332ed..05de684a017 100644 --- a/apps/files_external/3rdparty/composer.lock +++ b/apps/files_external/3rdparty/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "dacbb67c9e2d1d46204d5b1a7f5cebc2", + "content-hash": "0ffc772b2aaaaffe52decb8d13361976", "packages": [ { "name": "icewind/smb", @@ -55,16 +55,16 @@ }, { "name": "icewind/streams", - "version": "v0.7.3", + "version": "v0.7.4", "source": { "type": "git", "url": "https://github.com/icewind1991/Streams.git", - "reference": "22ef9fc5b50d645dbc202206a656cc4dde28f95c" + "reference": "93bce472202d36d9808c30eaa52a1dc72b39e04c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/icewind1991/Streams/zipball/22ef9fc5b50d645dbc202206a656cc4dde28f95c", - "reference": "22ef9fc5b50d645dbc202206a656cc4dde28f95c", + "url": "https://api.github.com/repos/icewind1991/Streams/zipball/93bce472202d36d9808c30eaa52a1dc72b39e04c", + "reference": "93bce472202d36d9808c30eaa52a1dc72b39e04c", "shasum": "" }, "require": { @@ -94,9 +94,9 @@ "description": "A set of generic stream wrappers", "support": { "issues": "https://github.com/icewind1991/Streams/issues", - "source": "https://github.com/icewind1991/Streams/tree/v0.7.3" + "source": "https://github.com/icewind1991/Streams/tree/v0.7.4" }, - "time": "2021-03-02T19:33:35+00:00" + "time": "2021-03-12T15:48:22+00:00" } ], "packages-dev": [], @@ -107,5 +107,5 @@ "prefer-lowest": false, "platform": [], "platform-dev": [], - "plugin-api-version": "2.0.0" + "plugin-api-version": "2.1.0" } diff --git a/apps/files_external/3rdparty/composer/ClassLoader.php b/apps/files_external/3rdparty/composer/ClassLoader.php index 247294d66ee..6d0c3f2d001 100644 --- a/apps/files_external/3rdparty/composer/ClassLoader.php +++ b/apps/files_external/3rdparty/composer/ClassLoader.php @@ -338,7 +338,7 @@ class ClassLoader * Loads the given class or interface. * * @param string $class The name of the class - * @return bool|null True if loaded, null otherwise + * @return true|null True if loaded, null otherwise */ public function loadClass($class) { @@ -347,6 +347,8 @@ class ClassLoader return true; } + + return null; } /** diff --git a/apps/files_external/3rdparty/composer/InstalledVersions.php b/apps/files_external/3rdparty/composer/InstalledVersions.php index f28623ae66b..b3a4e1611e6 100644 --- a/apps/files_external/3rdparty/composer/InstalledVersions.php +++ b/apps/files_external/3rdparty/composer/InstalledVersions.php @@ -1,301 +1,337 @@ <?php - - - - - - - - - +/* + * This file is part of Composer. + * + * (c) Nils Adermann <naderman@naderman.de> + * Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ namespace Composer; use Composer\Autoload\ClassLoader; use Composer\Semver\VersionParser; - - - - - +/** + * This class is copied in every Composer installed project and available to all + * + * See also https://getcomposer.org/doc/07-runtime.md#installed-versions + * + * To require it's presence, you can require `composer-runtime-api ^2.0` + */ class InstalledVersions { -private static $installed = array ( - 'root' => - array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'aliases' => - array ( - ), - 'reference' => '9a69b8839389f133db55a41e1c2ba4435fd50c19', - 'name' => 'files_external/3rdparty', - ), - 'versions' => - array ( - 'files_external/3rdparty' => - array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'aliases' => - array ( - ), - 'reference' => '9a69b8839389f133db55a41e1c2ba4435fd50c19', - ), - 'icewind/smb' => - array ( - 'pretty_version' => 'v3.4.1', - 'version' => '3.4.1.0', - 'aliases' => - array ( - ), - 'reference' => '9dba42ab2a3990de29e18cc62b0a8270aceb74e3', - ), - 'icewind/streams' => - array ( - 'pretty_version' => 'v0.7.3', - 'version' => '0.7.3.0', - 'aliases' => - array ( - ), - 'reference' => '22ef9fc5b50d645dbc202206a656cc4dde28f95c', - ), - ), -); -private static $canGetVendors; -private static $installedByVendor = array(); - - - - - - - -public static function getInstalledPackages() -{ -$packages = array(); -foreach (self::getInstalled() as $installed) { -$packages[] = array_keys($installed['versions']); -} - - -if (1 === \count($packages)) { -return $packages[0]; -} - -return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); -} - - - - - - - - - -public static function isInstalled($packageName) -{ -foreach (self::getInstalled() as $installed) { -if (isset($installed['versions'][$packageName])) { -return true; -} -} - -return false; -} - - - - - - - - - - - - - - -public static function satisfies(VersionParser $parser, $packageName, $constraint) -{ -$constraint = $parser->parseConstraints($constraint); -$provided = $parser->parseConstraints(self::getVersionRanges($packageName)); - -return $provided->matches($constraint); -} - - - - - - - - - - -public static function getVersionRanges($packageName) -{ -foreach (self::getInstalled() as $installed) { -if (!isset($installed['versions'][$packageName])) { -continue; -} - -$ranges = array(); -if (isset($installed['versions'][$packageName]['pretty_version'])) { -$ranges[] = $installed['versions'][$packageName]['pretty_version']; -} -if (array_key_exists('aliases', $installed['versions'][$packageName])) { -$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); -} -if (array_key_exists('replaced', $installed['versions'][$packageName])) { -$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); -} -if (array_key_exists('provided', $installed['versions'][$packageName])) { -$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); -} - -return implode(' || ', $ranges); -} - -throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); -} - - - - - -public static function getVersion($packageName) -{ -foreach (self::getInstalled() as $installed) { -if (!isset($installed['versions'][$packageName])) { -continue; -} - -if (!isset($installed['versions'][$packageName]['version'])) { -return null; -} - -return $installed['versions'][$packageName]['version']; -} - -throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); -} - - - - - -public static function getPrettyVersion($packageName) -{ -foreach (self::getInstalled() as $installed) { -if (!isset($installed['versions'][$packageName])) { -continue; -} - -if (!isset($installed['versions'][$packageName]['pretty_version'])) { -return null; -} - -return $installed['versions'][$packageName]['pretty_version']; -} - -throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); -} - - - - - -public static function getReference($packageName) -{ -foreach (self::getInstalled() as $installed) { -if (!isset($installed['versions'][$packageName])) { -continue; -} - -if (!isset($installed['versions'][$packageName]['reference'])) { -return null; -} - -return $installed['versions'][$packageName]['reference']; -} - -throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); -} - - - - - -public static function getRootPackage() -{ -$installed = self::getInstalled(); - -return $installed[0]['root']; -} - - - - - - - -public static function getRawData() -{ -return self::$installed; -} - - - - - - - - - - - - - - - - - - - -public static function reload($data) -{ -self::$installed = $data; -self::$installedByVendor = array(); -} - - - - -private static function getInstalled() -{ -if (null === self::$canGetVendors) { -self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); -} - -$installed = array(); - -if (self::$canGetVendors) { -foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { -if (isset(self::$installedByVendor[$vendorDir])) { -$installed[] = self::$installedByVendor[$vendorDir]; -} elseif (is_file($vendorDir.'/composer/installed.php')) { -$installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; -} -} -} - -$installed[] = self::$installed; - -return $installed; -} + private static $installed; + private static $canGetVendors; + private static $installedByVendor = array(); + + /** + * Returns a list of all package names which are present, either by being installed, replaced or provided + * + * @return string[] + * @psalm-return list<string> + */ + public static function getInstalledPackages() + { + $packages = array(); + foreach (self::getInstalled() as $installed) { + $packages[] = array_keys($installed['versions']); + } + + if (1 === \count($packages)) { + return $packages[0]; + } + + return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); + } + + /** + * Returns a list of all package names with a specific type e.g. 'library' + * + * @param string $type + * @return string[] + * @psalm-return list<string> + */ + public static function getInstalledPackagesByType($type) + { + $packagesByType = array(); + + foreach (self::getInstalled() as $installed) { + foreach ($installed['versions'] as $name => $package) { + if (isset($package['type']) && $package['type'] === $type) { + $packagesByType[] = $name; + } + } + } + + return $packagesByType; + } + + /** + * Checks whether the given package is installed + * + * This also returns true if the package name is provided or replaced by another package + * + * @param string $packageName + * @param bool $includeDevRequirements + * @return bool + */ + public static function isInstalled($packageName, $includeDevRequirements = true) + { + foreach (self::getInstalled() as $installed) { + if (isset($installed['versions'][$packageName])) { + return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']); + } + } + + return false; + } + + /** + * Checks whether the given package satisfies a version constraint + * + * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: + * + * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') + * + * @param VersionParser $parser Install composer/semver to have access to this class and functionality + * @param string $packageName + * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package + * @return bool + */ + public static function satisfies(VersionParser $parser, $packageName, $constraint) + { + $constraint = $parser->parseConstraints($constraint); + $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); + + return $provided->matches($constraint); + } + + /** + * Returns a version constraint representing all the range(s) which are installed for a given package + * + * It is easier to use this via isInstalled() with the $constraint argument if you need to check + * whether a given version of a package is installed, and not just whether it exists + * + * @param string $packageName + * @return string Version constraint usable with composer/semver + */ + public static function getVersionRanges($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + $ranges = array(); + if (isset($installed['versions'][$packageName]['pretty_version'])) { + $ranges[] = $installed['versions'][$packageName]['pretty_version']; + } + if (array_key_exists('aliases', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); + } + if (array_key_exists('replaced', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); + } + if (array_key_exists('provided', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); + } + + return implode(' || ', $ranges); + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['version'])) { + return null; + } + + return $installed['versions'][$packageName]['version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getPrettyVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['pretty_version'])) { + return null; + } + + return $installed['versions'][$packageName]['pretty_version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference + */ + public static function getReference($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['reference'])) { + return null; + } + + return $installed['versions'][$packageName]['reference']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. + */ + public static function getInstallPath($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @return array + * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string} + */ + public static function getRootPackage() + { + $installed = self::getInstalled(); + + return $installed[0]['root']; + } + + /** + * Returns the raw installed.php data for custom implementations + * + * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. + * @return array[] + * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string}>} + */ + public static function getRawData() + { + @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + self::$installed = include __DIR__ . '/installed.php'; + } else { + self::$installed = array(); + } + } + + return self::$installed; + } + + /** + * Returns the raw data of all installed.php which are currently loaded for custom implementations + * + * @return array[] + * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string}>}> + */ + public static function getAllRawData() + { + return self::getInstalled(); + } + + /** + * Lets you reload the static array from another file + * + * This is only useful for complex integrations in which a project needs to use + * this class but then also needs to execute another project's autoloader in process, + * and wants to ensure both projects have access to their version of installed.php. + * + * A typical case would be PHPUnit, where it would need to make sure it reads all + * the data it needs from this class, then call reload() with + * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure + * the project in which it runs can then also use this class safely, without + * interference between PHPUnit's dependencies and the project's dependencies. + * + * @param array[] $data A vendor/composer/installed.php data set + * @return void + * + * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string}>} $data + */ + public static function reload($data) + { + self::$installed = $data; + self::$installedByVendor = array(); + } + + /** + * @return array[] + * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string}>}> + */ + private static function getInstalled() + { + if (null === self::$canGetVendors) { + self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); + } + + $installed = array(); + + if (self::$canGetVendors) { + foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + if (isset(self::$installedByVendor[$vendorDir])) { + $installed[] = self::$installedByVendor[$vendorDir]; + } elseif (is_file($vendorDir.'/composer/installed.php')) { + $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; + if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { + self::$installed = $installed[count($installed) - 1]; + } + } + } + } + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + self::$installed = require __DIR__ . '/installed.php'; + } else { + self::$installed = array(); + } + } + $installed[] = self::$installed; + + return $installed; + } } diff --git a/apps/files_external/3rdparty/composer/installed.json b/apps/files_external/3rdparty/composer/installed.json index 8f7b949ab05..7405962c70c 100644 --- a/apps/files_external/3rdparty/composer/installed.json +++ b/apps/files_external/3rdparty/composer/installed.json @@ -52,17 +52,17 @@ }, { "name": "icewind/streams", - "version": "v0.7.3", - "version_normalized": "0.7.3.0", + "version": "v0.7.4", + "version_normalized": "0.7.4.0", "source": { "type": "git", "url": "https://github.com/icewind1991/Streams.git", - "reference": "22ef9fc5b50d645dbc202206a656cc4dde28f95c" + "reference": "93bce472202d36d9808c30eaa52a1dc72b39e04c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/icewind1991/Streams/zipball/22ef9fc5b50d645dbc202206a656cc4dde28f95c", - "reference": "22ef9fc5b50d645dbc202206a656cc4dde28f95c", + "url": "https://api.github.com/repos/icewind1991/Streams/zipball/93bce472202d36d9808c30eaa52a1dc72b39e04c", + "reference": "93bce472202d36d9808c30eaa52a1dc72b39e04c", "shasum": "" }, "require": { @@ -73,7 +73,7 @@ "phpstan/phpstan": "^0.12", "phpunit/phpunit": "^9" }, - "time": "2021-03-02T19:33:35+00:00", + "time": "2021-03-12T15:48:22+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -94,7 +94,7 @@ "description": "A set of generic stream wrappers", "support": { "issues": "https://github.com/icewind1991/Streams/issues", - "source": "https://github.com/icewind1991/Streams/tree/v0.7.3" + "source": "https://github.com/icewind1991/Streams/tree/v0.7.4" }, "install-path": "../icewind/streams" } diff --git a/apps/files_external/3rdparty/composer/installed.php b/apps/files_external/3rdparty/composer/installed.php index 17718bf45f2..7dfd1c420f7 100644 --- a/apps/files_external/3rdparty/composer/installed.php +++ b/apps/files_external/3rdparty/composer/installed.php @@ -1,42 +1,41 @@ -<?php return array ( - 'root' => - array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'aliases' => - array ( +<?php return array( + 'root' => array( + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'type' => 'library', + 'install_path' => __DIR__ . '/../', + 'aliases' => array(), + 'reference' => '70483a16a3a232758979bb6fa363629b5a16b6a4', + 'name' => 'files_external/3rdparty', + 'dev' => true, ), - 'reference' => '9a69b8839389f133db55a41e1c2ba4435fd50c19', - 'name' => 'files_external/3rdparty', - ), - 'versions' => - array ( - 'files_external/3rdparty' => - array ( - 'pretty_version' => 'dev-master', - 'version' => 'dev-master', - 'aliases' => - array ( - ), - 'reference' => '9a69b8839389f133db55a41e1c2ba4435fd50c19', + 'versions' => array( + 'files_external/3rdparty' => array( + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'type' => 'library', + 'install_path' => __DIR__ . '/../', + 'aliases' => array(), + 'reference' => '70483a16a3a232758979bb6fa363629b5a16b6a4', + 'dev_requirement' => false, + ), + 'icewind/smb' => array( + 'pretty_version' => 'v3.4.1', + 'version' => '3.4.1.0', + 'type' => 'library', + 'install_path' => __DIR__ . '/../icewind/smb', + 'aliases' => array(), + 'reference' => '9dba42ab2a3990de29e18cc62b0a8270aceb74e3', + 'dev_requirement' => false, + ), + 'icewind/streams' => array( + 'pretty_version' => 'v0.7.4', + 'version' => '0.7.4.0', + 'type' => 'library', + 'install_path' => __DIR__ . '/../icewind/streams', + 'aliases' => array(), + 'reference' => '93bce472202d36d9808c30eaa52a1dc72b39e04c', + 'dev_requirement' => false, + ), ), - 'icewind/smb' => - array ( - 'pretty_version' => 'v3.4.1', - 'version' => '3.4.1.0', - 'aliases' => - array ( - ), - 'reference' => '9dba42ab2a3990de29e18cc62b0a8270aceb74e3', - ), - 'icewind/streams' => - array ( - 'pretty_version' => 'v0.7.3', - 'version' => '0.7.3.0', - 'aliases' => - array ( - ), - 'reference' => '22ef9fc5b50d645dbc202206a656cc4dde28f95c', - ), - ), ); diff --git a/apps/files_external/3rdparty/icewind/streams/src/Wrapper.php b/apps/files_external/3rdparty/icewind/streams/src/Wrapper.php index 5dc8b29e774..03d0b202571 100644 --- a/apps/files_external/3rdparty/icewind/streams/src/Wrapper.php +++ b/apps/files_external/3rdparty/icewind/streams/src/Wrapper.php @@ -92,7 +92,9 @@ abstract class Wrapper extends WrapperHandler implements File, Directory { } public function stream_close() { - return fclose($this->source); + if (is_resource($this->source)) { + return fclose($this->source); + } } public function dir_readdir() { diff --git a/apps/files_sharing/lib/External/Manager.php b/apps/files_sharing/lib/External/Manager.php index 720df28d107..e51bd64cf38 100644 --- a/apps/files_sharing/lib/External/Manager.php +++ b/apps/files_sharing/lib/External/Manager.php @@ -365,7 +365,7 @@ class Manager { private function sendFeedbackToRemote($remote, $token, $remoteId, $feedback) { $result = $this->tryOCMEndPoint($remote, $token, $remoteId, $feedback); - if ($result === true) { + if (is_array($result)) { return true; } @@ -401,7 +401,7 @@ class Manager { * @param string $token * @param string $remoteId id of the share * @param string $feedback - * @return bool + * @return array|false */ protected function tryOCMEndPoint($remoteDomain, $token, $remoteId, $feedback) { switch ($feedback) { diff --git a/apps/provisioning_api/lib/Controller/GroupsController.php b/apps/provisioning_api/lib/Controller/GroupsController.php index 543fc3b40ac..7b6e5319c2a 100644 --- a/apps/provisioning_api/lib/Controller/GroupsController.php +++ b/apps/provisioning_api/lib/Controller/GroupsController.php @@ -232,10 +232,11 @@ class GroupsController extends AUserData { * @PasswordConfirmationRequired * * @param string $groupid + * @param string $displayname * @return DataResponse * @throws OCSException */ - public function addGroup(string $groupid): DataResponse { + public function addGroup(string $groupid, string $displayname = ''): DataResponse { // Validate name if (empty($groupid)) { $this->logger->error('Group name not supplied', ['app' => 'provisioning_api']); @@ -245,7 +246,13 @@ class GroupsController extends AUserData { if ($this->groupManager->groupExists($groupid)) { throw new OCSException('group exists', 102); } - $this->groupManager->createGroup($groupid); + $group = $this->groupManager->createGroup($groupid); + if ($group === null) { + throw new OCSException('Not supported by backend', 103); + } + if ($displayname !== '') { + $group->setDisplayName($displayname); + } return new DataResponse(); } diff --git a/apps/provisioning_api/tests/Controller/GroupsControllerTest.php b/apps/provisioning_api/tests/Controller/GroupsControllerTest.php index 66e7665de63..12010995560 100644 --- a/apps/provisioning_api/tests/Controller/GroupsControllerTest.php +++ b/apps/provisioning_api/tests/Controller/GroupsControllerTest.php @@ -405,10 +405,12 @@ class GroupsControllerTest extends \Test\TestCase { ->with('NewGroup') ->willReturn(false); + $group = $this->createGroup('NewGroup'); $this->groupManager ->expects($this->once()) ->method('createGroup') - ->with('NewGroup'); + ->with('NewGroup') + ->willReturn($group); $this->api->addGroup('NewGroup'); } @@ -419,10 +421,12 @@ class GroupsControllerTest extends \Test\TestCase { ->with('Iñtërnâtiônàlizætiøn') ->willReturn(false); + $group = $this->createGroup('Iñtërnâtiônàlizætiøn'); $this->groupManager ->expects($this->once()) ->method('createGroup') - ->with('Iñtërnâtiônàlizætiøn'); + ->with('Iñtërnâtiônàlizætiøn') + ->willReturn($group); $this->api->addGroup('Iñtërnâtiônàlizætiøn'); } diff --git a/apps/settings/l10n/nl.js b/apps/settings/l10n/nl.js index 88de7e68b08..daa08358578 100644 --- a/apps/settings/l10n/nl.js +++ b/apps/settings/l10n/nl.js @@ -67,6 +67,7 @@ OC.L10N.register( "Please provide an admin recovery password; otherwise, all user data will be lost." : "Voer een beheerdersherstelwachtwoord in, anders zullen alle gebruikersgegevens verloren gaan", "Wrong admin recovery password. Please check the password and try again." : "Onjuist beheerdersherstelwachtwoord. Controleer het wachtwoord en probeer het opnieuw.", "Backend doesn't support password change, but the user's encryption key was updated." : "De Back-end ondersteunt geen wachtwoordwijzigingen, maar de cryptosleutel van de gebruiker is succesvol bijgewerkt.", + "installing and updating apps via the App Store or Federated Cloud Sharing" : "installeren en bijwerken van applicaties via de App Store of gefedereerd delen", "Federated Cloud Sharing" : "Gefedereerd delen via de cloud", "cURL is using an outdated %1$s version (%2$s). Please update your operating system or features such as %3$s will not work reliably." : "cUrl gebruikt een verouderde %1$s versie (%2$s). Werk het besturingssysteem bij, want anders zullen functies als %3$s niet betrouwbaar werken.", "Could not determine if TLS version of cURL is outdated or not because an error happened during the HTTPS request against https://nextcloud.com. Please check the nextcloud log file for more details." : "Kan niet bepalen of de TLS-versie van cURL verouderd is of niet, omdat er een fout is opgetreden tijdens het HTTPS-verzoek voor https://nextcloud.com. Controleer het logbestand van Nextcloud voor meer details.", @@ -293,6 +294,7 @@ OC.L10N.register( "Download and enable" : "Downloaden en inschakelen", "Enable" : "Inschakelen", "Enable untested app" : "Inschakelen niet-geteste apps", + "The app will be downloaded from the App Store" : "De app zal worden gedownload van de App Store", "This app is not marked as compatible with your Nextcloud version. If you continue you will still be able to install the app. Note that the app might not work as expected." : "Deze is niet aangeduid als compatibel met jouw versie van Nextcloud. Als je verdergaat, zal je de app kunnen installeren. Let op dat de app misschien niet werkt zoals verwacht.", "Never" : "Nooit", "An error occured during the request. Unable to proceed." : "Er trad een fout op bij de aanvraag. Kan niet doorgaan.", @@ -366,6 +368,7 @@ OC.L10N.register( "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Als beheerder kun je gedetailleerde regels voor delen instellen. Bekijk de documentatie voor meer informatie.", "Allow apps to use the Share API" : "Apps toestaan de Share API te gebruiken", "Set default expiration date for shares" : "Instellen standaard vervaldatum voor deellinks", + "Expire after" : "Vervallen na", "days" : "dagen", "Enforce expiration date" : "Het kiezen van een vervaldatum verplichten", "Set default expiration date for shares to other servers" : "Instellen standaard vervaldatum voor deellink naar andere servers", diff --git a/apps/settings/l10n/nl.json b/apps/settings/l10n/nl.json index c7a03b01e6e..a608bdd5153 100644 --- a/apps/settings/l10n/nl.json +++ b/apps/settings/l10n/nl.json @@ -65,6 +65,7 @@ "Please provide an admin recovery password; otherwise, all user data will be lost." : "Voer een beheerdersherstelwachtwoord in, anders zullen alle gebruikersgegevens verloren gaan", "Wrong admin recovery password. Please check the password and try again." : "Onjuist beheerdersherstelwachtwoord. Controleer het wachtwoord en probeer het opnieuw.", "Backend doesn't support password change, but the user's encryption key was updated." : "De Back-end ondersteunt geen wachtwoordwijzigingen, maar de cryptosleutel van de gebruiker is succesvol bijgewerkt.", + "installing and updating apps via the App Store or Federated Cloud Sharing" : "installeren en bijwerken van applicaties via de App Store of gefedereerd delen", "Federated Cloud Sharing" : "Gefedereerd delen via de cloud", "cURL is using an outdated %1$s version (%2$s). Please update your operating system or features such as %3$s will not work reliably." : "cUrl gebruikt een verouderde %1$s versie (%2$s). Werk het besturingssysteem bij, want anders zullen functies als %3$s niet betrouwbaar werken.", "Could not determine if TLS version of cURL is outdated or not because an error happened during the HTTPS request against https://nextcloud.com. Please check the nextcloud log file for more details." : "Kan niet bepalen of de TLS-versie van cURL verouderd is of niet, omdat er een fout is opgetreden tijdens het HTTPS-verzoek voor https://nextcloud.com. Controleer het logbestand van Nextcloud voor meer details.", @@ -291,6 +292,7 @@ "Download and enable" : "Downloaden en inschakelen", "Enable" : "Inschakelen", "Enable untested app" : "Inschakelen niet-geteste apps", + "The app will be downloaded from the App Store" : "De app zal worden gedownload van de App Store", "This app is not marked as compatible with your Nextcloud version. If you continue you will still be able to install the app. Note that the app might not work as expected." : "Deze is niet aangeduid als compatibel met jouw versie van Nextcloud. Als je verdergaat, zal je de app kunnen installeren. Let op dat de app misschien niet werkt zoals verwacht.", "Never" : "Nooit", "An error occured during the request. Unable to proceed." : "Er trad een fout op bij de aanvraag. Kan niet doorgaan.", @@ -364,6 +366,7 @@ "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Als beheerder kun je gedetailleerde regels voor delen instellen. Bekijk de documentatie voor meer informatie.", "Allow apps to use the Share API" : "Apps toestaan de Share API te gebruiken", "Set default expiration date for shares" : "Instellen standaard vervaldatum voor deellinks", + "Expire after" : "Vervallen na", "days" : "dagen", "Enforce expiration date" : "Het kiezen van een vervaldatum verplichten", "Set default expiration date for shares to other servers" : "Instellen standaard vervaldatum voor deellink naar andere servers", diff --git a/apps/twofactor_backupcodes/l10n/da.js b/apps/twofactor_backupcodes/l10n/da.js index 14ad87dd84e..60db65c65c0 100644 --- a/apps/twofactor_backupcodes/l10n/da.js +++ b/apps/twofactor_backupcodes/l10n/da.js @@ -10,7 +10,7 @@ OC.L10N.register( "Save backup codes" : "Gem backup-koder", "Print backup codes" : "Print backup-koder", "Regenerate backup codes" : "Regenerer backup-koder", - "If you regenerate backup codes, you automatically invalidate old codes." : "Hvis gu genere nye backup koder vil de gamle koder blive ubrugelige.", + "If you regenerate backup codes, you automatically invalidate old codes." : "Hvis du genere nye backup koder vil de gamle koder blive ubrugelige.", "An error occurred while generating your backup codes" : "Der opstod en fejl under genereringen af dine backup-koder", "Submit" : "Tilføj" }, diff --git a/apps/twofactor_backupcodes/l10n/da.json b/apps/twofactor_backupcodes/l10n/da.json index 7a14761fbd3..76936432057 100644 --- a/apps/twofactor_backupcodes/l10n/da.json +++ b/apps/twofactor_backupcodes/l10n/da.json @@ -8,7 +8,7 @@ "Save backup codes" : "Gem backup-koder", "Print backup codes" : "Print backup-koder", "Regenerate backup codes" : "Regenerer backup-koder", - "If you regenerate backup codes, you automatically invalidate old codes." : "Hvis gu genere nye backup koder vil de gamle koder blive ubrugelige.", + "If you regenerate backup codes, you automatically invalidate old codes." : "Hvis du genere nye backup koder vil de gamle koder blive ubrugelige.", "An error occurred while generating your backup codes" : "Der opstod en fejl under genereringen af dine backup-koder", "Submit" : "Tilføj" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/updatenotification/l10n/nl.js b/apps/updatenotification/l10n/nl.js index 0f5d64356ba..cee25e6c144 100644 --- a/apps/updatenotification/l10n/nl.js +++ b/apps/updatenotification/l10n/nl.js @@ -34,6 +34,7 @@ OC.L10N.register( "Checked on {lastCheckedDate}" : "Gecontroleerd op {lastCheckedDate}", "Checking apps for compatible versions" : "Apps controleren op compatibele versies.", "Please make sure your config.php does not set <samp>appstoreenabled</samp> to false." : "Zorg ervoor dat je in config.php <samp>appstoreenabled</samp> niet op 'false' zet.", + "Could not connect to the App Store or no updates have been returned at all. Search manually for updates or make sure your server has access to the internet and can connect to the App Store." : "Kan niet verbinden met de App Store of er zijn geen updates teruggegeven. Zoek handmatig naar updates of verifieer dat je server internettoegang heeft en kan verbinden met de App Store.", "<strong>All</strong> apps have a compatible version for this Nextcloud version available" : "<strong>Alle</strong> apps hebben een compatibele versie voor deze Nextcloud versie", "View changelog" : "Bekijk wijzigingenoverzicht", "Enterprise" : "Zakelijk", diff --git a/apps/updatenotification/l10n/nl.json b/apps/updatenotification/l10n/nl.json index 56e908fff13..ef86c9dc1e8 100644 --- a/apps/updatenotification/l10n/nl.json +++ b/apps/updatenotification/l10n/nl.json @@ -32,6 +32,7 @@ "Checked on {lastCheckedDate}" : "Gecontroleerd op {lastCheckedDate}", "Checking apps for compatible versions" : "Apps controleren op compatibele versies.", "Please make sure your config.php does not set <samp>appstoreenabled</samp> to false." : "Zorg ervoor dat je in config.php <samp>appstoreenabled</samp> niet op 'false' zet.", + "Could not connect to the App Store or no updates have been returned at all. Search manually for updates or make sure your server has access to the internet and can connect to the App Store." : "Kan niet verbinden met de App Store of er zijn geen updates teruggegeven. Zoek handmatig naar updates of verifieer dat je server internettoegang heeft en kan verbinden met de App Store.", "<strong>All</strong> apps have a compatible version for this Nextcloud version available" : "<strong>Alle</strong> apps hebben een compatibele versie voor deze Nextcloud versie", "View changelog" : "Bekijk wijzigingenoverzicht", "Enterprise" : "Zakelijk", diff --git a/apps/user_ldap/l10n/nl.js b/apps/user_ldap/l10n/nl.js index 1be6e0c381d..bee5ef37393 100644 --- a/apps/user_ldap/l10n/nl.js +++ b/apps/user_ldap/l10n/nl.js @@ -49,13 +49,17 @@ OC.L10N.register( "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Bekijk of je je zoekopdracht kunt verfijnen omdat die nu meerdere gebruikers treft en alleen de eerste gebruiker zal kunnen inloggen.", "An unspecified error occurred. Please check log and settings." : "Er trad een ongedefinieerde fout op. Controleer de log en de instellingen.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Het zoekfilter is ongeldig, waarschijnlijk door syntax problemen zoals een ongelijk aantal open- en sluithaakjes. Graag aanpassen.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Er trad een verbindingsfout naar LDAP/AD op, verifieer servernaam, poort en inloggegevens.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "De \"%uid\" opvultekst ontbreekt. Die wordt vervangen door de inlognaam bij het bevragen van LDAP/AD.", "Please provide a login name to test against" : "Geef een inlognaam op om opnieuw tegen te testen", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "De groepsbox was uitgeschakeld, omdat de LDAP/AD server het attribuut memberOf niet ondersteunt.", "Password change rejected. Hint: " : "Wachtwoordwijziging geweigerd. Hint:", "Please login with the new password" : "Login met je nieuwe wachtwoord", "LDAP User backend" : "LDAP User backend", "Your password will expire tomorrow." : "Je wachtwoord vervalt morgen.", "Your password will expire today." : "Je wachtwoord vervalt vandaag.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Je wachtwoord verloopt binnen %n dag.","Je wachtwoord vervalt over %n dagen."], + "LDAP/AD integration" : "LDAP/AD integratie", "_%s group found_::_%s groups found_" : ["%s groep gevonden","%s groepen gevonden"], "_%s user found_::_%s users found_" : ["%s gebruiker gevonden","%s gebruikers gevonden"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Kon het weergavenaam attribuut van de gebruiker niet vinden. Geef het zelf op in de geavanceerde LDAP instellingen.", @@ -77,6 +81,9 @@ OC.L10N.register( "The filter specifies which LDAP groups shall have access to the %s instance." : "Dit filter geeft aan welke LDAP groepen toegang hebben tot %s.", "Verify settings and count the groups" : "Verifiëren instellingen en tellen groepen", "When logging in, %s will find the user based on the following attributes:" : "Bij inloggen vindt %s de gebruiker gebaseerd op de volgende attributen:", + "LDAP/AD Username:" : "LDAP/AD gebruikersnaam:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Maakt inloggen tegen de LDAP/AD gebruikersnaam mogelijk, zowel \"uid\" en \"sAMAccountname\" worden gedetecteerd.", + "LDAP/AD Email Address:" : "LDAP/AD e-mailadres:", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Maak inloggen tegen een e-mailattribuut mogelijk. \"mail\" en \"mailPrimaryAddress\" zijn mogelijk.", "Other Attributes:" : "Overige attributen:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Definiëert het toe te passen filter als er geprobeerd wordt in te loggen. \"%%uid\" vervangt de gebruikersnaam bij het inloggen. Bijvoorbeeld: \"uid=%%uid\"", diff --git a/apps/user_ldap/l10n/nl.json b/apps/user_ldap/l10n/nl.json index 0712abb53fa..41aca6818d1 100644 --- a/apps/user_ldap/l10n/nl.json +++ b/apps/user_ldap/l10n/nl.json @@ -47,13 +47,17 @@ "Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Bekijk of je je zoekopdracht kunt verfijnen omdat die nu meerdere gebruikers treft en alleen de eerste gebruiker zal kunnen inloggen.", "An unspecified error occurred. Please check log and settings." : "Er trad een ongedefinieerde fout op. Controleer de log en de instellingen.", "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Het zoekfilter is ongeldig, waarschijnlijk door syntax problemen zoals een ongelijk aantal open- en sluithaakjes. Graag aanpassen.", + "A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Er trad een verbindingsfout naar LDAP/AD op, verifieer servernaam, poort en inloggegevens.", + "The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "De \"%uid\" opvultekst ontbreekt. Die wordt vervangen door de inlognaam bij het bevragen van LDAP/AD.", "Please provide a login name to test against" : "Geef een inlognaam op om opnieuw tegen te testen", + "The group box was disabled, because the LDAP/AD server does not support memberOf." : "De groepsbox was uitgeschakeld, omdat de LDAP/AD server het attribuut memberOf niet ondersteunt.", "Password change rejected. Hint: " : "Wachtwoordwijziging geweigerd. Hint:", "Please login with the new password" : "Login met je nieuwe wachtwoord", "LDAP User backend" : "LDAP User backend", "Your password will expire tomorrow." : "Je wachtwoord vervalt morgen.", "Your password will expire today." : "Je wachtwoord vervalt vandaag.", "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Je wachtwoord verloopt binnen %n dag.","Je wachtwoord vervalt over %n dagen."], + "LDAP/AD integration" : "LDAP/AD integratie", "_%s group found_::_%s groups found_" : ["%s groep gevonden","%s groepen gevonden"], "_%s user found_::_%s users found_" : ["%s gebruiker gevonden","%s gebruikers gevonden"], "Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Kon het weergavenaam attribuut van de gebruiker niet vinden. Geef het zelf op in de geavanceerde LDAP instellingen.", @@ -75,6 +79,9 @@ "The filter specifies which LDAP groups shall have access to the %s instance." : "Dit filter geeft aan welke LDAP groepen toegang hebben tot %s.", "Verify settings and count the groups" : "Verifiëren instellingen en tellen groepen", "When logging in, %s will find the user based on the following attributes:" : "Bij inloggen vindt %s de gebruiker gebaseerd op de volgende attributen:", + "LDAP/AD Username:" : "LDAP/AD gebruikersnaam:", + "Allows login against the LDAP/AD username, which is either \"uid\" or \"sAMAccountName\" and will be detected." : "Maakt inloggen tegen de LDAP/AD gebruikersnaam mogelijk, zowel \"uid\" en \"sAMAccountname\" worden gedetecteerd.", + "LDAP/AD Email Address:" : "LDAP/AD e-mailadres:", "Allows login against an email attribute. \"mail\" and \"mailPrimaryAddress\" allowed." : "Maak inloggen tegen een e-mailattribuut mogelijk. \"mail\" en \"mailPrimaryAddress\" zijn mogelijk.", "Other Attributes:" : "Overige attributen:", "Defines the filter to apply, when login is attempted. \"%%uid\" replaces the username in the login action. Example: \"uid=%%uid\"" : "Definiëert het toe te passen filter als er geprobeerd wordt in te loggen. \"%%uid\" vervangt de gebruikersnaam bij het inloggen. Bijvoorbeeld: \"uid=%%uid\"", diff --git a/apps/workflowengine/l10n/eu.js b/apps/workflowengine/l10n/eu.js index 056fc68a4dc..6bd23d0cd2e 100644 --- a/apps/workflowengine/l10n/eu.js +++ b/apps/workflowengine/l10n/eu.js @@ -83,6 +83,7 @@ OC.L10N.register( "Available flows" : "Fluxu erabilgarriak", "For details on how to write your own flow, check out the development documentation." : "Zeure fluxua idazten jakiteko informazioa lortzeko, begiratu garatzaileen dokumentazioa.", "More flows" : "Fluxu gehiago", + "Browse the App Store" : "Arakatu aplikazio biltegia", "Show less" : "Erakutsi gutxiago", "Show more" : "Erakutsi gehiago", "Configured flows" : "Konfiguratutako fluxuak", diff --git a/apps/workflowengine/l10n/eu.json b/apps/workflowengine/l10n/eu.json index 5203c506423..a3f99389cd9 100644 --- a/apps/workflowengine/l10n/eu.json +++ b/apps/workflowengine/l10n/eu.json @@ -81,6 +81,7 @@ "Available flows" : "Fluxu erabilgarriak", "For details on how to write your own flow, check out the development documentation." : "Zeure fluxua idazten jakiteko informazioa lortzeko, begiratu garatzaileen dokumentazioa.", "More flows" : "Fluxu gehiago", + "Browse the App Store" : "Arakatu aplikazio biltegia", "Show less" : "Erakutsi gutxiago", "Show more" : "Erakutsi gehiago", "Configured flows" : "Konfiguratutako fluxuak", diff --git a/apps/workflowengine/l10n/nl.js b/apps/workflowengine/l10n/nl.js index 9ef5e3309c8..43cdc939b34 100644 --- a/apps/workflowengine/l10n/nl.js +++ b/apps/workflowengine/l10n/nl.js @@ -83,6 +83,7 @@ OC.L10N.register( "Available flows" : "Beschikbare flows", "For details on how to write your own flow, check out the development documentation." : "Raadpleeg de ontwikkeldocumentatie voor meer informatie over het ontwikkelen van je eigen flow.", "More flows" : "Meer flows", + "Browse the App Store" : "Blader door de App Store", "Show less" : "Toon minder", "Show more" : "Toon meer", "Configured flows" : "Geconfigureerde flows", diff --git a/apps/workflowengine/l10n/nl.json b/apps/workflowengine/l10n/nl.json index d8e761783eb..2cf401fa063 100644 --- a/apps/workflowengine/l10n/nl.json +++ b/apps/workflowengine/l10n/nl.json @@ -81,6 +81,7 @@ "Available flows" : "Beschikbare flows", "For details on how to write your own flow, check out the development documentation." : "Raadpleeg de ontwikkeldocumentatie voor meer informatie over het ontwikkelen van je eigen flow.", "More flows" : "Meer flows", + "Browse the App Store" : "Blader door de App Store", "Show less" : "Toon minder", "Show more" : "Toon meer", "Configured flows" : "Geconfigureerde flows", |