summaryrefslogtreecommitdiffstats
path: root/ldap/synctools/passwordsync/passsync/syncserv.cpp
diff options
context:
space:
mode:
authorDavid Boreham <dboreham@redhat.com>2005-03-11 02:44:17 +0000
committerDavid Boreham <dboreham@redhat.com>2005-03-11 02:44:17 +0000
commita957eeb8962ee1611b2546fda2bb11a5c909e59b (patch)
treea954c178f40f3531a52b01227c48e7a2df8d8894 /ldap/synctools/passwordsync/passsync/syncserv.cpp
parent9a7d1e1fd10a644ed17952acd18f755470d4744a (diff)
downloadds-a957eeb8962ee1611b2546fda2bb11a5c909e59b.tar.gz
ds-a957eeb8962ee1611b2546fda2bb11a5c909e59b.tar.xz
ds-a957eeb8962ee1611b2546fda2bb11a5c909e59b.zip
Merge over new code: fractional replication, wan replication and windows sync plus associated UI
Diffstat (limited to 'ldap/synctools/passwordsync/passsync/syncserv.cpp')
-rw-r--r--ldap/synctools/passwordsync/passsync/syncserv.cpp236
1 files changed, 236 insertions, 0 deletions
diff --git a/ldap/synctools/passwordsync/passsync/syncserv.cpp b/ldap/synctools/passwordsync/passsync/syncserv.cpp
new file mode 100644
index 00000000..800e2977
--- /dev/null
+++ b/ldap/synctools/passwordsync/passsync/syncserv.cpp
@@ -0,0 +1,236 @@
+// Created: 2-8-2005
+// Author(s): Scott Bridges
+#include "syncserv.h"
+
+PassSyncService::PassSyncService(const TCHAR *serviceName) : CNTService(serviceName)
+{
+ HKEY regKey;
+ DWORD type;
+ unsigned long size;
+
+ passhandEventHandle = CreateEvent(NULL, FALSE, FALSE, PASSHAND_EVENT_NAME);
+
+ pLdapConnection = NULL;
+ results = NULL;
+ currentResult = NULL;
+ lastLdapError = LDAP_SUCCESS;
+
+ dataFilename = "C:\\WINDOWS\\system32\\passhook.dat";
+ logFilename = NULL;
+ multipleModify = true;
+
+ ldapHostName = (char*)malloc(REG_BUF_SIZE);
+ ldpaHostPort = (char*)malloc(REG_BUF_SIZE);
+ ldalAuthUsername = (char*)malloc(REG_BUF_SIZE);
+ ldapAuthPassword = (char*)malloc(REG_BUF_SIZE);
+ ldapSearchBase = (char*)malloc(REG_BUF_SIZE);
+ ldapUsernameField = (char*)malloc(REG_BUF_SIZE);
+ ldapPasswordField = (char*)malloc(REG_BUF_SIZE);
+
+ RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\PasswordSync", &regKey);
+ size = REG_BUF_SIZE;
+ RegQueryValueEx(regKey, "Host Name", NULL, &type, (unsigned char*)ldapHostName, &size);
+ size = REG_BUF_SIZE;
+ RegQueryValueEx(regKey, "Port Number", NULL, &type, (unsigned char*)ldpaHostPort, &size);
+ size = REG_BUF_SIZE;
+ RegQueryValueEx(regKey, "User Name", NULL, &type, (unsigned char*)ldalAuthUsername, &size);
+ size = REG_BUF_SIZE;
+ RegQueryValueEx(regKey, "Password", NULL, &type, (unsigned char*)ldapAuthPassword, &size);
+ size = REG_BUF_SIZE;
+ RegQueryValueEx(regKey, "Search Base", NULL, &type, (unsigned char*)ldapSearchBase, &size);
+ size = REG_BUF_SIZE;
+ RegQueryValueEx(regKey, "User Name Field", NULL, &type, (unsigned char*)ldapUsernameField, &size);
+ size = REG_BUF_SIZE;
+ RegQueryValueEx(regKey, "Password Field", NULL, &type, (unsigned char*)ldapPasswordField, &size);
+ RegCloseKey(regKey);
+}
+
+PassSyncService::~PassSyncService()
+{
+}
+
+int PassSyncService::SyncPasswords()
+{
+ UNICODE_STRING uUsername;
+ UNICODE_STRING uPassword;
+ char* username;
+ char* password;
+ char* dn;
+
+ if(Connect() < 0)
+ {
+ // ToDo: Generate event connection failure.
+ return -1;
+ }
+
+ ourPasswordHandler.LoadSet(dataFilename);
+
+ while(ourPasswordHandler.PeekUserPass(&uUsername, &uPassword) > -1)
+ {
+
+ username = (char*)malloc(uUsername.Length);
+ password = (char*)malloc(uPassword.Length);
+
+ sprintf(username, "%S", uUsername.Buffer);
+ sprintf(password, "%S", uPassword.Buffer);
+
+ results = NULL;
+ currentResult = NULL;
+ if(QueryUsername(username) < 0)
+ {
+ // ToDo: Generate event search failure.
+ }
+ else
+ {
+ while(dn != NULL)
+ {
+ if(GetDN(&dn) < 0)
+ {
+ // ToDo: Generate event multiple results.
+ }
+ else
+ {
+ if(ModifyPassword(dn, password) < 0)
+ {
+ // ToDo: Generate event modify failure.
+ }
+ else
+ {
+ ourPasswordHandler.PopUserPass();
+ }
+ }
+ }
+ }
+
+ // ToDo: Zero out buffers
+ free(username);
+ free(password);
+ }
+
+ ourPasswordHandler.SaveSet(dataFilename);
+
+ Disconnect();
+
+ return 0;
+}
+
+void PassSyncService::Run()
+{
+ while(true)
+ {
+ WaitForSingleObject(passhandEventHandle, INFINITE);
+ SyncPasswords();
+ ResetEvent(passhandEventHandle);
+ //Sleep(60000);
+ }
+}
+
+int PassSyncService::Connect()
+{
+ pLdapConnection = ldap_init(ldapHostName, atoi(ldpaHostPort));
+
+ lastLdapError = ldap_simple_bind_s(pLdapConnection, ldalAuthUsername, ldapAuthPassword);
+ if(lastLdapError != LDAP_SUCCESS)
+ {
+ // ToDo: Log reason for bind failure.
+ return -1;
+ }
+
+ return 0;
+}
+
+int PassSyncService::Disconnect()
+{
+ ldap_unbind(pLdapConnection);
+
+ pLdapConnection = NULL;
+
+ return 0;
+}
+
+int PassSyncService::QueryUsername(char* username)
+{
+ char* searchFilter = (char*)malloc(strlen(ldapUsernameField) + strlen(username) + 4);
+
+ sprintf(searchFilter, "(%s=%s)", ldapUsernameField, username);
+
+ lastLdapError = ldap_search_ext_s(
+ pLdapConnection,
+ ldapSearchBase,
+ LDAP_SCOPE_ONELEVEL,
+ searchFilter,
+ NULL,
+ 0,
+ NULL,
+ NULL,
+ NULL,
+ -1,
+ &results);
+
+ free(searchFilter);
+
+ if(lastLdapError != LDAP_SUCCESS)
+ {
+ // ToDo: Log reason for search failure.
+ return -1;
+ }
+
+ return 0;
+}
+
+int PassSyncService::GetDN(char** dn)
+{
+ if(multipleModify)
+ {
+ if(currentResult == NULL)
+ {
+ currentResult = ldap_first_entry(pLdapConnection, results);
+ }
+ else
+ {
+ currentResult = ldap_next_entry(pLdapConnection, results);
+ }
+
+ if(currentResult == NULL)
+ {
+ *dn = NULL;
+ return 0;
+ }
+
+ *dn = ldap_get_dn(pLdapConnection, currentResult);
+ return 0;
+ }
+ else
+ {
+ currentResult = ldap_first_entry(pLdapConnection, results);
+ if(ldap_next_entry(pLdapConnection, results) != NULLMSG)
+ {
+ // ToDo: Log that multiple results for username were found.
+ *dn = NULL;
+ return -1;
+ }
+
+ *dn = ldap_get_dn(pLdapConnection, currentResult);
+ return 0;
+ }
+}
+
+int PassSyncService::ModifyPassword(char* dn, char* password)
+{
+ LDAPMod passMod;
+ LDAPMod* mods[2] = {&passMod, NULL};
+ char* modValues[2] = {password, NULL};
+
+ passMod.mod_type = ldapPasswordField;
+ passMod.mod_op = LDAP_MOD_REPLACE;
+ passMod.mod_values = modValues;
+
+ lastLdapError = ldap_modify_ext_s(pLdapConnection, dn, mods, NULL, NULL);
+ if(lastLdapError != LDAP_SUCCESS)
+ {
+ // ToDo: Log the reason for the modify failure.
+ return -1;
+ }
+
+ return 0;
+} \ No newline at end of file