Example #1
0
 /**
  * News. Film at 11.
  *
  * @param \Silex\Application $app
  * @param Request            $request
  *
  * @return \Symfony\Component\HttpFoundation\Response
  */
 public function dashboardnews(Silex\Application $app, Request $request)
 {
     $source = 'http://news.bolt.cm/';
     $news = $app['cache']->fetch('dashboardnews');
     // Two hours.
     $hostname = $request->getHost();
     $body = '';
     // If not cached, get fresh news.
     if ($news === false) {
         $app['logger.system']->info('Fetching from remote server: ' . $source, array('event' => 'news'));
         $driver = $app['db']->getDatabasePlatform()->getName();
         $url = sprintf('%s?v=%s&p=%s&db=%s&name=%s', $source, rawurlencode($app->getVersion()), phpversion(), $driver, base64_encode($hostname));
         // Options valid if using a proxy
         if ($app['config']->get('general/httpProxy')) {
             $curlOptions = array('CURLOPT_PROXY' => $app['config']->get('general/httpProxy/host'), 'CURLOPT_PROXYTYPE' => 'CURLPROXY_HTTP', 'CURLOPT_PROXYUSERPWD' => $app['config']->get('general/httpProxy/user') . ':' . $app['config']->get('general/httpProxy/password'));
         }
         // Standard option(s)
         $curlOptions['CURLOPT_CONNECTTIMEOUT'] = 5;
         try {
             if ($app['deprecated.php']) {
                 $fetchedNewsData = $app['guzzle.client']->get($url, null, $curlOptions)->send()->getBody(true);
             } else {
                 $fetchedNewsData = $app['guzzle.client']->get($url, array(), $curlOptions)->getBody(true);
             }
             $fetchedNewsItems = json_decode($fetchedNewsData);
             if ($fetchedNewsItems) {
                 $news = array();
                 // Iterate over the items, pick the first news-item that applies and the first alert we need to show
                 $version = $app->getVersion();
                 foreach ($fetchedNewsItems as $item) {
                     $type = $item->type === 'alert' ? 'alert' : 'information';
                     if (!isset($news[$type]) && (empty($item->target_version) || version_compare($item->target_version, $version, '>'))) {
                         $news[$type] = $item;
                     }
                 }
                 $app['cache']->save('dashboardnews', $news, 7200);
             } else {
                 $app['logger.system']->error('Invalid JSON feed returned', array('event' => 'news'));
             }
         } catch (RequestException $e) {
             $app['logger.system']->critical('Error occurred during newsfeed fetch', array('event' => 'exception', 'exception' => $e));
             $body .= "<p>Unable to connect to {$source}</p>";
         } catch (V3RequestException $e) {
             /** @deprecated remove with the end of PHP 5.3 support */
             $app['logger.system']->critical('Error occurred during newsfeed fetch', array('event' => 'exception', 'exception' => $e));
             $body .= "<p>Unable to connect to {$source}</p>";
         }
     } else {
         $app['logger.system']->info('Using cached data', array('event' => 'news'));
     }
     // Combine the body. One 'alert' and one 'info' max. Regular info-items can be disabled, but Alerts can't.
     if (!empty($news['alert'])) {
         $body .= $app['render']->render('components/panel-news.twig', array('news' => $news['alert']))->getContent();
     }
     if (!empty($news['information']) && !$app['config']->get('general/backend/news/disable')) {
         $body .= $app['render']->render('components/panel-news.twig', array('news' => $news['information']))->getContent();
     }
     return new Response($body, Response::HTTP_OK, array('Cache-Control' => 's-maxage=3600, public'));
 }
 public function register(Application $app)
 {
     $app['nut'] = $app->share(function ($app) {
         $console = new NutApplication();
         $console->setName('Bolt console tool - Nut');
         if ($app instanceof \Bolt\Application) {
             $console->setVersion($app->getVersion());
         }
         $console->addCommands($app['nut.commands']);
         return $console;
     });
     $app['nut.commands'] = $app->share(function ($app) {
         return [new Nut\CronRunner($app), new Nut\CacheClear($app), new Nut\Info($app), new Nut\LogTrim($app), new Nut\LogClear($app), new Nut\DatabaseCheck($app), new Nut\DatabaseExport($app), new Nut\DatabaseImport($app), new Nut\DatabasePrefill($app), new Nut\DatabaseRepair($app), new Nut\TestRunner($app), new Nut\ConfigGet($app), new Nut\ConfigSet($app), new Nut\Extensions($app), new Nut\ExtensionsEnable($app), new Nut\ExtensionsDisable($app), new Nut\UserAdd($app), new Nut\UserResetPassword($app), new Nut\UserRoleAdd($app), new Nut\UserRoleRemove($app)];
     });
     $app['nut.commands.add'] = $app->protect(function (Command $command) use($app) {
         $app['nut.commands'] = $app->share($app->extend('nut.commands', function ($commands) use($command) {
             $commands[] = $command;
             return $commands;
         }));
     });
     // Maintain backwards compatibility
     $app['console'] = $app->share(function ($app) {
         return $app['nut'];
     });
 }
Example #3
0
 /**
  * Middleware function to check whether a user is logged on.
  *
  * @param Request     $request   The Symfony Request
  * @param Application $app       The application/container
  * @param string      $roleRoute An overriding value for the route name in permission checks
  *
  * @return null|\Symfony\Component\HttpFoundation\RedirectResponse
  */
 public function before(Request $request, Application $app, $roleRoute = null)
 {
     // Start the 'stopwatch' for the profiler.
     $app['stopwatch']->start('bolt.backend.before');
     $route = $request->get('_route');
     // Handle the case where the route doesn't equal the role.
     if ($roleRoute === null) {
         $roleRoute = $route;
     }
     // Sanity checks for doubles in in contenttypes. This has to be done
     // here, because the 'translator' classes need to be initialised.
     $app['config']->checkConfig();
     // If we had to reload the config earlier on because we detected a
     // version change, display a notice.
     if ($app['config']->notify_update) {
         $notice = Trans::__("Detected Bolt version change to <b>%VERSION%</b>, and the cache has been cleared. Please <a href=\"%URI%\">check the database</a>, if you haven't done so already.", ['%VERSION%' => $app->getVersion(), '%URI%' => $app['resources']->getUrl('bolt') . 'dbcheck']);
         $app['logger.system']->notice(strip_tags($notice), ['event' => 'config']);
         $app['logger.flash']->warning($notice);
     }
     // Check for first user set up
     $response = $this->checkFirstUser($app, $route);
     if ($response !== true) {
         return $response;
     }
     // If we're resetting passwords, we have nothing more to check
     if ($route === 'resetpassword' || $route === 'login' || $route === 'postLogin' || $route === 'logout') {
         return null;
     }
     // Confirm the user is enabled or bounce them
     if (($sessionUser = $this->getUser()) && !$sessionUser->getEnabled()) {
         $app['logger.flash']->error(Trans::__('Your account is disabled. Sorry about that.'));
         return $this->redirectToRoute('logout');
     }
     // Check if there's at least one 'root' user, and otherwise promote the current user.
     $this->users()->checkForRoot();
     // Most of the 'check if user is allowed' happens here: match the current route to the 'allowed' settings.
     $authCookie = $request->cookies->get($this->app['token.authentication.name']);
     if ($authCookie === null || !$this->accessControl()->isValidSession($authCookie)) {
         $app['logger.flash']->info(Trans::__('Please log on.'));
         return $this->redirectToRoute('login');
     }
     if (!$this->isAllowed($roleRoute)) {
         $app['logger.flash']->error(Trans::__('You do not have the right privileges to view that page.'));
         return $this->redirectToRoute('dashboard');
     }
     // Stop the 'stopwatch' for the profiler.
     $app['stopwatch']->stop('bolt.backend.before');
     return null;
 }
Example #4
0
 /**
  * News.
  */
 public function dashboardnews(Silex\Application $app)
 {
     $news = $app['cache']->fetch('dashboardnews');
     // Two hours.
     $name = !empty($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : $_SERVER['HTTP_HOST'];
     // If not cached, get fresh news..
     if ($news == false) {
         $app['log']->add("News: fetch from remote server..", 1);
         $driver = $app['config']->get('general/database/driver', 'sqlite');
         $url = sprintf('http://news.bolt.cm/?v=%s&p=%s&db=%s&name=%s', rawurlencode($app->getVersion()), phpversion(), $driver, base64_encode($name));
         $curlOptions = array('CURLOPT_CONNECTTIMEOUT' => 5);
         // If there's a proxy ...
         if ($app['config']->get('general/httpProxy')) {
             $curlOptions['CURLOPT_PROXY'] = $app['config']->get('general/httpProxy/host');
             $curlOptions['CURLOPT_PROXYTYPE'] = 'CURLPROXY_HTTP';
             $curlOptions['CURLOPT_PROXYUSERPWD'] = $app['config']->get('general/httpProxy/user') . ':' . $app['config']->get('general/httpProxy/password');
         }
         $guzzleclient = new \Guzzle\Http\Client($url, array('curl.options' => $curlOptions));
         try {
             $newsData = $guzzleclient->get("/")->send()->getBody(true);
             $news = json_decode($newsData);
             if ($news) {
                 // For now, just use the most current item.
                 $news = current($news);
                 $app['cache']->save('dashboardnews', $news, 7200);
             } else {
                 $app['log']->add("News: got invalid JSON feed", 1);
             }
         } catch (RequestException $re) {
             $app['log']->add("News: got exception: " . $re->getMessage(), 1);
         }
     } else {
         $app['log']->add("News: get from cache..", 1);
     }
     $body = $app['render']->render('dashboard-news.twig', array('news' => $news));
     return new Response($body, 200, array('Cache-Control' => 's-maxage=3600, public'));
 }
Example #5
0
 /**
  * Middleware function to check whether a user is logged on.
  *
  * @param Request     $request The Symfony Request
  * @param Application $app     The application/container
  *
  * @return null|\Symfony\Component\HttpFoundation\RedirectResponse
  */
 public static function before(Request $request, Application $app)
 {
     // Start the 'stopwatch' for the profiler.
     $app['stopwatch']->start('bolt.backend.before');
     $route = $request->get('_route');
     $app['debugbar'] = true;
     // Sanity checks for doubles in in contenttypes.
     // unfortunately this has to be done here, because the 'translator' classes need to be initialised.
     $app['config']->checkConfig();
     // If we had to reload the config earlier on because we detected a version change, display a notice.
     if ($app['config']->notify_update) {
         $notice = Trans::__("Detected Bolt version change to <b>%VERSION%</b>, and the cache has been cleared. Please <a href=\"%URI%\">check the database</a>, if you haven't done so already.", array('%VERSION%' => $app->getVersion(), '%URI%' => $app['resources']->getUrl('bolt') . 'dbcheck'));
         $app['logger.system']->notice(strip_tags($notice), array('event' => 'config'));
         $app['session']->getFlashBag()->add('info', $notice);
     }
     // Check the database users table exists
     $tableExists = $app['integritychecker']->checkUserTableIntegrity();
     // Test if we have a valid users in our table
     $hasUsers = false;
     if ($tableExists) {
         $hasUsers = $app['users']->hasUsers();
     }
     // If the users table is present, but there are no users, and we're on /bolt/userfirst,
     // we let the user stay, because they need to set up the first user.
     if ($tableExists && !$hasUsers && $route == 'userfirst') {
         return null;
     }
     // If there are no users in the users table, or the table doesn't exist. Repair
     // the DB, and let's add a new user.
     if (!$tableExists || !$hasUsers) {
         $app['integritychecker']->repairTables();
         $app['session']->getFlashBag()->add('info', Trans::__('There are no users in the database. Please create the first user.'));
         return Lib::redirect('userfirst');
     }
     // Confirm the user is enabled or bounce them
     if ($app['users']->getCurrentUser() && !$app['users']->isEnabled() && $route !== 'userfirst' && $route !== 'login' && $route !== 'postLogin' && $route !== 'logout') {
         $app['session']->getFlashBag()->add('error', Trans::__('Your account is disabled. Sorry about that.'));
         return Lib::redirect('logout');
     }
     // Check if there's at least one 'root' user, and otherwise promote the current user.
     $app['users']->checkForRoot();
     // Most of the 'check if user is allowed' happens here: match the current route to the 'allowed' settings.
     if (!$app['users']->isValidSession() && !$app['users']->isAllowed($route)) {
         $app['session']->getFlashBag()->add('info', Trans::__('Please log on.'));
         return Lib::redirect('login');
     } elseif (!$app['users']->isAllowed($route)) {
         $app['session']->getFlashBag()->add('error', Trans::__('You do not have the right privileges to view that page.'));
         return Lib::redirect('dashboard');
     }
     // Stop the 'stopwatch' for the profiler.
     $app['stopwatch']->stop('bolt.backend.before');
     return null;
 }