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