Fallback to default favicon
Signed-off-by: Julius Härtl <jus@bitgrid.net>
This commit is contained in:
parent
443cbdc739
commit
1157f413c9
|
@ -22,6 +22,7 @@
|
||||||
*/
|
*/
|
||||||
namespace OCA\Theming\Controller;
|
namespace OCA\Theming\Controller;
|
||||||
|
|
||||||
|
use OC\IntegrityCheck\Helpers\FileAccessHelper;
|
||||||
use OCA\Theming\IconBuilder;
|
use OCA\Theming\IconBuilder;
|
||||||
use OCA\Theming\ImageManager;
|
use OCA\Theming\ImageManager;
|
||||||
use OCA\Theming\ThemingDefaults;
|
use OCA\Theming\ThemingDefaults;
|
||||||
|
@ -29,6 +30,7 @@ use OCP\AppFramework\Controller;
|
||||||
use OCP\AppFramework\Http;
|
use OCP\AppFramework\Http;
|
||||||
use OCP\AppFramework\Http\NotFoundResponse;
|
use OCP\AppFramework\Http\NotFoundResponse;
|
||||||
use OCP\AppFramework\Http\FileDisplayResponse;
|
use OCP\AppFramework\Http\FileDisplayResponse;
|
||||||
|
use OCP\AppFramework\Http\DataDisplayResponse;
|
||||||
use OCP\AppFramework\Utility\ITimeFactory;
|
use OCP\AppFramework\Utility\ITimeFactory;
|
||||||
use OCP\Files\NotFoundException;
|
use OCP\Files\NotFoundException;
|
||||||
use OCP\IRequest;
|
use OCP\IRequest;
|
||||||
|
@ -120,9 +122,10 @@ class IconController extends Controller {
|
||||||
* @NoCSRFRequired
|
* @NoCSRFRequired
|
||||||
*
|
*
|
||||||
* @param $app string app name
|
* @param $app string app name
|
||||||
* @return FileDisplayResponse|NotFoundResponse
|
* @return FileDisplayResponse|DataDisplayResponse
|
||||||
*/
|
*/
|
||||||
public function getFavicon($app = "core") {
|
public function getFavicon($app = "core") {
|
||||||
|
$response = null;
|
||||||
if ($this->themingDefaults->shouldReplaceIcons()) {
|
if ($this->themingDefaults->shouldReplaceIcons()) {
|
||||||
try {
|
try {
|
||||||
$iconFile = $this->imageManager->getCachedImage('favIcon-' . $app);
|
$iconFile = $this->imageManager->getCachedImage('favIcon-' . $app);
|
||||||
|
@ -132,6 +135,14 @@ class IconController extends Controller {
|
||||||
}
|
}
|
||||||
if ($iconFile !== false) {
|
if ($iconFile !== false) {
|
||||||
$response = new FileDisplayResponse($iconFile, Http::STATUS_OK, ['Content-Type' => 'image/x-icon']);
|
$response = new FileDisplayResponse($iconFile, Http::STATUS_OK, ['Content-Type' => 'image/x-icon']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if($response === null) {
|
||||||
|
$fallbackLogo = \OC::$SERVERROOT . '/core/img/favicon.png';
|
||||||
|
/** @var FileAccessHelper */
|
||||||
|
$fileAccessHelper = \OC::$server->query(FileAccessHelper::class);
|
||||||
|
$response = new DataDisplayResponse($fileAccessHelper->file_get_contents($fallbackLogo));
|
||||||
|
}
|
||||||
$response->cacheFor(86400);
|
$response->cacheFor(86400);
|
||||||
$expires = new \DateTime();
|
$expires = new \DateTime();
|
||||||
$expires->setTimestamp($this->timeFactory->getTime());
|
$expires->setTimestamp($this->timeFactory->getTime());
|
||||||
|
@ -140,9 +151,6 @@ class IconController extends Controller {
|
||||||
$response->addHeader('Pragma', 'cache');
|
$response->addHeader('Pragma', 'cache');
|
||||||
return $response;
|
return $response;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return new NotFoundResponse();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return a 512x512 icon for touch devices
|
* Return a 512x512 icon for touch devices
|
||||||
|
@ -154,6 +162,7 @@ class IconController extends Controller {
|
||||||
* @return FileDisplayResponse|NotFoundResponse
|
* @return FileDisplayResponse|NotFoundResponse
|
||||||
*/
|
*/
|
||||||
public function getTouchIcon($app = "core") {
|
public function getTouchIcon($app = "core") {
|
||||||
|
$response = null;
|
||||||
if ($this->themingDefaults->shouldReplaceIcons()) {
|
if ($this->themingDefaults->shouldReplaceIcons()) {
|
||||||
try {
|
try {
|
||||||
$iconFile = $this->imageManager->getCachedImage('touchIcon-' . $app);
|
$iconFile = $this->imageManager->getCachedImage('touchIcon-' . $app);
|
||||||
|
@ -163,6 +172,14 @@ class IconController extends Controller {
|
||||||
}
|
}
|
||||||
if ($iconFile !== false) {
|
if ($iconFile !== false) {
|
||||||
$response = new FileDisplayResponse($iconFile, Http::STATUS_OK, ['Content-Type' => 'image/png']);
|
$response = new FileDisplayResponse($iconFile, Http::STATUS_OK, ['Content-Type' => 'image/png']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if($response === null) {
|
||||||
|
$fallbackLogo = \OC::$SERVERROOT . '/core/img/favicon-touch.png';
|
||||||
|
/** @var FileAccessHelper */
|
||||||
|
$fileAccessHelper = \OC::$server->query(FileAccessHelper::class);
|
||||||
|
$response = new DataDisplayResponse($fileAccessHelper->file_get_contents($fallbackLogo));
|
||||||
|
}
|
||||||
$response->cacheFor(86400);
|
$response->cacheFor(86400);
|
||||||
$expires = new \DateTime();
|
$expires = new \DateTime();
|
||||||
$expires->setTimestamp($this->timeFactory->getTime());
|
$expires->setTimestamp($this->timeFactory->getTime());
|
||||||
|
@ -171,7 +188,4 @@ class IconController extends Controller {
|
||||||
$response->addHeader('Pragma', 'cache');
|
$response->addHeader('Pragma', 'cache');
|
||||||
return $response;
|
return $response;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return new NotFoundResponse();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,14 +52,18 @@ class IconBuilder {
|
||||||
* @return string|false image blob
|
* @return string|false image blob
|
||||||
*/
|
*/
|
||||||
public function getFavicon($app) {
|
public function getFavicon($app) {
|
||||||
|
try {
|
||||||
$icon = $this->renderAppIcon($app, 32);
|
$icon = $this->renderAppIcon($app, 32);
|
||||||
if($icon === false) {
|
if ($icon === false) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$icon->setImageFormat("png24");
|
$icon->setImageFormat("png24");
|
||||||
$data = $icon->getImageBlob();
|
$data = $icon->getImageBlob();
|
||||||
$icon->destroy();
|
$icon->destroy();
|
||||||
return $data;
|
return $data;
|
||||||
|
} catch (\ImagickException $e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -67,14 +71,18 @@ class IconBuilder {
|
||||||
* @return string|false image blob
|
* @return string|false image blob
|
||||||
*/
|
*/
|
||||||
public function getTouchIcon($app) {
|
public function getTouchIcon($app) {
|
||||||
|
try {
|
||||||
$icon = $this->renderAppIcon($app, 512);
|
$icon = $this->renderAppIcon($app, 512);
|
||||||
if($icon === false) {
|
if ($icon === false) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$icon->setImageFormat("png24");
|
$icon->setImageFormat("png24");
|
||||||
$data = $icon->getImageBlob();
|
$data = $icon->getImageBlob();
|
||||||
$icon->destroy();
|
$icon->destroy();
|
||||||
return $data;
|
return $data;
|
||||||
|
} catch (\ImagickException $e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -28,6 +28,7 @@ use OCA\Theming\IconBuilder;
|
||||||
use OCA\Theming\ImageManager;
|
use OCA\Theming\ImageManager;
|
||||||
use OCA\Theming\ThemingDefaults;
|
use OCA\Theming\ThemingDefaults;
|
||||||
use OCP\AppFramework\Http;
|
use OCP\AppFramework\Http;
|
||||||
|
use OCP\AppFramework\Http\DataDisplayResponse;
|
||||||
use OCP\AppFramework\Http\NotFoundResponse;
|
use OCP\AppFramework\Http\NotFoundResponse;
|
||||||
use OCP\Files\NotFoundException;
|
use OCP\Files\NotFoundException;
|
||||||
use OCP\IConfig;
|
use OCP\IConfig;
|
||||||
|
@ -150,11 +151,15 @@ class IconControllerTest extends TestCase {
|
||||||
$this->themingDefaults->expects($this->any())
|
$this->themingDefaults->expects($this->any())
|
||||||
->method('shouldReplaceIcons')
|
->method('shouldReplaceIcons')
|
||||||
->willReturn(false);
|
->willReturn(false);
|
||||||
$expected = new Http\Response();
|
$fallbackLogo = \OC::$SERVERROOT . '/core/img/favicon.png';
|
||||||
$expected->setStatus(Http::STATUS_NOT_FOUND);
|
$expected = new DataDisplayResponse(file_get_contents($fallbackLogo), Http::STATUS_OK);
|
||||||
$expected->cacheFor(0);
|
$expected->cacheFor(86400);
|
||||||
$expected->setLastModified(new \DateTime('now', new \DateTimeZone('GMT')));
|
$expires = new \DateTime();
|
||||||
$this->assertInstanceOf(NotFoundResponse::class, $this->iconController->getFavicon());
|
$expires->setTimestamp($this->timeFactory->getTime());
|
||||||
|
$expires->add(new \DateInterval('PT24H'));
|
||||||
|
$expected->addHeader('Expires', $expires->format(\DateTime::RFC2822));
|
||||||
|
$expected->addHeader('Pragma', 'cache');
|
||||||
|
$this->assertEquals($expected, $this->iconController->getFavicon());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testGetTouchIconDefault() {
|
public function testGetTouchIconDefault() {
|
||||||
|
@ -195,7 +200,15 @@ class IconControllerTest extends TestCase {
|
||||||
$this->themingDefaults->expects($this->any())
|
$this->themingDefaults->expects($this->any())
|
||||||
->method('shouldReplaceIcons')
|
->method('shouldReplaceIcons')
|
||||||
->willReturn(false);
|
->willReturn(false);
|
||||||
$this->assertInstanceOf(NotFoundResponse::class, $this->iconController->getTouchIcon());
|
$fallbackLogo = \OC::$SERVERROOT . '/core/img/favicon-touch.png';
|
||||||
|
$expected = new DataDisplayResponse(file_get_contents($fallbackLogo), Http::STATUS_OK);
|
||||||
|
$expected->cacheFor(86400);
|
||||||
|
$expires = new \DateTime();
|
||||||
|
$expires->setTimestamp($this->timeFactory->getTime());
|
||||||
|
$expires->add(new \DateInterval('PT24H'));
|
||||||
|
$expected->addHeader('Expires', $expires->format(\DateTime::RFC2822));
|
||||||
|
$expected->addHeader('Pragma', 'cache');
|
||||||
|
$this->assertEquals($expected, $this->iconController->getTouchIcon());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue