@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.)
hq.recaptime.dev/wiki/Phorge
phorge
phabricator
1<?php
2
3final class PhabricatorAuthNewController
4 extends PhabricatorAuthProviderConfigController {
5
6 public function handleRequest(AphrontRequest $request) {
7 $this->requireApplicationCapability(
8 AuthManageProvidersCapability::CAPABILITY);
9
10 $viewer = $this->getViewer();
11 $cancel_uri = $this->getApplicationURI();
12 $locked_config_key = 'auth.lock-config';
13 $is_locked = PhabricatorEnv::getEnvConfig($locked_config_key);
14
15 if ($is_locked) {
16 $message = pht(
17 'Authentication provider configuration is locked, and can not be '.
18 'changed without being unlocked. See the configuration setting %s '.
19 'for details.',
20 phutil_tag(
21 'a',
22 array(
23 'href' => '/config/edit/'.$locked_config_key,
24 ),
25 $locked_config_key));
26
27 return $this->newDialog()
28 ->setUser($viewer)
29 ->setTitle(pht('Authentication Config Locked'))
30 ->appendChild($message)
31 ->addCancelButton($cancel_uri);
32 }
33
34 $providers = PhabricatorAuthProvider::getAllBaseProviders();
35
36 $configured = PhabricatorAuthProvider::getAllProviders();
37 $configured_classes = array();
38 foreach ($configured as $configured_provider) {
39 $configured_classes[get_class($configured_provider)] = true;
40 }
41
42 // Sort providers by login order, and move disabled providers to the
43 // bottom.
44 $providers = msort($providers, 'getLoginOrder');
45 $providers = array_diff_key($providers, $configured_classes) + $providers;
46
47 $menu = id(new PHUIObjectItemListView())
48 ->setViewer($viewer)
49 ->setBig(true)
50 ->setFlush(true);
51
52 foreach ($providers as $provider_key => $provider) {
53 $provider_class = get_class($provider);
54
55 $provider_uri = id(new PhutilURI('/config/edit/'))
56 ->replaceQueryParam('provider', $provider_class);
57 $provider_uri = $this->getApplicationURI($provider_uri);
58
59 $already_exists = isset($configured_classes[get_class($provider)]);
60
61 $item = id(new PHUIObjectItemView())
62 ->setHeader($provider->getNameForCreate())
63 ->setImageIcon($provider->newIconView())
64 ->setHasSpriteImage(true)
65 ->addAttribute($provider->getDescriptionForCreate());
66
67 if (!$already_exists) {
68 $item
69 ->setHref($provider_uri)
70 ->setClickable(true);
71 } else {
72 $item->setDisabled(true);
73 }
74
75 if ($already_exists) {
76 $messages = array();
77 $messages[] = pht('You already have a provider of this type.');
78
79 $info = id(new PHUIInfoView())
80 ->setSeverity(PHUIInfoView::SEVERITY_WARNING)
81 ->setErrors($messages);
82
83 $item->appendChild($info);
84 }
85
86 $menu->addItem($item);
87 }
88
89 return $this->newDialog()
90 ->setTitle(pht('Add Auth Provider'))
91 ->setWidth(AphrontDialogView::WIDTH_FORM)
92 ->appendChild($menu)
93 ->addCancelButton($cancel_uri);
94 }
95
96}