Path: blob/master/src/applications/harbormaster/artifact/HarbormasterURIArtifact.php
12256 views
<?php12final class HarbormasterURIArtifact extends HarbormasterArtifact {34const ARTIFACTCONST = 'uri';56public function getArtifactTypeName() {7return pht('URI');8}910public function getArtifactTypeSummary() {11return pht('Stores a URI.');12}1314public function getArtifactTypeDescription() {15return pht(16"Stores a URI.\n\n".17"With `ui.external`, you can use this artifact type to add links to ".18"build results in an external build system.");19}2021public function getArtifactParameterSpecification() {22return array(23'uri' => 'string',24'name' => 'optional string',25'ui.external' => 'optional bool',26);27}2829public function readArtifactHTTPParameter($key, $value) {30// TODO: This is hacky and artifact parameters should be replaced more31// broadly, likely with EditFields. See T11887.32switch ($key) {33case 'ui.external':34return (bool)$value;35}36return $value;37}3839public function getArtifactParameterDescriptions() {40return array(41'uri' => pht('The URI to store.'),42'name' => pht('Optional label for this URI.'),43'ui.external' => pht(44'If true, display this URI in the UI as an link to '.45'additional build details in an external build system.'),46);47}4849public function getArtifactDataExample() {50return array(51'uri' => 'https://buildserver.mycompany.com/build/123/',52'name' => pht('View External Build Results'),53'ui.external' => true,54);55}5657public function renderArtifactSummary(PhabricatorUser $viewer) {58return $this->renderLink();59}6061public function isExternalLink() {62$artifact = $this->getBuildArtifact();63return (bool)$artifact->getProperty('ui.external', false);64}6566public function renderLink() {67$artifact = $this->getBuildArtifact();68$uri = $artifact->getProperty('uri');6970try {71$this->validateURI($uri);72} catch (Exception $ex) {73return pht('<Invalid URI>');74}7576$name = $artifact->getProperty('name', $uri);7778return phutil_tag(79'a',80array(81'href' => $uri,82'target' => '_blank',83'rel' => 'noreferrer',84),85$name);86}8788public function willCreateArtifact(PhabricatorUser $actor) {89$artifact = $this->getBuildArtifact();90$uri = $artifact->getProperty('uri');91$this->validateURI($uri);92}9394private function validateURI($raw_uri) {95$uri = new PhutilURI($raw_uri);9697$protocol = $uri->getProtocol();98if (!strlen($protocol)) {99throw new Exception(100pht(101'Unable to identify the protocol for URI "%s". URIs must be '.102'fully qualified and have an identifiable protocol.',103$raw_uri));104}105106$protocol_key = 'uri.allowed-protocols';107$protocols = PhabricatorEnv::getEnvConfig($protocol_key);108if (empty($protocols[$protocol])) {109throw new Exception(110pht(111'URI "%s" does not have an allowable protocol. Configure '.112'protocols in `%s`. Allowed protocols are: %s.',113$raw_uri,114$protocol_key,115implode(', ', array_keys($protocols))));116}117}118119}120121122