Refactored signature handling.
[shibboleth/opensaml2.git] / saml / signature / SignatureProfileValidator.cpp
similarity index 66%
rename from saml/signature/VerifyingContext.cpp
rename to saml/signature/SignatureProfileValidator.cpp
index def1f98..279f8ed 100644 (file)
@@ -21,7 +21,8 @@
  */\r
  \r
 #include "internal.h"\r
-#include "signature/VerifyingContext.h"\r
+#include "exceptions.h"\r
+#include "signature/SignatureProfileValidator.h"\r
 \r
 #include <xmltooling/signature/Signature.h>\r
 \r
 #include <xsec/dsig/DSIGTransformList.hpp>\r
 \r
 using namespace opensaml;\r
+using namespace xmlsignature;\r
+using namespace xmltooling;\r
 using namespace std;\r
 \r
-void VerifyingContext::verifySignature(DSIGSignature* sig) const\r
+void SignatureProfileValidator::validate(const XMLObject* xmlObject) const\r
 {\r
-    bool valid=false;\r
+    const Signature* sigObj=dynamic_cast<const Signature*>(xmlObject);\r
+    if (!sigObj)\r
+        throw ValidationException("Validator only applies to Signature objects.");\r
+    DSIGSignature* sig=sigObj->getXMLSignature();\r
+    if (!sig)\r
+        throw ValidationException("Signature does not exist yet.");\r
 \r
+    const SignableObject* signableObj=dynamic_cast<const SignableObject*>(sigObj->getParent());\r
+    if (!signableObj)\r
+        throw ValidationException("Signature is not a child of a signable SAML object.");\r
+    \r
+    bool valid=false;\r
     DSIGReferenceList* refs=sig->getReferenceList();\r
     if (refs && refs->getSize()==1) {\r
         DSIGReference* ref=refs->item(0);\r
         if (ref) {\r
             const XMLCh* URI=ref->getURI();\r
-            if (URI==NULL || *URI==0 || (*URI==chPound && !XMLString::compareString(URI+1,m_id))) {\r
+            if (URI==NULL || *URI==0 || (*URI==chPound && !XMLString::compareString(URI+1,signableObj->getId()))) {\r
                 DSIGTransformList* tlist=ref->getTransforms();\r
                 for (unsigned int i=0; tlist && i<tlist->getSize(); i++) {\r
                     if (tlist->item(i)->getTransformType()==TRANSFORM_ENVELOPED_SIGNATURE)\r
@@ -58,5 +71,5 @@ void VerifyingContext::verifySignature(DSIGSignature* sig) const
     }\r
     \r
     if (!valid)\r
-        throw xmlsignature::SignatureException("Invalid signature profile for SAML object.");\r
+        throw ValidationException("Invalid signature profile for SAML object.");\r
 }\r