Files
nextcloud-mail/lib/Service/Avatar/GravatarSource.php
Christoph Wurst b8f452bba2 fix(avatar): handle null bodies
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
2025-07-01 13:23:24 +02:00

67 lines
1.5 KiB
PHP

<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Mail\Service\Avatar;
use Exception;
use OCA\Mail\Vendor\Gravatar\Gravatar;
use OCP\Http\Client\IClientService;
use function is_resource;
use function stream_get_contents;
class GravatarSource implements IAvatarSource {
/** @var IClientService */
private $clientService;
public function __construct(IClientService $clientService) {
$this->clientService = $clientService;
}
/**
* Does this source query external services?
*
* @return bool
*/
#[\Override]
public function isExternal(): bool {
return true;
}
/**
* @param string $email sender email address
* @param AvatarFactory $factory
* @return Avatar|null avatar URL if one can be found
*/
#[\Override]
public function fetch(string $email, AvatarFactory $factory) {
$gravatar = new Gravatar(['size' => 128], true);
$avatarUrl = $gravatar->avatar($email, ['d' => 404], true);
$client = $this->clientService->newClient();
try {
$response = $client->get($avatarUrl);
} catch (Exception $exception) {
return null;
}
// Don't save 0 byte images
$body = $response->getBody();
if (is_resource($body)) {
$body = stream_get_contents($body);
}
if ($body === null || strlen($body) === 0) {
return null;
}
// TODO: check whether it's really always a jpeg
return $factory->createExternal($avatarUrl, 'image/jpeg');
}
}