381 int *error,
char **addinfo, Z_FacetList **flp,
388 WRBUF w = wrbuf_alloc();
389 yaz_facet_list_to_wrbuf(w, *flp);
400 size_t num_facets = ZOOM_resultset_facets_size(
m_resultset);
404 Z_FacetList *fl = (Z_FacetList *) odr_malloc(odr,
sizeof(*fl));
405 fl->elements = (Z_FacetField **)
406 odr_malloc(odr, num_facets *
sizeof(*fl->elements));
407 for (i = 0; i < num_facets; i++)
409 ZOOM_facet_field ff =
410 ZOOM_resultset_get_facet_field_by_index(
m_resultset, i);
413 Z_AttributeList *al = (Z_AttributeList *)
414 odr_malloc(odr,
sizeof(*al));
415 al->num_attributes = 1;
416 al->attributes = (Z_AttributeElement **)
417 odr_malloc(odr,
sizeof(*al->attributes));
418 Z_AttributeElement *ae = al->attributes[0] = (Z_AttributeElement *)
419 odr_malloc(odr,
sizeof(**al->attributes));
420 ae->attributeSet = 0;
421 ae->attributeType = odr_intdup(odr, 1);
422 ae->which = Z_AttributeValue_complex;
423 ae->value.complex = (Z_ComplexAttribute *)
424 odr_malloc(odr,
sizeof(*ae->value.complex));
425 ae->value.complex->num_list = 1;
426 ae->value.complex->list = (Z_StringOrNumeric **)
427 odr_malloc(odr,
sizeof(**ae->value.complex->list));
428 ae->value.complex->list[0] = (Z_StringOrNumeric *)
429 odr_malloc(odr,
sizeof(**ae->value.complex->list));
430 ae->value.complex->list[0]->which = Z_StringOrNumeric_string;
431 ae->value.complex->list[0]->u.string =
432 odr_strdup(odr, ZOOM_facet_field_name(ff));
433 ae->value.complex->num_semanticAction = 0;
434 ae->value.complex->semanticAction = 0;
436 int num_terms = ZOOM_facet_field_term_count(ff);
437 fl->elements[i] = (Z_FacetField *)
438 odr_malloc(odr,
sizeof(Z_FacetField));
439 fl->elements[i]->attributes = al;
440 fl->elements[i]->num_terms = num_terms;
441 fl->elements[i]->terms = (Z_FacetTerm **)
442 odr_malloc(odr, num_terms *
sizeof(Z_FacetTerm *));
444 for (j = 0; j < num_terms; j++)
447 const char *a_term = ZOOM_facet_field_get_term(ff, j, &freq);
448 Z_FacetTerm *ft = (Z_FacetTerm *) odr_malloc(odr,
sizeof(*ft));
449 ft->term = z_Term_create(odr, Z_Term_general, a_term,
451 ft->count = odr_intdup(odr, freq);
453 fl->elements[i]->terms[j] = ft;
583 for (ptr = ptr->children; ptr; ptr = ptr->next)
585 if (ptr->type != XML_ELEMENT_NODE)
587 if (!strcmp((
const char *) ptr->name,
"layer"))
589 else if (!strcmp((
const char *) ptr->name,
592 s->authentication = mp::xml::get_text(ptr);
594 else if (!strcmp((
const char *) ptr->name,
595 "authenticationMode"))
597 s->authenticationMode = mp::xml::get_text(ptr);
599 else if (!strcmp((
const char *) ptr->name,
600 "contentAuthentication"))
602 s->contentAuthentication = mp::xml::get_text(ptr);
604 else if (!strcmp((
const char *) ptr->name,
607 s->cfAuth = mp::xml::get_text(ptr);
609 else if (!strcmp((
const char *) ptr->name,
612 s->cfProxy = mp::xml::get_text(ptr);
614 else if (!strcmp((
const char *) ptr->name,
617 s->cfSubDB = mp::xml::get_text(ptr);
619 else if (!strcmp((
const char *) ptr->name,
622 s->contentConnector = mp::xml::get_text(ptr);
624 else if (!strcmp((
const char *) ptr->name,
"udb"))
626 s->udb = mp::xml::get_text(ptr);
628 else if (!strcmp((
const char *) ptr->name,
"zurl"))
630 s->target = mp::xml::get_text(ptr);
632 else if (!strcmp((
const char *) ptr->name,
"sru"))
634 s->sru = mp::xml::get_text(ptr);
636 else if (!strcmp((
const char *) ptr->name,
"SRUVersion") ||
637 !strcmp((
const char *) ptr->name,
"sruVersion"))
639 s->sru_version = mp::xml::get_text(ptr);
641 else if (!strcmp((
const char *) ptr->name,
644 s->query_encoding = mp::xml::get_text(ptr);
646 else if (!strcmp((
const char *) ptr->name,
649 s->piggyback = mp::xml::get_bool(ptr,
true);
651 else if (!strcmp((
const char *) ptr->name,
654 s->request_syntax = mp::xml::get_text(ptr);
656 else if (!strcmp((
const char *) ptr->name,
659 s->element_set = mp::xml::get_text(ptr);
661 else if (!strcmp((
const char *) ptr->name,
664 s->record_encoding = mp::xml::get_text(ptr);
666 else if (!strcmp((
const char *) ptr->name,
669 s->transform_xsl_fname = mp::xml::get_text(ptr);
671 else if (!strcmp((
const char *) ptr->name,
674 s->transform_xsl_content = mp::xml::get_text(ptr);
676 else if (!strcmp((
const char *) ptr->name,
679 s->urlRecipe = mp::xml::get_text(ptr);
681 else if (!strcmp((
const char *) ptr->name,
686 else if (!strncmp((
const char *) ptr->name,
689 std::string value = mp::xml::get_text(ptr);
690 if (value.length() > 0)
692 ccl_qual_fitem(s->ccl_bibset, value.c_str(),
693 (
const char *) ptr->name + 7);
696 else if (!strncmp((
const char *) ptr->name,
699 std::string value = mp::xml::get_text(ptr);
700 s->sortmap[(
const char *) ptr->name + 8] = value;
702 else if (!strcmp((
const char *) ptr->name,
705 s->sortStrategy = mp::xml::get_text(ptr);
707 else if (!strcmp((
const char *) ptr->name,
710 s->extraArgs = mp::xml::get_text(ptr);
712 else if (!strcmp((
const char *) ptr->name,
"rpn2cql"))
713 s->rpn2cql_fname = mp::xml::get_text(ptr);
714 else if (!strcmp((
const char *) ptr->name,
717 s->retry_on_failure = mp::xml::get_text(ptr);
719 else if (!strcmp((
const char *) ptr->name,
"noCproxy"))
721 s->no_cproxy = mp::xml::get_text(ptr);
723 else if (strlen((
const char *) ptr->name) > 3 &&
724 !memcmp((
const char *) ptr->name,
"cf_", 3))
726 s->cf_param[(
const char *) ptr->name + 3] = mp::xml::get_text(ptr);
783 std::string explain_xslt_fname;
784 std::string record_xslt_fname;
790 for (ptr = ptr->children; ptr; ptr = ptr->next)
792 if (ptr->type != XML_ELEMENT_NODE)
794 else if (!strcmp((
const char *) ptr->name,
"torus"))
796 const struct _xmlAttr *attr;
797 for (attr = ptr->properties; attr; attr = attr->next)
799 if (!strcmp((
const char *) attr->name,
"url"))
801 else if (!strcmp((
const char *) attr->name,
"content_url"))
803 else if (!strcmp((
const char *) attr->name,
"auth_url"))
805 else if (!strcmp((
const char *) attr->name,
"allow_ip"))
807 else if (!strcmp((
const char *) attr->name,
"realm"))
809 else if (!strcmp((
const char *) attr->name,
"auth_hostname"))
811 else if (!strcmp((
const char *) attr->name,
"xsldir"))
812 xsldir = mp::xml::get_text(attr->children);
813 else if (!strcmp((
const char *) attr->name,
"element_transform"))
815 else if (!strcmp((
const char *) attr->name,
"element_raw"))
817 else if (!strcmp((
const char *) attr->name,
"element_marcxml"))
819 else if (!strcmp((
const char *) attr->name,
"element_passthru"))
821 else if (!strcmp((
const char *) attr->name,
"proxy"))
822 proxy = mp::xml::get_text(attr->children);
823 else if (!strcmp((
const char *) attr->name,
"explain_xsl"))
824 explain_xslt_fname = mp::xml::get_text(attr->children);
825 else if (!strcmp((
const char *) attr->name,
"record_xsl"))
826 record_xslt_fname = mp::xml::get_text(attr->children);
828 throw mp::filter::FilterException(
829 "Bad attribute " + std::string((
const char *)
838 else if (!strcmp((
const char *) ptr->name,
"cclmap"))
840 const char *addinfo = 0;
841 ccl_xml_config(
bibset, ptr, &addinfo);
843 else if (!strcmp((
const char *) ptr->name,
"fieldmap"))
845 const struct _xmlAttr *attr;
846 std::string ccl_field;
847 std::string cql_field;
848 for (attr = ptr->properties; attr; attr = attr->next)
850 if (!strcmp((
const char *) attr->name,
"ccl"))
851 ccl_field = mp::xml::get_text(attr->children);
852 else if (!strcmp((
const char *) attr->name,
"cql"))
853 cql_field = mp::xml::get_text(attr->children);
855 throw mp::filter::FilterException(
856 "Bad attribute " + std::string((
const char *)
859 if (cql_field.length())
862 else if (!strcmp((
const char *) ptr->name,
"contentProxy"))
864 const struct _xmlAttr *attr;
865 for (attr = ptr->properties; attr; attr = attr->next)
867 if (!strcmp((
const char *) attr->name,
"server"))
870 "contentProxy's server attribute is deprecated");
872 "Specify config_file instead. For example:");
874 " content_file=\"/etc/cf-proxy/cproxy.cfg\"");
877 else if (!strcmp((
const char *) attr->name,
"tmp_file"))
879 else if (!strcmp((
const char *) attr->name,
"config_file"))
882 throw mp::filter::FilterException(
883 "Bad attribute " + std::string((
const char *)
887 else if (!strcmp((
const char *) ptr->name,
"log"))
889 const struct _xmlAttr *attr;
890 for (attr = ptr->properties; attr; attr = attr->next)
892 if (!strcmp((
const char *) attr->name,
"apdu"))
893 apdu_log = mp::xml::get_bool(attr->children,
false);
895 throw mp::filter::FilterException(
896 "Bad attribute " + std::string((
const char *)
900 else if (!strcmp((
const char *) ptr->name,
"zoom"))
902 const struct _xmlAttr *attr;
903 for (attr = ptr->properties; attr; attr = attr->next)
905 if (!strcmp((
const char *) attr->name,
"timeout"))
907 else if (!strcmp((
const char *) attr->name,
"proxy_timeout"))
910 throw mp::filter::FilterException(
911 "Bad attribute " + std::string((
const char *)
917 throw mp::filter::FilterException
919 + std::string((
const char *) ptr->name)
920 +
" in zoom filter");
924 if (explain_xslt_fname.length())
926 const char *path = 0;
934 char *fname = yaz_filepath_resolve(explain_xslt_fname.c_str(),
938 throw mp::filter::FilterException
939 (
"Cannot read XSLT " + explain_xslt_fname);
942 xmlDoc *xsp_doc = xmlParseFile(fname);
945 throw mp::filter::FilterException
946 (
"Cannot parse XSLT " + explain_xslt_fname);
953 throw mp::filter::FilterException
954 (
"Cannot parse XSLT " + explain_xslt_fname);
959 if (record_xslt_fname.length())
961 const char *path = 0;
969 char *fname = yaz_filepath_resolve(record_xslt_fname.c_str(),
973 throw mp::filter::FilterException
974 (
"Cannot read XSLT " + record_xslt_fname);
977 xmlDoc *xsp_doc = xmlParseFile(fname);
980 throw mp::filter::FilterException
981 (
"Cannot parse XSLT " + record_xslt_fname);
988 throw mp::filter::FilterException
989 (
"Cannot parse XSLT " + record_xslt_fname);
997 int *error,
char **addinfo,
999 std::string authentication,
1003 if (b->sptr->contentConnector.length())
1005 std::string proxyhostname;
1006 std::string tmp_file;
1007 bool legacy_format =
false;
1009 if (
m_p->content_proxy_server.length())
1011 proxyhostname =
m_p->content_proxy_server;
1012 legacy_format =
true;
1015 if (
m_p->content_tmp_file.length())
1016 tmp_file =
m_p->content_tmp_file;
1018 if (
m_p->content_config_file.length())
1020 FILE *inf = fopen(
m_p->content_config_file.c_str(),
"r");
1024 while (fgets(buf,
sizeof(buf)-1, inf))
1027 cp = strchr(buf,
'#');
1030 cp = strchr(buf,
'\n');
1033 cp = strchr(buf,
':');
1037 while (cp1 != buf && cp1[-1] ==
' ')
1043 if (!strcmp(buf,
"proxyhostname"))
1045 if (!strcmp(buf,
"sessiondir") && *cp)
1047 if (cp[strlen(cp)-1] ==
'/')
1048 cp[strlen(cp)-1] =
'\0';
1049 tmp_file = std::string(cp) + std::string(
"/cf.XXXXXX.p");
1057 package.log(
"zoom", YLOG_WARN|YLOG_ERRNO,
1058 "unable to open content config %s",
1059 m_p->content_config_file.c_str());
1060 *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR;
1061 size_t sz = 70 +
m_p->content_config_file.length();
1062 *addinfo = (
char *) odr_malloc(odr, sz);
1063 snprintf(*addinfo, sz,
"zoom: unable to open content config %s",
1064 m_p->content_config_file.c_str());
1069 if (proxyhostname.length() == 0)
1071 package.log(
"zoom", YLOG_WARN,
"no proxyhostname");
1074 if (tmp_file.length() == 0)
1076 package.log(
"zoom", YLOG_WARN,
"no tmp_file");
1080 char *fname = xstrdup(tmp_file.c_str());
1081 char *xx = strstr(fname,
"XXXXXX");
1084 package.log(
"zoom", YLOG_WARN,
"bad tmp_file %s", tmp_file.c_str());
1085 *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR;
1086 size_t sz = 60 + tmp_file.length();
1087 *addinfo = (
char *) odr_malloc(odr, sz);
1088 snprintf(*addinfo, sz,
"zoom: bad format of content tmp_file: %s",
1093 char tmp_char = xx[6];
1094 snprintf(xx, 7,
"%06u", ((
unsigned) rand()) % 1000000);
1096 b->cproxy_host = std::string(xx) +
"." + proxyhostname;
1098 b->cproxy_host = proxyhostname +
"/" + xx;
1101 FILE *file = fopen(fname,
"w");
1104 package.log(
"zoom", YLOG_WARN|YLOG_ERRNO,
"create %s", fname);
1105 *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR;
1106 size_t sz = 50 + strlen(fname);
1107 *addinfo = (
char *) odr_malloc(odr, sz);
1108 snprintf(*addinfo, sz,
"zoom: could not create %s", fname);
1113 wrbuf_puts(w,
"#content_proxy\n");
1114 wrbuf_printf(w,
"connector: %s\n", b->sptr->contentConnector.c_str());
1115 if (authentication.length())
1116 wrbuf_printf(w,
"auth: %s\n", authentication.c_str());
1118 wrbuf_printf(w,
"proxy: %s\n", proxy.c_str());
1120 wrbuf_printf(w,
"realm: %s\n", realm.c_str());
1122 fwrite(w.buf(), 1, w.len(), file);
1124 package.log(
"zoom", YLOG_LOG,
"content file: %s", fname);
1131 mp::Package &package,
1132 std::string &database,
int *error,
char **addinfo, mp::odr &odr,
1135 bool connection_reuse =
false;
1138 std::list<BackendPtr>::const_iterator map_it;
1140 m_backend->m_frontend_database == database)
1142 connection_reuse =
true;
1146 std::string input_args;
1147 std::string torus_db;
1148 size_t db_arg_pos = database.find(
',');
1149 if (db_arg_pos != std::string::npos)
1151 torus_db = database.substr(0, db_arg_pos);
1152 input_args = database.substr(db_arg_pos + 1);
1155 torus_db = database;
1157 std::string content_proxy;
1159 if (realm.length() == 0)
1160 realm =
m_p->default_realm;
1162 const char *param_user = 0;
1163 const char *param_password = 0;
1164 const char *param_content_user = 0;
1165 const char *param_content_password = 0;
1166 const char *param_nocproxy = 0;
1167 const char *param_retry = 0;
1172 int no_out_args = 0;
1173 if (input_args.length())
1174 no_parms = yaz_uri_to_array(input_args.c_str(),
1175 odr, &names, &values);
1177 const char **out_names = (
const char **)
1178 odr_malloc(odr, (20 + no_parms) *
sizeof(*out_names));
1179 const char **out_values = (
const char **)
1180 odr_malloc(odr, (20 + no_parms) *
sizeof(*out_values));
1183 std::string torus_url =
m_p->torus_searchable_url;
1185 for (i = 0; i < no_parms; i++)
1187 const char *name = names[i];
1188 const char *value = values[i];
1191 if (!strcmp(name,
"user"))
1193 else if (!strcmp(name,
"password"))
1194 param_password = value;
1195 else if (!strcmp(name,
"content-user"))
1196 param_content_user = value;
1197 else if (!strcmp(name,
"content-password"))
1198 param_content_password = value;
1199 else if (!strcmp(name,
"content-proxy"))
1200 content_proxy = value;
1201 else if (!strcmp(name,
"nocproxy"))
1202 param_nocproxy = value;
1203 else if (!strcmp(name,
"retry"))
1204 param_retry = value;
1205 else if (!strcmp(name,
"proxy"))
1209 nmem_strsplit(((ODR) odr)->mem,
",", value, &dstr, &dnum);
1210 if (connection_reuse)
1214 for (i = 0; i < dnum; i++)
1215 if (!strcmp(proxy.c_str(), dstr[i]))
1220 *proxy_step = i + 1;
1225 if (*proxy_step >= dnum)
1229 proxy = dstr[*proxy_step];
1232 if (*proxy_step == dnum)
1237 else if (!strcmp(name,
"cproxysession"))
1239 out_names[no_out_args] = name;
1240 out_values[no_out_args++] = value;
1241 torus_url =
m_p->torus_content_url;
1243 else if (!strcmp(name,
"realm") &&
session_realm.length() == 0)
1245 else if (!strcmp(name,
"torus_url") &&
session_realm.length() == 0)
1247 else if (name[0] ==
'x' && name[1] ==
'-')
1249 out_names[no_out_args] = name;
1250 out_values[no_out_args++] = value;
1255 size_t sz = 40 + strlen(name);
1256 *addinfo = (
char*) odr_malloc(odr, sz);
1257 *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR;
1258 snprintf(*addinfo, sz,
"zoom: bad database argument: %s", name);
1263 package.log(
"zoom", YLOG_LOG,
"proxy: %s", proxy.c_str());
1265 if (connection_reuse)
1267 m_backend->connect(
"", error, addinfo, odr);
1271 if (torus_db.compare(
"IR-Explain---1") == 0)
1272 return explain_search(package, database, error, addinfo, odr, torus_url,
1277 std::map<std::string,SearchablePtr>::iterator it;
1278 it =
m_p->s_map.find(torus_db);
1279 if (it !=
m_p->s_map.end())
1281 else if (torus_url.length() > 0)
1283 std::string torus_addinfo;
1284 std::string torus_query =
"udb==" + torus_db;
1291 *error = YAZ_BIB1_UNSPECIFIED_ERROR;
1292 if (torus_addinfo.length())
1293 *addinfo = odr_strdup(odr, torus_addinfo.c_str());
1297 const xmlNode *ptr = xmlDocGetRootElement(doc);
1298 if (ptr && ptr->type == XML_ELEMENT_NODE)
1300 if (!strcmp((
const char *) ptr->name,
"record"))
1302 sptr =
m_p->parse_torus_record(ptr);
1304 else if (!strcmp((
const char *) ptr->name,
"records"))
1306 for (ptr = ptr->children; ptr; ptr = ptr->next)
1308 if (ptr->type == XML_ELEMENT_NODE
1309 && !strcmp((
const char *) ptr->name,
"record"))
1313 *error = YAZ_BIB1_UNSPECIFIED_ERROR;
1314 size_t sz = 40 + database.length();
1315 *addinfo = (
char*) odr_malloc(odr, sz);
1316 snprintf(*addinfo, sz,
"multiple records for udb=%s",
1322 sptr =
m_p->parse_torus_record(ptr);
1328 *error = YAZ_BIB1_UNSPECIFIED_ERROR;
1329 size_t sz = 40 + strlen((
const char *) ptr->name);
1330 *addinfo = (
char*) odr_malloc(odr, sz);
1331 snprintf(*addinfo, sz,
"bad root element for torus: %s", ptr->name);
1342 *error = YAZ_BIB1_DATABASE_DOES_NOT_EXIST;
1343 *addinfo = odr_strdup(odr, torus_db.c_str());
1348 xsltStylesheetPtr xsp = 0;
1349 if (sptr->transform_xsl_content.length())
1351 xmlDoc *xsp_doc = xmlParseMemory(sptr->transform_xsl_content.c_str(),
1352 sptr->transform_xsl_content.length());
1355 *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR;
1356 *addinfo = odr_strdup(odr,
"zoom: xmlParseMemory failed "
1357 "for literalTransform XSL");
1361 xsp = xsltParseStylesheetDoc(xsp_doc);
1364 *error = YAZ_BIB1_DATABASE_DOES_NOT_EXIST;
1366 odr_strdup(odr,
"zoom: xsltParseStylesheetDoc failed "
1367 "for literalTransform XSL");
1369 xmlFreeDoc(xsp_doc);
1373 else if (sptr->transform_xsl_fname.length())
1375 const char *path = 0;
1377 if (
m_p->xsldir.length())
1378 path =
m_p->xsldir.c_str();
1380 path =
m_p->file_path.c_str();
1382 char fullpath[1024];
1383 char *fname = yaz_filepath_resolve(sptr->transform_xsl_fname.c_str(),
1387 *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR;
1388 size_t sz = 50 + sptr->transform_xsl_fname.length();
1389 *addinfo = (
char *) odr_malloc(odr, sz);
1390 snprintf(*addinfo, sz,
"zoom: could not open file %s",
1391 sptr->transform_xsl_fname.c_str());
1395 xmlDoc *xsp_doc = xmlParseFile(fname);
1398 *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR;
1399 size_t sz = 50 + strlen(fname);
1400 *addinfo = (
char *) odr_malloc(odr, sz);
1401 snprintf(*addinfo, sz,
1402 "zoom: xmlParseFile failed for file %s",
1407 xsp = xsltParseStylesheetDoc(xsp_doc);
1410 *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR;
1411 size_t sz = 50 + strlen(fname);
1412 *addinfo = (
char *) odr_malloc(odr, sz);
1413 snprintf(*addinfo, sz,
1414 "zoom: xsltParseStylesheetDoc failed for file %s",
1417 xmlFreeDoc(xsp_doc);
1422 cql_transform_t cqlt = 0;
1423 if (sptr->rpn2cql_fname.length())
1425 char fullpath[1024];
1426 char *fname = yaz_filepath_resolve(sptr->rpn2cql_fname.c_str(),
1427 m_p->file_path.c_str(), 0, fullpath);
1429 cqlt = cql_transform_open_fname(fullpath);
1432 cqlt = cql_transform_create();
1436 *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR;
1437 *addinfo = odr_strdup(odr,
"zoom: missing/invalid cql2rpn file");
1439 xsltFreeStylesheet(xsp);
1450 b->m_frontend_database = database;
1452 if (!param_nocproxy)
1454 if (sptr->no_cproxy.compare(
"1") == 0)
1455 param_nocproxy =
"1";
1457 b->enable_cproxy = param_nocproxy ? false :
true;
1460 b->retry_on_failure = param_retry;
1462 b->retry_on_failure = b->sptr->retry_on_failure;
1464 if (sptr->query_encoding.length())
1465 b->set_option(
"rpnCharset", sptr->query_encoding);
1467 std::string extraArgs = sptr->extraArgs;
1469 b->set_option(
"timeout",
m_p->zoom_timeout.c_str());
1472 b->set_option(
"apdulog",
"1");
1474 if (sptr->piggyback && sptr->sru.length())
1475 b->set_option(
"count",
"1");
1477 b->set_option(
"piggyback", sptr->piggyback ?
"1" :
"0");
1479 std::string authentication = sptr->authentication;
1482 authentication = std::string(param_user);
1484 authentication +=
"/" + std::string(param_password);
1486 std::string content_authentication = sptr->contentAuthentication;
1487 if (param_content_user)
1489 content_authentication = std::string(param_content_user);
1490 if (param_content_password)
1491 content_authentication +=
"/" + std::string(param_content_password);
1494 if (proxy.length() == 0)
1495 proxy = sptr->cfProxy;
1498 if (sptr->cfAuth.length())
1501 b->set_option(
"user", sptr->cfAuth);
1504 out_names[no_out_args] =
"user";
1505 out_values[no_out_args++] = odr_strdup(odr, param_user);
1508 out_names[no_out_args] =
"password";
1509 out_values[no_out_args++] = odr_strdup(odr, param_password);
1512 else if (authentication.length())
1514 size_t found = authentication.find(
'/');
1515 if (found != std::string::npos)
1517 out_names[no_out_args] =
"user";
1518 out_values[no_out_args++] =
1519 odr_strdup(odr, authentication.substr(0, found).c_str());
1521 out_names[no_out_args] =
"password";
1522 out_values[no_out_args++] =
1523 odr_strdup(odr, authentication.substr(found+1).c_str());
1527 out_names[no_out_args] =
"user";
1528 out_values[no_out_args++] =
1529 odr_strdup(odr, authentication.c_str());
1534 out_names[no_out_args] =
"proxy";
1535 out_values[no_out_args++] = odr_strdup(odr, proxy.c_str());
1537 if (sptr->cfSubDB.length())
1539 out_names[no_out_args] =
"subdatabase";
1540 out_values[no_out_args++] = odr_strdup(odr, sptr->cfSubDB.c_str());
1542 if (!param_nocproxy && b->sptr->contentConnector.length())
1543 param_nocproxy =
"1";
1547 out_names[no_out_args] =
"nocproxy";
1548 out_values[no_out_args++] = odr_strdup(odr, param_nocproxy);
1550 std::map<std::string,std::string>::const_iterator it;
1551 for (it = sptr->cf_param.begin(); it != sptr->cf_param.end(); it++)
1554 const char *n = it->first.c_str();
1555 for (i = 0; i < no_out_args; i++)
1556 if (!strcmp(n, out_names[i]))
1558 if (i == no_out_args)
1560 out_names[no_out_args] = odr_strdup(odr, n);
1561 out_values[no_out_args++] = odr_strdup(odr, it->second.c_str());
1567 const char *
auth = authentication.c_str();
1568 const char *cp1 = strchr(
auth,
' ');
1569 if (!cp1 && sptr->sru.length())
1570 cp1 = strchr(
auth,
'/');
1574 b->set_option(
"user",
auth);
1579 const char *cp2 = strchr(cp1 + 1,
' ');
1581 b->set_option(
"user",
auth, cp1 -
auth);
1583 b->set_option(
"password", cp1 + 1);
1586 b->set_option(
"group", cp1 + 1, cp2 - cp1 - 1);
1587 b->set_option(
"password", cp2 + 1);
1590 if (sptr->authenticationMode.length())
1591 b->set_option(
"authenticationMode", sptr->authenticationMode);
1593 b->set_option(
"proxy", proxy);
1595 if (extraArgs.length())
1596 b->set_option(
"extraArgs", extraArgs);
1598 std::string url(sptr->target);
1599 if (sptr->sru.length())
1601 b->set_option(
"sru", sptr->sru);
1602 if (url.find(
"://") == std::string::npos)
1603 url =
"http://" + url;
1604 if (sptr->sru_version.length())
1605 b->set_option(
"sru_version", sptr->sru_version);
1610 out_names[no_out_args] = 0;
1612 yaz_array_to_uri(&x_args, odr, (
char **) out_names,
1613 (
char **) out_values);
1614 url +=
"," + std::string(x_args);
1616 package.log(
"zoom", YLOG_LOG,
"url: %s", url.c_str());
1617 b->connect(url, error, addinfo, odr);
1618 if (*error == 0 && b->enable_cproxy)
1620 content_authentication.length() ?
1621 content_authentication : authentication,
1622 content_proxy.length() ? content_proxy : proxy,
1727 mp::Package &package,
1729 Odr_int number_to_present,
1732 Odr_int *number_of_records_returned,
1735 Odr_oid *preferredRecordSyntax,
1736 const char *element_set_name)
1739 Z_Records *records = 0;
1741 if (!b->explain_doc)
1745 if (number_to_present > 10000)
1746 number_to_present = 10000;
1748 xmlNode *ptr = xmlDocGetRootElement(b->explain_doc);
1750 Z_NamePlusRecordList *npl = (Z_NamePlusRecordList *)
1751 odr_malloc(odr,
sizeof(*npl));
1752 npl->records = (Z_NamePlusRecord **)
1753 odr_malloc(odr, number_to_present *
sizeof(*npl->records));
1755 for (i = 0; i < number_to_present; i++)
1761 xmlBufferPtr xml_buf = xmlBufferCreate();
1762 xmlNode *tmp_node = xmlCopyNode(res->children, 1);
1763 xmlNodeDump(xml_buf, tmp_node->doc, tmp_node, 0, 0);
1765 Z_NamePlusRecord *npr =
1766 (Z_NamePlusRecord *) odr_malloc(odr,
sizeof(*npr));
1767 npr->databaseName = odr_strdup(odr, b->m_frontend_database.c_str());
1768 npr->which = Z_NamePlusRecord_databaseRecord;
1769 npr->u.databaseRecord =
1770 z_ext_record_xml(odr,
1771 (
const char *) xmlBufferContent(xml_buf),
1772 xmlBufferLength(xml_buf));
1773 npl->records[i] = npr;
1774 xmlFreeNode(tmp_node);
1775 xmlBufferFree(xml_buf);
1777 records = (Z_Records*) odr_malloc(odr,
sizeof(*records));
1778 records->which = Z_Records_DBOSD;
1779 records->u.databaseOrSurDiagnostics = npl;
1781 npl->num_records = i;
1782 *number_of_records_returned = i;
1789 Odr_int number_to_present,
1792 Odr_int *number_of_records_returned,
1795 Odr_oid *preferredRecordSyntax,
1796 const char *element_set_name)
1798 *number_of_records_returned = 0;
1799 Z_Records *records = 0;
1800 bool enable_pz2_retrieval =
false;
1801 bool enable_pz2_transform =
false;
1802 bool assume_marc8_charset =
false;
1803 bool enable_record_transform =
false;
1804 bool use_turbomarc =
false;
1808 enable_pz2_retrieval,
1809 enable_pz2_transform,
1810 enable_record_transform,
1811 assume_marc8_charset,
1814 package.log(
"zoom", YLOG_LOG,
"pz2_retrieval: %s . pz2_transform: %s",
1815 enable_pz2_retrieval ?
"yes" :
"no",
1816 enable_pz2_transform ?
"yes" :
"no");
1818 if (start < 0 || number_to_present <=0)
1821 if (number_to_present > 10000)
1822 number_to_present = 10000;
1824 ZOOM_record *recs = (ZOOM_record *)
1825 odr_malloc(odr, (
size_t) number_to_present *
sizeof(*recs));
1827 b->present(start, number_to_present, recs, error, addinfo, odr);
1832 for (i = 0; i < number_to_present; i++)
1837 const char *addinfo;
1838 int sur_error = ZOOM_record_error(recs[i], 0 ,
1841 YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS && addinfo &&
1843 "ZOOM C generated. Present phase and no records"))
1850 const char *xsl_parms[3];
1851 mp::wrbuf cproxy_host;
1853 if (b->enable_cproxy && b->cproxy_host.length())
1855 wrbuf_puts(cproxy_host,
"\"");
1856 wrbuf_puts(cproxy_host, b->cproxy_host.c_str());
1857 wrbuf_puts(cproxy_host,
"/\"");
1859 xsl_parms[0] =
"cproxyhost";
1860 xsl_parms[1] = wrbuf_cstr(cproxy_host);
1868 char *odr_database = odr_strdup(odr,
1869 b->m_frontend_database.c_str());
1870 Z_NamePlusRecordList *npl = (Z_NamePlusRecordList *)
1871 odr_malloc(odr,
sizeof(*npl));
1872 *number_of_records_returned = i;
1873 npl->num_records = i;
1874 npl->records = (Z_NamePlusRecord **)
1875 odr_malloc(odr, i *
sizeof(*npl->records));
1876 for (i = 0; i < npl->num_records; i++)
1878 Z_NamePlusRecord *npr = 0;
1879 const char *addinfo;
1881 int sur_error = ZOOM_record_error(recs[i], 0 ,
1887 npr = zget_surrogateDiagRec(odr, odr_database, sur_error,
1890 else if (enable_pz2_retrieval)
1892 char rec_type_str[100];
1893 const char *record_encoding = 0;
1895 if (b->sptr->record_encoding.length())
1896 record_encoding = b->sptr->record_encoding.c_str();
1897 else if (assume_marc8_charset)
1898 record_encoding =
"marc8";
1900 strcpy(rec_type_str, use_turbomarc ?
"txml" :
"xml");
1901 if (record_encoding)
1903 strcat(rec_type_str,
"; charset=");
1904 strcat(rec_type_str, record_encoding);
1907 package.log(
"zoom", YLOG_LOG,
"Getting record of type %s",
1910 xmlChar *xmlrec_buf = 0;
1911 const char *rec_buf = ZOOM_record_get(recs[i], rec_type_str,
1913 if (!rec_buf && !npr)
1915 std::string addinfo(
"ZOOM_record_get failed for type ");
1917 int error = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
1918 addinfo += rec_type_str;
1920 npr = zget_surrogateDiagRec(odr, odr_database,
1921 error, addinfo.c_str());
1925 package.log_write(rec_buf, rec_len);
1926 package.log_write(
"\r\n", 2);
1929 if (rec_buf && b->xsp && enable_pz2_transform)
1931 xmlDoc *rec_doc = xmlParseMemory(rec_buf, rec_len);
1934 const char *addinfo =
"xml parse failed for record";
1935 int error = YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
1937 npr = zget_surrogateDiagRec(
1938 odr, odr_database, error, addinfo);
1943 xsltStylesheetPtr xsp = b->xsp;
1944 xmlDoc *rec_res = xsltApplyStylesheet(xsp, rec_doc,
1950 mp::xml::url_recipe_handle(rec_res,
1951 b->sptr->urlRecipe);
1954 xmlNode *ptr = xmlDocGetRootElement(rec_res);
1955 while (ptr && ptr->type != XML_ELEMENT_NODE)
1958 xmlNewChild(ptr, 0, BAD_CAST
"metadata", 0);
1959 xmlNewProp(c, BAD_CAST
"type", BAD_CAST
1961 xmlNode * t = xmlNewText(BAD_CAST res.c_str());
1966 if (rec_res &&
m_p->record_xsp &&
1967 enable_record_transform)
1969 xmlDoc *tmp_doc = rec_res;
1971 xsp =
m_p->record_xsp;
1972 rec_res = xsltApplyStylesheet(xsp, tmp_doc,
1974 xmlFreeDoc(tmp_doc);
1979 xsltSaveResultToString(&xmlrec_buf, &rec_len,
1981 rec_buf = (
const char *) xmlrec_buf;
1982 package.log_write(rec_buf, rec_len);
1984 xmlFreeDoc(rec_res);
1988 std::string addinfo;
1990 YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS;
1992 addinfo =
"xslt apply failed for "
1993 + b->sptr->transform_xsl_fname;
1995 npr = zget_surrogateDiagRec(
1996 odr, odr_database, error, addinfo.c_str());
1998 xmlFreeDoc(rec_doc);
2005 npr = zget_surrogateDiagRec(
2007 YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS,
2011 npr = (Z_NamePlusRecord *)
2012 odr_malloc(odr,
sizeof(*npr));
2013 npr->databaseName = odr_database;
2014 npr->which = Z_NamePlusRecord_databaseRecord;
2015 npr->u.databaseRecord =
2016 z_ext_record_xml(odr, rec_buf, rec_len);
2020 xmlFree(xmlrec_buf);
2025 (Z_External *) ZOOM_record_get(recs[i],
"ext", 0);
2028 npr = (Z_NamePlusRecord *) odr_malloc(odr,
sizeof(*npr));
2029 npr->databaseName = odr_database;
2030 npr->which = Z_NamePlusRecord_databaseRecord;
2031 npr->u.databaseRecord = ext;
2035 npr = zget_surrogateDiagRec(
2037 YAZ_BIB1_SYSTEM_ERROR_IN_PRESENTING_RECORDS,
2038 "ZOOM_record, type ext");
2041 npl->records[i] = npr;
2043 records = (Z_Records*) odr_malloc(odr,
sizeof(*records));
2044 records->which = Z_Records_DBOSD;
2045 records->u.databaseOrSurDiagnostics = npl;
2265 Z_GDU *
gdu = package.request().get();
2266 Z_APDU *apdu_req =
gdu->u.z3950;
2267 Z_APDU *apdu_res = 0;
2269 Z_SearchRequest *sr = apdu_req->u.searchRequest;
2270 if (sr->num_databaseNames != 1)
2272 int error = YAZ_BIB1_TOO_MANY_DATABASES_SPECIFIED;
2274 apdu_res = odr.create_searchResponse(apdu_req, error, 0);
2275 package.response() = apdu_res;
2279 int same_retries = 0;
2280 int proxy_retries = 0;
2286 std::string db(sr->databaseNames[0]);
2289 &addinfo, odr, &proxy_step);
2292 if (
retry(package, odr, b, error, &addinfo, proxy_step,
2293 same_retries, proxy_retries))
2299 apdu_res = odr.create_searchResponse(apdu_req, error, addinfo);
2300 package.response() = apdu_res;
2303 if (!b || b->enable_explain)
2306 b->set_option(
"setname",
"default");
2308 bool enable_pz2_retrieval =
false;
2309 bool enable_pz2_transform =
false;
2310 bool enable_record_transform =
false;
2311 bool assume_marc8_charset =
false;
2312 bool use_turbomarc =
false;
2314 enable_pz2_retrieval,
2315 enable_pz2_transform,
2316 enable_record_transform,
2317 assume_marc8_charset,
2321 Z_Query *query = sr->query;
2322 mp::wrbuf ccl_wrbuf;
2323 mp::wrbuf pqf_wrbuf;
2324 std::string sortkeys;
2326 if (query->which == Z_Query_type_1 || query->which == Z_Query_type_101)
2329 yaz_rpnquery_to_wrbuf(pqf_wrbuf, query->u.type_1);
2331 else if (query->which == Z_Query_type_2)
2334 wrbuf_write(ccl_wrbuf, (
const char *) query->u.type_2->buf,
2335 query->u.type_2->len);
2337 else if (query->which == Z_Query_type_104 &&
2338 query->u.type_104->which == Z_External_CQL)
2341 const char *cql = query->u.type_104->u.cql;
2342 CQL_parser cp = cql_parser_create();
2343 int r = cql_parser_string(cp, cql);
2344 package.log(
"zoom", YLOG_LOG,
"CQL: %s", cql);
2347 cql_parser_destroy(cp);
2348 error = YAZ_BIB1_MALFORMED_QUERY;
2349 const char *addinfo =
"CQL syntax error";
2352 odr.create_searchResponse(apdu_req, error, addinfo);
2353 package.response() = apdu_res;
2356 struct cql_node *cn = cql_parser_result(cp);
2357 struct cql_node *cn_error =
m_p->convert_cql_fields(cn, odr);
2361 error = YAZ_BIB1_UNSUPP_USE_ATTRIBUTE;
2363 if (cn_error->which == CQL_NODE_ST)
2364 addinfo = cn_error->u.st.index;
2367 apdu_res = odr.create_searchResponse(apdu_req, error, addinfo);
2368 package.response() = apdu_res;
2369 cql_parser_destroy(cp);
2372 r = cql_to_ccl(cn, wrbuf_vp_puts, ccl_wrbuf);
2375 error = YAZ_BIB1_MALFORMED_QUERY;
2376 const char *addinfo =
"CQL to CCL conversion error";
2379 apdu_res = odr.create_searchResponse(apdu_req, error, addinfo);
2380 package.response() = apdu_res;
2381 cql_parser_destroy(cp);
2385 mp::wrbuf sru_sortkeys_wrbuf;
2386 if (cql_sortby_to_sortkeys(cn, wrbuf_vp_puts, sru_sortkeys_wrbuf))
2388 error = YAZ_BIB1_ILLEGAL_SORT_RELATION;
2389 const char *addinfo =
"CQL to CCL sortby conversion";
2392 apdu_res = odr.create_searchResponse(apdu_req, error, addinfo);
2393 package.response() = apdu_res;
2394 cql_parser_destroy(cp);
2397 mp::wrbuf sort_spec_wrbuf;
2398 yaz_srw_sortkeys_to_sort_spec(wrbuf_cstr(sru_sortkeys_wrbuf),
2400 yaz_tok_cfg_t tc = yaz_tok_cfg_create();
2401 yaz_tok_parse_t tp =
2402 yaz_tok_parse_buf(tc, wrbuf_cstr(sort_spec_wrbuf));
2403 yaz_tok_cfg_destroy(tc);
2406 int token = yaz_tok_move(tp);
2407 while (token != YAZ_TOK_EOF)
2409 if (token == YAZ_TOK_STRING)
2411 const char *field = yaz_tok_parse_string(tp);
2412 std::map<std::string,std::string>::iterator it;
2413 it = b->sptr->sortmap.find(field);
2414 if (it != b->sptr->sortmap.end())
2415 sortkeys += it->second;
2420 token = yaz_tok_move(tp);
2421 if (token == YAZ_TOK_STRING)
2423 sortkeys += yaz_tok_parse_string(tp);
2425 if (token != YAZ_TOK_EOF)
2428 token = yaz_tok_move(tp);
2431 yaz_tok_parse_destroy(tp);
2432 cql_parser_destroy(cp);
2436 error = YAZ_BIB1_QUERY_TYPE_UNSUPP;
2437 const char *addinfo = 0;
2439 apdu_res = odr.create_searchResponse(apdu_req, error, addinfo);
2440 package.response() = apdu_res;
2444 if (ccl_wrbuf.len())
2447 assert(pqf_wrbuf.len() == 0);
2449 struct ccl_rpn_node *cn;
2450 package.log(
"zoom", YLOG_LOG,
"CCL: %s", wrbuf_cstr(ccl_wrbuf));
2451 cn = ccl_find_str(b->sptr->ccl_bibset, wrbuf_cstr(ccl_wrbuf),
2455 char *addinfo = odr_strdup_null(odr, ccl_err_msg(cerror));
2456 error = YAZ_BIB1_MALFORMED_QUERY;
2460 case CCL_ERR_UNKNOWN_QUAL:
2461 case CCL_ERR_TRUNC_NOT_LEFT:
2462 case CCL_ERR_TRUNC_NOT_RIGHT:
2463 case CCL_ERR_TRUNC_NOT_BOTH:
2464 case CCL_ERR_TRUNC_NOT_EMBED:
2465 case CCL_ERR_TRUNC_NOT_SINGLE:
2466 error = YAZ_BIB1_UNSUPP_SEARCH;
2470 apdu_res = odr.create_searchResponse(apdu_req, error, addinfo);
2471 package.response() = apdu_res;
2474 ccl_pquery(pqf_wrbuf, cn);
2475 package.log(
"zoom", YLOG_LOG,
"RPN: %s", wrbuf_cstr(pqf_wrbuf));
2479 assert(pqf_wrbuf.len());
2481 ZOOM_query q = ZOOM_query_create();
2482 ZOOM_query_sortby2(q, b->sptr->sortStrategy.c_str(), sortkeys.c_str());
2484 Z_FacetList *fl = 0;
2488 fl = yaz_oi_get_facetlist(&sr->otherInfo);
2490 fl = yaz_oi_get_facetlist(&sr->additionalSearchInfo);
2492 if (b->get_option(
"sru"))
2495 zquery = p_query_rpn(odr, wrbuf_cstr(pqf_wrbuf));
2497 mp::wrbuf wrb_addinfo;
2499 if (!strcmp(b->get_option(
"sru"),
"solr"))
2500 error = solr_transform_rpn2solr_stream_r(b->cqlt, wrb_addinfo,
2501 wrbuf_vp_puts, wrb_cql,
2504 error = cql_transform_rpn2cql_stream_r(b->cqlt, wrb_addinfo,
2505 wrbuf_vp_puts, wrb_cql,
2510 apdu_res = odr.create_searchResponse(apdu_req, error,
2511 wrb_addinfo.c_str_null());
2512 package.response() = apdu_res;
2515 ZOOM_query_cql(q, wrb_cql.c_str());
2516 package.log(
"zoom", YLOG_LOG,
"search CQL: %s", wrb_cql.c_str());
2517 b->search(q, &hits, &error, &addinfo, &fl, odr);
2518 ZOOM_query_destroy(q);
2522 ZOOM_query_prefix(q, pqf_wrbuf.c_str());
2523 package.log(
"zoom", YLOG_LOG,
"search PQF: %s", pqf_wrbuf.c_str());
2524 b->search(q, &hits, &error, &addinfo, &fl, odr);
2525 ZOOM_query_destroy(q);
2530 if (
retry(package, odr, b, error, &addinfo, proxy_step,
2531 same_retries, proxy_retries))
2535 const char *element_set_name = 0;
2536 Odr_int number_to_present = 0;
2538 mp::util::piggyback_sr(sr, hits, number_to_present, &element_set_name);
2540 Odr_int number_of_records_returned = 0;
2543 0, number_to_present, &error, &addinfo,
2544 &number_of_records_returned, odr, b, sr->preferredRecordSyntax,
2548 apdu_res = odr.create_searchResponse(apdu_req, error, addinfo);
2551 apdu_res->u.searchResponse->records = records;
2552 apdu_res->u.searchResponse->numberOfRecordsReturned =
2553 odr_intdup(odr, number_of_records_returned);
2555 apdu_res->u.searchResponse->resultCount = odr_intdup(odr, hits);
2557 yaz_oi_set_facetlist(&apdu_res->u.searchResponse->additionalSearchInfo,
2559 package.response() = apdu_res;
2564 Z_GDU *
gdu = package.request().get();
2565 Z_APDU *apdu_req =
gdu->u.z3950;
2566 Z_APDU *apdu_res = 0;
2567 Z_PresentRequest *pr = apdu_req->u.presentRequest;
2572 package.response() = odr.create_presentResponse(
2573 apdu_req, YAZ_BIB1_SPECIFIED_RESULT_SET_DOES_NOT_EXIST, 0);
2576 const char *element_set_name = 0;
2577 Z_RecordComposition *comp = pr->recordComposition;
2578 if (comp && comp->which != Z_RecordComp_simple)
2580 package.response() = odr.create_presentResponse(
2582 YAZ_BIB1_PRESENT_COMP_SPEC_PARAMETER_UNSUPP, 0);
2585 if (comp && comp->u.simple->which == Z_ElementSetNames_generic)
2586 element_set_name = comp->u.simple->u.generic;
2587 Odr_int number_of_records_returned = 0;
2593 Z_Records *records =
2596 *pr->resultSetStartPoint - 1, *pr->numberOfRecordsRequested,
2597 &error, &addinfo, &number_of_records_returned, odr,
m_backend,
2598 pr->preferredRecordSyntax, element_set_name);
2600 apdu_res = odr.create_presentResponse(apdu_req, error, addinfo);
2603 apdu_res->u.presentResponse->records = records;
2604 apdu_res->u.presentResponse->numberOfRecordsReturned =
2605 odr_intdup(odr, number_of_records_returned);
2607 package.response() = apdu_res;
2611 Z_Records *records =
2613 *pr->resultSetStartPoint - 1, *pr->numberOfRecordsRequested,
2614 &error, &addinfo, &number_of_records_returned, odr,
m_backend,
2615 pr->preferredRecordSyntax, element_set_name);
2617 apdu_res = odr.create_presentResponse(apdu_req, error, addinfo);
2620 apdu_res->u.presentResponse->records = records;
2621 apdu_res->u.presentResponse->numberOfRecordsReturned =
2622 odr_intdup(odr, number_of_records_returned);
2624 package.response() = apdu_res;
2691 int *error,
char **addinfo, ODR odr)
2693 if (
m_p->torus_auth_url.length() == 0)
2697 std::string password;
2698 if (req->idAuthentication)
2700 Z_IdAuthentication *
auth = req->idAuthentication;
2701 switch (
auth->which)
2703 case Z_IdAuthentication_open:
2706 const char *cp = strchr(
auth->u.open,
'/');
2709 user.assign(
auth->u.open, cp -
auth->u.open);
2710 password.assign(cp + 1);
2714 case Z_IdAuthentication_idPass:
2715 if (
auth->u.idPass->userId)
2716 user.assign(
auth->u.idPass->userId);
2717 if (
auth->u.idPass->password)
2718 password.assign(
auth->u.idPass->password);
2723 Z_OtherInformation **oi = &req->otherInfo;
2724 const char *ip_cstr =
2725 yaz_oi_get_string_oid(oi, yaz_oid_userinfo_client_ip, 1, 0);
2730 ip = package.origin().get_address();
2732 yaz_log(YLOG_LOG,
"IP=%s", ip.c_str());
2735 NMEM nmem = nmem_create();
2738 nmem_strsplit_blank(nmem,
m_p->torus_allow_ip.c_str(), &darray, &num);
2739 for (i = 0; i < num; i++)
2741 yaz_log(YLOG_LOG,
"check against %s+%s", darray[i], ip.c_str());
2742 if (yaz_match_glob(darray[i], ip.c_str()))
2749 std::string torus_query;
2752 if (user.length() && password.length())
2756 failure_code = YAZ_BIB1_INIT_AC_BAD_USERID_AND_OR_PASSWORD;
2760 torus_query =
"ipRanges encloses/net.ipaddress \"";
2762 torus_query +=
"\"";
2764 if (
m_p->torus_auth_hostname.length())
2766 torus_query +=
" AND hostName == \"";
2768 torus_query +=
"\"";
2770 failure_code = YAZ_BIB1_INIT_AC_BLOCKED_NETWORK_ADDRESS;
2773 std::string dummy_db;
2774 std::string dummy_realm;
2775 std::string torus_addinfo;
2777 torus_query, dummy_realm,
m_p->proxy,
2782 *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR;
2783 if (torus_addinfo.length())
2784 *addinfo = odr_strdup(odr, torus_addinfo.c_str());
2787 const xmlNode *ptr = xmlDocGetRootElement(doc);
2788 if (ptr && ptr->type == XML_ELEMENT_NODE)
2790 if (strcmp((
const char *) ptr->name,
"records") == 0)
2792 ptr = ptr->children;
2793 while (ptr && ptr->type != XML_ELEMENT_NODE)
2796 if (ptr && strcmp((
const char *) ptr->name,
"record") == 0)
2798 ptr = ptr->children;
2799 while (ptr && ptr->type != XML_ELEMENT_NODE)
2802 if (ptr && strcmp((
const char *) ptr->name,
"layer") == 0)
2804 ptr = ptr->children;
2805 while (ptr && ptr->type != XML_ELEMENT_NODE)
2810 if (ptr && ptr->type == XML_ELEMENT_NODE &&
2811 !strcmp((
const char *) ptr->name,
"identityId"))
2818 *error = failure_code;