Fixed Bug #1044 -- connections should no lomnger be re-used if authent tokens
authorSebastian Hammer <quinn@indexdata.com>
Sat, 2 Jun 2007 04:32:28 +0000 (04:32 +0000)
committerSebastian Hammer <quinn@indexdata.com>
Sat, 2 Jun 2007 04:32:28 +0000 (04:32 +0000)
don't match.

src/client.c
src/connection.c
src/connection.h
src/logic.c

index e3205d9..fe1d950 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: client.c,v 1.5 2007-06-02 03:37:55 quinn Exp $
+/* $Id: client.c,v 1.6 2007-06-02 04:32:28 quinn Exp $
    Copyright (c) 2006-2007, Index Data.
 
 This file is part of Pazpar2.
@@ -444,11 +444,14 @@ static void init_authentication(struct client *cl, Z_InitRequest *req)
 
     if (*auth)
     {
+        struct connection *co = client_get_connection(cl);
+        struct session *se = client_get_session(cl);
         Z_IdAuthentication *idAuth = odr_malloc(global_parameters.odr_out,
                 sizeof(*idAuth));
         idAuth->which = Z_IdAuthentication_open;
         idAuth->u.open = auth;
         req->idAuthentication = idAuth;
+        connection_set_authentication(co, nmem_strdup(se->session_nmem, auth));
     }
 }
 
index d318033..2a12785 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: connection.c,v 1.2 2007-04-24 08:03:03 adam Exp $
+/* $Id: connection.c,v 1.3 2007-06-02 04:32:28 quinn Exp $
    Copyright (c) 2006-2007, Index Data.
 
 This file is part of Pazpar2.
@@ -46,6 +46,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include "pazpar2.h"
 #include "host.h"
 #include "client.h"
+#include "settings.h"
 #include "parameters.h"
 
 
@@ -58,6 +59,7 @@ struct connection {
     struct client *client;
     char *ibuf;
     int ibufsize;
+    char *authentication; // Empty string or authentication string if set
     enum {
         Conn_Resolving,
         Conn_Connecting,
@@ -124,6 +126,7 @@ struct connection *connection_create(struct client *cl)
     new->next = new->host->connections;
     new->host->connections = new;
     new->client = cl;
+    new->authentication = "";
     client_set_connection(cl, new);
     new->link = 0;
     new->state = Conn_Resolving;
@@ -374,6 +377,11 @@ const char *connection_get_url(struct connection *co)
     return client_get_url(co->client);
 }
 
+void connection_set_authentication(struct connection *co, char *auth)
+{
+    co->authentication = auth;
+}
+
 // Ensure that client has a connection associated
 int client_prep_connection(struct client *cl)
 {
@@ -390,7 +398,11 @@ int client_prep_connection(struct client *cl)
         // See if someone else has an idle connection
         // We should look at timestamps here to select the longest-idle connection
         for (co = host->connections; co; co = co->next)
-            if (co->state == Conn_Open && (!co->client || client_get_session(co->client) != se))
+            if (co->state == Conn_Open &&
+                (!co->client || client_get_session(co->client) != se) &&
+                !strcmp(co->authentication,
+                    session_setting_oneval(client_get_database(cl),
+                    PZ_AUTHENTICATION)))
                 break;
         if (co)
         {
index 328a0f6..748c610 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: connection.h,v 1.2 2007-04-24 08:03:03 adam Exp $
+/* $Id: connection.h,v 1.3 2007-06-02 04:32:28 quinn Exp $
    Copyright (c) 2006-2007, Index Data.
 
 This file is part of Pazpar2.
@@ -39,6 +39,7 @@ struct connection *connection_create(struct client *cl);
 void connect_resolver_host(struct host *host);
 int connection_send_apdu(struct connection *co, Z_APDU *a);
 struct host *connection_get_host(struct connection *con);
+void connection_set_authentication(struct connection *co, char *auth);
 int connection_connect(struct connection *con);
 struct connection *connection_get_available(struct connection *con_list,
                                             struct session *se);
index bb10b78..ea6e66f 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: logic.c,v 1.34 2007-06-01 10:38:08 adam Exp $
+/* $Id: logic.c,v 1.35 2007-06-02 04:32:28 quinn Exp $
    Copyright (c) 2006-2007, Index Data.
 
 This file is part of Pazpar2.
@@ -502,9 +502,7 @@ char *search(struct session *se, char *query, char *filter)
     }
 
     for (cl = se->clients; cl; cl = client_next_in_session(cl))
-    {
         client_prep_connection(cl);
-    }
 
     return 0;
 }