@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 PhabricatorAuthFactorProviderEditController
4 extends PhabricatorAuthFactorProviderController {
5
6 public function handleRequest(AphrontRequest $request) {
7 $this->requireApplicationCapability(
8 AuthManageProvidersCapability::CAPABILITY);
9
10 $engine = id(new PhabricatorAuthFactorProviderEditEngine())
11 ->setController($this);
12
13 $id = $request->getURIData('id');
14 if (!$id) {
15 $factor_key = $request->getStr('providerFactorKey');
16
17 $map = PhabricatorAuthFactor::getAllFactors();
18 $factor = idx($map, $factor_key);
19 if (!$factor) {
20 return $this->buildFactorSelectionResponse();
21 }
22
23 $engine
24 ->addContextParameter('providerFactorKey', $factor_key)
25 ->setProviderFactor($factor);
26 }
27
28 return $engine->buildResponse();
29 }
30
31 private function buildFactorSelectionResponse() {
32 $request = $this->getRequest();
33 $viewer = $this->getViewer();
34
35 $cancel_uri = $this->getApplicationURI('mfa/');
36
37 $factors = PhabricatorAuthFactor::getAllFactors();
38
39 $menu = id(new PHUIObjectItemListView())
40 ->setUser($viewer)
41 ->setBig(true)
42 ->setFlush(true);
43
44 $factors = msortv($factors, 'newSortVector');
45
46 foreach ($factors as $factor_key => $factor) {
47 $factor_uri = id(new PhutilURI('/mfa/edit/'))
48 ->replaceQueryParam('providerFactorKey', $factor_key);
49 $factor_uri = $this->getApplicationURI($factor_uri);
50
51 $is_enabled = $factor->canCreateNewProvider();
52
53 $item = id(new PHUIObjectItemView())
54 ->setHeader($factor->getFactorName())
55 ->setImageIcon($factor->newIconView())
56 ->addAttribute($factor->getFactorCreateHelp());
57
58 if ($is_enabled) {
59 $item
60 ->setHref($factor_uri)
61 ->setClickable(true);
62 } else {
63 $item->setDisabled(true);
64 }
65
66 $create_description = $factor->getProviderCreateDescription();
67 if ($create_description) {
68 $item->appendChild($create_description);
69 }
70
71 $menu->addItem($item);
72 }
73
74 return $this->newDialog()
75 ->setTitle(pht('Choose Provider Type'))
76 ->appendChild($menu)
77 ->addCancelButton($cancel_uri);
78 }
79
80}