package at.gv.egovernment.moa.spss.tsl.utils; import iaik.util.logging.Log.MultiThreadLoggingGroup; import iaik.util.logging.Log; import iaik.util.logging.GeneralLog; import iaik.xml.crypto.tsl.BaseClass; import iaik.xml.crypto.tsl.SIEExtensionChecker; import iaik.xml.crypto.tsl.constants.Countries; import iaik.xml.crypto.tsl.ex.TSLSIEExtensionException; import iaik.xml.crypto.tsl.ex.SeverityAspect.Mitigation; import iaik.xml.crypto.tsl.sie.gen.CriteriaListType; import iaik.xml.crypto.tsl.sie.gen.KeyUsageBitType; import iaik.xml.crypto.tsl.sie.gen.KeyUsageType; import iaik.xml.crypto.tsl.sie.gen.ObjectFactory; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public final class TSLEvaluationContext extends iaik.xml.crypto.tsl.TSLEvaluationContext { public TSLEvaluationContext( String workingdirectory, boolean sqlMultithreaded, boolean throwExceptions, boolean logExceptions, boolean throwWarnings, boolean logWarnings) { super(workingdirectory, sqlMultithreaded, throwExceptions, logExceptions, throwWarnings, logWarnings); } @Override public Object throwException(Throwable e, Method enclosingMethod, Object thisObject, Object[] parameters) { if (e instanceof TSLSIEExtensionException && e.getMessage() == TSLSIEExtensionException.NO_KEYUSEAGE_NOR_POLICYSET) { CriteriaListType criteriaList = (CriteriaListType) parameters[1]; GeneralLog.warn(criteriaList.getDescription()); String description = criteriaList.getDescription(); if (description .trim() .equals( "This service issues qualified certificates for e-signing and " + "e-authentication within the same process. The Relaying Party shall " + "make distinction by inspection of keyUsage field contents - " + "e-signature certificates have non-repudation bit set exclusively.")) { criteriaList.setAssert(SIEExtensionChecker.Asssert.all.toString()); ObjectFactory of = new ObjectFactory(); KeyUsageType ku = of.createKeyUsageType(); KeyUsageBitType kb = of.createKeyUsageBitType(); kb.setName(SIEExtensionChecker.KeyUseageBit.nonRepudiation .toString()); kb.setValue(true); ku.getKeyUsageBit().add(kb); criteriaList.getKeyUsage().add(ku); Object mitigatedResult = null; try { mitigatedResult = enclosingMethod.invoke(thisObject, parameters); } catch (IllegalAccessException e1) { wrapException(e1); } catch (InvocationTargetException e1) { wrapException(e1); } if (mitigatedResult != null) { wrapException(e, criteriaList.sourceLocation(), new Mitigation() { @Override public String getReport() { return "Fixed invalid criteria list"; } }); return mitigatedResult; } } } return super.throwException(e, enclosingMethod, thisObject, parameters); } @Override protected long howLongWaitForThreads() { return 10000; } @Override protected BaseClass getCurrentBaseClass() { //TODO check whether we can avoid by redesign to focus this only on import return null; } @Override public boolean normalizeXML() { return true; } public Countries getExpectedTerritory() { return null; } public MultiThreadLoggingGroup getLoggingGroup() { return this; } StringBuffer log = new StringBuffer(); public void flushLog() { if (log != null && log.length() > 0) { synchronized (System.out) { Thread currentThread = Thread.currentThread(); print("# # # " + getHint() + " Thread: " + currentThread.getName() + "(" + currentThread.getId() + ") collected logs - BEGIN # # #\n" + log.toString() + "# # # " + getHint() + " Thread: " + currentThread.getName() + "(" + currentThread.getId() + ") collected logs - END # # #\n"); } log = null; } } public void print(Object msg) { Log.print(msg); } }