3.1.1.11.2.11 TransformClaimsOnTrustTraversal

 procedure TransformClaimsOnTrustTraversal (
     pInputClaimsBlob : ADDRESS OF CLAIMS_BLOB,
     trustName : unicodestring,
     fIncomingDirection : boolean,
     pOutputClaimsBlob : ADDRESS OF CLAIMS_BLOB) : ULONG

This procedure defines the logical processing for transforming a set of claims on trust traversal. This procedure uses the Claim data structure defined in [MS-CTA] section 2.1.2 and invokes the Claims Transformation Algorithm ([MS-CTA] section 2.1) for intermediate processing.

pInputClaimsBlob: The address of the CLAIMS_BLOB structure that contains the set of claims that are to be transformed.

trustName: The name of the trust that is being traversed.

fIncomingDirection: The direction of traversal. This parameter MUST be set to TRUE if the claims originated outside the trust boundary and are entering the trust boundary; otherwise, this parameter MUST be set to FALSE.

pOutputClaimsBlob: The address of a CLAIMS_BLOB structure that receives the transformed claims output.

Return Values: This procedure returns zero upon success or a nonzero result upon failure.

Logical Processing:

 trustDsName : DSName;
 claimsTransformRulesXml : string;
 claimsTransformRulesText : string;
 status : ULONG;
 CTAInputClaims : Claim[];
 CTAOutputClaims : Claim[];
 outputClaimsUnfiltered : CLAIMS_ARRAY;
 systemContainer : DSName;
 trustDsName := null;
 claimsTransformRulesXml := null;
 claimsTransformRulesText := null;
 status := 0;
 CTAInputClaims := null;
 CTAOutputClaims := null;
 outputClaimsUnfiltered := null;
 systemContainer := DescendantObject( DefaultNC(), "CN=System");
  
 for (x in children systemContainer )
     if (x!name = trustName)
         trustDsName := x
         break;
     endif
 endfor
  
 if (trustDsName = null)
     return ERROR_INVALID_PARAMETER;
 endif
  
 status := GetClaimsTransformationRulesXml(trustDsName, fIncomingDirection,
                                           ADDRESS OF claimsTransformRulesXml)
 if (status ≠ 0 and
      status ≠ ERROR_DS_OBJ_NOT_FOUND)
     pOutputClaimsBlob^ := 0;
     return 0;
 endif
  
 if (status = ERROR_DS_OBJ_NOT_FOUND)
      if (fIncomingDirection = FALSE)
            pOutputClaimsBlob^ := pInputClaimsBlob^;
      else
            pOutputClaimsBlob^ := 0;
      endif
 endif
  
 if (claimsTransformRulesXml ≠ null)
         status := GetTransformationRulesText (claimsTransformRulesXml,
                                         ADDRESS OF claimsTransformRulesText);
         if (status ≠ 0)
             pOutputClaimsBlob^ := 0;
         endif
 endif
  
 GetCTAClaims (pInputClaimsBlob^, ADDRESS OF CTAInputClaims);
  
 // Invoke the Claims Transformation Algorithm
 // specified generally in [MS-CTA] section 2 and more specifically
 // in [MS-CTA] section 2.1.3 with the following parameter mappings:
 //  CTAInputClaims --> InputClaims
 //  claimsTransformRulesText --> InputTransformationRulesText
 //  ADDRESS OF CTAOutputClaims --> OutputClaims
 //  status --> ReturnValue
  
 if (status ≠ 0)
       pOutputClaimsBlob^ := 0;
       return 0;
 endif
  
 CollapseMultiValuedClaims (CTAOutputClaims, ADDRESS OF outputClaimsUnfiltered);
  
 FilterAndPackOutputClaims(outputClaimsUnfiltered,
                           fIncomingDirection, pOutputClaimsBlob);
  
 return 0;