diff options
Diffstat (limited to 'apps')
36 files changed, 222 insertions, 146 deletions
diff --git a/apps/dav/l10n/uk.js b/apps/dav/l10n/uk.js index 5749f898e59..e7dc8cd620e 100644 --- a/apps/dav/l10n/uk.js +++ b/apps/dav/l10n/uk.js @@ -143,6 +143,7 @@ OC.L10N.register( "Accounts" : "Облікові записи", "System address book which holds all accounts" : "Системна адресна книга, в якій містяться всі облікові записи", "File is not updatable: %1$s" : "Файл не оновлюється: %1$s", + "Failed to get storage for file" : "Не вдалося отримати дані про сховище для файлу", "Could not write to final file, canceled by hook" : "Не вдалося записати в остаточний файл, скасовано перехопленням", "Could not write file contents" : "Не вдалося записати вміст файлу", "_%n byte_::_%n bytes_" : ["%n байт","%n байтів","%n байтів","%n байтів"], diff --git a/apps/dav/l10n/uk.json b/apps/dav/l10n/uk.json index 0789c4c2a81..38b3fac301c 100644 --- a/apps/dav/l10n/uk.json +++ b/apps/dav/l10n/uk.json @@ -141,6 +141,7 @@ "Accounts" : "Облікові записи", "System address book which holds all accounts" : "Системна адресна книга, в якій містяться всі облікові записи", "File is not updatable: %1$s" : "Файл не оновлюється: %1$s", + "Failed to get storage for file" : "Не вдалося отримати дані про сховище для файлу", "Could not write to final file, canceled by hook" : "Не вдалося записати в остаточний файл, скасовано перехопленням", "Could not write file contents" : "Не вдалося записати вміст файлу", "_%n byte_::_%n bytes_" : ["%n байт","%n байтів","%n байтів","%n байтів"], diff --git a/apps/dav/lib/CalDAV/WebcalCaching/Connection.php b/apps/dav/lib/CalDAV/WebcalCaching/Connection.php index 9d626f2db6d..3c975505539 100644 --- a/apps/dav/lib/CalDAV/WebcalCaching/Connection.php +++ b/apps/dav/lib/CalDAV/WebcalCaching/Connection.php @@ -9,15 +9,11 @@ declare(strict_types=1); namespace OCA\DAV\CalDAV\WebcalCaching; use Exception; -use GuzzleHttp\HandlerStack; -use GuzzleHttp\Middleware; +use GuzzleHttp\RequestOptions; use OCP\Http\Client\IClientService; use OCP\Http\Client\LocalServerException; use OCP\IAppConfig; -use Psr\Http\Message\RequestInterface; -use Psr\Http\Message\ResponseInterface; use Psr\Log\LoggerInterface; -use Sabre\DAV\Xml\Property\Href; use Sabre\VObject\Reader; class Connection { @@ -29,107 +25,82 @@ class Connection { /** * gets webcal feed from remote server */ - public function queryWebcalFeed(array $subscription, array &$mutations): ?string { - $client = $this->clientService->newClient(); - - $didBreak301Chain = false; - $latestLocation = null; - - $handlerStack = HandlerStack::create(); - $handlerStack->push(Middleware::mapRequest(function (RequestInterface $request) { - return $request - ->withHeader('Accept', 'text/calendar, application/calendar+json, application/calendar+xml') - ->withHeader('User-Agent', 'Nextcloud Webcal Service'); - })); - $handlerStack->push(Middleware::mapResponse(function (ResponseInterface $response) use (&$didBreak301Chain, &$latestLocation) { - if (!$didBreak301Chain) { - if ($response->getStatusCode() !== 301) { - $didBreak301Chain = true; - } else { - $latestLocation = $response->getHeader('Location'); - } - } - return $response; - })); - - $allowLocalAccess = $this->config->getValueString('dav', 'webcalAllowLocalAccess', 'no'); + public function queryWebcalFeed(array $subscription): ?string { $subscriptionId = $subscription['id']; $url = $this->cleanURL($subscription['source']); if ($url === null) { return null; } - try { - $params = [ - 'allow_redirects' => [ - 'redirects' => 10 - ], - 'handler' => $handlerStack, - 'nextcloud' => [ - 'allow_local_address' => $allowLocalAccess === 'yes', - ] - ]; - - $user = parse_url($subscription['source'], PHP_URL_USER); - $pass = parse_url($subscription['source'], PHP_URL_PASS); - if ($user !== null && $pass !== null) { - $params['auth'] = [$user, $pass]; - } + $allowLocalAccess = $this->config->getValueString('dav', 'webcalAllowLocalAccess', 'no'); + + $params = [ + 'nextcloud' => [ + 'allow_local_address' => $allowLocalAccess === 'yes', + ], + RequestOptions::HEADERS => [ + 'User-Agent' => 'Nextcloud Webcal Service', + 'Accept' => 'text/calendar, application/calendar+json, application/calendar+xml', + ], + ]; + + $user = parse_url($subscription['source'], PHP_URL_USER); + $pass = parse_url($subscription['source'], PHP_URL_PASS); + if ($user !== null && $pass !== null) { + $params[RequestOptions::AUTH] = [$user, $pass]; + } + try { + $client = $this->clientService->newClient(); $response = $client->get($url, $params); - $body = $response->getBody(); - - if ($latestLocation !== null) { - $mutations['{http://calendarserver.org/ns/}source'] = new Href($latestLocation); - } - - $contentType = $response->getHeader('Content-Type'); - $contentType = explode(';', $contentType, 2)[0]; - switch ($contentType) { - case 'application/calendar+json': - try { - $jCalendar = Reader::readJson($body, Reader::OPTION_FORGIVING); - } catch (Exception $ex) { - // In case of a parsing error return null - $this->logger->warning("Subscription $subscriptionId could not be parsed", ['exception' => $ex]); - return null; - } - return $jCalendar->serialize(); - - case 'application/calendar+xml': - try { - $xCalendar = Reader::readXML($body); - } catch (Exception $ex) { - // In case of a parsing error return null - $this->logger->warning("Subscription $subscriptionId could not be parsed", ['exception' => $ex]); - return null; - } - return $xCalendar->serialize(); - - case 'text/calendar': - default: - try { - $vCalendar = Reader::read($body); - } catch (Exception $ex) { - // In case of a parsing error return null - $this->logger->warning("Subscription $subscriptionId could not be parsed", ['exception' => $ex]); - return null; - } - return $vCalendar->serialize(); - } } catch (LocalServerException $ex) { $this->logger->warning("Subscription $subscriptionId was not refreshed because it violates local access rules", [ 'exception' => $ex, ]); - return null; } catch (Exception $ex) { $this->logger->warning("Subscription $subscriptionId could not be refreshed due to a network error", [ 'exception' => $ex, ]); - return null; } + + $body = $response->getBody(); + + $contentType = $response->getHeader('Content-Type'); + $contentType = explode(';', $contentType, 2)[0]; + switch ($contentType) { + case 'application/calendar+json': + try { + $jCalendar = Reader::readJson($body, Reader::OPTION_FORGIVING); + } catch (Exception $ex) { + // In case of a parsing error return null + $this->logger->warning("Subscription $subscriptionId could not be parsed", ['exception' => $ex]); + return null; + } + return $jCalendar->serialize(); + + case 'application/calendar+xml': + try { + $xCalendar = Reader::readXML($body); + } catch (Exception $ex) { + // In case of a parsing error return null + $this->logger->warning("Subscription $subscriptionId could not be parsed", ['exception' => $ex]); + return null; + } + return $xCalendar->serialize(); + + case 'text/calendar': + default: + try { + $vCalendar = Reader::read($body); + } catch (Exception $ex) { + // In case of a parsing error return null + $this->logger->warning("Subscription $subscriptionId could not be parsed", ['exception' => $ex]); + return null; + } + return $vCalendar->serialize(); + } } /** diff --git a/apps/dav/lib/CalDAV/WebcalCaching/RefreshWebcalService.php b/apps/dav/lib/CalDAV/WebcalCaching/RefreshWebcalService.php index 102571c8ef9..8ab3ecc202a 100644 --- a/apps/dav/lib/CalDAV/WebcalCaching/RefreshWebcalService.php +++ b/apps/dav/lib/CalDAV/WebcalCaching/RefreshWebcalService.php @@ -55,7 +55,7 @@ class RefreshWebcalService { } - $webcalData = $this->connection->queryWebcalFeed($subscription, $mutations); + $webcalData = $this->connection->queryWebcalFeed($subscription); if (!$webcalData) { return; } diff --git a/apps/dav/lib/CardDAV/SyncService.php b/apps/dav/lib/CardDAV/SyncService.php index 56cbe5255f4..356903b3f69 100644 --- a/apps/dav/lib/CardDAV/SyncService.php +++ b/apps/dav/lib/CardDAV/SyncService.php @@ -108,25 +108,54 @@ class SyncService { }, $this->dbConnection); } + private function prepareUri(string $host, string $path): string { + /* + * The trailing slash is important for merging the uris together. + * + * $host is stored in oc_trusted_servers.url and usually without a trailing slash. + * + * Example for a report request + * + * $host = 'https://server.internal/cloud' + * $path = 'remote.php/dav/addressbooks/system/system/system' + * + * Without the trailing slash, the webroot is missing: + * https://server.internal/remote.php/dav/addressbooks/system/system/system + * + * Example for a download request + * + * $host = 'https://server.internal/cloud' + * $path = '/cloud/remote.php/dav/addressbooks/system/system/system/Database:alice.vcf' + * + * The response from the remote usually contains the webroot already and must be normalized to: + * https://server.internal/cloud/remote.php/dav/addressbooks/system/system/system/Database:alice.vcf + */ + $host = rtrim($host, '/') . '/'; + + $uri = \GuzzleHttp\Psr7\UriResolver::resolve( + \GuzzleHttp\Psr7\Utils::uriFor($host), + \GuzzleHttp\Psr7\Utils::uriFor($path) + ); + + return (string)$uri; + } + /** * @throws ClientExceptionInterface */ protected function requestSyncReport(string $url, string $userName, string $addressBookUrl, string $sharedSecret, ?string $syncToken): array { $client = $this->clientService->newClient(); - - // the trailing slash is important for merging base_uri and uri - $url = rtrim($url, '/') . '/'; + $uri = $this->prepareUri($url, $addressBookUrl); $options = [ 'auth' => [$userName, $sharedSecret], - 'base_uri' => $url, 'body' => $this->buildSyncCollectionRequestBody($syncToken), 'headers' => ['Content-Type' => 'application/xml'] ]; $response = $client->request( 'REPORT', - $addressBookUrl, + $uri, $options ); @@ -138,17 +167,14 @@ class SyncService { protected function download(string $url, string $userName, string $sharedSecret, string $resourcePath): string { $client = $this->clientService->newClient(); - - // the trailing slash is important for merging base_uri and uri - $url = rtrim($url, '/') . '/'; + $uri = $this->prepareUri($url, $resourcePath); $options = [ 'auth' => [$userName, $sharedSecret], - 'base_uri' => $url, ]; $response = $client->get( - $resourcePath, + $uri, $options ); diff --git a/apps/dav/tests/unit/CalDAV/WebcalCaching/ConnectionTest.php b/apps/dav/tests/unit/CalDAV/WebcalCaching/ConnectionTest.php index 20f61120af7..7ec4722e905 100644 --- a/apps/dav/tests/unit/CalDAV/WebcalCaching/ConnectionTest.php +++ b/apps/dav/tests/unit/CalDAV/WebcalCaching/ConnectionTest.php @@ -7,7 +7,6 @@ declare(strict_types=1); */ namespace OCA\DAV\Tests\unit\CalDAV\WebcalCaching; -use GuzzleHttp\HandlerStack; use OCA\DAV\CalDAV\WebcalCaching\Connection; use OCP\Http\Client\IClient; use OCP\Http\Client\IClientService; @@ -48,7 +47,6 @@ class ConnectionTest extends TestCase { 'source' => $source, 'lastmodified' => 0, ]; - $mutation = []; $client = $this->createMock(IClient::class); $this->clientService->expects(self::once()) @@ -69,7 +67,7 @@ class ConnectionTest extends TestCase { ->method('warning') ->with("Subscription 42 was not refreshed because it violates local access rules", ['exception' => $localServerException]); - $this->connection->queryWebcalFeed($subscription, $mutation); + $this->connection->queryWebcalFeed($subscription); } public function testInvalidUrl(): void { @@ -83,22 +81,14 @@ class ConnectionTest extends TestCase { 'source' => '!@#$', 'lastmodified' => 0, ]; - $mutation = []; $client = $this->createMock(IClient::class); - $this->clientService->expects(self::once()) - ->method('newClient') - ->with() - ->willReturn($client); - $this->config->expects(self::once()) - ->method('getValueString') - ->with('dav', 'webcalAllowLocalAccess', 'no') - ->willReturn('no'); - + $this->config->expects(self::never()) + ->method('getValueString'); $client->expects(self::never()) ->method('get'); - $this->connection->queryWebcalFeed($subscription, $mutation); + $this->connection->queryWebcalFeed($subscription); } @@ -120,7 +110,6 @@ class ConnectionTest extends TestCase { 'source' => $url, 'lastmodified' => 0, ]; - $mutation = []; $this->clientService->expects($this->once()) ->method('newClient') @@ -134,9 +123,7 @@ class ConnectionTest extends TestCase { $client->expects($this->once()) ->method('get') - ->with('https://foo.bar/bla2', $this->callback(function ($obj) { - return $obj['allow_redirects']['redirects'] === 10 && $obj['handler'] instanceof HandlerStack; - })) + ->with('https://foo.bar/bla2') ->willReturn($response); $response->expects($this->once()) @@ -148,9 +135,9 @@ class ConnectionTest extends TestCase { ->with('Content-Type') ->willReturn($contentType); - $this->connection->queryWebcalFeed($subscription, $mutation); - + $this->connection->queryWebcalFeed($subscription); } + public static function runLocalURLDataProvider(): array { return [ ['localhost/foo.bar'], diff --git a/apps/dav/tests/unit/CardDAV/SyncServiceTest.php b/apps/dav/tests/unit/CardDAV/SyncServiceTest.php index 570c55eab05..db99f73306d 100644 --- a/apps/dav/tests/unit/CardDAV/SyncServiceTest.php +++ b/apps/dav/tests/unit/CardDAV/SyncServiceTest.php @@ -426,4 +426,59 @@ END:VCARD'; [] ); } + + /** + * @dataProvider providerUseAbsoluteUriReport + */ + public function testUseAbsoluteUriReport(string $host, string $expected): void { + $body = '<?xml version="1.0"?> +<d:multistatus xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns" xmlns:card="urn:ietf:params:xml:ns:carddav" xmlns:oc="http://owncloud.org/ns"> + <d:sync-token>http://sabre.io/ns/sync/1</d:sync-token> +</d:multistatus>'; + + $requestResponse = new Response(new PsrResponse( + 207, + ['Content-Type' => 'application/xml; charset=utf-8', 'Content-Length' => strlen($body)], + $body + )); + + $this->client + ->method('request') + ->with( + 'REPORT', + $this->callback(function ($uri) use ($expected) { + $this->assertEquals($expected, $uri); + return true; + }), + $this->callback(function ($options) { + $this->assertIsArray($options); + return true; + }), + ) + ->willReturn($requestResponse); + + $this->service->syncRemoteAddressBook( + $host, + 'system', + 'remote.php/dav/addressbooks/system/system/system', + '1234567890', + null, + '1', + 'principals/system/system', + [] + ); + } + + public function providerUseAbsoluteUriReport(): array { + return [ + ['https://server.internal', 'https://server.internal/remote.php/dav/addressbooks/system/system/system'], + ['https://server.internal/', 'https://server.internal/remote.php/dav/addressbooks/system/system/system'], + ['https://server.internal/nextcloud', 'https://server.internal/nextcloud/remote.php/dav/addressbooks/system/system/system'], + ['https://server.internal/nextcloud/', 'https://server.internal/nextcloud/remote.php/dav/addressbooks/system/system/system'], + ['https://server.internal:8080', 'https://server.internal:8080/remote.php/dav/addressbooks/system/system/system'], + ['https://server.internal:8080/', 'https://server.internal:8080/remote.php/dav/addressbooks/system/system/system'], + ['https://server.internal:8080/nextcloud', 'https://server.internal:8080/nextcloud/remote.php/dav/addressbooks/system/system/system'], + ['https://server.internal:8080/nextcloud/', 'https://server.internal:8080/nextcloud/remote.php/dav/addressbooks/system/system/system'], + ]; + } } diff --git a/apps/files/l10n/ar.js b/apps/files/l10n/ar.js index 44d3881facd..00bf3990ad6 100644 --- a/apps/files/l10n/ar.js +++ b/apps/files/l10n/ar.js @@ -208,6 +208,8 @@ OC.L10N.register( "Edit online" : "التحرير عبر الإنترنت", "Failed to redirect to client" : "فشل في التحويل الى العميل", "Edit locally" : "تعديل محليًا", + "Moving \"{source}\" to \"{destination}\" …" : "نقل \"{source}\" إلى \"{destination}\" …", + "Copying \"{source}\" to \"{destination}\" …" : "نسخ \"{source}\" إلى \"{destination}\" …", "You cannot move a file/folder onto itself or into a subfolder of itself" : "لا يمكنك نقل ملف/مجلد إلى نفسه أو إلى مجلد فرعي منه", "(copy)" : "(نسخ)", "(copy %n)" : "(نسخ %n)", diff --git a/apps/files/l10n/ar.json b/apps/files/l10n/ar.json index 01b6551b3c3..5f8169ca16a 100644 --- a/apps/files/l10n/ar.json +++ b/apps/files/l10n/ar.json @@ -206,6 +206,8 @@ "Edit online" : "التحرير عبر الإنترنت", "Failed to redirect to client" : "فشل في التحويل الى العميل", "Edit locally" : "تعديل محليًا", + "Moving \"{source}\" to \"{destination}\" …" : "نقل \"{source}\" إلى \"{destination}\" …", + "Copying \"{source}\" to \"{destination}\" …" : "نسخ \"{source}\" إلى \"{destination}\" …", "You cannot move a file/folder onto itself or into a subfolder of itself" : "لا يمكنك نقل ملف/مجلد إلى نفسه أو إلى مجلد فرعي منه", "(copy)" : "(نسخ)", "(copy %n)" : "(نسخ %n)", diff --git a/apps/files/l10n/de_DE.js b/apps/files/l10n/de_DE.js index 0a9b27e4db2..ca6a0fead8c 100644 --- a/apps/files/l10n/de_DE.js +++ b/apps/files/l10n/de_DE.js @@ -208,6 +208,8 @@ OC.L10N.register( "Edit online" : "Online bearbeiten", "Failed to redirect to client" : "Umleitung zum Client fehlgeschlagen", "Edit locally" : "Lokal bearbeiten", + "Moving \"{source}\" to \"{destination}\" …" : "Verschiebe \"{source}\" nach \"{destination}\" …", + "Copying \"{source}\" to \"{destination}\" …" : "Kopiere \"{source}\" nach \"{destination}\" …", "You cannot move a file/folder onto itself or into a subfolder of itself" : "Eine Datei oder ein Ordner kann nicht auf sich selbst oder in einen Unterordner von sich selbst verschoben werden", "(copy)" : "(kopieren)", "(copy %n)" : "(%n kopieren)", diff --git a/apps/files/l10n/de_DE.json b/apps/files/l10n/de_DE.json index 4aa5f8be958..d8dcc83f4a1 100644 --- a/apps/files/l10n/de_DE.json +++ b/apps/files/l10n/de_DE.json @@ -206,6 +206,8 @@ "Edit online" : "Online bearbeiten", "Failed to redirect to client" : "Umleitung zum Client fehlgeschlagen", "Edit locally" : "Lokal bearbeiten", + "Moving \"{source}\" to \"{destination}\" …" : "Verschiebe \"{source}\" nach \"{destination}\" …", + "Copying \"{source}\" to \"{destination}\" …" : "Kopiere \"{source}\" nach \"{destination}\" …", "You cannot move a file/folder onto itself or into a subfolder of itself" : "Eine Datei oder ein Ordner kann nicht auf sich selbst oder in einen Unterordner von sich selbst verschoben werden", "(copy)" : "(kopieren)", "(copy %n)" : "(%n kopieren)", diff --git a/apps/files/l10n/gl.js b/apps/files/l10n/gl.js index 575a17d6f8f..2727bf2963b 100644 --- a/apps/files/l10n/gl.js +++ b/apps/files/l10n/gl.js @@ -208,6 +208,8 @@ OC.L10N.register( "Edit online" : "Editar en liña", "Failed to redirect to client" : "Produciuse un fallo ao redirixir ao cliente", "Edit locally" : "Editar localmente", + "Moving \"{source}\" to \"{destination}\" …" : "Movendo «{source}» a «{destination}»…", + "Copying \"{source}\" to \"{destination}\" …" : "Copiando «{source}» en «{destination}»…", "You cannot move a file/folder onto itself or into a subfolder of itself" : "Non é posíbel mover un ficheiro/cartafol sobre si mesmo ou a un subcartafol de si mesmo", "(copy)" : "(copiar)", "(copy %n)" : "(copiar %n)", diff --git a/apps/files/l10n/gl.json b/apps/files/l10n/gl.json index df60f6bb780..69a0d6e0f42 100644 --- a/apps/files/l10n/gl.json +++ b/apps/files/l10n/gl.json @@ -206,6 +206,8 @@ "Edit online" : "Editar en liña", "Failed to redirect to client" : "Produciuse un fallo ao redirixir ao cliente", "Edit locally" : "Editar localmente", + "Moving \"{source}\" to \"{destination}\" …" : "Movendo «{source}» a «{destination}»…", + "Copying \"{source}\" to \"{destination}\" …" : "Copiando «{source}» en «{destination}»…", "You cannot move a file/folder onto itself or into a subfolder of itself" : "Non é posíbel mover un ficheiro/cartafol sobre si mesmo ou a un subcartafol de si mesmo", "(copy)" : "(copiar)", "(copy %n)" : "(copiar %n)", diff --git a/apps/files/l10n/sv.js b/apps/files/l10n/sv.js index db227259556..026e1be5b79 100644 --- a/apps/files/l10n/sv.js +++ b/apps/files/l10n/sv.js @@ -208,6 +208,8 @@ OC.L10N.register( "Edit online" : "Redigera online", "Failed to redirect to client" : "Det gick inte att omdirigera till klienten", "Edit locally" : "Redigera lokalt", + "Moving \"{source}\" to \"{destination}\" …" : "Flyttar \"{source}\" till \"{destination}\" …", + "Copying \"{source}\" to \"{destination}\" …" : "Kopierar \"{source}\" till \"{destination}\" …", "You cannot move a file/folder onto itself or into a subfolder of itself" : "Du kan inte flytta en fil/mapp till sig själv eller till en undermapp till sig själv", "(copy)" : "(kopia)", "(copy %n)" : "(kopia %n)", diff --git a/apps/files/l10n/sv.json b/apps/files/l10n/sv.json index 0ef589fe42c..5a43d40182a 100644 --- a/apps/files/l10n/sv.json +++ b/apps/files/l10n/sv.json @@ -206,6 +206,8 @@ "Edit online" : "Redigera online", "Failed to redirect to client" : "Det gick inte att omdirigera till klienten", "Edit locally" : "Redigera lokalt", + "Moving \"{source}\" to \"{destination}\" …" : "Flyttar \"{source}\" till \"{destination}\" …", + "Copying \"{source}\" to \"{destination}\" …" : "Kopierar \"{source}\" till \"{destination}\" …", "You cannot move a file/folder onto itself or into a subfolder of itself" : "Du kan inte flytta en fil/mapp till sig själv eller till en undermapp till sig själv", "(copy)" : "(kopia)", "(copy %n)" : "(kopia %n)", diff --git a/apps/files/l10n/zh_TW.js b/apps/files/l10n/zh_TW.js index 21dbeeb3835..b35cb3540b1 100644 --- a/apps/files/l10n/zh_TW.js +++ b/apps/files/l10n/zh_TW.js @@ -208,6 +208,8 @@ OC.L10N.register( "Edit online" : "線上編輯", "Failed to redirect to client" : "重新導向到客戶端失敗", "Edit locally" : "本機編輯", + "Moving \"{source}\" to \"{destination}\" …" : "正在移動「{source}」至「{destination}」……", + "Copying \"{source}\" to \"{destination}\" …" : "正在複製「{source}」至「{destination}」……", "You cannot move a file/folder onto itself or into a subfolder of itself" : "您無法將檔案/資料夾移動到其自身或子資料夾中", "(copy)" : "(副本)", "(copy %n)" : "(副本 %n)", diff --git a/apps/files/l10n/zh_TW.json b/apps/files/l10n/zh_TW.json index d514c290ab5..b8840a1da86 100644 --- a/apps/files/l10n/zh_TW.json +++ b/apps/files/l10n/zh_TW.json @@ -206,6 +206,8 @@ "Edit online" : "線上編輯", "Failed to redirect to client" : "重新導向到客戶端失敗", "Edit locally" : "本機編輯", + "Moving \"{source}\" to \"{destination}\" …" : "正在移動「{source}」至「{destination}」……", + "Copying \"{source}\" to \"{destination}\" …" : "正在複製「{source}」至「{destination}」……", "You cannot move a file/folder onto itself or into a subfolder of itself" : "您無法將檔案/資料夾移動到其自身或子資料夾中", "(copy)" : "(副本)", "(copy %n)" : "(副本 %n)", diff --git a/apps/files/src/views/FileReferencePickerElement.vue b/apps/files/src/views/FileReferencePickerElement.vue index c2a502ee1a8..b4d4bc54f14 100644 --- a/apps/files/src/views/FileReferencePickerElement.vue +++ b/apps/files/src/views/FileReferencePickerElement.vue @@ -39,7 +39,7 @@ export default defineComponent({ }, filepickerOptions() { return { - allowPickDirectory: false, + allowPickDirectory: true, buttons: this.buttonFactory, container: `#${this.containerId}`, multiselect: false, @@ -53,18 +53,17 @@ export default defineComponent({ buttonFactory(selected: NcNode[]): IFilePickerButton[] { const buttons = [] as IFilePickerButton[] if (selected.length === 0) { - buttons.push({ - label: t('files', 'Choose file'), - type: 'tertiary' as never, - callback: this.onClose, - }) - } else { - buttons.push({ - label: t('files', 'Choose {file}', { file: selected[0].basename }), - type: 'primary', - callback: this.onClose, - }) + return [] + } + const node = selected.at(0) + if (node.path === '/') { + return [] // Do not allow selecting the users root folder } + buttons.push({ + label: t('files', 'Choose {file}', { file: node.displayname }), + type: 'primary', + callback: this.onClose, + }) return buttons }, diff --git a/apps/provisioning_api/l10n/ar.js b/apps/provisioning_api/l10n/ar.js index 25918280b70..aeac14a24e2 100644 --- a/apps/provisioning_api/l10n/ar.js +++ b/apps/provisioning_api/l10n/ar.js @@ -11,6 +11,7 @@ OC.L10N.register( "Cannot create sub-admins for admin group" : "تعذّر إنشاء مشرفين فرعيين لمجموعة المشرفين", "No permissions to promote sub-admins" : "أذونات غير كافية لترقية مشرفين فرعيين", "Invalid password value" : "قيمة غير صحيحة لكلمة المرور", + "An email address is required, to send a password link to the user." : "عنوان الإيميل مطلوب لإرسال رابط كلمة المرور للمستخدِم", "Required email address was not provided" : "عنوان الإيميل المطلوب لم يتم توفيره", "Invalid quota value: %1$s" : "قيمة غير صحيحة للحصة: %1$s", "Invalid quota value. %1$s is exceeding the maximum quota" : "قيمة غير صحيحة للحصة. %1$s تزيد عن الحد الأقصى للحصة", diff --git a/apps/provisioning_api/l10n/ar.json b/apps/provisioning_api/l10n/ar.json index f72b7b5eb76..b297ea4700b 100644 --- a/apps/provisioning_api/l10n/ar.json +++ b/apps/provisioning_api/l10n/ar.json @@ -9,6 +9,7 @@ "Cannot create sub-admins for admin group" : "تعذّر إنشاء مشرفين فرعيين لمجموعة المشرفين", "No permissions to promote sub-admins" : "أذونات غير كافية لترقية مشرفين فرعيين", "Invalid password value" : "قيمة غير صحيحة لكلمة المرور", + "An email address is required, to send a password link to the user." : "عنوان الإيميل مطلوب لإرسال رابط كلمة المرور للمستخدِم", "Required email address was not provided" : "عنوان الإيميل المطلوب لم يتم توفيره", "Invalid quota value: %1$s" : "قيمة غير صحيحة للحصة: %1$s", "Invalid quota value. %1$s is exceeding the maximum quota" : "قيمة غير صحيحة للحصة. %1$s تزيد عن الحد الأقصى للحصة", diff --git a/apps/provisioning_api/l10n/de_DE.js b/apps/provisioning_api/l10n/de_DE.js index c815f1d8a01..18c5c76237e 100644 --- a/apps/provisioning_api/l10n/de_DE.js +++ b/apps/provisioning_api/l10n/de_DE.js @@ -11,6 +11,7 @@ OC.L10N.register( "Cannot create sub-admins for admin group" : "Kann keine Unter-Administratoren für die Administrations-Gruppe erstellen", "No permissions to promote sub-admins" : "Keine Berechtigungen, um Unter-Administratoren zu ernennen", "Invalid password value" : "Ungültiger Passwort-Wert", + "An email address is required, to send a password link to the user." : "Um dem Benutzer einen Passwortlink zu senden, ist eine E-Mail-Adresse erforderlich.", "Required email address was not provided" : "Erforderliche E-Mail-Adresse wurde nicht angegeben", "Invalid quota value: %1$s" : "Ungültiger Wert für Speicherkontigent: %1$s", "Invalid quota value. %1$s is exceeding the maximum quota" : "Ungültiger Wert für Speicherkontigent. %1$s überschreitet das maximale Kontigent", diff --git a/apps/provisioning_api/l10n/de_DE.json b/apps/provisioning_api/l10n/de_DE.json index 46091c0a224..61fd2140872 100644 --- a/apps/provisioning_api/l10n/de_DE.json +++ b/apps/provisioning_api/l10n/de_DE.json @@ -9,6 +9,7 @@ "Cannot create sub-admins for admin group" : "Kann keine Unter-Administratoren für die Administrations-Gruppe erstellen", "No permissions to promote sub-admins" : "Keine Berechtigungen, um Unter-Administratoren zu ernennen", "Invalid password value" : "Ungültiger Passwort-Wert", + "An email address is required, to send a password link to the user." : "Um dem Benutzer einen Passwortlink zu senden, ist eine E-Mail-Adresse erforderlich.", "Required email address was not provided" : "Erforderliche E-Mail-Adresse wurde nicht angegeben", "Invalid quota value: %1$s" : "Ungültiger Wert für Speicherkontigent: %1$s", "Invalid quota value. %1$s is exceeding the maximum quota" : "Ungültiger Wert für Speicherkontigent. %1$s überschreitet das maximale Kontigent", diff --git a/apps/provisioning_api/l10n/gl.js b/apps/provisioning_api/l10n/gl.js index 70d07a3ff4a..1aab97c2938 100644 --- a/apps/provisioning_api/l10n/gl.js +++ b/apps/provisioning_api/l10n/gl.js @@ -11,6 +11,7 @@ OC.L10N.register( "Cannot create sub-admins for admin group" : "Non é posibel crear postos de subadministración para o grupo de administración", "No permissions to promote sub-admins" : "Non ten permisos para promover a subadministración", "Invalid password value" : "O valor do contrasinal non é correcto", + "An email address is required, to send a password link to the user." : "Precisase dun enderezo de correo-e para enviar unha ligazón de contrasinal ao usuario.", "Required email address was not provided" : "Precisase dun enderezo de correo-e mais non foi fornecido", "Invalid quota value: %1$s" : "Valor de cota incorrecto: %1$s", "Invalid quota value. %1$s is exceeding the maximum quota" : "O valor da cota é incorrecto. %1$s excede a cota máxima", diff --git a/apps/provisioning_api/l10n/gl.json b/apps/provisioning_api/l10n/gl.json index bace58eb2a1..a93ffc011a0 100644 --- a/apps/provisioning_api/l10n/gl.json +++ b/apps/provisioning_api/l10n/gl.json @@ -9,6 +9,7 @@ "Cannot create sub-admins for admin group" : "Non é posibel crear postos de subadministración para o grupo de administración", "No permissions to promote sub-admins" : "Non ten permisos para promover a subadministración", "Invalid password value" : "O valor do contrasinal non é correcto", + "An email address is required, to send a password link to the user." : "Precisase dun enderezo de correo-e para enviar unha ligazón de contrasinal ao usuario.", "Required email address was not provided" : "Precisase dun enderezo de correo-e mais non foi fornecido", "Invalid quota value: %1$s" : "Valor de cota incorrecto: %1$s", "Invalid quota value. %1$s is exceeding the maximum quota" : "O valor da cota é incorrecto. %1$s excede a cota máxima", diff --git a/apps/provisioning_api/l10n/zh_TW.js b/apps/provisioning_api/l10n/zh_TW.js index be22077e12a..89e250d6d54 100644 --- a/apps/provisioning_api/l10n/zh_TW.js +++ b/apps/provisioning_api/l10n/zh_TW.js @@ -11,6 +11,7 @@ OC.L10N.register( "Cannot create sub-admins for admin group" : "無法為管理員群組建立子管理員", "No permissions to promote sub-admins" : "沒有新增子管理員的權限", "Invalid password value" : "無效的密碼值", + "An email address is required, to send a password link to the user." : "電子郵件地址必填,用來寄送密碼連結給使用者。", "Required email address was not provided" : "未提供必要的電子郵件地址", "Invalid quota value: %1$s" : "無效的空間限額值:%1$s", "Invalid quota value. %1$s is exceeding the maximum quota" : "無效的空間限額值。%1$s 超過了最大空間限額", diff --git a/apps/provisioning_api/l10n/zh_TW.json b/apps/provisioning_api/l10n/zh_TW.json index e599a1a8c6f..341d42dd448 100644 --- a/apps/provisioning_api/l10n/zh_TW.json +++ b/apps/provisioning_api/l10n/zh_TW.json @@ -9,6 +9,7 @@ "Cannot create sub-admins for admin group" : "無法為管理員群組建立子管理員", "No permissions to promote sub-admins" : "沒有新增子管理員的權限", "Invalid password value" : "無效的密碼值", + "An email address is required, to send a password link to the user." : "電子郵件地址必填,用來寄送密碼連結給使用者。", "Required email address was not provided" : "未提供必要的電子郵件地址", "Invalid quota value: %1$s" : "無效的空間限額值:%1$s", "Invalid quota value. %1$s is exceeding the maximum quota" : "無效的空間限額值。%1$s 超過了最大空間限額", diff --git a/apps/settings/l10n/gl.js b/apps/settings/l10n/gl.js index af7b2473a2f..027f82eaeef 100644 --- a/apps/settings/l10n/gl.js +++ b/apps/settings/l10n/gl.js @@ -583,7 +583,7 @@ OC.L10N.register( "she/her" : "ela — she/her", "he/him" : "el — he/him", "they/them" : "ele — they/them", - "Your pronouns. E.g. ${pronounsExample}" : "Os seus pronomes. p.ex. ${pronounsExample}", + "Your pronouns. E.g. ${pronounsExample}" : "Os seus pronomes. p. ex. ${pronounsExample}", "Your role" : "O seu cargo", "Your X (formerly Twitter) handle" : "O seu identificador en X (anteriormente Twitter).", "Your website" : "O seu sitio web", diff --git a/apps/settings/l10n/gl.json b/apps/settings/l10n/gl.json index 2a5ebee1eea..cf836b1b3ee 100644 --- a/apps/settings/l10n/gl.json +++ b/apps/settings/l10n/gl.json @@ -581,7 +581,7 @@ "she/her" : "ela — she/her", "he/him" : "el — he/him", "they/them" : "ele — they/them", - "Your pronouns. E.g. ${pronounsExample}" : "Os seus pronomes. p.ex. ${pronounsExample}", + "Your pronouns. E.g. ${pronounsExample}" : "Os seus pronomes. p. ex. ${pronounsExample}", "Your role" : "O seu cargo", "Your X (formerly Twitter) handle" : "O seu identificador en X (anteriormente Twitter).", "Your website" : "O seu sitio web", diff --git a/apps/settings/l10n/uk.js b/apps/settings/l10n/uk.js index 83fa8ac4cc3..1ba1fbac96d 100644 --- a/apps/settings/l10n/uk.js +++ b/apps/settings/l10n/uk.js @@ -59,7 +59,9 @@ OC.L10N.register( "No Login supplied" : "Не надано ім'я облікового запису", "Unable to change password. Password too long." : "Неможливо змінити пароль. Пароль задовгий.", "Authentication error" : "Помилка авторизації", + "Please provide an admin recovery password; otherwise, all account data will be lost." : "Надайте пароль відновлення адміністратора. В іншому випадку всі облікові дані буде втрачено.", "Wrong admin recovery password. Please check the password and try again." : "Хибний пароль відновлення адміністратора. Будь ласка, перевірте пароль та спробуйте ще раз.", + "Backend does not support password change, but the encryption of the account key was updated." : "Бекенд не підтримує зміну паролю, проте шифрування ключа облікового запису було оновлено.", "Administrator documentation" : "Документація адміністратора", "User documentation" : "Користувацька документація", "Nextcloud help overview" : "Допомога у користуванні Nextcloud", @@ -102,6 +104,7 @@ OC.L10N.register( "Set your password" : "Встановіть свій пароль", "Go to %s" : "Перейти до %s", "Install Client" : "Встановити Клієнт", + "Logged in account must be a subadmin" : "Користувач, який увійшов, має бути субадміністратором", "Apps" : "Застосунки", "Personal" : "Особисте", "Administration" : "Адміністрування", diff --git a/apps/settings/l10n/uk.json b/apps/settings/l10n/uk.json index 063eff3d85e..7facb07e6d0 100644 --- a/apps/settings/l10n/uk.json +++ b/apps/settings/l10n/uk.json @@ -57,7 +57,9 @@ "No Login supplied" : "Не надано ім'я облікового запису", "Unable to change password. Password too long." : "Неможливо змінити пароль. Пароль задовгий.", "Authentication error" : "Помилка авторизації", + "Please provide an admin recovery password; otherwise, all account data will be lost." : "Надайте пароль відновлення адміністратора. В іншому випадку всі облікові дані буде втрачено.", "Wrong admin recovery password. Please check the password and try again." : "Хибний пароль відновлення адміністратора. Будь ласка, перевірте пароль та спробуйте ще раз.", + "Backend does not support password change, but the encryption of the account key was updated." : "Бекенд не підтримує зміну паролю, проте шифрування ключа облікового запису було оновлено.", "Administrator documentation" : "Документація адміністратора", "User documentation" : "Користувацька документація", "Nextcloud help overview" : "Допомога у користуванні Nextcloud", @@ -100,6 +102,7 @@ "Set your password" : "Встановіть свій пароль", "Go to %s" : "Перейти до %s", "Install Client" : "Встановити Клієнт", + "Logged in account must be a subadmin" : "Користувач, який увійшов, має бути субадміністратором", "Apps" : "Застосунки", "Personal" : "Особисте", "Administration" : "Адміністрування", diff --git a/apps/settings/templates/settings/personal/development.notice.php b/apps/settings/templates/settings/personal/development.notice.php index a758daa16d5..e0f66863efa 100644 --- a/apps/settings/templates/settings/personal/development.notice.php +++ b/apps/settings/templates/settings/personal/development.notice.php @@ -30,43 +30,43 @@ <?php print_unescaped(str_replace( [ '{facebookimage}', - '{twitterimage}', + '{ximage}', '{mastodonimage}', '{rssimage}', '{mailimage}', '{facebookopen}', - '{twitteropen}', + '{xopen}', '{mastodonopen}', '{rssopen}', '{newsletteropen}', '{linkclose}', '{facebooktext}', - '{twittertext}', + '{xtext}', '{mastodontext}', '{rsstext}', '{mailtext}', ], [ '<svg aria-hidden="true" width="50" height="50" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><circle cx="8" cy="8" r="8" fill="var(--color-text-maxcontrast)"/><path d="m7 5c0-1.1 0.9-2 2-2h1.5v2h-1c-0.27 0-0.5 0.23-0.5 0.5v1h1.5v2h-1.5v4.5h-2v-4.5h-1.5v-2h1.5z" fill="var(--color-main-background)"/></svg>', - '<svg aria-hidden="true" width="50" height="50" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><circle cx="8" cy="8" r="8" fill="var(--color-text-maxcontrast)"/><path d="m9.784 4c-1.0945 0-1.982 0.89-1.982 1.982 0 0.167 0.026 0.336 0.06 0.474h-0.153c-1.361-0.077-2.577-0.56-3.445-1.512-0.19-0.204-0.368-0.422-0.518-0.654-0.294 0.509-0.325 1.1-0.19 1.648 0.123 0.41 0.34 0.776 0.64 1.05l0.15 0.1364-0.19-0.041c-0.245-0.068-0.49-0.15-0.722-0.245 0.027 0.49 0.218 0.94 0.517 1.294 0.286 0.34 0.667 0.6 1.103 0.722-0.31 0.032-0.6165 0.0236-0.926 0.0135 0.3132 0.763 1.035 1.322 1.8927 1.3897-0.79 0.585-1.77 0.912-2.82 0.912 0.7762 0.477 1.661 0.777 2.628 0.831h0.627c2.982-0.163 5.338-2.63 5.34-5.6526v-0.286c0.11-0.095 0.218-0.19 0.327-0.3 0.259-0.2316 0.49-0.504 0.681-0.79-0.313 0.204-0.681 0.3133-1.09 0.313h-0.014c0.366-0.2453 0.653-0.613 0.8-1.035-0.41 0.212-0.802 0.3433-1.23 0.425-0.46-0.4-0.83-0.675-1.486-0.675z" fill="var(--color-main-background)"/></svg>', + '<svg aria-hidden="true" width="50" height="50" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><circle cx="8" cy="8" r="8" fill="var(--color-text-maxcontrast)"/><path d="m 3.384891,2.6 c -0.3882,0 -0.61495,0.4362184 -0.39375,0.7558594 L 6.5841098,8.4900156 2.9770785,12.707422 C 2.7436785,12.979821 2.9370285,13.4 3.2958285,13.4 H 3.694266 c 0.176,0 0.3430313,-0.07714 0.4570313,-0.210938 L 7.294266,9.5065156 9.6602817,12.887891 C 9.8762817,13.208984 10.25229,13.4 10.743485,13.4 h 1.900391 c 0.3882,0 0.61575,-0.436688 0.39375,-0.754688 L 9.2466097,7.2195156 12.682547,3.1941408 C 12.881744,2.9601408 12.715528,2.6 12.407473,2.6 h -0.506566 c -0.175,0 -0.34186,0.076453 -0.45586,0.2197656 L 8.5405785,6.2058438 6.3790317,3.1132812 C 6.1568442,2.7913687 5.6965004,2.6 5.3958285,2.6 Z" fill="var(--color-main-background)"/></svg>', '<svg aria-hidden="true" width="50" height="50" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><circle cx="8" cy="8" r="8" fill="var(--color-text-maxcontrast)"/><path d="m13.183 9.2819c-0.1566 0.80567-1.4026 1.6874-2.8336 1.8583-0.74623 0.08903-1.4809 0.17088-2.2644 0.13494-1.2813-0.05872-2.2923-0.30582-2.2923-0.30582 0 0.12473 0.0077 0.24349 0.02307 0.35456 0.16657 1.2645 1.2538 1.3402 2.2837 1.3755 1.0395 0.03557 1.9651-0.25629 1.9651-0.25629l0.0427 0.93975s-0.72709 0.39044-2.0223 0.46224c-0.71423 0.03926-1.6011-0.01798-2.634-0.29136-2.2402-0.59294-2.6255-2.9809-2.6844-5.4039-0.01797-0.7194-0.00687-1.3977-0.00687-1.9651 0-2.4776 1.6233-3.2038 1.6233-3.2038 0.81852-0.37591 2.223-0.53399 3.6832-0.54593h0.035867c1.4601 0.011937 2.8656 0.17002 3.6841 0.54593 0 0 1.6233 0.72623 1.6233 3.2038 0 0 0.02036 1.828-0.22639 3.0971" fill="var(--color-main-background)" stroke-width=".049227"/><path d="m11.494 6.377v3h-1.1885v-2.9118c0-0.6138-0.25826-0.92535-0.77484-0.92535-0.57116 0-0.85742 0.36957-0.85742 1.1004v1.5938h-1.1815v-1.5938c0-0.73078-0.28632-1.1004-0.85748-1.1004-0.51658 0-0.77484 0.31155-0.77484 0.92535v2.9118h-1.1885v-3c0-0.61313 0.15611-1.1004 0.46969-1.4608 0.32336-0.36047 0.74684-0.54525 1.2725-0.54525 0.6082 0 1.0688 0.23377 1.3733 0.70137l0.29604 0.49627 0.2961-0.49627c0.30447-0.4676 0.76505-0.70137 1.3733-0.70137 0.52563 0 0.9491 0.18479 1.2725 0.54525 0.31352 0.36047 0.46963 0.84769 0.46963 1.4608" fill="var(--color-text-maxcontrast)" stroke-width=".049227"/></svg>', '<svg aria-hidden="true" width="50" height="50" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><circle cx="8" cy="8" r="8" fill="var(--color-text-maxcontrast)"/><path d="m4.5 3.5v1.7c3.563 0 6.3 2.735 6.3 6.3h1.7c0-4.4-3.58-8-8-8zm0 2.5v1.7c2.326 0 3.774 1.468 3.8 3.8h1.7c0-3-2.492-5.5-5.5-5.5zm1.25 3c-0.69 0-1.25 0.56-1.25 1.25s0.56 1.25 1.25 1.25 1.25-0.56 1.25-1.25-0.56-1.25-1.25-1.25z" fill="var(--color-main-background)"/></svg>', '<svg aria-hidden="true" width="50" height="50" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><circle cx="8" cy="8" r="8" fill="var(--color-text-maxcontrast)"/><path d="m3.556 4.875c-0.306 0-0.556 0.248-0.556 0.555v5.14c0 0.31 0.25 0.555 0.556 0.555h8.89c0.304 0 0.554-0.245 0.554-0.555v-5.14c0-0.307-0.25-0.555-0.556-0.555zm0.47 0.643 3.8 3.8h0.33l3.82-3.8 0.38 0.38-2.274 2.31 1.82 1.753-0.38 0.38-1.753-1.753-1.267 1.285h-0.8l-1.368-1.283-1.754 1.77-0.38-0.4 1.734-1.76-2.292-2.3z" fill="var(--color-main-background)"/></svg>', '<a target="_blank" aria-label="{facebooktext}" rel="noreferrer noopener" href="https://www.facebook.com/Nextclouders/">', - '<a target="_blank" aria-label="{twittertext}" rel="noreferrer noopener" href="https://twitter.com/nextclouders">', + '<a target="_blank" aria-label="{xtext}" rel="noreferrer noopener" href="https://x.com/nextclouders">', '<a target="_blank" aria-label="{mastodontext}" rel="noreferrer noopener" href="https://mastodon.xyz/@nextcloud">', '<a target="_blank" aria-label="{rsstext}" rel="noreferrer noopener" href="https://nextcloud.com/blog/">', '<a target="_blank" aria-label="{mailtext}" rel="noreferrer noopener" href="https://newsletter.nextcloud.com/?p=subscribe&id=1">', '</a>', $l->t('Like our Facebook page'), - $l->t('Follow us on Twitter'), + $l->t('Follow us on X'), $l->t('Follow us on Mastodon'), $l->t('Check out our blog'), $l->t('Subscribe to our newsletter'), ], '{facebookopen}{facebookimage}{linkclose} - {twitteropen}{twitterimage}{linkclose} + {xopen}{ximage}{linkclose} {mastodonopen}{mastodonimage}{linkclose} {rssopen}{rssimage}{linkclose} {newsletteropen}{mailimage}{linkclose}' diff --git a/apps/theming/lib/Service/BackgroundService.php b/apps/theming/lib/Service/BackgroundService.php index 6cb2b4abeb9..8ed8478de71 100644 --- a/apps/theming/lib/Service/BackgroundService.php +++ b/apps/theming/lib/Service/BackgroundService.php @@ -18,6 +18,7 @@ use OCP\Files\NotFoundException; use OCP\Files\NotPermittedException; use OCP\Files\SimpleFS\ISimpleFile; use OCP\Files\SimpleFS\ISimpleFolder; +use OCP\IAppConfig; use OCP\IConfig; use OCP\Lock\LockedException; use OCP\PreConditionNotMetException; @@ -200,6 +201,7 @@ class BackgroundService { public function __construct( private IRootFolder $rootFolder, private IAppData $appData, + private IAppConfig $appConfig, private IConfig $config, private ?string $userId, ) { @@ -328,7 +330,7 @@ class BackgroundService { if ($handle && $image->loadFromFileHandle($handle) !== false) { $meanColor = $this->calculateMeanColor($image); if ($meanColor !== false) { - $this->config->setAppValue(Application::APP_ID, 'background_color', $meanColor); + $this->appConfig->setValueString(Application::APP_ID, 'background_color', $meanColor); return $meanColor; } } diff --git a/apps/updatenotification/l10n/gl.js b/apps/updatenotification/l10n/gl.js index 2cc48070b58..1641488c0a3 100644 --- a/apps/updatenotification/l10n/gl.js +++ b/apps/updatenotification/l10n/gl.js @@ -32,7 +32,7 @@ OC.L10N.register( "Your version is up to date." : "A súa versión está actualizada.", "A non-default update server is in use to be checked for updates:" : "Está en uso un servidor de actualizacións que non é o predeterminado para comprobar as actualizacións:", "Update channel" : "Canle de actualización:", - "Changing the update channel also affects the apps management page. E.g. after switching to the beta channel, beta app updates will be offered to you in the apps management page." : "Cambiar a canle de actualización tamén afecta á páxina de xestión de aplicacións. p.ex. após cambiar á canle beta, ofreceranse actualizacións da aplicación beta na páxina de xestión de aplicacións.", + "Changing the update channel also affects the apps management page. E.g. after switching to the beta channel, beta app updates will be offered to you in the apps management page." : "Cambiar a canle de actualización tamén afecta á páxina de xestión de aplicacións. p. ex. após cambiar á canle beta, ofreceranse actualizacións da aplicación beta na páxina de xestión de aplicacións.", "Current update channel:" : "Canle de actualización actual:", "You can always update to a newer version. But you can never downgrade to a more stable version." : "Sempre poderá actualizar á versión más recente, mais nunca poderá reverter a unha canle máis estábel.", "Notify members of the following groups about available updates:" : "Notificar aos membros dos seguintes grupos sobre actualizacións dispoñíbeis:", diff --git a/apps/updatenotification/l10n/gl.json b/apps/updatenotification/l10n/gl.json index b3f94ec2a5e..74dac9e33a3 100644 --- a/apps/updatenotification/l10n/gl.json +++ b/apps/updatenotification/l10n/gl.json @@ -30,7 +30,7 @@ "Your version is up to date." : "A súa versión está actualizada.", "A non-default update server is in use to be checked for updates:" : "Está en uso un servidor de actualizacións que non é o predeterminado para comprobar as actualizacións:", "Update channel" : "Canle de actualización:", - "Changing the update channel also affects the apps management page. E.g. after switching to the beta channel, beta app updates will be offered to you in the apps management page." : "Cambiar a canle de actualización tamén afecta á páxina de xestión de aplicacións. p.ex. após cambiar á canle beta, ofreceranse actualizacións da aplicación beta na páxina de xestión de aplicacións.", + "Changing the update channel also affects the apps management page. E.g. after switching to the beta channel, beta app updates will be offered to you in the apps management page." : "Cambiar a canle de actualización tamén afecta á páxina de xestión de aplicacións. p. ex. após cambiar á canle beta, ofreceranse actualizacións da aplicación beta na páxina de xestión de aplicacións.", "Current update channel:" : "Canle de actualización actual:", "You can always update to a newer version. But you can never downgrade to a more stable version." : "Sempre poderá actualizar á versión más recente, mais nunca poderá reverter a unha canle máis estábel.", "Notify members of the following groups about available updates:" : "Notificar aos membros dos seguintes grupos sobre actualizacións dispoñíbeis:", diff --git a/apps/user_ldap/l10n/gl.js b/apps/user_ldap/l10n/gl.js index 535d81da209..1762815e36b 100644 --- a/apps/user_ldap/l10n/gl.js +++ b/apps/user_ldap/l10n/gl.js @@ -110,7 +110,7 @@ OC.L10N.register( "Port" : "Porto", "Detect Port" : "Detectar o porto", "User DN" : "DN do usuario", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "O DN do cliente do usuario co que hai que estabelecer unha conexión, p.ex uid=axente, dc=exemplo, dc=com. Para o acceso anónimo deixe o DN e o contrasinal baleiros.", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "O DN do cliente do usuario co que realizará o vínculo, p. ex. uid=axente, dc=exemplo, dc=com. Para o acceso anónimo deixe o DN e o contrasinal baleiros.", "Password" : "Contrasinal", "For anonymous access, leave DN and Password empty." : "Para o acceso anónimo deixe o DN e o contrasinal baleiros.", "Save Credentials" : "Gardar as credenciais", @@ -158,7 +158,7 @@ OC.L10N.register( "User Display Name Field" : "Campo de nome de usuario para amosar", "The LDAP attribute to use to generate the user's display name." : "O atributo LDAP a empregar para xerar o nome de usuario para amosar.", "2nd User Display Name Field" : "2.º campo de nome de usuario para amosar", - "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opcional. Un atributo LDAP para ser engadido no nome para amosar entre parénteses. Resulta en p.ex. «Xan Carallás (xan.carallas@exemplo.org)».", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opcional. Un atributo LDAP para ser engadido no nome para amosar entre parénteses. Resulta en p. ex. «Xan Carallás (xan.carallas@exemplo.org)».", "Base User Tree" : "Base da árbore de usuarios", "One User Base DN per line" : "Un DN base de usuario por liña", "User Search Attributes" : "Atributos de busca do usuario", diff --git a/apps/user_ldap/l10n/gl.json b/apps/user_ldap/l10n/gl.json index 1c233d7707b..e29dd2926d3 100644 --- a/apps/user_ldap/l10n/gl.json +++ b/apps/user_ldap/l10n/gl.json @@ -108,7 +108,7 @@ "Port" : "Porto", "Detect Port" : "Detectar o porto", "User DN" : "DN do usuario", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "O DN do cliente do usuario co que hai que estabelecer unha conexión, p.ex uid=axente, dc=exemplo, dc=com. Para o acceso anónimo deixe o DN e o contrasinal baleiros.", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "O DN do cliente do usuario co que realizará o vínculo, p. ex. uid=axente, dc=exemplo, dc=com. Para o acceso anónimo deixe o DN e o contrasinal baleiros.", "Password" : "Contrasinal", "For anonymous access, leave DN and Password empty." : "Para o acceso anónimo deixe o DN e o contrasinal baleiros.", "Save Credentials" : "Gardar as credenciais", @@ -156,7 +156,7 @@ "User Display Name Field" : "Campo de nome de usuario para amosar", "The LDAP attribute to use to generate the user's display name." : "O atributo LDAP a empregar para xerar o nome de usuario para amosar.", "2nd User Display Name Field" : "2.º campo de nome de usuario para amosar", - "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opcional. Un atributo LDAP para ser engadido no nome para amosar entre parénteses. Resulta en p.ex. «Xan Carallás (xan.carallas@exemplo.org)».", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opcional. Un atributo LDAP para ser engadido no nome para amosar entre parénteses. Resulta en p. ex. «Xan Carallás (xan.carallas@exemplo.org)».", "Base User Tree" : "Base da árbore de usuarios", "One User Base DN per line" : "Un DN base de usuario por liña", "User Search Attributes" : "Atributos de busca do usuario", |