/** * Process our request * @return array object GalleryStatus a status code * array[] */ function _GalleryMain($embedded = false) { global $gallery; $main = array(); $urlGenerator =& $gallery->getUrlGenerator(); /* Figure out the target view/controller */ list($viewName, $controllerName) = GalleryUtilities::getRequestVariables('view', 'controller'); $gallery->debug("controller {$controllerName}, view {$viewName}"); /* Check if core module needs upgrading */ list($ret, $core) = GalleryCoreApi::loadPlugin('module', 'core', true); if ($ret) { return array($ret->wrap(__FILE__, __LINE__), null); } $installedVersions = $core->getInstalledVersions(); if ($installedVersions['core'] != $core->getVersion()) { if ($redirectUrl = @$gallery->getConfig('mode.maintenance')) { /* Maintenance mode -- redirect if given url, else simple message */ if ($redirectUrl === true) { print $core->translate('Site is temporarily down for maintenance.'); exit; } } else { $gallery->debug('Redirect to the upgrade wizard, core module version is out of date'); $redirectUrl = $urlGenerator->getCurrentUrlDir(true) . 'upgrade/index.php'; } return array(null, _GalleryMain_doRedirect($redirectUrl)); } $ret = GalleryInitSecondPass(); if ($ret) { return array($ret->wrap(__FILE__, __LINE__), null); } /* Load and run the appropriate controller */ $results = array(); if (!empty($controllerName)) { GalleryCoreApi::requireOnce('modules/core/classes/GalleryController.class'); list($ret, $controller) = GalleryController::loadController($controllerName); if ($ret) { return array($ret->wrap(__FILE__, __LINE__), null); } if (!$embedded && $gallery->getConfig('mode.embed.only') && !$controller->isAllowedInEmbedOnly()) { /* Lock out direct access when embed-only is set */ return array(GalleryCoreApi::error(ERROR_PERMISSION_DENIED, __FILE__, __LINE__), null); } if ($gallery->getConfig('mode.maintenance') && !$controller->isAllowedInMaintenance()) { /* Maintenance mode - allow admins, else redirect to given or standard url */ list($ret, $isAdmin) = GalleryCoreApi::isUserInSiteAdminGroup(); if ($ret) { return array($ret->wrap(__FILE__, __LINE__), null); } if (!$isAdmin) { if (($redirectUrl = $gallery->getConfig('mode.maintenance')) === true) { $redirectUrl = $urlGenerator->generateUrl(array('view' => 'core.MaintenanceMode'), array('forceFullUrl' => true)); } return array(null, _GalleryMain_doRedirect($redirectUrl)); } } /* Get our form and return variables */ $form = GalleryUtilities::getFormVariables('form'); /* Let the controller handle the input */ list($ret, $results) = $controller->handleRequest($form); if ($ret) { return array($ret->wrap(__FILE__, __LINE__), null); } /* Check to make sure we got back everything we want */ if (!isset($results['status']) || !isset($results['error']) || !isset($results['redirect']) && !isset($results['delegate']) && !isset($results['return'])) { return array(GalleryCoreApi::error(ERROR_BAD_PARAMETER, __FILE__, __LINE__, 'Controller results are missing status, ' . 'error, (redirect, delegate, return)'), null); } /* Try to return if the controller instructs it */ if (!empty($results['return'])) { list($ret, $navigationLinks) = $urlGenerator->getNavigationLinks(1); if ($ret) { return array($ret->wrap(__FILE__, __LINE__), null); } if (count($navigationLinks) > 0) { /* Go back to the previous navigation point in our history */ $redirectUrl = $navigationLinks[0]['url']; } else { $redirectUrl = GalleryUtilities::getRequestVariables('return'); if (empty($redirectUrl)) { $redirectUrl = GalleryUtilities::getRequestVariables('formUrl'); } } } /* Failing that, redirect if so instructed */ if (empty($redirectUrl) && !empty($results['redirect'])) { /* * If we have a status, store its data in the session and attach it * to the URL. */ if (!empty($results['status'])) { $session =& $gallery->getSession(); $results['redirect']['statusId'] = $session->putStatus($results['status']); } $urlToGenerate = $results['redirect']; /* Keep our navId in the URL */ $navId = $urlGenerator->getNavigationId(); if (!empty($navId)) { $urlToGenerate['navId'] = $navId; } $redirectUrl = $urlGenerator->generateUrl($urlToGenerate, array('forceFullUrl' => true)); } /* If we have a redirect url.. use it */ if (!empty($redirectUrl)) { return array(null, _GalleryMain_doRedirect($redirectUrl, null, $controllerName)); } /* Let the controller specify the next view */ if (!empty($results['delegate'])) { /* Load any errors into the request */ if (!empty($results['error'])) { foreach ($results['error'] as $error) { GalleryUtilities::putRequestVariable($error, 1); } } /* Save the view name, put the rest into the request so the view can get it */ foreach ($results['delegate'] as $key => $value) { switch ($key) { case 'view': $viewName = $value; break; default: GalleryUtilities::putRequestVariable($key, $value); break; } } } } /* Load and run the appropriate view */ if (empty($viewName)) { $viewName = GALLERY_DEFAULT_VIEW; GalleryUtilities::putRequestVariable('view', $viewName); } list($ret, $view) = GalleryView::loadView($viewName); if ($ret) { return array($ret->wrap(__FILE__, __LINE__), null); } if ($gallery->getConfig('mode.maintenance') && !$view->isAllowedInMaintenance()) { /* Maintenance mode - allow admins, else redirect to given url or show standard view */ list($ret, $isAdmin) = GalleryCoreApi::isUserInSiteAdminGroup(); if ($ret) { return array($ret->wrap(__FILE__, __LINE__), null); } if (!$isAdmin) { if (($redirectUrl = $gallery->getConfig('mode.maintenance')) !== true) { return array(null, _GalleryMain_doRedirect($redirectUrl)); } $viewName = 'core.MaintenanceMode'; list($ret, $view) = GalleryView::loadView($viewName); if ($ret) { return array($ret->wrap(__FILE__, __LINE__), null); } } } if (!$embedded && $gallery->getConfig('mode.embed.only') && !$view->isAllowedInEmbedOnly()) { /* Lock out direct access when embed-only is set */ return array(GalleryCoreApi::error(ERROR_PERMISSION_DENIED, __FILE__, __LINE__), null); } /* Check if the page is cached and return the cached version, else generate the page */ list($ret, $shouldCache) = GalleryDataCache::shouldCache('read', 'full'); if ($ret) { return array($ret->wrap(__FILE__, __LINE__), null); } $html = ''; if ($shouldCache) { $session =& $gallery->getSession(); list($ret, $html) = GalleryDataCache::getPageData('page', $urlGenerator->getCacheableUrl()); if ($ret) { return array($ret->wrap(__FILE__, __LINE__), null); } } if (!empty($html)) { /* * TODO: If we cache all the headers and replay them here, we could send a 304 not * modified back */ $session =& $gallery->getSession(); $html = $session->replaceTempSessionIdIfNecessary($html); /* Set the appropriate charset in our HTTP header */ if (!headers_sent()) { header('Content-Type: text/html; charset=UTF-8'); } print $html; $data['isDone'] = true; } else { /* Initialize our container for template data */ $gallery->setCurrentView($viewName); /* * If we render directly to the browser, we need get a session before, * or no session at all */ if ($view->isImmediate() || $viewName == 'core.ProgressBar') { /* * Session: Find out whether we need to send a cookie & get a new sessionId and save it * (make sure there's a sessionId before starting to render, but only if we need a * session) */ $session =& $gallery->getSession(); $ret = $session->start(); if ($ret) { return array($ret->wrap(__FILE__, __LINE__), null); } /* From now on, don't add navid / sessionId to URLs if there's no persistent session */ $session->doNotUseTempId(); } /* * If this is an immediate view, it will send its own output directly. This is * used in the situation where we want to send back data that's not controlled by the * layout. That's usually something that's not user-visible like a binary file. */ $data = array(); if ($view->isImmediate()) { $status = isset($results['status']) ? $results['status'] : array(); $error = isset($results['error']) ? $results['error'] : array(); $ret = $view->renderImmediate($status, $error); if ($ret) { return array($ret->wrap(__FILE__, __LINE__), null); } $data['isDone'] = true; } else { GalleryCoreApi::requireOnce('modules/core/classes/GalleryTemplate.class'); $template = new GalleryTemplate(dirname(__FILE__)); list($ret, $results, $theme) = $view->doLoadTemplate($template); if ($ret) { return array($ret->wrap(__FILE__, __LINE__), null); } if (isset($results['redirect']) || isset($results['redirectUrl'])) { if (isset($results['redirectUrl'])) { $redirectUrl = $results['redirectUrl']; } else { $redirectUrl = $urlGenerator->generateUrl($results['redirect'], array('forceFullUrl' => true)); } return array(null, _GalleryMain_doRedirect($redirectUrl, $template)); } if (empty($results['body'])) { return array(GalleryCoreApi::error(ERROR_BAD_PARAMETER, __FILE__, __LINE__, 'View results are missing body file'), null); } $templatePath = 'gallery:' . $results['body']; $template->setVariable('l10Domain', $theme->getL10Domain()); $template->setVariable('isEmbedded', $embedded); if ($viewName == 'core.ProgressBar') { /* Render progress bar pages immediately so that the user sees the bar moving */ $ret = $template->display($templatePath); if ($ret) { return array($ret->wrap(__FILE__, __LINE__), null); } $data['isDone'] = true; } else { list($ret, $html) = $template->fetch($templatePath); if ($ret) { return array($ret->wrap(__FILE__, __LINE__), null); } $html = preg_replace('/^\\s+/m', '', $html); list($ret, $shouldCache) = GalleryDataCache::shouldCache('write', 'full'); if ($ret) { return array($ret->wrap(__FILE__, __LINE__), null); } if ($shouldCache && $results['cacheable']) { $htmlForCache = $html; } /* * Session: Find out whether we need to send a cookie & need a new session * (only if we don't have one yet) */ $session =& $gallery->getSession(); $ret = $session->start(); if ($ret) { return array($ret->wrap(__FILE__, __LINE__), null); } $html = $session->replaceTempSessionIdIfNecessary($html); if ($embedded) { $data = $theme->splitHtml($html, $results); $data['themeData'] =& $template->getVariableByReference('theme'); $data['isDone'] = false; } else { /* Set the appropriate charset in our HTTP header */ if (!headers_sent()) { header('Content-Type: text/html; charset=UTF-8'); } print $html; if ($shouldCache && $results['cacheable']) { $session =& $gallery->getSession(); if ($session->getId() != SESSION_TEMP_ID) { $htmlForCache = str_replace($session->getId(), SESSION_TEMP_ID, $htmlForCache); } $ret = GalleryDataCache::putPageData('page', $results['cacheable'], $urlGenerator->getCacheableUrl(), $htmlForCache); if ($ret) { return array($ret->wrap(__FILE__, __LINE__), null); } } $data['isDone'] = true; } } } } return array(null, $data); }
/** * Process our request. * @return array GalleryStatus a status code * array */ function _GalleryMain($embedded = false, $template = null) { global $gallery; $urlGenerator =& $gallery->getUrlGenerator(); /* Figure out the target view/controller */ list($controllerName, $viewName) = GalleryUtilities::getRequestVariables('controller', 'view'); $controllerName = is_string($controllerName) ? $controllerName : null; $viewName = is_string($viewName) ? $viewName : null; $gallery->debug("controller {$controllerName}, view {$viewName}"); /* Check if core module needs upgrading */ list($ret, $core) = GalleryCoreApi::loadPlugin('module', 'core', true); if ($ret) { return array($ret, null); } $installedVersions = $core->getInstalledVersions(); if ($installedVersions['core'] != $core->getVersion()) { if ($redirectUrl = @$gallery->getConfig('mode.maintenance')) { /* Maintenance mode - redirect if given URL, else simple message */ if ($redirectUrl === true) { header('Content-Type: text/html; charset=UTF-8'); print $core->translate('Site is temporarily down for maintenance.'); exit; } } else { $gallery->debug('Redirect to the upgrade wizard, core module version is out of date'); $redirectUrl = $urlGenerator->getCurrentUrlDir(true) . 'upgrade/index.php'; } list($ignored, $results) = _GalleryMain_doRedirect($redirectUrl, null, null, true); return array(null, $results); } $ret = GalleryInitSecondPass(); if ($ret) { return array($ret, null); } /* Load and run the appropriate controller */ $results = array(); if (!empty($controllerName)) { GalleryCoreApi::requireOnce('modules/core/classes/GalleryController.class'); list($ret, $controller) = GalleryController::loadController($controllerName); if ($ret) { return array($ret, null); } if (!$embedded && $gallery->getConfig('mode.embed.only') && !$controller->isAllowedInEmbedOnly()) { /* Lock out direct access when embed-only is set */ if (($redirectUrl = $gallery->getConfig('mode.embed.only')) === true) { return array(GalleryCoreApi::error(ERROR_PERMISSION_DENIED), null); } list($ignored, $results) = _GalleryMain_doRedirect($redirectUrl, null, null, true); return array(null, $results); } if ($gallery->getConfig('mode.maintenance') && !$controller->isAllowedInMaintenance()) { /* Maintenance mode - allow admins, else redirect to given or standard URL */ list($ret, $isAdmin) = GalleryCoreApi::isUserInSiteAdminGroup(); if ($ret) { return array($ret, null); } if (!$isAdmin) { if (($redirectUrl = $gallery->getConfig('mode.maintenance')) === true) { $redirectUrl = $urlGenerator->generateUrl(array('view' => 'core.MaintenanceMode'), array('forceFullUrl' => true)); } list($ignored, $results) = _GalleryMain_doRedirect($redirectUrl, null, null, true); return array(null, $results); } } /* Get our form and return variables */ $form = GalleryUtilities::getFormVariables('form'); /* Verify the genuineness of the request */ if (!$controller->omitAuthTokenCheck()) { $ret = GalleryController::assertIsGenuineRequest(); if ($ret) { return array($ret, null); } } /* Let the controller handle the input */ list($ret, $results) = $controller->handleRequest($form); if ($ret) { list($ret, $results) = $controller->permissionCheck($ret); if ($ret) { return array($ret, null); } } /* Check to make sure we got back everything we want */ if (!isset($results['status']) || !isset($results['error']) || !isset($results['redirect']) && !isset($results['delegate']) && !isset($results['return'])) { return array(GalleryCoreApi::error(ERROR_BAD_PARAMETER, __FILE__, __LINE__, 'Controller results are missing status, error, (redirect, delegate, return)'), null); } /* Try to return if the controller instructs it */ if (!empty($results['return'])) { $redirectUrl = GalleryUtilities::getRequestVariables('return'); if (empty($redirectUrl)) { $redirectUrl = GalleryUtilities::getRequestVariables('formUrl'); } } /* Failing that, redirect if so instructed */ if (empty($redirectUrl) && !empty($results['redirect'])) { /* If we have a status, store its data in the session */ if (!empty($results['status'])) { $session =& $gallery->getSession(); $session->putStatus($results['status']); } $urlToGenerate = $results['redirect']; $redirectUrl = $urlGenerator->generateUrl($urlToGenerate, array('forceFullUrl' => true)); } /* If we have a redirect URL use it */ if (!empty($redirectUrl)) { return _GalleryMain_doRedirect($redirectUrl, null, $controllerName); } /* Let the controller specify the next view */ if (!empty($results['delegate'])) { /* Load any errors into the request */ if (!empty($results['error'])) { foreach ($results['error'] as $error) { GalleryUtilities::putRequestVariable($error, 1); } } /* Save the view name, put the rest into the request so the view can get it */ foreach ($results['delegate'] as $key => $value) { switch ($key) { case 'view': $viewName = $value; break; default: GalleryUtilities::putRequestVariable($key, $value); break; } } } } /* Load and run the appropriate view */ if (empty($viewName)) { $viewName = GALLERY_DEFAULT_VIEW; GalleryUtilities::putRequestVariable('view', $viewName); } list($ret, $view) = GalleryView::loadView($viewName); if ($ret) { return array($ret, null); } if ($gallery->getConfig('mode.maintenance') && !$view->isAllowedInMaintenance()) { /* Maintenance mode - allow admins, else redirect to given url or show standard view */ list($ret, $isAdmin) = GalleryCoreApi::isUserInSiteAdminGroup(); if ($ret) { return array($ret, null); } if (!$isAdmin) { if (($redirectUrl = $gallery->getConfig('mode.maintenance')) !== true) { list($ignored, $results) = _GalleryMain_doRedirect($redirectUrl, null, null, true); return array(null, $results); } $viewName = 'core.MaintenanceMode'; list($ret, $view) = GalleryView::loadView($viewName); if ($ret) { return array($ret, null); } } } if (!$embedded && $gallery->getConfig('mode.embed.only') && !$view->isAllowedInEmbedOnly()) { /* Lock out direct access when embed-only is set */ if (($redirectUrl = $gallery->getConfig('mode.embed.only')) === true) { return array(GalleryCoreApi::error(ERROR_PERMISSION_DENIED), null); } return _GalleryMain_doRedirect($redirectUrl); } /* Check if the page is cached and return the cached version, else generate the page */ list($ret, $shouldCache) = GalleryDataCache::shouldCache('read', 'full'); if ($ret) { return array($ret, null); } $html = ''; if ($shouldCache) { $session =& $gallery->getSession(); list($ret, $html) = GalleryDataCache::getPageData('page', $urlGenerator->getCacheableUrl()); if ($ret) { return array($ret, null); } if (!empty($html) && $embedded) { /* Also get the theme data */ list($ret, $themeData) = GalleryDataCache::getPageData('theme', $urlGenerator->getCacheableUrl()); if ($ret) { return array($ret, null); } } } if (!empty($html) && (!$embedded || !empty($themeData))) { /* TODO: If we cache all the headers and replay them here, we could send a 304 back */ $session =& $gallery->getSession(); if (!$embedded) { /* Set the appropriate charset in our HTTP header */ if (!headers_sent()) { header('Content-Type: text/html; charset=UTF-8'); } print $session->replaceTempSessionIdIfNecessary($html); $data['isDone'] = true; } else { $html = unserialize($html); $themeData = unserialize($themeData); $data = $session->replaceSessionIdInData($html); $data['themeData'] = $session->replaceSessionIdInData($themeData); $data['isDone'] = false; } } else { /* Initialize our container for template data */ $gallery->setCurrentView($viewName); if ($view->isControllerLike()) { /* Verify the genuineness of the request */ $ret = GalleryController::assertIsGenuineRequest(); if ($ret) { return array($ret, null); } } /* If we render directly to the browser, we need a session before, or no session at all */ if ($view->isImmediate() || $viewName == 'core.ProgressBar') { /* * Session: Find out whether we need to send a cookie & get a new sessionId and save it * (make sure there's a sessionId before starting to render, but only if we need a * session) */ $session =& $gallery->getSession(); $ret = $session->start(); if ($ret) { return array($ret, null); } /* From now on, don't add sessionId to URLs if there's no persistent session */ $session->doNotUseTempId(); } /* * If this is an immediate view, it will send its own output directly. This is used in the * situation where we want to send back data that's not controlled by the layout. That's * usually something that's not user-visible like a binary file. */ $data = array(); if ($view->isImmediate()) { if ($view->autoCacheControl()) { /* r17660 removed the default on the $template parameter */ $null = null; $ret = $view->setCacheControl($null); if ($ret) { return array($ret, null); } } $status = isset($results['status']) ? $results['status'] : array(); $error = isset($results['error']) ? $results['error'] : array(); $ret = $view->renderImmediate($status, $error); if ($ret) { list($ret2, $inGroup) = GalleryCoreApi::isUserInSiteAdminGroup(); if ($ret->getErrorCode() & ERROR_MISSING_OBJECT && ($ret2 || !$inGroup)) { /* Normalize error to GalleryView::_permissionCheck() */ $ret->addErrorCode(ERROR_PERMISSION_DENIED); } return array($ret, null); } $data['isDone'] = true; } else { if (!isset($template)) { GalleryCoreApi::requireOnce('modules/core/classes/GalleryTemplate.class'); $template = new GalleryTemplate(dirname(__FILE__)); } list($ret, $results, $theme) = $view->doLoadTemplate($template); if ($ret) { list($ret, $results) = $view->_permissionCheck($ret); if ($ret) { return array($ret, null); } } if (isset($results['redirect']) || isset($results['redirectUrl'])) { if (isset($results['redirectUrl'])) { $redirectUrl = $results['redirectUrl']; } else { $redirectUrl = $urlGenerator->generateUrl($results['redirect'], array('forceFullUrl' => true)); } return _GalleryMain_doRedirect($redirectUrl, $template); } if (empty($results['body'])) { return array(GalleryCoreApi::error(ERROR_BAD_PARAMETER, __FILE__, __LINE__, 'View results are missing body file'), null); } $templatePath = 'gallery:' . $results['body']; $template->setVariable('l10Domain', $theme->getL10Domain()); $template->setVariable('isEmbedded', $embedded); if ($viewName == 'core.ProgressBar') { @ini_set('output_buffering', '0'); /** * Try to prevent Apache's mod_deflate from gzipping the output since that * can interfere with streamed output. */ if (function_exists('apache_setenv') && !@$gallery->getConfig('apacheSetenvBroken')) { @apache_setenv('no-gzip', '1'); } /* Render progress bar pages immediately so that the user sees the bar moving */ $ret = $template->display($templatePath); if ($ret) { return array($ret, null); } $data['isDone'] = true; } else { $event = GalleryCoreApi::newEvent('Gallery::BeforeDisplay'); $event->setEntity($template); $event->setData(array('templatePath' => $templatePath, 'view' => $view)); list($ret, $ignored) = GalleryCoreApi::postEvent($event); if ($ret) { return array($ret, null); } list($ret, $html) = $template->fetch($templatePath); if ($ret) { return array($ret, null); } /* * Session: Find out whether we need to send a cookie & need a new session (only if * we don't have one yet) */ $session =& $gallery->getSession(); $ret = $session->start(); if ($ret) { return array($ret, null); } list($ret, $shouldCache) = GalleryDataCache::shouldCache('write', 'full'); if ($ret) { return array($ret, null); } if ($embedded) { $html = $theme->splitHtml($html, $results); } if ($shouldCache && $results['cacheable']) { $htmlForCache = $html; if ($embedded) { $themeDataForCache = $template->getVariable('theme'); } } if ($embedded) { $data = $session->replaceSessionIdInData($html); $data['themeData'] =& $template->getVariableByReference('theme'); $data['themeData'] = $session->replaceSessionIdInData($data['themeData']); $data['isDone'] = false; } else { /* Set the appropriate charset in our HTTP header */ if (!headers_sent()) { header('Content-Type: text/html; charset=UTF-8'); } print $session->replaceTempSessionIdIfNecessary($html); $data['isDone'] = true; } if ($shouldCache && $results['cacheable']) { $session =& $gallery->getSession(); $cacheKey = $urlGenerator->getCacheableUrl(); $sessionId = $session->getId(); if (!empty($sessionId) && $sessionId != SESSION_TEMP_ID) { $htmlForCache = $session->replaceSessionIdInData($htmlForCache, $sessionId, SESSION_TEMP_ID); if ($embedded) { $data['themeData'] = $session->replaceSessionIdInData($data['themeData'], $sessionId, SESSION_TEMP_ID); } } if ($embedded) { $htmlForCache = serialize($htmlForCache); $ret = GalleryDataCache::putPageData('theme', $results['cacheable'], $cacheKey, serialize($data['themeData'])); if ($ret) { return array($ret, null); } } $ret = GalleryDataCache::putPageData('page', $results['cacheable'], $cacheKey, $htmlForCache); if ($ret) { return array($ret, null); } } } } } return array(null, $data); }