diff options
author | Côme Chilliet <91878298+come-nc@users.noreply.github.com> | 2023-04-05 17:53:42 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-05 17:53:42 +0200 |
commit | e63a6f5cdbaf3d9034470d4ef096fdb344fddf8f (patch) | |
tree | b7dc408fdd0944f799921abf1e410638c690ce59 /lib/private | |
parent | 2dc96b31489276e1ce1ccc161449fa0d68d89336 (diff) | |
parent | 54f61352f074f9c4698eb2b94e019ab101518b4c (diff) | |
download | nextcloud-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
Diffstat (limited to 'lib/private')
-rw-r--r-- | lib/private/Files/Utils/Scanner.php | 27 |
1 files changed, 20 insertions, 7 deletions
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; + } + } } } |