int U_EXPORT main (int argc, char* argv[]) { U_ULIB_INIT(argv); U_TRACE(5,"main(%d)",argc) ULDAP ldap; if (ldap.init(argv[1]) && ldap.set_protocol() && ldap.bind(argv[2],argv[3])) { int i, n = ldap.search(argv[4], LDAP_SCOPE_ONELEVEL, (char**)attr_name); if (n > 0) { ULDAPEntry entry(NUM_ATTR, attr_name, n); ldap.get(entry); for (i = 0; i < n; ++i) { cout << "dn: " << entry[i] << "\n" << "cn: " << entry.getCStr(0, i) << "\n" << "mail: " << entry.getCStr(1, i) << "\n\n"; } } } }
void run(int argc, char* argv[], char* env[]) { U_TRACE(5, "Application::run(%d,%p,%p)", argc, argv, env) UApplication::run(argc, argv, env); // manage options if (UApplication::isOptions()) cfg_str = opt['c']; // manage arg operation // manage file configuration if (cfg_str.empty()) cfg_str = U_STRING_FROM_CONSTANT("form_completion.cfg"); (void) cfg.open(cfg_str); int LDAP_port; UString var_env_name, scan_form, LDAP_host, LDAP_searchbase, password, username, form_template, LDAP_rootdn, LDAP_rootpw, subject_attr; // -------------------------------------------------------------------------------------------------------------- // configuration parameters // -------------------------------------------------------------------------------------------------------------- // X509_SUBJECT_VARIABLE var environment to elaborate (ex: X509_SUBJECT) // X509_SUBJECT_FILTER scanf form to extract data (ex: /C=IT/L=Rome/O=Eraclito/OU=Tac/CN=%[^/]s/Email=%*s) // LDAP_SERVER_ADDRESS name ldap host (ex: slessi) // LDAP_SERVER_PORT port ldap host (ex: 389) // LDAP_SERVER_BASE // LDAP_SERVER_ROOTDN bind DN for ldap query data // LDAP_SERVER_ROOTPW bind password for ldap query data // LDAP_SUBJECT_ATTRIBUTE attribute for query filter // LDAP_USER_ATTRIBUTE name user attribute (ex: uid) // LDAP_PASSWD_ATTRIBUTE name password attribute (ex: tacPassword) // TEMPLATE name form completion to print (ex: ./lms1.templ) // -------------------------------------------------------------------------------------------------------------- var_env_name = cfg[U_STRING_FROM_CONSTANT("X509_SUBJECT_VARIABLE")]; scan_form = cfg[U_STRING_FROM_CONSTANT("X509_SUBJECT_FILTER")]; LDAP_host = cfg[U_STRING_FROM_CONSTANT("LDAP_SERVER_ADDRESS")]; LDAP_searchbase = cfg[U_STRING_FROM_CONSTANT("LDAP_SERVER_BASE")]; LDAP_rootdn = cfg[U_STRING_FROM_CONSTANT("LDAP_SERVER_ROOTDN")]; LDAP_rootpw = cfg[U_STRING_FROM_CONSTANT("LDAP_SERVER_ROOTPW")]; subject_attr = cfg[U_STRING_FROM_CONSTANT("LDAP_SUBJECT_ATTRIBUTE")]; password = cfg[U_STRING_FROM_CONSTANT("LDAP_PASSWD_ATTRIBUTE")]; username = cfg[U_STRING_FROM_CONSTANT("LDAP_USER_ATTRIBUTE")]; form_template = cfg[U_STRING_FROM_CONSTANT("TEMPLATE")]; LDAP_port = cfg.readLong(U_STRING_FROM_CONSTANT("LDAP_SERVER_PORT"), 389); // scanf char buf[256]; const char* value = (const char*) U_SYSCALL(getenv, "%S", var_env_name.c_str()); int n = U_SYSCALL(sscanf, "%S,%S,%p,%p,%p,%p", value, scan_form.c_str(), &buf[0]); if (n != 1) U_ERROR("scanf error on var env <%s>...", var_env_name.c_str()); U_INTERNAL_DUMP("sscanf() result = \"%s\"", buf) // login to LDAP ULDAP ldap; if (ldap.init(LDAP_host.c_str(), (LDAP_port ? LDAP_port : LDAP_PORT)) == false || ldap.set_protocol() == false || ldap.bind(LDAP_rootdn.c_str(), LDAP_rootpw.c_str()) == false) { U_ERROR("login to LDAP failed..."); } // search to LDAP char buffer[4096]; const char* attr_name[] = { username.c_str(), password.c_str(), 0 }; (void) snprintf(buffer, sizeof(buffer), "%s=%s,%.*s", subject_attr.c_str(), buf, U_STRING_TO_TRACE(LDAP_searchbase)); n = ldap.search(buffer, LDAP_SCOPE_BASE, (char**)attr_name); if (n != 1) U_ERROR("search error on ldap..."); ULDAPEntry entry(2, attr_name, 1); ldap.get(entry); const char* sname = entry.getCStr(0); const char* spassword = entry.getCStr(1); // write to stdout (void) U_SYSCALL(printf, "%S,%S,%S", UFile::contentOf(form_template).data(), sname, spassword); }