diff options
Diffstat (limited to 'lib/Controller/PageController.php')
-rw-r--r-- | lib/Controller/PageController.php | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/lib/Controller/PageController.php b/lib/Controller/PageController.php new file mode 100644 index 000000000..558a85e70 --- /dev/null +++ b/lib/Controller/PageController.php @@ -0,0 +1,224 @@ +<?php +/** + * ownCloud - News + * + * This file is licensed under the Affero General Public License version 3 or + * later. See the COPYING file. + * + * @author Alessandro Cosentino <cosenal@gmail.com> + * @author Bernhard Posselt <dev@bernhard-posselt.com> + * @copyright Alessandro Cosentino 2012 + * @copyright Bernhard Posselt 2012, 2014 + */ + +namespace OCA\News\Controller; + +use OCP\IRequest; +use OCP\IConfig; +use OCP\IL10N; +use OCP\IURLGenerator; +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http\TemplateResponse; +use OCP\AppFramework\Http\JSONResponse; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\ContentSecurityPolicy; + +use OCA\News\Service\StatusService; +use OCA\News\Config\AppConfig; +use OCA\News\Config\Config; +use OCA\News\Explore\RecommendedSites; +use OCA\News\Explore\RecommendedSiteNotFoundException; +use OCA\News\Db\FeedType; + +class PageController extends Controller { + + private $settings; + private $l10n; + private $userId; + private $appConfig; + private $urlGenerator; + private $config; + private $recommendedSites; + private $statusService; + + use JSONHttpError; + + public function __construct($AppName, + IRequest $request, + IConfig $settings, + IURLGenerator $urlGenerator, + AppConfig $appConfig, + Config $config, + IL10N $l10n, + RecommendedSites $recommendedSites, + StatusService $statusService, + $UserId){ + parent::__construct($AppName, $request); + $this->settings = $settings; + $this->urlGenerator = $urlGenerator; + $this->appConfig = $appConfig; + $this->l10n = $l10n; + $this->userId = $UserId; + $this->config = $config; + $this->recommendedSites = $recommendedSites; + $this->statusService = $statusService; + } + + + /** + * @NoAdminRequired + * @NoCSRFRequired + */ + public function index() { + $status = $this->statusService->getStatus(); + $response = new TemplateResponse($this->appName, 'index', [ + 'cronWarning' => $status['warnings']['improperlyConfiguredCron'], + 'url_generator' => $this->urlGenerator + ]); + + $csp = new ContentSecurityPolicy(); + $csp->addAllowedImageDomain('*') + ->addAllowedMediaDomain('*') + ->addAllowedConnectDomain('*') // chrome breaks on audio elements + ->addAllowedFrameDomain('https://youtube.com') + ->addAllowedFrameDomain('https://www.youtube.com') + ->addAllowedFrameDomain('https://player.vimeo.com') + ->addAllowedFrameDomain('https://www.player.vimeo.com') + ->addAllowedFrameDomain('https://vk.com') + ->addAllowedFrameDomain('https://www.vk.com'); + $response->setContentSecurityPolicy($csp); + + return $response; + } + + + /** + * @NoAdminRequired + */ + public function settings() { + $settings = [ + 'showAll', + 'compact', + 'preventReadOnScroll', + 'oldestFirst', + 'compactExpand' + ]; + + $exploreUrl = $this->config->getExploreUrl(); + if (trim($exploreUrl) === '') { + // default url should not feature the sites.en.json + $exploreUrl = $this->urlGenerator->linkToRoute( + 'news.page.explore', ['lang' => 'en'] + ); + $exploreUrl = preg_replace('/feeds\.en\.json$/', '', $exploreUrl); + } + + $result = [ + 'language' => $this->l10n->getLanguageCode(), + 'exploreUrl' => $exploreUrl + ]; + + foreach ($settings as $setting) { + $result[$setting] = $this->settings->getUserValue( + $this->userId, $this->appName, $setting + ) === '1'; + } + return ['settings' => $result]; + } + + + /** + * @NoAdminRequired + * + * @param bool $showAll + * @param bool $compact + * @param bool $preventReadOnScroll + * @param bool $oldestFirst + */ + public function updateSettings($showAll, $compact, $preventReadOnScroll, + $oldestFirst, $compactExpand) { + $settings = ['showAll', + 'compact', + 'preventReadOnScroll', + 'oldestFirst', + 'compactExpand' + ]; + + foreach ($settings as $setting) { + if (${$setting}) { + $value = '1'; + } else { + $value = '0'; + } + $this->settings->setUserValue($this->userId, $this->appName, + $setting, $value); + } + } + + + /** + * @NoCSRFRequired + * @PublicPage + * + * Generates a web app manifest, according to specs in: + * https://developer.mozilla.org/en-US/Apps/Build/Manifest + */ + public function manifest() { + $config = $this->appConfig->getConfig(); + + // size of the icons: 128x128 is required by FxOS for all app manifests + $iconSizes = ['128', '512']; + $icons = []; + + $locale = str_replace('_', '-', $this->l10n->getLanguageCode()); + + foreach ($iconSizes as $size) { + $filename = 'app-' . $size . '.png'; + if (file_exists(__DIR__ . '/../../img/' . $filename)) { + $icons[$size] = $this->urlGenerator->imagePath($config['id'], + $filename); + } + } + + + $data = [ + "name" => $config['name'], + "type" => 'web', + "default_locale" => $locale, + "description" => $config['description'], + "launch_path" => $this->urlGenerator->linkToRoute( + $config['navigation']['route']), + "icons" => $icons, + "developer" => [ + "name" => $config['author'], + "url" => $config['homepage'] + ] + ]; + + $response = new JSONResponse($data); + $response->addHeader('Content-Type', + 'application/x-web-app-manifest+json'); + + return $response; + } + + /** + * @NoAdminRequired + * + * @param string $lang + */ + public function explore($lang) { + $this->settings->setUserValue($this->userId, $this->appName, + 'lastViewedFeedId', 0); + $this->settings->setUserValue($this->userId, $this->appName, + 'lastViewedFeedType', FeedType::EXPLORE); + + try { + return $this->recommendedSites->forLanguage($lang); + } catch (RecommendedSiteNotFoundException $ex) { + return $this->error($ex, Http::STATUS_NOT_FOUND); + } + } + + +} |