[ Index ] |
PHP Cross Reference of Phabricator |
[Summary view] [Print] [Text view]
1 <?php 2 3 final class PhabricatorPeopleLdapController 4 extends PhabricatorPeopleController { 5 6 public function processRequest() { 7 8 $request = $this->getRequest(); 9 $admin = $request->getUser(); 10 11 $content = array(); 12 13 $form = id(new AphrontFormView()) 14 ->setAction($request->getRequestURI() 15 ->alter('search', 'true')->alter('import', null)) 16 ->setUser($admin) 17 ->appendChild( 18 id(new AphrontFormTextControl()) 19 ->setLabel(pht('LDAP username')) 20 ->setName('username')) 21 ->appendChild( 22 id(new AphrontFormPasswordControl()) 23 ->setDisableAutocomplete(true) 24 ->setLabel(pht('Password')) 25 ->setName('password')) 26 ->appendChild( 27 id(new AphrontFormTextControl()) 28 ->setLabel(pht('LDAP query')) 29 ->setCaption(pht('A filter such as (objectClass=*)')) 30 ->setName('query')) 31 ->appendChild( 32 id(new AphrontFormSubmitControl()) 33 ->setValue(pht('Search'))); 34 35 $panel = id(new AphrontPanelView()) 36 ->setHeader(pht('Import LDAP Users')) 37 ->setNoBackground() 38 ->setWidth(AphrontPanelView::WIDTH_FORM) 39 ->appendChild($form); 40 41 $crumbs = $this->buildApplicationCrumbs(); 42 $crumbs->addTextCrumb( 43 pht('Import Ldap Users'), 44 $this->getApplicationURI('/ldap/')); 45 46 $nav = $this->buildSideNavView(); 47 $nav->setCrumbs($crumbs); 48 $nav->selectFilter('ldap'); 49 $nav->appendChild($content); 50 51 if ($request->getStr('import')) { 52 $nav->appendChild($this->processImportRequest($request)); 53 } 54 55 $nav->appendChild($panel); 56 57 if ($request->getStr('search')) { 58 $nav->appendChild($this->processSearchRequest($request)); 59 } 60 61 return $this->buildApplicationPage( 62 $nav, 63 array( 64 'title' => pht('Import Ldap Users'), 65 )); 66 } 67 68 private function processImportRequest($request) { 69 $admin = $request->getUser(); 70 $usernames = $request->getArr('usernames'); 71 $emails = $request->getArr('email'); 72 $names = $request->getArr('name'); 73 74 $notice_view = new AphrontErrorView(); 75 $notice_view->setSeverity(AphrontErrorView::SEVERITY_NOTICE); 76 $notice_view->setTitle(pht('Import Successful')); 77 $notice_view->setErrors(array( 78 pht('Successfully imported users from LDAP'), 79 )); 80 81 $list = new PHUIObjectItemListView(); 82 $list->setNoDataString(pht('No users imported?')); 83 84 foreach ($usernames as $username) { 85 $user = new PhabricatorUser(); 86 $user->setUsername($username); 87 $user->setRealname($names[$username]); 88 89 $email_obj = id(new PhabricatorUserEmail()) 90 ->setAddress($emails[$username]) 91 ->setIsVerified(1); 92 try { 93 id(new PhabricatorUserEditor()) 94 ->setActor($admin) 95 ->createNewUser($user, $email_obj); 96 97 id(new PhabricatorExternalAccount()) 98 ->setUserPHID($user->getPHID()) 99 ->setAccountType('ldap') 100 ->setAccountDomain('self') 101 ->setAccountID($username) 102 ->save(); 103 104 $header = pht('Successfully added %s', $username); 105 $attribute = null; 106 $color = 'green'; 107 } catch (Exception $ex) { 108 $header = pht('Failed to add %s', $username); 109 $attribute = $ex->getMessage(); 110 $color = 'red'; 111 } 112 113 $item = id(new PHUIObjectItemView()) 114 ->setHeader($header) 115 ->addAttribute($attribute) 116 ->setBarColor($color); 117 118 $list->addItem($item); 119 } 120 121 return array( 122 $notice_view, 123 $list, 124 ); 125 126 } 127 128 private function processSearchRequest($request) { 129 $panel = new AphrontPanelView(); 130 $admin = $request->getUser(); 131 132 $search = $request->getStr('query'); 133 134 $ldap_provider = PhabricatorLDAPAuthProvider::getLDAPProvider(); 135 if (!$ldap_provider) { 136 throw new Exception('No LDAP provider enabled!'); 137 } 138 139 $ldap_adapter = $ldap_provider->getAdapter(); 140 $ldap_adapter->setLoginUsername($request->getStr('username')); 141 $ldap_adapter->setLoginPassword( 142 new PhutilOpaqueEnvelope($request->getStr('password'))); 143 144 // This causes us to connect and bind. 145 // TODO: Clean up this discard mode stuff. 146 DarkConsoleErrorLogPluginAPI::enableDiscardMode(); 147 $ldap_adapter->getAccountID(); 148 DarkConsoleErrorLogPluginAPI::disableDiscardMode(); 149 150 $results = $ldap_adapter->searchLDAP('%Q', $search); 151 152 foreach ($results as $key => $record) { 153 $account_id = $ldap_adapter->readLDAPRecordAccountID($record); 154 if (!$account_id) { 155 unset($results[$key]); 156 continue; 157 } 158 159 $info = array( 160 $account_id, 161 $ldap_adapter->readLDAPRecordEmail($record), 162 $ldap_adapter->readLDAPRecordRealName($record), 163 ); 164 $results[$key] = $info; 165 $results[$key][] = $this->renderUserInputs($info); 166 } 167 168 $form = id(new AphrontFormView()) 169 ->setUser($admin); 170 171 $table = new AphrontTableView($results); 172 $table->setHeaders( 173 array( 174 pht('Username'), 175 pht('Email'), 176 pht('Real Name'), 177 pht('Import?'), 178 )); 179 $form->appendChild($table); 180 $form->setAction($request->getRequestURI() 181 ->alter('import', 'true')->alter('search', null)) 182 ->appendChild( 183 id(new AphrontFormSubmitControl()) 184 ->setValue(pht('Import'))); 185 186 $panel->appendChild($form); 187 188 return $panel; 189 } 190 191 private function renderUserInputs($user) { 192 $username = $user[0]; 193 return hsprintf( 194 '%s%s%s', 195 phutil_tag( 196 'input', 197 array( 198 'type' => 'checkbox', 199 'name' => 'usernames[]', 200 'value' => $username, 201 )), 202 phutil_tag( 203 'input', 204 array( 205 'type' => 'hidden', 206 'name' => "email[$username]", 207 'value' => $user[1], 208 )), 209 phutil_tag( 210 'input', 211 array( 212 'type' => 'hidden', 213 'name' => "name[$username]", 214 'value' => $user[2], 215 ))); 216 } 217 218 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Sun Nov 30 09:20:46 2014 | Cross-referenced by PHPXref 0.7.1 |