Commit 492320fe authored by Vincent Petry's avatar Vincent Petry Committed by Thomas Müller
Browse files

Get user home folder before deletion (#26848)

After the deletion getHome() will fail because the user doesn't exist
any more, so we need to fetch that value earlier.
parent 7542bdd9
...@@ -197,6 +197,8 @@ class User implements IUser { ...@@ -197,6 +197,8 @@ class User implements IUser {
if ($this->emitter) { if ($this->emitter) {
$this->emitter->emit('\OC\User', 'preDelete', [$this]); $this->emitter->emit('\OC\User', 'preDelete', [$this]);
} }
// get the home now because it won't return it after user deletion
$homePath = $this->getHome();
$result = $this->backend->deleteUser($this->uid); $result = $this->backend->deleteUser($this->uid);
if ($result) { if ($result) {
...@@ -210,7 +212,11 @@ class User implements IUser { ...@@ -210,7 +212,11 @@ class User implements IUser {
\OC::$server->getConfig()->deleteAllUserValues($this->uid); \OC::$server->getConfig()->deleteAllUserValues($this->uid);
// Delete user files in /data/ // Delete user files in /data/
\OC_Helper::rmdirr($this->getHome()); if ($homePath !== false) {
// FIXME: this operates directly on FS, should use View instead...
// also this is not testable/mockable...
\OC_Helper::rmdirr($homePath);
}
// Delete the users entry in the storage table // Delete the users entry in the storage table
Storage::remove('home::' . $this->uid); Storage::remove('home::' . $this->uid);
......
...@@ -204,6 +204,38 @@ class UserTest extends TestCase { ...@@ -204,6 +204,38 @@ class UserTest extends TestCase {
$this->assertTrue($user->delete()); $this->assertTrue($user->delete());
} }
public function testDeleteWithDifferentHome() {
/**
* @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend
*/
$backend = $this->createMock(Dummy::class);
$backend->expects($this->at(0))
->method('implementsActions')
->will($this->returnCallback(function ($actions) {
if ($actions === Backend::GET_HOME) {
return true;
} else {
return false;
}
}));
// important: getHome MUST be called before deleteUser because
// once the user is deleted, getHome implementations might not
// return anything
$backend->expects($this->at(1))
->method('getHome')
->with($this->equalTo('foo'))
->will($this->returnValue('/home/foo'));
$backend->expects($this->at(2))
->method('deleteUser')
->with($this->equalTo('foo'));
$user = new User('foo', $backend);
$this->assertTrue($user->delete());
}
public function testGetHome() { public function testGetHome() {
/** /**
* @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend * @var Backend | \PHPUnit_Framework_MockObject_MockObject $backend
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment