Search in sources :

Example 1 with Ebms3Receipt

use of com.helger.phase4.ebms3header.Ebms3Receipt in project phase4 by phax.

the class AS4IncomingHandler method processEbmsMessage.

@Nonnull
public static IAS4MessageState processEbmsMessage(@Nonnull @WillNotClose final AS4ResourceHelper aResHelper, @Nonnull final Locale aLocale, @Nonnull final SOAPHeaderElementProcessorRegistry aRegistry, @Nonnull final HttpHeaderMap aHttpHeaders, @Nonnull final Document aSoapDocument, @Nonnull final ESoapVersion eSoapVersion, @Nonnull final ICommonsList<WSS4JAttachment> aIncomingAttachments, @Nonnull final IAS4IncomingProfileSelector aAS4ProfileSelector, @Nonnull final ICommonsList<Ebms3Error> aErrorMessagesTarget) throws Phase4Exception {
    ValueEnforcer.notNull(aResHelper, "ResHelper");
    ValueEnforcer.notNull(aLocale, "Locale");
    ValueEnforcer.notNull(aHttpHeaders, "HttpHeaders");
    ValueEnforcer.notNull(aSoapDocument, "SoapDocument");
    ValueEnforcer.notNull(eSoapVersion, "SoapVersion");
    ValueEnforcer.notNull(aIncomingAttachments, "IncomingAttachments");
    ValueEnforcer.notNull(aAS4ProfileSelector, "AS4ProfileSelector");
    ValueEnforcer.notNull(aErrorMessagesTarget, "aErrorMessagesTarget");
    if (LOGGER.isDebugEnabled()) {
        LOGGER.debug("Received the following SOAP " + eSoapVersion.getVersion() + " document:");
        LOGGER.debug(AS4XMLHelper.serializeXML(aSoapDocument));
        if (aIncomingAttachments.isEmpty()) {
            LOGGER.debug("Without any incoming attachments");
        } else {
            LOGGER.debug("Including the following " + aIncomingAttachments.size() + " attachments:");
            LOGGER.debug(aIncomingAttachments.toString());
        }
    }
    // This is where all data from the SOAP headers is stored to
    final AS4MessageState aState = new AS4MessageState(eSoapVersion, aResHelper, aLocale);
    // Handle all headers - modifies the state
    _processSoapHeaderElements(aRegistry, aSoapDocument, aIncomingAttachments, aState, aErrorMessagesTarget);
    // Remember if header processing was successful or not
    final boolean bSoapHeaderElementProcessingSuccess = aErrorMessagesTarget.isEmpty();
    aState.setSoapHeaderElementProcessingSuccessful(bSoapHeaderElementProcessingSuccess);
    if (bSoapHeaderElementProcessingSuccess) {
        // Every message can only contain 1 User message or 1 pull message
        // aUserMessage can be null on incoming Pull-Message!
        final Ebms3UserMessage aEbmsUserMessage = aState.getEbmsUserMessage();
        final Ebms3Error aEbmsError = aState.getEbmsError();
        final Ebms3PullRequest aEbmsPullRequest = aState.getEbmsPullRequest();
        final Ebms3Receipt aEbmsReceipt = aState.getEbmsReceipt();
        // Check payload consistency
        final int nCountData = (aEbmsUserMessage != null ? 1 : 0) + (aEbmsPullRequest != null ? 1 : 0) + (aEbmsReceipt != null ? 1 : 0) + (aEbmsError != null ? 1 : 0);
        if (nCountData != 1) {
            LOGGER.error("Expected a UserMessage(" + (aEbmsUserMessage != null ? 1 : 0) + "), a PullRequest(" + (aEbmsPullRequest != null ? 1 : 0) + "), a Receipt(" + (aEbmsReceipt != null ? 1 : 0) + ") or an Error(" + (aEbmsError != null ? 1 : 0) + ")");
            // send EBMS:0001 error back
            aErrorMessagesTarget.add(EEbmsError.EBMS_VALUE_NOT_RECOGNIZED.getAsEbms3Error(aLocale, aState.getMessageID()));
        }
        // Determine AS4 profile ID (since 0.13.0)
        final String sProfileID = aAS4ProfileSelector.getAS4ProfileID(aState);
        if (LOGGER.isDebugEnabled())
            LOGGER.debug("Determined AS4 profile ID '" + sProfileID + "' for current message");
        aState.setProfileID(sProfileID);
        final IPMode aPMode = aState.getPMode();
        final PModeLeg aEffectiveLeg = aState.getEffectivePModeLeg();
        if (aEbmsUserMessage != null) {
            // User message requires PMode
            if (aPMode == null)
                throw new Phase4Exception("No AS4 P-Mode configuration found for user-message!");
            // Only check leg if the message is a usermessage
            if (aEffectiveLeg == null)
                throw new Phase4Exception("No AS4 P-Mode leg could be determined!");
            // Only do profile checks if a profile is set
            if (StringHelper.hasText(sProfileID)) {
                // Resolve profile ID
                final IAS4Profile aProfile = MetaAS4Manager.getProfileMgr().getProfileOfID(sProfileID);
                if (aProfile == null)
                    throw new IllegalStateException("The configured AS4 profile '" + sProfileID + "' does not exist.");
                // Profile Checks gets set when started with Server
                final IAS4ProfileValidator aValidator = aProfile.getValidator();
                if (aValidator != null) {
                    if (aAS4ProfileSelector.validateAgainstProfile()) {
                        final ErrorList aErrorList = new ErrorList();
                        aValidator.validatePMode(aPMode, aErrorList);
                        aValidator.validateUserMessage(aEbmsUserMessage, aErrorList);
                        if (aErrorList.isNotEmpty()) {
                            throw new Phase4Exception("Error validating incoming AS4 message with the profile " + aProfile.getDisplayName() + "\n Following errors are present: " + aErrorList.getAllErrors().getAllTexts(aLocale));
                        }
                    } else {
                        LOGGER.warn("The AS4 profile '" + sProfileID + "' has a validation configured, but the usage was disabled using the AS4ProfileSelector");
                    }
                }
            } else {
                if (LOGGER.isDebugEnabled())
                    LOGGER.debug("AS4 state contains no AS4 profile ID - therefore no consistency checks are performed");
            }
            // Ensure the decrypted attachments are used
            final ICommonsList<WSS4JAttachment> aDecryptedAttachments = aState.hasDecryptedAttachments() ? aState.getDecryptedAttachments() : aState.getOriginalAttachments();
            // Decompress attachments (if compressed)
            // Result is directly in the decrypted attachments list!
            _decompressAttachments(aDecryptedAttachments, aEbmsUserMessage, aState);
        } else {
            // Pull-request also requires PMode
            if (aEbmsPullRequest != null && aPMode == null)
                throw new Phase4Exception("No AS4 P-Mode configuration found for pull-request!");
        }
        final boolean bUseDecryptedSOAP = aState.hasDecryptedSoapDocument();
        final Document aRealSOAPDoc = bUseDecryptedSOAP ? aState.getDecryptedSoapDocument() : aSoapDocument;
        assert aRealSOAPDoc != null;
        // Find SOAP body (mandatory according to SOAP XSD)
        final Node aBodyNode = XMLHelper.getFirstChildElementOfName(aRealSOAPDoc.getDocumentElement(), eSoapVersion.getNamespaceURI(), eSoapVersion.getBodyElementName());
        if (aBodyNode == null)
            throw new Phase4Exception((bUseDecryptedSOAP ? "Decrypted" : "Original") + " SOAP document is missing a Body element");
        aState.setSoapBodyPayloadNode(aBodyNode.getFirstChild());
        final boolean bIsPingMessage = AS4Helper.isPingMessage(aPMode);
        aState.setPingMessage(bIsPingMessage);
        if (bIsPingMessage)
            LOGGER.info("Received an AS4 Ping message - meaning it will NOT be handled by the custom handlers.");
    }
    return aState;
}
Also used : Ebms3Receipt(com.helger.phase4.ebms3header.Ebms3Receipt) IAS4Profile(com.helger.phase4.profile.IAS4Profile) PModeLeg(com.helger.phase4.model.pmode.leg.PModeLeg) Node(org.w3c.dom.Node) Ebms3Error(com.helger.phase4.ebms3header.Ebms3Error) Document(org.w3c.dom.Document) Phase4Exception(com.helger.phase4.util.Phase4Exception) ErrorList(com.helger.commons.error.list.ErrorList) Ebms3PullRequest(com.helger.phase4.ebms3header.Ebms3PullRequest) IPMode(com.helger.phase4.model.pmode.IPMode) Ebms3UserMessage(com.helger.phase4.ebms3header.Ebms3UserMessage) IAS4ProfileValidator(com.helger.phase4.profile.IAS4ProfileValidator) WSS4JAttachment(com.helger.phase4.attachment.WSS4JAttachment) Nonnull(javax.annotation.Nonnull)

Example 2 with Ebms3Receipt

use of com.helger.phase4.ebms3header.Ebms3Receipt in project phase4 by phax.

the class SOAPHeaderElementProcessorExtractEbms3Messaging method processHeaderElement.

@Nonnull
public ESuccess processHeaderElement(@Nonnull final Document aSOAPDoc, @Nonnull final Element aElement, @Nonnull final ICommonsList<WSS4JAttachment> aAttachments, @Nonnull final AS4MessageState aState, @Nonnull final ErrorList aErrorList) {
    final IMPCManager aMPCMgr = MetaAS4Manager.getMPCMgr();
    IPMode aPMode = null;
    final ICommonsMap<String, EAS4CompressionMode> aCompressionAttachmentIDs = new CommonsHashMap<>();
    IMPC aEffectiveMPC = null;
    String sInitiatorID = null;
    String sResponderID = null;
    final Locale aLocale = aState.getLocale();
    // Parse EBMS3 Messaging object
    final CollectingValidationEventHandler aCVEH = new CollectingValidationEventHandler();
    final Ebms3Messaging aMessaging = Ebms3ReaderBuilder.ebms3Messaging().setValidationEventHandler(aCVEH).read(aElement);
    // wellformed
    if (aMessaging == null) {
        // Invalid Header == not wellformed/invalid xml
        for (final IError aError : aCVEH.getErrorList()) {
            LOGGER.error("Header error: " + aError.getAsString(aLocale));
            aErrorList.add(SingleError.builder(aError).errorID(EEbmsError.EBMS_INVALID_HEADER.getErrorCode()).build());
        }
        return ESuccess.FAILURE;
    }
    // Remember in state
    aState.setMessaging(aMessaging);
    // 0 or 1 are allowed
    final int nUserMessages = aMessaging.getUserMessageCount();
    if (nUserMessages > 1) {
        LOGGER.error("Too many UserMessage objects (" + nUserMessages + ") contained.");
        aErrorList.add(EEbmsError.EBMS_VALUE_INCONSISTENT.getAsError(aLocale));
        return ESuccess.FAILURE;
    }
    // 0 or 1 are allowed
    final int nSignalMessages = aMessaging.getSignalMessageCount();
    if (nSignalMessages > 1) {
        LOGGER.error("Too many SignalMessage objects (" + nSignalMessages + ") contained.");
        aErrorList.add(EEbmsError.EBMS_VALUE_INCONSISTENT.getAsError(aLocale));
        return ESuccess.FAILURE;
    }
    if (nUserMessages + nSignalMessages == 0) {
        // No Message was found
        LOGGER.error("Neither UserMessage nor SignalMessage object contained.");
        aErrorList.add(EEbmsError.EBMS_VALUE_INCONSISTENT.getAsError(aLocale));
        return ESuccess.FAILURE;
    }
    // Check if the usermessage has a PMode in the collaboration info
    final Ebms3UserMessage aUserMessage = CollectionHelper.getAtIndex(aMessaging.getUserMessage(), 0);
    if (aUserMessage != null) {
        final Ebms3MessageInfo aMsgInfo = aUserMessage.getMessageInfo();
        if (aMsgInfo != null) {
            // Set this is as early as possible, so that eventually occurring error
            // messages can use the "RefToMessageId" element properly
            aState.setMessageID(aMsgInfo.getMessageId());
            aState.setRefToMessageID(aMsgInfo.getRefToMessageId());
            aState.setMessageTimestamp(aMsgInfo.getTimestamp());
        }
        // PartyInfo is mandatory in UserMessage
        // From is mandatory in PartyInfo
        // To is mandatory in PartyInfo
        final List<Ebms3PartyId> aFromPartyIdList = aUserMessage.getPartyInfo().getFrom().getPartyId();
        final List<Ebms3PartyId> aToPartyIdList = aUserMessage.getPartyInfo().getTo().getPartyId();
        if (aFromPartyIdList.size() > 1 || aToPartyIdList.size() > 1) {
            LOGGER.error("More than one PartyId is containted in From or To Recipient please check the message.");
            aErrorList.add(EEbmsError.EBMS_VALUE_INCONSISTENT.getAsError(aLocale));
            return ESuccess.FAILURE;
        }
        // Setting Initiator and Responder id, Required values or else xsd will
        // throw an error
        sInitiatorID = aFromPartyIdList.get(0).getValue();
        sResponderID = aToPartyIdList.get(0).getValue();
        final Ebms3CollaborationInfo aCollaborationInfo = aUserMessage.getCollaborationInfo();
        if (aCollaborationInfo != null) {
            // Find PMode
            String sPModeID = null;
            String sAgreementRef = null;
            if (aCollaborationInfo.getAgreementRef() != null) {
                sPModeID = aCollaborationInfo.getAgreementRef().getPmode();
                sAgreementRef = aCollaborationInfo.getAgreementRef().getValue();
            }
            // Get responder address from properties file (may be null)
            final String sAddress = AS4Configuration.getThisEndpointAddress();
            aPMode = m_aPModeResolver.getPModeOfID(sPModeID, aCollaborationInfo.getService().getValue(), aCollaborationInfo.getAction(), sInitiatorID, sResponderID, sAgreementRef, sAddress);
            // Should be screened by the XSD conversion already
            if (aPMode == null) {
                LOGGER.error("Failed to resolve PMode '" + sPModeID + "' using resolver " + m_aPModeResolver);
                aErrorList.add(EEbmsError.EBMS_PROCESSING_MODE_MISMATCH.getAsError(aLocale));
                return ESuccess.FAILURE;
            }
        }
        // to use the configuration for leg2
        PModeLeg aPModeLeg1 = null;
        PModeLeg aPModeLeg2 = null;
        // Needed for the compression check: it is not allowed to have a
        // compressed attachment and a SOAPBodyPayload
        boolean bHasSoapBodyPayload = false;
        if (aPMode != null) {
            aPModeLeg1 = aPMode.getLeg1();
            aPModeLeg2 = aPMode.getLeg2();
            // both are present
            if (aPMode.getMEPBinding().getRequiredLegs() == 2 && aPModeLeg2 == null) {
                LOGGER.error("Error processing the UserMessage, PMode does not contain leg 2.");
                aErrorList.add(EEbmsError.EBMS_PROCESSING_MODE_MISMATCH.getAsError(aLocale));
                return ESuccess.FAILURE;
            }
            final boolean bUseLeg1 = _isUseLeg1(aUserMessage);
            final PModeLeg aEffectiveLeg = bUseLeg1 ? aPModeLeg1 : aPModeLeg2;
            final int nLegNum = bUseLeg1 ? 1 : 2;
            if (aEffectiveLeg == null) {
                LOGGER.error("Error processing the UserMessage, PMode does not contain effective leg " + nLegNum + ".");
                aErrorList.add(EEbmsError.EBMS_PROCESSING_MODE_MISMATCH.getAsError(aLocale));
                return ESuccess.FAILURE;
            }
            aState.setEffectivePModeLeg(nLegNum, aEffectiveLeg);
            if (_checkMPCOfPMode(aEffectiveLeg, aMPCMgr, aLocale, aErrorList).isFailure())
                return ESuccess.FAILURE;
            bHasSoapBodyPayload = _checkSOAPBodyHasPayload(aEffectiveLeg, aSOAPDoc);
            final String sEffectiveMPCID = _getMPCIDOfUserMsg(aUserMessage, aEffectiveLeg);
            // PMode is valid
            // Now Check if MPC valid
            aEffectiveMPC = aMPCMgr.getMPCOrDefaultOfID(sEffectiveMPCID);
            if (aEffectiveMPC == null) {
                LOGGER.error("Error processing the UserMessage, effective MPC ID '" + sEffectiveMPCID + "' is unknown!");
                aErrorList.add(EEbmsError.EBMS_VALUE_INCONSISTENT.getAsError(aLocale));
                return ESuccess.FAILURE;
            }
        }
        // Remember in state
        aState.setSoapBodyPayloadPresent(bHasSoapBodyPayload);
        final Ebms3PayloadInfo aEbms3PayloadInfo = aUserMessage.getPayloadInfo();
        if (aEbms3PayloadInfo == null || aEbms3PayloadInfo.getPartInfo().isEmpty()) {
            if (bHasSoapBodyPayload) {
                LOGGER.error("No PayloadInfo/PartInfo is specified, so no SOAP body payload is allowed.");
                aErrorList.add(EEbmsError.EBMS_VALUE_INCONSISTENT.getAsError(aLocale));
                return ESuccess.FAILURE;
            }
            // attachments in the message
            if (aAttachments.isNotEmpty()) {
                LOGGER.error("No PayloadInfo/PartInfo is specified, so no attachments are allowed.");
                aErrorList.add(EEbmsError.EBMS_EXTERNAL_PAYLOAD_ERROR.getAsError(aLocale));
                return ESuccess.FAILURE;
            }
        } else {
            // Check if there are more Attachments then specified
            if (aAttachments.size() > aEbms3PayloadInfo.getPartInfoCount()) {
                LOGGER.error("Error processing the UserMessage, the amount of specified attachments does not correlate with the actual attachments in the UserMessage. Expected " + aEbms3PayloadInfo.getPartInfoCount() + " but having " + aAttachments.size() + " attachments.");
                aErrorList.add(EEbmsError.EBMS_EXTERNAL_PAYLOAD_ERROR.getAsError(aLocale));
                return ESuccess.FAILURE;
            }
            int nSpecifiedAttachments = 0;
            for (final Ebms3PartInfo aPartInfo : aEbms3PayloadInfo.getPartInfo()) {
                // If href is null or empty there has to be a SOAP Payload
                if (StringHelper.hasNoText(aPartInfo.getHref())) {
                    // Check if there is a BodyPayload as specified in the UserMessage
                    if (!bHasSoapBodyPayload) {
                        LOGGER.error("Error processing the UserMessage. Expected a SOAPBody Payload but there is none present.");
                        aErrorList.add(EEbmsError.EBMS_VALUE_INCONSISTENT.getAsError(aLocale));
                        return ESuccess.FAILURE;
                    }
                } else {
                    // Attachment
                    // To check attachments which are specified in the usermessage and
                    // the real amount in the mime message
                    nSpecifiedAttachments++;
                    final String sAttachmentID = StringHelper.trimStart(aPartInfo.getHref(), MessageHelperMethods.PREFIX_CID);
                    final WSS4JAttachment aIncomingAttachment = aAttachments.findFirst(x -> EqualsHelper.equals(x.getId(), sAttachmentID));
                    if (aIncomingAttachment == null) {
                        LOGGER.warn("Failed to resolve MIME attachment '" + sAttachmentID + "' in list of " + aAttachments.getAllMapped(WSS4JAttachment::getId));
                    }
                    boolean bMimeTypePresent = false;
                    boolean bCompressionTypePresent = false;
                    if (aPartInfo.getPartProperties() != null)
                        for (final Ebms3Property aEbms3Property : aPartInfo.getPartProperties().getProperty()) {
                            final String sPropertyName = aEbms3Property.getName();
                            final String sPropertyValue = aEbms3Property.getValue();
                            if (sPropertyName.equalsIgnoreCase(MessageHelperMethods.PART_PROPERTY_MIME_TYPE)) {
                                bMimeTypePresent = StringHelper.hasText(sPropertyValue);
                            } else if (sPropertyName.equalsIgnoreCase(MessageHelperMethods.PART_PROPERTY_COMPRESSION_TYPE)) {
                                // Only needed check here since AS4 does not support another
                                // CompressionType
                                // http://wiki.ds.unipi.gr/display/ESENS/PR+-+AS4
                                final EAS4CompressionMode eCompressionMode = EAS4CompressionMode.getFromMimeTypeStringOrNull(sPropertyValue);
                                if (eCompressionMode == null) {
                                    LOGGER.error("Error processing the UserMessage, CompressionType '" + sPropertyValue + "' of attachment '" + sAttachmentID + "' is not supported.");
                                    aErrorList.add(EEbmsError.EBMS_VALUE_INCONSISTENT.getAsError(aLocale));
                                    return ESuccess.FAILURE;
                                }
                                aCompressionAttachmentIDs.put(sAttachmentID, eCompressionMode);
                                bCompressionTypePresent = true;
                            } else if (sPropertyName.equalsIgnoreCase(MessageHelperMethods.PART_PROPERTY_CHARACTER_SET)) {
                                if (StringHelper.hasText(sPropertyValue)) {
                                    final Charset aCharset = CharsetHelper.getCharsetFromNameOrNull(sPropertyValue);
                                    if (aCharset == null) {
                                        LOGGER.error("Value '" + sPropertyValue + "' of property '" + MessageHelperMethods.PART_PROPERTY_CHARACTER_SET + "' of attachment '" + sAttachmentID + "' is not supported");
                                        aErrorList.add(EEbmsError.EBMS_VALUE_INCONSISTENT.getAsError(aLocale));
                                        return ESuccess.FAILURE;
                                    } else if (aIncomingAttachment != null)
                                        aIncomingAttachment.setCharset(aCharset);
                                }
                            }
                        // else we don't care about the property
                        }
                    // got compressed
                    if (bCompressionTypePresent && !bMimeTypePresent) {
                        LOGGER.error("Error processing the UserMessage, MimeType for a compressed attachment ('" + sAttachmentID + "') is not present.");
                        aErrorList.add(EEbmsError.EBMS_VALUE_INCONSISTENT.getAsError(aLocale));
                        return ESuccess.FAILURE;
                    }
                }
            }
            // This may also be an indicator for "external payloads"
            if (nSpecifiedAttachments != aAttachments.size()) {
                LOGGER.error("Error processing the UserMessage: the amount of specified attachments does not correlate with the actual attachments in the UserMessage. Expected " + aEbms3PayloadInfo.getPartInfoCount() + " but having " + aAttachments.size() + " attachments. This is an indicator, that an external attached was provided.");
                aErrorList.add(EEbmsError.EBMS_EXTERNAL_PAYLOAD_ERROR.getAsError(aLocale));
                return ESuccess.FAILURE;
            }
        }
    } else {
        // Must be a SignalMessage
        // all vars stay null
        final Ebms3SignalMessage aSignalMessage = aMessaging.getSignalMessageAtIndex(0);
        final Ebms3MessageInfo aMsgInfo = aSignalMessage.getMessageInfo();
        if (aMsgInfo != null) {
            // Set this is as early as possible, so that eventually occurring error
            // messages can use the "RefToMessageId" element properly
            aState.setMessageID(aMsgInfo.getMessageId());
            aState.setRefToMessageID(aMsgInfo.getRefToMessageId());
            aState.setMessageTimestamp(aMsgInfo.getTimestamp());
        }
        final Ebms3PullRequest aEbms3PullRequest = aSignalMessage.getPullRequest();
        final Ebms3Receipt aEbms3Receipt = aSignalMessage.getReceipt();
        if (aEbms3PullRequest != null) {
            final String sMPC = aEbms3PullRequest.getMpc();
            final IMPC aMPC = aMPCMgr.getMPCOfID(sMPC);
            if (aMPC == null) {
                LOGGER.error("Failed to resolve the PullRequest MPC '" + sMPC + "'");
                // Return value not recognized when MPC is not currently saved
                aErrorList.add(EEbmsError.EBMS_VALUE_NOT_RECOGNIZED.getAsError(aLocale));
                return ESuccess.FAILURE;
            }
            // Create SPI which returns a PMode
            for (final IAS4ServletPullRequestProcessorSPI aProcessor : AS4ServletPullRequestProcessorManager.getAllProcessors()) {
                aPMode = aProcessor.findPMode(aSignalMessage);
                if (aPMode != null) {
                    LOGGER.info("Found PMode '" + aPMode.getID() + "' for MPC '" + sMPC + "' in SignalMessage " + aSignalMessage);
                    break;
                }
            }
            if (aPMode == null) {
                LOGGER.error("Failed to resolve PMode for PullRequest with MPC '" + sMPC + "'");
                aErrorList.add(EEbmsError.EBMS_VALUE_NOT_RECOGNIZED.getAsError(aLocale));
                return ESuccess.FAILURE;
            }
        } else if (aEbms3Receipt != null) {
            final String sRefToMessageID = aSignalMessage.getMessageInfo().getRefToMessageId();
            if (StringHelper.hasNoText(sRefToMessageID)) {
                LOGGER.error("The Receipt does not contain a RefToMessageId");
                aErrorList.add(EEbmsError.EBMS_INVALID_RECEIPT.getAsError(aLocale));
                return ESuccess.FAILURE;
            }
        } else {
            // Error Message
            if (!aSignalMessage.getError().isEmpty()) {
                for (final Ebms3Error aError : aSignalMessage.getError()) {
                    /*
               * Ebms 3 spec 6.2.6: This OPTIONAL attribute indicates the
               * MessageId of the message in error, for which this error is
               * raised.
               */
                    if (false)
                        if (StringHelper.hasNoText(aError.getRefToMessageInError())) {
                            aErrorList.add(EEbmsError.EBMS_VALUE_INCONSISTENT.getAsError(aLocale));
                            return ESuccess.FAILURE;
                        }
                }
            }
        }
    }
    // Remember in state
    aState.setPMode(aPMode);
    aState.setOriginalSoapDocument(aSOAPDoc);
    aState.setOriginalAttachments(aAttachments);
    aState.setCompressedAttachmentIDs(aCompressionAttachmentIDs);
    aState.setMPC(aEffectiveMPC);
    aState.setInitiatorID(sInitiatorID);
    aState.setResponderID(sResponderID);
    return ESuccess.SUCCESS;
}
Also used : Locale(java.util.Locale) Ebms3SignalMessage(com.helger.phase4.ebms3header.Ebms3SignalMessage) PModeLeg(com.helger.phase4.model.pmode.leg.PModeLeg) EAS4CompressionMode(com.helger.phase4.attachment.EAS4CompressionMode) Ebms3PartyId(com.helger.phase4.ebms3header.Ebms3PartyId) Ebms3PayloadInfo(com.helger.phase4.ebms3header.Ebms3PayloadInfo) Ebms3PullRequest(com.helger.phase4.ebms3header.Ebms3PullRequest) CommonsHashMap(com.helger.commons.collection.impl.CommonsHashMap) Ebms3MessageInfo(com.helger.phase4.ebms3header.Ebms3MessageInfo) Ebms3Property(com.helger.phase4.ebms3header.Ebms3Property) Ebms3Receipt(com.helger.phase4.ebms3header.Ebms3Receipt) CollectingValidationEventHandler(com.helger.jaxb.validation.CollectingValidationEventHandler) Charset(java.nio.charset.Charset) Ebms3PartInfo(com.helger.phase4.ebms3header.Ebms3PartInfo) Ebms3Error(com.helger.phase4.ebms3header.Ebms3Error) IError(com.helger.commons.error.IError) IAS4ServletPullRequestProcessorSPI(com.helger.phase4.servlet.spi.IAS4ServletPullRequestProcessorSPI) IMPC(com.helger.phase4.model.mpc.IMPC) Ebms3CollaborationInfo(com.helger.phase4.ebms3header.Ebms3CollaborationInfo) IMPCManager(com.helger.phase4.model.mpc.IMPCManager) IPMode(com.helger.phase4.model.pmode.IPMode) Ebms3UserMessage(com.helger.phase4.ebms3header.Ebms3UserMessage) Ebms3Messaging(com.helger.phase4.ebms3header.Ebms3Messaging) WSS4JAttachment(com.helger.phase4.attachment.WSS4JAttachment) Nonnull(javax.annotation.Nonnull)

Example 3 with Ebms3Receipt

use of com.helger.phase4.ebms3header.Ebms3Receipt in project phase4 by phax.

the class AS4ReceiptMessage method create.

/**
 * This method creates a receipt message.
 *
 * @param eSoapVersion
 *        SOAP Version which should be used
 * @param sMessageID
 *        Message ID to use. May neither be <code>null</code> nor empty.
 * @param aEbms3UserMessage
 *        The received usermessage which should be responded too
 * @param aSoapDocument
 *        If the SOAPDocument has WSS4j elements and the following parameter
 *        is true NonRepudiation will be used if the message is signed
 * @param bShouldUseNonRepudiation
 *        If NonRepudiation should be used or not
 * @return AS4ReceiptMessage
 */
@Nonnull
public static AS4ReceiptMessage create(@Nonnull final ESoapVersion eSoapVersion, @Nonnull @Nonempty final String sMessageID, @Nullable final Ebms3UserMessage aEbms3UserMessage, @Nullable final Node aSoapDocument, @Nonnull final boolean bShouldUseNonRepudiation) {
    // Only for signed messages
    final ICommonsList<Node> aDSRefs = _getAllReferences(aSoapDocument);
    final Ebms3SignalMessage aSignalMessage = new Ebms3SignalMessage();
    // Message Info
    {
        // Always use "now" as date time
        final Ebms3MessageInfo aEbms3MessageInfo = MessageHelperMethods.createEbms3MessageInfo(sMessageID, aEbms3UserMessage != null ? aEbms3UserMessage.getMessageInfo().getMessageId() : null);
        aSignalMessage.setMessageInfo(aEbms3MessageInfo);
    }
    final Ebms3Receipt aEbms3Receipt = new Ebms3Receipt();
    if (aDSRefs.isNotEmpty() && bShouldUseNonRepudiation) {
        final NonRepudiationInformation aNonRepudiationInformation = new NonRepudiationInformation();
        for (final Node aRef : aDSRefs) {
            // Read XMLDsig Reference
            final ReferenceType aRefObj = XMLDSigReaderBuilder.dsigReference().read(aRef);
            // Add to NR response
            final MessagePartNRInformation aMessagePartNRInformation = new MessagePartNRInformation();
            aMessagePartNRInformation.setReference(aRefObj);
            aNonRepudiationInformation.addMessagePartNRInformation(aMessagePartNRInformation);
        }
        aEbms3Receipt.addAny(Ebms3WriterBuilder.nonRepudiationInformation().getAsDocument(aNonRepudiationInformation).getDocumentElement());
    } else {
        if (aDSRefs.isEmpty())
            LOGGER.info("Found no ds:Reference elements in the source message, hence returning the source UserMessage in the Receipt");
        else
            LOGGER.info("Non-repudiation is disabled, hence returning the source UserMessage in the Receipt");
        // If the original usermessage is not signed, the receipt will contain the
        // original message part without wss4j security
        aEbms3Receipt.addAny(AS4UserMessage.create(eSoapVersion, aEbms3UserMessage).getAsSoapDocument().getDocumentElement());
    }
    aSignalMessage.setReceipt(aEbms3Receipt);
    return new AS4ReceiptMessage(eSoapVersion, aSignalMessage);
}
Also used : Ebms3SignalMessage(com.helger.phase4.ebms3header.Ebms3SignalMessage) Ebms3Receipt(com.helger.phase4.ebms3header.Ebms3Receipt) NonRepudiationInformation(com.helger.phase4.ebms3header.NonRepudiationInformation) Node(org.w3c.dom.Node) MessagePartNRInformation(com.helger.phase4.ebms3header.MessagePartNRInformation) Ebms3MessageInfo(com.helger.phase4.ebms3header.Ebms3MessageInfo) ReferenceType(com.helger.xsds.xmldsig.ReferenceType) Nonnull(javax.annotation.Nonnull)

Aggregations

Ebms3Receipt (com.helger.phase4.ebms3header.Ebms3Receipt)3 Nonnull (javax.annotation.Nonnull)3 WSS4JAttachment (com.helger.phase4.attachment.WSS4JAttachment)2 Ebms3Error (com.helger.phase4.ebms3header.Ebms3Error)2 Ebms3MessageInfo (com.helger.phase4.ebms3header.Ebms3MessageInfo)2 Ebms3PullRequest (com.helger.phase4.ebms3header.Ebms3PullRequest)2 Ebms3SignalMessage (com.helger.phase4.ebms3header.Ebms3SignalMessage)2 Ebms3UserMessage (com.helger.phase4.ebms3header.Ebms3UserMessage)2 IPMode (com.helger.phase4.model.pmode.IPMode)2 PModeLeg (com.helger.phase4.model.pmode.leg.PModeLeg)2 Node (org.w3c.dom.Node)2 CommonsHashMap (com.helger.commons.collection.impl.CommonsHashMap)1 IError (com.helger.commons.error.IError)1 ErrorList (com.helger.commons.error.list.ErrorList)1 CollectingValidationEventHandler (com.helger.jaxb.validation.CollectingValidationEventHandler)1 EAS4CompressionMode (com.helger.phase4.attachment.EAS4CompressionMode)1 Ebms3CollaborationInfo (com.helger.phase4.ebms3header.Ebms3CollaborationInfo)1 Ebms3Messaging (com.helger.phase4.ebms3header.Ebms3Messaging)1 Ebms3PartInfo (com.helger.phase4.ebms3header.Ebms3PartInfo)1 Ebms3PartyId (com.helger.phase4.ebms3header.Ebms3PartyId)1