Api: Fix out of memory error when deleting users and filesystem is large

Fixed by not deleting the files, just changing owner
This commit is contained in:
nathangray 2020-04-28 14:16:09 -06:00
parent 5864368386
commit 0fdd8f87cb
2 changed files with 17 additions and 8 deletions

View File

@ -97,8 +97,6 @@ class Hooks
} }
Api\Vfs::rename('/home/'.$data['account_lid'],$new_dir); Api\Vfs::rename('/home/'.$data['account_lid'],$new_dir);
// make the new owner the owner of the dir and it's content
Api\Vfs::find($new_dir, array(), 'EGroupware\Api\Vfs::chown', $data['new_owner']);
} }
elseif(!empty($data['account_lid']) && $data['account_lid'] != '/') elseif(!empty($data['account_lid']) && $data['account_lid'] != '/')
{ {
@ -110,12 +108,8 @@ class Hooks
throw new Api\Exception\AssertionFailed(__METHOD__.'('.array2string($data).') account_lid NOT set!'); throw new Api\Exception\AssertionFailed(__METHOD__.'('.array2string($data).') account_lid NOT set!');
} }
// Other files in home // Change owner of all files
Api\Vfs::find( Api\Vfs\Sqlfs\StreamWrapper::chownAll($data['account_id'], $data['new_owner'] ? $data['new_owner'] : 0);
'/home',
array('user' => $data['account_lid']),
$data['new_owner'] ? 'EGroupware\Api\Vfs::chown' : 'EGroupware\Api\Vfs::remove', $data['new_owner']
);
Api\Vfs::$is_root = false; Api\Vfs::$is_root = false;
} }

View File

@ -961,6 +961,21 @@ class StreamWrapper extends Api\Db\Pdo implements Vfs\StreamWrapperIface
)); ));
} }
/**
* chown but for all files a user owns
*
* @param $old_uid
* @param $new_uid
*/
public static function chownAll($old_uid, $new_uid)
{
$stmt = self::$pdo->prepare('UPDATE '.self::TABLE.' SET fs_uid=:fs_uid WHERE fs_uid=:old_uid');
return $stmt->execute(array(
'fs_uid' => (int) $new_uid,
'old_uid' => $old_uid,
));
}
/** /**
* Chgrp command, not yet a stream-wrapper function, but necessary * Chgrp command, not yet a stream-wrapper function, but necessary
* *