aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCôme Chilliet <91878298+come-nc@users.noreply.github.com>2023-04-05 17:53:42 +0200
committerGitHub <noreply@github.com>2023-04-05 17:53:42 +0200
commite63a6f5cdbaf3d9034470d4ef096fdb344fddf8f (patch)
treeb7dc408fdd0944f799921abf1e410638c690ce59
parent2dc96b31489276e1ce1ccc161449fa0d68d89336 (diff)
parent54f61352f074f9c4698eb2b94e019ab101518b4c (diff)
downloadnextcloud-server-e63a6f5cdbaf3d9034470d4ef096fdb344fddf8f.tar.gz
nextcloud-server-e63a6f5cdbaf3d9034470d4ef096fdb344fddf8f.zip
Merge pull request #27538 from nextcloud/scanner-home-not-writable-better-errors
better error messages if the users home is not writable during scanning
-rw-r--r--apps/files/lib/Command/Scan.php1
-rw-r--r--lib/private/Files/Utils/Scanner.php27
2 files changed, 21 insertions, 7 deletions
diff --git a/apps/files/lib/Command/Scan.php b/apps/files/lib/Command/Scan.php
index 710c76de493..a59665c56e9 100644
--- a/apps/files/lib/Command/Scan.php
+++ b/apps/files/lib/Command/Scan.php
@@ -162,6 +162,7 @@ class Scan extends Base {
}
} catch (ForbiddenException $e) {
$output->writeln("<error>Home storage for user $user not writable or 'files' subdirectory missing</error>");
+ $output->writeln(' ' . $e->getMessage());
$output->writeln('Make sure you\'re running the scan command only as the user the web server runs as');
} catch (InterruptedException $e) {
# exit the function if ctrl-c has been pressed
diff --git a/lib/private/Files/Utils/Scanner.php b/lib/private/Files/Utils/Scanner.php
index dc220bc710d..277ce38175f 100644
--- a/lib/private/Files/Utils/Scanner.php
+++ b/lib/private/Files/Utils/Scanner.php
@@ -27,11 +27,13 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
+
namespace OC\Files\Utils;
use OC\Files\Cache\Cache;
use OC\Files\Filesystem;
use OC\Files\Storage\FailedStorage;
+use OC\Files\Storage\Home;
use OC\ForbiddenException;
use OC\Hooks\PublicEmitter;
use OC\Lock\DBLockingProvider;
@@ -211,13 +213,24 @@ class Scanner extends PublicEmitter {
}
// if the home storage isn't writable then the scanner is run as the wrong user
- if ($storage->instanceOfStorage('\OC\Files\Storage\Home') and
- (!$storage->isCreatable('') or !$storage->isCreatable('files'))
- ) {
- if ($storage->is_dir('files')) {
- throw new ForbiddenException();
- } else {// if the root exists in neither the cache nor the storage the user isn't setup yet
- break;
+ if ($storage->instanceOfStorage(Home::class)) {
+ /** @var Home $storage */
+ foreach (['', 'files'] as $path) {
+ if (!$storage->isCreatable($path)) {
+ $fullPath = $storage->getSourcePath($path);
+ if (!$storage->is_dir($path) && $storage->getCache()->inCache($path)) {
+ throw new NotFoundException("User folder $fullPath exists in cache but not on disk");
+ } elseif ($storage->is_dir($path)) {
+ $ownerUid = fileowner($fullPath);
+ $owner = posix_getpwuid($ownerUid);
+ $owner = $owner['name'] ?? $ownerUid;
+ $permissions = decoct(fileperms($fullPath));
+ throw new ForbiddenException("User folder $fullPath is not writable, folders is owned by $owner and has mode $permissions");
+ } else {
+ // if the root exists in neither the cache nor the storage the user isn't setup yet
+ break 2;
+ }
+ }
}
}