Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/spreed.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoas Schilling <coding@schilljs.com>2021-03-22 14:27:12 +0300
committerJoas Schilling <coding@schilljs.com>2021-03-23 10:58:20 +0300
commit5adb06183836b665d56cc6804a2e4a3d6b10955f (patch)
tree49870824dc5761d7019245ac436b8606d4e01930
parent419fb161b8352a26b2502134a286c0dfb5b3d32f (diff)
Temporary OCS API for user avatar upload and delete
Signed-off-by: Joas Schilling <coding@schilljs.com>
-rw-r--r--appinfo/routes.php12
-rw-r--r--lib/Capabilities.php1
-rw-r--r--lib/Controller/TempAvatarController.php149
-rw-r--r--tests/php/CapabilitiesTest.php1
4 files changed, 163 insertions, 0 deletions
diff --git a/appinfo/routes.php b/appinfo/routes.php
index a2e125273..920a91fb5 100644
--- a/appinfo/routes.php
+++ b/appinfo/routes.php
@@ -600,5 +600,17 @@ return [
'apiVersion' => 'v1',
],
],
+
+
+ [
+ 'name' => 'TempAvatar#postAvatar',
+ 'url' => '/temp-user-avatar',
+ 'verb' => 'POST',
+ ],
+ [
+ 'name' => 'TempAvatar#deleteAvatar',
+ 'url' => '/temp-user-avatar',
+ 'verb' => 'DELETE',
+ ],
],
];
diff --git a/lib/Capabilities.php b/lib/Capabilities.php
index d4be618ee..f1042e515 100644
--- a/lib/Capabilities.php
+++ b/lib/Capabilities.php
@@ -89,6 +89,7 @@ class Capabilities implements IPublicCapability {
'raise-hand',
'room-description',
'rich-object-sharing',
+ 'temp-user-avatar-api',
],
'config' => [
'attachments' => [
diff --git a/lib/Controller/TempAvatarController.php b/lib/Controller/TempAvatarController.php
new file mode 100644
index 000000000..6a5098c56
--- /dev/null
+++ b/lib/Controller/TempAvatarController.php
@@ -0,0 +1,149 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * @copyright Copyright (c) 2016 Lukas Reschke <lukas@statuscode.ch>
+ *
+ * @author Lukas Reschke <lukas@statuscode.ch>
+ *
+ * @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\Talk\Controller;
+
+use OC\Files\Filesystem;
+use OCP\AppFramework\Http;
+use OCP\AppFramework\Http\DataResponse;
+use OCP\AppFramework\OCSController;
+use OCP\IAvatarManager;
+use OCP\IL10N;
+use OCP\IRequest;
+use Psr\Log\LoggerInterface;
+
+class TempAvatarController extends OCSController {
+
+ /** @var IAvatarManager */
+ private $avatarManager;
+ /** @var IL10N */
+ private $l;
+ /** @var LoggerInterface */
+ private $logger;
+ /** @var string */
+ private $userId;
+
+ public function __construct(
+ string $appName,
+ IRequest $request,
+ IAvatarManager $avatarManager,
+ IL10N $l,
+ LoggerInterface $logger,
+ string $userId
+ ) {
+ parent::__construct($appName, $request);
+ $this->avatarManager = $avatarManager;
+ $this->logger = $logger;
+ $this->l = $l;
+ $this->userId = $userId;
+ }
+
+ /**
+ * @NoAdminRequired
+ *
+ * @return DataResponse
+ */
+ public function postAvatar(): DataResponse {
+ $files = $this->request->getUploadedFile('files');
+
+ if (is_null($files)) {
+ return new DataResponse(
+ ['message' => $this->l->t('No image file provided')],
+ Http::STATUS_BAD_REQUEST
+ );
+ }
+
+ if (
+ $files['error'][0] === 0 &&
+ is_uploaded_file($files['tmp_name'][0]) &&
+ !Filesystem::isFileBlacklisted($files['tmp_name'][0])
+ ) {
+ if ($files['size'][0] > 20 * 1024 * 1024) {
+ return new DataResponse(
+ ['message' => $this->l->t('File is too big')],
+ Http::STATUS_BAD_REQUEST
+ );
+ }
+ $content = file_get_contents($files['tmp_name'][0]);
+ unlink($files['tmp_name'][0]);
+ } else {
+ return new DataResponse(
+ ['message' => $this->l->t('Invalid file provided')],
+ Http::STATUS_BAD_REQUEST
+ );
+ }
+
+ try {
+ $image = new \OC_Image();
+ $image->loadFromData($content);
+ $image->readExif($content);
+ $image->fixOrientation();
+
+ if (!$image->valid()) {
+ return new DataResponse(
+ ['data' => ['message' => $this->l->t('Invalid image')]],
+ Http::STATUS_BAD_REQUEST
+ );
+ }
+
+ $mimeType = $image->mimeType();
+ if ($mimeType !== 'image/jpeg' && $mimeType !== 'image/png') {
+ return new DataResponse(
+ ['data' => ['message' => $this->l->t('Unknown filetype')]],
+ Http::STATUS_BAD_REQUEST
+ );
+ }
+
+ $avatar = $this->avatarManager->getAvatar($this->userId);
+ $avatar->set($image);
+ return new DataResponse();
+ } catch (\Exception $e) {
+ $this->logger->error('Failed to delete avatar', [
+ 'exception' => $e,
+ ]);
+
+ return new DataResponse(['message' => $this->l->t('An error occurred. Please contact your admin.')], Http::STATUS_BAD_REQUEST);
+ }
+ }
+
+
+ /**
+ * @NoAdminRequired
+ *
+ * @return DataResponse
+ */
+ public function deleteAvatar(): DataResponse {
+ try {
+ $avatar = $this->avatarManager->getAvatar($this->userId);
+ $avatar->remove();
+ return new DataResponse();
+ } catch (\Exception $e) {
+ $this->logger->error('Failed to delete avatar', [
+ 'exception' => $e,
+ ]);
+ return new DataResponse([], Http::STATUS_BAD_REQUEST);
+ }
+ }
+}
diff --git a/tests/php/CapabilitiesTest.php b/tests/php/CapabilitiesTest.php
index 1741abf2d..ce31f0377 100644
--- a/tests/php/CapabilitiesTest.php
+++ b/tests/php/CapabilitiesTest.php
@@ -86,6 +86,7 @@ class CapabilitiesTest extends TestCase {
'raise-hand',
'room-description',
'rich-object-sharing',
+ 'temp-user-avatar-api',
];
}