finished implementing admin interface

--HG--
extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40411
This commit is contained in:
David Anderson 2007-01-29 05:02:44 +00:00
parent c66632776f
commit af651e15f3
2 changed files with 52 additions and 22 deletions

View File

@ -30,6 +30,7 @@ AdminCache::AdminCache()
m_pGroups = sm_trie_create(); m_pGroups = sm_trie_create();
m_pCacheFwd = NULL; m_pCacheFwd = NULL;
m_FirstGroup = -1; m_FirstGroup = -1;
m_pAuthTables = sm_trie_create();
} }
AdminCache::~AdminCache() AdminCache::~AdminCache()
@ -44,13 +45,23 @@ AdminCache::~AdminCache()
sm_trie_destroy(m_pCmdOverrides); sm_trie_destroy(m_pCmdOverrides);
} }
InvalidateGroupCache(); DumpAdminCache(0xFFFFFFFF, false);
if (m_pGroups) if (m_pGroups)
{ {
sm_trie_destroy(m_pGroups); sm_trie_destroy(m_pGroups);
} }
List<AuthMethod>::iterator iter;
for (iter=m_AuthMethods.begin();
iter!=m_AuthMethods.end();
iter++)
{
sm_trie_destroy((*iter).table);
}
sm_trie_destroy(m_pAuthTables);
delete m_pStrings; delete m_pStrings;
} }
@ -220,16 +231,15 @@ AdminId AdminCache::CreateAdmin(const char *name)
id = m_pMemory->CreateMem(sizeof(AdminUser), (void **)&pUser); id = m_pMemory->CreateMem(sizeof(AdminUser), (void **)&pUser);
pUser->grp_size = 0; pUser->grp_size = 0;
pUser->grp_table = -1; pUser->grp_table = -1;
pUser->auth_size = 0;
pUser->auth_table = -1;
} }
memset(pUser->flags, 0, sizeof(pUser->flags)); memset(pUser->flags, 0, sizeof(pUser->flags));
memset(pUser->eflags, 0, sizeof(pUser->flags)); memset(pUser->eflags, 0, sizeof(pUser->flags));
pUser->grp_count = 0; pUser->grp_count = 0;
pUser->auth_count = 0;
pUser->password = -1; pUser->password = -1;
pUser->magic = USR_MAGIC_SET; pUser->magic = USR_MAGIC_SET;
pUser->auth.identidx = -1;
pUser->auth.index = 0;
if (m_FirstUser == INVALID_ADMIN_ID) if (m_FirstUser == INVALID_ADMIN_ID)
{ {
@ -599,25 +609,18 @@ bool AdminCache::InvalidateAdmin(AdminId id)
} }
/* Unlink from auth tables */ /* Unlink from auth tables */
if (pUser->auth_count > 0) if (pUser->auth.identidx != -1)
{ {
UserAuth *pAuth = (UserAuth *)m_pMemory->GetAddress(pUser->auth_table); Trie *pTrie = GetMethodByIndex(pUser->auth.index);
Trie *pTrie; if (pTrie)
for (unsigned int i=0; i<pUser->auth_count; i++)
{ {
pTrie = GetMethodByIndex(pAuth[i].index); sm_trie_delete(pTrie, m_pStrings->GetString(pUser->auth.identidx));
if (!pTrie)
{
continue;
}
sm_trie_delete(pTrie, m_pStrings->GetString(pAuth->identidx));
} }
} }
/* Clear table counts */ /* Clear table counts */
pUser->grp_count = 0; pUser->grp_count = 0;
pUser->auth_count = 0;
/* Link into free list */ /* Link into free list */
pUser->magic = USR_MAGIC_UNSET; pUser->magic = USR_MAGIC_UNSET;
pUser->next_user = m_FreeUserList; pUser->next_user = m_FreeUserList;
@ -791,9 +794,16 @@ void AdminCache::InvalidateAdminCache(bool unlink_admins)
sm_trie_clear((*iter).table); sm_trie_clear((*iter).table);
} }
while (m_FirstUser != INVALID_ADMIN_ID) if (unlink_admins)
{ {
InvalidateAdmin(m_FirstUser); while (m_FirstUser != INVALID_ADMIN_ID)
{
InvalidateAdmin(m_FirstUser);
}
} else {
m_FirstUser = -1;
m_LastUser = -1;
m_FreeUserList = -1;
} }
} }
@ -844,6 +854,24 @@ const char *AdminCache::GetAdminName(AdminId id)
return m_pStrings->GetString(pUser->nameidx); return m_pStrings->GetString(pUser->nameidx);
} }
bool AdminCache::GetMethodIndex(const char *name, unsigned int *_index)
{
List<AuthMethod>::iterator iter;
unsigned int index = 0;
for (iter=m_AuthMethods.begin();
iter!=m_AuthMethods.end();
iter++,index++)
{
if ((*iter).name.compare(name) == 0)
{
*_index = index;
return true;
}
}
return false;
}
bool AdminCache::BindAdminIdentity(AdminId id, const char *auth, const char *ident) bool AdminCache::BindAdminIdentity(AdminId id, const char *auth, const char *ident)
{ {
AdminUser *pUser = (AdminUser *)m_pMemory->GetAddress(id); AdminUser *pUser = (AdminUser *)m_pMemory->GetAddress(id);
@ -863,6 +891,9 @@ bool AdminCache::BindAdminIdentity(AdminId id, const char *auth, const char *ide
return false; return false;
} }
pUser->auth.identidx = m_pStrings->AddString(ident);
GetMethodIndex(auth, &pUser->auth.index);
return sm_trie_insert(pTable, ident, (void **)id); return sm_trie_insert(pTable, ident, (void **)id);
} }
@ -958,7 +989,7 @@ bool AdminCache::AdminInheritGroup(AdminId id, GroupId gid)
} }
AdminGroup *pGroup = (AdminGroup *)m_pMemory->GetAddress(gid); AdminGroup *pGroup = (AdminGroup *)m_pMemory->GetAddress(gid);
if (!pGroup || pGroup->magic != USR_MAGIC_SET) if (!pGroup || pGroup->magic != GRP_MAGIC_SET)
{ {
return false; return false;
} }

View File

@ -71,9 +71,7 @@ struct AdminUser
int grp_table; /* Group table itself */ int grp_table; /* Group table itself */
int next_user; /* Next user in ze list */ int next_user; /* Next user in ze list */
int prev_user; /* Prev user in the list */ int prev_user; /* Prev user in the list */
unsigned int auth_count; /* Number of auth methods */ UserAuth auth; /* Auth method for this user */
unsigned int auth_size; /* Size of auth table */
int auth_table; /* Auth table itself */
}; };
class AdminCache : class AdminCache :
@ -135,6 +133,7 @@ private:
void InvalidateAdminCache(bool unlink_admins); void InvalidateAdminCache(bool unlink_admins);
void DumpCommandOverrideCache(OverrideType type); void DumpCommandOverrideCache(OverrideType type);
Trie *GetMethodByIndex(unsigned int index); Trie *GetMethodByIndex(unsigned int index);
bool GetMethodIndex(const char *name, unsigned int *_index);
public: public:
BaseStringTable *m_pStrings; BaseStringTable *m_pStrings;
BaseMemTable *m_pMemory; BaseMemTable *m_pMemory;