<?php 
/* 
 * consentAdmin - Consent administration module 
 * 
 * This module enables the user to add and remove consents given for a given 
 * Service Provider. 
 * 
 * The module relies on methods and functions from the Consent module and can 
 * not be user without it. 
 * 
 * Author: Mads Freen <[email protected]>, Jacob Christiansen <[email protected]> 
 */ 
 
/* 
 * Runs the processingchain and ignores all filter which have user  
 * interaction. 
 */ 
function driveProcessingChain($idp_metadata, $source, $sp_metadata, $sp_entityid, $attributes, $userid, $hashAttributes = FALSE) { 
 
    /*  
     * Create a new processing chain  
     */ 
    $pc = new SimpleSAML_Auth_ProcessingChain($idp_metadata, $sp_metadata, 'idp'); 
 
    /*  
     * Construct the state. 
     * REMEMBER: Do not set Return URL if you are calling processStatePassive 
     */ 
    $authProcState = array( 
        'Attributes' => $attributes, 
        'Destination' => $sp_metadata, 
        'Source' => $idp_metadata, 
        'isPassive' => TRUE, 
    ); 
 
    /*  
     * Call processStatePAssive. 
     * We are not interested in any user interaction, only modifications to the attributes 
     */ 
    $pc->processStatePassive($authProcState); 
 
    $attributes = $authProcState['Attributes']; 
 
    /* 
     * Generate identifiers and hashes 
     */ 
    $destination = $sp_metadata['metadata-set'] . '|' . $sp_entityid; 
 
    $targeted_id    = sspmod_consent_Auth_Process_Consent::getTargetedID($userid, $source, $destination); 
    $attribute_hash = sspmod_consent_Auth_Process_Consent::getAttributeHash($attributes, $hashAttributes); 
 
    SimpleSAML_Logger::info('consentAdmin: user: ' . $userid); 
    SimpleSAML_Logger::info('consentAdmin: target: ' . $targeted_id); 
    SimpleSAML_Logger::info('consentAdmin: attribute: ' . $attribute_hash); 
 
    /* Return values */ 
    return array($targeted_id, $attribute_hash, $attributes); 
} 
 
// Get config object 
$config = SimpleSAML_Configuration::getInstance(); 
$cA_config = SimpleSAML_Configuration::getConfig('module_consentAdmin.php'); 
$authority = $cA_config->getValue('authority'); 
 
$as = new SimpleSAML_Auth_Simple($authority); 
 
// If request is a logout request 
if(array_key_exists('logout', $_REQUEST)) { 
    $returnURL = $cA_config->getValue('returnURL'); 
    $as->logout($returnURL); 
} 
 
$hashAttributes = $cA_config->getValue('attributes.hash'); 
 
/* Check if valid local session exists */ 
$as->requireAuth(); 
 
// Get released attributes 
$attributes = $as->getAttributes(); 
 
// Get metadata storage handler 
$metadata = SimpleSAML_Metadata_MetaDataStorageHandler::getMetadataHandler(); 
 
/* 
 * Get IdP id and metadata 
 */ 
 
 
$local_idp_entityid = $metadata->getMetaDataCurrentEntityID('saml20-idp-hosted'); 
$local_idp_metadata = $metadata->getMetaData($local_idp_entityid, 'saml20-idp-hosted'); 
 
if($as->getAuthData('saml:sp:IdP') !== NULL) { 
    /* 
     * From a remote idp (as bridge) 
      */ 
    $idp_entityid = $as->getAuthData('saml:sp:IdP'); 
    $idp_metadata = $metadata->getMetaData($idp_entityid, 'saml20-idp-remote'); 
} else { 
    /* 
     * from the local idp 
     */ 
    $idp_entityid = $local_idp_entityid; 
    $idp_metadata = $local_idp_metadata; 
} 
 
// Get user ID 
$userid_attributename = (isset($local_idp_metadata['userid.attribute']) && is_string($local_idp_metadata['userid.attribute'])) ? $local_idp_metadata['userid.attribute'] : 'eduPersonPrincipalName'; 
 
$userids = $attributes[$userid_attributename]; 
         
if (empty($userids)) { 
    throw new Exception('Could not generate useridentifier for storing consent. Attribute [' . 
        $userid_attributename . '] was not available.'); 
} 
 
$userid = $userids[0]; 
 
// Get all SP metadata 
$all_sp_metadata = $metadata->getList('saml20-sp-remote'); 
 
// Parse action, if any 
$action = null; 
$sp_entityid = null; 
if (!empty($_GET['cv'])) { 
    $sp_entityid=$_GET['cv']; 
} 
if (!empty($_GET['action'])) { 
    $action=$_GET["action"]; 
} 
 
SimpleSAML_Logger::critical('consentAdmin: sp: ' .$sp_entityid.' action: '.$action); 
 
// Remove services, whitch have consent disabled 
if(isset($idp_metadata['consent.disable'])) { 
    foreach($idp_metadata['consent.disable'] AS $disable) { 
        if(array_key_exists($disable, $all_sp_metadata)) { 
            unset($all_sp_metadata[$disable]); 
        } 
    } 
} 
 
SimpleSAML_Logger::info('consentAdmin: '.$idp_entityid); 
 
// Calc correct source 
$source = $idp_metadata['metadata-set'] . '|' . $idp_entityid; 
 
// Parse consent config 
$consent_storage = sspmod_consent_Store::parseStoreConfig($cA_config->getValue('consentadmin')); 
 
// Calc correct user ID hash 
$hashed_user_id = sspmod_consent_Auth_Process_Consent::getHashedUserID($userid, $source); 
 
// If a checkbox have been clicked 
if ($action != null && $sp_entityid != null) { 
    // Get SP metadata 
    $sp_metadata = $metadata->getMetaData($sp_entityid, 'saml20-sp-remote'); 
 
    // Run AuthProc filters 
    list($targeted_id, $attribute_hash, $attributes_new) = driveProcessingChain($idp_metadata, $source, $sp_metadata, $sp_entityid, $attributes, $userid, $hashAttributes); 
 
    // Add a consent (or update if attributes have changed and old consent for SP and IdP exists) 
    if($action == 'true') { 
        $isStored = $consent_storage->saveConsent($hashed_user_id, $targeted_id, $attribute_hash); 
        if($isStored) { 
            $res = "added"; 
        } else { 
            $res = "updated"; 
        } 
    // Remove consent 
    } else if($action == 'false') { 
        // Got consent, so this is a request to remove it 
        $rowcount = $consent_storage->deleteConsent($hashed_user_id, $targeted_id, $attribute_hash); 
        if($rowcount > 0) { 
            $res = "removed"; 
        } 
    // Unknown action (should not happen) 
    } else { 
        SimpleSAML_Logger::info('consentAdmin: unknown action'); 
        $res = "unknown"; 
    } 
    /* 
     * Init template to enable translation of status messages  
      */ 
    $et = new SimpleSAML_XHTML_Template($config, 'consentAdmin:consentadminajax.php', 'consentAdmin:consentadmin'); 
    $et->data['res'] = $res; 
    $et->show(); 
    exit; 
} 
 
// Get all consents for user 
$user_consent_list = $consent_storage->getConsents($hashed_user_id); 
 
// Parse list of consents 
$user_consent = array(); 
foreach ($user_consent_list as $c) { 
    $user_consent[$c[0]]=$c[1]; 
} 
 
$template_sp_content = array(); 
 
// Init template 
$et = new SimpleSAML_XHTML_Template($config, 'consentAdmin:consentadmin.php', 'consentAdmin:consentadmin'); 
$sp_empty_name = $et->getTag('sp_empty_name'); 
$sp_empty_description = $et->getTag('sp_empty_description'); 
 
// Process consents for all SP 
foreach ($all_sp_metadata as $sp_entityid => $sp_values) { 
    // Get metadata for SP 
    $sp_metadata = $metadata->getMetaData($sp_entityid, 'saml20-sp-remote'); 
 
    // Run attribute filters 
    list($targeted_id, $attribute_hash, $attributes_new) = driveProcessingChain($idp_metadata, $source, $sp_metadata, $sp_entityid, $attributes, $userid, $hashAttributes); 
 
    // Check if consent exists 
    if (array_key_exists($targeted_id, $user_consent)) { 
        $sp_status = "changed"; 
        SimpleSAML_Logger::info('consentAdmin: changed'); 
        // Check if consent is valid. (Possible that attributes has changed) 
        if ($user_consent[$targeted_id] == $attribute_hash) { 
            SimpleSAML_Logger::info('consentAdmin: ok'); 
            $sp_status = "ok"; 
        } 
    // Consent does not exists 
    } else { 
        SimpleSAML_Logger::info('consentAdmin: none'); 
        $sp_status = "none"; 
    } 
 
    // Set name of SP 
    if(isset($sp_values['name']) && is_array($sp_values['name'])) { 
        $sp_name = $sp_metadata['name']; 
    } else if(isset($sp_values['name']) && is_string($sp_values['name'])) { 
        $sp_name = $sp_metadata['name']; 
    } elseif(isset($sp_values['OrganizationDisplayName']) && is_array($sp_values['OrganizationDisplayName'])) { 
        $sp_name = $sp_metadata['OrganizationDisplayName']; 
    } else { 
        $sp_name = $sp_empty_name; 
    } 
 
    // Set description of SP 
    if(empty($sp_metadata['description']) || !is_array($sp_metadata['description'])) { 
        $sp_description = $sp_empty_description; 
    } else { 
        $sp_description = $sp_metadata['description']; 
    } 
 
    // Add a URL to the service if present in metadata 
    $sp_service_url = isset($sp_metadata['ServiceURL']) ? $sp_metadata['ServiceURL'] : null; 
 
    // Fill out array for the template 
    $sp_list[$sp_entityid] = array( 
        'spentityid' => $sp_entityid, 
        'name' =>  $sp_name, 
        'description' =>  $sp_description, 
        'consentStatus' => $sp_status, 
        'consentValue' => $sp_entityid, 
        'attributes_by_sp' => $attributes_new, 
        'serviceurl' => $sp_service_url, 
    ); 
} 
 
$et->data['header'] = 'Consent Administration'; 
$et->data['spList'] = $sp_list; 
$et->data['showDescription'] = $cA_config->getValue('showDescription'); 
$et->show(); 
?> 
 
 |