2016-02-05 08:17:03 -05:00
< ? php
2025-06-30 09:04:05 -04:00
2016-02-05 08:17:03 -05:00
/**
2024-06-06 03:55:47 -04:00
* SPDX - FileCopyrightText : 2017 - 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX - FileCopyrightText : 2016 ownCloud , Inc .
* SPDX - License - Identifier : AGPL - 3.0 - only
2016-02-05 08:17:03 -05:00
*/
namespace OCA\Files_External\Command ;
use OC\Core\Command\Base ;
use OC\Files\Filesystem ;
use OC\User\NoUserException ;
use OCA\Files_External\Lib\Auth\AuthMechanism ;
use OCA\Files_External\Lib\Backend\Backend ;
use OCA\Files_External\Lib\DefinitionParameter ;
2016-05-13 05:56:47 -04:00
use OCA\Files_External\Lib\StorageConfig ;
2016-02-05 08:17:03 -05:00
use OCA\Files_External\Service\BackendService ;
2016-05-13 05:22:28 -04:00
use OCA\Files_External\Service\GlobalStoragesService ;
2022-10-18 06:22:40 -04:00
use OCA\Files_External\Service\StoragesService ;
2023-11-23 04:22:34 -05:00
use OCA\Files_External\Service\UserStoragesService ;
2024-10-02 17:27:44 -04:00
use OCP\AppFramework\Http ;
2016-02-05 08:17:03 -05:00
use OCP\IUserManager ;
use OCP\IUserSession ;
use Symfony\Component\Console\Input\ArrayInput ;
use Symfony\Component\Console\Input\InputArgument ;
use Symfony\Component\Console\Input\InputInterface ;
use Symfony\Component\Console\Input\InputOption ;
use Symfony\Component\Console\Output\OutputInterface ;
class Create extends Base {
2023-07-04 05:04:36 -04:00
public function __construct (
private GlobalStoragesService $globalService ,
private UserStoragesService $userService ,
private IUserManager $userManager ,
private IUserSession $userSession ,
private BackendService $backendService ,
2016-02-05 08:17:03 -05:00
) {
parent :: __construct ();
}
2022-10-16 18:54:00 -04:00
protected function configure () : void {
2016-02-05 08:17:03 -05:00
$this
-> setName ( 'files_external:create' )
-> setDescription ( 'Create a new mount configuration' )
-> addOption (
'user' ,
2017-07-19 14:32:54 -04:00
'' ,
2016-02-05 08:17:03 -05:00
InputOption :: VALUE_OPTIONAL ,
'user to add the mount configuration for, if not set the mount will be added as system mount'
)
-> addArgument (
'mount_point' ,
InputArgument :: REQUIRED ,
'mount point for the new mount'
)
-> addArgument (
'storage_backend' ,
InputArgument :: REQUIRED ,
'storage backend identifier for the new mount, see `occ files_external:backends` for possible values'
)
-> addArgument (
'authentication_backend' ,
InputArgument :: REQUIRED ,
'authentication backend identifier for the new mount, see `occ files_external:backends` for possible values'
)
-> addOption (
'config' ,
'c' ,
InputOption :: VALUE_REQUIRED | InputOption :: VALUE_IS_ARRAY ,
'Mount configuration option in key=value format'
)
-> addOption (
'dry' ,
2017-07-19 14:32:54 -04:00
'' ,
2016-02-05 08:17:03 -05:00
InputOption :: VALUE_NONE ,
'Don\'t save the created mount, only list the new mount'
);
parent :: configure ();
}
2020-06-26 09:12:11 -04:00
protected function execute ( InputInterface $input , OutputInterface $output ) : int {
2022-10-18 06:22:40 -04:00
$user = ( string ) $input -> getOption ( 'user' );
2016-02-05 08:17:03 -05:00
$mountPoint = $input -> getArgument ( 'mount_point' );
$storageIdentifier = $input -> getArgument ( 'storage_backend' );
$authIdentifier = $input -> getArgument ( 'authentication_backend' );
$configInput = $input -> getOption ( 'config' );
$storageBackend = $this -> backendService -> getBackend ( $storageIdentifier );
$authBackend = $this -> backendService -> getAuthMechanism ( $authIdentifier );
if ( ! Filesystem :: isValidPath ( $mountPoint )) {
$output -> writeln ( '<error>Invalid mountpoint "' . $mountPoint . '"</error>' );
2023-07-04 05:04:36 -04:00
return self :: FAILURE ;
2016-02-05 08:17:03 -05:00
}
if ( is_null ( $storageBackend )) {
$output -> writeln ( '<error>Storage backend with identifier "' . $storageIdentifier . '" not found (see `occ files_external:backends` for possible values)</error>' );
2024-10-02 17:27:44 -04:00
return Http :: STATUS_NOT_FOUND ;
2016-02-05 08:17:03 -05:00
}
if ( is_null ( $authBackend )) {
$output -> writeln ( '<error>Authentication backend with identifier "' . $authIdentifier . '" not found (see `occ files_external:backends` for possible values)</error>' );
2024-10-02 17:27:44 -04:00
return Http :: STATUS_NOT_FOUND ;
2016-02-05 08:17:03 -05:00
}
2016-02-05 09:51:38 -05:00
$supportedSchemes = array_keys ( $storageBackend -> getAuthSchemes ());
if ( ! in_array ( $authBackend -> getScheme (), $supportedSchemes )) {
$output -> writeln ( '<error>Authentication backend "' . $authIdentifier . '" not valid for storage backend "' . $storageIdentifier . '" (see `occ files_external:backends storage ' . $storageIdentifier . '` for possible values)</error>' );
2023-07-04 05:04:36 -04:00
return self :: FAILURE ;
2016-02-05 09:51:38 -05:00
}
2016-02-05 08:17:03 -05:00
$config = [];
foreach ( $configInput as $configOption ) {
2023-06-02 12:24:49 -04:00
if ( ! str_contains ( $configOption , '=' )) {
2016-02-05 08:17:03 -05:00
$output -> writeln ( '<error>Invalid mount configuration option "' . $configOption . '"</error>' );
2023-07-04 05:04:36 -04:00
return self :: FAILURE ;
2016-02-05 08:17:03 -05:00
}
2021-01-12 04:15:48 -05:00
[ $key , $value ] = explode ( '=' , $configOption , 2 );
2016-02-05 08:17:03 -05:00
if ( ! $this -> validateParam ( $key , $value , $storageBackend , $authBackend )) {
$output -> writeln ( '<error>Unknown configuration for backends "' . $key . '"</error>' );
2023-07-04 05:04:36 -04:00
return self :: FAILURE ;
2016-02-05 08:17:03 -05:00
}
$config [ $key ] = $value ;
}
$mount = new StorageConfig ();
$mount -> setMountPoint ( $mountPoint );
$mount -> setBackend ( $storageBackend );
$mount -> setAuthMechanism ( $authBackend );
$mount -> setBackendOptions ( $config );
if ( $user ) {
if ( ! $this -> userManager -> userExists ( $user )) {
$output -> writeln ( '<error>User "' . $user . '" not found</error>' );
2023-07-04 05:04:36 -04:00
return self :: FAILURE ;
2016-02-05 08:17:03 -05:00
}
$mount -> setApplicableUsers ([ $user ]);
}
if ( $input -> getOption ( 'dry' )) {
$this -> showMount ( $user , $mount , $input , $output );
} else {
$this -> getStorageService ( $user ) -> addStorage ( $mount );
2016-02-05 09:54:19 -05:00
if ( $input -> getOption ( 'output' ) === self :: OUTPUT_FORMAT_PLAIN ) {
$output -> writeln ( '<info>Storage created with id ' . $mount -> getId () . '</info>' );
} else {
2017-07-19 14:32:54 -04:00
$output -> writeln (( string ) $mount -> getId ());
2016-02-05 09:54:19 -05:00
}
2016-02-05 08:17:03 -05:00
}
2023-07-04 05:04:36 -04:00
return self :: SUCCESS ;
2016-02-05 08:17:03 -05:00
}
2022-10-18 06:22:40 -04:00
private function validateParam ( string $key , & $value , Backend $storageBackend , AuthMechanism $authBackend ) : bool {
2016-02-05 08:17:03 -05:00
$params = array_merge ( $storageBackend -> getParameters (), $authBackend -> getParameters ());
foreach ( $params as $param ) {
/** @var DefinitionParameter $param */
if ( $param -> getName () === $key ) {
if ( $param -> getType () === DefinitionParameter :: VALUE_BOOLEAN ) {
$value = ( $value === 'true' );
}
return true ;
}
}
return false ;
}
2022-10-18 06:22:40 -04:00
private function showMount ( string $user , StorageConfig $mount , InputInterface $input , OutputInterface $output ) : void {
2016-02-05 08:17:03 -05:00
$listCommand = new ListCommand ( $this -> globalService , $this -> userService , $this -> userSession , $this -> userManager );
$listInput = new ArrayInput ([], $listCommand -> getDefinition ());
$listInput -> setOption ( 'output' , $input -> getOption ( 'output' ));
$listInput -> setOption ( 'show-password' , true );
$listCommand -> listMounts ( $user , [ $mount ], $listInput , $output );
}
2022-10-18 06:22:40 -04:00
protected function getStorageService ( string $userId ) : StoragesService {
2023-07-04 05:04:36 -04:00
if ( empty ( $userId )) {
2016-02-05 08:17:03 -05:00
return $this -> globalService ;
}
2023-07-04 05:04:36 -04:00
$user = $this -> userManager -> get ( $userId );
if ( is_null ( $user )) {
throw new NoUserException ( " user $userId not found " );
}
$this -> userSession -> setUser ( $user );
return $this -> userService ;
2016-02-05 08:17:03 -05:00
}
}