Merge pull request #25132 from nextcloud/backport/24661/stable20

[stable20] dont offer to edit external config settings if we can't edit them
This commit is contained in:
Roeland Jago Douma 2021-02-18 19:41:49 +01:00 committed by GitHub
commit b986c9e4e5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 82 additions and 28 deletions

View File

@ -94,7 +94,8 @@ OCA.Files_External.StatusManager = {
id: mountData.id, id: mountData.id,
error: statusMessage, error: statusMessage,
userProvided: response.userProvided, userProvided: response.userProvided,
authMechanism: response.authMechanism authMechanism: response.authMechanism,
canEdit: response.can_edit,
}; };
} }
afterCallback(mountData, self.mountStatus[mountData.mount_point]); afterCallback(mountData, self.mountStatus[mountData.mount_point]);
@ -182,12 +183,14 @@ OCA.Files_External.StatusManager = {
if (mountData.userProvided || mountData.authMechanism === 'password::global::user') { if (mountData.userProvided || mountData.authMechanism === 'password::global::user') {
// personal mount whit credentials problems // personal mount whit credentials problems
this.showCredentialsDialog(name, mountData); 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) { 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) { if (e === true) {
OC.redirect(OC.generateUrl('/settings/admin/externalstorages')); 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'), function(){});
} }
} else { } 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) { 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) {

View File

@ -32,9 +32,11 @@ use OCA\Files_External\NotFoundException;
use OCA\Files_External\Service\GlobalStoragesService; use OCA\Files_External\Service\GlobalStoragesService;
use OCP\AppFramework\Http; use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\Http\DataResponse;
use OCP\IGroupManager;
use OCP\IL10N; use OCP\IL10N;
use OCP\ILogger; use OCP\ILogger;
use OCP\IRequest; use OCP\IRequest;
use OCP\IUserSession;
/** /**
* Global storages controller * Global storages controller
@ -48,20 +50,26 @@ class GlobalStoragesController extends StoragesController {
* @param IL10N $l10n l10n service * @param IL10N $l10n l10n service
* @param GlobalStoragesService $globalStoragesService storage service * @param GlobalStoragesService $globalStoragesService storage service
* @param ILogger $logger * @param ILogger $logger
* @param IUserSession $userSession
* @param IGroupManager $groupManager
*/ */
public function __construct( public function __construct(
$AppName, $AppName,
IRequest $request, IRequest $request,
IL10N $l10n, IL10N $l10n,
GlobalStoragesService $globalStoragesService, GlobalStoragesService $globalStoragesService,
ILogger $logger ILogger $logger,
IUserSession $userSession,
IGroupManager $groupManager
) { ) {
parent::__construct( parent::__construct(
$AppName, $AppName,
$request, $request,
$l10n, $l10n,
$globalStoragesService, $globalStoragesService,
$logger $logger,
$userSession,
$groupManager
); );
} }

View File

@ -40,9 +40,11 @@ use OCP\AppFramework\Controller;
use OCP\AppFramework\Http; use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\Http\DataResponse;
use OCP\Files\StorageNotAvailableException; use OCP\Files\StorageNotAvailableException;
use OCP\IGroupManager;
use OCP\IL10N; use OCP\IL10N;
use OCP\ILogger; use OCP\ILogger;
use OCP\IRequest; use OCP\IRequest;
use OCP\IUserSession;
/** /**
* Base class for storages controllers * Base class for storages controllers
@ -68,6 +70,16 @@ abstract class StoragesController extends Controller {
*/ */
protected $logger; protected $logger;
/**
* @var IUserSession
*/
protected $userSession;
/**
* @var IGroupManager
*/
protected $groupManager;
/** /**
* Creates a new storages controller. * Creates a new storages controller.
* *
@ -82,12 +94,16 @@ abstract class StoragesController extends Controller {
IRequest $request, IRequest $request,
IL10N $l10n, IL10N $l10n,
StoragesService $storagesService, StoragesService $storagesService,
ILogger $logger ILogger $logger,
IUserSession $userSession,
IGroupManager $groupManager
) { ) {
parent::__construct($AppName, $request); parent::__construct($AppName, $request);
$this->l10n = $l10n; $this->l10n = $l10n;
$this->service = $storagesService; $this->service = $storagesService;
$this->logger = $logger; $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( return new DataResponse(
$this->formatStorageForUI($storage), $data,
Http::STATUS_OK Http::STATUS_OK
); );
} }

View File

@ -37,6 +37,7 @@ use OCA\Files_External\NotFoundException;
use OCA\Files_External\Service\UserGlobalStoragesService; use OCA\Files_External\Service\UserGlobalStoragesService;
use OCP\AppFramework\Http; use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\Http\DataResponse;
use OCP\IGroupManager;
use OCP\IL10N; use OCP\IL10N;
use OCP\ILogger; use OCP\ILogger;
use OCP\IRequest; use OCP\IRequest;
@ -46,11 +47,6 @@ use OCP\IUserSession;
* User global storages controller * User global storages controller
*/ */
class UserGlobalStoragesController extends StoragesController { class UserGlobalStoragesController extends StoragesController {
/**
* @var IUserSession
*/
private $userSession;
/** /**
* Creates a new user global storages controller. * Creates a new user global storages controller.
* *
@ -58,24 +54,28 @@ class UserGlobalStoragesController extends StoragesController {
* @param IRequest $request request object * @param IRequest $request request object
* @param IL10N $l10n l10n service * @param IL10N $l10n l10n service
* @param UserGlobalStoragesService $userGlobalStoragesService storage service * @param UserGlobalStoragesService $userGlobalStoragesService storage service
* @param ILogger $logger
* @param IUserSession $userSession * @param IUserSession $userSession
* @param IGroupManager $groupManager
*/ */
public function __construct( public function __construct(
$AppName, $AppName,
IRequest $request, IRequest $request,
IL10N $l10n, IL10N $l10n,
UserGlobalStoragesService $userGlobalStoragesService, UserGlobalStoragesService $userGlobalStoragesService,
ILogger $logger,
IUserSession $userSession, IUserSession $userSession,
ILogger $logger IGroupManager $groupManager
) { ) {
parent::__construct( parent::__construct(
$AppName, $AppName,
$request, $request,
$l10n, $l10n,
$userGlobalStoragesService, $userGlobalStoragesService,
$logger $logger,
$userSession,
$groupManager
); );
$this->userSession = $userSession;
} }
/** /**
@ -133,8 +133,12 @@ class UserGlobalStoragesController extends StoragesController {
$this->sanitizeStorage($storage); $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( return new DataResponse(
$this->formatStorageForUI($storage), $data,
Http::STATUS_OK Http::STATUS_OK
); );
} }

View File

@ -35,6 +35,7 @@ use OCA\Files_External\NotFoundException;
use OCA\Files_External\Service\UserStoragesService; use OCA\Files_External\Service\UserStoragesService;
use OCP\AppFramework\Http; use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\Http\DataResponse;
use OCP\IGroupManager;
use OCP\IL10N; use OCP\IL10N;
use OCP\ILogger; use OCP\ILogger;
use OCP\IRequest; use OCP\IRequest;
@ -44,11 +45,6 @@ use OCP\IUserSession;
* User storages controller * User storages controller
*/ */
class UserStoragesController extends StoragesController { class UserStoragesController extends StoragesController {
/**
* @var IUserSession
*/
private $userSession;
/** /**
* Creates a new user storages controller. * Creates a new user storages controller.
* *
@ -56,25 +52,28 @@ class UserStoragesController extends StoragesController {
* @param IRequest $request request object * @param IRequest $request request object
* @param IL10N $l10n l10n service * @param IL10N $l10n l10n service
* @param UserStoragesService $userStoragesService storage service * @param UserStoragesService $userStoragesService storage service
* @param IUserSession $userSession
* @param ILogger $logger * @param ILogger $logger
* @param IUserSession $userSession
* @param IGroupManager $groupManager
*/ */
public function __construct( public function __construct(
$AppName, $AppName,
IRequest $request, IRequest $request,
IL10N $l10n, IL10N $l10n,
UserStoragesService $userStoragesService, UserStoragesService $userStoragesService,
ILogger $logger,
IUserSession $userSession, IUserSession $userSession,
ILogger $logger IGroupManager $groupManager
) { ) {
parent::__construct( parent::__construct(
$AppName, $AppName,
$request, $request,
$l10n, $l10n,
$userStoragesService, $userStoragesService,
$logger $logger,
$userSession,
$groupManager
); );
$this->userSession = $userSession;
} }
protected function manipulateStorageConfig(StorageConfig $storage) { protected function manipulateStorageConfig(StorageConfig $storage) {

View File

@ -26,11 +26,15 @@
namespace OCA\Files_External\Tests\Controller; namespace OCA\Files_External\Tests\Controller;
use OC\User\User;
use OCA\Files_External\Controller\GlobalStoragesController; use OCA\Files_External\Controller\GlobalStoragesController;
use OCA\Files_External\Service\BackendService; use OCA\Files_External\Service\BackendService;
use OCP\IGroupManager;
use OCP\IL10N; use OCP\IL10N;
use OCP\ILogger; use OCP\ILogger;
use OCP\IRequest; use OCP\IRequest;
use OCP\IUserSession;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class GlobalStoragesControllerTest extends StoragesControllerTest { class GlobalStoragesControllerTest extends StoragesControllerTest {
protected function setUp(): void { protected function setUp(): void {
@ -42,12 +46,18 @@ class GlobalStoragesControllerTest extends StoragesControllerTest {
$this->service->method('getVisibilityType') $this->service->method('getVisibilityType')
->willReturn(BackendService::VISIBILITY_ADMIN); ->willReturn(BackendService::VISIBILITY_ADMIN);
$session = $this->createMock(IUserSession::class);
$session->method('getUser')
->willReturn(new User('test', null, $this->createMock(EventDispatcherInterface::class)));
$this->controller = new GlobalStoragesController( $this->controller = new GlobalStoragesController(
'files_external', 'files_external',
$this->createMock(IRequest::class), $this->createMock(IRequest::class),
$this->createMock(IL10N::class), $this->createMock(IL10N::class),
$this->service, $this->service,
$this->createMock(ILogger::class) $this->createMock(ILogger::class),
$session,
$this->createMock(IGroupManager::class)
); );
} }
} }

View File

@ -338,7 +338,9 @@ abstract class StoragesControllerTest extends \Test\TestCase {
$response = $this->controller->show(1); $response = $this->controller->show(1);
$this->assertEquals(Http::STATUS_OK, $response->getStatus()); $this->assertEquals(Http::STATUS_OK, $response->getStatus());
$this->assertEquals($storageConfig, $response->getData()); $expected = $storageConfig->jsonSerialize();
$expected['can_edit'] = false;
$this->assertEquals($expected, $response->getData());
} }
public function validateStorageProvider() { public function validateStorageProvider() {

View File

@ -27,14 +27,17 @@
namespace OCA\Files_External\Tests\Controller; namespace OCA\Files_External\Tests\Controller;
use OC\User\User;
use OCA\Files_External\Controller\UserStoragesController; use OCA\Files_External\Controller\UserStoragesController;
use OCA\Files_External\Lib\StorageConfig; use OCA\Files_External\Lib\StorageConfig;
use OCA\Files_External\Service\BackendService; use OCA\Files_External\Service\BackendService;
use OCP\AppFramework\Http; use OCP\AppFramework\Http;
use OCP\IGroupManager;
use OCP\IL10N; use OCP\IL10N;
use OCP\ILogger; use OCP\ILogger;
use OCP\IRequest; use OCP\IRequest;
use OCP\IUserSession; use OCP\IUserSession;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class UserStoragesControllerTest extends StoragesControllerTest { class UserStoragesControllerTest extends StoragesControllerTest {
@ -52,13 +55,18 @@ class UserStoragesControllerTest extends StoragesControllerTest {
$this->service->method('getVisibilityType') $this->service->method('getVisibilityType')
->willReturn(BackendService::VISIBILITY_PERSONAL); ->willReturn(BackendService::VISIBILITY_PERSONAL);
$session = $this->createMock(IUserSession::class);
$session->method('getUser')
->willReturn(new User('test', null, $this->createMock(EventDispatcherInterface::class)));
$this->controller = new UserStoragesController( $this->controller = new UserStoragesController(
'files_external', 'files_external',
$this->createMock(IRequest::class), $this->createMock(IRequest::class),
$this->createMock(IL10N::class), $this->createMock(IL10N::class),
$this->service, $this->service,
$this->createMock(IUserSession::class), $this->createMock(ILogger::class),
$this->createMock(ILogger::class) $session,
$this->createMock(IGroupManager::class)
); );
} }