|
@@ -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;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|