X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fzebraapi.c;h=d419085e21b8e5653ab69d0650d12c8b90d78423;hb=593927cb1897c1e3163c284448eff7fee6ddad51;hp=b92e0b422c5c4b66b58987c59fe4817b4f3e9d81;hpb=22851818d50bb92ec91e9ec6f2bf484bd09307f6;p=idzebra-moved-to-github.git diff --git a/index/zebraapi.c b/index/zebraapi.c index b92e0b4..d419085 100644 --- a/index/zebraapi.c +++ b/index/zebraapi.c @@ -1,4 +1,4 @@ -/* $Id: zebraapi.c,v 1.188 2005-09-16 17:00:41 pop Exp $ +/* $Id: zebraapi.c,v 1.192 2005-10-28 07:25:30 adam Exp $ Copyright (C) 1995-2005 Index Data ApS @@ -46,8 +46,8 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #define ASSERTZHRES assert(zh && zh->service && zh->res) #define ASSERTZS assert(zs) -static int log_level = YLOG_LOG; -static int log_level_initialized = 1; +static int log_level = 0; +static int log_level_initialized = 0; static void zebra_open_res(ZebraHandle zh); static void zebra_close_res(ZebraHandle zh); @@ -113,6 +113,7 @@ ZebraHandle zebra_open(ZebraService zs, Res res) zh->res = 0; zh->session_res = res_open(zs->global_res, res); zh->user_perm = 0; + zh->dbaccesslist = 0; zh->reg_name = xstrdup (""); zh->path_reg = 0; @@ -182,6 +183,7 @@ ZebraService zebra_start_res (const char *configName, Res def_res, Res over_res) { const char *passwd_plain = 0; const char *passwd_encrypt = 0; + const char *dbaccess = 0; ZebraService zh = xmalloc(sizeof(*zh)); if (configName) @@ -195,6 +197,7 @@ ZebraService zebra_start_res (const char *configName, Res def_res, Res over_res) zebra_mutex_cond_init (&zh->session_lock); passwd_plain = res_get (zh->global_res, "passwd"); passwd_encrypt = res_get (zh->global_res, "passwd.c"); + dbaccess = res_get (zh->global_res, "dbaccess"); if (!passwd_plain && !passwd_encrypt) zh->passwd_db = NULL; @@ -211,6 +214,17 @@ ZebraService zebra_start_res (const char *configName, Res def_res, Res over_res) passwd_db_file_crypt(zh->passwd_db, passwd_encrypt); } } + + if (!dbaccess) + zh->dbaccess = NULL; + else { + zh->dbaccess = res_open(NULL, NULL); + if (res_read_file(zh->dbaccess, dbaccess) != ZEBRA_OK) { + yaz_log(YLOG_FATAL, "Failed to read %s", dbaccess); + return NULL; + } + } + zh->path_root = res_get (zh->global_res, "root"); zh->nmem = nmem_create(); zh->record_classes = recTypeClass_create (zh->global_res, zh->nmem); @@ -312,9 +326,13 @@ struct zebra_register *zebra_register_open(ZebraService zs, const char *name, reg->key_buf = 0; +#if NEW_REC_KEYS + reg->keys = zebra_rec_keys_open(); +#else reg->keys.buf_max = 0; reg->keys.buf = 0; reg->keys.codec_handle = iscz1_start(); +#endif reg->sortKeys.buf = 0; reg->sortKeys.buf_max = 0; @@ -483,6 +501,9 @@ static void zebra_register_close (ZebraService zs, struct zebra_register *reg) data1_destroy (reg->dh); xfree(reg->sortKeys.buf); +#if NEW_REC_KEYS + zebra_rec_keys_close(reg->keys); +#else xfree(reg->keys.buf); if (reg->keys.codec_handle) iscz1_stop(reg->keys.codec_handle); @@ -490,6 +511,8 @@ static void zebra_register_close (ZebraService zs, struct zebra_register *reg) if (reg->sortKeys.codec_handle) iscz1_stop(reg->sortKeys.codec_handle); #endif +#endif + xfree(reg->key_buf); xfree(reg->name); xfree(reg); @@ -541,6 +564,8 @@ ZEBRA_RES zebra_close (ZebraHandle zh) xfree(zh->record_encoding); + xfree(zh->dbaccesslist); + for (i = 0; i < zh->num_basenames; i++) xfree(zh->basenames[i]); xfree(zh->basenames); @@ -819,6 +844,32 @@ ZEBRA_RES zebra_select_databases (ZebraHandle zh, int num_bases, zh->errCode = YAZ_BIB1_COMBI_OF_SPECIFIED_DATABASES_UNSUPP; return ZEBRA_FAIL; } + + /* Check if the user has access to all databases (Seb) */ + /* You could argue that this should happen later, after we have + * determined that the database(s) exist. */ + if (zh->dbaccesslist) { + for (i = 0; i < num_bases; i++) { + const char *db = basenames[i]; + char *p, *pp; + for (p = zh->dbaccesslist; p && *p; p = pp) { + int len; + if ((pp = strchr(p, '+'))) { + len = pp - p; + pp++; + } + else + len = strlen(p); + if (len == strlen(db) && !strncmp(db, p, len)) + break; + } + if (!p) { + zh->errCode = YAZ_BIB1_ACCESS_TO_SPECIFIED_DATABASE_DENIED; + return ZEBRA_FAIL; + } + } + } + for (i = 0; i < zh->num_basenames; i++) xfree(zh->basenames[i]); xfree(zh->basenames); @@ -1179,6 +1230,7 @@ void zebra_clearError(ZebraHandle zh) ZEBRA_RES zebra_auth (ZebraHandle zh, const char *user, const char *pass) { const char *p; + const char *astring; char u[40]; ZebraService zs; @@ -1191,6 +1243,13 @@ ZEBRA_RES zebra_auth (ZebraHandle zh, const char *user, const char *pass) xfree(zh->user_perm); zh->user_perm = xstrdup(p ? p : "r"); + /* Determine database access list */ + astring = res_get(zs->dbaccess, user ? user : "anonymous"); + if (astring) + zh->dbaccesslist = xstrdup(astring); + else + zh->dbaccesslist = 0; + /* users that don't require a password .. */ if (zh->user_perm && strchr(zh->user_perm, 'a')) return ZEBRA_OK;