public/IAdminSystem.h
author David Anderson <dvander@alliedmods.net>
Fri Feb 16 03:47:10 2007 +0000 (2007-02-16)
changeset 501 e209a7296936
parent 458 77520125ee67
child 620 e329c942cb00
permissions -rw-r--r--
removed this potential feature, not useful enough
     1 /**
     2  * vim: set ts=4 :
     3  * ===============================================================
     4  * SourceMod, Copyright (C) 2004-2007 AlliedModders LLC. 
     5  * All rights reserved.
     6  * ===============================================================
     7  *
     8  *  This file is part of the SourceMod/SourcePawn SDK.  This file may only be 
     9  * used or modified under the Terms and Conditions of its License Agreement, 
    10  * which is found in public/licenses/LICENSE.txt.  As of this notice, derivative 
    11  * works must be licensed under the GNU General Public License (version 2 or 
    12  * greater).  A copy of the GPL is included under public/licenses/GPL.txt.
    13  * 
    14  * To view the latest information, see: http://www.sourcemod.net/license.php
    15  *
    16  * Version: $Id$
    17  */
    18 
    19 #ifndef _INCLUDE_SOURCEMOD_ADMINISTRATION_SYSTEM_H_
    20 #define _INCLUDE_SOURCEMOD_ADMINISTRATION_SYSTEM_H_
    21 
    22 #include <IShareSys.h>
    23 
    24 #define SMINTERFACE_ADMINSYS_NAME		"IAdminSys"
    25 #define SMINTERFACE_ADMINSYS_VERSION	1
    26 
    27 /**
    28  * @file IAdminSystem.h
    29  * @brief Defines the interface to manage the Admin Users/Groups and Override caches.
    30  *
    31  *   The administration system is more of a volatile cache than a system.  It is designed to be 
    32  * temporary rather than permanent, in order to compensate for more storage methods.  For example,
    33  * a flat file might be read into the cache all at once.  But a MySQL-based system might only cache
    34  * admin permissions when that specific admin connects.  
    35  *
    36  *   The override cache is the simplest to explain.  Any time an override is added, any existing 
    37  * and all future commands will gain a new access level set by the override.  If unset, the default
    38  * access level is restored.  This cache is dynamically changeable.
    39  *
    40  *   The group cache contains, for each group:
    41  *	1] A set of inherent flags - fully readable/writable.
    42  *  2] An immunity table - insertion and retrieval only.
    43  *  3] An override table - insertion and retrieval only.
    44  *   Individual groups can be invalidated entirely.  It should be considered an expensive
    45  *  operation, since each admin needs to be patched up to not reference the group.
    46  *
    47  *   For more information, see the SourceMod Development wiki.
    48  */
    49 
    50 namespace SourceMod
    51 {
    52 	/**
    53 	 * @brief Access levels (flags) for admins.
    54 	 */
    55 	enum AdminFlag
    56 	{
    57 		Admin_Reservation = 0,	/**< Reserved slot */
    58 		Admin_Generic,			/**< Generic admin abilities */
    59 		Admin_Kick,				/**< Kick another user */
    60 		Admin_Ban,				/**< Ban another user */
    61 		Admin_Unban,			/**< Unban another user */
    62 		Admin_Slay,				/**< Slay/kill/damage another user */
    63 		Admin_Changemap,		/**< Change the map */
    64 		Admin_Convars,			/**< Change basic convars */
    65 		Admin_Config,			/**< Change configuration */
    66 		Admin_Chat,				/**< Special chat privileges */
    67 		Admin_Vote,				/**< Special vote privileges */
    68 		Admin_Password,			/**< Set a server password */
    69 		Admin_RCON,				/**< Use RCON */
    70 		Admin_Cheats,			/**< Change sv_cheats and use its commands */
    71 		Admin_Root,				/**< All access by default */
    72 		Admin_Custom1,			/**< First custom flag type */
    73 		Admin_Custom2,			/**< Second custom flag type */
    74 		Admin_Custom3,			/**< Third custom flag type */
    75 		Admin_Custom4,			/**< Fourth custom flag type */
    76 		Admin_Custom5,			/**< Fifth custom flag type */
    77 		Admin_Custom6,			/**< Sixth custom flag type */
    78 		/* --- */
    79 		AdminFlags_TOTAL,
    80 	};
    81 
    82 	#define ADMFLAG_RESERVATION			(1<<0)		/**< Convenience macro for Admin_Reservation as a FlagBit */
    83 	#define ADMFLAG_GENERIC				(1<<1)		/**< Convenience macro for Admin_Generic as a FlagBit */
    84 	#define ADMFLAG_KICK				(1<<2)		/**< Convenience macro for Admin_Kick as a FlagBit */
    85 	#define ADMFLAG_BAN					(1<<3)		/**< Convenience macro for Admin_Ban as a FlagBit */
    86 	#define ADMFLAG_UNBAN				(1<<4)		/**< Convenience macro for Admin_Unban as a FlagBit */
    87 	#define ADMFLAG_SLAY				(1<<5)		/**< Convenience macro for Admin_Slay as a FlagBit */
    88 	#define ADMFLAG_CHANGEMAP			(1<<6)		/**< Convenience macro for Admin_Changemap as a FlagBit */
    89 	#define ADMFLAG_CONVARS				(1<<7)		/**< Convenience macro for Admin_Convars as a FlagBit */
    90 	#define ADMFLAG_CONFIG				(1<<8)		/**< Convenience macro for Admin_Config as a FlagBit */
    91 	#define ADMFLAG_CHAT				(1<<9)		/**< Convenience macro for Admin_Chat as a FlagBit */
    92 	#define ADMFLAG_VOTE				(1<<10)		/**< Convenience macro for Admin_Vote as a FlagBit */
    93 	#define ADMFLAG_PASSWORD			(1<<11)		/**< Convenience macro for Admin_Password as a FlagBit */
    94 	#define ADMFLAG_RCON				(1<<12)		/**< Convenience macro for Admin_RCON as a FlagBit */
    95 	#define ADMFLAG_CHEATS				(1<<13)		/**< Convenience macro for Admin_Cheats as a FlagBit */
    96 	#define ADMFLAG_ROOT				(1<<14)		/**< Convenience macro for Admin_Root as a FlagBit */
    97 	#define ADMFLAG_CUSTOM1				(1<<15)		/**< Convenience macro for Admin_Custom1 as a FlagBit */
    98 	#define ADMFLAG_CUSTOM2				(1<<16)		/**< Convenience macro for Admin_Custom2 as a FlagBit */
    99 	#define ADMFLAG_CUSTOM3				(1<<17)		/**< Convenience macro for Admin_Custom3 as a FlagBit */
   100 	#define ADMFLAG_CUSTOM4				(1<<18)		/**< Convenience macro for Admin_Custom4 as a FlagBit */
   101 	#define ADMFLAG_CUSTOM5				(1<<19)		/**< Convenience macro for Admin_Custom5 as a FlagBit */
   102 	#define ADMFLAG_CUSTOM6				(1<<20)		/**< Convenience macro for Admin_Custom6 as a FlagBit */
   103 
   104 	/**
   105 	 * @brief Specifies which type of command to override (command or command group).
   106 	 */
   107 	enum OverrideType
   108 	{
   109 		Override_Command = 1,	/**< Command */
   110 		Override_CommandGroup,	/**< Command group */
   111 	};
   112 
   113 	/**
   114 	 * @brief Specifies how a command is overridden for a user group.
   115 	 */
   116 	enum OverrideRule
   117 	{
   118 		Command_Deny = 0,		/**< Deny access */
   119 		Command_Allow = 1,		/**< Allow access */
   120 	};
   121 
   122 	/**
   123 	 * @brief Specifies a generic immunity type.
   124 	 */
   125 	enum ImmunityType
   126 	{
   127 		Immunity_Default = 1,	/**< Immune from everyone with no immunity */
   128 		Immunity_Global,		/**< Immune from everyone (except root admins) */
   129 	};
   130 
   131 	/**
   132 	 * @brief Defines user access modes.
   133 	 */
   134 	enum AccessMode
   135 	{
   136 		Access_Real,		/**< Access the user has inherently */
   137 		Access_Effective,	/**< Access the user has from their groups */
   138 	};
   139 
   140 	/**
   141 	 * @brief Represents an index to one group.
   142 	 */
   143 	typedef int		GroupId;
   144 
   145 	/**
   146 	 * @brief Represents an index to one user entry.
   147 	 */
   148 	typedef int		AdminId;
   149 
   150 	/**
   151 	 * @brief Represents an invalid/nonexistant group or an erroneous operation.
   152 	 */
   153 	#define INVALID_GROUP_ID	-1
   154 
   155 	/**
   156 	 * @brief Represents an invalid/nonexistant user or an erroneous operation.
   157 	 */
   158 	#define INVALID_ADMIN_ID	-1
   159 
   160 	/**
   161 	 * @brief Represents the various cache regions.
   162 	 */
   163 	enum AdminCachePart
   164 	{
   165 		AdminCache_Overrides = 0,		/**< Global overrides */
   166 		AdminCache_Groups = 1,			/**< All groups (automatically invalidates admins too) */
   167 		AdminCache_Admins = 2,			/**< All admins */
   168 	};
   169 
   170 	/**
   171 	 * @brief Provides callbacks for admin cache operations.
   172 	 */
   173 	class IAdminListener
   174 	{
   175 	public:
   176 		virtual unsigned int GetInterfaceVersion()
   177 		{
   178 			return SMINTERFACE_ADMINSYS_VERSION;
   179 		}
   180 	public:
   181 		/**
   182 		 * @brief Called when the admin cache needs to be rebuilt.  
   183 		 *
   184 		 * @param auto_rebuild		True if this is being called because of a group rebuild.
   185 		 */
   186 		virtual void OnRebuildAdminCache(bool auto_rebuild) =0;
   187 
   188 		/**
   189 		 * @brief Called when the group cache needs to be rebuilt.
   190 		 */
   191 		virtual void OnRebuildGroupCache() =0;
   192 		
   193 		/**
   194 		 * @brief Called when the global override cache needs to be rebuilt.
   195 		 */
   196 		virtual void OnRebuildOverrideCache() =0;
   197 	};
   198 
   199 	typedef unsigned int FlagBits;
   200 
   201 	/**
   202 	 * @brief Provides functions for manipulating the admin options cache.
   203 	 */
   204 	class IAdminSystem : public SMInterface
   205 	{
   206 	public:
   207 		const char *GetInterfaceName()
   208 		{
   209 			return SMINTERFACE_ADMINSYS_NAME;
   210 		}
   211 		unsigned int GetInterfaceVersion()
   212 		{
   213 			return SMINTERFACE_ADMINSYS_VERSION;
   214 		}
   215 	public:
   216 		/**
   217 		 * @brief Adds a global command flag override.  Any command registered with this name
   218 		 * will assume the new flag.  This is applied retroactively as well.
   219 		 *
   220 		 * @param cmd			String containing command name (case sensitive).
   221 		 * @param type			Override type (specific command or group).
   222 		 * @param flags			New admin flag.
   223 		 */
   224 		virtual void AddCommandOverride(const char *cmd, OverrideType type, FlagBits flags) =0;
   225 
   226 		/**
   227 		 * @brief Returns a command override.
   228 		 *
   229 		 * @param cmd			String containing command name (case sensitive).
   230 		 * @param type			Override type (specific command or group).
   231 		 * @param pFlags		Optional pointer to the set flag.
   232 		 * @return				True if there is an override, false otherwise.
   233 		 */
   234 		virtual bool GetCommandOverride(const char *cmd, OverrideType type, FlagBits *pFlags) =0;
   235 
   236 		/**
   237 		 * @brief Unsets a command override.
   238 		 *
   239 		 * @param cmd			String containing command name (case sensitive).
   240 		 * @param type			Override type (specific command or group).
   241 		 */
   242 		virtual void UnsetCommandOverride(const char *cmd, OverrideType type) =0;
   243 
   244 		/**
   245 		 * @brief Adds a new group.  Name must be unique.
   246 		 *
   247 		 * @param group_name	String containing the group name.
   248 		 * @return				A new group id, INVALID_GROUP_ID if it already exists.
   249 		 */
   250 		virtual GroupId AddGroup(const char *group_name) =0;
   251 
   252 		/**
   253 		 * @brief Finds a group by name.
   254 		 *
   255 		 * @param group_name	String containing the group name.
   256 		 * @return				A group id, or INVALID_GROUP_ID if not found.
   257 		 */
   258 		virtual GroupId FindGroupByName(const char *group_name) =0;
   259 
   260 		/**
   261 		 * @brief Adds or removes a flag from a group's flag set.
   262 		 * Note: These are called "add flags" because they add to a user's flags.
   263 		 *
   264 		 * @param id			Group id.
   265 		 * @param flag			Admin flag to toggle.
   266 		 * @param enabled		True to set the flag, false to unset/disable.
   267 		 */
   268 		virtual void SetGroupAddFlag(GroupId id, AdminFlag flag, bool enabled) =0;
   269 
   270 		/**
   271 		 * @brief Gets the set value of an add flag on a group's flag set.
   272 		 *
   273 		 * @param id			Group id.
   274 		 * @param flag			Admin flag to retrieve.
   275 		 * @return				True if enabled, false otherwise,
   276 		 */
   277 		virtual bool GetGroupAddFlag(GroupId id, AdminFlag flag) =0;
   278 
   279 		/**
   280 		 * @brief Returns an array of flag bits that are added to a user from their group.
   281 		 * Note: These are called "add flags" because they add to a user's flags.
   282 		 *
   283 		 * @param id			GroupId of the group.
   284 		 * @return				Bit string containing the bits of each flag.
   285 		 */
   286 		virtual FlagBits GetGroupAddFlags(GroupId id) =0;
   287 
   288 		/**
   289 		 * @brief Toggles a generic immunity type.
   290 		 *
   291 		 * @param id			Group id.
   292 		 * @param type			Generic immunity type.
   293 		 * @param enabled		True to enable, false otherwise.
   294 		 */
   295 		virtual void SetGroupGenericImmunity(GroupId id, ImmunityType type, bool enabled) =0;
   296 
   297 		/**
   298 		 * @brief Returns whether or not a group has global immunity.
   299 		 *
   300 		 * @param id			Group id.
   301 		 * @param type			Generic immunity type.
   302 		 * @return				True if the group has this immunity, false otherwise.
   303 		 */
   304 		virtual bool GetGroupGenericImmunity(GroupId id, ImmunityType type) =0;
   305 
   306 		/**
   307 		 * @brief Adds immunity to a specific group.
   308 		 *
   309 		 * @param id			Group id.
   310 		 * @param other_id		Group id to receive immunity to.
   311 		 */
   312 		virtual void AddGroupImmunity(GroupId id, GroupId other_id) =0;
   313 
   314 		/**
   315 		 * @brief Returns the number of specific group immunities.
   316 		 *
   317 		 * @param id			Group id.
   318 		 * @return				Number of group immunities.
   319 		 */
   320 		virtual unsigned int GetGroupImmunityCount(GroupId id) =0;
   321 
   322 		/**
   323 		 * @brief Returns a group that this group is immune to given an index.
   324 		 *
   325 		 * @param id			Group id.
   326 		 * @param number		Index from 0 to N-1, from GetGroupImmunities().
   327 		 * @return				GroupId that this group is immune to.
   328 		 */
   329 		virtual GroupId GetGroupImmunity(GroupId id, unsigned int number) =0;
   330 
   331 		/**
   332 		 * @brief Adds a group-specific override type.
   333 		 *
   334 		 * @param id			Group id.
   335 		 * @param name			String containing command name (case sensitive).
   336 		 * @param type			Override type (specific command or group).
   337 		 * @param rule			Override allow/deny setting.
   338 		 */
   339 		virtual void AddGroupCommandOverride(GroupId id,
   340 											 const char *name,
   341 											 OverrideType type,
   342 											 OverrideRule rule) =0;
   343 
   344 		/**
   345 		 * @brief Retrieves a group-specific command override.
   346 		 *
   347 		 * @param id			Group id.
   348 		 * @param name			String containing command name (case sensitive).
   349 		 * @param type			Override type (specific command or group).
   350 		 * @param pRule			Optional pointer to store allow/deny setting.
   351 		 * @return				True if an override exists, false otherwise.
   352 		 */
   353 		virtual bool GetGroupCommandOverride(GroupId id,
   354 											 const char *name,
   355 											 OverrideType type,
   356 											 OverrideRule *pRule) =0;
   357 
   358 		/**
   359 		 * @brief Tells the admin system to dump a portion of the cache.  
   360 		 * This calls into plugin forwards to rebuild the cache.
   361 		 *
   362 		 * @param part			Portion of the cache to dump.
   363 		 * @param rebuild		If true, the rebuild forwards/events will fire.
   364 		 */
   365 		virtual void DumpAdminCache(AdminCachePart part, bool rebuild) =0;
   366 
   367 		/**
   368 		 * @brief Adds an admin interface listener.
   369 		 *
   370 		 * @param pListener		Pointer to an IAdminListener to add.
   371 		 */
   372 		virtual void AddAdminListener(IAdminListener *pListener) =0;
   373 
   374 		/**
   375 		 * @brief Removes an admin interface listener.
   376 		 *
   377 		 * @param pListener		Pointer to an IAdminListener to remove.
   378 		 */
   379 		virtual void RemoveAdminListener(IAdminListener *pListener) =0;
   380 
   381 		/**
   382 		 * @brief Registers an authentication identity type.
   383 		 * Note: Default types are "steam," "name," and "ip."
   384 		 *
   385 		 * @param name			String containing the type name.
   386 		 */
   387 		virtual void RegisterAuthIdentType(const char *name) =0;
   388 
   389 		/**
   390 		 * @brief Creates a new user entry.
   391 		 *
   392 		 * @param name		Name for this entry (does not have to be unique).
   393 		 *					Specify NULL for an anonymous admin.
   394 		 * @return			A new AdminId index.
   395 		 */
   396 		virtual AdminId CreateAdmin(const char *name) =0;
   397 
   398 		/**
   399 		 * @brief Gets an admin's user name.
   400 		 *
   401 		 * @param id		AdminId index for this admin.
   402 		 * @return			A string containing the admin's name, or NULL
   403 		 *					if the admin was created anonymously.
   404 		 */
   405 		virtual const char *GetAdminName(AdminId id) =0;
   406 
   407 		/**
   408 		 * @brief Binds a user entry to a particular auth method.
   409 		 * This bind must be unique.
   410 		 *
   411 		 * @param id		AdminId index of the admin.
   412 		 * @param auth		Auth method to use.
   413 		 * @param ident		Identity string to bind to.
   414 		 * @return			True on success, false if auth method was not found,
   415 		 *					id was invalid, or ident was already taken.
   416 		 */
   417 		virtual bool BindAdminIdentity(AdminId id, const char *auth, const char *ident) =0;
   418 
   419 		/**
   420 		 * @brief Sets whether or not a flag is enabled on an admin.
   421 		 *
   422 		 * @param id		AdminId index of the admin.
   423 		 * @param flag		Admin flag to use.
   424 		 * @param enabled	True to enable, false to disable.
   425 		 */
   426 		virtual void SetAdminFlag(AdminId id, AdminFlag flag, bool enabled) =0;
   427 
   428 		/**
   429 		 * @brief Returns whether or not a flag is enabled on an admin.
   430 		 *
   431 		 * @param id		AdminId index of the admin.
   432 		 * @param flag		Admin flag to use.
   433 		 * @param mode		Access mode to check.
   434 		 * @return			True if enabled, false otherwise.
   435 		 */
   436 		virtual bool GetAdminFlag(AdminId id, AdminFlag flag, AccessMode mode) =0;
   437 
   438 		/**
   439 		 * @brief Returns the bitstring of access flags on an admin.
   440 		 *
   441 		 * @param id		AdminId index of the admin.
   442 		 * @param mode		Access mode to use.
   443 		 * @return			A bit string containing which flags are enabled.
   444 		 */
   445 		virtual FlagBits GetAdminFlags(AdminId id, AccessMode mode) =0;
   446 
   447 		/**
   448 		 * @brief Sets the bitstring of access flags on an admin.
   449 		 *
   450 		 * @param id		AdminId index of the admin.
   451 		 * @param mode		Access mode to use (real affects both).
   452 		 * @param bits		Bitstring to set.
   453 		 */
   454 		virtual void SetAdminFlags(AdminId id, AccessMode mode, FlagBits bits) =0;
   455 
   456 		/**
   457 		 * @brief Adds a group to an admin's inherited group list.  
   458 		 * Any flags the group has will be added to the admin's effective flags.
   459 		 *
   460 		 * @param id		AdminId index of the admin.
   461 		 * @param gid		GroupId index of the group.
   462 		 * @return			True on success, false on invalid input or duplicate membership.
   463 		 */
   464 		virtual bool AdminInheritGroup(AdminId id, GroupId gid) =0;
   465 
   466 		/**
   467 		 * @brief Returns the number of groups this admin is a member of.
   468 		 * 
   469 		 * @param id		AdminId index of the admin.
   470 		 * @return			Number of groups this admin is a member of.
   471 		 */
   472 		virtual unsigned int GetAdminGroupCount(AdminId id) =0;
   473 
   474 		/**
   475 		 * @brief Returns group information from an admin.
   476 		 *
   477 		 * @param id		AdminId index of the admin.
   478 		 * @param index		Group number to retrieve, from 0 to N-1, where N
   479 		 *					is the value of GetAdminGroupCount(id).
   480 		 * @param name		Optional pointer to store the group's name.
   481 		 * @return			A GroupId index and a name pointer, or
   482 		 *					INVALID_GROUP_ID and NULL if an error occurred.
   483 		 */
   484 		virtual GroupId GetAdminGroup(AdminId id, unsigned int index, const char **name) =0;
   485 		
   486 		/**
   487 		 * @brief Sets a password on an admin.
   488 		 *
   489 		 * @param id		AdminId index of the admin.
   490 		 * @param passwd	String containing the password.
   491 		 */
   492 		virtual void SetAdminPassword(AdminId id, const char *password) =0;
   493 
   494 		/**
   495 		 * @brief Gets an admin's password.
   496 		 *
   497 		 * @param id		AdminId index of the admin.
   498 		 * @return			Password of the admin, or NULL if none.
   499 		 */
   500 		virtual const char *GetAdminPassword(AdminId id) =0;
   501 		
   502 		/**
   503 		 * @brief Attempts to find an admin by an auth method and an identity.
   504 		 *
   505 		 * @param auth		Auth method to try.
   506 		 * @param identity	Identity string to look up.
   507 		 * @return			An AdminId index if found, INVALID_ADMIN_ID otherwise.
   508 		 */
   509 		virtual AdminId FindAdminByIdentity(const char *auth, const char *identity) =0;
   510 
   511 		/**
   512 		 * @brief Invalidates an admin from the cache so its resources can be re-used.
   513 		 *
   514 		 * @param id		AdminId index to invalidate.
   515 		 * @return			True on success, false otherwise.
   516 		 */
   517 		virtual bool InvalidateAdmin(AdminId id) =0;
   518 
   519 		/**
   520 		 * @brief Converts a flag bit string to a bit array.
   521 		 *
   522 		 * @param bits		Bit string containing the flags.
   523 		 * @param array		Array to write the flags to.  Enabled flags will be 'true'.
   524 		 * @param maxSize	Maximum number of flags the array can store.
   525 		 * @return			Number of flags written.
   526 		 */
   527 		virtual unsigned int FlagBitsToBitArray(FlagBits bits, bool array[], unsigned int maxSize) =0;
   528 
   529 		/**
   530 		 * @brief Converts a flag array to a bit string.
   531 		 *
   532 		 * @param array		Array containing true or false for each AdminFlag.
   533 		 * @param maxSize	Maximum size of the flag array.
   534 		 * @return			A bit string composed of the array bits.
   535 		 */
   536 		virtual FlagBits FlagBitArrayToBits(const bool array[], unsigned int maxSize) =0;
   537 
   538 		/**
   539 		 * @brief Converts an array of flags to bits.
   540 		 *
   541 		 * @param array		Array containing flags that are enabled.
   542 		 * @param numFlags	Number of flags in the array.
   543 		 * @return			A bit string composed of the array flags.
   544 		 */
   545 		virtual FlagBits FlagArrayToBits(const AdminFlag array[], unsigned int numFlags) =0;
   546 
   547 		/**
   548 		 * @brief Converts a bit string to an array of flags.
   549 		 *
   550 		 * @param bits		Bit string containing the flags.
   551 		 * @param array		Output array to write flags.
   552 		 * @param maxSize	Maximum size of the flag array.
   553 		 * @return			Number of flags written.
   554 		 */
   555 		virtual unsigned int FlagBitsToArray(FlagBits bits, AdminFlag array[], unsigned int maxSize) =0;
   556 
   557 		/**
   558 		 * @brief Checks whether a user has access to a given set of flag bits.
   559 		 * Note: This is a wrapper around GetAdminFlags().
   560 		 *
   561 		 * @param id		AdminId index of admin.
   562 		 * @param flags		Bitstring containing the permissions to check.
   563 		 * @return			True if user has permission, false otherwise.
   564 		 */
   565 		virtual bool CheckAdminFlags(AdminId id, FlagBits bits) =0;
   566 
   567 		/**
   568 		 * @brief Checks whether an AdminId can target another AdminId.
   569 		 * 
   570 		 * Zeroth, if the targeting AdminId is INVALID_ADMIN_ID, targeting fails.
   571 		 * First, if the targetted AdminId is INVALID_ADMIN_ID, targeting succeeds.
   572 		 * Second, if the targeting admin is root, targeting suceeds.
   573 		 * Third, if the targetted admin has global immunity, targeting fails.
   574 		 * Fourth, if the targetted admin has default immunity,
   575 		 *  and the admin belongs to no groups, targeting fails.
   576 		 * Fifth, if the targetted admin has specific immunity from the
   577 		 *  targeting admin via group immunities, targeting fails.
   578 		 * Sixth, targeting succeeds if it passes these tests.
   579 		 *
   580 		 * @param id		AdminId index of admin doing the targeting.  Can be INVALID_ADMIN_ID.
   581 		 * @param target	AdminId index of the target admin.  Can be INVALID_ADMIN_ID.
   582 		 * @return			True if this admin has permission to target the other admin.
   583 		 */
   584 		virtual bool CanAdminTarget(AdminId id, AdminId target) =0;
   585 	};
   586 }
   587 
   588 #endif //_INCLUDE_SOURCEMOD_ADMINISTRATION_SYSTEM_H_