Removed ChildlessElement class references, ensure ComplexElement gets copied during...
[shibboleth/cpp-opensaml.git] / samltest / signature / SAML1ResponseTest.h
1 /*\r
2  *  Copyright 2001-2005 Internet2\r
3  * \r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  *     http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 \r
17 #include "signature/SAMLSignatureTestBase.h"\r
18 \r
19 #include <saml/saml1/core/Assertions.h>\r
20 #include <saml/saml1/core/Protocols.h>\r
21 \r
22 #include <fstream>\r
23 \r
24 using namespace opensaml::saml1p;\r
25 using namespace opensaml::saml1;\r
26 \r
27 class SAML1ResponseTest : public CxxTest::TestSuite, public SAMLSignatureTestBase {\r
28 public:\r
29     void setUp() {\r
30         childElementsFile  = data_path + "signature/SAML1Response.xml";\r
31         SAMLSignatureTestBase::setUp();\r
32     }\r
33 \r
34     void tearDown() {\r
35         SAMLSignatureTestBase::tearDown();\r
36     }\r
37 \r
38     void testSignature() {\r
39         auto_ptr_XMLCh issuer("issuer");\r
40         auto_ptr_XMLCh issueInstant("1970-01-02T01:01:02.100Z");\r
41         auto_ptr_XMLCh aid("aident");\r
42         auto_ptr_XMLCh rid("rident");\r
43         auto_ptr_XMLCh method("method");\r
44         auto_ptr_XMLCh nameid("John Doe");\r
45         \r
46         NameIdentifier* n=NameIdentifierBuilder::buildNameIdentifier();\r
47         n->setName(nameid.get());        \r
48         Subject* subject=SubjectBuilder::buildSubject();\r
49         subject->setNameIdentifier(n);\r
50 \r
51         AuthenticationStatement* statement=AuthenticationStatementBuilder::buildAuthenticationStatement();\r
52         statement->setAuthenticationInstant(issueInstant.get());\r
53         statement->setAuthenticationMethod(method.get());\r
54         statement->setSubject(subject);\r
55         \r
56         Assertion* assertion=AssertionBuilder::buildAssertion();\r
57         assertion->setAssertionID(aid.get());\r
58         assertion->setIssueInstant(issueInstant.get());\r
59         assertion->setIssuer(issuer.get());\r
60         assertion->getAuthenticationStatements().push_back(statement);\r
61 \r
62         // Append a Signature.\r
63         assertion->setSignature(SignatureBuilder::buildSignature());\r
64         Locker locker(m_resolver);\r
65         assertion->getSignature()->setSigningKey(m_resolver->getKey());\r
66 \r
67         // Build KeyInfo.\r
68         KeyInfo* keyInfo=KeyInfoBuilder::buildKeyInfo();\r
69         X509Data* x509Data=X509DataBuilder::buildX509Data();\r
70         keyInfo->getX509Datas().push_back(x509Data);\r
71         for_each(m_resolver->getCertificates().begin(),m_resolver->getCertificates().end(),bind1st(_addcert(),x509Data));\r
72         assertion->getSignature()->setKeyInfo(keyInfo);\r
73 \r
74         // Sign assertion while marshalling.\r
75         vector<Signature*> sigs(1,assertion->getSignature());\r
76         DOMElement* rootElement = NULL;\r
77         try {\r
78             rootElement=assertion->marshall((DOMDocument*)NULL,&sigs);\r
79         }\r
80         catch (XMLToolingException& e) {\r
81             TS_TRACE(e.what());\r
82             delete assertion;\r
83             throw;\r
84         }\r
85 \r
86         StatusCode* sc=StatusCodeBuilder::buildStatusCode();\r
87         sc->setValue(&StatusCode::SUCCESS);\r
88         Status* status=StatusBuilder::buildStatus();\r
89         status->setStatusCode(sc);\r
90 \r
91         auto_ptr<Response> response(ResponseBuilder::buildResponse());\r
92         response->setResponseID(rid.get());\r
93         response->setIssueInstant(issueInstant.get());\r
94         response->setStatus(status);\r
95         response->getAssertions().push_back(assertion);\r
96         response->setSignature(SignatureBuilder::buildSignature());\r
97         response->getSignature()->setSigningKey(m_resolver->getKey());\r
98         response->getSignature()->setKeyInfo(keyInfo->cloneKeyInfo());\r
99 \r
100         // Sign response while marshalling.\r
101         sigs.clear();\r
102         sigs.push_back(response->getSignature());\r
103         rootElement = NULL;\r
104         try {\r
105             rootElement=response->marshall((DOMDocument*)NULL,&sigs);\r
106         }\r
107         catch (XMLToolingException& e) {\r
108             TS_TRACE(e.what());\r
109             throw;\r
110         }\r
111 \r
112         string buf;\r
113         XMLHelper::serialize(rootElement, buf);\r
114         istringstream in(buf);\r
115         DOMDocument* doc=XMLToolingConfig::getConfig().getParser().parse(in);\r
116         const XMLObjectBuilder* b = XMLObjectBuilder::getBuilder(doc->getDocumentElement());\r
117         \r
118         auto_ptr<XMLObject> response2(b->buildFromDocument(doc));\r
119         assertEquals("Unmarshalled response does not match", expectedChildElementsDOM, response2.get(), false);\r
120         \r
121         try {\r
122             SignatureProfileValidator spv;\r
123             spv.validate(dynamic_cast<Response*>(response2.get())->getAssertions().front()->getSignature());\r
124             spv.validate(dynamic_cast<Response*>(response2.get())->getSignature());\r
125 \r
126             SignatureValidator sv(new KeyResolver(m_resolver->getKey()));\r
127             sv.validate(dynamic_cast<Response*>(response2.get())->getAssertions().front()->getSignature());\r
128             sv.validate(dynamic_cast<Response*>(response2.get())->getSignature());\r
129         }\r
130         catch (XMLToolingException& e) {\r
131             TS_TRACE(e.what());\r
132             throw;\r
133         }\r
134     }\r
135 \r
136 };\r