core/AdminCache.h
author Nicholas Hastings <skamonkey@gmail.com>
Fri Aug 30 14:15:02 2013 -0400 (2013-08-30)
changeset 4102 0eb66c45a884
parent 4081 241d291414e9
permissions -rw-r--r--
Reserved slot fixes for OB games when SourceTV or Replay are enabled (bug 5499, r=drifter).
dvander@370
     1
/**
dvander@4077
     2
 * vim: set ts=4 sw=4 tw=99 noet :
ds@1330
     3
 * =============================================================================
dvander@1231
     4
 * SourceMod
ds@1947
     5
 * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved.
ds@1330
     6
 * =============================================================================
dvander@370
     7
 *
ds@1330
     8
 * This program is free software; you can redistribute it and/or modify it under
ds@1330
     9
 * the terms of the GNU General Public License, version 3.0, as published by the
ds@1330
    10
 * Free Software Foundation.
dvander@1231
    11
 * 
ds@1330
    12
 * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1330
    13
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1330
    14
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ds@1330
    15
 * details.
dvander@1231
    16
 *
ds@1330
    17
 * You should have received a copy of the GNU General Public License along with
ds@1330
    18
 * this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@1231
    19
 *
ds@1330
    20
 * As a special exception, AlliedModders LLC gives you permission to link the
ds@1330
    21
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1330
    22
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1330
    23
 * by the Valve Corporation.  You must obey the GNU General Public License in
ds@1330
    24
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ds@1330
    25
 * this exception to all derivative works.  AlliedModders LLC defines further
ds@1330
    26
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1330
    27
 * or <http://www.sourcemod.net/license.php>.
dvander@370
    28
 *
dvander@370
    29
 * Version: $Id$
dvander@370
    30
 */
dvander@370
    31
dvander@335
    32
#ifndef _INCLUDE_SOURCEMOD_ADMINCACHE_H_
dvander@335
    33
#define _INCLUDE_SOURCEMOD_ADMINCACHE_H_
dvander@335
    34
dvander@335
    35
#include "sm_memtable.h"
dvander@335
    36
#include <sm_trie.h>
dvander@336
    37
#include <sh_list.h>
dvander@404
    38
#include <sh_string.h>
dvander@335
    39
#include <IAdminSystem.h>
dvander@335
    40
#include "sm_globals.h"
dvander@336
    41
#include <IForwardSys.h>
dvander@4081
    42
#include <sm_stringhashmap.h>
dvander@4081
    43
#include <sm_namehashset.h>
dvander@336
    44
dvander@336
    45
using namespace SourceHook;
dvander@335
    46
dvander@335
    47
#define GRP_MAGIC_SET		0xDEADFADE
dvander@335
    48
#define GRP_MAGIC_UNSET		0xFACEFACE
dvander@404
    49
#define USR_MAGIC_SET		0xDEADFACE
dvander@404
    50
#define USR_MAGIC_UNSET		0xFADEDEAD
dvander@335
    51
dvander@4081
    52
typedef StringHashMap<OverrideRule> OverrideMap;
dvander@4081
    53
dvander@335
    54
struct AdminGroup
dvander@335
    55
{
dvander@335
    56
	uint32_t magic;					/* Magic flag, for memory validation (ugh) */
dvander@1403
    57
	unsigned int immunity_level;	/* Immunity level */
ds@729
    58
	/* Immune from target table (-1 = nonexistent)
dvander@335
    59
	 * [0] = number of entries
dvander@335
    60
	 * [1...N] = immune targets
dvander@335
    61
	 */
dvander@335
    62
	int immune_table;			
dvander@4081
    63
	OverrideMap *pCmdTable;			/* Command override table (can be NULL) */
dvander@4081
    64
	OverrideMap *pCmdGrpTable;		/* Command group override table (can be NULL) */
dvander@335
    65
	int next_grp;					/* Next group in the chain */
dvander@335
    66
	int prev_grp;					/* Previous group in the chain */
dvander@335
    67
	int nameidx;					/* Name */
dvander@433
    68
	FlagBits addflags;				/* Additive flags */
dvander@335
    69
};
dvander@335
    70
dvander@404
    71
struct AuthMethod
dvander@404
    72
{
dvander@404
    73
	String name;
dvander@4081
    74
	StringHashMap<AdminId> identities;
dvander@4081
    75
dvander@4081
    76
	AuthMethod(const char *name)
dvander@4081
    77
		: name(name)
dvander@4081
    78
	{
dvander@4081
    79
	}
dvander@4081
    80
dvander@4081
    81
	static inline bool matches(const char *name, const AuthMethod *method)
dvander@4081
    82
	{
dvander@4081
    83
		return strcmp(name, method->name.c_str()) == 0;
dvander@4081
    84
	}
dvander@404
    85
};
dvander@404
    86
dvander@404
    87
struct UserAuth
dvander@404
    88
{
dvander@404
    89
	unsigned int index;				/* Index into auth table */
dvander@404
    90
	int identidx;					/* Index into the string table */
dvander@404
    91
};
dvander@404
    92
dvander@404
    93
struct AdminUser
dvander@404
    94
{
dvander@433
    95
	uint32_t magic;					/* Magic flag, for memory validation */
dvander@433
    96
	FlagBits flags;					/* Flags */
dvander@433
    97
	FlagBits eflags;				/* Effective flags */
dvander@404
    98
	int nameidx;					/* Name index */
dvander@404
    99
	int password;					/* Password index */
dvander@404
   100
	unsigned int grp_count;			/* Number of groups */
dvander@404
   101
	unsigned int grp_size;			/* Size of groups table */
dvander@404
   102
	int grp_table;					/* Group table itself */
ds@729
   103
	int next_user;					/* Next user in the list */
ds@729
   104
	int prev_user;					/* Previous user in the list */
dvander@405
   105
	UserAuth auth;					/* Auth method for this user */
dvander@1403
   106
	unsigned int immunity_level;	/* Immunity level */
dvander@1349
   107
	unsigned int serialchange;		/* Serial # for changes */
dvander@404
   108
};
dvander@404
   109
dvander@335
   110
class AdminCache : 
dvander@335
   111
	public IAdminSystem,
dvander@335
   112
	public SMGlobalClass
dvander@335
   113
{
dvander@335
   114
public:
dvander@335
   115
	AdminCache();
dvander@335
   116
	~AdminCache();
dvander@335
   117
public: //SMGlobalClass
dvander@404
   118
	void OnSourceModStartup(bool late);
dvander@335
   119
	void OnSourceModAllInitialized();
dvander@1298
   120
	void OnSourceModLevelChange(const char *mapName);
dvander@336
   121
	void OnSourceModShutdown();
dvander@673
   122
	void OnSourceModPluginsLoaded();
dvander@335
   123
public: //IAdminSystem
dvander@335
   124
	/** Command cache stuff */
dvander@433
   125
	void AddCommandOverride(const char *cmd, OverrideType type, FlagBits flags);
dvander@433
   126
	bool GetCommandOverride(const char *cmd, OverrideType type, FlagBits *flags);
dvander@335
   127
	void UnsetCommandOverride(const char *cmd, OverrideType type);
dvander@335
   128
	/** Group cache stuff */
dvander@335
   129
	GroupId AddGroup(const char *group_name);
dvander@335
   130
	GroupId FindGroupByName(const char *group_name);
dvander@335
   131
	void SetGroupAddFlag(GroupId id, AdminFlag flag, bool enabled);
dvander@335
   132
	bool GetGroupAddFlag(GroupId id, AdminFlag flag);
dvander@433
   133
	FlagBits GetGroupAddFlags(GroupId id);
dvander@335
   134
	void SetGroupGenericImmunity(GroupId id, ImmunityType type, bool enabled);
dvander@335
   135
	bool GetGroupGenericImmunity(GroupId id, ImmunityType type);
dvander@335
   136
	void InvalidateGroup(GroupId id);
dvander@335
   137
	void AddGroupImmunity(GroupId id, GroupId other_id);
dvander@335
   138
	unsigned int GetGroupImmunityCount(GroupId id);
dvander@335
   139
	GroupId GetGroupImmunity(GroupId id, unsigned int number);
dvander@335
   140
	void AddGroupCommandOverride(GroupId id, const char *name, OverrideType type, OverrideRule rule);
dvander@335
   141
	bool GetGroupCommandOverride(GroupId id, const char *name, OverrideType type, OverrideRule *pRule);
dvander@438
   142
	void DumpAdminCache(AdminCachePart part, bool rebuild);
dvander@336
   143
	void AddAdminListener(IAdminListener *pListener);
dvander@336
   144
	void RemoveAdminListener(IAdminListener *pListener);
dvander@404
   145
	/** User stuff */
dvander@404
   146
	void RegisterAuthIdentType(const char *name);
dvander@404
   147
	AdminId CreateAdmin(const char *name);
dvander@404
   148
	const char *GetAdminName(AdminId id);
dvander@404
   149
	bool BindAdminIdentity(AdminId id, const char *auth, const char *ident);
dvander@404
   150
	virtual void SetAdminFlag(AdminId id, AdminFlag flag, bool enabled);
dvander@404
   151
	bool GetAdminFlag(AdminId id, AdminFlag flag, AccessMode mode);
dvander@433
   152
	FlagBits GetAdminFlags(AdminId id, AccessMode mode);
dvander@404
   153
	bool AdminInheritGroup(AdminId id, GroupId gid);
dvander@404
   154
	unsigned int GetAdminGroupCount(AdminId id);
dvander@404
   155
	GroupId GetAdminGroup(AdminId id, unsigned int index, const char **name);
dvander@404
   156
	void SetAdminPassword(AdminId id, const char *password);
dvander@404
   157
	const char *GetAdminPassword(AdminId id);
dvander@404
   158
	AdminId FindAdminByIdentity(const char *auth, const char *identity);
dvander@404
   159
	bool InvalidateAdmin(AdminId id);
dvander@433
   160
	unsigned int FlagBitsToBitArray(FlagBits bits, bool array[], unsigned int maxSize);
dvander@433
   161
	FlagBits FlagBitArrayToBits(const bool array[], unsigned int maxSize);
dvander@433
   162
	FlagBits FlagArrayToBits(const AdminFlag array[], unsigned int numFlags);
dvander@433
   163
	unsigned int FlagBitsToArray(FlagBits bits, AdminFlag array[], unsigned int maxSize);
dvander@434
   164
	bool CheckAdminFlags(AdminId id, FlagBits bits);
dvander@434
   165
	bool CanAdminTarget(AdminId id, AdminId target);
dvander@458
   166
	void SetAdminFlags(AdminId id, AccessMode mode, FlagBits bits);
dvander@1298
   167
	bool FindFlag(const char *str, AdminFlag *pFlag);
dvander@1298
   168
	bool FindFlag(char c, AdminFlag *pAdmFlag);
dvander@1298
   169
	FlagBits ReadFlagString(const char *flags, const char **end);
dvander@1965
   170
	size_t FillFlagString(FlagBits bits, char *buffer, size_t maxlen);
dvander@1349
   171
	unsigned int GetAdminSerialChange(AdminId id);
dvander@1349
   172
	bool CanAdminUseCommand(int client, const char *cmd);
dvander@1356
   173
	const char *GetGroupName(GroupId gid);
dvander@1473
   174
	unsigned int SetGroupImmunityLevel(GroupId gid, unsigned int level);
dvander@1473
   175
	unsigned int GetGroupImmunityLevel(GroupId gid);
dvander@1473
   176
	unsigned int SetAdminImmunityLevel(AdminId id, unsigned int level);
dvander@1473
   177
	unsigned int GetAdminImmunityLevel(AdminId id);
dvander@1473
   178
	bool CheckAccess(int client, 
dvander@1473
   179
		const char *cmd, 
dvander@1477
   180
		FlagBits flags, 
dvander@1473
   181
		bool override_only);
dvander@1965
   182
	bool FindFlagChar(AdminFlag flag, char *c);
dvander@458
   183
public:
dvander@458
   184
	bool IsValidAdmin(AdminId id);
dvander@1965
   185
	void DumpCache(FILE *fp);
dvander@1965
   186
	AdminGroup *GetGroup(GroupId gid);
dvander@1965
   187
	AdminUser *GetUser(AdminId id);
dvander@1965
   188
	const char *GetString(int idx);
dvander@335
   189
private:
dvander@335
   190
	void _UnsetCommandOverride(const char *cmd);
dvander@335
   191
	void _UnsetCommandGroupOverride(const char *group);
dvander@336
   192
	void InvalidateGroupCache();
dvander@404
   193
	void InvalidateAdminCache(bool unlink_admins);
dvander@336
   194
	void DumpCommandOverrideCache(OverrideType type);
dvander@4081
   195
	AuthMethod *GetMethodByIndex(unsigned int index);
dvander@405
   196
	bool GetMethodIndex(const char *name, unsigned int *_index);
dvander@1965
   197
	const char *GetMethodName(unsigned int index);
dvander@1298
   198
	void NameFlag(const char *str, AdminFlag flag);
dvander@335
   199
public:
dvander@4081
   200
	typedef StringHashMap<FlagBits> FlagMap;
dvander@4081
   201
dvander@335
   202
	BaseStringTable *m_pStrings;
dvander@335
   203
	BaseMemTable *m_pMemory;
dvander@4081
   204
	FlagMap m_CmdOverrides;
dvander@4081
   205
	FlagMap m_CmdGrpOverrides;
dvander@335
   206
	int m_FirstGroup;
dvander@335
   207
	int m_LastGroup;
dvander@335
   208
	int m_FreeGroupList;
dvander@4081
   209
	StringHashMap<GroupId> m_Groups;
dvander@336
   210
	List<IAdminListener *> m_hooks;
dvander@4081
   211
	List<AuthMethod *> m_AuthMethods;
dvander@4081
   212
	NameHashSet<AuthMethod *> m_AuthTables;
dvander@336
   213
	IForward *m_pCacheFwd;
dvander@404
   214
	int m_FirstUser;
dvander@404
   215
	int m_LastUser;
dvander@404
   216
	int m_FreeUserList;
dvander@458
   217
	bool m_InvalidatingAdmins;
dvander@520
   218
	bool m_destroying;
dvander@4081
   219
	StringHashMap<AdminFlag> m_LevelNames;
dvander@335
   220
};
dvander@335
   221
dvander@335
   222
extern AdminCache g_Admins;
dvander@335
   223
dvander@335
   224
#endif //_INCLUDE_SOURCEMOD_ADMINCACHE_H_