aboutsummaryrefslogtreecommitdiffstats
path: root/apps/dav
diff options
context:
space:
mode:
Diffstat (limited to 'apps/dav')
-rw-r--r--apps/dav/composer/composer/autoload_classmap.php1
-rw-r--r--apps/dav/composer/composer/autoload_static.php1
-rw-r--r--apps/dav/l10n/fi.js4
-rw-r--r--apps/dav/l10n/fi.json4
-rw-r--r--apps/dav/l10n/zh_CN.js2
-rw-r--r--apps/dav/l10n/zh_CN.json2
-rw-r--r--apps/dav/lib/Connector/Sabre/PropfindCompressionPlugin.php74
-rw-r--r--apps/dav/lib/Server.php5
-rw-r--r--apps/dav/tests/unit/Connector/Sabre/PropfindCompressionPluginTest.php116
9 files changed, 207 insertions, 2 deletions
diff --git a/apps/dav/composer/composer/autoload_classmap.php b/apps/dav/composer/composer/autoload_classmap.php
index 057f4dddfcb..71cf0c10876 100644
--- a/apps/dav/composer/composer/autoload_classmap.php
+++ b/apps/dav/composer/composer/autoload_classmap.php
@@ -143,6 +143,7 @@ return array(
'OCA\\DAV\\Connector\\Sabre\\Node' => $baseDir . '/../lib/Connector/Sabre/Node.php',
'OCA\\DAV\\Connector\\Sabre\\ObjectTree' => $baseDir . '/../lib/Connector/Sabre/ObjectTree.php',
'OCA\\DAV\\Connector\\Sabre\\Principal' => $baseDir . '/../lib/Connector/Sabre/Principal.php',
+ 'OCA\\DAV\\Connector\\Sabre\\PropfindCompressionPlugin' => $baseDir . '/../lib/Connector/Sabre/PropfindCompressionPlugin.php',
'OCA\\DAV\\Connector\\Sabre\\QuotaPlugin' => $baseDir . '/../lib/Connector/Sabre/QuotaPlugin.php',
'OCA\\DAV\\Connector\\Sabre\\Server' => $baseDir . '/../lib/Connector/Sabre/Server.php',
'OCA\\DAV\\Connector\\Sabre\\ServerFactory' => $baseDir . '/../lib/Connector/Sabre/ServerFactory.php',
diff --git a/apps/dav/composer/composer/autoload_static.php b/apps/dav/composer/composer/autoload_static.php
index ec553beb2bb..c0ed98a03ce 100644
--- a/apps/dav/composer/composer/autoload_static.php
+++ b/apps/dav/composer/composer/autoload_static.php
@@ -158,6 +158,7 @@ class ComposerStaticInitDAV
'OCA\\DAV\\Connector\\Sabre\\Node' => __DIR__ . '/..' . '/../lib/Connector/Sabre/Node.php',
'OCA\\DAV\\Connector\\Sabre\\ObjectTree' => __DIR__ . '/..' . '/../lib/Connector/Sabre/ObjectTree.php',
'OCA\\DAV\\Connector\\Sabre\\Principal' => __DIR__ . '/..' . '/../lib/Connector/Sabre/Principal.php',
+ 'OCA\\DAV\\Connector\\Sabre\\PropfindCompressionPlugin' => __DIR__ . '/..' . '/../lib/Connector/Sabre/PropfindCompressionPlugin.php',
'OCA\\DAV\\Connector\\Sabre\\QuotaPlugin' => __DIR__ . '/..' . '/../lib/Connector/Sabre/QuotaPlugin.php',
'OCA\\DAV\\Connector\\Sabre\\Server' => __DIR__ . '/..' . '/../lib/Connector/Sabre/Server.php',
'OCA\\DAV\\Connector\\Sabre\\ServerFactory' => __DIR__ . '/..' . '/../lib/Connector/Sabre/ServerFactory.php',
diff --git a/apps/dav/l10n/fi.js b/apps/dav/l10n/fi.js
index 3ef0dd10f04..04d5f09b522 100644
--- a/apps/dav/l10n/fi.js
+++ b/apps/dav/l10n/fi.js
@@ -43,6 +43,7 @@ OC.L10N.register(
"A <strong>calendar</strong> was modified" : "<strong>Kalenteria</strong> on muokattu",
"A calendar <strong>event</strong> was modified" : "Kalenterin <strong>tapahtumaa</strong> on muokattu",
"A calendar <strong>todo</strong> was modified" : "Kalenterin <strong>tehtävää</strong> on muokattu",
+ "Death of %s" : "%s kuolema",
"Contact birthdays" : "Yhteystietojen syntymäpäivät",
"Calendar:" : "Kalenteri:",
"Date:" : "Päiväys:",
@@ -67,7 +68,10 @@ OC.L10N.register(
"Accept" : "Hyväksy",
"Decline" : "Kieltäydy",
"More options …" : "Lisää valintoja…",
+ "More options at %s" : "Lisää valintoja kohteessa %s",
"Contacts" : "Yhteystiedot",
+ "System in maintenance mode." : "Järjestelmä on huoltotilassa.",
+ "Upgrade needed" : "Päivitys tarvitaan",
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "%s tulee asettaa käyttämään HTTPS-yhteyttä, jotta CalDAVia ja CardDAVia voi käyttää iOSilla tai macOS:llä.",
"Configures a CalDAV account" : "Määrittää CalDAV-tilin",
"Configures a CardDAV account" : "Määrittää CardDAV-tilin",
diff --git a/apps/dav/l10n/fi.json b/apps/dav/l10n/fi.json
index f329ccec404..384cdabf0db 100644
--- a/apps/dav/l10n/fi.json
+++ b/apps/dav/l10n/fi.json
@@ -41,6 +41,7 @@
"A <strong>calendar</strong> was modified" : "<strong>Kalenteria</strong> on muokattu",
"A calendar <strong>event</strong> was modified" : "Kalenterin <strong>tapahtumaa</strong> on muokattu",
"A calendar <strong>todo</strong> was modified" : "Kalenterin <strong>tehtävää</strong> on muokattu",
+ "Death of %s" : "%s kuolema",
"Contact birthdays" : "Yhteystietojen syntymäpäivät",
"Calendar:" : "Kalenteri:",
"Date:" : "Päiväys:",
@@ -65,7 +66,10 @@
"Accept" : "Hyväksy",
"Decline" : "Kieltäydy",
"More options …" : "Lisää valintoja…",
+ "More options at %s" : "Lisää valintoja kohteessa %s",
"Contacts" : "Yhteystiedot",
+ "System in maintenance mode." : "Järjestelmä on huoltotilassa.",
+ "Upgrade needed" : "Päivitys tarvitaan",
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "%s tulee asettaa käyttämään HTTPS-yhteyttä, jotta CalDAVia ja CardDAVia voi käyttää iOSilla tai macOS:llä.",
"Configures a CalDAV account" : "Määrittää CalDAV-tilin",
"Configures a CardDAV account" : "Määrittää CardDAV-tilin",
diff --git a/apps/dav/l10n/zh_CN.js b/apps/dav/l10n/zh_CN.js
index e4fa3a71a05..4150c8c242f 100644
--- a/apps/dav/l10n/zh_CN.js
+++ b/apps/dav/l10n/zh_CN.js
@@ -90,7 +90,7 @@ OC.L10N.register(
"Your attendance was updated successfully." : "您的出席状态更新成功。",
"Calendar server" : "日历服务器",
"Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "也安装 {calendarappstoreopen}日历应用{linkclose},或者 {calendardocopen}连接您的桌面和移动端同步日历 ↗{linkclose}。",
- "Send invitations to attendees" : "向参与者发送邀请",
+ "Send invitations to attendees" : "向与会者发送邀请",
"Please make sure to properly set up {emailopen}the email server{linkclose}." : "请确保正确设置 {emailopen}邮件服务器{linkclose}。",
"Automatically generate a birthday calendar" : "自动生成生日日历",
"Birthday calendars will be generated by a background job." : "生日日历将由后台作业生成。",
diff --git a/apps/dav/l10n/zh_CN.json b/apps/dav/l10n/zh_CN.json
index 8a20ce29dde..e60f2fac9d1 100644
--- a/apps/dav/l10n/zh_CN.json
+++ b/apps/dav/l10n/zh_CN.json
@@ -88,7 +88,7 @@
"Your attendance was updated successfully." : "您的出席状态更新成功。",
"Calendar server" : "日历服务器",
"Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "也安装 {calendarappstoreopen}日历应用{linkclose},或者 {calendardocopen}连接您的桌面和移动端同步日历 ↗{linkclose}。",
- "Send invitations to attendees" : "向参与者发送邀请",
+ "Send invitations to attendees" : "向与会者发送邀请",
"Please make sure to properly set up {emailopen}the email server{linkclose}." : "请确保正确设置 {emailopen}邮件服务器{linkclose}。",
"Automatically generate a birthday calendar" : "自动生成生日日历",
"Birthday calendars will be generated by a background job." : "生日日历将由后台作业生成。",
diff --git a/apps/dav/lib/Connector/Sabre/PropfindCompressionPlugin.php b/apps/dav/lib/Connector/Sabre/PropfindCompressionPlugin.php
new file mode 100644
index 00000000000..a1529508658
--- /dev/null
+++ b/apps/dav/lib/Connector/Sabre/PropfindCompressionPlugin.php
@@ -0,0 +1,74 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * @copyright Copyright (c) 2020, Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\DAV\Connector\Sabre;
+
+use Sabre\DAV\ServerPlugin;
+use Sabre\HTTP\Request;
+use Sabre\HTTP\Response;
+
+class PropfindCompressionPlugin extends ServerPlugin {
+
+ /**
+ * Reference to main server object
+ *
+ * @var Server
+ */
+ private $server;
+
+ /**
+ * This initializes the plugin.
+ *
+ * This function is called by \Sabre\DAV\Server, after
+ * addPlugin is called.
+ *
+ * This method should set up the required event subscriptions.
+ *
+ * @param \Sabre\DAV\Server $server
+ * @return void
+ */
+ public function initialize(\Sabre\DAV\Server $server) {
+ $this->server = $server;
+ $this->server->on('afterMethod:PROPFIND', [$this, 'compressResponse'], 100);
+ }
+
+ public function compressResponse(Request $request, Response $response) {
+ $header = $request->getHeader('Accept-Encoding');
+
+ if ($header === null) {
+ return $response;
+ }
+
+ if (strpos($header, 'gzip') !== false) {
+ $body = $response->getBody();
+ if (is_string($body)) {
+ $response->setHeader('Content-Encoding', 'gzip');
+ $response->setBody(gzencode($body));
+ }
+ }
+
+ return $response;
+ }
+}
diff --git a/apps/dav/lib/Server.php b/apps/dav/lib/Server.php
index 46cac5ef873..e64abf43f75 100644
--- a/apps/dav/lib/Server.php
+++ b/apps/dav/lib/Server.php
@@ -54,6 +54,7 @@ use OCA\DAV\Connector\Sabre\DummyGetResponsePlugin;
use OCA\DAV\Connector\Sabre\FakeLockerPlugin;
use OCA\DAV\Connector\Sabre\FilesPlugin;
use OCA\DAV\Connector\Sabre\FilesReportPlugin;
+use OCA\DAV\Connector\Sabre\PropfindCompressionPlugin;
use OCA\DAV\Connector\Sabre\QuotaPlugin;
use OCA\DAV\Connector\Sabre\SharesPlugin;
use OCA\DAV\Connector\Sabre\TagsPlugin;
@@ -314,6 +315,10 @@ class Server {
$root->addChild($appCollection);
}
});
+
+ $this->server->addPlugin(
+ new PropfindCompressionPlugin()
+ );
}
public function exec() {
diff --git a/apps/dav/tests/unit/Connector/Sabre/PropfindCompressionPluginTest.php b/apps/dav/tests/unit/Connector/Sabre/PropfindCompressionPluginTest.php
new file mode 100644
index 00000000000..a7cb8582bc7
--- /dev/null
+++ b/apps/dav/tests/unit/Connector/Sabre/PropfindCompressionPluginTest.php
@@ -0,0 +1,116 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * @copyright Copyright (c) 2020, Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\DAV\Tests\unit\Connector\Sabre;
+
+use OCA\DAV\Connector\Sabre\PropfindCompressionPlugin;
+use Sabre\HTTP\Request;
+use Sabre\HTTP\Response;
+use Test\TestCase;
+
+class PropfindCompressionPluginTest extends TestCase {
+ /** @var PropfindCompressionPlugin */
+ private $plugin;
+
+ protected function setUp(): void {
+ parent::setUp();
+
+ $this->plugin = new PropfindCompressionPlugin();
+ }
+
+ public function testNoHeader() {
+ $request = $this->createMock(Request::class);
+ $response = $this->createMock(Response::class);
+
+ $request->method('getHeader')
+ ->with('Accept-Encoding')
+ ->willReturn(null);
+
+ $response->expects($this->never())
+ ->method($this->anything());
+
+ $result = $this->plugin->compressResponse($request, $response);
+ $this->assertSame($response, $result);
+ }
+
+ public function testHeaderButNoGzip() {
+ $request = $this->createMock(Request::class);
+ $response = $this->createMock(Response::class);
+
+ $request->method('getHeader')
+ ->with('Accept-Encoding')
+ ->willReturn('deflate');
+
+ $response->expects($this->never())
+ ->method($this->anything());
+
+ $result = $this->plugin->compressResponse($request, $response);
+ $this->assertSame($response, $result);
+ }
+
+ public function testHeaderGzipButNoStringBody() {
+ $request = $this->createMock(Request::class);
+ $response = $this->createMock(Response::class);
+
+ $request->method('getHeader')
+ ->with('Accept-Encoding')
+ ->willReturn('deflate');
+
+ $response->method('getBody')
+ ->willReturn(5);
+
+ $result = $this->plugin->compressResponse($request, $response);
+ $this->assertSame($response, $result);
+ }
+
+
+ public function testProperGzip() {
+ $request = $this->createMock(Request::class);
+ $response = $this->createMock(Response::class);
+
+ $request->method('getHeader')
+ ->with('Accept-Encoding')
+ ->willReturn('gzip, deflate');
+
+ $response->method('getBody')
+ ->willReturn('my gzip test');
+
+ $response->expects($this->once())
+ ->method('setHeader')
+ ->with(
+ $this->equalTo('Content-Encoding'),
+ $this->equalTo('gzip')
+ );
+ $response->expects($this->once())
+ ->method('setBody')
+ ->with($this->callback(function ($data) {
+ $orig = gzdecode($data);
+ return $orig === 'my gzip test';
+ }));
+
+ $result = $this->plugin->compressResponse($request, $response);
+ $this->assertSame($response, $result);
+ }
+}