#include <saml/RootObject.h>
-namespace opensaml {
-
- /**
- * Base class for SAML assertions.
- * Currently just a marker interface.
- */
- class SAML_API Assertion : public virtual RootObject
- {
- public:
- virtual ~Assertion();
- protected:
- Assertion();
- };
-
-};
+// Moved declaration into RootObject.h header.
#endif /* __saml_assertion_h__ */
RootObject();
};
+ /**
+ * Base class for SAML assertions.
+ * Currently just a marker interface.
+ */
+ class SAML_API Assertion : public virtual RootObject
+ {
+ public:
+ virtual ~Assertion();
+ protected:
+ Assertion();
+ };
+
+ /**
+ * Base class for SAML status codes.
+ */
+ class SAML_API Status : public virtual xmltooling::XMLObject
+ {
+ public:
+ virtual ~Status();
+
+ /**
+ * Returns a string representation of the top-level status code.
+ *
+ * @return string representation of top-level status code
+ */
+ virtual const XMLCh* getTopStatus() const=0;
+
+ /**
+ * Returns a string representation of the second-level status code, if any.
+ *
+ * @return string representation of second-level status code, or nullptr
+ */
+ virtual const XMLCh* getSubStatus() const=0;
+
+ /**
+ * Returns true iff status information beyond the second level exists.
+ *
+ * @return indicator of three or more status codes
+ */
+ virtual bool hasAdditionalStatus() const=0;
+
+ /**
+ * Returns the message contained in the status, if any.
+ *
+ * @return status message, or nullptr
+ */
+ virtual const XMLCh* getMessage() const=0;
+
+ protected:
+ Status();
+ };
+
};
#endif /* __saml_root_h__ */
{
}
+Status::Status()
+{
+}
+
+Status::~Status()
+{
+}
+
using namespace saml2p;
using namespace saml2md;
e->addProperty("errorURL",eurl.get());
}
}
-
+
if (status) {
- auto_ptr_char sc(status->getStatusCode() ? status->getStatusCode()->getValue() : nullptr);
+ auto_ptr_char sc(status->getTopStatus());
if (sc.get() && *sc.get())
e->addProperty("statusCode", sc.get());
- if (status->getStatusCode()->getStatusCode()) {
- auto_ptr_char sc2(status->getStatusCode()->getStatusCode()->getValue());
+ if (status->getSubStatus()) {
+ auto_ptr_char sc2(status->getSubStatus());
if (sc2.get() && *sc.get())
e->addProperty("statusCode2", sc2.get());
}
- if (status->getStatusMessage()) {
- auto_ptr_char msg(status->getStatusMessage()->getMessage());
+ if (status->getMessage()) {
+ auto_ptr_char msg(status->getMessage());
if (msg.get() && *msg.get())
e->addProperty("statusMessage", msg.get());
}
namespace opensaml {
- namespace saml2p {
- class SAML_API Status;
- };
+ class SAML_API Status;
+
namespace saml2md {
class SAML_API EntityDescriptor;
class SAML_API RoleDescriptor;
void SAML_API annotateException(
xmltooling::XMLToolingException* e,
const saml2md::EntityDescriptor* entity,
- const saml2p::Status* status=nullptr,
+ const Status* status=nullptr,
bool rethrow=true
);
void SAML_API annotateException(
xmltooling::XMLToolingException* e,
const saml2md::RoleDescriptor* role,
- const saml2p::Status* status=nullptr,
+ const Status* status=nullptr,
bool rethrow=true
);
+
};
#endif /* __saml_exceptions_h__ */
if (code && *code != StatusCode::SUCCESS && handleError(*status)) {
BindingException ex("SAML Response contained an error.");
if (m_soaper.getPolicy().getIssuerMetadata())
- annotateException(&ex, m_soaper.getPolicy().getIssuerMetadata()); // throws it
+ annotateException(&ex, m_soaper.getPolicy().getIssuerMetadata(), status); // throws it
else
ex.raise();
}
return nullptr;
}
-bool SAML1SOAPClient::handleError(const Status& status)
+bool SAML1SOAPClient::handleError(const saml1p::Status& status)
{
const xmltooling::QName* code = status.getStatusCode() ? status.getStatusCode()->getValue() : nullptr;
auto_ptr_char str((status.getStatusMessage() ? status.getStatusMessage()->getMessage() : nullptr));
static const XMLCh TYPE_NAME[];
END_XMLOBJECT;
- BEGIN_XMLOBJECT(SAML_API,Status,xmltooling::XMLObject,SAML 1.x Status element);
+ BEGIN_XMLOBJECT(SAML_API,Status,opensaml::Status,SAML 1.x Status element);
DECL_TYPED_CHILD(StatusCode);
DECL_TYPED_CHILD(StatusMessage);
DECL_TYPED_CHILD(StatusDetail);
IMPL_TYPED_CHILD(StatusMessage);
IMPL_TYPED_CHILD(StatusDetail);
+ // Base class methods.
+ const XMLCh* getTopStatus() const {
+ const xmltooling::QName* code = getStatusCode() ? getStatusCode()->getValue() : nullptr;
+ return code ? code->getLocalPart() : nullptr;
+ }
+ const XMLCh* getSubStatus() const {
+ const StatusCode* sc = getStatusCode() ? getStatusCode()->getStatusCode() : nullptr;
+ if (sc)
+ return sc->getValue() ? sc->getValue()->getLocalPart() : nullptr;
+ return nullptr;
+ }
+ bool hasAdditionalStatus() const {
+ return (getStatusCode() && getStatusCode()->getStatusCode() && getStatusCode()->getStatusCode()->getStatusCode());
+ }
+ const XMLCh* getMessage() const {
+ return getStatusMessage() ? getStatusMessage()->getMessage() : nullptr;
+ }
+
protected:
void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
PROC_TYPED_CHILD(StatusCode,SAML1P_NS,false);
return nullptr;
}
-bool SAML2SOAPClient::handleError(const Status& status)
+bool SAML2SOAPClient::handleError(const saml2p::Status& status)
{
auto_ptr_char code((status.getStatusCode() ? status.getStatusCode()->getValue() : nullptr));
auto_ptr_char str((status.getStatusMessage() ? status.getStatusMessage()->getMessage() : nullptr));
static const XMLCh TYPE_NAME[];
END_XMLOBJECT;
- BEGIN_XMLOBJECT(SAML_API,Status,xmltooling::XMLObject,SAML 2.0 Status element);
+ BEGIN_XMLOBJECT(SAML_API,Status,opensaml::Status,SAML 2.0 Status element);
DECL_TYPED_CHILD(StatusCode);
DECL_TYPED_CHILD(StatusMessage);
DECL_TYPED_CHILD(StatusDetail);
IMPL_TYPED_CHILD(StatusMessage);
IMPL_TYPED_CHILD(StatusDetail);
+ // Base class methods.
+ const XMLCh* getTopStatus() const {
+ return getStatusCode() ? getStatusCode()->getValue() : nullptr;
+ }
+ const XMLCh* getSubStatus() const {
+ const StatusCode* sc = getStatusCode() ? getStatusCode()->getStatusCode() : nullptr;
+ return sc ? sc->getValue() : nullptr;
+ }
+ bool hasAdditionalStatus() const {
+ return (getStatusCode() && getStatusCode()->getStatusCode() && getStatusCode()->getStatusCode()->getStatusCode());
+ }
+ const XMLCh* getMessage() const {
+ return getStatusMessage() ? getStatusMessage()->getMessage() : nullptr;
+ }
+
protected:
void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
PROC_TYPED_CHILD(StatusCode,SAML20P_NS,false);
auto_ptr<ArtifactResponse> response(ArtifactResponseBuilder::buildArtifactResponse());
response->setPayload(payload);
- Status* status = StatusBuilder::buildStatus();
+ saml2p::Status* status = StatusBuilder::buildStatus();
response->setStatus(status);
StatusCode* sc = StatusCodeBuilder::buildStatusCode();
status->setStatusCode(sc);