From 518e91b0087058f2c9813da6a2427a56fc14e32c Mon Sep 17 00:00:00 2001
From: Robin Appelman <robin@icewind.nl>
Date: Fri, 11 Dec 2020 16:40:29 +0100
Subject: [PATCH] dont offer to edit external config settings if we can't edit
 them

Signed-off-by: Robin Appelman <robin@icewind.nl>
---
 apps/files_external/js/statusmanager.js       |  7 ++++--
 .../Controller/GlobalStoragesController.php   | 12 ++++++++--
 .../lib/Controller/StoragesController.php     | 24 +++++++++++++++++--
 .../UserGlobalStoragesController.php          | 22 ++++++++++-------
 .../lib/Controller/UserStoragesController.php | 17 +++++++------
 5 files changed, 58 insertions(+), 24 deletions(-)

diff --git a/apps/files_external/js/statusmanager.js b/apps/files_external/js/statusmanager.js
index e8273dca0df..c3945991810 100644
--- a/apps/files_external/js/statusmanager.js
+++ b/apps/files_external/js/statusmanager.js
@@ -94,7 +94,8 @@ OCA.Files_External.StatusManager = {
 							id: mountData.id,
 							error: statusMessage,
 							userProvided: response.userProvided,
-							authMechanism: response.authMechanism
+							authMechanism: response.authMechanism,
+							canEdit: response.can_edit,
 						};
 					}
 					afterCallback(mountData, self.mountStatus[mountData.mount_point]);
@@ -182,12 +183,14 @@ OCA.Files_External.StatusManager = {
 					if (mountData.userProvided || mountData.authMechanism === 'password::global::user') {
 						// personal mount whit credentials problems
 						this.showCredentialsDialog(name, mountData);
-					} else {
+					} else if (mountData.canEdit) {
 						OC.dialogs.confirm(t('files_external', 'There was an error with message: ') + mountData.error + '. Do you want to review mount point config in admin settings page?', t('files_external', 'External mount error'), function (e) {
 							if (e === true) {
 								OC.redirect(OC.generateUrl('/settings/admin/externalstorages'));
 							}
 						});
+					} else {
+						OC.dialogs.info(t('files_external', 'There was an error with message: ') + mountData.error + '. Please contact your system administrator.', t('files_external', 'External mount error'), () => {});
 					}
 				} else {
 					OC.dialogs.confirm(t('files_external', 'There was an error with message: ') + mountData.error + '. Do you want to review mount point config in personal settings page?', t('files_external', 'External mount error'), function (e) {
diff --git a/apps/files_external/lib/Controller/GlobalStoragesController.php b/apps/files_external/lib/Controller/GlobalStoragesController.php
index 4d8b6c4bc8f..7ce2c84b8a9 100644
--- a/apps/files_external/lib/Controller/GlobalStoragesController.php
+++ b/apps/files_external/lib/Controller/GlobalStoragesController.php
@@ -32,9 +32,11 @@ use OCA\Files_External\NotFoundException;
 use OCA\Files_External\Service\GlobalStoragesService;
 use OCP\AppFramework\Http;
 use OCP\AppFramework\Http\DataResponse;
+use OCP\IGroupManager;
 use OCP\IL10N;
 use OCP\ILogger;
 use OCP\IRequest;
+use OCP\IUserSession;
 
 /**
  * Global storages controller
@@ -48,20 +50,26 @@ class GlobalStoragesController extends StoragesController {
 	 * @param IL10N $l10n l10n service
 	 * @param GlobalStoragesService $globalStoragesService storage service
 	 * @param ILogger $logger
+	 * @param IUserSession $userSession
+	 * @param IGroupManager $groupManager
 	 */
 	public function __construct(
 		$AppName,
 		IRequest $request,
 		IL10N $l10n,
 		GlobalStoragesService $globalStoragesService,
-		ILogger $logger
+		ILogger $logger,
+		IUserSession $userSession,
+		IGroupManager $groupManager
 	) {
 		parent::__construct(
 			$AppName,
 			$request,
 			$l10n,
 			$globalStoragesService,
-			$logger
+			$logger,
+			$userSession,
+			$groupManager
 		);
 	}
 
diff --git a/apps/files_external/lib/Controller/StoragesController.php b/apps/files_external/lib/Controller/StoragesController.php
index 5d9ffedf885..d58d61e3939 100644
--- a/apps/files_external/lib/Controller/StoragesController.php
+++ b/apps/files_external/lib/Controller/StoragesController.php
@@ -40,9 +40,11 @@ use OCP\AppFramework\Controller;
 use OCP\AppFramework\Http;
 use OCP\AppFramework\Http\DataResponse;
 use OCP\Files\StorageNotAvailableException;
+use OCP\IGroupManager;
 use OCP\IL10N;
 use OCP\ILogger;
 use OCP\IRequest;
+use OCP\IUserSession;
 
 /**
  * Base class for storages controllers
@@ -68,6 +70,16 @@ abstract class StoragesController extends Controller {
 	 */
 	protected $logger;
 
+	/**
+	 * @var IUserSession
+	 */
+	protected $userSession;
+
+	/**
+	 * @var IGroupManager
+	 */
+	protected $groupManager;
+
 	/**
 	 * Creates a new storages controller.
 	 *
@@ -82,12 +94,16 @@ abstract class StoragesController extends Controller {
 		IRequest $request,
 		IL10N $l10n,
 		StoragesService $storagesService,
-		ILogger $logger
+		ILogger $logger,
+		IUserSession $userSession,
+		IGroupManager $groupManager
 	) {
 		parent::__construct($AppName, $request);
 		$this->l10n = $l10n;
 		$this->service = $storagesService;
 		$this->logger = $logger;
+		$this->userSession = $userSession;
+		$this->groupManager = $groupManager;
 	}
 
 	/**
@@ -337,8 +353,12 @@ abstract class StoragesController extends Controller {
 			);
 		}
 
+		$data = $this->formatStorageForUI($storage)->jsonSerialize();
+		$isAdmin = $this->groupManager->isAdmin($this->userSession->getUser()->getUID());
+		$data['can_edit'] = $storage->getType() === StorageConfig::MOUNT_TYPE_PERSONAl || $isAdmin;
+
 		return new DataResponse(
-			$this->formatStorageForUI($storage),
+			$data,
 			Http::STATUS_OK
 		);
 	}
diff --git a/apps/files_external/lib/Controller/UserGlobalStoragesController.php b/apps/files_external/lib/Controller/UserGlobalStoragesController.php
index 1f7eb595701..f26b4dd67f9 100644
--- a/apps/files_external/lib/Controller/UserGlobalStoragesController.php
+++ b/apps/files_external/lib/Controller/UserGlobalStoragesController.php
@@ -37,6 +37,7 @@ use OCA\Files_External\NotFoundException;
 use OCA\Files_External\Service\UserGlobalStoragesService;
 use OCP\AppFramework\Http;
 use OCP\AppFramework\Http\DataResponse;
+use OCP\IGroupManager;
 use OCP\IL10N;
 use OCP\ILogger;
 use OCP\IRequest;
@@ -46,11 +47,6 @@ use OCP\IUserSession;
  * User global storages controller
  */
 class UserGlobalStoragesController extends StoragesController {
-	/**
-	 * @var IUserSession
-	 */
-	private $userSession;
-
 	/**
 	 * Creates a new user global storages controller.
 	 *
@@ -58,24 +54,28 @@ class UserGlobalStoragesController extends StoragesController {
 	 * @param IRequest $request request object
 	 * @param IL10N $l10n l10n service
 	 * @param UserGlobalStoragesService $userGlobalStoragesService storage service
+	 * @param ILogger $logger
 	 * @param IUserSession $userSession
+	 * @param IGroupManager $groupManager
 	 */
 	public function __construct(
 		$AppName,
 		IRequest $request,
 		IL10N $l10n,
 		UserGlobalStoragesService $userGlobalStoragesService,
+		ILogger $logger,
 		IUserSession $userSession,
-		ILogger $logger
+		IGroupManager $groupManager
 	) {
 		parent::__construct(
 			$AppName,
 			$request,
 			$l10n,
 			$userGlobalStoragesService,
-			$logger
+			$logger,
+			$userSession,
+			$groupManager
 		);
-		$this->userSession = $userSession;
 	}
 
 	/**
@@ -133,8 +133,12 @@ class UserGlobalStoragesController extends StoragesController {
 
 		$this->sanitizeStorage($storage);
 
+		$data = $this->formatStorageForUI($storage)->jsonSerialize();
+		$isAdmin = $this->groupManager->isAdmin($this->userSession->getUser()->getUID());
+		$data['can_edit'] = $storage->getType() === StorageConfig::MOUNT_TYPE_PERSONAl || $isAdmin;
+
 		return new DataResponse(
-			$this->formatStorageForUI($storage),
+			$data,
 			Http::STATUS_OK
 		);
 	}
diff --git a/apps/files_external/lib/Controller/UserStoragesController.php b/apps/files_external/lib/Controller/UserStoragesController.php
index c297d3db38e..8686921c90c 100644
--- a/apps/files_external/lib/Controller/UserStoragesController.php
+++ b/apps/files_external/lib/Controller/UserStoragesController.php
@@ -35,6 +35,7 @@ use OCA\Files_External\NotFoundException;
 use OCA\Files_External\Service\UserStoragesService;
 use OCP\AppFramework\Http;
 use OCP\AppFramework\Http\DataResponse;
+use OCP\IGroupManager;
 use OCP\IL10N;
 use OCP\ILogger;
 use OCP\IRequest;
@@ -44,11 +45,6 @@ use OCP\IUserSession;
  * User storages controller
  */
 class UserStoragesController extends StoragesController {
-	/**
-	 * @var IUserSession
-	 */
-	private $userSession;
-
 	/**
 	 * Creates a new user storages controller.
 	 *
@@ -56,25 +52,28 @@ class UserStoragesController extends StoragesController {
 	 * @param IRequest $request request object
 	 * @param IL10N $l10n l10n service
 	 * @param UserStoragesService $userStoragesService storage service
-	 * @param IUserSession $userSession
 	 * @param ILogger $logger
+	 * @param IUserSession $userSession
+	 * @param IGroupManager $groupManager
 	 */
 	public function __construct(
 		$AppName,
 		IRequest $request,
 		IL10N $l10n,
 		UserStoragesService $userStoragesService,
+		ILogger $logger,
 		IUserSession $userSession,
-		ILogger $logger
+		IGroupManager $groupManager
 	) {
 		parent::__construct(
 			$AppName,
 			$request,
 			$l10n,
 			$userStoragesService,
-			$logger
+			$logger,
+			$userSession,
+			$groupManager
 		);
-		$this->userSession = $userSession;
 	}
 
 	protected function manipulateStorageConfig(StorageConfig $storage) {
-- 
GitLab