X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Ffilter_zoom.cpp;h=df9fc04a96c2adba99c81e6cb893070b036f7e7b;hb=00620b50effe98eed17a78fd8f26f0d9935bdad3;hp=2062b1c0ce5621b57314403680fc9fbfabef1646;hpb=f3e215cc00b02e3d92016f095295af2ba4649e2f;p=metaproxy-moved-to-github.git diff --git a/src/filter_zoom.cpp b/src/filter_zoom.cpp index 2062b1c..df9fc04 100644 --- a/src/filter_zoom.cpp +++ b/src/filter_zoom.cpp @@ -219,6 +219,7 @@ namespace metaproxy_1 { std::string torus_content_url; std::string torus_auth_url; std::string default_realm; + std::string torus_auth_hostname; std::map fieldmap; std::string xsldir; std::string file_path; @@ -778,6 +779,8 @@ void yf::Zoom::Impl::configure(const xmlNode *ptr, bool test_only, torus_auth_url = mp::xml::get_text(attr->children); else if (!strcmp((const char *) attr->name, "realm")) default_realm = mp::xml::get_text(attr->children); + else if (!strcmp((const char *) attr->name, "auth_hostname")) + torus_auth_hostname = mp::xml::get_text(attr->children); else if (!strcmp((const char *) attr->name, "xsldir")) xsldir = mp::xml::get_text(attr->children); else if (!strcmp((const char *) attr->name, "element_transform")) @@ -1257,15 +1260,17 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( sptr = it->second; else if (torus_url.length() > 0) { + std::string torus_addinfo; std::string torus_query = "udb==" + torus_db; xmlDoc *doc = mp::get_searchable(package,torus_url, torus_db, torus_query, - realm, m_p->proxy); + realm, m_p->proxy, + torus_addinfo); if (!doc) { *error = YAZ_BIB1_UNSPECIFIED_ERROR; - *addinfo = odr_strdup(odr, "Torus server unavailable or " - "incorrectly configured"); + if (torus_addinfo.length()) + *addinfo = odr_strdup(odr, torus_addinfo.c_str()); BackendPtr b; return b; } @@ -1730,8 +1735,19 @@ Z_Records *yf::Zoom::Frontend::get_records(mp::Package &package, if (!*error) { for (i = 0; i < number_to_present; i++) + { if (!recs[i]) break; + + const char *addinfo; + int sur_error = ZOOM_record_error(recs[i], 0 /* msg */, + &addinfo, 0 /* diagset */); + if (sur_error == + YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS && addinfo && + !strcmp(addinfo, + "ZOOM C generated. Present phase and no records")) + break; + } } if (i > 0) { // only return records if no error and at least one record @@ -1762,7 +1778,7 @@ Z_Records *yf::Zoom::Frontend::get_records(mp::Package &package, npl->num_records = i; npl->records = (Z_NamePlusRecord **) odr_malloc(odr, i * sizeof(*npl->records)); - for (i = 0; i < number_to_present; i++) + for (i = 0; i < npl->num_records; i++) { Z_NamePlusRecord *npr = 0; const char *addinfo; @@ -2013,10 +2029,12 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::explain_search(mp::Package &package, else if (query->which == Z_Query_type_104 && query->u.type_104->which == Z_External_CQL) { + std::string torus_addinfo; std::string torus_query(query->u.type_104->u.cql); xmlDoc *doc = mp::get_searchable(package, torus_url, "", torus_query, - realm, m_p->proxy); + realm, m_p->proxy, + torus_addinfo); if (m_p->explain_xsp) { xmlDoc *rec_res = xsltApplyStylesheet(m_p->explain_xsp, doc, 0); @@ -2027,8 +2045,8 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::explain_search(mp::Package &package, if (!doc) { *error = YAZ_BIB1_UNSPECIFIED_ERROR; - *addinfo = odr_strdup(odr, "Torus server unavailable or " - "incorrectly configured"); + if (torus_addinfo.length()) + *addinfo = odr_strdup(odr, torus_addinfo.c_str()); } else { @@ -2377,45 +2395,36 @@ next_proxy: if (b->get_option("sru")) { - int status = 0; Z_RPNQuery *zquery; zquery = p_query_rpn(odr, wrbuf_cstr(pqf_wrbuf)); - mp::wrbuf wrb; + mp::wrbuf wrb_cql; + mp::wrbuf wrb_addinfo; if (!strcmp(b->get_option("sru"), "solr")) - { - solr_transform_t cqlt = solr_transform_create(); - - status = solr_transform_rpn2solr_wrbuf(cqlt, wrb, zquery); - - solr_transform_close(cqlt); - } + error = solr_transform_rpn2solr_stream_r(b->cqlt, wrb_addinfo, + wrbuf_vp_puts, wrb_cql, + zquery); else + error = cql_transform_rpn2cql_stream_r(b->cqlt, wrb_addinfo, + wrbuf_vp_puts, wrb_cql, + zquery); + if (error) { - status = cql_transform_rpn2cql_wrbuf(b->cqlt, wrb, zquery); - } - if (status == 0) - { - ZOOM_query_cql(q, wrbuf_cstr(wrb)); - package.log("zoom", YLOG_LOG, "CQL: %s", wrbuf_cstr(wrb)); - b->search(q, &hits, &error, &addinfo, &fl, odr); - } - ZOOM_query_destroy(q); - - if (status) - { - error = YAZ_BIB1_MALFORMED_QUERY; - 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); + log_diagnostic(package, error, wrb_addinfo.c_str_null()); + apdu_res = odr.create_searchResponse(apdu_req, error, + wrb_addinfo.c_str_null()); package.response() = apdu_res; return; } + ZOOM_query_cql(q, wrb_cql.c_str()); + package.log("zoom", YLOG_LOG, "search CQL: %s", wrb_cql.c_str()); + b->search(q, &hits, &error, &addinfo, &fl, odr); + ZOOM_query_destroy(q); } else { - ZOOM_query_prefix(q, wrbuf_cstr(pqf_wrbuf)); - package.log("zoom", YLOG_LOG, "search PQF: %s", wrbuf_cstr(pqf_wrbuf)); + ZOOM_query_prefix(q, pqf_wrbuf.c_str()); + package.log("zoom", YLOG_LOG, "search PQF: %s", pqf_wrbuf.c_str()); b->search(q, &hits, &error, &addinfo, &fl, odr); ZOOM_query_destroy(q); } @@ -2634,22 +2643,31 @@ void yf::Zoom::Frontend::auth(mp::Package &package, Z_InitRequest *req, } else { - torus_query = "ip encloses/net.ipaddress \""; + torus_query = "ipRanges encloses/net.ipaddress \""; torus_query += escape_cql_term(std::string(ip)); torus_query += "\""; + + if (m_p->torus_auth_hostname.length()) + { + torus_query += " AND hostName == \""; + torus_query += escape_cql_term(m_p->torus_auth_hostname); + torus_query += "\""; + } failure_code = YAZ_BIB1_INIT_AC_BLOCKED_NETWORK_ADDRESS; } std::string dummy_db; std::string dummy_realm; + std::string torus_addinfo; xmlDoc *doc = mp::get_searchable(package, m_p->torus_auth_url, dummy_db, - torus_query, dummy_realm, m_p->proxy); + torus_query, dummy_realm, m_p->proxy, + torus_addinfo); if (!doc) { // something fundamental broken in lookup. *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR; - *addinfo = odr_strdup(odr, "zoom: torus server unavailable or " - "incorrectly configured."); + if (torus_addinfo.length()) + *addinfo = odr_strdup(odr, torus_addinfo.c_str()); return; } const xmlNode *ptr = xmlDocGetRootElement(doc);