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;
 }