1.1 --- a/core/AdminCache.cpp Mon Feb 05 08:58:03 2007 +0000
1.2 +++ b/core/AdminCache.cpp Mon Feb 05 09:14:40 2007 +0000
1.3 @@ -21,8 +21,8 @@
1.4
1.5 AdminCache::AdminCache()
1.6 {
1.7 - m_pCmdOverrides = NULL;
1.8 - m_pCmdGrpOverrides = NULL;
1.9 + m_pCmdOverrides = sm_trie_create();
1.10 + m_pCmdGrpOverrides = sm_trie_create();
1.11 m_pStrings = new BaseStringTable(1024);
1.12 m_pMemory = m_pStrings->GetMemTable();
1.13 m_FreeGroupList = m_FirstGroup = m_LastGroup = INVALID_GROUP_ID;
1.14 @@ -84,23 +84,42 @@
1.15 m_pCacheFwd = NULL;
1.16 }
1.17
1.18 -void AdminCache::AddCommandOverride(const char *cmd, OverrideType type, AdminFlag flag)
1.19 +void AdminCache::AddCommandOverride(const char *cmd, OverrideType type, FlagBits flags)
1.20 {
1.21 + Trie *pTrie = NULL;
1.22 if (type == Override_Command)
1.23 {
1.24 - _AddCommandOverride(cmd, flag);
1.25 + pTrie = m_pCmdOverrides;
1.26 } else if (type == Override_CommandGroup) {
1.27 - _AddCommandGroupOverride(cmd, flag);
1.28 + pTrie = m_pCmdGrpOverrides;
1.29 + } else {
1.30 + return;
1.31 }
1.32 +
1.33 + sm_trie_insert(pTrie, cmd, (void *)(unsigned int)flags);
1.34 }
1.35
1.36 -bool AdminCache::GetCommandOverride(const char *cmd, OverrideType type, AdminFlag *pFlag)
1.37 +bool AdminCache::GetCommandOverride(const char *cmd, OverrideType type, FlagBits *pFlags)
1.38 {
1.39 + Trie *pTrie = NULL;
1.40 +
1.41 if (type == Override_Command)
1.42 {
1.43 - return _GetCommandOverride(cmd, pFlag);
1.44 + pTrie = m_pCmdOverrides;
1.45 } else if (type == Override_CommandGroup) {
1.46 - return _GetCommandGroupOverride(cmd, pFlag);
1.47 + pTrie = m_pCmdGrpOverrides;
1.48 + } else {
1.49 + return false;
1.50 + }
1.51 +
1.52 + void *object;
1.53 + if (sm_trie_retrieve(pTrie, cmd, &object))
1.54 + {
1.55 + if (pFlags)
1.56 + {
1.57 + *pFlags = (FlagBits)object;
1.58 + }
1.59 + return true;
1.60 }
1.61
1.62 return false;
1.63 @@ -116,72 +135,6 @@
1.64 }
1.65 }
1.66
1.67 -void AdminCache::_AddCommandGroupOverride(const char *group, AdminFlag flag)
1.68 -{
1.69 - if (!m_pCmdGrpOverrides)
1.70 - {
1.71 - m_pCmdGrpOverrides = sm_trie_create();
1.72 - }
1.73 -
1.74 - /* :TODO: Notify command system */
1.75 -
1.76 - sm_trie_insert(m_pCmdGrpOverrides, group, (void *)flag);
1.77 -}
1.78 -
1.79 -void AdminCache::_AddCommandOverride(const char *cmd, AdminFlag flag)
1.80 -{
1.81 - if (!m_pCmdOverrides)
1.82 - {
1.83 - m_pCmdOverrides = sm_trie_create();
1.84 - }
1.85 -
1.86 - /* :TODO: Notify command system */
1.87 -
1.88 - sm_trie_insert(m_pCmdOverrides, cmd, (void *)flag);
1.89 -}
1.90 -
1.91 -bool AdminCache::_GetCommandGroupOverride(const char *cmd, AdminFlag *pFlag)
1.92 -{
1.93 - if (!m_pCmdGrpOverrides)
1.94 - {
1.95 - return false;
1.96 - }
1.97 -
1.98 - if (!pFlag)
1.99 - {
1.100 - return sm_trie_retrieve(m_pCmdGrpOverrides, cmd, NULL);
1.101 - } else {
1.102 - void *object;
1.103 - bool ret;
1.104 - if (ret=sm_trie_retrieve(m_pCmdGrpOverrides, cmd, &object))
1.105 - {
1.106 - *pFlag = (AdminFlag)(int)object;
1.107 - }
1.108 - return ret;
1.109 - }
1.110 -}
1.111 -
1.112 -bool AdminCache::_GetCommandOverride(const char *cmd, AdminFlag *pFlag)
1.113 -{
1.114 - if (!m_pCmdOverrides)
1.115 - {
1.116 - return false;
1.117 - }
1.118 -
1.119 - if (!pFlag)
1.120 - {
1.121 - return sm_trie_retrieve(m_pCmdOverrides, cmd, NULL);
1.122 - } else {
1.123 - void *object;
1.124 - bool ret;
1.125 - if (ret=sm_trie_retrieve(m_pCmdOverrides, cmd, &object))
1.126 - {
1.127 - *pFlag = (AdminFlag)(int)object;
1.128 - }
1.129 - return ret;
1.130 - }
1.131 -}
1.132 -
1.133 void AdminCache::_UnsetCommandGroupOverride(const char *group)
1.134 {
1.135 if (!m_pCmdGrpOverrides)
1.136 @@ -233,8 +186,8 @@
1.137 pUser->grp_table = -1;
1.138 }
1.139
1.140 - memset(pUser->flags, 0, sizeof(pUser->flags));
1.141 - memset(pUser->eflags, 0, sizeof(pUser->flags));
1.142 + pUser->flags = 0;
1.143 + pUser->eflags = 0;
1.144 pUser->grp_count = 0;
1.145 pUser->password = -1;
1.146 pUser->magic = USR_MAGIC_SET;
1.147 @@ -286,7 +239,7 @@
1.148 pGroup->next_grp = INVALID_GROUP_ID;
1.149 pGroup->pCmdGrpTable = NULL;
1.150 pGroup->pCmdTable = NULL;
1.151 - memset(pGroup->addflags, 0, sizeof(AdminFlag) * AdminFlags_TOTAL);
1.152 + pGroup->addflags = 0;
1.153
1.154 if (m_FirstGroup == INVALID_GROUP_ID)
1.155 {
1.156 @@ -336,12 +289,12 @@
1.157 return;
1.158 }
1.159
1.160 - if (flag < Admin_None || flag >= AdminFlags_TOTAL)
1.161 + if (flag < Admin_Reservation || flag >= AdminFlags_TOTAL)
1.162 {
1.163 return;
1.164 }
1.165
1.166 - pGroup->addflags[flag] = enabled;
1.167 + pGroup->addflags |= (1<<(unsigned int)flag);
1.168 }
1.169
1.170 bool AdminCache::GetGroupAddFlag(GroupId id, AdminFlag flag)
1.171 @@ -352,15 +305,16 @@
1.172 return false;
1.173 }
1.174
1.175 - if (flag < Admin_None || flag >= AdminFlags_TOTAL)
1.176 + if (flag < Admin_Reservation || flag >= AdminFlags_TOTAL)
1.177 {
1.178 return false;
1.179 }
1.180
1.181 - return pGroup->addflags[flag];
1.182 + FlagBits bit = 1<<(FlagBits)flag;
1.183 + return ((pGroup->addflags & bit) == bit);
1.184 }
1.185
1.186 -unsigned int AdminCache::GetGroupAddFlagBits(GroupId id, bool flags[], unsigned int total)
1.187 +FlagBits AdminCache::GetGroupAddFlags(GroupId id)
1.188 {
1.189 AdminGroup *pGroup = (AdminGroup *)m_pMemory->GetAddress(id);
1.190 if (!pGroup || pGroup->magic != GRP_MAGIC_SET)
1.191 @@ -368,16 +322,7 @@
1.192 return 0;
1.193 }
1.194
1.195 - unsigned int i;
1.196 -
1.197 - for (i = Admin_None;
1.198 - i < AdminFlags_TOTAL && i < total;
1.199 - i++)
1.200 - {
1.201 - flags[i] = pGroup->addflags[i];
1.202 - }
1.203 -
1.204 - return i;
1.205 + return pGroup->addflags;
1.206 }
1.207
1.208 void AdminCache::SetGroupGenericImmunity(GroupId id, ImmunityType type, bool enabled)
1.209 @@ -436,8 +381,16 @@
1.210 table[0] = 0;
1.211 } else {
1.212 int *old_table = (int *)m_pMemory->GetAddress(pOther->immune_table);
1.213 + /* Break out if this group is already in the list */
1.214 + for (int i=0; i<old_table[0]; i++)
1.215 + {
1.216 + if (old_table[1+i] == other_id)
1.217 + {
1.218 + return;
1.219 + }
1.220 + }
1.221 tblidx = m_pMemory->CreateMem(sizeof(int) * (old_table[0] + 2), (void **)&table);
1.222 - /* Get the old address again in caes of resize */
1.223 + /* Get the old address again in case of resize */
1.224 old_table = (int *)m_pMemory->GetAddress(pOther->immune_table);
1.225 table[0] = old_table[0];
1.226 for (unsigned int i=1; i<=(unsigned int)old_table[0]; i++)
1.227 @@ -702,14 +655,11 @@
1.228 /* Decrease count */
1.229 pUser->grp_count--;
1.230 /* Recalculate effective flags */
1.231 - memset(pUser->eflags, 0, sizeof(pUser->eflags));
1.232 + pUser->eflags = pUser->flags;
1.233 for (unsigned int j=0; j<pUser->grp_count; j++)
1.234 {
1.235 pOther = (AdminGroup *)m_pMemory->GetAddress(table[j]);
1.236 - for (unsigned int k=0; k<AdminFlags_TOTAL; k++)
1.237 - {
1.238 - pUser->eflags[k] = (pUser->flags[k] || pOther->addflags[k]);
1.239 - }
1.240 + pUser->eflags |= pOther->addflags;
1.241 }
1.242 /* Break now, duplicates aren't allowed */
1.243 break;
1.244 @@ -922,13 +872,14 @@
1.245 return;
1.246 }
1.247
1.248 - if (flag < Admin_None
1.249 + if (flag < Admin_Reservation
1.250 || flag >= AdminFlags_TOTAL)
1.251 {
1.252 return;
1.253 }
1.254
1.255 - pUser->flags[enabled] = false;
1.256 + pUser->flags |= (1<<(FlagBits)flag);
1.257 + pUser->eflags |= (1<<(FlagBits)flag);
1.258 }
1.259
1.260 bool AdminCache::GetAdminFlag(AdminId id, AdminFlag flag, AccessMode mode)
1.261 @@ -939,23 +890,25 @@
1.262 return false;
1.263 }
1.264
1.265 - if (flag < Admin_None
1.266 + if (flag < Admin_Reservation
1.267 || flag >= AdminFlags_TOTAL)
1.268 {
1.269 return false;
1.270 }
1.271
1.272 + FlagBits bit = (1<<(FlagBits)flag);
1.273 +
1.274 if (mode == Access_Real)
1.275 {
1.276 - return pUser->flags[flag];
1.277 + return ((pUser->flags & bit) == bit);
1.278 } else if (mode == Access_Effective) {
1.279 - return (pUser->flags[flag] || pUser->eflags[flag]);
1.280 + return ((pUser->eflags & bit) == bit);
1.281 }
1.282
1.283 return false;
1.284 }
1.285
1.286 -unsigned int AdminCache::GetAdminFlags(AdminId id, bool flags[], unsigned int total, AccessMode mode)
1.287 +FlagBits AdminCache::GetAdminFlags(AdminId id, AccessMode mode)
1.288 {
1.289 AdminUser *pUser = (AdminUser *)m_pMemory->GetAddress(id);
1.290 if (!pUser || pUser->magic != USR_MAGIC_SET)
1.291 @@ -963,21 +916,14 @@
1.292 return 0;
1.293 }
1.294
1.295 - unsigned int i = 0;
1.296 if (mode == Access_Real)
1.297 {
1.298 - for (i=0; i<AdminFlags_TOTAL && i<total; i++)
1.299 - {
1.300 - flags[i] = pUser->flags[i];
1.301 - }
1.302 + return pUser->flags;
1.303 } else if (mode == Access_Effective) {
1.304 - for (i=0; i<AdminFlags_TOTAL && i<total; i++)
1.305 - {
1.306 - flags[i] = (pUser->flags[i] || pUser->eflags[i]);
1.307 - }
1.308 + return pUser->eflags;
1.309 }
1.310
1.311 - return i;
1.312 + return 0;
1.313 }
1.314
1.315 bool AdminCache::AdminInheritGroup(AdminId id, GroupId gid)
1.316 @@ -994,6 +940,19 @@
1.317 return false;
1.318 }
1.319
1.320 + /* First check for duplicates */
1.321 + if (pUser->grp_count != 0)
1.322 + {
1.323 + int *temp_table = (int *)m_pMemory->GetAddress(pUser->grp_table);
1.324 + for (unsigned int i=0; i<pUser->grp_count; i++)
1.325 + {
1.326 + if (temp_table[i] == gid)
1.327 + {
1.328 + return false;
1.329 + }
1.330 + }
1.331 + }
1.332 +
1.333 int *table;
1.334 if (pUser->grp_count + 1 > pUser->grp_size)
1.335 {
1.336 @@ -1024,28 +983,11 @@
1.337 table = (int *)m_pMemory->GetAddress(pUser->grp_table);
1.338 }
1.339
1.340 - for (unsigned int i=0; i<pUser->grp_count; i++)
1.341 - {
1.342 - if (table[i] == gid)
1.343 - {
1.344 - return false;
1.345 - }
1.346 - }
1.347 -
1.348 table[pUser->grp_count] = gid;
1.349 pUser->grp_count++;
1.350
1.351 /* Compute new effective flags */
1.352 - for (unsigned int i=Admin_None;
1.353 - i<AdminFlags_TOTAL;
1.354 - i++)
1.355 - {
1.356 - /* Only inherit flags additive flags we don't have */
1.357 - if (!pUser->eflags[i])
1.358 - {
1.359 - pUser->eflags[i] = pGroup->addflags[i];
1.360 - }
1.361 - }
1.362 + pUser->eflags |= pGroup->addflags;
1.363
1.364 return true;
1.365 }
1.366 @@ -1096,3 +1038,52 @@
1.367 pUser->password = m_pStrings->AddString(password);
1.368 }
1.369
1.370 +unsigned int AdminCache::FlagBitsToBitArray(FlagBits bits, bool array[], unsigned int maxSize)
1.371 +{
1.372 + unsigned int i;
1.373 + for (i=0; i<maxSize && i<AdminFlags_TOTAL; i++)
1.374 + {
1.375 + array[i] = ((bits & (1<<i)) == (1<<i));
1.376 + }
1.377 +
1.378 + return i;
1.379 +}
1.380 +
1.381 +FlagBits AdminCache::FlagBitArrayToBits(const bool array[], unsigned int maxSize)
1.382 +{
1.383 + FlagBits bits = 0;
1.384 + for (unsigned int i=0; i<maxSize && i<AdminFlags_TOTAL; i++)
1.385 + {
1.386 + if (array[i])
1.387 + {
1.388 + bits |= (1<<i);
1.389 + }
1.390 + }
1.391 +
1.392 + return bits;
1.393 +}
1.394 +
1.395 +FlagBits AdminCache::FlagArrayToBits(const AdminFlag array[], unsigned int numFlags)
1.396 +{
1.397 + FlagBits bits = 0;
1.398 + for (unsigned int i=0; i<numFlags && i<AdminFlags_TOTAL; i++)
1.399 + {
1.400 + bits |= (1 << (FlagBits)array[i]);
1.401 + }
1.402 +
1.403 + return bits;
1.404 +}
1.405 +
1.406 +unsigned int AdminCache::FlagBitsToArray(FlagBits bits, AdminFlag array[], unsigned int maxSize)
1.407 +{
1.408 + unsigned int i, num=0;
1.409 + for (i=0; i<maxSize && i<AdminFlags_TOTAL; i++)
1.410 + {
1.411 + if ((bits & (1<<i)) == (1<<i))
1.412 + {
1.413 + array[num++] = (AdminFlag)i;
1.414 + }
1.415 + }
1.416 +
1.417 + return num;
1.418 +}