setDescription('List, Create, Edit, Delete application in Phraseanet (experimental)') ->addOption('list', null, InputOption::VALUE_NONE, 'List all applications or user applications if --user_id is set') ->addOption('create', null, InputOption::VALUE_NONE, 'Create application for user in Phraseanet') ->addOption('edit', null, InputOption::VALUE_NONE, 'Edit application in Phraseanet work only if app_id is set') ->addOption('delete', null, InputOption::VALUE_NONE, 'Delete application in Phraseanet, require an app_id') ->addOption('user_id', 'u', InputOption::VALUE_REQUIRED, 'The Id of user owner of application (user_id), required to Create, Edit and Delete.') ->addOption('app_id', 'a', InputOption::VALUE_REQUIRED, 'The application ID, required for Edit and Delete') ->addOption('name', null, InputOption::VALUE_REQUIRED, 'The desired name for application, required for Create and Edit.') ->addOption('type', 't', InputOption::VALUE_OPTIONAL, 'The kind of application, Desktop or Web.',ApiApplication::WEB_TYPE) ->addOption('description', 'd', InputOption::VALUE_REQUIRED, 'The desired description for application.') ->addOption('website', 'w', InputOption::VALUE_OPTIONAL, 'The desired url, eg: -w "https://www.alchemy.fr".') ->addOption('callback', 'c', InputOption::VALUE_OPTIONAL, 'The desired endpoint for callback, required for web kind eg: -c "https://www.alchemy.fr/callback"') ->addOption('webhook_url', null, InputOption::VALUE_REQUIRED, 'The webhook url') ->addOption('active', null, InputOption::VALUE_OPTIONAL, 'Activate or deactivate the app, values true or false', 'true') ->addOption('webhook_active', null, InputOption::VALUE_OPTIONAL, 'Activate or deactivate webhook, values true or false', 'false') ->addOption('generate_token', null, InputOption::VALUE_NONE, 'Generate or regenerate the access token') ->addOption('password_oauth2_gt', null, InputOption::VALUE_OPTIONAL, 'Activate or deactivate password OAuth2 grant type , values true or false', 'false') ->addOption('jsonformat', null, InputOption::VALUE_NONE, 'Output in json format') ->setHelp(''); return $this; } protected function doExecute(InputInterface $input, OutputInterface $output) { $userId = $input->getOption('user_id'); $appId = $input->getOption('app_id'); $name = $input->getOption('name'); $type = $input->getOption('type'); $description = $input->getOption('description'); $website = $input->getOption('website'); $urlCallback = $input->getOption('callback'); $webhookUrl = $input->getOption('webhook_url'); $active = $input->getOption('active'); $webhookActive = $input->getOption('webhook_active'); $generateToken = $input->getOption('generate_token'); $passwordOauth2Gt = $input->getOption('password_oauth2_gt'); $create = $input->getOption('create'); $edit = $input->getOption('edit'); $delete = $input->getOption('delete'); $list = $input->getOption('list'); $jsonformat = $input->getOption('jsonformat'); /** @var ApiApplicationManipulator $applicationManipulator */ $applicationManipulator = $this->container['manipulator.api-application']; $apiOauthTokenManipulator = $this->container['manipulator.api-oauth-token']; $accountRepository = $this->container['repo.api-accounts']; $apiApllicationConverter = $this->container['converter.api-application']; $userRepository = $this->container['repo.users']; $apiOauthRepository = $this->container['repo.api-oauth-tokens']; if ($create) { if (null === $user = $userRepository->find($userId)) { $output->writeln('User not found'); return 0; } if (!$name) { $output->writeln('Name of application must be provide with option --name.'); return 0; } if (!$description) { $output->writeln('Desciption of application must be provide.'); return 0; } try { $application = $applicationManipulator ->create( $name, $type, $description, $website, $user, $urlCallback ); $apiAccountManipulator = $this->container['manipulator.api-account']; $apiAccountManipulator->create($application, $user, V2::VERSION); $account = $accountRepository->findByUserAndApplication($user, $application); if ($generateToken) { $apiOauthTokenManipulator->create($account); } if ($passwordOauth2Gt) { if (in_array($passwordOauth2Gt, ['true', 'false'])) { $application->setGrantPassword(($passwordOauth2Gt == 'true') ? true : false); $applicationManipulator->update($application); } else { $output->writeln(' Value of option --password_oauth2_gt should be "true" or "false"'); return 0; } } if ($webhookUrl) { $applicationManipulator->setWebhookUrl($application, $webhookUrl); $applicationManipulator->update($application); } if ($webhookActive !== null) { if (in_array($webhookActive, ['true', 'false'])) { if ($webhookActive == 'true' && !empty($application->getWebhookUrl())) { $application->setWebhookActive(true); } else { $application->setWebhookActive(false); } $applicationManipulator->update($application); } else { $output->writeln('Value of option --webhook_active should be "true" or "false"'); return 0; } } if ($active) { if (in_array($active, ['true', 'false'])) { $application->setActivated(($active == 'true') ? true : false); $applicationManipulator->update($application); } else { $output->writeln('Value of option --active should be "true" or "false"'); return 0; } } else { $application->setActivated(true); $applicationManipulator->update($application); } $this->showApllicationInformation($apiOauthRepository, $account, $application, $jsonformat, $output); } catch (\Exception $e) { $output->writeln('Create an application for user failed : '.$e->getMessage().''); } } elseif ($edit) { if (!$appId) { $output->writeln('ID of the application must be provided with option --app_id to edit the application.'); return 0; } $application = $apiApllicationConverter->convert($appId); $account = $accountRepository->findByUserAndApplication($application->getCreator(), $application); if (!$account) { $output->writeln('ApiAccount not found!'); return 0; } if ($name) { $application->setName($name); } if ($type) { $applicationManipulator->setType($application, $type); if ($type == ApiApplication::DESKTOP_TYPE) { $applicationManipulator->setRedirectUri($application, ApiApplication::NATIVE_APP_REDIRECT_URI); } } if ($description) { $application->setDescription($description); } if ($website) { $applicationManipulator->setWebsiteUrl($application, $website); } if ($urlCallback) { $applicationManipulator->setRedirectUri($application, $urlCallback); } if ($generateToken) { if (null !== $devToken = $apiOauthRepository->findDeveloperToken($account)) { $apiOauthTokenManipulator->renew($devToken); } else { $apiOauthTokenManipulator->create($account); } } if ($passwordOauth2Gt) { if (in_array($passwordOauth2Gt, ['true', 'false'])) { $application->setGrantPassword(($passwordOauth2Gt == 'true') ? true : false); } else { $output->writeln(' Value of option --password_oauth2_gt should be "true" or "false"'); return 0; } } if ($webhookUrl) { $applicationManipulator->setWebhookUrl($application, $webhookUrl); } if ($webhookActive !== null) { if (in_array($webhookActive, ['true', 'false'])) { if ($webhookActive == 'true' && !empty($application->getWebhookUrl())) { $application->setWebhookActive(true); } else { $application->setWebhookActive(false); } $applicationManipulator->update($application); } else { $output->writeln('Value of option --webhook_active should be "true" or "false"'); return 0; } } if ($active) { if (in_array($active, ['true', 'false'])) { $application->setActivated(($active == 'true') ? true : false); } else { $output->writeln('Value of option --active should be "true" or "false"'); return 0; } } $applicationManipulator->update($application); $this->showApllicationInformation($apiOauthRepository, $account, $application, $jsonformat, $output); } elseif ($list) { if ($userId) { if (null === $user = $userRepository->find($userId)) { $output->writeln('User not found'); return 0; } $accounts = $accountRepository->findByUser($user); } else { $accounts = $accountRepository->findAll(); } $applicationList = []; foreach ($accounts as $account) { $application = $account->getApplication(); $token = $apiOauthRepository->findDeveloperToken($account); $applicationList[] = [ $application->getId(), $account->getUser()->getId(), $application->getName(), $application->getClientId(), $application->getClientSecret(), $application->getRedirectUri(), ($token) ? $token->getOauthToken() : '-', $application->isPasswordGranted() ? "true": "false" ]; } $applicationTable = $this->getHelperSet()->get('table'); $headers = ['app_id', 'user_id', 'name', 'client_id', 'client_secret', 'callback_url', 'generated token', 'grant_password status']; if ($jsonformat ) { foreach ($applicationList as $appList) { $appInfo[] = array_combine($headers, $appList); } echo json_encode($appInfo); } else { $applicationTable = $this->getHelperSet()->get('table'); $applicationTable ->setHeaders($headers) ->setRows($applicationList) ->render($output) ; } } elseif ($delete) { if (!$appId) { $output->writeln('ID of the application must be provided with option --app_id to delete the app.'); return 0; } $application = $apiApllicationConverter->convert($appId); if (is_null($application->getCreator())) { /** @var DialogHelper $dialog */ $dialog = $this->getHelperSet()->get('dialog'); $continue = $dialog->askConfirmation($output, "It's a special phraseanet application, do you want really to delete it? (N/y)", false); if (!$continue) { $output->writeln("See you later !"); return 0; } } $applicationManipulator->delete($application); $output->writeln("Application ID $appId deleted successfully !"); } return 0; } private function showApllicationInformation($apiOauthRepository, ApiAccount $account, ApiApplication $application, $jsonformat, $output) { $token = $account ? $apiOauthRepository->findDeveloperToken($account) : null; $applicationCreated = [ $application->getClientSecret(), $application->getClientId(), $this->container["conf"]->get("servername") . "api/oauthv2/authorize", $this->container["conf"]->get("servername") . "api/oauthv2/token", ($token) ? $token->getOauthToken() : '-', $application->isPasswordGranted() ? "true": "false" ]; $headers = ['client_secret', 'client_id', 'Authorize endpoint url', 'Access endpoint', 'generated token', 'grant_password status']; if ($jsonformat ) { $createdAppInfo = array_combine($headers, $applicationCreated); echo json_encode($createdAppInfo); } else { $table = $this->getHelperSet()->get('table'); $table ->setHeaders($headers) ->setRows([$applicationCreated]) ->render($output) ; } } }