Allow cert fname to be given for PDU_Assoc YAZPP-7
authorAdam Dickmeiss <adam@indexdata.dk>
Fri, 3 May 2013 09:20:34 +0000 (11:20 +0200)
committerAdam Dickmeiss <adam@indexdata.dk>
Fri, 3 May 2013 09:20:34 +0000 (11:20 +0200)
Thus allowing a SSL/HTTPS server role.

include/yazpp/pdu-assoc.h
src/yaz-my-server.cpp
src/yaz-pdu-assoc.cpp

index 4358dce..2c2a9d8 100644 (file)
@@ -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 {
index 01a74aa..b4678ca 100644 (file)
@@ -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)
index d69768e..01cdb58 100644 (file)
@@ -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