no.digipost.api.interceptors.steps.ReferenceValidatorStep.java Source code

Java tutorial

Introduction

Here is the source code for no.digipost.api.interceptors.steps.ReferenceValidatorStep.java

Source

/**
 * Copyright (C) Posten Norge AS
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package no.digipost.api.interceptors.steps;

import java.util.Arrays;
import java.util.Collection;

import no.digipost.api.representations.EbmsContext;
import no.digipost.api.representations.EbmsProcessingStep;

import org.oasis_open.docs.ebxml_bp.ebbp_signals_2.MessagePartNRInformation;
import org.oasis_open.docs.ebxml_bp.ebbp_signals_2.NonRepudiationInformation;
import org.oasis_open.docs.ebxml_msg.ebms.v3_0.ns.core._200704.Messaging;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
import org.springframework.security.crypto.codec.Base64;
import org.springframework.ws.soap.SoapHeaderElement;
import org.springframework.ws.soap.SoapMessage;
import org.w3.xmldsig.Reference;
import org.w3.xmldsig.Transform;

public class ReferenceValidatorStep implements EbmsProcessingStep {

    private final Collection<Reference> references;
    private final Jaxb2Marshaller jaxb2Marshaller;

    public ReferenceValidatorStep(final Jaxb2Marshaller jaxb2Marshaller, final Collection<Reference> references) {
        this.jaxb2Marshaller = jaxb2Marshaller;
        this.references = references;
    }

    @Override
    public void apply(final EbmsContext ebmsContext, final SoapHeaderElement ebmsMessaging,
            final SoapMessage soapMessage) {
        Messaging messaging = (Messaging) jaxb2Marshaller.unmarshal(ebmsMessaging.getSource());
        NonRepudiationInformation nonrep = (NonRepudiationInformation) messaging.getSignalMessages().get(0)
                .getReceipt().getAnies().get(0);
        for (Reference reference : references) {
            boolean found = false;
            for (MessagePartNRInformation npr : nonrep.getMessagePartNRInformations()) {
                Reference ref = npr.getReference();
                if (ref.getURI().equals(reference.getURI())) {
                    found = true;
                    validate(reference, ref);
                    break;
                }
            }
            if (!found) {
                throw new RuntimeException("Missing NonRepudiationInformation for " + reference.getId());
            }
        }
    }

    private void validate(final Reference expected, final Reference actual) {
        if (!expected.getDigestMethod().getAlgorithm().equals(actual.getDigestMethod().getAlgorithm())) {
            throw new RuntimeException(
                    "Unexpected digest method. Expected:" + expected.getDigestMethod().getAlgorithm() + " Actual:"
                            + actual.getDigestMethod().getAlgorithm());
        }
        if (!Arrays.equals(expected.getDigestValue(), actual.getDigestValue())) {
            throw new RuntimeException(
                    "Unexpected digest value. Expected:" + Base64.encode(expected.getDigestValue()) + " Actual:"
                            + Base64.encode(actual.getDigestValue()));
        }
        validateTransforms(expected, actual);
    }

    private void validateTransforms(final Reference expected, final Reference actual) {
        boolean expHasTransforms = expected.getTransforms() != null;
        boolean actHasTransforms = actual.getTransforms() != null;
        if (expHasTransforms != actHasTransforms) {
            throw new RuntimeException("Expected to " + (expHasTransforms ? "" : "not ") + "have transforms");
        }
        if (!expHasTransforms) {
            return;
        }

        if (expected.getTransforms().getTransforms().size() != actual.getTransforms().getTransforms().size()) {
            throw new RuntimeException(
                    "Unexpected number of transforms. Expected:" + expected.getTransforms().getTransforms().size()
                            + " Actual:" + actual.getTransforms().getTransforms().size());
        }
        for (int i = 0; i < expected.getTransforms().getTransforms().size(); i++) {
            Transform expT = expected.getTransforms().getTransforms().get(i);
            Transform actT = actual.getTransforms().getTransforms().get(i);
            if (!expT.getAlgorithm().equals(actT.getAlgorithm())) {
                throw new RuntimeException(
                        "Unexpected transform. Expected:" + expT.getAlgorithm() + " Actual:" + actT.getAlgorithm());
            }
        }
    }

}