From ccf7df6093e80455ed7479dfc5ec05b6a88dc777 Mon Sep 17 00:00:00 2001 From: epriestley Date: Wed, 26 Jan 2011 13:21:12 -0800 Subject: [PATCH] Authentication --- src/__phutil_library_map__.php | 7 + src/aphront/controller/AphrontController.php | 4 + ...AphrontDefaultApplicationConfiguration.php | 2 + .../exception/base/AphrontException.php | 21 +++ src/aphront/exception/base/__init__.php | 10 ++ .../redirect/AphrontRedirectException.php | 31 +++++ src/aphront/exception/redirect/__init__.php | 12 ++ src/aphront/request/AphrontRequest.php | 34 +++++ src/aphront/request/__init__.php | 2 + .../base/PhabricatorAuthController.php | 33 +++++ .../auth/controlller/base/__init__.php | 15 +++ .../login/PhabricatorLoginController.php | 122 ++++++++++++++++++ .../auth/controlller/login/__init__.php | 21 +++ .../controller/base/PhabricatorController.php | 42 +++++- .../base/controller/base/__init__.php | 3 + .../base/PhabricatorConduitController.php | 2 +- .../conduit/controller/base/__init__.php | 1 - .../base/DifferentialController.php | 2 +- .../differential/controller/base/__init__.php | 1 - .../base/PhabricatorDirectoryController.php | 2 +- .../directory/controller/base/__init__.php | 1 - .../base/PhabricatorFileController.php | 2 +- .../files/controller/base/__init__.php | 1 - .../base/PhabricatorMetaMTAController.php | 2 +- .../metamta/controller/base/__init__.php | 1 - .../base/PhabricatorPeopleController.php | 2 +- .../people/controller/base/__init__.php | 1 - .../people/storage/user/PhabricatorUser.php | 25 ++++ .../base/PhabricatorPHIDController.php | 2 +- .../phid/controller/base/__init__.php | 1 - .../standard/PhabricatorStandardPageView.php | 21 +++ webroot/index.php | 7 +- .../application/base/standard-page-view.css | 4 + 33 files changed, 421 insertions(+), 16 deletions(-) create mode 100644 src/aphront/exception/base/AphrontException.php create mode 100644 src/aphront/exception/base/__init__.php create mode 100644 src/aphront/exception/redirect/AphrontRedirectException.php create mode 100644 src/aphront/exception/redirect/__init__.php create mode 100644 src/applications/auth/controlller/base/PhabricatorAuthController.php create mode 100644 src/applications/auth/controlller/base/__init__.php create mode 100644 src/applications/auth/controlller/login/PhabricatorLoginController.php create mode 100644 src/applications/auth/controlller/login/__init__.php diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index f30a40224d..7647a8ef85 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -18,6 +18,7 @@ phutil_register_library_map(array( 'AphrontDialogResponse' => 'aphront/response/dialog', 'AphrontDialogView' => 'view/dialog', 'AphrontErrorView' => 'view/form/error', + 'AphrontException' => 'aphront/exception/base', 'AphrontFileResponse' => 'aphront/response/file', 'AphrontFormCheckboxControl' => 'view/form/control/checkbox', 'AphrontFormControl' => 'view/form/control/base', @@ -41,6 +42,7 @@ phutil_register_library_map(array( 'AphrontQueryObjectMissingException' => 'storage/exception/objectmissing', 'AphrontQueryParameterException' => 'storage/exception/parameter', 'AphrontQueryRecoverableException' => 'storage/exception/recoverable', + 'AphrontRedirectException' => 'aphront/exception/redirect', 'AphrontRedirectResponse' => 'aphront/response/redirect', 'AphrontRequest' => 'aphront/request', 'AphrontResponse' => 'aphront/response/base', @@ -84,6 +86,7 @@ phutil_register_library_map(array( 'DifferentialUnitStatus' => 'applications/differential/constants/unitstatus', 'Javelin' => 'infratructure/javelin/api', 'LiskDAO' => 'storage/lisk/dao', + 'PhabricatorAuthController' => 'applications/auth/controlller/base', 'PhabricatorConduitAPIController' => 'applications/conduit/controller/api', 'PhabricatorConduitConnectionLog' => 'applications/conduit/storage/connectionlog', 'PhabricatorConduitConsoleController' => 'applications/conduit/controller/console', @@ -112,6 +115,7 @@ phutil_register_library_map(array( 'PhabricatorFileUploadController' => 'applications/files/controller/upload', 'PhabricatorFileViewController' => 'applications/files/controller/view', 'PhabricatorLiskDAO' => 'applications/base/storage/lisk', + 'PhabricatorLoginController' => 'applications/auth/controlller/login', 'PhabricatorMailImplementationAdapter' => 'applications/metamta/adapter/base', 'PhabricatorMailImplementationPHPMailerLiteAdapter' => 'applications/metamta/adapter/phpmailerlite', 'PhabricatorMetaMTAController' => 'applications/metamta/controller/base', @@ -191,6 +195,7 @@ phutil_register_library_map(array( 'AphrontQueryObjectMissingException' => 'AphrontQueryException', 'AphrontQueryParameterException' => 'AphrontQueryException', 'AphrontQueryRecoverableException' => 'AphrontQueryException', + 'AphrontRedirectException' => 'AphrontException', 'AphrontRedirectResponse' => 'AphrontResponse', 'AphrontSideNavView' => 'AphrontView', 'AphrontTableView' => 'AphrontView', @@ -215,6 +220,7 @@ phutil_register_library_map(array( 'DifferentialRevision' => 'DifferentialDAO', 'DifferentialRevisionEditController' => 'DifferentialController', 'DifferentialRevisionListController' => 'DifferentialController', + 'PhabricatorAuthController' => 'PhabricatorController', 'PhabricatorConduitAPIController' => 'PhabricatorConduitController', 'PhabricatorConduitConnectionLog' => 'PhabricatorConduitDAO', 'PhabricatorConduitConsoleController' => 'PhabricatorConduitController', @@ -242,6 +248,7 @@ phutil_register_library_map(array( 'PhabricatorFileUploadController' => 'PhabricatorFileController', 'PhabricatorFileViewController' => 'PhabricatorFileController', 'PhabricatorLiskDAO' => 'LiskDAO', + 'PhabricatorLoginController' => 'PhabricatorAuthController', 'PhabricatorMailImplementationPHPMailerLiteAdapter' => 'PhabricatorMailImplementationAdapter', 'PhabricatorMetaMTAController' => 'PhabricatorController', 'PhabricatorMetaMTADAO' => 'PhabricatorLiskDAO', diff --git a/src/aphront/controller/AphrontController.php b/src/aphront/controller/AphrontController.php index ea55eda1f8..0ba389fd05 100644 --- a/src/aphront/controller/AphrontController.php +++ b/src/aphront/controller/AphrontController.php @@ -23,6 +23,10 @@ abstract class AphrontController { private $request; + public function willBeginExecution() { + return; + } + public function willProcessRequest(array $uri_data) { return; } diff --git a/src/aphront/default/configuration/AphrontDefaultApplicationConfiguration.php b/src/aphront/default/configuration/AphrontDefaultApplicationConfiguration.php index 977aa14cea..2cbc9e30f8 100644 --- a/src/aphront/default/configuration/AphrontDefaultApplicationConfiguration.php +++ b/src/aphront/default/configuration/AphrontDefaultApplicationConfiguration.php @@ -103,6 +103,8 @@ class AphrontDefaultApplicationConfiguration 'lists/edit/(?:(?\d+)/)?$' => 'PhabricatorMetaMTAMailingListEditController', ), + + '/login/' => 'PhabricatorLoginController', ); } diff --git a/src/aphront/exception/base/AphrontException.php b/src/aphront/exception/base/AphrontException.php new file mode 100644 index 0000000000..cfe38e6cf6 --- /dev/null +++ b/src/aphront/exception/base/AphrontException.php @@ -0,0 +1,21 @@ +uri = $uri; + } + + public function getURI() { + return $this->uri; + } + +} diff --git a/src/aphront/exception/redirect/__init__.php b/src/aphront/exception/redirect/__init__.php new file mode 100644 index 0000000000..0b69311903 --- /dev/null +++ b/src/aphront/exception/redirect/__init__.php @@ -0,0 +1,12 @@ +host = $host; @@ -88,4 +89,37 @@ class AphrontRequest { return $this->getExists(self::TYPE_FORM) && $this->isHTTPPost(); } + final public function getCookie($name, $default = null) { + return idx($_COOKIE, $name, $default); + } + + final public function clearCookie($name) { + $this->setCookie($name, '', time() - (60 * 60 * 24 * 30)); + } + + final public function setCookie($name, $value, $expire = null) { + if ($expire === null) { + $expire = time() + (60 * 60 * 24 * 365 * 5); + } + setcookie( + $name, + $value, + $expire, + $path = '/', + $domain = '', + $secure = false, + $http_only = true); + } + + final public function setUser($user) { + $this->user = $user; + return $this; + } + + final public function getUser() { + return $this->user; + } + + + } diff --git a/src/aphront/request/__init__.php b/src/aphront/request/__init__.php index 3b8c8f9a1d..a1f61c228e 100644 --- a/src/aphront/request/__init__.php +++ b/src/aphront/request/__init__.php @@ -6,5 +6,7 @@ +phutil_require_module('phutil', 'utils'); + phutil_require_source('AphrontRequest.php'); diff --git a/src/applications/auth/controlller/base/PhabricatorAuthController.php b/src/applications/auth/controlller/base/PhabricatorAuthController.php new file mode 100644 index 0000000000..58f0780aeb --- /dev/null +++ b/src/applications/auth/controlller/base/PhabricatorAuthController.php @@ -0,0 +1,33 @@ +buildStandardPageView(); + + $page->setApplicationName('Login'); + $page->setBaseURI('/login/'); + $page->setTitle(idx($data, 'title')); + $page->appendChild($view); + + $response = new AphrontWebpageResponse(); + return $response->setContent($page->render()); + } + +} diff --git a/src/applications/auth/controlller/base/__init__.php b/src/applications/auth/controlller/base/__init__.php new file mode 100644 index 0000000000..a0563c0c9a --- /dev/null +++ b/src/applications/auth/controlller/base/__init__.php @@ -0,0 +1,15 @@ +getRequest(); + + $error = false; + $login_name = $request->getCookie('phu'); + if ($request->isFormPost()) { + $login_name = $request->getStr('login'); + + $user = id(new PhabricatorUser())->loadOneWhere( + 'username = %s', + $login_name); + + $user->setPassword('asdf'); + $user->save(); + + $okay = false; + if ($user) { + if ($user->comparePassword($request->getStr('password'))) { + $conn_w = $user->establishConnection('w'); + + $urandom = fopen('/dev/urandom', 'r'); + if (!$urandom) { + throw new Exception("Failed to open /dev/urandom!"); + } + $entropy = fread($urandom, 20); + if (strlen($entropy) != 20) { + throw new Exception("Failed to read /dev/urandom!"); + } + + $session_key = sha1($entropy); + queryfx( + $conn_w, + 'INSERT INTO phabricator_session '. + '(userPHID, type, sessionKey, sessionStart)'. + ' VALUES '. + '(%s, %s, %s, UNIX_TIMESTAMP()) '. + 'ON DUPLICATE KEY UPDATE '. + 'sessionKey = VALUES(sessionKey), '. + 'sessionStart = VALUES(sessionStart)', + $user->getPHID(), + 'web', + $session_key); + + $request->setCookie('phusr', $user->getUsername()); + $request->setCookie('phsid', $session_key); + + return id(new AphrontRedirectResponse()) + ->setURI('/'); + } + } + + if (!$okay) { + $request->clearCookie('phusr'); + $request->clearCookie('phsid'); + } + + $error = true; + } + + $error_view = null; + if ($error) { + $error_view = new AphrontErrorView(); + $error_view->setTitle('Bad username/password.'); + } + + $form = new AphrontFormView(); + $form + ->setAction('/login/') + ->appendChild( + id(new AphrontFormTextControl()) + ->setLabel('Login') + ->setName('login') + ->setValue($login_name)) + ->appendChild( + id(new AphrontFormTextControl()) + ->setLabel('Password') + ->setName('password')) + ->appendChild( + id(new AphrontFormSubmitControl()) + ->setValue('Login')); + + + $panel = new AphrontPanelView(); + $panel->setHeader('Phabricator Login'); + $panel->setWidth(AphrontPanelView::WIDTH_FORM); + $panel->appendChild($form); + + return $this->buildStandardPageResponse( + array( + $error_view, + $panel, + ), + array( + 'title' => 'Login', + )); + } + +} diff --git a/src/applications/auth/controlller/login/__init__.php b/src/applications/auth/controlller/login/__init__.php new file mode 100644 index 0000000000..9909a8d0d4 --- /dev/null +++ b/src/applications/auth/controlller/login/__init__.php @@ -0,0 +1,21 @@ +getRequest(); + + $user = new PhabricatorUser(); + + $phusr = $request->getCookie('phusr'); + $phsid = $request->getCookie('phsid'); + + if ($phusr && $phsid) { + $info = queryfx_one( + $user->establishConnection('r'), + 'SELECT u.* FROM %T u JOIN %T s ON u.phid = s.userPHID + AND s.type = %s AND s.sessionKey = %s', + $user->getTableName(), + 'phabricator_session', + 'web', + $phsid); + if ($info) { + $user->loadFromArray($info); + } + } + + $request->setUser($user); + + if ($this->shouldRequireLogin() && !$user->getPHID()) { + throw new AphrontRedirectException('/login/'); + } + } + + public function buildStandardPageView() { + $view = new PhabricatorStandardPageView(); + $view->setRequest($this->getRequest()); + return $view; + } + public function buildStandardPageResponse($view) { - $page = new PhabricatorStandardPageView(); + $page = $this->buildStandardPageView(); $page->appendChild($view); $response = new AphrontWebpageResponse(); $response->setContent($page->render()); diff --git a/src/applications/base/controller/base/__init__.php b/src/applications/base/controller/base/__init__.php index 03cfc02dba..038d5108a6 100644 --- a/src/applications/base/controller/base/__init__.php +++ b/src/applications/base/controller/base/__init__.php @@ -7,7 +7,10 @@ phutil_require_module('phabricator', 'aphront/controller'); +phutil_require_module('phabricator', 'aphront/exception/redirect'); phutil_require_module('phabricator', 'aphront/response/webpage'); +phutil_require_module('phabricator', 'applications/people/storage/user'); +phutil_require_module('phabricator', 'storage/queryfx'); phutil_require_module('phabricator', 'view/page/standard'); diff --git a/src/applications/conduit/controller/base/PhabricatorConduitController.php b/src/applications/conduit/controller/base/PhabricatorConduitController.php index 48f75e5c5e..2af8cdbd54 100644 --- a/src/applications/conduit/controller/base/PhabricatorConduitController.php +++ b/src/applications/conduit/controller/base/PhabricatorConduitController.php @@ -19,7 +19,7 @@ abstract class PhabricatorConduitController extends PhabricatorController { public function buildStandardPageResponse($view, array $data) { - $page = new PhabricatorStandardPageView(); + $page = $this->buildStandardPageView(); $page->setApplicationName('Conduit'); $page->setBaseURI('/conduit/'); diff --git a/src/applications/conduit/controller/base/__init__.php b/src/applications/conduit/controller/base/__init__.php index 6dd4aa3801..a2fb05dbbf 100644 --- a/src/applications/conduit/controller/base/__init__.php +++ b/src/applications/conduit/controller/base/__init__.php @@ -8,7 +8,6 @@ phutil_require_module('phabricator', 'aphront/response/webpage'); phutil_require_module('phabricator', 'applications/base/controller/base'); -phutil_require_module('phabricator', 'view/page/standard'); phutil_require_module('phutil', 'utils'); diff --git a/src/applications/differential/controller/base/DifferentialController.php b/src/applications/differential/controller/base/DifferentialController.php index 2db79be80f..7d10a590db 100644 --- a/src/applications/differential/controller/base/DifferentialController.php +++ b/src/applications/differential/controller/base/DifferentialController.php @@ -22,7 +22,7 @@ abstract class DifferentialController extends PhabricatorController { require_celerity_resource('differential-core-view-css'); - $page = new PhabricatorStandardPageView(); + $page = $this->buildStandardPageView(); $page->setApplicationName('Differential'); $page->setBaseURI('/differential/'); diff --git a/src/applications/differential/controller/base/__init__.php b/src/applications/differential/controller/base/__init__.php index e2a4f7a73b..5e0ce69e00 100644 --- a/src/applications/differential/controller/base/__init__.php +++ b/src/applications/differential/controller/base/__init__.php @@ -9,7 +9,6 @@ phutil_require_module('phabricator', 'aphront/response/webpage'); phutil_require_module('phabricator', 'applications/base/controller/base'); phutil_require_module('phabricator', 'infratructure/celerity/api'); -phutil_require_module('phabricator', 'view/page/standard'); phutil_require_module('phutil', 'utils'); diff --git a/src/applications/directory/controller/base/PhabricatorDirectoryController.php b/src/applications/directory/controller/base/PhabricatorDirectoryController.php index 08e5d723f8..b86938b2a1 100644 --- a/src/applications/directory/controller/base/PhabricatorDirectoryController.php +++ b/src/applications/directory/controller/base/PhabricatorDirectoryController.php @@ -19,7 +19,7 @@ abstract class PhabricatorDirectoryController extends PhabricatorController { public function buildStandardPageResponse($view, array $data) { - $page = new PhabricatorStandardPageView(); + $page = $this->buildStandardPageView(); $page->setApplicationName('Directory'); $page->setBaseURI('/'); diff --git a/src/applications/directory/controller/base/__init__.php b/src/applications/directory/controller/base/__init__.php index bab124638d..e30b96d052 100644 --- a/src/applications/directory/controller/base/__init__.php +++ b/src/applications/directory/controller/base/__init__.php @@ -8,7 +8,6 @@ phutil_require_module('phabricator', 'aphront/response/webpage'); phutil_require_module('phabricator', 'applications/base/controller/base'); -phutil_require_module('phabricator', 'view/page/standard'); phutil_require_module('phutil', 'utils'); diff --git a/src/applications/files/controller/base/PhabricatorFileController.php b/src/applications/files/controller/base/PhabricatorFileController.php index 6ef76df91b..258c1cd4c1 100644 --- a/src/applications/files/controller/base/PhabricatorFileController.php +++ b/src/applications/files/controller/base/PhabricatorFileController.php @@ -19,7 +19,7 @@ abstract class PhabricatorFileController extends PhabricatorController { public function buildStandardPageResponse($view, array $data) { - $page = new PhabricatorStandardPageView(); + $page = $this->buildStandardPageView(); $page->setApplicationName('Files'); $page->setBaseURI('/file/'); diff --git a/src/applications/files/controller/base/__init__.php b/src/applications/files/controller/base/__init__.php index 16685a0b26..97ee9ef525 100644 --- a/src/applications/files/controller/base/__init__.php +++ b/src/applications/files/controller/base/__init__.php @@ -8,7 +8,6 @@ phutil_require_module('phabricator', 'aphront/response/webpage'); phutil_require_module('phabricator', 'applications/base/controller/base'); -phutil_require_module('phabricator', 'view/page/standard'); phutil_require_module('phutil', 'utils'); diff --git a/src/applications/metamta/controller/base/PhabricatorMetaMTAController.php b/src/applications/metamta/controller/base/PhabricatorMetaMTAController.php index 2f68d22a9c..8e29ff71cb 100644 --- a/src/applications/metamta/controller/base/PhabricatorMetaMTAController.php +++ b/src/applications/metamta/controller/base/PhabricatorMetaMTAController.php @@ -19,7 +19,7 @@ abstract class PhabricatorMetaMTAController extends PhabricatorController { public function buildStandardPageResponse($view, array $data) { - $page = new PhabricatorStandardPageView(); + $page = $this->buildStandardPageView(); $page->setApplicationName('MetaMTA'); $page->setBaseURI('/mail/'); diff --git a/src/applications/metamta/controller/base/__init__.php b/src/applications/metamta/controller/base/__init__.php index 23abc13fab..d961d62e8e 100644 --- a/src/applications/metamta/controller/base/__init__.php +++ b/src/applications/metamta/controller/base/__init__.php @@ -8,7 +8,6 @@ phutil_require_module('phabricator', 'aphront/response/webpage'); phutil_require_module('phabricator', 'applications/base/controller/base'); -phutil_require_module('phabricator', 'view/page/standard'); phutil_require_module('phutil', 'utils'); diff --git a/src/applications/people/controller/base/PhabricatorPeopleController.php b/src/applications/people/controller/base/PhabricatorPeopleController.php index 96c682a0b7..7c188b672c 100644 --- a/src/applications/people/controller/base/PhabricatorPeopleController.php +++ b/src/applications/people/controller/base/PhabricatorPeopleController.php @@ -19,7 +19,7 @@ abstract class PhabricatorPeopleController extends PhabricatorController { public function buildStandardPageResponse($view, array $data) { - $page = new PhabricatorStandardPageView(); + $page = $this->buildStandardPageView(); $page->setApplicationName('People'); $page->setBaseURI('/people/'); diff --git a/src/applications/people/controller/base/__init__.php b/src/applications/people/controller/base/__init__.php index 9544894bc6..792184c7d0 100644 --- a/src/applications/people/controller/base/__init__.php +++ b/src/applications/people/controller/base/__init__.php @@ -8,7 +8,6 @@ phutil_require_module('phabricator', 'aphront/response/webpage'); phutil_require_module('phabricator', 'applications/base/controller/base'); -phutil_require_module('phabricator', 'view/page/standard'); phutil_require_module('phutil', 'utils'); diff --git a/src/applications/people/storage/user/PhabricatorUser.php b/src/applications/people/storage/user/PhabricatorUser.php index 4fca6126c1..64417b55a3 100644 --- a/src/applications/people/storage/user/PhabricatorUser.php +++ b/src/applications/people/storage/user/PhabricatorUser.php @@ -24,6 +24,8 @@ class PhabricatorUser extends PhabricatorUserDAO { protected $userName; protected $realName; protected $email; + protected $passwordSalt; + protected $passwordHash; public function getConfiguration() { return array( @@ -35,4 +37,27 @@ class PhabricatorUser extends PhabricatorUserDAO { return PhabricatorPHID::generateNewPHID(self::PHID_TYPE); } + public function setPassword($password) { + $this->setPasswordSalt(md5(mt_rand())); + $hash = $this->hashPassword($password); + $this->setPasswordHash($hash); + return $this; + } + + public function comparePassword($password) { + $password = $this->hashPassword($password); + return ($password === $this->getPasswordHash()); + } + + private function hashPassword($password) { + $password = $this->getUsername(). + $password. + $this->getPHID(). + $this->getPasswordSalt(); + for ($ii = 0; $ii < 1000; $ii++) { + $password = md5($password); + } + return $password; + } + } diff --git a/src/applications/phid/controller/base/PhabricatorPHIDController.php b/src/applications/phid/controller/base/PhabricatorPHIDController.php index 0b5b089234..1bb234fb5f 100644 --- a/src/applications/phid/controller/base/PhabricatorPHIDController.php +++ b/src/applications/phid/controller/base/PhabricatorPHIDController.php @@ -19,7 +19,7 @@ abstract class PhabricatorPHIDController extends PhabricatorController { public function buildStandardPageResponse($view, array $data) { - $page = new PhabricatorStandardPageView(); + $page = $this->buildStandardPageView(); $page->setApplicationName('PHID'); $page->setBaseURI('/phid/'); diff --git a/src/applications/phid/controller/base/__init__.php b/src/applications/phid/controller/base/__init__.php index 44f0f1b94d..17a9f28a12 100644 --- a/src/applications/phid/controller/base/__init__.php +++ b/src/applications/phid/controller/base/__init__.php @@ -8,7 +8,6 @@ phutil_require_module('phabricator', 'aphront/response/webpage'); phutil_require_module('phabricator', 'applications/base/controller/base'); -phutil_require_module('phabricator', 'view/page/standard'); phutil_require_module('phutil', 'utils'); diff --git a/src/view/page/standard/PhabricatorStandardPageView.php b/src/view/page/standard/PhabricatorStandardPageView.php index e8e544d43b..8f3adddbfc 100755 --- a/src/view/page/standard/PhabricatorStandardPageView.php +++ b/src/view/page/standard/PhabricatorStandardPageView.php @@ -24,6 +24,16 @@ class PhabricatorStandardPageView extends AphrontPageView { private $selectedTab; private $glyph; private $bodyContent; + private $request; + + public function setRequest($request) { + $this->request = $request; + return $this; + } + + public function getRequest() { + return $this->request; + } public function setApplicationName($application_name) { $this->applicationName = $application_name; @@ -102,9 +112,20 @@ class PhabricatorStandardPageView extends AphrontPageView { $tabs = ''.$tabs.''; } + $login_stuff = null; + $request = $this->getRequest(); + $user = $request->getUser(); + + if ($user->getPHID()) { + $login_stuff = 'Logged in as '.phutil_escape_html($user->getUsername()); + } + return '
'. '
'. + ''. 'Phabricator '. phutil_render_tag( 'a', diff --git a/webroot/index.php b/webroot/index.php index 0a98a88566..ca2a0ab82d 100644 --- a/webroot/index.php +++ b/webroot/index.php @@ -38,9 +38,14 @@ $application->setPath($path); $request = $application->buildRequest(); $application->setRequest($request); list($controller, $uri_data) = $application->buildController(); -$controller->willProcessRequest($uri_data); try { + $controller->willBeginExecution(); + + $controller->willProcessRequest($uri_data); $response = $controller->processRequest(); +} catch (AphrontRedirectException $ex) { + $response = id(new AphrontRedirectResponse()) + ->setURI($ex->getURI()); } catch (Exception $ex) { $response = $application->handleException($ex); } diff --git a/webroot/rsrc/css/application/base/standard-page-view.css b/webroot/rsrc/css/application/base/standard-page-view.css index cdc97ace79..164b6da120 100644 --- a/webroot/rsrc/css/application/base/standard-page-view.css +++ b/webroot/rsrc/css/application/base/standard-page-view.css @@ -46,3 +46,7 @@ padding: 0 1em; text-transform: uppercase; } + +.phabricator-login-details { + float: right; +}