Correct Aphlict websocket URI construction after PHP8 compatibility changes
[phabricator.git] / src / applications / doorkeeper / engineextension / DoorkeeperHyperlinkEngineExtension.php
blob675c9efcbc12f8ed067fd1605abe5b6f29bb15b2
1 <?php
3 final class DoorkeeperHyperlinkEngineExtension
4 extends PhabricatorRemarkupHyperlinkEngineExtension {
6 const LINKENGINEKEY = 'doorkeeper';
8 public function processHyperlinks(array $hyperlinks) {
9 $engine = $this->getEngine();
10 $viewer = $engine->getConfig('viewer');
12 if (!$viewer) {
13 return;
16 $configs = id(new PhabricatorAuthProviderConfigQuery())
17 ->setViewer($viewer)
18 ->withIsEnabled(true)
19 ->execute();
21 $providers = array();
22 foreach ($configs as $key => $config) {
23 $provider = $config->getProvider();
24 if (($provider instanceof DoorkeeperRemarkupURIInterface)) {
25 $providers[] = $provider;
29 if (!$providers) {
30 return;
33 $refs = array();
34 foreach ($hyperlinks as $hyperlink) {
35 $uri = $hyperlink->getURI();
36 $uri = new PhutilURI($uri);
38 foreach ($providers as $provider) {
39 $ref = $provider->getDoorkeeperURIRef($uri);
41 if (($ref !== null) && !($ref instanceof DoorkeeperURIRef)) {
42 throw new Exception(
43 pht(
44 'Expected "getDoorkeeperURIRef()" to return "null" or an '.
45 'object of type "DoorkeeperURIRef", but got %s from provider '.
46 '"%s".',
47 phutil_describe_type($ref),
48 get_class($provider)));
51 if ($ref === null) {
52 continue;
55 $tag_id = celerity_generate_unique_node_id();
56 $href = phutil_string_cast($ref->getURI());
58 $refs[] = array(
59 'id' => $tag_id,
60 'href' => $href,
61 'ref' => array(
62 $ref->getApplicationType(),
63 $ref->getApplicationDomain(),
64 $ref->getObjectType(),
65 $ref->getObjectID(),
67 'view' => $ref->getDisplayMode(),
70 $text = $ref->getText();
71 if ($text === null) {
72 $text = $href;
75 $view = id(new PHUITagView())
76 ->setID($tag_id)
77 ->setName($text)
78 ->setHref($href)
79 ->setType(PHUITagView::TYPE_OBJECT)
80 ->setExternal(true);
82 $hyperlink->setResult($view);
83 break;
87 if ($refs) {
88 Javelin::initBehavior('doorkeeper-tag', array('tags' => $refs));