2016-04-28 19:40:35 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
final class DiffusionRepositoryURIViewController
|
|
|
|
extends DiffusionController {
|
|
|
|
|
|
|
|
public function handleRequest(AphrontRequest $request) {
|
|
|
|
$response = $this->loadDiffusionContext();
|
|
|
|
if ($response) {
|
|
|
|
return $response;
|
|
|
|
}
|
|
|
|
|
|
|
|
$viewer = $this->getViewer();
|
|
|
|
$drequest = $this->getDiffusionRequest();
|
|
|
|
$repository = $drequest->getRepository();
|
|
|
|
$id = $request->getURIData('id');
|
|
|
|
|
|
|
|
$uri = id(new PhabricatorRepositoryURIQuery())
|
|
|
|
->setViewer($viewer)
|
|
|
|
->withIDs(array($id))
|
|
|
|
->withRepositories(array($repository))
|
|
|
|
->executeOne();
|
|
|
|
if (!$uri) {
|
|
|
|
return new Aphront404Response();
|
|
|
|
}
|
|
|
|
|
2018-02-08 21:41:11 +01:00
|
|
|
// For display, access the URI by loading it through the repository. This
|
2017-06-30 15:56:10 +02:00
|
|
|
// may adjust builtin URIs for repository configuration, so we may end up
|
|
|
|
// with a different view of builtin URIs than we'd see if we loaded them
|
|
|
|
// directly from the database. See T12884.
|
|
|
|
|
|
|
|
$repository_uris = $repository->getURIs();
|
|
|
|
$repository_uris = mpull($repository_uris, null, 'getID');
|
|
|
|
$uri = idx($repository_uris, $uri->getID());
|
|
|
|
if (!$uri) {
|
|
|
|
return new Aphront404Response();
|
|
|
|
}
|
|
|
|
|
2016-04-28 19:40:35 +02:00
|
|
|
$title = array(
|
|
|
|
pht('URI'),
|
|
|
|
$repository->getDisplayName(),
|
|
|
|
);
|
|
|
|
|
|
|
|
$crumbs = $this->buildApplicationCrumbs();
|
2017-09-06 22:44:37 +02:00
|
|
|
$crumbs->setBorder(true);
|
2016-04-28 19:40:35 +02:00
|
|
|
$crumbs->addTextCrumb(
|
|
|
|
$repository->getDisplayName(),
|
|
|
|
$repository->getURI());
|
|
|
|
$crumbs->addTextCrumb(
|
|
|
|
pht('Manage'),
|
|
|
|
$repository->getPathURI('manage/'));
|
|
|
|
|
|
|
|
$panel_label = id(new DiffusionRepositoryURIsManagementPanel())
|
|
|
|
->getManagementPanelLabel();
|
|
|
|
$panel_uri = $repository->getPathURI('manage/uris/');
|
|
|
|
$crumbs->addTextCrumb($panel_label, $panel_uri);
|
|
|
|
|
|
|
|
$crumbs->addTextCrumb(pht('URI %d', $uri->getID()));
|
|
|
|
|
|
|
|
$header_text = pht(
|
|
|
|
'%s: URI %d',
|
|
|
|
$repository->getDisplayName(),
|
|
|
|
$uri->getID());
|
|
|
|
|
|
|
|
$header = id(new PHUIHeaderView())
|
|
|
|
->setHeader($header_text)
|
|
|
|
->setHeaderIcon('fa-pencil');
|
|
|
|
if ($uri->getIsDisabled()) {
|
|
|
|
$header->setStatus('fa-ban', 'dark', pht('Disabled'));
|
|
|
|
} else {
|
|
|
|
$header->setStatus('fa-check', 'bluegrey', pht('Active'));
|
|
|
|
}
|
|
|
|
|
|
|
|
$curtain = $this->buildCurtain($uri);
|
|
|
|
$details = $this->buildPropertySection($uri);
|
|
|
|
|
|
|
|
$timeline = $this->buildTransactionTimeline(
|
|
|
|
$uri,
|
|
|
|
new PhabricatorRepositoryURITransactionQuery());
|
|
|
|
$timeline->setShouldTerminate(true);
|
|
|
|
|
|
|
|
$view = id(new PHUITwoColumnView())
|
|
|
|
->setHeader($header)
|
|
|
|
->setMainColumn(
|
|
|
|
array(
|
|
|
|
$details,
|
|
|
|
$timeline,
|
|
|
|
))
|
|
|
|
->setCurtain($curtain);
|
|
|
|
|
|
|
|
return $this->newPage()
|
|
|
|
->setTitle($title)
|
|
|
|
->setCrumbs($crumbs)
|
|
|
|
->appendChild($view);
|
|
|
|
}
|
|
|
|
|
|
|
|
private function buildCurtain(PhabricatorRepositoryURI $uri) {
|
|
|
|
$viewer = $this->getViewer();
|
2016-05-01 15:59:22 +02:00
|
|
|
$repository = $uri->getRepository();
|
2016-04-30 01:51:05 +02:00
|
|
|
$id = $uri->getID();
|
2016-04-28 19:40:35 +02:00
|
|
|
|
|
|
|
$can_edit = PhabricatorPolicyFilter::hasCapability(
|
|
|
|
$viewer,
|
|
|
|
$uri,
|
|
|
|
PhabricatorPolicyCapability::CAN_EDIT);
|
|
|
|
|
|
|
|
$curtain = $this->newCurtainView($uri);
|
|
|
|
|
2016-04-30 01:51:05 +02:00
|
|
|
$edit_uri = $uri->getEditURI();
|
|
|
|
|
2016-04-28 19:40:35 +02:00
|
|
|
$curtain->addAction(
|
|
|
|
id(new PhabricatorActionView())
|
|
|
|
->setIcon('fa-pencil')
|
|
|
|
->setName(pht('Edit URI'))
|
|
|
|
->setHref($edit_uri)
|
|
|
|
->setWorkflow(!$can_edit)
|
|
|
|
->setDisabled(!$can_edit));
|
|
|
|
|
2016-05-01 15:59:22 +02:00
|
|
|
$credential_uri = $repository->getPathURI("uri/credential/{$id}/edit/");
|
|
|
|
$remove_uri = $repository->getPathURI("uri/credential/{$id}/remove/");
|
|
|
|
$has_credential = (bool)$uri->getCredentialPHID();
|
|
|
|
|
|
|
|
if ($uri->isBuiltin()) {
|
|
|
|
$can_credential = false;
|
|
|
|
} else if (!$uri->newCommandEngine()->isCredentialSupported()) {
|
|
|
|
$can_credential = false;
|
|
|
|
} else {
|
|
|
|
$can_credential = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
$can_update = ($can_edit && $can_credential);
|
|
|
|
$can_remove = ($can_edit && $has_credential);
|
|
|
|
|
|
|
|
if ($has_credential) {
|
|
|
|
$credential_name = pht('Update Credential');
|
|
|
|
} else {
|
|
|
|
$credential_name = pht('Set Credential');
|
|
|
|
}
|
|
|
|
|
|
|
|
$curtain->addAction(
|
|
|
|
id(new PhabricatorActionView())
|
|
|
|
->setIcon('fa-key')
|
|
|
|
->setName($credential_name)
|
|
|
|
->setHref($credential_uri)
|
|
|
|
->setWorkflow(true)
|
|
|
|
->setDisabled(!$can_edit));
|
|
|
|
|
|
|
|
$curtain->addAction(
|
|
|
|
id(new PhabricatorActionView())
|
|
|
|
->setIcon('fa-times')
|
|
|
|
->setName(pht('Remove Credential'))
|
|
|
|
->setHref($remove_uri)
|
|
|
|
->setWorkflow(true)
|
|
|
|
->setDisabled(!$can_remove));
|
|
|
|
|
2016-04-30 01:51:05 +02:00
|
|
|
if ($uri->getIsDisabled()) {
|
|
|
|
$disable_name = pht('Enable URI');
|
|
|
|
$disable_icon = 'fa-check';
|
|
|
|
} else {
|
|
|
|
$disable_name = pht('Disable URI');
|
|
|
|
$disable_icon = 'fa-ban';
|
|
|
|
}
|
|
|
|
|
2016-05-12 17:27:04 +02:00
|
|
|
$can_disable = ($can_edit && !$uri->isBuiltin());
|
|
|
|
|
2016-05-01 15:59:22 +02:00
|
|
|
$disable_uri = $repository->getPathURI("uri/disable/{$id}/");
|
2016-04-30 01:51:05 +02:00
|
|
|
|
|
|
|
$curtain->addAction(
|
|
|
|
id(new PhabricatorActionView())
|
|
|
|
->setIcon($disable_icon)
|
|
|
|
->setName($disable_name)
|
|
|
|
->setHref($disable_uri)
|
|
|
|
->setWorkflow(true)
|
2016-05-12 17:27:04 +02:00
|
|
|
->setDisabled(!$can_disable));
|
2016-04-30 01:51:05 +02:00
|
|
|
|
2016-04-28 19:40:35 +02:00
|
|
|
return $curtain;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function buildPropertySection(PhabricatorRepositoryURI $uri) {
|
|
|
|
$viewer = $this->getViewer();
|
|
|
|
|
|
|
|
$properties = id(new PHUIPropertyListView())
|
|
|
|
->setUser($viewer);
|
|
|
|
|
|
|
|
$properties->addProperty(pht('URI'), $uri->getDisplayURI());
|
2016-05-01 15:59:22 +02:00
|
|
|
|
|
|
|
$credential_phid = $uri->getCredentialPHID();
|
|
|
|
$command_engine = $uri->newCommandEngine();
|
|
|
|
$is_optional = $command_engine->isCredentialOptional();
|
|
|
|
$is_supported = $command_engine->isCredentialSupported();
|
|
|
|
$is_builtin = $uri->isBuiltin();
|
|
|
|
|
|
|
|
if ($is_builtin) {
|
|
|
|
$credential_icon = 'fa-circle-o';
|
|
|
|
$credential_color = 'grey';
|
|
|
|
$credential_label = pht('Builtin');
|
|
|
|
$credential_note = pht('Builtin URIs do not use credentials.');
|
|
|
|
} else if (!$is_supported) {
|
|
|
|
$credential_icon = 'fa-circle-o';
|
|
|
|
$credential_color = 'grey';
|
|
|
|
$credential_label = pht('Not Supported');
|
|
|
|
$credential_note = pht('This protocol does not support authentication.');
|
|
|
|
} else if (!$credential_phid) {
|
|
|
|
if ($is_optional) {
|
|
|
|
$credential_icon = 'fa-circle-o';
|
|
|
|
$credential_color = 'green';
|
|
|
|
$credential_label = pht('No Credential');
|
|
|
|
$credential_note = pht('Configured for anonymous access.');
|
|
|
|
} else {
|
|
|
|
$credential_icon = 'fa-times';
|
|
|
|
$credential_color = 'red';
|
|
|
|
$credential_label = pht('Required');
|
|
|
|
$credential_note = pht('Credential required but not configured.');
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// Don't raise a policy exception if we can't see the credential.
|
|
|
|
$credentials = id(new PassphraseCredentialQuery())
|
|
|
|
->setViewer($viewer)
|
|
|
|
->withPHIDs(array($credential_phid))
|
|
|
|
->execute();
|
|
|
|
$credential = head($credentials);
|
|
|
|
|
|
|
|
if (!$credential) {
|
|
|
|
$handles = $viewer->loadHandles(array($credential_phid));
|
|
|
|
$handle = $handles[$credential_phid];
|
|
|
|
if ($handle->getPolicyFiltered()) {
|
|
|
|
$credential_icon = 'fa-lock';
|
|
|
|
$credential_color = 'grey';
|
|
|
|
$credential_label = pht('Restricted');
|
|
|
|
$credential_note = pht(
|
|
|
|
'You do not have permission to view the configured '.
|
|
|
|
'credential.');
|
|
|
|
} else {
|
|
|
|
$credential_icon = 'fa-times';
|
|
|
|
$credential_color = 'red';
|
|
|
|
$credential_label = pht('Invalid');
|
|
|
|
$credential_note = pht('Configured credential is invalid.');
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
$provides = $credential->getProvidesType();
|
|
|
|
$needs = $command_engine->getPassphraseProvidesCredentialType();
|
|
|
|
if ($provides != $needs) {
|
|
|
|
$credential_icon = 'fa-times';
|
|
|
|
$credential_color = 'red';
|
|
|
|
$credential_label = pht('Wrong Type');
|
|
|
|
} else {
|
|
|
|
$credential_icon = 'fa-check';
|
|
|
|
$credential_color = 'green';
|
|
|
|
$credential_label = $command_engine->getPassphraseCredentialLabel();
|
|
|
|
}
|
|
|
|
$credential_note = $viewer->renderHandle($credential_phid);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$credential_item = id(new PHUIStatusItemView())
|
|
|
|
->setIcon($credential_icon, $credential_color)
|
|
|
|
->setTarget(phutil_tag('strong', array(), $credential_label))
|
|
|
|
->setNote($credential_note);
|
|
|
|
|
|
|
|
$credential_view = id(new PHUIStatusListView())
|
|
|
|
->addItem($credential_item);
|
|
|
|
|
|
|
|
$properties->addProperty(pht('Credential'), $credential_view);
|
2016-04-28 19:40:35 +02:00
|
|
|
|
|
|
|
|
|
|
|
$io_type = $uri->getEffectiveIOType();
|
|
|
|
$io_map = PhabricatorRepositoryURI::getIOTypeMap();
|
|
|
|
$io_spec = idx($io_map, $io_type, array());
|
|
|
|
|
|
|
|
$io_icon = idx($io_spec, 'icon');
|
|
|
|
$io_color = idx($io_spec, 'color');
|
|
|
|
$io_label = idx($io_spec, 'label', $io_type);
|
|
|
|
$io_note = idx($io_spec, 'note');
|
|
|
|
|
|
|
|
$io_item = id(new PHUIStatusItemView())
|
|
|
|
->setIcon($io_icon, $io_color)
|
|
|
|
->setTarget(phutil_tag('strong', array(), $io_label))
|
|
|
|
->setNote($io_note);
|
|
|
|
|
|
|
|
$io_view = id(new PHUIStatusListView())
|
|
|
|
->addItem($io_item);
|
|
|
|
|
|
|
|
$properties->addProperty(pht('I/O'), $io_view);
|
|
|
|
|
|
|
|
|
|
|
|
$display_type = $uri->getEffectiveDisplayType();
|
|
|
|
$display_map = PhabricatorRepositoryURI::getDisplayTypeMap();
|
|
|
|
$display_spec = idx($display_map, $display_type, array());
|
|
|
|
|
|
|
|
$display_icon = idx($display_spec, 'icon');
|
|
|
|
$display_color = idx($display_spec, 'color');
|
|
|
|
$display_label = idx($display_spec, 'label', $display_type);
|
|
|
|
$display_note = idx($display_spec, 'note');
|
|
|
|
|
|
|
|
$display_item = id(new PHUIStatusItemView())
|
|
|
|
->setIcon($display_icon, $display_color)
|
|
|
|
->setTarget(phutil_tag('strong', array(), $display_label))
|
|
|
|
->setNote($display_note);
|
|
|
|
|
|
|
|
$display_view = id(new PHUIStatusListView())
|
|
|
|
->addItem($display_item);
|
|
|
|
|
|
|
|
$properties->addProperty(pht('Display'), $display_view);
|
|
|
|
|
|
|
|
|
|
|
|
return id(new PHUIObjectBoxView())
|
|
|
|
->setHeaderText(pht('Details'))
|
|
|
|
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
|
|
|
|
->appendChild($properties);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|