Variant BaseVariantAppProtocolHandler::GetScaffold(string uriString) { //1. Search in the cache first if (_urlCache.HasKey(uriString)) { return _urlCache[uriString]; } //2. Build it Variant result; //3. Split the URL into components URI uri; if (!URI::FromString(uriString, true, uri)) { FATAL("Invalid url: %s", STR(uriString)); return Variant(); } //6. build the end result result["username"] = uri.userName(); result["password"] = uri.password(); result["host"] = uri.host(); result["ip"] = uri.ip(); result["port"] = uri.port(); result["document"] = uri.fullDocumentPath(); result["applicationName"] = GetApplication()->GetName(); //7. Save it in the cache _urlCache[uriString] = result; //8. Done return result; }
extern "C" void * openSource(Source * source) { URI u; ldap_handle * h; int version; int rc; int i; char * s; int msgid; std::string locfilter; struct berval passwd; struct timeval tv; if (!source->uri.length()) throw std::runtime_error("LDAP loader requires an LDAP URI"); // Create the handle. h = new ldap_handle(); h->source = source; // Extract the binddn:password from the URI and rebuild // an authentication-less URI. try { if (!u.parse(source->uri)) throw std::runtime_error("Cannot parse URI"); if (u.user().empty() && u.password().empty()) h->binddn = u.unescape(u.userinfo()); else { h->binddn = u.user(); h->password = u.password(); } u.userinfo(""); // Parse the LDAP URI. if ((rc = ldap_url_parse(std::string(u).c_str(), &h->uri)) != LDAP_SUCCESS) throw ldap_error(rc); if (!h->uri->lud_attrs[0]) throw std::runtime_error( "LDAP url should select at least one attribute"); // Connect to LDAP server. rc = ldap_initialize(&h->ldap, ((std::string(h->uri->lud_scheme? h->uri->lud_scheme: "ldap")) + "://" + (h->uri->lud_host? h->uri->lud_host: "") + (h->uri->lud_port? ":" + std::to_string(h->uri->lud_port): "")).c_str()); if (rc != LDAP_SUCCESS) throw ldap_error(rc); // Set a very low timeout: connection should be quick. tv.tv_sec = 5; tv.tv_usec = 0; ldap_set_option(h->ldap, LDAP_OPT_NETWORK_TIMEOUT, &tv); // Bind if needed. if (ldap_get_option(h->ldap, LDAP_OPT_PROTOCOL_VERSION, &version) != LDAP_SUCCESS) version = LDAP_VERSION2; // Bind is mandatory. rc = LDAP_SUCCESS; if (!h->binddn.length()) { if (version >= LDAP_VERSION2) { // Anonymous bind is mandatory for // version 2. rc = ldap_sasl_bind_s(h->ldap, "", LDAP_SASL_SIMPLE, NULL, NULL, NULL, NULL); } } else { passwd.bv_val = (char *) h->password.c_str(); passwd.bv_len = h->password.length(); rc = ldap_sasl_bind_s(h->ldap, h->binddn.c_str(), LDAP_SASL_SIMPLE, &passwd, NULL, NULL, NULL); } if (rc != LDAP_SUCCESS) throw ldap_error(rc); // Update the given filter to not select entries not // providing mail address attributes. locfilter = h->uri->lud_filter; if (locfilter.length()) { if (locfilter[0] != '(') locfilter = std::string("(") + locfilter + ")"; locfilter = std::string("(&") + locfilter; } if (h->uri->lud_attrs[1]) locfilter += "(|"; for (i = 0; (s = h->uri->lud_attrs[i]); i++) locfilter = locfilter + "(" + s + "=*)"; if (h->uri->lud_attrs[1]) locfilter += ')'; if (h->uri->lud_filter) locfilter += ')'; rc = ldap_search_ext(h->ldap, h->uri->lud_dn, h->uri->lud_scope, locfilter.c_str(), h->uri->lud_attrs, 0, NULL, NULL, NULL, 0x7FFFFFFF, &msgid); if (rc != LDAP_SUCCESS) throw ldap_error(rc); } catch (...) { delete h; throw; } return h; }