Example #1
0
  public static int getLastSequenceID(SOAPHeader soapHeader) {
    Iterator headers = soapHeader.getHeadersToProcess(null, "http://www.w3.org/2005/08/addressing");

    int seqId = -1;
    int lastSeqId = -1;
    boolean isReset = false;

    SOAPHeaderBlock referenceParametersHeaderBlock = null;

    while (headers.hasNext()) {
      SOAPHeaderBlock soapHeaderBlock = (SOAPHeaderBlock) headers.next();
      String localName = soapHeaderBlock.getLocalName();

      if (localName.equals("SequenceID")) {
        try {
          seqId = Integer.parseInt(soapHeaderBlock.getText());
        } catch (NumberFormatException e) {
          // if the client didn't send a SeqID, then there's nothing we can do
          return -1;
        }

        return seqId;
      }
    }

    return -1;
  }
Example #2
0
  /**
   * Creates a DOM Document using the SOAP Envelope.
   *
   * @param env An org.apache.axiom.soap.SOAPEnvelope instance
   * @return Returns the DOM Document of the given SOAP Envelope.
   * @throws Exception
   */
  public static Document getDocumentFromSOAPEnvelope(SOAPEnvelope env, boolean useDoom)
      throws WSSecurityException {
    try {
      if (env instanceof Element) {
        return ((Element) env).getOwnerDocument();
      }

      if (useDoom) {
        env.build();

        // Workaround to prevent a bug in AXIOM where
        // there can be an incomplete OMElement as the first child body
        OMElement firstElement = env.getBody().getFirstElement();
        if (firstElement != null) {
          firstElement.build();
        }

        // Get processed headers
        SOAPHeader soapHeader = env.getHeader();
        ArrayList processedHeaderQNames = new ArrayList();
        if (soapHeader != null) {
          Iterator headerBlocs = soapHeader.getChildElements();
          while (headerBlocs.hasNext()) {
            SOAPHeaderBlock element = (SOAPHeaderBlock) headerBlocs.next();
            if (element.isProcessed()) {
              processedHeaderQNames.add(element.getQName());
            }
          }
        }

        // Check the namespace and find SOAP version and factory
        String nsURI = null;
        SOAPFactory factory;
        if (env.getNamespace()
            .getNamespaceURI()
            .equals(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI)) {
          nsURI = SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI;
          factory = DOOMAbstractFactory.getSOAP11Factory();
        } else {
          nsURI = SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI;
          factory = DOOMAbstractFactory.getSOAP12Factory();
        }

        StAXSOAPModelBuilder stAXSOAPModelBuilder =
            new StAXSOAPModelBuilder(env.getXMLStreamReader(), factory, nsURI);
        SOAPEnvelope envelope = (stAXSOAPModelBuilder).getSOAPEnvelope();
        ((OMNode) envelope.getParent()).build();

        // Set the processed flag of the processed headers
        SOAPHeader header = envelope.getHeader();
        for (Iterator iter = processedHeaderQNames.iterator(); iter.hasNext(); ) {
          QName name = (QName) iter.next();
          Iterator omKids = header.getChildrenWithName(name);
          if (omKids.hasNext()) {
            ((SOAPHeaderBlock) omKids.next()).setProcessed();
          }
        }

        Element envElem = (Element) envelope;
        return envElem.getOwnerDocument();
      } else {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        env.build();
        env.serialize(baos);
        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        return factory.newDocumentBuilder().parse(bais);
      }
    } catch (Exception e) {
      throw new WSSecurityException("Error in converting SOAP Envelope to Document", e);
    }
  }
Example #3
0
  public Object fromHeaderBlock(SOAPHeaderBlock sequenceAckElement)
      throws OMException, SandeshaException {
    originalSequenceAckElement = sequenceAckElement;
    OMElement identifierPart = null;
    Iterator childElements = sequenceAckElement.getChildElements();
    while (childElements.hasNext()) {
      OMElement element = (OMElement) childElements.next();
      String elementNamespace = element.getQName().getNamespaceURI();
      String elementLocalName = element.getQName().getLocalPart();
      if (namespaceValue.equals(elementNamespace)) {
        if (Sandesha2Constants.WSRM_COMMON.ACK_RANGE.equals(elementLocalName)) {
          String lowerAttribValue =
              element.getAttributeValue(new QName(Sandesha2Constants.WSRM_COMMON.LOWER));
          String upperAttribValue =
              element.getAttributeValue(new QName(Sandesha2Constants.WSRM_COMMON.UPPER));

          if (lowerAttribValue == null || upperAttribValue == null)
            throw new OMException(
                SandeshaMessageHelper.getMessage(
                    SandeshaMessageKeys.noUpperOrLowerAttributesInElement, element.toString()));

          try {
            long lower = Long.parseLong(lowerAttribValue);
            long upper = Long.parseLong(upperAttribValue);
            acknowledgementRangeList.add(new Range(lower, upper));
          } catch (Exception ex) {
            throw new OMException(
                SandeshaMessageHelper.getMessage(
                    SandeshaMessageKeys.ackRandDoesNotHaveCorrectValues, element.toString()));
          }
        } else if (Sandesha2Constants.WSRM_COMMON.NACK.equals(elementLocalName)) {
          try {
            Long nack = Long.valueOf(element.getText());
            nackList.add(nack);
          } catch (Exception ex) {
            throw new OMException(
                SandeshaMessageHelper.getMessage(
                    SandeshaMessageKeys.nackDoesNotContainValidLongValue));
          }
        } else if (Sandesha2Constants.WSRM_COMMON.IDENTIFIER.equals(elementLocalName)) {
          identifierPart = element;
        } else {
          String rmSpecVersion = SpecSpecificConstants.getSpecVersionString(namespaceValue);
          if (SpecSpecificConstants.isAckFinalAllowed(rmSpecVersion)) {
            if (Sandesha2Constants.WSRM_COMMON.FINAL.equals(elementLocalName)) {
              ackFinal = true;
            }
          }
          if (SpecSpecificConstants.isAckNoneAllowed(rmSpecVersion)) {
            if (Sandesha2Constants.WSRM_COMMON.NONE.equals(elementLocalName)) {
              ackNone = true;
            }
          }
        }
      }
    }

    identifier = new Identifier(namespaceValue);
    identifier.fromOMElement(identifierPart);

    // Indicate that we have processed this part of the message.
    sequenceAckElement.setProcessed();
    return this;
  }
Example #4
0
  /**
   * Builds a SOAPEnvelope from DOM Document.
   *
   * @param doc - The dom document that contains a SOAP message
   * @param useDoom
   * @return
   * @throws WSSecurityException
   */
  public static SOAPEnvelope getSOAPEnvelopeFromDOMDocument(Document doc, boolean useDoom)
      throws WSSecurityException {

    if (useDoom) {
      try {
        // Get processed headers
        SOAPEnvelope env = (SOAPEnvelope) doc.getDocumentElement();
        ArrayList processedHeaderQNames = new ArrayList();
        SOAPHeader soapHeader = env.getHeader();

        if (soapHeader != null) {
          Iterator headerBlocs = soapHeader.getChildElements();
          while (headerBlocs.hasNext()) {

            OMElement element = (OMElement) headerBlocs.next();
            SOAPHeaderBlock header = null;

            if (element instanceof SOAPHeaderBlock) {
              header = (SOAPHeaderBlock) element;

              // If a header block is not an instance of SOAPHeaderBlock, it means that
              // it is a header we have added in rampart eg. EncryptedHeader and should
              // be converted to SOAPHeaderBlock for processing
            } else {
              header = soapHeader.addHeaderBlock(element.getLocalName(), element.getNamespace());
              Iterator attrIter = element.getAllAttributes();
              while (attrIter.hasNext()) {
                OMAttribute attr = (OMAttribute) attrIter.next();
                header.addAttribute(
                    attr.getLocalName(), attr.getAttributeValue(), attr.getNamespace());
              }
              Iterator nsIter = element.getAllDeclaredNamespaces();
              while (nsIter.hasNext()) {
                OMNamespace ns = (OMNamespace) nsIter.next();
                header.declareNamespace(ns);
              }
              // retrieve all child nodes (including any text nodes)
              // and re-attach to header block
              Iterator children = element.getChildren();
              while (children.hasNext()) {
                OMNode child = (OMNode) children.next();
                child.detach();
                header.addChild(child);
              }

              element.detach();

              soapHeader.build();

              header.setProcessed();
            }

            if (header.isProcessed()) {
              processedHeaderQNames.add(element.getQName());
            }
          }
        }
        XMLStreamReader reader = ((OMElement) doc.getDocumentElement()).getXMLStreamReader();
        StAXSOAPModelBuilder stAXSOAPModelBuilder = new StAXSOAPModelBuilder(reader, null);
        SOAPEnvelope envelope = stAXSOAPModelBuilder.getSOAPEnvelope();

        // Set the processed flag of the processed headers
        SOAPHeader header = envelope.getHeader();
        for (Iterator iter = processedHeaderQNames.iterator(); iter.hasNext(); ) {
          QName name = (QName) iter.next();
          Iterator omKids = header.getChildrenWithName(name);
          if (omKids.hasNext()) {
            ((SOAPHeaderBlock) omKids.next()).setProcessed();
          }
        }

        envelope.build();

        return envelope;

      } catch (FactoryConfigurationError e) {
        throw new WSSecurityException(e.getMessage());
      }
    } else {
      try {
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        XMLUtils.outputDOM(doc.getDocumentElement(), os, true);
        ByteArrayInputStream bais = new ByteArrayInputStream(os.toByteArray());

        StAXSOAPModelBuilder stAXSOAPModelBuilder =
            new StAXSOAPModelBuilder(
                XMLInputFactory.newInstance().createXMLStreamReader(bais), null);
        return stAXSOAPModelBuilder.getSOAPEnvelope();
      } catch (Exception e) {
        throw new WSSecurityException(e.getMessage());
      }
    }
  }
Example #5
0
  public void toHeader(SOAPHeader header) throws SandeshaException {
    SOAPHeaderBlock sequenceAcknowledgementHeaderBlock =
        header.addHeaderBlock(Sandesha2Constants.WSRM_COMMON.SEQUENCE_ACK, omNamespace);

    if (identifier == null)
      throw new OMException(
          SandeshaMessageHelper.getMessage(
              SandeshaMessageKeys.invalidIdentifier, header.toString()));

    // SequenceACK messages should always have the MustUnderstand flag set to true
    // Unless it is a piggybacked ack
    if (piggybacked) {
      sequenceAcknowledgementHeaderBlock.setMustUnderstand(false);
    } else {
      sequenceAcknowledgementHeaderBlock.setMustUnderstand(true);
    }

    identifier.toOMElement(sequenceAcknowledgementHeaderBlock, omNamespace);

    Iterator<Range> ackRangeIt = acknowledgementRangeList.iterator();
    while (ackRangeIt.hasNext()) {
      Range ackRange = (Range) ackRangeIt.next();

      if (ackRange.upperValue <= 0
          || ackRange.lowerValue <= 0
          || ackRange.lowerValue > ackRange.upperValue)
        throw new OMException(
            SandeshaMessageHelper.getMessage(
                SandeshaMessageKeys.ackRandDoesNotHaveCorrectValues,
                ackRange.upperValue + ":" + ackRange.lowerValue));

      OMFactory factory = sequenceAcknowledgementHeaderBlock.getOMFactory();

      OMAttribute lowerAttrib =
          factory.createOMAttribute(
              Sandesha2Constants.WSRM_COMMON.LOWER, null, Long.toString(ackRange.lowerValue));
      OMAttribute upperAttrib =
          factory.createOMAttribute(
              Sandesha2Constants.WSRM_COMMON.UPPER, null, Long.toString(ackRange.upperValue));

      OMElement acknowledgementRangeElement =
          factory.createOMElement(Sandesha2Constants.WSRM_COMMON.ACK_RANGE, omNamespace);

      acknowledgementRangeElement.addAttribute(lowerAttrib);
      acknowledgementRangeElement.addAttribute(upperAttrib);
      sequenceAcknowledgementHeaderBlock.addChild(acknowledgementRangeElement);
    }

    Iterator<Long> nackIt = nackList.iterator();
    while (nackIt.hasNext()) {
      Long nack = (Long) nackIt.next();

      if (nack.longValue() <= 0)
        throw new OMException(
            SandeshaMessageHelper.getMessage(SandeshaMessageKeys.nackDoesNotContainValidLongValue));

      OMElement nackElement =
          sequenceAcknowledgementHeaderBlock
              .getOMFactory()
              .createOMElement(Sandesha2Constants.WSRM_COMMON.NACK, omNamespace);
      nackElement.setText(nack.toString());
      sequenceAcknowledgementHeaderBlock.addChild(nackElement);
    }

    String rmSpecVersion = SpecSpecificConstants.getSpecVersionString(namespaceValue);

    // setting a 'None' when nothing is there (for the correct RM version)
    if (ackNone == false
        && acknowledgementRangeList.size() == 0
        && nackList.size() == 0
        && SpecSpecificConstants.isAckNoneAllowed(rmSpecVersion)) {
      ackNone = true;
    }

    if (ackNone != false) {
      if (!SpecSpecificConstants.isAckNoneAllowed(rmSpecVersion)) {
        throw new SandeshaException(
            SandeshaMessageHelper.getMessage(
                SandeshaMessageKeys.noneNotAllowedNamespace, rmSpecVersion));
      }

      if (acknowledgementRangeList.size() > 0) {
        throw new SandeshaException(
            SandeshaMessageHelper.getMessage(SandeshaMessageKeys.noneNotAllowedAckRangesPresent));
      }

      if (nackList.size() > 0) {
        throw new SandeshaException(
            SandeshaMessageHelper.getMessage(SandeshaMessageKeys.noneNotAllowedNackPresent));
      }
      OMElement noneElement =
          sequenceAcknowledgementHeaderBlock
              .getOMFactory()
              .createOMElement(Sandesha2Constants.WSRM_COMMON.NONE, omNamespace);
      sequenceAcknowledgementHeaderBlock.addChild(noneElement);
    }

    if (ackFinal != false) {
      if (!SpecSpecificConstants.isAckFinalAllowed(rmSpecVersion)) {
        throw new SandeshaException(
            SandeshaMessageHelper.getMessage(SandeshaMessageKeys.finalNotAllowedNamespace));
      }

      if (nackList.size() > 0) {
        throw new SandeshaException(
            SandeshaMessageHelper.getMessage(SandeshaMessageKeys.cannotHaveFinalWithNack));
      }
      OMElement finalElement =
          sequenceAcknowledgementHeaderBlock
              .getOMFactory()
              .createOMElement(Sandesha2Constants.WSRM_COMMON.FINAL, omNamespace);
      sequenceAcknowledgementHeaderBlock.addChild(finalElement);
    }
  }