From b750503f4a6e773dc591f49623fbf18ea03d6b7e Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 23 Sep 2020 15:43:31 +0200 Subject: [PATCH 1/2] allow using saved login credentials for notify when only the user is provided, we use to provided user to try and get saved login credentials Signed-off-by: Robin Appelman --- apps/files_external/lib/Command/Notify.php | 61 +++++++++++++++++----- 1 file changed, 47 insertions(+), 14 deletions(-) diff --git a/apps/files_external/lib/Command/Notify.php b/apps/files_external/lib/Command/Notify.php index 0718b0eee6..5a9df0b81f 100644 --- a/apps/files_external/lib/Command/Notify.php +++ b/apps/files_external/lib/Command/Notify.php @@ -41,6 +41,7 @@ use OCP\Files\Storage\IStorage; use OCP\Files\StorageNotAvailableException; use OCP\IDBConnection; use OCP\ILogger; +use OCP\IUserManager; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; @@ -53,12 +54,20 @@ class Notify extends Base { private $connection; /** @var ILogger */ private $logger; + /** @var IUserManager */ + private $userManager; - public function __construct(GlobalStoragesService $globalService, IDBConnection $connection, ILogger $logger) { + public function __construct( + GlobalStoragesService $globalService, + IDBConnection $connection, + ILogger $logger, + IUserManager $userManager + ) { parent::__construct(); $this->globalService = $globalService; $this->connection = $connection; $this->logger = $logger; + $this->userManager = $userManager; } protected function configure() { @@ -89,6 +98,30 @@ class Notify extends Base { parent::configure(); } + private function getUserOption(InputInterface $input): ?string { + if ($input->getOption('user')) { + return (string)$input->getOption('user'); + } elseif (isset($_ENV['NOTIFY_USER'])) { + return (string)$_ENV['NOTIFY_USER']; + } elseif (isset($_SERVER['NOTIFY_USER'])) { + return (string)$_SERVER['NOTIFY_USER']; + } else { + return null; + } + } + + private function getPasswordOption(InputInterface $input): ?string { + if ($input->getOption('password')) { + return (string)$input->getOption('password'); + } elseif (isset($_ENV['NOTIFY_PASSWORD'])) { + return (string)$_ENV['NOTIFY_PASSWORD']; + } elseif (isset($_SERVER['NOTIFY_PASSWORD'])) { + return (string)$_SERVER['NOTIFY_PASSWORD']; + } else { + return null; + } + } + protected function execute(InputInterface $input, OutputInterface $output): int { $mount = $this->globalService->getStorage($input->getArgument('mount_id')); if (is_null($mount)) { @@ -96,28 +129,28 @@ class Notify extends Base { return 1; } $noAuth = false; + + $userOption = $this->getUserOption($input); + $passwordOption = $this->getPasswordOption($input); + + // if only the user is provided, we get the user object to pass along to the auth backend + // this allows using saved user credentials + $user = ($userOption && !$passwordOption) ? $this->userManager->get($userOption) : null; + try { $authBackend = $mount->getAuthMechanism(); - $authBackend->manipulateStorageConfig($mount); + $authBackend->manipulateStorageConfig($mount, $user); } catch (InsufficientDataForMeaningfulAnswerException $e) { $noAuth = true; } catch (StorageNotAvailableException $e) { $noAuth = true; } - if ($input->getOption('user')) { - $mount->setBackendOption('user', $input->getOption('user')); - } elseif (isset($_ENV['NOTIFY_USER'])) { - $mount->setBackendOption('user', $_ENV['NOTIFY_USER']); - } elseif (isset($_SERVER['NOTIFY_USER'])) { - $mount->setBackendOption('user', $_SERVER['NOTIFY_USER']); + if ($userOption) { + $mount->setBackendOption('user', $userOption); } - if ($input->getOption('password')) { - $mount->setBackendOption('password', $input->getOption('password')); - } elseif (isset($_ENV['NOTIFY_PASSWORD'])) { - $mount->setBackendOption('password', $_ENV['NOTIFY_PASSWORD']); - } elseif (isset($_SERVER['NOTIFY_PASSWORD'])) { - $mount->setBackendOption('password', $_SERVER['NOTIFY_PASSWORD']); + if ($passwordOption) { + $mount->setBackendOption('password', $passwordOption); } try { From d5e77685a4aaf5433bf60cc9ac06a6d9f69b3117 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 7 Oct 2020 15:43:44 +0200 Subject: [PATCH 2/2] also give storage backend it's change to manipulate the config Signed-off-by: Robin Appelman --- apps/files_external/lib/Command/Notify.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/apps/files_external/lib/Command/Notify.php b/apps/files_external/lib/Command/Notify.php index 5a9df0b81f..b9c0b6da02 100644 --- a/apps/files_external/lib/Command/Notify.php +++ b/apps/files_external/lib/Command/Notify.php @@ -153,6 +153,15 @@ class Notify extends Base { $mount->setBackendOption('password', $passwordOption); } + try { + $backend = $mount->getBackend(); + $backend->manipulateStorageConfig($mount, $user); + } catch (InsufficientDataForMeaningfulAnswerException $e) { + $noAuth = true; + } catch (StorageNotAvailableException $e) { + $noAuth = true; + } + try { $storage = $this->createStorage($mount); } catch (\Exception $e) {