Skip to content
Snippets Groups Projects
TextGrid-WebAuth.php 5.6 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?php
    // #######################################################
    // Author: Martin Haase / DAASI International GmbH / TextGrid
    // Creation date: 2010-09-23
    
    // Modification date: 2010-10-19
    // Version: 0.2
    
    // #######################################################
    
    include("../tglib/LDAP.class.php");
    include("../tglib/RBAC.class.php");
    include("../tglib/WebUtils.class.php");
    
    $configfile = "../../../config_tgwebauth.xml";
    
    
    Martin Haase's avatar
    Martin Haase committed
    $util = new WebUtils;
    
    
    $authZinstance = $_REQUEST["authZinstance"];
    
    Martin Haase's avatar
    Martin Haase committed
    
    if ( !(isset($authZinstance)) || strlen($authZinstance) <= 0 ) {
    
      $util->printAuthFailure("no_tgauth_instance_heading", 
    		      "no_tgauth_instance_detail", 
    
    $rbac = new RBAC ( $configfile, $authZinstance );
    
    // Variant 1: Authentication at Community LDAP
    
    Martin Haase's avatar
    Martin Haase committed
    if (isset ($_REQUEST["loginname"]) && strlen($_REQUEST["loginname"]) > 0
        && isset ($_REQUEST["password"]) && strlen($_REQUEST["password"]) > 0) {
    
    Martin Haase's avatar
    Martin Haase committed
      $ldap = new LDAP ( $configfile );
      $AuthNResult = $ldap->authenticate($_REQUEST["loginname"], $_REQUEST["password"]);
      if (! $AuthNResult["success"]) {
    
        $util->printAuthFailure("authn_failure_heading", 
    
    Martin Haase's avatar
    Martin Haase committed
    			$AuthNResult["detail"], 
    
      $ProvidedAttributes = $ldap->getUserAttributes();
      $_SERVER["REMOTE_USER"] = $AuthNResult["TGID"];
    }
    
    
    // Variant 2: Shibboleth gave us the right REMOTE_USER. 
    
    // We create a Session here in RBAC, also for Variant1
    if (isset ($_SERVER["REMOTE_USER"])) { // this holds for both shib and ldap authN
    
    Martin Haase's avatar
    Martin Haase committed
      // now creating session, activating roles, etc, in RBAC
    
    
      $CSResult = $rbac->createSession( $_SERVER["REMOTE_USER"] );
      if (isset ($AuthNResult)) {
        $CSResult["rbachash"]["identity_provider"] = $AuthNResult["LDAPname"];
    
      } else {
        $CSResult["rbachash"]["identity_provider"] = $_SERVER["Shib-Identity-Provider"];
    
      }
    
      if (!$CSResult["success"]) {
    
        $util->printAuthFailure("sid_create_failure_heading", 
    
    Martin Haase's avatar
    Martin Haase committed
    			    $CSResult["detail"], 
    			    $_REQUEST["loginname"], 
    
    			    $CSResult["rbachash"]
    
    Martin Haase's avatar
    Martin Haase committed
    			    ); 
        exit;
      }
    
      $Sid = $CSResult["rbachash"]["Sid"];
    
      $AttributeMap = Array ('surname' => 'sn',
    			 'organisation' => 'o',
    			 'givenname' => 'givenName',
    			 'displayname' => 'cn',
    			 'mail' => 'mail'
    			 );
      if (!isset ($ldap)) {
        $ProvidedAttributes = Array();
    
    Martin Haase's avatar
    Martin Haase committed
        // this is the list of attributes Shibboleth might give to us except from remote_user
        foreach (array ("o", "sn", "givenName", "cn", "mail") as $a) {
          if (isset($_SERVER[$a])) { $ProvidedAttributes[$a] = $_SERVER[$a];}
        }
    
      }
    } 
    // This is Variant 3: No Session Creation, but just a desire to see (and update) User Attributes
    
    Martin Haase's avatar
    Martin Haase committed
    else if (isset ($_REQUEST["Sid"]) && strlen($_REQUEST["Sid"]) > 0 )  {
    
    // we might have come directly here using the sid and use an earlier session
    
    Martin Haase's avatar
    Martin Haase committed
      $Sid = $_REQUEST["Sid"];
    
    }
    // not enough information, exiting. 
      else 
      {
         
        // check if we came via Shibboleth, but without an eduPersonPrincipalName 
        // (which would have been the REMOTE_USER)
          if (isset( $_SERVER['Shib-Session-ID'] )) {
    
    	  $util->printAuthFailure("shib_login_failure_heading", 
    				  "shib_login_failure_detail",
    
    				  "(Shibboleth login, but no ePPN provided)", 
    				  null ); 
    	exit;
          }
        else
          {	
    
    	if (!isset($_REQUEST["loginname"]) || strlen($_REQUEST["loginname"]) == 0) {
    
    	}
    	if (!isset($_REQUEST["password"]) || strlen($_REQUEST["password"]) == 0) {
    
    	if ($missing == 0) {
    	  $util->printAuthFailure("authn_failure_heading", 
    				  "authn_failure_detail_nothing_to_do",
    
    				  $_REQUEST["loginname"], 
    				  null ); 
    	  trigger_error("WebAuth does not know what to do (no login or password provided, no remote user, and no session Id), exiting.", E_USER_WARNING);
    
    	} else if ($missing == 1) {
    	  $util->printAuthFailure("authn_failure_heading", 
    				  "authn_failure_detail_id_missing",
    				  '(null)', 
    				  null ); 
    	} else if ($missing == 2) {
    	  $util->printAuthFailure("authn_failure_heading", 
    				  "authn_failure_detail_password_missing",
    				  $_REQUEST["loginname"], 
    				  null ); 
    	} else if ($missing == 3) {
    	  $util->printAuthFailure("authn_failure_heading", 
    				  "authn_failure_detail_both_missing",
    				  '(null)', 
    				  null ); 
    
    // no matter where we came from we need to retrieve attributes from RBAC
    $attributes = $rbac->getUserAttributes( $Sid );
    
    // if we already have enough attributes and just created a session, possibly update
    // them if there came different ones, and then finally print welcome screen causing 
    // the TextGridLab to take over the Sid
    if ($rbac->enoughUserAttributes( $Sid ) && isset ($_SERVER["REMOTE_USER"])) {
    
      $util->printAuthSuccess("authn_succeeded_heading",
    
    			  isset($_REQUEST["loginname"]) ? $_REQUEST["loginname"] : $_SERVER["REMOTE_USER"],
    
    			  $CSResult["rbachash"],
    
    Martin Haase's avatar
    Martin Haase committed
      $rbac->updateAttributes ( $ProvidedAttributes, $AttributeMap, $Sid ); //  not vital and second-order
    
    } else {
      // now presenting the form, let JavaScript take care for the non-empty-check and the help
    
    Martin Haase's avatar
    Martin Haase committed
      // the form will return either displaying the Sid or just an ACK
    
      if (isset ($_SERVER["REMOTE_USER"])) {
    
    Martin Haase's avatar
    Martin Haase committed
        $util->printAttributeForm( $attributes, $ProvidedAttributes, $AttributeMap, $Sid, $authZinstance, $_SERVER["REMOTE_USER"], $rbac->ToUversion, $rbac->ToUtext);
    
      } else if (isset ($_REQUEST["ePPN"]))  { // direct invocation of userdata modification dialogue
    
    Martin Haase's avatar
    Martin Haase committed
        $util->printAttributeForm( $attributes, null, null, $Sid, $authZinstance, $_REQUEST["ePPN"], $rbac->ToUversion, $rbac->ToUtext);
    
      } else {
        echo "Could not modify attributes, not enough information";
      }