From: Adam Dickmeiss Date: Fri, 3 May 2013 09:20:34 +0000 (+0200) Subject: Allow cert fname to be given for PDU_Assoc YAZPP-7 X-Git-Tag: v1.4.1~4 X-Git-Url: http://git.indexdata.com/?p=yazpp-moved-to-github.git;a=commitdiff_plain;h=9ba43fac17a3f6c9df4412ef06f69092eacad74a Allow cert fname to be given for PDU_Assoc YAZPP-7 Thus allowing a SSL/HTTPS server role. --- diff --git a/include/yazpp/pdu-assoc.h b/include/yazpp/pdu-assoc.h index 4358dce..2c2a9d8 100644 --- a/include/yazpp/pdu-assoc.h +++ b/include/yazpp/pdu-assoc.h @@ -69,6 +69,7 @@ class YAZ_EXPORT PDU_Assoc : public IPDU_Observable, yazpp_1::ISocketObserver { void idleTime(int timeout); void close_session(); const char *getpeername(); + void set_cert_fname(const char *fname); }; class YAZ_EXPORT PDU_AssocThread : public PDU_Assoc { diff --git a/src/yaz-my-server.cpp b/src/yaz-my-server.cpp index 01a74aa..b4678ca 100644 --- a/src/yaz-my-server.cpp +++ b/src/yaz-my-server.cpp @@ -193,6 +193,7 @@ int main(int argc, char **argv) char *arg; char *prog = *argv; const char *addr = "tcp:@:9999"; + const char *cert_fname = 0; char *apdu_log = 0; SocketManager mySocketManager; @@ -202,7 +203,7 @@ int main(int argc, char **argv) MyServer *z = 0; int ret; - while ((ret = options("a:v:T", argv, argc, &arg)) != -2) + while ((ret = options("a:C:v:T", argv, argc, &arg)) != -2) { switch (ret) { @@ -212,6 +213,9 @@ int main(int argc, char **argv) case 'a': apdu_log = xstrdup(arg); break; + case 'C': + cert_fname = xstrdup(arg); + break; case 'v': yaz_log_init_level (yaz_log_mask_str(arg)); break; @@ -232,6 +236,8 @@ int main(int argc, char **argv) my_PDU_Assoc = new PDU_Assoc(&mySocketManager); #endif + my_PDU_Assoc->set_cert_fname(cert_fname); + z = new MyServer(my_PDU_Assoc); z->server(addr); if (apdu_log) diff --git a/src/yaz-pdu-assoc.cpp b/src/yaz-pdu-assoc.cpp index d69768e..01cdb58 100644 --- a/src/yaz-pdu-assoc.cpp +++ b/src/yaz-pdu-assoc.cpp @@ -54,6 +54,7 @@ namespace yazpp_1 { void init(yazpp_1::ISocketObservable *socketObservable); COMSTACK comstack(const char *type_and_host, void **vp); bool m_session_is_dead; + char *cert_fname; }; } @@ -73,10 +74,12 @@ void PDU_Assoc_priv::init(ISocketObservable *socketObservable) idleTime = 0; log = YLOG_DEBUG; m_session_is_dead = false; + cert_fname = 0; } PDU_Assoc::~PDU_Assoc() { + xfree(m_p->cert_fname); delete m_p; } @@ -502,6 +505,10 @@ int PDU_Assoc::listen(IPDU_Observer *observer, const char *addr) if (!m_p->cs) return -1; + + if (m_p->cert_fname) + cs_set_ssl_certificate_file(m_p->cs, m_p->cert_fname); + if (cs_bind(m_p->cs, ap, CS_SERVER) < 0) return -2; @@ -607,6 +614,15 @@ const char*PDU_Assoc::getpeername() return 0; return cs_addrstr(m_p->cs); } + +void PDU_Assoc::set_cert_fname(const char *fname) +{ + xfree(m_p->cert_fname); + m_p->cert_fname = 0; + if (fname) + m_p->cert_fname = xstrdup(fname); +} + /* * Local variables: * c-basic-offset: 4