Enabling rsprox. Tests OK
[idzebra-moved-to-github.git] / index / zebraapi.c
index e4ea555..5124ad2 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: zebraapi.c,v 1.116 2004-01-22 11:27:21 adam Exp $
+/* $Id: zebraapi.c,v 1.119 2004-05-10 08:47:54 adam Exp $
    Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004
    Index Data Aps
 
@@ -77,8 +77,8 @@ static void zebra_flush_reg (ZebraHandle zh)
     zh->errCode=0;
     zebraExplain_flush (zh->reg->zei, zh);
     
-    extract_flushWriteKeys (zh);
-    zebra_index_merge (zh);
+    extract_flushWriteKeys (zh,1 /* final */);
+    zebra_index_merge (zh );
 }
 
 static struct zebra_register *zebra_register_open (ZebraService zs, 
@@ -108,6 +108,7 @@ ZebraHandle zebra_open (ZebraService zs)
     zh->errCode = 0;
     zh->errString = 0;
     zh->res = 0; 
+    zh->user_perm = 0;
 
     zh->reg_name = xstrdup ("");
     zh->path_reg = 0;
@@ -258,6 +259,7 @@ struct zebra_register *zebra_register_open (ZebraService zs, const char *name,
     reg->zei = 0;
     reg->matchDict = 0;
     reg->key_file_no = 0;
+    reg->ptr_i=0;
     
     zebraRankInstall (reg, rank1_class);
     zebraRankInstall (reg, rankzv_class);
@@ -507,6 +509,7 @@ int zebra_close (ZebraHandle zh)
     }
     zebra_mutex_cond_unlock (&zs->session_lock);
     xfree (zh->reg_name);
+    xfree (zh->user_perm);
     zh->service=0; /* more likely to trigger an assert */
     xfree (zh->path_reg);
     xfree (zh);
@@ -918,10 +921,10 @@ int zebra_deleleResultSet(ZebraHandle zh, int function,
        return Z_DeleteStatus_systemProblemAtTarget;
     switch (function)
     {
-    case Z_DeleteRequest_list:
+    case Z_DeleteResultSetRequest_list:
        resultSetDestroy (zh, num_setnames, setnames, statuses);
        break;
-    case Z_DeleteRequest_all:
+    case Z_DeleteResultSetRequest_all:
        resultSetDestroy (zh, -1, 0, statuses);
        break;
     }
@@ -973,18 +976,25 @@ void zebra_clearError(ZebraHandle zh)
 
 int zebra_auth (ZebraHandle zh, const char *user, const char *pass)
 {
+    const char *p;
+    char u[40];
     ZebraService zs;
+
     ASSERTZH;
-    yaz_log(LOG_API,"zebra_auth u=%s p=%s",user,pass);
     zh->errCode=0;
     zs= zh->service;
+    
+    sprintf(u, "perm.%.30s", user ? user : "anonymous");
+    p = res_get(zs->global_res, u);
+    xfree (zh->user_perm);
+    zh->user_perm = xstrdup(p ? p : "r");
+
+    /* users that don't require a password .. */
+    if (zh->user_perm && strchr(zh->user_perm, 'a'))
+       return 0;
+    
     if (!zs->passwd_db || !passwd_db_auth (zs->passwd_db, user, pass))
-    {
-        logf(LOG_APP,"AUTHOK:%s", user?user:"ANONYMOUS");
        return 0;
-    }
-
-    logf(LOG_APP,"AUTHFAIL:%s", user?user:"ANONYMOUS");
     return 1;
 }
 
@@ -997,7 +1007,8 @@ int zebra_admin_import_begin (ZebraHandle zh, const char *database,
     zh->errCode=0;
     if (zebra_select_database(zh, database))
         return 1;
-    zebra_begin_trans (zh, 1);
+    if (zebra_begin_trans (zh, 1))
+       return 1;
     return 0;
 }
 
@@ -1068,7 +1079,8 @@ int zebra_admin_exchange_record (ZebraHandle zh,
     memcpy (recid_z, recid_buf, recid_len);
     recid_z[recid_len] = 0;
 
-    zebra_begin_trans(zh,1);
+    if (zebra_begin_trans(zh, 1))
+       return -1;
 
     rinfo = dict_lookup (zh->reg->matchDict, recid_z);
     if (rinfo)
@@ -1307,6 +1319,17 @@ int zebra_begin_trans (ZebraHandle zh, int rw)
     }
     ASSERTZHRES;
     yaz_log(LOG_API,"zebra_begin_trans rw=%d",rw);
+
+    if (zh->user_perm)
+    {
+       if (rw && !strchr(zh->user_perm, 'w'))
+       {
+           zh->errCode = 223;
+           zh->errString = 0;
+           return -1;
+       }
+    }
+
     assert (zh->res);
     if (rw)
     {
@@ -1931,7 +1954,8 @@ int zebra_insert_record (ZebraHandle zh,
 
     if (buf_size < 1) buf_size = strlen(buf);
 
-    zebra_begin_trans(zh, 1);
+    if (zebra_begin_trans(zh, 1))
+       return 1;
     res = buffer_extract_record (zh, buf, buf_size, 
                                 0, /* delete_flag  */
                                 0, /* test_mode */
@@ -1956,7 +1980,8 @@ int zebra_update_record (ZebraHandle zh,
 
     if (buf_size < 1) buf_size = strlen(buf);
 
-    zebra_begin_trans(zh, 1);
+    if (zebra_begin_trans(zh, 1))
+       return 1;
     res = buffer_extract_record (zh, buf, buf_size, 
                                 0, /* delete_flag */
                                 0, /* test_mode */
@@ -1980,7 +2005,8 @@ int zebra_delete_record (ZebraHandle zh,
 
     if (buf_size < 1) buf_size = strlen(buf);
 
-    zebra_begin_trans(zh, 1);
+    if (zebra_begin_trans(zh, 1))
+       return 1;
     res = buffer_extract_record (zh, buf, buf_size,
                                 1, /* delete_flag */
                                 0, /* test_mode */