package org.jentrata.ebms.internal.messaging; import org.apache.wss4j.common.ext.Attachment; import org.apache.wss4j.common.ext.AttachmentRequestCallback; import org.apache.wss4j.common.ext.AttachmentResultCallback; import javax.activation.DataHandler; import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.callback.UnsupportedCallbackException; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** * Used to provide message attachments for signing verification * * @author aaronwalker */ public class AttachmentCallbackHandler implements CallbackHandler { Map<String,List<Attachment>> attachments; List<Attachment> attachmentList; List<Attachment> attachmentResults; boolean callbacked = false; public AttachmentCallbackHandler(List<Attachment> attachmentList) { this.attachmentList = attachmentList; attachments = new LinkedHashMap<>(); for(Attachment a :attachmentList) { attachments.put(a.getId(), Arrays.asList(a)); } this.attachmentResults = new ArrayList<>(); } @Override public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { for(Callback callback : callbacks) { if(callback instanceof AttachmentRequestCallback) { AttachmentRequestCallback requestCallback = (AttachmentRequestCallback) callback; if(requestCallback.getAttachmentId() != null) { requestCallback.setAttachments(attachments.get(requestCallback.getAttachmentId())); } else { //not sure why we aren't getting an attachmentId so return all the attachments requestCallback.setAttachments(attachmentList); } } else { AttachmentResultCallback attachmentResultCallback = (AttachmentResultCallback) callback; attachmentResults.add(attachmentResultCallback.getAttachment()); callbacked = true; } } } public Map<String, DataHandler> getVerifiedAttachments() { Map<String,DataHandler> verifiedAttachments = new HashMap<>(); for(Attachment attachment : attachmentResults) { verifiedAttachments.put(attachment.getId(),new DataHandler(new AttachmentDataSource(attachment))); } return verifiedAttachments; } public boolean hasCallback() { return callbacked; } }