X-Git-Url: http://sru.miketaylor.org.uk/?a=blobdiff_plain;f=src%2Fyaz-proxy-config.cpp;h=0a71115ebedf38370611580762918a67eb57dcdc;hb=88510217a59150b1c3812213099ddef2a3d2846e;hp=f7ab3d92e698d602387faac17dc33262f0807c5c;hpb=36388cfc9c49bf00dfbb3cc9932504a77af9b6f2;p=yazproxy-moved-to-github.git diff --git a/src/yaz-proxy-config.cpp b/src/yaz-proxy-config.cpp index f7ab3d9..0a71115 100644 --- a/src/yaz-proxy-config.cpp +++ b/src/yaz-proxy-config.cpp @@ -1,7 +1,7 @@ -/* $Id: yaz-proxy-config.cpp,v 1.25 2006-03-25 10:59:14 adam Exp $ - Copyright (c) 1998-2005, Index Data. +/* $Id: yaz-proxy-config.cpp,v 1.34 2006-07-06 11:50:26 adam Exp $ + Copyright (c) 1998-2006, Index Data. -This file is part of the yaz-proxy. +This file is part of the yazproxy. YAZ proxy is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -31,7 +31,7 @@ class Yaz_ProxyConfigP { int mycmp(const char *hay, const char *item, size_t len); int match_list(int v, const char *m); int atoi_l(const char **cp); -#if HAVE_XSLT +#if YAZ_HAVE_XSLT void load_modules(void); int check_schema(xmlNodePtr ptr, Z_RecordComposition *comp, const char *schema_identifier); @@ -39,7 +39,7 @@ class Yaz_ProxyConfigP { xmlNodePtr m_proxyPtr; void return_target_info(xmlNodePtr ptr, const char **url, int *limit_bw, int *limit_pdu, int *limit_req, - int *limit_search, int *limit_connect, + int *limit_search, int *target_idletime, int *client_idletime, int *keepalive_limit_bw, int *keepalive_limit_pdu, int *pre_init, const char **cql2rpn, @@ -49,12 +49,13 @@ class Yaz_ProxyConfigP { const char **default_client_query_charset); void return_limit(xmlNodePtr ptr, int *limit_bw, int *limit_pdu, int *limit_req, - int *limit_search, int *limit_connect); + int *limit_search); int check_type_1(ODR odr, xmlNodePtr ptr, Z_RPNQuery *query, char **addinfo); xmlNodePtr find_target_node(const char *name, const char *db); xmlNodePtr find_target_db(xmlNodePtr ptr, const char *db); const char *get_text(xmlNodePtr ptr); + void get_period(xmlNodePtr ptr, int *period); int check_type_1_attributes(ODR odr, xmlNodePtr ptr, Z_AttributeList *attrs, char **addinfo); @@ -69,7 +70,7 @@ class Yaz_ProxyConfigP { Yaz_ProxyConfigP::Yaz_ProxyConfigP() : m_modules() { -#if HAVE_XSLT +#if YAZ_HAVE_XSLT m_docPtr = 0; m_proxyPtr = 0; #endif @@ -77,7 +78,7 @@ Yaz_ProxyConfigP::Yaz_ProxyConfigP() : m_modules() Yaz_ProxyConfigP::~Yaz_ProxyConfigP() { -#if HAVE_XSLT +#if YAZ_HAVE_XSLT if (m_docPtr) xmlFreeDoc(m_docPtr); #endif @@ -93,7 +94,7 @@ Yaz_ProxyConfig::~Yaz_ProxyConfig() delete m_cp; } -#if HAVE_XSLT +#if YAZ_HAVE_XSLT void Yaz_ProxyConfigP::load_modules() { if (!m_proxyPtr) @@ -114,7 +115,7 @@ void Yaz_ProxyConfigP::load_modules() int Yaz_ProxyConfig::read_xml(const char *fname) { -#if HAVE_XSLT +#if YAZ_HAVE_XSLT xmlDocPtr ndoc = xmlParseFile(fname); if (!ndoc) @@ -149,7 +150,7 @@ int Yaz_ProxyConfig::read_xml(const char *fname) #endif } -#if HAVE_XSLT +#if YAZ_HAVE_XSLT const char *Yaz_ProxyConfigP::get_text(xmlNodePtr ptr) { for(ptr = ptr->children; ptr; ptr = ptr->next) @@ -165,15 +166,26 @@ const char *Yaz_ProxyConfigP::get_text(xmlNodePtr ptr) } return 0; } + +void Yaz_ProxyConfigP::get_period(xmlNodePtr ptr, int *period) +{ + struct _xmlAttr *attr; + *period = 60; + for (attr = ptr->properties; attr; attr = attr->next) + { + if (!strcmp((const char *) attr->name, "period") && + attr->children && attr->children->type == XML_TEXT_NODE) + *period = atoi((const char *) attr->children->content); + } +} #endif -#if HAVE_XSLT +#if YAZ_HAVE_XSLT void Yaz_ProxyConfigP::return_limit(xmlNodePtr ptr, int *limit_bw, int *limit_pdu, int *limit_req, - int *limit_search, - int *limit_connect) + int *limit_search) { for (ptr = ptr->children; ptr; ptr = ptr->next) { @@ -205,25 +217,17 @@ void Yaz_ProxyConfigP::return_limit(xmlNodePtr ptr, if (t) *limit_search = atoi(t); } - if (ptr->type == XML_ELEMENT_NODE - && !strcmp((const char *) ptr->name, "connect")) - { - const char *t = get_text(ptr); - if (t) - *limit_connect = atoi(t); - } } } #endif -#if HAVE_XSLT +#if YAZ_HAVE_XSLT void Yaz_ProxyConfigP::return_target_info(xmlNodePtr ptr, const char **url, int *limit_bw, int *limit_pdu, int *limit_req, int *limit_search, - int *limit_connect, int *target_idletime, int *client_idletime, int *keepalive_limit_bw, @@ -263,12 +267,12 @@ void Yaz_ProxyConfigP::return_target_info(xmlNodePtr ptr, *keepalive_limit_bw = 500000; *keepalive_limit_pdu = 1000; return_limit(ptr, keepalive_limit_bw, keepalive_limit_pdu, - &dummy, &dummy, &dummy); + &dummy, &dummy); } if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "limit")) return_limit(ptr, limit_bw, limit_pdu, limit_req, - limit_search, limit_connect); + limit_search); if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "target-timeout")) { @@ -364,7 +368,7 @@ int Yaz_ProxyConfigP::match_list(int v, const char *m) return 0; } -#if HAVE_XSLT +#if YAZ_HAVE_XSLT int Yaz_ProxyConfigP::check_type_1_attributes(ODR odr, xmlNodePtr ptrl, Z_AttributeList *attrs, char **addinfo) @@ -437,7 +441,7 @@ int Yaz_ProxyConfigP::check_type_1_attributes(ODR odr, xmlNodePtr ptrl, } #endif -#if HAVE_XSLT +#if YAZ_HAVE_XSLT int Yaz_ProxyConfigP::check_type_1_structure(ODR odr, xmlNodePtr ptr, Z_RPNStructure *q, char **addinfo) @@ -463,7 +467,7 @@ int Yaz_ProxyConfigP::check_type_1_structure(ODR odr, xmlNodePtr ptr, } #endif -#if HAVE_XSLT +#if YAZ_HAVE_XSLT int Yaz_ProxyConfigP::check_type_1(ODR odr, xmlNodePtr ptr, Z_RPNQuery *query, char **addinfo) { @@ -475,7 +479,7 @@ int Yaz_ProxyConfigP::check_type_1(ODR odr, xmlNodePtr ptr, Z_RPNQuery *query, int Yaz_ProxyConfig::check_query(ODR odr, const char *name, Z_Query *query, char **addinfo) { -#if HAVE_XSLT +#if YAZ_HAVE_XSLT xmlNodePtr ptr; ptr = m_cp->find_target_node(name, 0); @@ -488,7 +492,7 @@ int Yaz_ProxyConfig::check_query(ODR odr, const char *name, Z_Query *query, return 0; } -#if HAVE_XSLT +#if YAZ_HAVE_XSLT int Yaz_ProxyConfigP::check_schema(xmlNodePtr ptr, Z_RecordComposition *comp, const char *schema_identifier) { @@ -545,6 +549,8 @@ const char *Yaz_ProxyConfig::check_mime_type(const char *path) {".jpg", "image/jpeg"}, {".png", "image/png"}, {".gif", "image/gif"}, + {".css", "text/css"}, + {".pdf", "application/pdf"}, {0, "text/plain"}, {0, 0}, }; @@ -566,7 +572,7 @@ const char *Yaz_ProxyConfig::check_mime_type(const char *path) void Yaz_ProxyConfig::target_authentication(const char *name, ODR odr, Z_InitRequest *req) { -#if HAVE_XSLT +#if YAZ_HAVE_XSLT xmlNodePtr ptr = m_cp->find_target_node(name, 0); if (!ptr) return ; @@ -639,7 +645,7 @@ int Yaz_ProxyConfig::client_authentication(const char *name, const char *peer_IP) { int ret = YAZPROXY_RET_NOT_ME; -#if HAVE_XSLT +#if YAZ_HAVE_XSLT xmlNodePtr ptr; ptr = m_cp->find_target_node(name, 0); if (!ptr) @@ -670,6 +676,44 @@ int Yaz_ProxyConfig::client_authentication(const char *name, return 1; } +int Yaz_ProxyConfig::global_client_authentication(const char *user, + const char *group, + const char *password, + const char *peer_IP) +{ + int ret = YAZPROXY_RET_NOT_ME; +#if YAZ_HAVE_XSLT + if (!m_cp->m_proxyPtr) + return 1; + xmlNodePtr ptr; + for (ptr = m_cp->m_proxyPtr->children; ptr; ptr = ptr->next) + { + if (ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "client-authentication")) + { + struct _xmlAttr *attr; + const char *module_name = 0; + for (attr = ptr->properties; attr; attr = attr->next) + { + if (!strcmp((const char *) attr->name, "module") && + attr->children && attr->children->type == XML_TEXT_NODE) + module_name = (const char *) attr->children->content; + } + ret = m_cp->m_modules.authenticate(module_name, + NULL, ptr, + user, group, password, + peer_IP + ); + if (ret != YAZPROXY_RET_NOT_ME) + break; + } + } +#endif + if (ret == YAZPROXY_RET_PERM) + return 0; + return 1; +} + int Yaz_ProxyConfig::check_syntax(ODR odr, const char *name, Odr_oid *syntax, Z_RecordComposition *comp, char **addinfo, @@ -710,7 +754,7 @@ int Yaz_ProxyConfig::check_syntax(ODR odr, const char *name, xfree (*usemarcon_ini_stage2); *usemarcon_ini_stage2 = 0; } -#if HAVE_XSLT +#if YAZ_HAVE_XSLT int syntax_has_matched = 0; xmlNodePtr ptr; @@ -847,7 +891,7 @@ int Yaz_ProxyConfig::check_syntax(ODR odr, const char *name, return 0; } -#if HAVE_XSLT +#if YAZ_HAVE_XSLT xmlNodePtr Yaz_ProxyConfigP::find_target_db(xmlNodePtr ptr, const char *db) { xmlNodePtr dptr; @@ -933,7 +977,6 @@ int Yaz_ProxyConfig::get_target_no(int no, int *limit_pdu, int *limit_req, int *limit_search, - int *limit_connect, int *target_idletime, int *client_idletime, int *max_clients, @@ -947,7 +990,7 @@ int Yaz_ProxyConfig::get_target_no(int no, const char **target_charset, const char **default_client_query_charset) { -#if HAVE_XSLT +#if YAZ_HAVE_XSLT xmlNodePtr ptr; if (!m_cp->m_proxyPtr) return 0; @@ -970,7 +1013,7 @@ int Yaz_ProxyConfig::get_target_no(int no, m_cp->return_target_info( ptr, url, limit_bw, limit_pdu, limit_req, - limit_search, limit_connect, + limit_search, target_idletime, client_idletime, keepalive_limit_bw, keepalive_limit_pdu, pre_init, cql2rpn, @@ -991,10 +1034,39 @@ int Yaz_ProxyConfigP::mycmp(const char *hay, const char *item, size_t len) return 0; } +int Yaz_ProxyConfig::get_file_access_info(const char *path) +{ +#if YAZ_HAVE_XSLT + xmlNodePtr ptr; + if (!m_cp->m_proxyPtr) + return 0; + for (ptr = m_cp->m_proxyPtr->children; ptr; ptr = ptr->next) + { + if (ptr->type == XML_ELEMENT_NODE + && !strcmp((const char *) ptr->name, "docpath")) + { + const char *docpath = m_cp->get_text(ptr); + size_t docpath_len = strlen(docpath); + if (docpath_len < strlen(path) && path[docpath_len] == '/' + && !memcmp(docpath, path, docpath_len)) + return 1; + } + } +#endif + return 0; +} + void Yaz_ProxyConfig::get_generic_info(int *log_mask, - int *max_clients) + int *max_clients, + int *max_connect, + int *limit_connect, + int *period_connect, + int *num_msg_threads) { -#if HAVE_XSLT + *max_connect = 0; + *limit_connect = 0; + *num_msg_threads = 0; +#if YAZ_HAVE_XSLT xmlNodePtr ptr; if (!m_cp->m_proxyPtr) return; @@ -1019,6 +1091,8 @@ void Yaz_ProxyConfig::get_generic_info(int *log_mask, *log_mask |= PROXY_LOG_REQ_CLIENT; if (m_cp->mycmp(v, "server-requests", len)) *log_mask |= PROXY_LOG_REQ_SERVER; + if (m_cp->mycmp(v, "client-ip", len)) + *log_mask |= PROXY_LOG_IP_CLIENT; if (isdigit(*v)) *log_mask |= atoi(v); if (*cp == ',') @@ -1028,7 +1102,7 @@ void Yaz_ProxyConfig::get_generic_info(int *log_mask, v = cp; } } - if (ptr->type == XML_ELEMENT_NODE && + else if (ptr->type == XML_ELEMENT_NODE && !strcmp((const char *) ptr->name, "max-clients")) { const char *t = m_cp->get_text(ptr); @@ -1039,11 +1113,62 @@ void Yaz_ProxyConfig::get_generic_info(int *log_mask, *max_clients = 1; } } + else if (ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "period-connect")) + { + const char *t = m_cp->get_text(ptr); + if (t) + *period_connect = atoi(t); + } + else if (ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "max-connect")) + { + const char *t = m_cp->get_text(ptr); + if (t) + { + *max_connect = atoi(t); + } + } + else if (ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "limit-connect")) + { + const char *t = m_cp->get_text(ptr); + if (t) + { + *limit_connect = atoi(t); + } + } + else if (ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "target")) + ; + else if (ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "docpath")) + ; + else if (ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "module")) + ; + else if (ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "client-authentication")) + ; + else if (ptr->type == XML_ELEMENT_NODE && + !strcmp((const char *) ptr->name, "threads")) + { + const char *t = m_cp->get_text(ptr); + if (t) + { + *num_msg_threads = atoi(t); + } + } + else if (ptr->type == XML_ELEMENT_NODE) + { + yaz_log(YLOG_WARN, "0 Unknown element %s in yazproxy config", + ptr->name); + } } #endif } -#if HAVE_XSLT +#if YAZ_HAVE_XSLT int Yaz_ProxyConfigP::get_explain_ptr(const char *host, const char *db, xmlNodePtr *ptr_target, xmlNodePtr *ptr_explain) @@ -1100,7 +1225,7 @@ int Yaz_ProxyConfigP::get_explain_ptr(const char *host, const char *db, const char *Yaz_ProxyConfig::get_explain_name(const char *db, const char **backend_db) { -#if HAVE_XSLT +#if YAZ_HAVE_XSLT xmlNodePtr ptr_target, ptr_explain; if (m_cp->get_explain_ptr(0, db, &ptr_target, &ptr_explain) && ptr_target) @@ -1138,7 +1263,7 @@ const char *Yaz_ProxyConfig::get_explain_name(const char *db, char *Yaz_ProxyConfig::get_explain_doc(ODR odr, const char *name, const char *db, int *len) { -#if HAVE_XSLT +#if YAZ_HAVE_XSLT xmlNodePtr ptr_target, ptr_explain; if (m_cp->get_explain_ptr(0 /* host */, db, &ptr_target, &ptr_explain)) { @@ -1167,7 +1292,6 @@ void Yaz_ProxyConfig::get_target_info(const char *name, int *limit_pdu, int *limit_req, int *limit_search, - int *limit_connect, int *target_idletime, int *client_idletime, int *max_clients, @@ -1180,7 +1304,7 @@ void Yaz_ProxyConfig::get_target_info(const char *name, const char **target_charset, const char **default_client_query_charset) { -#if HAVE_XSLT +#if YAZ_HAVE_XSLT xmlNodePtr ptr; if (!m_cp->m_proxyPtr) { @@ -1212,7 +1336,7 @@ void Yaz_ProxyConfig::get_target_info(const char *name, url[1] = 0; } m_cp->return_target_info(ptr, url, limit_bw, limit_pdu, limit_req, - limit_search, limit_connect, + limit_search, target_idletime, client_idletime, keepalive_limit_bw, keepalive_limit_pdu, pre_init, cql2rpn,