X-Git-Url: http://sru.miketaylor.org.uk/?a=blobdiff_plain;f=src%2Ffilter_zoom.cpp;h=4948ca5aee34113bd5cb82a2023b2125444430b8;hb=1fe3038c15740cf21a2eb7b00edad8d216384c2e;hp=f2d71278fdf3c1bafda4cff013df1779b225f737;hpb=6c419dc09dae306558ec40453aa03e8cfc3db6c1;p=metaproxy-moved-to-github.git diff --git a/src/filter_zoom.cpp b/src/filter_zoom.cpp index f2d7127..4948ca5 100644 --- a/src/filter_zoom.cpp +++ b/src/filter_zoom.cpp @@ -52,6 +52,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #include #include +#include namespace mp = metaproxy_1; namespace yf = mp::filter; @@ -62,6 +63,7 @@ namespace metaproxy_1 { public: std::string authentication; std::string authenticationMode; + std::string contentAuthentication; std::string cfAuth; std::string cfProxy; std::string cfSubDB; @@ -81,6 +83,7 @@ namespace metaproxy_1 { std::string extraArgs; std::string rpn2cql_fname; std::string retry_on_failure; + std::map cf_param; bool use_turbomarc; bool piggyback; CCL_bibset ccl_bibset; @@ -91,7 +94,6 @@ namespace metaproxy_1 { class Zoom::Backend : boost::noncopyable { friend class Impl; friend class Frontend; - std::string zurl; mp::wrbuf m_apdu_wrbuf; ZOOM_connection m_connection; ZOOM_resultset m_resultset; @@ -220,6 +222,7 @@ namespace metaproxy_1 { std::string torus_searchable_url; std::string torus_content_url; std::string torus_auth_url; + std::string torus_allow_ip; std::string default_realm; std::string torus_auth_hostname; std::map fieldmap; @@ -594,6 +597,11 @@ yf::Zoom::SearchablePtr yf::Zoom::Impl::parse_torus_record(const xmlNode *ptr) s->authenticationMode = mp::xml::get_text(ptr); } else if (!strcmp((const char *) ptr->name, + "contentAuthentication")) + { + s->contentAuthentication = mp::xml::get_text(ptr); + } + else if (!strcmp((const char *) ptr->name, "cfAuth")) { s->cfAuth = mp::xml::get_text(ptr); @@ -708,6 +716,11 @@ yf::Zoom::SearchablePtr yf::Zoom::Impl::parse_torus_record(const xmlNode *ptr) { s->retry_on_failure = mp::xml::get_text(ptr); } + else if (strlen((const char *) ptr->name) > 3 && + !memcmp((const char *) ptr->name, "cf_", 3)) + { + s->cf_param[(const char *) ptr->name + 3] = mp::xml::get_text(ptr); + } } return s; } @@ -785,6 +798,8 @@ void yf::Zoom::Impl::configure(const xmlNode *ptr, bool test_only, torus_content_url = mp::xml::get_text(attr->children); else if (!strcmp((const char *) attr->name, "auth_url")) torus_auth_url = mp::xml::get_text(attr->children); + else if (!strcmp((const char *) attr->name, "allow_ip")) + torus_allow_ip = 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")) @@ -1130,8 +1145,6 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( else torus_db = database; - std::string authentication; - std::string content_authentication; std::string content_proxy; std::string realm = session_realm; if (realm.length() == 0) @@ -1151,11 +1164,11 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( if (input_args.length()) no_parms = yaz_uri_to_array(input_args.c_str(), odr, &names, &values); - // adding 10 because we'll be adding other URL args + // adding 20 because we'll be adding other URL args const char **out_names = (const char **) - odr_malloc(odr, (10 + no_parms) * sizeof(*out_names)); + odr_malloc(odr, (20 + no_parms) * sizeof(*out_names)); const char **out_values = (const char **) - odr_malloc(odr, (10 + no_parms) * sizeof(*out_values)); + odr_malloc(odr, (20 + no_parms) * sizeof(*out_values)); // may be changed if it's a content connection std::string torus_url = m_p->torus_searchable_url; @@ -1246,19 +1259,6 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( return m_backend; } - if (param_user) - { - authentication = std::string(param_user); - if (param_password) - authentication += "/" + std::string(param_password); - } - if (param_content_user) - { - content_authentication = std::string(param_content_user); - if (param_content_password) - content_authentication += "/" + std::string(param_content_password); - } - if (torus_db.compare("IR-Explain---1") == 0) return explain_search(package, database, error, addinfo, odr, torus_url, torus_db, realm); @@ -1460,8 +1460,20 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( maximumRecords > 0 */ b->set_option("piggyback", sptr->piggyback ? "1" : "0"); - if (authentication.length() == 0) - authentication = sptr->authentication; + std::string authentication = sptr->authentication; + if (param_user) + { + authentication = std::string(param_user); + if (param_password) + authentication += "/" + std::string(param_password); + } + std::string content_authentication = sptr->contentAuthentication; + if (param_content_user) + { + content_authentication = std::string(param_content_user); + if (param_content_password) + content_authentication += "/" + std::string(param_content_password); + } if (proxy.length() == 0) proxy = sptr->cfProxy; @@ -1471,7 +1483,17 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( { // A CF target b->set_option("user", sptr->cfAuth); - if (authentication.length()) + if (param_user) + { + out_names[no_out_args] = "user"; + out_values[no_out_args++] = odr_strdup(odr, param_user); + if (param_password) + { + out_names[no_out_args] = "password"; + out_values[no_out_args++] = odr_strdup(odr, param_password); + } + } + else if (authentication.length()) { size_t found = authentication.find('/'); if (found != std::string::npos) @@ -1509,6 +1531,20 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( out_names[no_out_args] = "nocproxy"; out_values[no_out_args++] = odr_strdup(odr, param_nocproxy); } + std::map::const_iterator it; + for (it = sptr->cf_param.begin(); it != sptr->cf_param.end(); it++) + { + int i; + const char *n = it->first.c_str(); + for (i = 0; i < no_out_args; i++) + if (!strcmp(n, out_names[i])) + break; + if (i == no_out_args) + { + out_names[no_out_args] = odr_strdup(odr, n); + out_values[no_out_args++] = odr_strdup(odr, it->second.c_str()); + } + } } else { @@ -2094,7 +2130,7 @@ static bool wait_conn(COMSTACK cs, int secs) struct yaz_poll_fd pfd; yaz_poll_add(pfd.input_mask, yaz_poll_except); - if (cs->io_pending && CS_WANT_WRITE) + if (cs->io_pending & CS_WANT_WRITE) yaz_poll_add(pfd.input_mask, yaz_poll_write); if (cs->io_pending & CS_WANT_READ) yaz_poll_add(pfd.input_mask, yaz_poll_read); @@ -2378,12 +2414,8 @@ next_proxy: case CCL_ERR_TRUNC_NOT_LEFT: case CCL_ERR_TRUNC_NOT_RIGHT: case CCL_ERR_TRUNC_NOT_BOTH: -#ifdef CCL_ERR_TRUNC_NOT_EMBED case CCL_ERR_TRUNC_NOT_EMBED: -#endif -#ifdef CCL_ERR_TRUNC_NOT_SINGLE case CCL_ERR_TRUNC_NOT_SINGLE: -#endif error = YAZ_BIB1_UNSUPP_SEARCH; break; } @@ -2642,13 +2674,31 @@ void yf::Zoom::Frontend::auth(mp::Package &package, Z_InitRequest *req, } Z_OtherInformation **oi = &req->otherInfo; - const char *ip = + const char *ip_cstr = yaz_oi_get_string_oid(oi, yaz_oid_userinfo_client_ip, 1, 0); - if (!ip) - ip = package.origin().get_address().c_str(); + std::string ip; + if (ip_cstr) + ip = ip_cstr; + else + ip = package.origin().get_address(); - yaz_log(YLOG_LOG, "IP=%s", ip); + yaz_log(YLOG_LOG, "IP=%s", ip.c_str()); + { + NMEM nmem = nmem_create(); + char **darray; + int i, num; + nmem_strsplit_blank(nmem, m_p->torus_allow_ip.c_str(), &darray, &num); + for (i = 0; i < num; i++) + { + yaz_log(YLOG_LOG, "check against %s+%s", darray[i], ip.c_str()); + if (yaz_match_glob(darray[i], ip.c_str())) + break; + } + nmem_destroy(nmem); + if (i < num) + return; /* allow this IP */ + } std::string torus_query; int failure_code;