forked from GNUsocial/gnu-social
[Avatar] Delete attachment only if safe
This commit is contained in:
parent
21362d1e4d
commit
a77f51dd06
@ -23,7 +23,6 @@ namespace Component\Avatar\Entity;
|
|||||||
|
|
||||||
use App\Core\DB\DB;
|
use App\Core\DB\DB;
|
||||||
use App\Core\Entity;
|
use App\Core\Entity;
|
||||||
use App\Core\Log;
|
|
||||||
use App\Core\Router\Router;
|
use App\Core\Router\Router;
|
||||||
use App\Entity\Attachment;
|
use App\Entity\Attachment;
|
||||||
use App\Util\Common;
|
use App\Util\Common;
|
||||||
@ -123,25 +122,21 @@ class Avatar extends Entity
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete this avatar and the corresponding file and thumbnails, which this owns
|
* Delete this avatar and, if safe, the corresponding file and thumbnails, which this owns
|
||||||
*
|
*
|
||||||
* Inefficient implementation, but there are plenty of edge cases and this is supposed to be a rare operation
|
* @param bool $cascade
|
||||||
|
* @param bool $flush
|
||||||
*/
|
*/
|
||||||
public function delete(bool $cascade = true, bool $flush = true): void
|
public function delete(bool $cascade = true, bool $flush = true): void
|
||||||
{
|
{
|
||||||
if ($cascade) {
|
|
||||||
// Avatar doesn't own the file, but it's stored in a different place than Attachment
|
|
||||||
// would think, so we need to handle it ourselves. Since the attachment could be shared,
|
|
||||||
// can only delete if cascading
|
|
||||||
$filepath = $this->getPath();
|
|
||||||
if (file_exists($filepath)) {
|
|
||||||
if (@unlink($filepath) === false) {
|
|
||||||
Log::warning("Failed deleting attachment for avatar with id={$this->attachment_id} at {$filepath}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$this->attachment->delete(cascade: true, flush: false);
|
|
||||||
}
|
|
||||||
DB::remove($this);
|
DB::remove($this);
|
||||||
|
if ($cascade) {
|
||||||
|
$attachment = $this->getAttachment();
|
||||||
|
// We can't use $attachment->isSafeDelete() because underlying findBy doesn't respect remove persistence
|
||||||
|
if ($attachment->countDependencies() - 1 === 0) {
|
||||||
|
$attachment->delete(cascade: true, flush: false);
|
||||||
|
}
|
||||||
|
}
|
||||||
if ($flush) {
|
if ($flush) {
|
||||||
DB::flush();
|
DB::flush();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user