core/AdminCache.cpp
changeset 433 d699e31199ad
parent 425 d57bdb5a05bd
child 434 db80fdcb09ce
     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 +}