public function __construct(array $urlParams = []) { parent::__construct('news', $urlParams); $container = $this->getContainer(); /** * Mappers */ $container->registerService('OCA\\News\\Db\\ItemMapper', function ($c) { return $c->query('OCA\\News\\Db\\MapperFactory')->getItemMapper($c->query('OCP\\IDBConnection')); }); /** * App config parser */ $container->registerService('OCA\\News\\Config\\AppConfig', function ($c) { $config = new AppConfig($c->query('OCP\\INavigationManager'), $c->query('OCP\\IURLGenerator')); $config->loadConfig(__DIR__ . '/info.xml'); return $config; }); /** * Core */ $container->registerService('LoggerParameters', function ($c) { return ['app' => $c->query('AppName')]; }); $container->registerService('DatabaseType', function ($c) { return $c->query('OCP\\IConfig')->getSystemValue('dbtype'); }); /** * Utility */ $container->registerService('ConfigPath', function () { return 'config.ini'; }); $container->registerService('ConfigView', function ($c) { $fs = $c->query('OCP\\Files\\IRootFolder'); $path = 'news/config'; if ($fs->nodeExists($path)) { return $fs->get($path); } else { return $fs->newFolder($path); } }); $container->registerService('OCA\\News\\Config\\Config', function ($c) { $config = new Config($c->query('ConfigView'), $c->query('OCP\\ILogger'), $c->query('LoggerParameters')); $config->read($c->query('ConfigPath'), true); return $config; }); $container->registerService('HTMLPurifier', function ($c) { $directory = $c->query('OCP\\IConfig')->getSystemValue('datadirectory') . '/news/cache/purifier'; if (!is_dir($directory)) { mkdir($directory, 0770, true); } $config = HTMLPurifier_Config::createDefault(); $config->set('HTML.ForbiddenAttributes', 'class'); $config->set('Cache.SerializerPath', $directory); $config->set('HTML.SafeIframe', true); $config->set('URI.SafeIframeRegexp', '%^https://(?:www\\.)?(' . 'youtube(?:-nocookie)?.com/embed/|' . 'player.vimeo.com/video/)%'); //allow YouTube and Vimeo return new HTMLPurifier($config); }); $container->registerService('OCA\\News\\ArticleEnhancer\\Enhancer', function ($c) { $enhancer = new Enhancer(); // register simple enhancers from config json file $xpathEnhancerConfig = file_get_contents(__DIR__ . '/../articleenhancer/xpathenhancers.json'); $xpathEnhancerConfig = json_decode($xpathEnhancerConfig, true); foreach ($xpathEnhancerConfig as $feed => $config) { $articleEnhancer = new XPathArticleEnhancer($c->query('OCA\\News\\Utility\\PicoFeedClientFactory'), $config); $enhancer->registerEnhancer($feed, $articleEnhancer); } $regexEnhancerConfig = file_get_contents(__DIR__ . '/../articleenhancer/regexenhancers.json'); $regexEnhancerConfig = json_decode($regexEnhancerConfig, true); foreach ($regexEnhancerConfig as $feed => $config) { foreach ($config as $matchArticleUrl => $regex) { $articleEnhancer = new RegexArticleEnhancer($matchArticleUrl, $regex); $enhancer->registerEnhancer($feed, $articleEnhancer); } } return $enhancer; }); /** * Fetchers */ $container->registerService('PicoFeed\\Config\\Config', function ($c) { // FIXME: move this into a separate class for testing? $config = $c->query('OCA\\News\\Config\\Config'); $appConfig = $c->query('OCA\\News\\Config\\AppConfig'); $proxy = $c->query('OCA\\News\\Utility\\ProxyConfigParser'); $userAgent = 'ownCloud News/' . $appConfig->getConfig('version') . ' (+https://owncloud.org/; 1 subscriber;)'; $pico = new PicoFeedConfig(); $pico->setClientUserAgent($userAgent)->setClientTimeout($config->getFeedFetcherTimeout())->setMaxRedirections($config->getMaxRedirects())->setMaxBodySize($config->getMaxSize())->setParserHashAlgo('md5'); // proxy settings $proxySettings = $proxy->parse(); $host = $proxySettings['host']; $port = $proxySettings['port']; $user = $proxySettings['user']; $password = $proxySettings['password']; if ($host) { $pico->setProxyHostname($host); if ($port) { $pico->setProxyPort($port); } } if ($user) { $pico->setProxyUsername($user)->setProxyPassword($password); } return $pico; }); $container->registerService('OCA\\News\\Fetcher\\Fetcher', function ($c) { $fetcher = new Fetcher(); // register fetchers in order // the most generic fetcher should be the last one $fetcher->registerFetcher($c->query('OCA\\News\\Fetcher\\YoutubeFetcher')); $fetcher->registerFetcher($c->query('OCA\\News\\Fetcher\\FeedFetcher')); return $fetcher; }); $container->registerService('OCA\\News\\Explore\\RecommendedSites', function () { return new RecommendedSites(__DIR__ . '/../explore'); }); }
public function __construct(array $urlParams = []) { parent::__construct('news', $urlParams); // files $this->registerFileContents('checksums', 'checksum.json'); $this->registerFileContents('info', 'info.xml'); // parameters $this->registerParameter('exploreDir', __DIR__ . '/../explore'); $this->registerParameter('configFile', 'config.ini'); // factories $this->registerFactory(ItemMapper::class, MapperFactory::class); /** * App config parser */ $this->registerService(AppConfig::class, function ($c) { $config = new AppConfig($c->query(INavigationManager::class), $c->query(IURLGenerator::class)); $config->loadConfig($c->query('info')); return $config; }); /** * Core */ $this->registerService('LoggerParameters', function ($c) { return ['app' => $c->query('AppName')]; }); $this->registerService('databaseType', function ($c) { return $c->query(IConfig::class)->getSystemValue('dbtype'); }); $this->registerService('ConfigView', function ($c) { $fs = $c->query(IRootFolder::class); $path = 'news/config'; if ($fs->nodeExists($path)) { return $fs->get($path); } else { return $fs->newFolder($path); } }); $this->registerService(Config::class, function ($c) { $config = new Config($c->query('ConfigView'), $c->query(ILogger::class), $c->query('LoggerParameters')); $config->read($c->query('configFile'), true); return $config; }); $this->registerService(HTMLPurifier::class, function ($c) { $directory = $c->query(IConfig::class)->getSystemValue('datadirectory') . '/news/cache/purifier'; if (!is_dir($directory)) { mkdir($directory, 0770, true); } $config = HTMLPurifier_Config::createDefault(); $config->set('HTML.ForbiddenAttributes', 'class'); $config->set('Cache.SerializerPath', $directory); $config->set('HTML.SafeIframe', true); $config->set('URI.SafeIframeRegexp', '%^https://(?:www\\.)?(' . 'youtube(?:-nocookie)?.com/embed/|' . 'player.vimeo.com/video/)%'); //allow YouTube and Vimeo $def = $config->getHTMLDefinition(true); $def->addAttribute('iframe', 'allowfullscreen', 'Bool'); return new HTMLPurifier($config); }); /** * Fetchers */ $this->registerService(PicoFeedConfig::class, function ($c) { // FIXME: move this into a separate class for testing? $config = $c->query(Config::class); $appConfig = $c->query(AppConfig::class); $proxy = $c->query(ProxyConfigParser::class); $userAgent = 'ownCloud News/' . $appConfig->getConfig('version') . ' (+https://owncloud.org/; 1 subscriber;)'; $pico = new PicoFeedConfig(); $pico->setClientUserAgent($userAgent)->setClientTimeout($config->getFeedFetcherTimeout())->setMaxRedirections($config->getMaxRedirects())->setMaxBodySize($config->getMaxSize())->setParserHashAlgo('md5'); // proxy settings $proxySettings = $proxy->parse(); $host = $proxySettings['host']; $port = $proxySettings['port']; $user = $proxySettings['user']; $password = $proxySettings['password']; if ($host) { $pico->setProxyHostname($host); if ($port) { $pico->setProxyPort($port); } } if ($user) { $pico->setProxyUsername($user)->setProxyPassword($password); } return $pico; }); $this->registerService(Fetcher::class, function ($c) { $fetcher = new Fetcher(); // register fetchers in order, the most generic fetcher should be // the last one $fetcher->registerFetcher($c->query(YoutubeFetcher::class)); $fetcher->registerFetcher($c->query(FeedFetcher::class)); return $fetcher; }); }
public function __construct(array $urlParams = array()) { parent::__construct('news', $urlParams); $container = $this->getContainer(); /** * Controllers */ $container->registerService('PageController', function ($c) { return new PageController($c->query('AppName'), $c->query('Request'), $c->query('CoreConfig'), $c->query('L10N'), $c->query('UserId')); }); $container->registerService('FolderController', function ($c) { return new FolderController($c->query('AppName'), $c->query('Request'), $c->query('FolderBusinessLayer'), $c->query('FeedBusinessLayer'), $c->query('ItemBusinessLayer'), $c->query('UserId')); }); $container->registerService('FeedController', function ($c) { return new FeedController($c->query('AppName'), $c->query('Request'), $c->query('FolderBusinessLayer'), $c->query('FeedBusinessLayer'), $c->query('ItemBusinessLayer'), $c->query('CoreConfig'), $c->query('UserId')); }); $container->registerService('ItemController', function ($c) { return new ItemController($c->query('AppName'), $c->query('Request'), $c->query('FeedBusinessLayer'), $c->query('ItemBusinessLayer'), $c->query('CoreConfig'), $c->query('UserId')); }); $container->registerService('ExportController', function ($c) { return new ExportController($c->query('AppName'), $c->query('Request'), $c->query('FeedBusinessLayer'), $c->query('FolderBusinessLayer'), $c->query('ItemBusinessLayer'), $c->query('OPMLExporter'), $c->query('UserId')); }); $container->registerService('ApiController', function ($c) { return new ApiController($c->query('AppName'), $c->query('Request'), $c->query('Updater'), $c->query('CoreConfig')); }); $container->registerService('FolderApiController', function ($c) { return new FolderApiController($c->query('AppName'), $c->query('Request'), $c->query('FolderBusinessLayer'), $c->query('ItemBusinessLayer'), $c->query('UserId')); }); $container->registerService('FeedApiController', function ($c) { return new FeedApiController($c->query('AppName'), $c->query('Request'), $c->query('FolderBusinessLayer'), $c->query('FeedBusinessLayer'), $c->query('ItemBusinessLayer'), $c->query('Logger'), $c->query('UserId')); }); $container->registerService('ItemApiController', function ($c) { return new ItemApiController($c->query('AppName'), $c->query('Request'), $c->query('ItemBusinessLayer'), $c->query('UserId')); }); /** * Business Layer */ $container->registerService('FolderBusinessLayer', function ($c) { return new FolderBusinessLayer($c->query('FolderMapper'), $c->query('L10N'), $c->query('TimeFactory'), $c->query('Config')); }); $container->registerService('FeedBusinessLayer', function ($c) { return new FeedBusinessLayer($c->query('FeedMapper'), $c->query('Fetcher'), $c->query('ItemMapper'), $c->query('Logger'), $c->query('L10N'), $c->query('TimeFactory'), $c->query('Config'), $c->query('Enhancer'), $c->query('HTMLPurifier')); }); $container->registerService('ItemBusinessLayer', function ($c) { return new ItemBusinessLayer($c->query('ItemMapper'), $c->query('StatusFlag'), $c->query('TimeFactory'), $c->query('Config')); }); /** * Mappers */ $container->registerService('MapperFactory', function ($c) { return new MapperFactory($c->query('DatabaseType'), $c->query('Db')); }); $container->registerService('FolderMapper', function ($c) { return new FolderMapper($c->query('Db')); }); $container->registerService('FeedMapper', function ($c) { return new FeedMapper($c->query('Db')); }); $container->registerService('ItemMapper', function ($c) { return $c->query('MapperFactory')->getItemMapper($c->query('Db')); }); /** * App config parser */ $container->registerService('AppConfig', function ($c) { // not performant but well :/ // $config = $c->query('ServerContainer')->getAppConfig(); oc7 only $installedApps = \OC_Appconfig::getApps(); $apps = array(); foreach ($installedApps as $app) { $apps[] = array($app => \OC_Appconfig::getValue($app, 'installed_version', '0')); } // order extensions in name => version $loadedExtensions = get_loaded_extensions(); $extensions = array(); foreach ($loadedExtensions as $extension) { $extensions[$extension] = phpversion($extension); } return new AppConfig($c->query('ServerContainer')->getNavigationManager(), $c->query('L10N'), $c->query('ServerContainer')->getURLGenerator(), phpversion(), implode('.', \OCP\Util::getVersion()), $apps, $extensions, $c->query('DatabaseType')); }); /** * Core */ $container->registerService('L10N', function ($c) { return $c->query('ServerContainer')->getL10N($c->query('AppName')); }); $container->registerService('UserId', function () { return \OCP\User::getUser(); }); $container->registerService('Logger', function ($c) { return new Logger($c->query('AppName')); }); $container->registerService('Db', function () { return new Db(); }); $container->registerService('CoreConfig', function ($c) { return $c->query('ServerContainer')->getConfig(); }); $container->registerService('DatabaseType', function ($c) { return $c->query('ServerContainer')->getConfig()->getSystemValue('dbtype'); }); /** * Utility */ $container->registerService('ConfigView', function () { $view = new View('/news/config'); if (!$view->file_exists('')) { $view->mkdir(''); } return $view; }); $container->registerService('Config', function ($c) { $config = new Config($c->query('ConfigView'), $c->query('Logger')); $config->read('config.ini', true); return $config; }); $container->registerService('simplePieCacheDirectory', function ($c) { $directory = $c->query('CoreConfig')->getSystemValue('datadirectory') . '/news/cache/simplepie'; if (!is_dir($directory)) { mkdir($directory, 0770, true); } return $directory; }); $container->registerService('HTMLPurifier', function ($c) { $directory = $c->query('CoreConfig')->getSystemValue('datadirectory') . '/news/cache/purifier'; if (!is_dir($directory)) { mkdir($directory, 0770, true); } $config = \HTMLPurifier_Config::createDefault(); $config->set('HTML.ForbiddenAttributes', 'class'); $config->set('Cache.SerializerPath', $directory); $config->set('HTML.SafeIframe', true); $config->set('URI.SafeIframeRegexp', '%^(?:https?:)?//(' . 'www.youtube(?:-nocookie)?.com/embed/|' . 'player.vimeo.com/video/)%'); //allow YouTube and Vimeo return new \HTMLPurifier($config); }); $container->registerService('Enhancer', function ($c) { $enhancer = new Enhancer(); // register simple enhancers from config json file $xpathEnhancerConfig = file_get_contents(__DIR__ . '/../articleenhancer/xpathenhancers.json'); foreach (json_decode($xpathEnhancerConfig, true) as $feed => $config) { $articleEnhancer = new XPathArticleEnhancer($c->query('SimplePieAPIFactory'), $config, $c->query('Config')); $enhancer->registerEnhancer($feed, $articleEnhancer); } $regexEnhancerConfig = file_get_contents(__DIR__ . '/../articleenhancer/regexenhancers.json'); foreach (json_decode($regexEnhancerConfig, true) as $feed => $config) { foreach ($config as $matchArticleUrl => $regex) { $articleEnhancer = new RegexArticleEnhancer($matchArticleUrl, $regex); $enhancer->registerEnhancer($feed, $articleEnhancer); } } return $enhancer; }); /** * Fetchers */ $container->registerService('Fetcher', function ($c) { $fetcher = new Fetcher(); // register fetchers in order // the most generic fetcher should be the last one $fetcher->registerFetcher($c->query('FeedFetcher')); return $fetcher; }); $container->registerService('FeedFetcher', function ($c) { return new FeedFetcher($c->query('SimplePieAPIFactory'), $c->query('FaviconFetcher'), $c->query('TimeFactory'), $c->query('simplePieCacheDirectory'), $c->query('Config')); }); $container->registerService('StatusFlag', function () { return new StatusFlag(); }); $container->registerService('OPMLExporter', function () { return new OPMLExporter(); }); $container->registerService('Updater', function ($c) { return new Updater($c->query('FolderBusinessLayer'), $c->query('FeedBusinessLayer'), $c->query('ItemBusinessLayer')); }); $container->registerService('SimplePieAPIFactory', function () { return new SimplePieAPIFactory(); }); $container->registerService('FaviconFetcher', function ($c) { return new FaviconFetcher($c->query('SimplePieAPIFactory'), $c->query('Config')); }); /** * Middleware */ $container->registerService('CORSMiddleware', function ($c) { return new CORSMiddleware($c->query('Request')); }); $container->registerMiddleWare('CORSMiddleware'); }