aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcel Müller <marcel-mueller@gmx.de>2025-05-16 13:40:06 +0200
committerMarcel Müller <marcel-mueller@gmx.de>2025-05-16 18:21:37 +0200
commitf9aa4e2e049a4ba1b520db7e30ebe6c31608b1f5 (patch)
treedcef605521ea14be7dc14805bdccdd46ea39dc6f
parentfc9310feef28615775eb951b61c04543ebe00603 (diff)
downloadnextcloud-server-feat/noid/check-integrity-all-apps.tar.gz
nextcloud-server-feat/noid/check-integrity-all-apps.zip
feat(integrity): Allow to run check for all appsfeat/noid/check-integrity-all-apps
Signed-off-by: Marcel Müller <marcel-mueller@gmx.de>
-rw-r--r--core/Command/Integrity/CheckApp.php59
1 files changed, 43 insertions, 16 deletions
diff --git a/core/Command/Integrity/CheckApp.php b/core/Command/Integrity/CheckApp.php
index e1889a35cfe..0145a3f8070 100644
--- a/core/Command/Integrity/CheckApp.php
+++ b/core/Command/Integrity/CheckApp.php
@@ -40,31 +40,58 @@ class CheckApp extends Base {
$this
->setName('integrity:check-app')
->setDescription('Check integrity of an app using a signature.')
- ->addArgument('appid', InputArgument::REQUIRED, 'Application to check')
- ->addOption('path', null, InputOption::VALUE_OPTIONAL, 'Path to application. If none is given it will be guessed.');
+ ->addArgument('appid', InputArgument::OPTIONAL, 'Application to check')
+ ->addOption('path', null, InputOption::VALUE_OPTIONAL, 'Path to application. If none is given it will be guessed.')
+ ->addOption('all', null, InputOption::VALUE_NONE, 'Check integrity of all apps.');
}
/**
* {@inheritdoc }
*/
protected function execute(InputInterface $input, OutputInterface $output): int {
- $appid = $input->getArgument('appid');
- $path = (string)$input->getOption('path');
- if ($path === '') {
- $path = $this->appLocator->getAppPath($appid);
+ if ($input->getOption('all') && $input->getArgument('appid')) {
+ $output->writeln('<error>Option "--all" cannot be combined with an appid</error>');
+ return 1;
}
- if ($this->appManager->isShipped($appid) || $this->fileAccessHelper->file_exists($path . '/appinfo/signature.json')) {
- // Only verify if the application explicitly ships a signature.json file
- $result = $this->checker->verifyAppSignature($appid, $path, true);
- $this->writeArrayInOutputFormat($input, $output, $result);
- if (count($result) > 0) {
- $output->writeln('<error>' . count($result) . ' errors found</error>', OutputInterface::VERBOSITY_VERBOSE);
- return 1;
+
+ if (!$input->getArgument('appid') && !$input->getOption('all')) {
+ $output->writeln('<error>Please specify an appid, or "--all" to verify all apps</error>');
+ return 1;
+ }
+
+ if ($input->getArgument('appid')) {
+ $appIds = [$input->getArgument('appid')];
+ } else {
+ $appIds = $this->appManager->getAllAppsInAppsFolders();
+ }
+
+ $errorsFound = false;
+
+ foreach ($appIds as $appId) {
+ $path = (string)$input->getOption('path');
+ if ($path === '') {
+ $path = $this->appLocator->getAppPath($appId);
}
+
+ if ($this->appManager->isShipped($appId) || $this->fileAccessHelper->file_exists($path . '/appinfo/signature.json')) {
+ // Only verify if the application explicitly ships a signature.json file
+ $result = $this->checker->verifyAppSignature($appId, $path, true);
+
+ if (count($result) > 0) {
+ $output->writeln('<error>' . $appId . ': ' . count($result) . ' errors found:</error>');
+ $this->writeArrayInOutputFormat($input, $output, $result);
+ $errorsFound = true;
+ }
+ } else {
+ $output->writeln('<comment>' . $appId . ': ' . 'App signature not found, skipping app integrity check</comment>');
+ }
+ }
+
+ if (!$errorsFound) {
$output->writeln('<info>No errors found</info>', OutputInterface::VERBOSITY_VERBOSE);
- } else {
- $output->writeln('<comment>App signature not found, skipping app integrity check</comment>');
+ return 0;
}
- return 0;
+
+ return 1;
}
}