2 * shib-shire.cpp -- Shibboleth SHIRE functions
4 * Created by: Derek Atkins <derek@ihtfp.com>
14 # define SHIBTARGET_EXPORTS __declspec(dllexport)
17 #include "shib-target.h"
19 #include <log4cpp/Category.hh>
25 using namespace shibboleth;
26 using namespace shibtarget;
28 class shibtarget::SHIREPriv
31 SHIREPriv(RPCHandle *rpc, SHIREConfig cfg, string shire_url);
38 log4cpp::Category* log;
41 SHIREPriv::SHIREPriv(RPCHandle *rpc, SHIREConfig cfg, string shire_url)
43 string ctx = "shibtarget.SHIRE";
44 log = &(log4cpp::Category::getInstance(ctx));
50 SHIREPriv::~SHIREPriv() {}
53 SHIRE::SHIRE(RPCHandle *rpc, SHIREConfig cfg, string shire_url)
55 m_priv = new SHIREPriv(rpc, cfg, shire_url);
56 m_priv->log->info ("New SHIRE handle created: %p", m_priv);
65 RPCError* SHIRE::sessionIsValid(const char* cookie, const char* ip, const char* url)
67 saml::NDC ndc("sessionIsValid");
69 if (!cookie || *cookie == '\0') {
70 m_priv->log->error ("No cookie");
71 return new RPCError(-1, "No such cookie");
75 m_priv->log->error ("No IP");
76 return new RPCError(-1, "Invalid IP Address");
79 // make sure we pass _something_ to the server
82 m_priv->log->info ("is session valid: %s", ip);
83 m_priv->log->debug ("session cookie: %s", cookie);
85 shibrpc_session_is_valid_args_1 arg;
87 arg.cookie.cookie = (char*)cookie;
88 arg.cookie.client_addr = (char *)ip;
89 arg.url = (char *)url;
90 arg.lifetime = m_priv->m_config.lifetime;
91 arg.timeout = m_priv->m_config.timeout;
92 arg.checkIPAddress = m_priv->m_config.checkIPAddress;
94 shibrpc_session_is_valid_ret_1 ret;
95 memset (&ret, 0, sizeof(ret));
97 // Loop on the RPC in case we lost contact the first time through
101 clnt = m_priv->m_rpc->connect();
102 if (shibrpc_session_is_valid_1 (&arg, &ret, clnt) != RPC_SUCCESS) {
103 // FAILED. Release, disconnect, and try again...
104 m_priv->log->debug ("RPC Failure: %p (%p): %s", m_priv, clnt,
105 clnt_spcreateerror (""));
106 m_priv->m_rpc->release();
107 m_priv->m_rpc->disconnect();
111 m_priv->log->error ("RPC Failure: %p (%p)", m_priv, clnt);
112 return new RPCError(-1, "RPC Failure");
115 // SUCCESS. Release the lock.
116 m_priv->m_rpc->release();
119 } while (retry >= 0);
121 m_priv->log->debug ("RPC completed with status %d, %p", ret.status.status, m_priv);
124 if (ret.status.status)
125 retval = new RPCError(&ret.status);
127 retval = new RPCError();
129 clnt_freeres (clnt, (xdrproc_t)xdr_shibrpc_session_is_valid_ret_1, (caddr_t)&ret);
131 m_priv->log->debug ("returning");
135 RPCError* SHIRE::sessionCreate(const char* post, const char* ip, string& cookie)
137 saml::NDC ndc("sessionCreate");
139 if (!post || *post == '\0') {
140 m_priv->log->error ("No POST");
141 return new RPCError(-1, "Invalid POST string");
145 m_priv->log->error ("No IP");
146 return new RPCError(-1, "Invalid IP Address");
149 m_priv->log->info ("create session for user at %s", ip);
151 shibrpc_new_session_args_1 arg;
152 arg.shire_location = (char*) (m_priv->m_url.c_str());
153 arg.saml_post = (char*)post;
154 arg.client_addr = (char*)ip;
155 arg.checkIPAddress = m_priv->m_config.checkIPAddress;
157 shibrpc_new_session_ret_1 ret;
158 memset (&ret, 0, sizeof(ret));
160 // Loop on the RPC in case we lost contact the first time through
164 clnt = m_priv->m_rpc->connect();
165 if (shibrpc_new_session_1 (&arg, &ret, clnt) != RPC_SUCCESS) {
166 // FAILED. Release, disconnect, and retry
167 m_priv->log->debug ("RPC Failure: %p (%p): %s", m_priv, clnt,
168 clnt_spcreateerror (""));
169 m_priv->m_rpc->release();
170 m_priv->m_rpc->disconnect();
174 m_priv->log->error ("RPC Failure: %p (%p)", m_priv, clnt);
175 return new RPCError(-1, "RPC Failure");
178 // SUCCESS. Release and continue
179 m_priv->m_rpc->release();
182 } while (retry >= 0);
184 m_priv->log->debug ("RPC completed with status %d (%p)", ret.status.status, m_priv);
187 if (ret.status.status)
188 retval = new RPCError(&ret.status);
190 m_priv->log->debug ("new cookie: %s", ret.cookie);
192 retval = new RPCError();
195 clnt_freeres (clnt, (xdrproc_t)xdr_shibrpc_new_session_ret_1, (caddr_t)&ret);
197 m_priv->log->debug ("returning");