...
Code Block |
---|
language | xml |
---|
title | Encoding 'pipe' character appearing in CAS service URLs |
---|
collapse | true |
---|
|
<bean id="shibboleth.CASValidationAuditExtractors" parent="shibboleth.DefaultCASValidationAuditExtractors" lazy-init="true">
<property name="sourceMap">
<map merge="true">
<entry>
<key>
<util:constant static-field="net.shibboleth.idp.cas.protocol.CASAuditFields.SERVICE_URL"/>
</key>
<bean parent="shibboleth.ContextFunctions.Scripted" factory-method="inlineScript">
<constructor-arg>
<value>
<![CDATA[
var serviceLookupFunctionClass = Java.type("net.shibboleth.idp.cas.audit.impl.ServiceLookupFunction");
var serviceLookupFunction = new serviceLookupFunctionClass();
var service = serviceLookupFunction.apply(input);
if (service != null) {
var serviceNew = service.replace(/\|/g, '%7C');
}
else {
var serviceNew = null;
}
serviceNew;
]]>
</value>
</constructor-arg>
</bean>
</entry>
</map>
</property>
</bean> |
A rather more convoluted example is to dump the values or arbitratry attributes into the log. To do this we define an abstract bean to emit the attribute values (in an arbitrary format) for any attribute
Code Block |
---|
language | xml |
---|
title | Output Attribute Values |
---|
collapse | true |
---|
|
<bean id="AttributeValueExtraction" parent="shibboleth.ContextFunctions.Scripted" factory-method="inlineScript" abstract="true">
<constructor-arg>
<value>
<![CDATA[
var getinfo = function() {
var rpContext = input.getSubcontext("net.shibboleth.idp.profile.context.RelyingPartyContext");
if (null === rpContext) {
return "norp";
}
var attrContext = rpContext.getSubcontext("net.shibboleth.idp.attribute.context.AttributeContext");
if (null === attrContext) {
return "noac";
}
var attributes = null
attributes = attrContext.getUnfilteredIdPAttributes();
if (attributes === null) {
return "Notrr";
}
attribute = attributes.get(custom);
if (attribute === null || attribute.getValues().isEmpty()) {
return null;
}
var iter = attribute.getValues().iterator();
var result = "";
while (iter.hasNext()) {
result = result + iter.next().toString();
}
return result;
}
getinfo();
]]>
</value>
</constructor-arg>
</bean> |
then a bean to emit a specific attribute can be easily created
Code Block |
---|
|
<bean id="EmailExtraction" parent="AttributeValueExtraction" p:customObject="mail" /> |
Built-In Fields
The fields that are supported out of the box are as follows (note that not every field is always populated, it depends on the timing of errors and the specific transaction being audited):
...