コード例 #1
0
 /**
  * Entry point for the script.
  *
  * @return  void
  *
  * @since   2.0
  */
 public function doExecute()
 {
     // Setup some stats
     $failed = 0;
     $success = 0;
     $errors = array();
     // It appears we have to tell the system we are running with the site otherwise bad things happen
     JFactory::getApplication('site');
     $this->out(JText::_('CLI_SHMANIC_LDAP_INFO_13001'));
     // Get all the valid configurations
     if (!($configs = SHLdapHelper::getConfig())) {
         // Failed to find any Ldap configs
         $this->out(JText::_('CLI_SHMANIC_LDAP_ERR_13003'));
         $this->close(1);
     }
     // Check if only a single config was found
     if ($configs instanceof JRegistry) {
         /*
          * To make things easier, we pretend we returned multiple Ldap configs
          * by casting the single entry into an array.
          */
         $configs = array($configs);
     }
     $count = count($configs);
     $this->out(JText::sprintf('CLI_SHMANIC_LDAP_INFO_13002', $count))->out();
     // Loop around each LDAP configuration
     foreach ($configs as $config) {
         try {
             // Get a new Ldap object
             $ldap = new SHLdap($config);
             // Bind with the proxy user
             if (!$ldap->authenticate(SHLdap::AUTH_PROXY)) {
                 // Something is wrong with this LDAP configuration - cannot bind to proxy user
                 $errors[] = new Exception(JText::sprintf('CLI_SHMANIC_LDAP_ERR_13011', $ldap->info), 13011);
                 unset($ldap);
                 continue;
             }
             // Get all the Ldap users in the directory
             if (!($result = $ldap->search(null, $ldap->allUserFilter, array('dn', $ldap->keyUid)))) {
                 // Failed to search for all users in the directory
                 $errors[] = new Exception(JText::sprintf('CLI_SHMANIC_LDAP_ERR_13012', $ldap->getErrorMsg()), 13012);
                 unset($ldap);
                 continue;
             }
             // Loop around each Ldap user
             for ($i = 0; $i < $result->countEntries(); ++$i) {
                 // Get the Ldap username (case insensitive)
                 if (!($username = strtolower($result->getValue($i, $ldap->keyUid, 0)))) {
                     continue;
                 }
                 try {
                     // Check if this user is in the blacklist
                     if ($blacklist = (array) json_decode(SHFactory::getConfig()->get('user.blacklist'))) {
                         if (in_array($username, $blacklist)) {
                             throw new RuntimeException(JText::_('CLI_SHMANIC_LDAP_ERR_13025'), 13025);
                         }
                     }
                     // Create the new user adapter
                     $adapter = new SHUserAdaptersLdap(array('username' => $username), $config);
                     // Get the Ldap DN
                     if (!($dn = $adapter->getId(false))) {
                         continue;
                     }
                     $this->out(JText::sprintf('CLI_SHMANIC_LDAP_INFO_13020', $username));
                     // Get the Ldap user attributes
                     $source = $adapter->getAttributes();
                     // Get the core mandatory J! user fields
                     $username = $adapter->getUid();
                     $fullname = $adapter->getFullname();
                     $email = $adapter->getEmail();
                     if (empty($fullname)) {
                         // Full name doesnt exist; use the username instead
                         $fullname = $username;
                     }
                     if (empty($email)) {
                         // Email doesnt exist; cannot proceed
                         throw new Exception(JText::_('CLI_SHMANIC_LDAP_ERR_13022'), 13022);
                     }
                     // Create the user array to enable creating a JUser object
                     $user = array('fullname' => $fullname, 'username' => $username, 'password_clear' => null, 'email' => $email);
                     // Create a JUser object from the Ldap user
                     $options = array('adapter' => &$adapter);
                     $instance = SHUserHelper::getUser($user, $options);
                     if ($instance === false) {
                         // Failed to get the user either due to save error or autoregister
                         throw new Exception(JText::_('CLI_SHMANIC_LDAP_ERR_13024'), 13024);
                     }
                     // Fire the Ldap specific on Sync feature
                     $sync = SHLdapHelper::triggerEvent('onLdapSync', array(&$instance, $options));
                     // Check if the synchronise was successfully and report
                     if ($sync !== false) {
                         // Even if the sync does not need a save, do it anyway as Cron efficiency doesnt matter too much
                         SHUserHelper::save($instance);
                         // Update the user map linker
                         SHAdapterMap::setUser($adapter, $instance->id);
                         // Above should throw an exception on error so therefore we can report success
                         $this->out(JText::sprintf('CLI_SHMANIC_LDAP_INFO_13029', $username));
                         ++$success;
                     } else {
                         throw new Exception(JText::_('CLI_SHMANIC_LDAP_ERR_13026'), 13026);
                     }
                     unset($adapter);
                 } catch (Exception $e) {
                     unset($adapter);
                     ++$failed;
                     $errors[] = new Exception(JText::sprintf('CLI_SHMANIC_LDAP_ERR_13028', $username, $e->getMessage()), $e->getCode());
                 }
             }
         } catch (Exception $e) {
             $errors[] = new Exception(JText::_('CLI_SHMANIC_LDAP_ERR_13004'), 13004);
         }
     }
     // Print out some results and stats
     $this->out()->out()->out(JText::_('CLI_SHMANIC_LDAP_INFO_13032'))->out();
     $this->out(JText::_('CLI_SHMANIC_LDAP_INFO_13038'));
     foreach ($errors as $error) {
         if ($error instanceof Exception) {
             $this->out(' ' . $error->getCode() . ': ' . $error->getMessage());
         } else {
             $this->out(' ' . (string) $error);
         }
     }
     $this->out()->out(JText::sprintf('CLI_SHMANIC_LDAP_INFO_13034', $success));
     $this->out(JText::sprintf('CLI_SHMANIC_LDAP_INFO_13036', $failed));
     $this->out()->out('============================');
 }
コード例 #2
0
ファイル: bouncer.php プロジェクト: philbertphotos/JMapMyLDAP
 /**
  * Method handles login logic and report back to the subject.
  *
  * @param   array  $user     Holds the user data.
  * @param   array  $options  Extra options such as autoregister.
  *
  * @return  boolean  Cancels login on False.
  *
  * @since   2.0
  */
 public function onUserLogin($user, $options = array())
 {
     // Check if we have a user adapter already established for this user
     if (!isset(SHFactory::$adapters[strtolower($user['username'])])) {
         // SHAdapter did not log this in, get out now
         return;
     }
     // Get the processed user adapter directly from the static adapter holder
     $adapter = SHFactory::$adapters[strtolower($user['username'])];
     if (!(isset($user['type']) && $adapter::getName($user['type']))) {
         // Incorrect authentication type for this adapter
         return;
     }
     $adapterName = $adapter::getName();
     // Lets pass the getUser method the adapter so it can get extra values
     $options['adapter'] = $adapter;
     try {
         // Get a handle to the Joomla User object ready to be passed to the individual plugins
         $instance = SHUserHelper::getUser($user, $options);
     } catch (Exception $e) {
         // Failed to get the user either due to save error or autoregister
         SHLog::add($e, 10991, JLog::ERROR, $adapterName);
         return false;
     }
     // Fire the adapter driver specific on login events
     $result = SHAdapterEventHelper::triggerEvent($adapterName, 'onUserLogin', array(&$instance, $options));
     if ($result === false) {
         // Due to Joomla's inbuilt User Plugin, we have to raise an exception to abort login
         throw new RuntimeException(JText::sprintf('LIB_SHADAPTEREVENTBOUNCER_ERR_10999', $user['username']), 10999);
     }
     // Check if any changes were made that need to be saved
     if ($result === true || isset($options['change'])) {
         SHLog::add(JText::sprintf('LIB_SHADAPTEREVENTBOUNCER_DEBUG_10984', $user['username']), 10984, JLog::DEBUG, $adapterName);
         try {
             // Save the user back to the Joomla database
             if (!SHUserHelper::save($instance)) {
                 SHLog::add(JText::sprintf('LIB_SHADAPTEREVENTBOUNCER_ERR_10988', $user['username']), 10988, JLog::ERROR, $adapterName);
             }
         } catch (Exception $e) {
             SHLog::add($e, 10989, JLog::ERROR, $adapterName);
         }
     }
     // Update the user map linker
     SHAdapterMap::setUser($adapter, $instance->id);
     // Allow user adapter events to be called
     $this->adapterUser = $adapterName;
     return true;
 }