/**
  * Get instance
  *
  * @access public
  * @static
  *
  */
 public static function _getInstance()
 {
     if (self::$instance) {
         return self::$instance;
     }
     return self::$instance = new ilAuthModeDetermination();
 }
 public function fetchData($user, $pass)
 {
     foreach (ilAuthModeDetermination::_getInstance()->getAuthModeSequence() as $auth_mode) {
         if ($_REQUEST['force_mode_apache']) {
             $this->log('Container Apache: Trying new container', AUTH_LOG_DEBUG);
             include_once './Services/AuthApache/classes/class.ilAuthContainerApache.php';
             $this->current_container = new ilAuthContainerApache();
             $auth = new ilAuthApache($this->current_container);
         } else {
             switch ($auth_mode) {
                 case AUTH_LDAP:
                     $this->log('Container LDAP: Trying new container', AUTH_LOG_DEBUG);
                     include_once './Services/LDAP/classes/class.ilAuthContainerLDAP.php';
                     $this->current_container = new ilAuthContainerLDAP();
                     break;
                 case AUTH_LOCAL:
                     $this->log('Container MDB2: Trying new container', AUTH_LOG_DEBUG);
                     include_once './Services/Database/classes/class.ilAuthContainerMDB2.php';
                     $this->current_container = new ilAuthContainerMDB2();
                     break;
                 case AUTH_SOAP:
                     $this->log('Container SOAP: Trying new container', AUTH_LOG_DEBUG);
                     include_once './Services/SOAPAuth/classes/class.ilAuthContainerSOAP.php';
                     $this->current_container = new ilAuthContainerSOAP();
                     break;
                 case AUTH_RADIUS:
                     $this->log('Container Radius: Trying new container', AUTH_LOG_DEBUG);
                     include_once './Services/Radius/classes/class.ilAuthContainerRadius.php';
                     $this->current_container = new ilAuthContainerRadius();
                     break;
                     // begin-patch auth_plugin
                 // begin-patch auth_plugin
                 default:
                     $this->log('Container Plugin: Trying new container', AUTH_LOG_DEBUG);
                     foreach (ilAuthUtils::getAuthPlugins() as $pl) {
                         $container = $pl->getContainer($auth_mode);
                         if ($container instanceof Auth_Container) {
                             $this->current_container = $container;
                             break;
                         }
                     }
                     break;
                     // end-patch auth_plugin
             }
         }
         $this->current_container->_auth_obj = $this->_auth_obj;
         $result = $this->current_container->fetchData($user, $pass);
         if (PEAR::isError($result)) {
             $this->log('Container ' . $key . ': ' . $result->getMessage(), AUTH_LOG_ERR);
             // Do not return here, otherwise wrong configured auth modes might block ilias database authentication
         } elseif ($result == true) {
             $this->log('Container ' . $key . ': Authentication successful.', AUTH_LOG_DEBUG);
             return true;
         } else {
             $this->log('Container ' . $key . ': Authentication failed.', AUTH_LOG_DEBUG);
         }
     }
     return false;
 }
 /**
  * @param      $a_username
  * @param      $password
  * @param bool $isChallengeResponse
  * @return bool|void
  * @throws ilLDAPQueryException
  */
 function fetchData($a_username, $password, $isChallengeResponse = false)
 {
     /**
      * @var $ilDB      ilDB
      * @var $ilSetting ilSetting
      * @var $rbacadmin ilRbacAdmin
      */
     global $ilDB, $ilSetting, $rbacadmin;
     $settings = new ilSetting('apache_auth');
     if (!$settings->get('apache_enable_auth')) {
         return false;
     }
     if (!$settings->get('apache_auth_indicator_name') || !$settings->get('apache_auth_indicator_value')) {
         return false;
     }
     if (!ilUtil::isLogin($a_username)) {
         return false;
     }
     if ($a_username == 'anonymous' && $password == 'anonymous') {
         $query = 'SELECT * FROM usr_data WHERE login = %s';
         $qres = $ilDB->queryF($query, array('text'), array($a_username));
         $userRow = $ilDB->fetchAssoc($qres);
         if (is_array($userRow) && $userRow['usr_id']) {
             // user as a local account...
             // fetch logindata
             $this->activeUser = $userRow['login'];
             foreach ($userRow as $key => $value) {
                 if ($key == $this->options['passwordcol'] || $key == $this->options['usernamecol']) {
                     continue;
                 }
                 // Use reference to the auth object if exists
                 // This is because the auth session variable can change so a static call to setAuthData does not make sense
                 $this->_auth_obj->setAuthData($key, $value);
             }
             $this->_auth_obj->setAuth($userRow['login']);
             return true;
         }
         return false;
     }
     if (!$_SESSION['login_invalid'] && in_array($_SERVER[$settings->get('apache_auth_indicator_name')], array_filter(array_map('trim', str_getcsv($settings->get('apache_auth_indicator_value')))))) {
         // we have a valid apache auth
         $list = array($ilSetting->get('auth_mode'));
         // Respect the auth method sequence
         include_once './Services/Authentication/classes/class.ilAuthModeDetermination.php';
         $det = ilAuthModeDetermination::_getInstance();
         if (!$det->isManualSelection() && $det->getCountActiveAuthModes() > 1) {
             $list = array();
             foreach (ilAuthModeDetermination::_getInstance()->getAuthModeSequence() as $auth_mode) {
                 $list[] = $auth_mode;
             }
         }
         foreach ($list as $auth_mode) {
             if (AUTH_LDAP == $auth_mode) {
                 // if no local user has been found AND ldap lookup is enabled
                 if ($settings->get('apache_enable_ldap')) {
                     include_once 'Services/LDAP/classes/class.ilLDAPServer.php';
                     $this->server = new ilLDAPServer(ilLDAPServer::_getFirstActiveServer());
                     $this->server->doConnectionCheck();
                     $config = $this->server->toPearAuthArray();
                     $query = new ilLDAPQuery($this->server);
                     $query->bind();
                     $ldapUser = $query->fetchUser($a_username);
                     if ($ldapUser && $ldapUser[$a_username] && $ldapUser[$a_username][$config['userattr']] == $a_username) {
                         $ldapUser[$a_username]['ilInternalAccount'] = ilObjUser::_checkExternalAuthAccount("ldap", $a_username);
                         $user_data = $ldapUser[$a_username];
                         //array_change_key_case($a_auth->getAuthData(),CASE_LOWER);
                         if ($this->server->enabledSyncOnLogin()) {
                             if (!$user_data['ilInternalAccount'] && $this->server->isAccountMigrationEnabled() && !self::$force_creation) {
                                 $this->_auth_obj->logout();
                                 $_SESSION['tmp_auth_mode'] = 'ldap';
                                 $_SESSION['tmp_external_account'] = $a_username;
                                 $_SESSION['tmp_pass'] = $_POST['password'];
                                 include_once './Services/LDAP/classes/class.ilLDAPRoleAssignmentRules.php';
                                 $roles = ilLDAPRoleAssignmentRules::getAssignmentsForCreation($a_username, $user_data);
                                 $_SESSION['tmp_roles'] = array();
                                 foreach ($roles as $info) {
                                     if ($info['action'] == ilLDAPRoleAssignmentRules::ROLE_ACTION_ASSIGN) {
                                         $_SESSION['tmp_roles'][] = $info['id'];
                                     }
                                 }
                                 ilUtil::redirect('ilias.php?baseClass=ilStartUpGUI&cmdClass=ilstartupgui&cmd=showAccountMigration');
                             }
                             if ($this->updateRequired($a_username)) {
                                 $this->initLDAPAttributeToUser();
                                 $this->ldap_attr_to_user->setUserData($ldapUser);
                                 $this->ldap_attr_to_user->refresh();
                                 $user_data['ilInternalAccount'] = ilObjUser::_checkExternalAuthAccount("ldap", $a_username);
                             } else {
                                 // User exists and no update required
                                 $user_data['ilInternalAccount'] = ilObjUser::_checkExternalAuthAccount("ldap", $a_username);
                             }
                         }
                         if ($user_data['ilInternalAccount']) {
                             $this->_auth_obj->setAuth($user_data['ilInternalAccount']);
                             $this->_auth_obj->username = $user_data['ilInternalAccount'];
                             return true;
                         }
                     }
                 }
             } else {
                 if (AUTH_APACHE != $auth_mode && $settings->get('apache_enable_local')) {
                     $condition = '';
                     if ($ilSetting->get("auth_mode") && $ilSetting->get("auth_mode") == 'ldap') {
                         $condition = " AND auth_mode != " . $ilDB->quote('default', 'text') . " ";
                     }
                     $query = "SELECT * FROM usr_data WHERE login = %s AND auth_mode != %s {$condition}";
                     $qres = $ilDB->queryF($query, array('text', 'text'), array($a_username, 'ldap'));
                     $userRow = $ilDB->fetchAssoc($qres);
                     if (is_array($userRow) && $userRow['usr_id']) {
                         // user as a local account...
                         // fetch logindata
                         $this->activeUser = $userRow['login'];
                         foreach ($userRow as $key => $value) {
                             if ($key == $this->options['passwordcol'] || $key == $this->options['usernamecol']) {
                                 continue;
                             }
                             // Use reference to the auth object if exists
                             // This is because the auth session variable can change so a static call to setAuthData does not make sense
                             $this->_auth_obj->setAuthData($key, $value);
                         }
                         $this->_auth_obj->setAuth($userRow['login']);
                         return true;
                     }
                 }
             }
         }
         if ($settings->get('apache_enable_local') && $settings->get('apache_local_autocreate')) {
             if ($_GET['r']) {
                 $_SESSION['profile_complete_redirect'] = $_GET['r'];
             }
             $user = new ilObjUser();
             $user->setLogin($a_username);
             $user->setExternalAccount($a_username);
             $user->setProfileIncomplete(true);
             $user->create();
             $user->setAuthMode('apache');
             // set a timestamp for last_password_change
             // this ts is needed by ilSecuritySettings
             $user->setLastPasswordChangeTS(time());
             $user->setTimeLimitUnlimited(1);
             $user->setActive(1);
             //insert user data in table user_data
             $user->saveAsNew();
             $user->writePrefs();
             $rbacadmin->assignUser($settings->get('apache_default_role', 4), $user->getId(), true);
             return true;
         }
     } else {
         if (defined('IL_CERT_SSO') && IL_CERT_SSO) {
             define('APACHE_ERRORCODE', AUTH_APACHE_FAILED);
         }
     }
     return false;
 }
 /**
  * update auth mode determination
  *
  * @access public
  * 
  */
 public function updateAuthModeDeterminationObject()
 {
     include_once 'Services/Authentication/classes/class.ilAuthModeDetermination.php';
     $det = ilAuthModeDetermination::_getInstance();
     $det->setKind((int) $_POST['kind']);
     $pos = $_POST['position'] ? $_POST['position'] : array();
     asort($pos, SORT_NUMERIC);
     $counter = 0;
     foreach ($pos as $auth_mode => $dummy) {
         $position[$counter++] = $auth_mode;
     }
     $det->setAuthModeSequence($position ? $position : array());
     $det->save();
     require_once 'Services/Captcha/classes/class.ilCaptchaUtil.php';
     ilCaptchaUtil::setActiveForLogin((bool) $_POST['activate_captcha_anonym']);
     ilUtil::sendSuccess($this->lng->txt('settings_saved'));
     $this->authSettingsObject();
 }
 /**
  * Show login form 
  * @global ilSetting $ilSetting
  * @param string $page_editor_html 
  */
 protected function showLoginForm($page_editor_html)
 {
     global $ilSetting, $lng, $tpl;
     // @todo move this to auth utils.
     // login via ILIAS (this also includes radius and ldap)
     // If local authentication is enabled for shibboleth users, we
     // display the login form for ILIAS here.
     if (($ilSetting->get("auth_mode") != AUTH_SHIBBOLETH || $ilSetting->get("shib_auth_allow_local")) && $ilSetting->get("auth_mode") != AUTH_CAS) {
         include_once "Services/Form/classes/class.ilPropertyFormGUI.php";
         $form = new ilPropertyFormGUI();
         //$form->setTableWidth('500');
         $form->setFormAction($this->ctrl->getFormAction($this, ''));
         $form->setName("formlogin");
         $form->setShowTopButtons(false);
         $form->setTitle($lng->txt("login_to_ilias"));
         // auth selection
         include_once './Services/Authentication/classes/class.ilAuthModeDetermination.php';
         $det = ilAuthModeDetermination::_getInstance();
         if (ilAuthUtils::_hasMultipleAuthenticationMethods() and $det->isManualSelection()) {
             $visible_auth_methods = array();
             $radg = new ilRadioGroupInputGUI($lng->txt("auth_selection"), "auth_mode");
             foreach (ilAuthUtils::_getMultipleAuthModeOptions($lng) as $key => $option) {
                 if (isset($option['hide_in_ui']) && $option['hide_in_ui']) {
                     continue;
                 }
                 $op1 = new ilRadioOption($option['txt'], $key);
                 $radg->addOption($op1);
                 if (isset($option['checked'])) {
                     $radg->setValue($key);
                 }
                 $visible_auth_methods[] = $op1;
             }
             if (count($visible_auth_methods) == 1) {
                 $first_auth_method = current($visible_auth_methods);
                 $hidden_auth_method = new ilHiddenInputGUI("auth_mode");
                 $hidden_auth_method->setValue($first_auth_method->getValue());
                 $form->addItem($hidden_auth_method);
             } else {
                 $form->addItem($radg);
             }
         }
         $ti = new ilTextInputGUI($lng->txt("username"), "username");
         $ti->setSize(20);
         $ti->setRequired(true);
         $form->addItem($ti);
         $pi = new ilPasswordInputGUI($lng->txt("password"), "password");
         $pi->setRetype(false);
         $pi->setSize(20);
         $pi->setDisableHtmlAutoComplete(false);
         $pi->setRequired(true);
         $form->addItem($pi);
         $form->addCommandButton("showLogin", $lng->txt("log_in"));
         require_once 'Services/Captcha/classes/class.ilCaptchaUtil.php';
         if (ilCaptchaUtil::isActiveForLogin()) {
             require_once 'Services/Captcha/classes/class.ilCaptchaInputGUI.php';
             $captcha = new ilCaptchaInputGUI($lng->txt('captcha_code'), 'captcha_code');
             $captcha->setRequired(true);
             $form->addItem($captcha);
         }
         return $this->substituteLoginPageElements($tpl, $page_editor_html, $form->getHTML(), '[list-login-form]', 'LOGIN_FORM');
     }
     return $page_editor_html;
 }
 function _getAuthModeOfUser($a_username, $a_password, $a_db_handler = '')
 {
     global $ilDB;
     if (isset($_GET['ecs_hash']) or isset($_GET['ecs_hash_url'])) {
         ilAuthFactory::setContext(ilAuthFactory::CONTEXT_ECS);
         return AUTH_ECS;
     }
     if (isset($_POST['auth_mode'])) {
         return (int) $_POST['auth_mode'];
     }
     if (isset($_POST['oid_username']) or $_GET['oid_check_status']) {
         $GLOBALS['ilLog']->write(__METHOD__ . ' set context to open id');
         ilAuthFactory::setContext(ilAuthFactory::CONTEXT_OPENID);
         return AUTH_OPENID;
     }
     include_once './Services/Authentication/classes/class.ilAuthModeDetermination.php';
     $det = ilAuthModeDetermination::_getInstance();
     if (!$det->isManualSelection() and $det->getCountActiveAuthModes() > 1) {
         return AUTH_MULTIPLE;
     }
     $db =& $ilDB;
     if ($a_db_handler != '') {
         $db =& $a_db_handler;
     }
     // Is it really necessary to check the auth mode with password ?
     // Changed: smeyer
     $q = "SELECT auth_mode FROM usr_data WHERE " . "login = "******"passwd = ".$ilDB->quote(md5($a_password))."";
     $r = $db->query($q);
     $row = $r->fetchRow(DB_FETCHMODE_OBJECT);
     //echo "+".$row->auth_mode."+";
     $auth_mode = self::_getAuthMode($row->auth_mode, $db);
     return in_array($auth_mode, self::_getActiveAuthModes()) ? $auth_mode : AUTH_INACTIVE;
 }