Path: blob/master/src/applications/diffusion/controller/DiffusionRepositoryURIViewController.php
12242 views
<?php12final class DiffusionRepositoryURIViewController3extends DiffusionController {45public function handleRequest(AphrontRequest $request) {6$response = $this->loadDiffusionContext();7if ($response) {8return $response;9}1011$viewer = $this->getViewer();12$drequest = $this->getDiffusionRequest();13$repository = $drequest->getRepository();14$id = $request->getURIData('id');1516$uri = id(new PhabricatorRepositoryURIQuery())17->setViewer($viewer)18->withIDs(array($id))19->withRepositories(array($repository))20->executeOne();21if (!$uri) {22return new Aphront404Response();23}2425// For display, access the URI by loading it through the repository. This26// may adjust builtin URIs for repository configuration, so we may end up27// with a different view of builtin URIs than we'd see if we loaded them28// directly from the database. See T12884.2930$repository_uris = $repository->getURIs();31$repository_uris = mpull($repository_uris, null, 'getID');32$uri = idx($repository_uris, $uri->getID());33if (!$uri) {34return new Aphront404Response();35}3637$title = array(38pht('URI'),39$repository->getDisplayName(),40);4142$crumbs = $this->buildApplicationCrumbs();43$crumbs->setBorder(true);44$crumbs->addTextCrumb(45$repository->getDisplayName(),46$repository->getURI());47$crumbs->addTextCrumb(48pht('Manage'),49$repository->getPathURI('manage/'));5051$panel_label = id(new DiffusionRepositoryURIsManagementPanel())52->getManagementPanelLabel();53$panel_uri = $repository->getPathURI('manage/uris/');54$crumbs->addTextCrumb($panel_label, $panel_uri);5556$crumbs->addTextCrumb(pht('URI %d', $uri->getID()));5758$header_text = pht(59'%s: URI %d',60$repository->getDisplayName(),61$uri->getID());6263$header = id(new PHUIHeaderView())64->setHeader($header_text)65->setHeaderIcon('fa-pencil');66if ($uri->getIsDisabled()) {67$header->setStatus('fa-ban', 'dark', pht('Disabled'));68} else {69$header->setStatus('fa-check', 'bluegrey', pht('Active'));70}7172$curtain = $this->buildCurtain($uri);73$details = $this->buildPropertySection($uri);7475$timeline = $this->buildTransactionTimeline(76$uri,77new PhabricatorRepositoryURITransactionQuery());78$timeline->setShouldTerminate(true);7980$view = id(new PHUITwoColumnView())81->setHeader($header)82->setMainColumn(83array(84$details,85$timeline,86))87->setCurtain($curtain);8889return $this->newPage()90->setTitle($title)91->setCrumbs($crumbs)92->appendChild($view);93}9495private function buildCurtain(PhabricatorRepositoryURI $uri) {96$viewer = $this->getViewer();97$repository = $uri->getRepository();98$id = $uri->getID();99100$can_edit = PhabricatorPolicyFilter::hasCapability(101$viewer,102$uri,103PhabricatorPolicyCapability::CAN_EDIT);104105$curtain = $this->newCurtainView($uri);106107$edit_uri = $uri->getEditURI();108109$curtain->addAction(110id(new PhabricatorActionView())111->setIcon('fa-pencil')112->setName(pht('Edit URI'))113->setHref($edit_uri)114->setWorkflow(!$can_edit)115->setDisabled(!$can_edit));116117$credential_uri = $repository->getPathURI("uri/credential/{$id}/edit/");118$remove_uri = $repository->getPathURI("uri/credential/{$id}/remove/");119$has_credential = (bool)$uri->getCredentialPHID();120121if ($uri->isBuiltin()) {122$can_credential = false;123} else if (!$uri->newCommandEngine()->isCredentialSupported()) {124$can_credential = false;125} else {126$can_credential = true;127}128129$can_update = ($can_edit && $can_credential);130$can_remove = ($can_edit && $has_credential);131132if ($has_credential) {133$credential_name = pht('Update Credential');134} else {135$credential_name = pht('Set Credential');136}137138$curtain->addAction(139id(new PhabricatorActionView())140->setIcon('fa-key')141->setName($credential_name)142->setHref($credential_uri)143->setWorkflow(true)144->setDisabled(!$can_edit));145146$curtain->addAction(147id(new PhabricatorActionView())148->setIcon('fa-times')149->setName(pht('Remove Credential'))150->setHref($remove_uri)151->setWorkflow(true)152->setDisabled(!$can_remove));153154if ($uri->getIsDisabled()) {155$disable_name = pht('Enable URI');156$disable_icon = 'fa-check';157} else {158$disable_name = pht('Disable URI');159$disable_icon = 'fa-ban';160}161162$can_disable = ($can_edit && !$uri->isBuiltin());163164$disable_uri = $repository->getPathURI("uri/disable/{$id}/");165166$curtain->addAction(167id(new PhabricatorActionView())168->setIcon($disable_icon)169->setName($disable_name)170->setHref($disable_uri)171->setWorkflow(true)172->setDisabled(!$can_disable));173174return $curtain;175}176177private function buildPropertySection(PhabricatorRepositoryURI $uri) {178$viewer = $this->getViewer();179180$properties = id(new PHUIPropertyListView())181->setUser($viewer);182183$properties->addProperty(pht('URI'), $uri->getDisplayURI());184185$credential_phid = $uri->getCredentialPHID();186$command_engine = $uri->newCommandEngine();187$is_optional = $command_engine->isCredentialOptional();188$is_supported = $command_engine->isCredentialSupported();189$is_builtin = $uri->isBuiltin();190191if ($is_builtin) {192$credential_icon = 'fa-circle-o';193$credential_color = 'grey';194$credential_label = pht('Builtin');195$credential_note = pht('Builtin URIs do not use credentials.');196} else if (!$is_supported) {197$credential_icon = 'fa-circle-o';198$credential_color = 'grey';199$credential_label = pht('Not Supported');200$credential_note = pht('This protocol does not support authentication.');201} else if (!$credential_phid) {202if ($is_optional) {203$credential_icon = 'fa-circle-o';204$credential_color = 'green';205$credential_label = pht('No Credential');206$credential_note = pht('Configured for anonymous access.');207} else {208$credential_icon = 'fa-times';209$credential_color = 'red';210$credential_label = pht('Required');211$credential_note = pht('Credential required but not configured.');212}213} else {214// Don't raise a policy exception if we can't see the credential.215$credentials = id(new PassphraseCredentialQuery())216->setViewer($viewer)217->withPHIDs(array($credential_phid))218->execute();219$credential = head($credentials);220221if (!$credential) {222$handles = $viewer->loadHandles(array($credential_phid));223$handle = $handles[$credential_phid];224if ($handle->getPolicyFiltered()) {225$credential_icon = 'fa-lock';226$credential_color = 'grey';227$credential_label = pht('Restricted');228$credential_note = pht(229'You do not have permission to view the configured '.230'credential.');231} else {232$credential_icon = 'fa-times';233$credential_color = 'red';234$credential_label = pht('Invalid');235$credential_note = pht('Configured credential is invalid.');236}237} else {238$provides = $credential->getProvidesType();239$needs = $command_engine->getPassphraseProvidesCredentialType();240if ($provides != $needs) {241$credential_icon = 'fa-times';242$credential_color = 'red';243$credential_label = pht('Wrong Type');244} else {245$credential_icon = 'fa-check';246$credential_color = 'green';247$credential_label = $command_engine->getPassphraseCredentialLabel();248}249$credential_note = $viewer->renderHandle($credential_phid);250}251}252253$credential_item = id(new PHUIStatusItemView())254->setIcon($credential_icon, $credential_color)255->setTarget(phutil_tag('strong', array(), $credential_label))256->setNote($credential_note);257258$credential_view = id(new PHUIStatusListView())259->addItem($credential_item);260261$properties->addProperty(pht('Credential'), $credential_view);262263264$io_type = $uri->getEffectiveIOType();265$io_map = PhabricatorRepositoryURI::getIOTypeMap();266$io_spec = idx($io_map, $io_type, array());267268$io_icon = idx($io_spec, 'icon');269$io_color = idx($io_spec, 'color');270$io_label = idx($io_spec, 'label', $io_type);271$io_note = idx($io_spec, 'note');272273$io_item = id(new PHUIStatusItemView())274->setIcon($io_icon, $io_color)275->setTarget(phutil_tag('strong', array(), $io_label))276->setNote($io_note);277278$io_view = id(new PHUIStatusListView())279->addItem($io_item);280281$properties->addProperty(pht('I/O'), $io_view);282283284$display_type = $uri->getEffectiveDisplayType();285$display_map = PhabricatorRepositoryURI::getDisplayTypeMap();286$display_spec = idx($display_map, $display_type, array());287288$display_icon = idx($display_spec, 'icon');289$display_color = idx($display_spec, 'color');290$display_label = idx($display_spec, 'label', $display_type);291$display_note = idx($display_spec, 'note');292293$display_item = id(new PHUIStatusItemView())294->setIcon($display_icon, $display_color)295->setTarget(phutil_tag('strong', array(), $display_label))296->setNote($display_note);297298$display_view = id(new PHUIStatusListView())299->addItem($display_item);300301$properties->addProperty(pht('Display'), $display_view);302303304return id(new PHUIObjectBoxView())305->setHeaderText(pht('Details'))306->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)307->appendChild($properties);308}309310}311312313