X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Ffilter_zoom.cpp;h=2edddd57d775b03de46f8f1d3b781f57c7a02c20;hb=3b4860c163303e7a0c2ecc3946c4053cb6c72714;hp=95e2b36286d25f11076a41e1209cb0ed2986a5a2;hpb=bed9f4c782f6f411e40bbbeb517f48dbddf6de49;p=metaproxy-moved-to-github.git diff --git a/src/filter_zoom.cpp b/src/filter_zoom.cpp index 95e2b36..2edddd5 100644 --- a/src/filter_zoom.cpp +++ b/src/filter_zoom.cpp @@ -1,5 +1,5 @@ /* This file is part of Metaproxy. - Copyright (C) 2005-2012 Index Data + Copyright (C) 2005-2013 Index Data Metaproxy 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 @@ -60,6 +60,7 @@ namespace metaproxy_1 { class Zoom::Searchable : boost::noncopyable { public: std::string authentication; + std::string authenticationMode; std::string cfAuth; std::string cfProxy; std::string cfSubDB; @@ -508,6 +509,11 @@ yf::Zoom::SearchablePtr yf::Zoom::Impl::parse_torus_record(const xmlNode *ptr) s->authentication = mp::xml::get_text(ptr); } else if (!strcmp((const char *) ptr->name, + "authenticationMode")) + { + s->authenticationMode = mp::xml::get_text(ptr); + } + else if (!strcmp((const char *) ptr->name, "cfAuth")) { s->cfAuth = mp::xml::get_text(ptr); @@ -944,8 +950,8 @@ bool yf::Zoom::Frontend::create_content_session(mp::Package &package, "unable to open content config %s", m_p->content_config_file.c_str()); *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR; - *addinfo = (char *) odr_malloc(odr, 60 + tmp_file.length()); - sprintf(*addinfo, "unable to open content config %s", + *addinfo = (char *) odr_malloc(odr, 70 + tmp_file.length()); + sprintf(*addinfo, "zoom: unable to open content config %s", m_p->content_config_file.c_str()); return false; } @@ -969,7 +975,7 @@ bool yf::Zoom::Frontend::create_content_session(mp::Package &package, package.log("zoom", YLOG_WARN, "bad tmp_file %s", tmp_file.c_str()); *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR; *addinfo = (char *) odr_malloc(odr, 60 + tmp_file.length()); - sprintf(*addinfo, "bad format of content tmp_file: %s", + sprintf(*addinfo, "zoom: bad format of content tmp_file: %s", tmp_file.c_str()); xfree(fname); return false; @@ -987,8 +993,8 @@ bool yf::Zoom::Frontend::create_content_session(mp::Package &package, { package.log("zoom", YLOG_WARN|YLOG_ERRNO, "create %s", fname); *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR; - *addinfo = (char *) odr_malloc(odr, 40 + strlen(fname)); - sprintf(*addinfo, "Could not create %s", fname); + *addinfo = (char *) odr_malloc(odr, 50 + strlen(fname)); + sprintf(*addinfo, "zoom: could not create %s", fname); xfree(fname); return false; } @@ -1136,7 +1142,7 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( BackendPtr notfound; char *msg = (char*) odr_malloc(odr, strlen(name) + 30); *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR; - sprintf(msg, "Bad database argument: %s", name); + sprintf(msg, "zoom: bad database argument: %s", name); *addinfo = msg; return notfound; } @@ -1246,8 +1252,8 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( if (!xsp_doc) { *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR; - *addinfo = (char *) odr_malloc(odr, 40); - sprintf(*addinfo, "xmlParseMemory failed"); + *addinfo = odr_strdup(odr, "zoom: xmlParseMemory failed " + "for literalTransform XSL"); BackendPtr b; return b; } @@ -1255,7 +1261,9 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( if (!xsp) { *error = YAZ_BIB1_DATABASE_DOES_NOT_EXIST; - *addinfo = odr_strdup(odr, "xsltParseStylesheetDoc failed"); + *addinfo = + odr_strdup(odr,"zoom: xsltParseStylesheetDoc failed " + "for literalTransform XSL"); BackendPtr b; xmlFreeDoc(xsp_doc); return b; @@ -1281,7 +1289,7 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR; *addinfo = (char *) odr_malloc(odr, 40 + sptr->transform_xsl_fname.length()); - sprintf(*addinfo, "File could not be read: %s", + sprintf(*addinfo, "zoom: could not open file %s", sptr->transform_xsl_fname.c_str()); BackendPtr b; return b; @@ -1290,16 +1298,19 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( if (!xsp_doc) { *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR; - *addinfo = (char *) odr_malloc(odr, 40 + fname.length()); - sprintf(*addinfo, "xmlParseFile failed. File: %s", fname.c_str()); + *addinfo = (char *) odr_malloc(odr, 50 + fname.length()); + sprintf(*addinfo, "zoom: xmlParseFile failed for file %s", + fname.c_str()); BackendPtr b; return b; } xsp = xsltParseStylesheetDoc(xsp_doc); if (!xsp) { - *error = YAZ_BIB1_DATABASE_DOES_NOT_EXIST; - *addinfo = odr_strdup(odr, "xsltParseStylesheetDoc failed"); + *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR; + *addinfo = (char *) odr_malloc(odr, 50 + fname.length()); + sprintf(*addinfo, "zoom: xsltParseStylesheetDoc failed " + "for file %s", fname.c_str()); BackendPtr b; xmlFreeDoc(xsp_doc); return b; @@ -1321,7 +1332,7 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( if (!cqlt) { *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR; - *addinfo = odr_strdup(odr, "Missing/invalid cql2rpn file"); + *addinfo = odr_strdup(odr, "zoom: missing/invalid cql2rpn file"); BackendPtr b; xsltFreeStylesheet(xsp); return b; @@ -1340,8 +1351,7 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( if (sptr->query_encoding.length()) b->set_option("rpnCharset", sptr->query_encoding); - if (sptr->extraArgs.length()) - b->set_option("extraArgs", sptr->extraArgs); + std::string extraArgs = sptr->extraArgs; b->set_option("timeout", m_p->zoom_timeout.c_str()); @@ -1402,32 +1412,69 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( } else { - size_t found = authentication.find('/'); - - if (sptr->sru.length() && found != std::string::npos) - { - b->set_option("user", authentication.substr(0, found)); - b->set_option("password", authentication.substr(found+1)); - } + if (sptr->sru.length() == 0) + b->set_option("user", authentication); /* Z39.50 */ else - b->set_option("user", authentication); + { + std::string user; + std::string password; + std::string authtype = sptr->authenticationMode; + + { + const char *cstr = authentication.c_str(); + const char *cp1 = strchr(cstr, '/'); + if (cp1) + { + password.assign(cp1 + 1); + user.assign(cstr, cp1 - cstr); + } + else + user.assign(cstr); + } + if (authtype.compare("url") == 0) + { + /* SRU URL encoding of auth stuff */ + ODR o = odr_createmem(ODR_ENCODE); + char *path = 0; + const char *names[3]; + const char *values[3]; + + names[0] = "x-username"; + values[0] = user.c_str(); + names[1] = "x-password"; + values[1] = password.c_str(); + names[2] = 0; + values[2] = 0; + + yaz_array_to_uri(&path, o, (char **) names, (char **) values); + if (extraArgs.length()) + extraArgs.append("&"); + extraArgs.append(path); + odr_destroy(o); + } + else + { + b->set_option("user", user); + if (password.length()) + b->set_option("password", password); + } + } if (proxy.length()) b->set_option("proxy", proxy); } - std::string url; + if (extraArgs.length()) + b->set_option("extraArgs", extraArgs); + + std::string url(sptr->target); if (sptr->sru.length()) { - url = "http://" + sptr->target; b->set_option("sru", sptr->sru); - + if (url.find("://") == std::string::npos) + url = "http://" + url; if (sptr->sru_version.length()) b->set_option("sru_version", sptr->sru_version); } - else - { - url = sptr->target; - } if (no_out_args) { char *x_args = 0; @@ -2294,7 +2341,7 @@ next_proxy: if (status) { error = YAZ_BIB1_MALFORMED_QUERY; - const char *addinfo = "can not convert from RPN to CQL/SOLR"; + const char *addinfo = "can not convert from RPN to CQL/Solr"; log_diagnostic(package, error, addinfo); apdu_res = odr.create_searchResponse(apdu_req, error, addinfo); package.response() = apdu_res; @@ -2534,8 +2581,8 @@ void yf::Zoom::Frontend::auth(mp::Package &package, Z_InitRequest *req, { // something fundamental broken in lookup. *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR; - *addinfo = odr_strdup(odr, "Torus server unavailable or " - "incorrectly configured"); + *addinfo = odr_strdup(odr, "zoom: torus server unavailable or " + "incorrectly configured."); return; } const xmlNode *ptr = xmlDocGetRootElement(doc);