Пример #1
0
 public static function logAllPendingErrors()
 {
     $errors = DarkConsoleErrorLogPluginAPI::getErrors();
     // TODO(dcramer): add support for the 'trace' attribute in the client API
     foreach ($errors as $error) {
         self::$client->captureMessage($error['details']);
     }
 }
 protected function willRun()
 {
     parent::willRun();
     // This stores unbounded amounts of log data; make it discard instead so
     // that daemons do not require unbounded amounts of memory.
     DarkConsoleErrorLogPluginAPI::enableDiscardMode();
     $phabricator = phutil_get_library_root('phabricator');
     $root = dirname($phabricator);
     require_once $root . '/scripts/__init_env__.php';
 }
Пример #3
0
 protected function willRun()
 {
     parent::willRun();
     // This stores unbounded amounts of log data; make it discard instead so
     // that daemons do not require unbounded amounts of memory.
     DarkConsoleErrorLogPluginAPI::enableDiscardMode();
     $phabricator = phutil_get_library_root('phabricator');
     $root = dirname($phabricator);
     require_once $root . '/scripts/__init_env__.php';
     // Daemons may perform writes.
     AphrontWriteGuard::allowDangerousUnguardedWrites(true);
 }
Пример #4
0
 public static function initializeScriptEnvironment()
 {
     self::initializeCommonEnvironment();
     // NOTE: This is dangerous in general, but we know we're in a script context
     // and are not vulnerable to CSRF.
     AphrontWriteGuard::allowDangerousUnguardedWrites(true);
     // There are several places where we log information (about errors, events,
     // service calls, etc.) for analysis via DarkConsole or similar. These are
     // useful for web requests, but grow unboundedly in long-running scripts and
     // daemons. Discard data as it arrives in these cases.
     PhutilServiceProfiler::getInstance()->enableDiscardMode();
     DarkConsoleErrorLogPluginAPI::enableDiscardMode();
     DarkConsoleEventPluginAPI::enableDiscardMode();
 }
 private function processSearchRequest($request)
 {
     $panel = new PHUIBoxView();
     $admin = $request->getUser();
     $search = $request->getStr('query');
     $ldap_provider = PhabricatorLDAPAuthProvider::getLDAPProvider();
     if (!$ldap_provider) {
         throw new Exception(pht('No LDAP provider enabled!'));
     }
     $ldap_adapter = $ldap_provider->getAdapter();
     $ldap_adapter->setLoginUsername($request->getStr('username'));
     $ldap_adapter->setLoginPassword(new PhutilOpaqueEnvelope($request->getStr('password')));
     // This causes us to connect and bind.
     // TODO: Clean up this discard mode stuff.
     DarkConsoleErrorLogPluginAPI::enableDiscardMode();
     $ldap_adapter->getAccountID();
     DarkConsoleErrorLogPluginAPI::disableDiscardMode();
     $results = $ldap_adapter->searchLDAP('%Q', $search);
     foreach ($results as $key => $record) {
         $account_id = $ldap_adapter->readLDAPRecordAccountID($record);
         if (!$account_id) {
             unset($results[$key]);
             continue;
         }
         $info = array($account_id, $ldap_adapter->readLDAPRecordEmail($record), $ldap_adapter->readLDAPRecordRealName($record));
         $results[$key] = $info;
         $results[$key][] = $this->renderUserInputs($info);
     }
     $form = id(new AphrontFormView())->setUser($admin);
     $table = new AphrontTableView($results);
     $table->setHeaders(array(pht('Username'), pht('Email'), pht('Real Name'), pht('Import?')));
     $form->appendChild($table);
     $form->setAction($request->getRequestURI()->alter('import', 'true')->alter('search', null))->appendChild(id(new AphrontFormSubmitControl())->setValue(pht('Import')));
     $panel->appendChild($form);
     return $panel;
 }
 protected function getBody()
 {
     $user = null;
     $request = $this->getRequest();
     if ($request) {
         $user = $request->getUser();
     }
     $header_chrome = null;
     if ($this->getShowChrome()) {
         $header_chrome = $this->menuContent;
     }
     $classes = array();
     $classes[] = 'main-page-frame';
     $developer_warning = null;
     if (PhabricatorEnv::getEnvConfig('phabricator.developer-mode') && DarkConsoleErrorLogPluginAPI::getErrors()) {
         $developer_warning = phutil_tag_div('aphront-developer-error-callout', pht('This page raised PHP errors. Find them in DarkConsole ' . 'or the error log.'));
     }
     // Render the "you have unresolved setup issues..." warning.
     $setup_warning = null;
     if ($user && $user->getIsAdmin()) {
         $open = PhabricatorSetupCheck::getOpenSetupIssueKeys();
         if ($open) {
             $classes[] = 'page-has-warning';
             $setup_warning = phutil_tag_div('setup-warning-callout', phutil_tag('a', array('href' => '/config/issue/', 'title' => implode(', ', $open)), pht('You have %d unresolved setup issue(s)...', count($open))));
         }
     }
     $main_page = phutil_tag('div', array('id' => 'phabricator-standard-page', 'class' => 'phabricator-standard-page'), array($developer_warning, $header_chrome, $setup_warning, phutil_tag('div', array('id' => 'phabricator-standard-page-body', 'class' => 'phabricator-standard-page-body'), $this->renderPageBodyContent())));
     $durable_column = null;
     if ($this->getShowDurableColumn()) {
         $is_visible = $this->getDurableColumnVisible();
         $durable_column = id(new ConpherenceDurableColumnView())->setSelectedConpherence(null)->setUser($user)->setQuicksandConfig($this->buildQuicksandConfig())->setVisible($is_visible)->setInitialLoad(true);
     }
     Javelin::initBehavior('quicksand-blacklist', array('patterns' => $this->getQuicksandURIPatternBlacklist()));
     return phutil_tag('div', array('class' => implode(' ', $classes)), array($main_page, $durable_column));
 }
 public function generateData()
 {
     return DarkConsoleErrorLogPluginAPI::getErrors();
 }
 protected function getBody()
 {
     $console = $this->getConsole();
     $tabs = array();
     foreach ($this->tabs as $name => $tab) {
         $tab_markup = phutil_render_tag('a', array('href' => idx($tab, 'href')), phutil_escape_html(idx($tab, 'name')));
         $tab_markup = phutil_render_tag('td', array('class' => $name == $this->selectedTab ? 'phabricator-selected-tab' : null), $tab_markup);
         $tabs[] = $tab_markup;
     }
     $tabs = implode('', $tabs);
     $login_stuff = null;
     $request = $this->getRequest();
     $user = null;
     if ($request) {
         $user = $request->getUser();
         // NOTE: user may not be set here if we caught an exception early
         // in the execution workflow.
         if ($user && $user->getPHID()) {
             $login_stuff = phutil_render_tag('a', array('href' => '/p/' . $user->getUsername() . '/'), phutil_escape_html($user->getUsername())) . ' &middot; ' . '<a href="/settings/">Settings</a>' . ' &middot; ' . phabricator_render_form($user, array('action' => '/search/', 'method' => 'post', 'style' => 'display: inline'), '<input type="text" name="query" />' . '<button>Search</button>');
         }
     }
     $foot_links = array();
     $version = PhabricatorEnv::getEnvConfig('phabricator.version');
     $foot_links[] = phutil_escape_html('Phabricator ' . $version);
     if (PhabricatorEnv::getEnvConfig('darkconsole.enabled') && !PhabricatorEnv::getEnvConfig('darkconsole.always-on')) {
         if ($console) {
             $link = javelin_render_tag('a', array('href' => '/~/', 'sigil' => 'workflow'), 'Disable DarkConsole');
         } else {
             $link = javelin_render_tag('a', array('href' => '/~/', 'sigil' => 'workflow'), 'Enable DarkConsole');
         }
         $foot_links[] = $link;
     }
     if ($user && $user->getPHID()) {
         // This ends up very early in tab order at the top of the page and there's
         // a bunch of junk up there anyway, just shove it down here.
         $foot_links[] = phabricator_render_form($user, array('action' => '/logout/', 'method' => 'post', 'style' => 'display: inline'), '<button class="link">Logout</button>');
     }
     $foot_links = implode(' &middot; ', $foot_links);
     $admin_class = null;
     if ($this->getIsAdminInterface()) {
         $admin_class = 'phabricator-admin-page-view';
     }
     $header_chrome = null;
     $footer_chrome = null;
     if ($this->getShowChrome()) {
         $header_chrome = '<table class="phabricator-standard-header">' . '<tr>' . '<td class="phabricator-logo"><a href="/"> </a></td>' . '<td>' . '<table class="phabricator-primary-navigation">' . '<tr>' . '<th>' . phutil_render_tag('a', array('href' => $this->getBaseURI(), 'class' => 'phabricator-head-appname'), phutil_escape_html($this->getApplicationName())) . '</th>' . $tabs . '</tr>' . '</table>' . '</td>' . '<td class="phabricator-login-details">' . $login_stuff . '</td>' . '</tr>' . '</table>';
         $footer_chrome = '<div class="phabricator-page-foot">' . $foot_links . '</div>';
     }
     $developer_warning = null;
     if (PhabricatorEnv::getEnvConfig('phabricator.show-error-callout') && DarkConsoleErrorLogPluginAPI::getErrors()) {
         $developer_warning = '<div class="aphront-developer-error-callout">' . 'This page raised PHP errors. Find them in DarkConsole ' . 'or the error log.' . '</div>';
     }
     return ($console ? '<darkconsole />' : null) . $developer_warning . '<div class="phabricator-standard-page ' . $admin_class . '">' . $header_chrome . $this->bodyContent . '<div style="clear: both;"></div>' . '</div>' . $footer_chrome;
 }
 protected function getBody()
 {
     $user = null;
     $request = $this->getRequest();
     if ($request) {
         $user = $request->getUser();
     }
     $header_chrome = null;
     if ($this->getShowChrome()) {
         $header_chrome = $this->menuContent;
     }
     $classes = array();
     $classes[] = 'main-page-frame';
     $developer_warning = null;
     if (PhabricatorEnv::getEnvConfig('phabricator.developer-mode') && DarkConsoleErrorLogPluginAPI::getErrors()) {
         $developer_warning = phutil_tag_div('aphront-developer-error-callout', pht('This page raised PHP errors. Find them in DarkConsole ' . 'or the error log.'));
     }
     $main_page = phutil_tag('div', array('id' => 'phabricator-standard-page', 'class' => 'phabricator-standard-page'), array($developer_warning, $header_chrome, phutil_tag('div', array('id' => 'phabricator-standard-page-body', 'class' => 'phabricator-standard-page-body'), $this->renderPageBodyContent())));
     $durable_column = null;
     if ($this->getShowDurableColumn()) {
         $is_visible = $this->getDurableColumnVisible();
         $is_minimize = $this->getDurableColumnMinimize();
         $durable_column = id(new ConpherenceDurableColumnView())->setSelectedConpherence(null)->setUser($user)->setQuicksandConfig($this->buildQuicksandConfig())->setVisible($is_visible)->setMinimize($is_minimize)->setInitialLoad(true);
         if ($is_minimize) {
             $this->classes[] = 'minimize-column';
         }
     }
     Javelin::initBehavior('quicksand-blacklist', array('patterns' => $this->getQuicksandURIPatternBlacklist()));
     return phutil_tag('div', array('class' => implode(' ', $classes)), array($main_page, $durable_column));
 }
 public function processLoginRequest(PhabricatorAuthLoginController $controller)
 {
     $request = $controller->getRequest();
     $viewer = $request->getUser();
     $response = null;
     $account = null;
     $username = $request->getStr('ldap_username');
     $password = $request->getStr('ldap_password');
     $has_password = strlen($password);
     $password = new PhutilOpaqueEnvelope($password);
     if (!strlen($username) || !$has_password) {
         $response = $controller->buildProviderPageResponse($this, $this->renderLoginForm($request, 'login'));
         return array($account, $response);
     }
     if ($request->isFormPost()) {
         try {
             if (strlen($username) && $has_password) {
                 $adapter = $this->getAdapter();
                 $adapter->setLoginUsername($username);
                 $adapter->setLoginPassword($password);
                 // TODO: This calls ldap_bind() eventually, which dumps cleartext
                 // passwords to the error log. See note in PhutilLDAPAuthAdapter.
                 // See T3351.
                 DarkConsoleErrorLogPluginAPI::enableDiscardMode();
                 $account_id = $adapter->getAccountID();
                 DarkConsoleErrorLogPluginAPI::disableDiscardMode();
             } else {
                 throw new Exception(pht('Username and password are required!'));
             }
         } catch (PhutilAuthCredentialException $ex) {
             $response = $controller->buildProviderPageResponse($this, $this->renderLoginForm($request, 'login'));
             return array($account, $response);
         } catch (Exception $ex) {
             // TODO: Make this cleaner.
             throw $ex;
         }
     }
     return array($this->loadOrCreateAccount($account_id), $response);
 }
 public static function enableDiscardMode()
 {
     self::$discardMode = true;
 }
 public static function disableDiscardMode()
 {
     self::$discardMode = false;
 }
Пример #13
0
 public function auth($username, PhutilOpaqueEnvelope $password)
 {
     if (strlen(trim($username)) == 0) {
         throw new Exception('Username can not be empty');
     }
     if (PhabricatorEnv::getEnvConfig('ldap.search-first')) {
         // To protect against people phishing for accounts we catch the
         // exception and present the default exception that would be presented
         // in the case of a failed bind.
         try {
             $user = $this->getUser($this->getUsernameAttribute(), $username);
             $username = $user[$this->getSearchAttribute()][0];
         } catch (PhabricatorLDAPUnknownUserException $e) {
             throw new Exception($this->invalidLDAPUserErrorMessage(self::LDAP_INVALID_CREDENTIALS, ldap_err2str(self::LDAP_INVALID_CREDENTIALS)));
         }
     }
     $conn = $this->getConnection();
     $activeDirectoryDomain = PhabricatorEnv::getEnvConfig('ldap.activedirectory_domain');
     if ($activeDirectoryDomain) {
         $dn = $username . '@' . $activeDirectoryDomain;
     } else {
         $dn = ldap_sprintf('%Q=%s,%Q', $this->getSearchAttribute(), $username, $this->getBaseDN());
     }
     // NOTE: It is very important we suppress any messages that occur here,
     // because it logs passwords if it reaches an error log of any sort.
     DarkConsoleErrorLogPluginAPI::enableDiscardMode();
     $result = @ldap_bind($conn, $dn, $password->openEnvelope());
     DarkConsoleErrorLogPluginAPI::disableDiscardMode();
     if (!$result) {
         throw new Exception($this->invalidLDAPUserErrorMessage(ldap_errno($conn), ldap_error($conn)));
     }
     $this->userData = $this->getUser($this->getSearchAttribute(), $username);
     return $this->userData;
 }
 /**
  * @phutil-external-symbol class PhabricatorStartup
  */
 public static function runHTTPRequest(AphrontHTTPSink $sink)
 {
     $multimeter = MultimeterControl::newInstance();
     $multimeter->setEventContext('<http-init>');
     $multimeter->setEventViewer('<none>');
     // Build a no-op write guard for the setup phase. We'll replace this with a
     // real write guard later on, but we need to survive setup and build a
     // request object first.
     $write_guard = new AphrontWriteGuard('id');
     PhabricatorEnv::initializeWebEnvironment();
     $multimeter->setSampleRate(PhabricatorEnv::getEnvConfig('debug.sample-rate'));
     $debug_time_limit = PhabricatorEnv::getEnvConfig('debug.time-limit');
     if ($debug_time_limit) {
         PhabricatorStartup::setDebugTimeLimit($debug_time_limit);
     }
     // This is the earliest we can get away with this, we need env config first.
     PhabricatorAccessLog::init();
     $access_log = PhabricatorAccessLog::getLog();
     PhabricatorStartup::setAccessLog($access_log);
     $access_log->setData(array('R' => AphrontRequest::getHTTPHeader('Referer', '-'), 'r' => idx($_SERVER, 'REMOTE_ADDR', '-'), 'M' => idx($_SERVER, 'REQUEST_METHOD', '-')));
     DarkConsoleXHProfPluginAPI::hookProfiler();
     DarkConsoleErrorLogPluginAPI::registerErrorHandler();
     $response = PhabricatorSetupCheck::willProcessRequest();
     if ($response) {
         PhabricatorStartup::endOutputCapture();
         $sink->writeResponse($response);
         return;
     }
     $host = AphrontRequest::getHTTPHeader('Host');
     $path = $_REQUEST['__path__'];
     switch ($host) {
         default:
             $config_key = 'aphront.default-application-configuration-class';
             $application = PhabricatorEnv::newObjectFromConfig($config_key);
             break;
     }
     $application->setHost($host);
     $application->setPath($path);
     $application->willBuildRequest();
     $request = $application->buildRequest();
     // Now that we have a request, convert the write guard into one which
     // actually checks CSRF tokens.
     $write_guard->dispose();
     $write_guard = new AphrontWriteGuard(array($request, 'validateCSRF'));
     // Build the server URI implied by the request headers. If an administrator
     // has not configured "phabricator.base-uri" yet, we'll use this to generate
     // links.
     $request_protocol = $request->isHTTPS() ? 'https' : 'http';
     $request_base_uri = "{$request_protocol}://{$host}/";
     PhabricatorEnv::setRequestBaseURI($request_base_uri);
     $access_log->setData(array('U' => (string) $request->getRequestURI()->getPath()));
     $processing_exception = null;
     try {
         $response = $application->processRequest($request, $access_log, $sink, $multimeter);
         $response_code = $response->getHTTPResponseCode();
     } catch (Exception $ex) {
         $processing_exception = $ex;
         $response_code = 500;
     }
     $write_guard->dispose();
     $access_log->setData(array('c' => $response_code, 'T' => PhabricatorStartup::getMicrosecondsSinceStart()));
     $multimeter->newEvent(MultimeterEvent::TYPE_REQUEST_TIME, $multimeter->getEventContext(), PhabricatorStartup::getMicrosecondsSinceStart());
     $access_log->write();
     $multimeter->saveEvents();
     DarkConsoleXHProfPluginAPI::saveProfilerSample($access_log);
     // Add points to the rate limits for this request.
     if (isset($_SERVER['REMOTE_ADDR'])) {
         $user_ip = $_SERVER['REMOTE_ADDR'];
         // The base score for a request allows users to make 30 requests per
         // minute.
         $score = 1000 / 30;
         // If the user was logged in, let them make more requests.
         if ($request->getUser() && $request->getUser()->getPHID()) {
             $score = $score / 5;
         }
         PhabricatorStartup::addRateLimitScore($user_ip, $score);
     }
     if ($processing_exception) {
         throw $processing_exception;
     }
 }
 protected function getBody()
 {
     $console = $this->getConsole();
     $login_stuff = null;
     $request = $this->getRequest();
     $user = null;
     if ($request) {
         $user = $request->getUser();
         // NOTE: user may not be set here if we caught an exception early
         // in the execution workflow.
         if ($user && $user->getPHID()) {
             $login_stuff = phutil_render_tag('a', array('href' => '/p/' . $user->getUsername() . '/'), phutil_escape_html($user->getUsername())) . ' &middot; ' . '<a href="/settings/">Settings</a>' . ' &middot; ' . phabricator_render_form($user, array('action' => '/search/', 'method' => 'post', 'style' => 'display: inline'), '<div class="menu-section menu-section-search">' . '<div class="menu-search-container">' . '<input type="text" name="query" id="standard-search-box" />' . '<button id="standard-search-button">Search</button>' . '</div>' . '</div>' . ' in ' . AphrontFormSelectControl::renderSelectTag($this->getSearchDefaultScope(), PhabricatorSearchScope::getScopeOptions(), array('name' => 'scope')) . ' ' . '<button>Search</button>');
         }
     }
     $admin_class = null;
     if ($this->getIsAdminInterface()) {
         $admin_class = 'phabricator-admin-page-view';
     }
     $header_chrome = null;
     $footer_chrome = null;
     if ($this->getShowChrome()) {
         $header_chrome = $this->menuContent;
         if (!$this->deviceReady) {
             $footer_chrome = $this->renderFooter();
         }
     }
     $developer_warning = null;
     if (PhabricatorEnv::getEnvConfig('phabricator.show-error-callout') && DarkConsoleErrorLogPluginAPI::getErrors()) {
         $developer_warning = '<div class="aphront-developer-error-callout">' . 'This page raised PHP errors. Find them in DarkConsole ' . 'or the error log.' . '</div>';
     }
     $agent = idx($_SERVER, 'HTTP_USER_AGENT');
     // Try to guess the device resolution based on UA strings to avoid a flash
     // of incorrectly-styled content.
     $device_guess = 'device-desktop';
     if (preg_match('/iPhone|iPod/', $agent)) {
         $device_guess = 'device-phone';
     } else {
         if (preg_match('/iPad/', $agent)) {
             $device_guess = 'device-tablet';
         }
     }
     $classes = array('phabricator-standard-page', $admin_class, $device_guess);
     $classes = implode(' ', $classes);
     return phutil_render_tag('div', array('id' => 'base-page', 'class' => $classes), $header_chrome . '<div class="phabricator-main-menu-spacer"></div>' . '<div class="phabricator-standard-page-body">' . ($console ? '<darkconsole />' : null) . $developer_warning . $this->bodyContent . '<div style="clear: both;"></div>' . '</div>') . $footer_chrome;
 }
 protected function getBody()
 {
     $console = $this->getConsole();
     $tabs = array();
     foreach ($this->tabs as $name => $tab) {
         $tab_markup = phutil_render_tag('a', array('href' => idx($tab, 'href')), phutil_escape_html(idx($tab, 'name')));
         $tab_markup = phutil_render_tag('td', array('class' => $name == $this->selectedTab ? 'phabricator-selected-tab' : null), $tab_markup);
         $tabs[] = $tab_markup;
     }
     $tabs = implode('', $tabs);
     $login_stuff = null;
     $request = $this->getRequest();
     $user = null;
     if ($request) {
         $user = $request->getUser();
         // NOTE: user may not be set here if we caught an exception early
         // in the execution workflow.
         if ($user && $user->getPHID()) {
             $login_stuff = phutil_render_tag('a', array('href' => '/p/' . $user->getUsername() . '/'), phutil_escape_html($user->getUsername())) . ' &middot; ' . '<a href="/settings/">Settings</a>' . ' &middot; ' . phabricator_render_form($user, array('action' => '/search/', 'method' => 'post', 'style' => 'display: inline'), '<input type="text" name="query" id="standard-search-box" />' . ' in ' . AphrontFormSelectControl::renderSelectTag($this->getSearchDefaultScope(), PhabricatorSearchScope::getScopeOptions(), array('name' => 'scope')) . ' ' . '<button>Search</button>');
         }
     }
     $foot_links = array();
     $version = PhabricatorEnv::getEnvConfig('phabricator.version');
     $foot_links[] = phutil_escape_html('Phabricator ' . $version);
     $foot_links[] = '<a href="https://secure.phabricator.com/maniphest/task/create/">' . 'Report a Bug' . '</a>';
     if (PhabricatorEnv::getEnvConfig('darkconsole.enabled') && !PhabricatorEnv::getEnvConfig('darkconsole.always-on')) {
         if ($console) {
             $link = javelin_render_tag('a', array('href' => '/~/', 'sigil' => 'workflow'), 'Disable DarkConsole');
         } else {
             $link = javelin_render_tag('a', array('href' => '/~/', 'sigil' => 'workflow'), 'Enable DarkConsole');
         }
         $foot_links[] = $link;
     }
     if ($user && $user->getPHID()) {
         // This ends up very early in tab order at the top of the page and there's
         // a bunch of junk up there anyway, just shove it down here.
         $foot_links[] = phabricator_render_form($user, array('action' => '/logout/', 'method' => 'post', 'style' => 'display: inline'), '<button class="link">Logout</button>');
     }
     $foot_links = implode(' &middot; ', $foot_links);
     $admin_class = null;
     if ($this->getIsAdminInterface()) {
         $admin_class = 'phabricator-admin-page-view';
     }
     $custom_logo = null;
     $with_custom = null;
     $custom_conf = PhabricatorEnv::getEnvConfig('phabricator.custom.logo');
     if ($custom_conf) {
         $with_custom = 'phabricator-logo-with-custom';
         $custom_logo = phutil_render_tag('a', array('class' => 'logo-custom', 'href' => $custom_conf), ' ');
     }
     $notification_indicator = '';
     $notification_dropdown = '';
     $notification_container = '';
     if (PhabricatorEnv::getEnvConfig('notification.enabled') && $user && $user->isLoggedIn()) {
         $aphlict_object_id = 'aphlictswfobject';
         $client_uri = PhabricatorEnv::getEnvConfig('notification.client-uri');
         $client_uri = new PhutilURI($client_uri);
         if ($client_uri->getDomain() == 'localhost') {
             $this_host = $this->getRequest()->getHost();
             $this_host = new PhutilURI('http://' . $this_host . '/');
             $client_uri->setDomain($this_host->getDomain());
         }
         $enable_debug = PhabricatorEnv::getEnvConfig('notification.debug');
         Javelin::initBehavior('aphlict-listen', array('id' => $aphlict_object_id, 'server' => $client_uri->getDomain(), 'port' => $client_uri->getPort(), 'debug' => $enable_debug, 'pageObjects' => array_fill_keys($this->pageObjects, true)));
         Javelin::initBehavior('aphlict-dropdown', array());
         $notification_count = id(new PhabricatorFeedStoryNotification())->countUnread($user);
         $indicator_classes = array('phabricator-notification-indicator');
         if ($notification_count) {
             $indicator_classes[] = 'phabricator-notification-indicator-unread';
         }
         $notification_indicator = javelin_render_tag('div', array('id' => 'phabricator-notification-indicator', 'class' => implode(' ', $indicator_classes)), $notification_count);
         $notification_indicator = javelin_render_tag('div', array('id' => 'phabricator-notification-menu', 'class' => 'phabricator-icon-menu icon-menu-notifications', 'sigil' => 'aphlict-indicator'), $notification_indicator);
         $notification_indicator = javelin_render_tag('td', array('class' => 'phabricator-icon-menu-cell'), $notification_indicator);
         $notification_container = '<div id="aphlictswf-container" style="height:0px; width:0px;">' . '</div>';
         $notification_dropdown = javelin_render_tag('div', array('sigil' => 'aphlict-dropdown', 'id' => 'phabricator-notification-dropdown', 'style' => 'display: none'), '');
     }
     $header_chrome = null;
     $footer_chrome = null;
     if ($this->getShowChrome()) {
         $header_chrome = '<table class="phabricator-standard-header">' . '<tr>' . '<td class="phabricator-logo ' . $with_custom . '">' . $custom_logo . '<a class="logo-standard" href="/"> </a>' . '</td>' . $notification_indicator . '<td>' . '<table class="phabricator-primary-navigation">' . '<tr>' . '<th>' . phutil_render_tag('a', array('href' => $this->getBaseURI(), 'class' => 'phabricator-head-appname'), phutil_escape_html($this->getApplicationName())) . '</th>' . $tabs . '</tr>' . '</table>' . '</td>' . '<td class="phabricator-login-details">' . $login_stuff . '</td>' . '</tr>' . '</table>' . $notification_dropdown . $notification_container;
         $footer_chrome = '<div class="phabricator-page-foot">' . $foot_links . '</div>';
     }
     $developer_warning = null;
     if (PhabricatorEnv::getEnvConfig('phabricator.show-error-callout') && DarkConsoleErrorLogPluginAPI::getErrors()) {
         $developer_warning = '<div class="aphront-developer-error-callout">' . 'This page raised PHP errors. Find them in DarkConsole ' . 'or the error log.' . '</div>';
     }
     Javelin::initBehavior('device', array('id' => 'base-page'));
     $agent = idx($_SERVER, 'HTTP_USER_AGENT');
     // Try to guess the device resolution based on UA strings to avoid a flash
     // of incorrectly-styled content.
     $device_guess = 'device-desktop';
     if (preg_match('/iPhone|iPod/', $agent)) {
         $device_guess = 'device-phone';
     } else {
         if (preg_match('/iPad/', $agent)) {
             $device_guess = 'device-tablet';
         }
     }
     $classes = array('phabricator-standard-page', $admin_class, $device_guess);
     $classes = implode(' ', $classes);
     return ($console ? '<darkconsole />' : null) . $developer_warning . phutil_render_tag('div', array('id' => 'base-page', 'class' => $classes), $header_chrome . $this->bodyContent . '<div style="clear: both;"></div>') . $footer_chrome;
 }
Пример #17
0
if (file_exists($preamble_path)) {
    require_once $preamble_path;
}
PhabricatorStartup::didStartup();
$show_unexpected_traces = false;
try {
    PhabricatorStartup::loadCoreLibraries();
    PhabricatorEnv::initializeWebEnvironment();
    $show_unexpected_traces = PhabricatorEnv::getEnvConfig('phabricator.developer-mode');
    // This is the earliest we can get away with this, we need env config first.
    PhabricatorAccessLog::init();
    $access_log = PhabricatorAccessLog::getLog();
    PhabricatorStartup::setGlobal('log.access', $access_log);
    $access_log->setData(array('R' => AphrontRequest::getHTTPHeader('Referer', '-'), 'r' => idx($_SERVER, 'REMOTE_ADDR', '-'), 'M' => idx($_SERVER, 'REQUEST_METHOD', '-')));
    DarkConsoleXHProfPluginAPI::hookProfiler();
    DarkConsoleErrorLogPluginAPI::registerErrorHandler();
    $sink = new AphrontPHPHTTPSink();
    $response = PhabricatorSetupCheck::willProcessRequest();
    if ($response) {
        PhabricatorStartup::endOutputCapture();
        $sink->writeResponse($response);
        return;
    }
    $host = AphrontRequest::getHTTPHeader('Host');
    $path = $_REQUEST['__path__'];
    switch ($host) {
        default:
            $config_key = 'aphront.default-application-configuration-class';
            $application = PhabricatorEnv::newObjectFromConfig($config_key);
            break;
    }
 protected function getBody()
 {
     $console = $this->getConsole();
     $user = null;
     $request = $this->getRequest();
     if ($request) {
         $user = $request->getUser();
     }
     $header_chrome = null;
     if ($this->getShowChrome()) {
         $header_chrome = $this->menuContent;
     }
     $developer_warning = null;
     if (PhabricatorEnv::getEnvConfig('phabricator.developer-mode') && DarkConsoleErrorLogPluginAPI::getErrors()) {
         $developer_warning = phutil_tag_div('aphront-developer-error-callout', pht('This page raised PHP errors. Find them in DarkConsole ' . 'or the error log.'));
     }
     // Render the "you have unresolved setup issues..." warning.
     $setup_warning = null;
     if ($user && $user->getIsAdmin()) {
         $open = PhabricatorSetupCheck::getOpenSetupIssueCount();
         if ($open) {
             $setup_warning = phutil_tag_div('setup-warning-callout', phutil_tag('a', array('href' => '/config/issue/'), pht('You have %d unresolved setup issue(s)...', $open)));
         }
     }
     return phutil_tag('div', array('id' => 'base-page', 'class' => 'phabricator-standard-page'), array($developer_warning, $setup_warning, $header_chrome, phutil_tag_div('phabricator-standard-page-body', array($console ? hsprintf('<darkconsole />') : null, parent::getBody(), phutil_tag('div', array('style' => 'clear: both;'))))));
 }