[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/src/applications/people/controller/ -> PhabricatorPeopleLdapController.php (source)

   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  }


Generated: Sun Nov 30 09:20:46 2014 Cross-referenced by PHPXref 0.7.1