Fixes to SOAP clients
[shibboleth/cpp-opensaml.git] / saml / binding / SOAPClient.h
1 /*
2  *  Copyright 2001-2007 Internet2
3  * 
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 /**
18  * @file saml/binding/SOAPClient.h
19  * 
20  * Specialized SOAPClient for SAML SOAP bindings.
21  */
22
23 #ifndef __saml_soap11client_h__
24 #define __saml_soap11client_h__
25
26 #include <saml/binding/SecurityPolicy.h>
27 #include <xmltooling/soap/SOAPClient.h>
28
29 namespace opensaml {
30
31     /**
32      * Specialized SOAPClient for SAML SOAP bindings.
33      */
34     class SAML_API SOAPClient : public soap11::SOAPClient
35     {
36     public:
37         /**
38          * Creates a SOAP client instance with a particular SecurityPolicy.
39          * 
40          * @param policy        reference to SecurityPolicy to apply
41          * @param validating    controls schema validation
42          */
43         SOAPClient(SecurityPolicy& policy, bool validating=false)
44             : soap11::SOAPClient(validating), m_policy(policy), m_force(true), m_correlate(NULL) {}
45         
46         virtual ~SOAPClient() {
47             XMLString::release(&m_correlate);
48         }
49
50         /**
51          * Controls whether to force transport/peer authentication via an X509TrustEngine.
52          * 
53          * <p>Only makes sense if an X509TrustEngine is supplied by the SecurityPolicy. 
54          * 
55          * @param force  true iff the client should refuse to communicate without this protection
56          */
57         void forceTransportAuthentication(bool force=true) {
58             m_force = force;
59         }
60         
61         /**
62          * Override prepares the SecurityPolicy by clearing Issuer identity, in case the policy
63          * is reused.
64          * 
65          * @param env       SOAP envelope to send
66          * @param peer      peer to send message to, expressed in TrustEngine terms
67          * @param endpoint  URL of endpoint to recieve message
68          */
69         void send(const soap11::Envelope* env, const xmltooling::KeyInfoSource& peer, const char* endpoint);
70         
71         /**
72          * Override applies SecurityPolicy to envelope before returning it.
73          * 
74          * @return response envelope after SecurityPolicy has been applied
75          */
76         soap11::Envelope* receive();
77         
78         void reset();
79
80     protected:
81         /**
82          * Override prepares transport by assigning an X509TrustEngine to it, if one is
83          * attached to the policy.
84          * 
85          * @param transport reference to transport layer
86          */
87         void prepareTransport(const xmltooling::SOAPTransport& transport);
88         
89         /** Reference to security policy to apply. */
90         SecurityPolicy& m_policy;
91         
92         /** Flag controlling whether transport/peer authn is mandatory. */
93         bool m_force;
94     
95         /** Message correlation ID. */
96         XMLCh* m_correlate;
97         
98     private:
99         const saml2md::RoleDescriptor* m_peer;
100     };
101
102 };
103
104 #endif /* __saml_soap11client_h__ */