|
@@ -88,113 +88,6 @@ class CIpOsHashTable: public CMinHashTable<CIpOsInstance>
|
|
|
{
|
|
|
};
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-class SDSPasswordProvider : public CInterface, implements IPasswordProvider
|
|
|
-{
|
|
|
-public:
|
|
|
- SDSPasswordProvider();
|
|
|
- ~SDSPasswordProvider() { delete map; }
|
|
|
- IMPLEMENT_IINTERFACE
|
|
|
-
|
|
|
- virtual bool getPassword(const IpAddress & ip, StringBuffer & username, StringBuffer & password);
|
|
|
- void clearCache()
|
|
|
- {
|
|
|
- delete map;
|
|
|
- map = new CIpPasswordHashTable();
|
|
|
- }
|
|
|
-
|
|
|
-protected:
|
|
|
- //MORE: This cache needs to be invalidated at some point...
|
|
|
- CIpPasswordHashTable *map;
|
|
|
- Owned<IConstEnvironment> env;
|
|
|
- Mutex mutex;
|
|
|
-};
|
|
|
-
|
|
|
-SDSPasswordProvider::SDSPasswordProvider()
|
|
|
-{
|
|
|
- Owned<IEnvironmentFactory> factory = getEnvironmentFactory(true);
|
|
|
- env.setown(factory->openEnvironment());
|
|
|
- map = new CIpPasswordHashTable();
|
|
|
-}
|
|
|
-
|
|
|
-bool SDSPasswordProvider::getPassword(const IpAddress & ip, StringBuffer & username, StringBuffer & password)
|
|
|
-{
|
|
|
- synchronized procedure(mutex);
|
|
|
- if (!env)
|
|
|
- return false;
|
|
|
- CIpPasswordInstance *match = map->find((const char *)&ip,false);
|
|
|
- if (!match)
|
|
|
- {
|
|
|
- match = new CIpPasswordInstance(ip);
|
|
|
-
|
|
|
- StringBuffer ipText;
|
|
|
- ip.getIpText(ipText);
|
|
|
- Owned<IConstMachineInfo> machine = env->getMachineByAddress(ipText.str());
|
|
|
- if (machine)
|
|
|
- {
|
|
|
- Owned<IConstDomainInfo> domain = machine->getDomain();
|
|
|
- if (domain)
|
|
|
- {
|
|
|
- SCMStringBuffer username;
|
|
|
-
|
|
|
- StringAttrAdaptor strval(match->password);
|
|
|
- domain->getAccountInfo(username, strval);
|
|
|
-
|
|
|
- SCMStringBuffer domainname;
|
|
|
- domain->getName(domainname);
|
|
|
- match->user.set(domainname.s.append('\\').append(username.str()).str());
|
|
|
- match->matched = true;
|
|
|
- }
|
|
|
- }
|
|
|
- map->add(match);
|
|
|
- }
|
|
|
- username.append(match->user);
|
|
|
- password.append(match->password);
|
|
|
- return match->matched;
|
|
|
-}
|
|
|
-
|
|
|
-static CriticalSection passwordProviderCrit;
|
|
|
-static SDSPasswordProvider * passwordProvider = NULL;
|
|
|
-MODULE_INIT(INIT_PRIORITY_ENV_ENVIRONMENT)
|
|
|
-{
|
|
|
- return true;
|
|
|
-}
|
|
|
-
|
|
|
-MODULE_EXIT()
|
|
|
-{
|
|
|
- clearPasswordsFromSDS();
|
|
|
-}
|
|
|
-
|
|
|
-void __stdcall setPasswordsFromSDS()
|
|
|
-{
|
|
|
- CriticalBlock block(passwordProviderCrit);
|
|
|
- if (passwordProvider == NULL)
|
|
|
- {
|
|
|
- passwordProvider = new SDSPasswordProvider();
|
|
|
- setPasswordProvider(passwordProvider);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-void __stdcall resetPasswordsFromSDS()
|
|
|
-{
|
|
|
- CriticalBlock block(passwordProviderCrit);
|
|
|
- if (passwordProvider)
|
|
|
- passwordProvider->clearCache();
|
|
|
-}
|
|
|
-
|
|
|
-void __stdcall clearPasswordsFromSDS()
|
|
|
-{
|
|
|
- CriticalBlock block(passwordProviderCrit);
|
|
|
- if (passwordProvider) {
|
|
|
- setPasswordProvider(NULL);
|
|
|
- passwordProvider->Release();
|
|
|
- passwordProvider = NULL;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
|
static CriticalSection ipcachesect;
|