public static function loadNeedAttentionRevisions(PhabricatorUser $viewer) { if (!$viewer->isLoggedIn()) { return array(); } $viewer_phid = $viewer->getPHID(); $responsible_phids = id(new DifferentialResponsibleDatasource())->setViewer($viewer)->evaluateTokens(array($viewer_phid)); $revision_query = id(new DifferentialRevisionQuery())->setViewer($viewer)->withStatus(DifferentialRevisionQuery::STATUS_OPEN)->withResponsibleUsers($responsible_phids)->needReviewerStatus(true)->needRelationships(true)->needFlags(true)->needDrafts(true)->setLimit(self::MAX_STATUS_ITEMS); $revisions = $revision_query->execute(); $query = id(new PhabricatorSavedQuery())->attachParameterMap(array('responsiblePHIDs' => $responsible_phids)); $groups = id(new DifferentialRevisionRequiredActionResultBucket())->setViewer($viewer)->newResultGroups($query, $revisions); $include = array(); foreach ($groups as $group) { switch ($group->getKey()) { case DifferentialRevisionRequiredActionResultBucket::KEY_MUSTREVIEW: case DifferentialRevisionRequiredActionResultBucket::KEY_SHOULDREVIEW: foreach ($group->getObjects() as $object) { $include[] = $object; } break; default: break; } } return $include; }
public function buildMainMenuItems(PhabricatorUser $user, PhabricatorController $controller = null) { $items = array(); if ($user->isLoggedIn() && $user->isUserActivated()) { $selected = $controller instanceof PhabricatorSettingsMainController; $item = id(new PHUIListItemView())->setName(pht('Settings'))->setIcon('settings-sm')->addClass('core-menu-item')->setSelected($selected)->setHref('/settings/')->setAural(pht('Settings'))->setOrder(400); $items[] = $item; } return $items; }
public function buildMainMenuItems(PhabricatorUser $user, PhabricatorController $controller = null) { $items = array(); if ($user->isLoggedIn() && $user->isUserActivated()) { $create_id = celerity_generate_unique_node_id(); Javelin::initBehavior('aphlict-dropdown', array('bubbleID' => $create_id, 'dropdownID' => 'phabricator-quick-create-menu', 'local' => true, 'desktop' => true, 'right' => true)); $item = id(new PHUIListItemView())->setName(pht('Create New...'))->setIcon('new-sm')->addClass('core-menu-item')->setHref('/home/create/')->addSigil('quick-create-menu')->setID($create_id)->setAural(pht('Quick Create'))->setOrder(300); $items[] = $item; } return $items; }
public function buildMainMenuItems(PhabricatorUser $user, PhabricatorController $controller = null) { $items = array(); if ($user->isLoggedIn() && $user->isUserActivated()) { $image = $user->loadProfileImageURI(); $item = id(new PHUIListItemView())->setName($user->getUsername())->setHref('/p/' . $user->getUsername() . '/')->addClass('core-menu-item')->setAural(pht('Profile'))->setOrder(100); $classes = array('phabricator-core-menu-icon', 'phabricator-core-menu-profile-image'); $item->appendChild(phutil_tag('span', array('class' => implode(' ', $classes), 'style' => 'background-image: url(' . $image . ')'), '')); $items[] = $item; } return $items; }
public function loadStatus(PhabricatorUser $user) { $status = array(); if (!$user->isLoggedIn()) { return $status; } $query = id(new ManiphestTaskQuery())->setViewer($user)->withStatuses(ManiphestTaskStatus::getOpenStatusConstants())->withOwners(array($user->getPHID()))->setLimit(self::MAX_STATUS_ITEMS); $count = count($query->execute()); $count_str = self::formatStatusCount($count, '%s Assigned Tasks', '%d Assigned Task(s)'); $type = PhabricatorApplicationStatusView::TYPE_WARNING; $status[] = id(new PhabricatorApplicationStatusView())->setType($type)->setText($count_str)->setCount($count); return $status; }
public function buildMainMenuItems(PhabricatorUser $user, PhabricatorController $controller = null) { $items = array(); if ($user->isLoggedIn()) { $item = id(new PHUIListItemView())->addClass('core-menu-item')->setName(pht('Log Out'))->setIcon('logout-sm')->setWorkflow(true)->setHref('/logout/')->setSelected($controller instanceof PhabricatorLogoutController)->setAural(pht('Log Out'))->setOrder(900); $items[] = $item; } else { if ($controller instanceof PhabricatorAuthController) { // Don't show the "Login" item on auth controllers, since they're // generally all related to logging in anyway. } else { $item = id(new PHUIListItemView())->addClass('core-menu-item')->setName(pht('Log In'))->setIcon('power')->setHref('/auth/start/')->setAural(pht('Log In'))->setOrder(900); $items[] = $item; } } return $items; }
public function buildMainMenuItems(PhabricatorUser $user, PhabricatorController $controller = null) { $items = array(); if ($controller instanceof PhabricatorSettingsMainController) { $class = 'main-menu-item-icon-settings-selected'; } else { $class = 'main-menu-item-icon-settings'; } if ($user->isLoggedIn()) { $item = new PhabricatorMainMenuIconView(); $item->setName(pht('Settings')); $item->addClass('autosprite main-menu-item-icon ' . $class); $item->setHref('/settings/'); $item->setSortOrder(0.9); $items[] = $item; } return $items; }
public function buildMainMenuItems(PhabricatorUser $user, PhabricatorController $controller = null) { $items = array(); if ($controller instanceof PhabricatorLogoutController) { $class = 'main-menu-item-icon-logout-selected'; } else { $class = 'main-menu-item-icon-logout'; } if ($user->isLoggedIn()) { $item = new PhabricatorMainMenuIconView(); $item->setName(pht('Log Out')); $item->addClass('autosprite main-menu-item-icon ' . $class); $item->setWorkflow(true); $item->setHref('/logout/'); $item->setSortOrder(1.0); $items[] = $item; } return $items; }
public function isExtensionEnabledForViewer(PhabricatorUser $viewer) { if (!$viewer->isLoggedIn()) { return false; } if (!$viewer->isUserActivated()) { return false; } // Don't show menus for users with partial sessions. This usually means // they have logged in but have not made it through MFA, so we don't want // to show notification counts, saved queries, etc. if (!$viewer->hasSession()) { return false; } if ($viewer->getSession()->getIsPartial()) { return false; } return true; }
public function buildMainMenuItems(PhabricatorUser $user, PhabricatorController $controller = null) { $items = array(); if ($controller instanceof PhabricatorPeopleProfileController && $controller->getProfileUser() && $controller->getProfileUser()->getPHID() == $user->getPHID()) { $class = 'main-menu-item-icon-profile-selected'; } else { $class = 'main-menu-item-icon-profile-not-selected'; } if ($user->isLoggedIn()) { $image = $user->loadProfileImageURI(); $item = new PhabricatorMainMenuIconView(); $item->setName($user->getUsername()); $item->addClass('main-menu-item-icon-profile ' . $class); $item->addStyle('background-image: url(' . $image . ')'); $item->setHref('/p/' . $user->getUsername() . '/'); $item->setSortOrder(0.0); $items[] = $item; } return $items; }
public function buildMainMenuItems(PhabricatorUser $user, PhabricatorController $controller = null) { $items = array(); if ($user->isLoggedIn()) { $item = id(new PHUIListItemView())->addClass('core-menu-item')->setName(pht('Log Out'))->setIcon('fa-sign-out')->setWorkflow(true)->setHref('/logout/')->setSelected($controller instanceof PhabricatorLogoutController)->setAural(pht('Log Out'))->setOrder(900); $items[] = $item; } else { if ($controller instanceof PhabricatorAuthController) { // Don't show the "Login" item on auth controllers, since they're // generally all related to logging in anyway. } else { $uri = new PhutilURI('/auth/start/'); if ($controller) { $path = $controller->getRequest()->getPath(); $uri->setQueryParam('next', $path); } $item = id(new PHUIListItemView())->addClass('core-menu-item')->setName(pht('Log In'))->setIcon('fa-sign-in')->setHref($uri)->setAural(pht('Log In'))->setOrder(900); $items[] = $item; } } return $items; }
public static function loadClusterTokenForUser(PhabricatorUser $user) { if (!$user->isLoggedIn()) { return null; } $tokens = id(new PhabricatorConduitTokenQuery())->setViewer($user)->withObjectPHIDs(array($user->getPHID()))->withTokenTypes(array(self::TYPE_CLUSTER))->withExpired(false)->execute(); // Only return a token if it has at least 5 minutes left before // expiration. Cluster tokens cycle regularly, so we don't want to use // one that's going to expire momentarily. $now = PhabricatorTime::getNow(); $must_expire_after = $now + phutil_units('5 minutes in seconds'); foreach ($tokens as $token) { if ($token->getExpires() > $must_expire_after) { return $token; } } // We didn't find any existing tokens (or the existing tokens are all about // to expire) so generate a new token. $unguarded = AphrontWriteGuard::beginScopedUnguardedWrites(); $token = self::initializeNewToken($user->getPHID(), self::TYPE_CLUSTER); $token->save(); unset($unguarded); return $token; }
protected function processDiffusionRequest(AphrontRequest $request) { $callsign = self::getCallsign($request); // If authentication credentials have been provided, try to find a user // that actually matches those credentials. if (isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) { $username = $_SERVER['PHP_AUTH_USER']; $password = new PhutilOpaqueEnvelope($_SERVER['PHP_AUTH_PW']); $viewer = $this->authenticateHTTPRepositoryUser($username, $password); if (!$viewer) { return new PhabricatorVCSResponse(403, pht('Invalid credentials.')); } } else { // User hasn't provided credentials, which means we count them as // being "not logged in". $viewer = new PhabricatorUser(); } $allow_public = PhabricatorEnv::getEnvConfig('policy.allow-public'); $allow_auth = PhabricatorEnv::getEnvConfig('diffusion.allow-http-auth'); if (!$allow_public) { if (!$viewer->isLoggedIn()) { if ($allow_auth) { return new PhabricatorVCSResponse(401, pht('You must log in to access repositories.')); } else { return new PhabricatorVCSResponse(403, pht('Public and authenticated HTTP access are both forbidden.')); } } } try { $repository = id(new PhabricatorRepositoryQuery())->setViewer($viewer)->withCallsigns(array($callsign))->executeOne(); if (!$repository) { return new PhabricatorVCSResponse(404, pht('No such repository exists.')); } } catch (PhabricatorPolicyException $ex) { if ($viewer->isLoggedIn()) { return new PhabricatorVCSResponse(403, pht('You do not have permission to access this repository.')); } else { if ($allow_auth) { return new PhabricatorVCSResponse(401, pht('You must log in to access this repository.')); } else { return new PhabricatorVCSResponse(403, pht('This repository requires authentication, which is forbidden ' . 'over HTTP.')); } } } if (!$repository->isTracked()) { return new PhabricatorVCSResponse(403, pht('This repository is inactive.')); } $is_push = !$this->isReadOnlyRequest($repository); switch ($repository->getServeOverHTTP()) { case PhabricatorRepository::SERVE_READONLY: if ($is_push) { return new PhabricatorVCSResponse(403, pht('This repository is read-only over HTTP.')); } break; case PhabricatorRepository::SERVE_READWRITE: if ($is_push) { $can_push = PhabricatorPolicyFilter::hasCapability($viewer, $repository, DiffusionPushCapability::CAPABILITY); if (!$can_push) { if ($viewer->isLoggedIn()) { return new PhabricatorVCSResponse(403, pht('You do not have permission to push to this repository.')); } else { if ($allow_auth) { return new PhabricatorVCSResponse(401, pht('You must log in to push to this repository.')); } else { return new PhabricatorVCSResponse(403, pht('Pushing to this repository requires authentication, ' . 'which is forbidden over HTTP.')); } } } } break; case PhabricatorRepository::SERVE_OFF: default: return new PhabricatorVCSResponse(403, pht('This repository is not available over HTTP.')); } $vcs_type = $repository->getVersionControlSystem(); $req_type = $this->isVCSRequest($request); if ($vcs_type != $req_type) { switch ($req_type) { case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT: $result = new PhabricatorVCSResponse(500, pht('This is not a Git repository.')); break; case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL: $result = new PhabricatorVCSResponse(500, pht('This is not a Mercurial repository.')); break; case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN: $result = new PhabricatorVCSResponse(500, pht('This is not a Subversion repository.')); break; default: $result = new PhabricatorVCSResponse(500, pht('Unknown request type.')); break; } } else { switch ($vcs_type) { case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT: case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL: $result = $this->serveVCSRequest($repository, $viewer); break; case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN: $result = new PhabricatorVCSResponse(500, pht('Phabricator does not support HTTP access to Subversion ' . 'repositories.')); break; default: $result = new PhabricatorVCSResponse(500, pht('Unknown version control system.')); break; } } $code = $result->getHTTPResponseCode(); if ($is_push && $code == 200) { $unguarded = AphrontWriteGuard::beginScopedUnguardedWrites(); $repository->writeStatusMessage(PhabricatorRepositoryStatusMessage::TYPE_NEEDS_UPDATE, PhabricatorRepositoryStatusMessage::CODE_OKAY); unset($unguarded); } return $result; }
private function shouldJoinForViewer(PhabricatorUser $viewer) { if ($viewer->isLoggedIn() && $this->ids === null && $this->phids === null) { return true; } return false; }
public function getDisplayIconLabel(PhabricatorUser $viewer) { if ($this->getIsCancelled()) { return pht('Cancelled'); } if ($viewer->isLoggedIn()) { $status = $this->getUserInviteStatus($viewer->getPHID()); switch ($status) { case PhabricatorCalendarEventInvitee::STATUS_ATTENDING: return pht('Attending'); case PhabricatorCalendarEventInvitee::STATUS_INVITED: return pht('Invited'); case PhabricatorCalendarEventInvitee::STATUS_DECLINED: return pht('Declined'); } } return null; }
public function handleException(Exception $ex) { $request = $this->getRequest(); // For Conduit requests, return a Conduit response. if ($request->isConduit()) { $response = new ConduitAPIResponse(); $response->setErrorCode(get_class($ex)); $response->setErrorInfo($ex->getMessage()); return id(new AphrontJSONResponse())->setContent($response->toDictionary()); } // For non-workflow requests, return a Ajax response. if ($request->isAjax() && !$request->isJavelinWorkflow()) { $response = new AphrontAjaxResponse(); $response->setError(array('code' => get_class($ex), 'info' => $ex->getMessage())); return $response; } $is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business'); $user = $request->getUser(); if (!$user) { // If we hit an exception very early, we won't have a user. $user = new PhabricatorUser(); } if ($ex instanceof PhabricatorPolicyException) { if (!$user->isLoggedIn()) { // If the user isn't logged in, just give them a login form. This is // probably a generally more useful response than a policy dialog that // they have to click through to get a login form. // // Possibly we should add a header here like "you need to login to see // the thing you are trying to look at". $login_controller = new PhabricatorLoginController($request); return $login_controller->processRequest(); } $content = '<div class="aphront-policy-exception">' . phutil_escape_html($ex->getMessage()) . '</div>'; $dialog = new AphrontDialogView(); $dialog->setTitle($is_serious ? 'Access Denied' : "You Shall Not Pass")->setClass('aphront-access-dialog')->setUser($user)->appendChild($content); if ($this->getRequest()->isAjax()) { $dialog->addCancelButton('/', 'Close'); } else { $dialog->addCancelButton('/', $is_serious ? 'OK' : 'Away With Thee'); } $response = new AphrontDialogResponse(); $response->setDialog($dialog); return $response; } if ($ex instanceof AphrontUsageException) { $error = new AphrontErrorView(); $error->setTitle(phutil_escape_html($ex->getTitle())); $error->appendChild(phutil_escape_html($ex->getMessage())); $view = new PhabricatorStandardPageView(); $view->setRequest($this->getRequest()); $view->appendChild($error); $response = new AphrontWebpageResponse(); $response->setContent($view->render()); return $response; } // Always log the unhandled exception. phlog($ex); $class = phutil_escape_html(get_class($ex)); $message = phutil_escape_html($ex->getMessage()); if ($ex instanceof AphrontQuerySchemaException) { $message .= "\n\n" . "NOTE: This usually indicates that the MySQL schema has not been " . "properly upgraded. Run 'bin/storage upgrade' to ensure your " . "schema is up to date."; } if (PhabricatorEnv::getEnvConfig('phabricator.show-stack-traces')) { $trace = $this->renderStackTrace($ex->getTrace(), $user); } else { $trace = null; } $content = '<div class="aphront-unhandled-exception">' . '<div class="exception-message">' . $message . '</div>' . $trace . '</div>'; $dialog = new AphrontDialogView(); $dialog->setTitle('Unhandled Exception ("' . $class . '")')->setClass('aphront-exception-dialog')->setUser($user)->appendChild($content); if ($this->getRequest()->isAjax()) { $dialog->addCancelButton('/', 'Close'); } $response = new AphrontDialogResponse(); $response->setDialog($dialog); return $response; }
private function buildFilterMenu(PhabricatorUser $viewer, $custom_query, PhabricatorApplicationSearchEngine $engine, $query_key) { $filter_icon = id(new PHUIIconView())->setIconFont('fa-search-plus bluegrey'); $named = array('open' => pht('Open Tasks'), 'all' => pht('All Tasks')); if ($viewer->isLoggedIn()) { $named['assigned'] = pht('Assigned to Me'); } if ($custom_query) { $named[$custom_query->getQueryKey()] = pht('Custom Filter'); } $items = array(); foreach ($named as $key => $name) { $is_selected = $key == $query_key; if ($is_selected) { $active_filter = $name; } $is_custom = false; if ($custom_query) { $is_custom = $key == $custom_query->getQueryKey(); } $item = id(new PhabricatorActionView())->setIcon('fa-search')->setSelected($is_selected)->setName($name); if ($is_custom) { $uri = $this->getApplicationURI('board/' . $this->id . '/filter/query/' . $key . '/'); $item->setWorkflow(true); } else { $uri = $engine->getQueryResultsPageURI($key); } $uri = $this->getURIWithState($uri); $item->setHref($uri); $items[] = $item; } $items[] = id(new PhabricatorActionView())->setIcon('fa-cog')->setHref($this->getApplicationURI('board/' . $this->id . '/filter/'))->setWorkflow(true)->setName(pht('Advanced Filter...')); $filter_menu = id(new PhabricatorActionListView())->setUser($viewer); foreach ($items as $item) { $filter_menu->addAction($item); } $filter_button = id(new PHUIButtonView())->setText(pht('Filter: %s', $active_filter))->setIcon($filter_icon)->setTag('a')->setHref('#')->addSigil('boards-dropdown-menu')->setMetadata(array('items' => hsprintf('%s', $filter_menu))); return $filter_button; }
private function buildFilterMenu(PhabricatorUser $viewer, PhabricatorProject $project, $custom_query, PhabricatorApplicationSearchEngine $engine, $query_key) { $named = array('open' => pht('Open Tasks'), 'all' => pht('All Tasks')); if ($viewer->isLoggedIn()) { $named['assigned'] = pht('Assigned to Me'); } if ($custom_query) { $named[$custom_query->getQueryKey()] = pht('Custom Filter'); } $items = array(); foreach ($named as $key => $name) { $is_selected = $key == $query_key; if ($is_selected) { $active_filter = $name; } $is_custom = false; if ($custom_query) { $is_custom = $key == $custom_query->getQueryKey(); } $item = id(new PhabricatorActionView())->setIcon('fa-search')->setSelected($is_selected)->setName($name); if ($is_custom) { $uri = $this->getApplicationURI('board/' . $this->id . '/filter/query/' . $key . '/'); $item->setWorkflow(true); } else { $uri = $engine->getQueryResultsPageURI($key); } $uri = $this->getURIWithState($uri)->setQueryParam('filter', null); $item->setHref($uri); $items[] = $item; } $id = $project->getID(); $filter_uri = $this->getApplicationURI("board/{$id}/filter/"); $filter_uri = $this->getURIWithState($filter_uri, $force = true); $items[] = id(new PhabricatorActionView())->setIcon('fa-cog')->setHref($filter_uri)->setWorkflow(true)->setName(pht('Advanced Filter...')); $save_uri = "default/{$id}/filter/"; $save_uri = $this->getApplicationURI($save_uri); $save_uri = $this->getURIWithState($save_uri, $force = true); $can_edit = PhabricatorPolicyFilter::hasCapability($viewer, $project, PhabricatorPolicyCapability::CAN_EDIT); $items[] = id(new PhabricatorActionView())->setIcon('fa-floppy-o')->setName(pht('Save as Default'))->setHref($save_uri)->setWorkflow(true)->setDisabled(!$can_edit); $filter_menu = id(new PhabricatorActionListView())->setUser($viewer); foreach ($items as $item) { $filter_menu->addAction($item); } $filter_button = id(new PHUIListItemView())->setName($active_filter)->setIcon('fa-search')->setHref('#')->addSigil('boards-dropdown-menu')->setMetadata(array('items' => hsprintf('%s', $filter_menu))); return $filter_button; }