Esempio n. 1
0
function _GalleryMain_errorHandler($error, $g2Data = null, $initOk = true)
{
    global $gallery;
    $failsafe = false;
    if (!$initOk) {
        $failsafe = true;
    }
    if (!$failsafe) {
        list($ret, $themeId) = GalleryCoreApi::getPluginParameter('module', 'core', 'default.theme');
        if ($ret) {
            $failsafe = true;
        }
    }
    if (!$failsafe) {
        list($ret, $theme) = GalleryCoreApi::loadPlugin('theme', $themeId);
        if ($ret) {
            $failsafe = true;
        }
        $templateAdapter =& $gallery->getTemplateAdapter();
        $templateAdapter->setTheme($theme);
    }
    if (!$failsafe) {
        list($ret, $view) = GalleryView::loadView('core.ErrorPage');
        if ($ret) {
            $failsafe = true;
        }
    }
    if (!$failsafe) {
        $dummyForm = array();
        GalleryCoreApi::requireOnce('modules/core/classes/GalleryTemplate.class');
        $template = new GalleryTemplate(dirname(__FILE__));
        $view->setError($error);
        list($ret, $results) = $view->loadTemplate($template, $dummyForm);
        if ($ret) {
            $failsafe = true;
        }
        $t =& $template->getVariableByReference('theme');
        $t['errorTemplate'] = $results['body'];
    }
    if (!$failsafe) {
        $template->setVariable('l10Domain', 'modules_core');
        list($ret, $templatePath) = $theme->showErrorPage($template);
        if ($ret) {
            $failsafe = true;
        }
    }
    if (!$failsafe) {
        $template->setVariable('l10Domain', 'themes_' . $themeId);
        $ret = $template->display("themes/{$themeId}/templates/{$templatePath}");
        if ($ret) {
            $failsafe = true;
        }
    }
    if ($failsafe) {
        /* Some kind of catastrophic failure.  Just dump the error out to the browser. */
        print '<h2>Error</h2>' . $error->getAsHtml(false);
        if ($gallery->getDebug() == 'buffered') {
            print '<h3>Debug Output</h3><pre>' . $gallery->getDebugBuffer() . '</pre>';
        }
        return;
    }
}
Esempio n. 2
0
 /**
  * Return the version of Gallery 2 (eg "2.3")
  */
 static function version()
 {
     $core = g2(GalleryCoreApi::loadPlugin("module", "core"));
     $versions = $core->getInstalledVersions();
     return $versions["gallery"];
 }
Esempio n. 3
0
/**
 * 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);
}