core/AdminCache.h
author "David Anderson <dvander@alliedmods.net>
Thu May 14 11:38:50 2009 -0400 (2009-05-14)
changeset 2730 a2ff0a7a1c53
parent 2289 44045ead61cd
child 4077 01e607ae37f0
permissions -rw-r--r--
Moved smn_functions to logic binary.
dvander@370
     1
/**
dvander@407
     2
 * vim: set ts=4 :
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@336
    42
dvander@336
    43
using namespace SourceHook;
dvander@335
    44
dvander@335
    45
#define GRP_MAGIC_SET		0xDEADFADE
dvander@335
    46
#define GRP_MAGIC_UNSET		0xFACEFACE
dvander@404
    47
#define USR_MAGIC_SET		0xDEADFACE
dvander@404
    48
#define USR_MAGIC_UNSET		0xFADEDEAD
dvander@335
    49
dvander@335
    50
struct AdminGroup
dvander@335
    51
{
dvander@335
    52
	uint32_t magic;					/* Magic flag, for memory validation (ugh) */
dvander@1403
    53
	unsigned int immunity_level;	/* Immunity level */
ds@729
    54
	/* Immune from target table (-1 = nonexistent)
dvander@335
    55
	 * [0] = number of entries
dvander@335
    56
	 * [1...N] = immune targets
dvander@335
    57
	 */
dvander@335
    58
	int immune_table;			
dvander@335
    59
	Trie *pCmdTable;				/* Command override table (can be NULL) */
dvander@335
    60
	Trie *pCmdGrpTable;				/* Command group override table (can be NULL) */
dvander@335
    61
	int next_grp;					/* Next group in the chain */
dvander@335
    62
	int prev_grp;					/* Previous group in the chain */
dvander@335
    63
	int nameidx;					/* Name */
dvander@433
    64
	FlagBits addflags;				/* Additive flags */
dvander@335
    65
};
dvander@335
    66
dvander@404
    67
struct AuthMethod
dvander@404
    68
{
dvander@404
    69
	String name;
dvander@404
    70
	Trie *table;
dvander@404
    71
};
dvander@404
    72
dvander@404
    73
struct UserAuth
dvander@404
    74
{
dvander@404
    75
	unsigned int index;				/* Index into auth table */
dvander@404
    76
	int identidx;					/* Index into the string table */
dvander@404
    77
};
dvander@404
    78
dvander@404
    79
struct AdminUser
dvander@404
    80
{
dvander@433
    81
	uint32_t magic;					/* Magic flag, for memory validation */
dvander@433
    82
	FlagBits flags;					/* Flags */
dvander@433
    83
	FlagBits eflags;				/* Effective flags */
dvander@404
    84
	int nameidx;					/* Name index */
dvander@404
    85
	int password;					/* Password index */
dvander@404
    86
	unsigned int grp_count;			/* Number of groups */
dvander@404
    87
	unsigned int grp_size;			/* Size of groups table */
dvander@404
    88
	int grp_table;					/* Group table itself */
ds@729
    89
	int next_user;					/* Next user in the list */
ds@729
    90
	int prev_user;					/* Previous user in the list */
dvander@405
    91
	UserAuth auth;					/* Auth method for this user */
dvander@1403
    92
	unsigned int immunity_level;	/* Immunity level */
dvander@1349
    93
	unsigned int serialchange;		/* Serial # for changes */
dvander@404
    94
};
dvander@404
    95
dvander@335
    96
class AdminCache : 
dvander@335
    97
	public IAdminSystem,
dvander@335
    98
	public SMGlobalClass
dvander@335
    99
{
dvander@335
   100
public:
dvander@335
   101
	AdminCache();
dvander@335
   102
	~AdminCache();
dvander@335
   103
public: //SMGlobalClass
dvander@404
   104
	void OnSourceModStartup(bool late);
dvander@335
   105
	void OnSourceModAllInitialized();
dvander@1298
   106
	void OnSourceModLevelChange(const char *mapName);
dvander@336
   107
	void OnSourceModShutdown();
dvander@673
   108
	void OnSourceModPluginsLoaded();
dvander@335
   109
public: //IAdminSystem
dvander@335
   110
	/** Command cache stuff */
dvander@433
   111
	void AddCommandOverride(const char *cmd, OverrideType type, FlagBits flags);
dvander@433
   112
	bool GetCommandOverride(const char *cmd, OverrideType type, FlagBits *flags);
dvander@335
   113
	void UnsetCommandOverride(const char *cmd, OverrideType type);
dvander@335
   114
	/** Group cache stuff */
dvander@335
   115
	GroupId AddGroup(const char *group_name);
dvander@335
   116
	GroupId FindGroupByName(const char *group_name);
dvander@335
   117
	void SetGroupAddFlag(GroupId id, AdminFlag flag, bool enabled);
dvander@335
   118
	bool GetGroupAddFlag(GroupId id, AdminFlag flag);
dvander@433
   119
	FlagBits GetGroupAddFlags(GroupId id);
dvander@335
   120
	void SetGroupGenericImmunity(GroupId id, ImmunityType type, bool enabled);
dvander@335
   121
	bool GetGroupGenericImmunity(GroupId id, ImmunityType type);
dvander@335
   122
	void InvalidateGroup(GroupId id);
dvander@335
   123
	void AddGroupImmunity(GroupId id, GroupId other_id);
dvander@335
   124
	unsigned int GetGroupImmunityCount(GroupId id);
dvander@335
   125
	GroupId GetGroupImmunity(GroupId id, unsigned int number);
dvander@335
   126
	void AddGroupCommandOverride(GroupId id, const char *name, OverrideType type, OverrideRule rule);
dvander@335
   127
	bool GetGroupCommandOverride(GroupId id, const char *name, OverrideType type, OverrideRule *pRule);
dvander@438
   128
	void DumpAdminCache(AdminCachePart part, bool rebuild);
dvander@336
   129
	void AddAdminListener(IAdminListener *pListener);
dvander@336
   130
	void RemoveAdminListener(IAdminListener *pListener);
dvander@404
   131
	/** User stuff */
dvander@404
   132
	void RegisterAuthIdentType(const char *name);
dvander@404
   133
	AdminId CreateAdmin(const char *name);
dvander@404
   134
	const char *GetAdminName(AdminId id);
dvander@404
   135
	bool BindAdminIdentity(AdminId id, const char *auth, const char *ident);
dvander@404
   136
	virtual void SetAdminFlag(AdminId id, AdminFlag flag, bool enabled);
dvander@404
   137
	bool GetAdminFlag(AdminId id, AdminFlag flag, AccessMode mode);
dvander@433
   138
	FlagBits GetAdminFlags(AdminId id, AccessMode mode);
dvander@404
   139
	bool AdminInheritGroup(AdminId id, GroupId gid);
dvander@404
   140
	unsigned int GetAdminGroupCount(AdminId id);
dvander@404
   141
	GroupId GetAdminGroup(AdminId id, unsigned int index, const char **name);
dvander@404
   142
	void SetAdminPassword(AdminId id, const char *password);
dvander@404
   143
	const char *GetAdminPassword(AdminId id);
dvander@404
   144
	AdminId FindAdminByIdentity(const char *auth, const char *identity);
dvander@404
   145
	bool InvalidateAdmin(AdminId id);
dvander@433
   146
	unsigned int FlagBitsToBitArray(FlagBits bits, bool array[], unsigned int maxSize);
dvander@433
   147
	FlagBits FlagBitArrayToBits(const bool array[], unsigned int maxSize);
dvander@433
   148
	FlagBits FlagArrayToBits(const AdminFlag array[], unsigned int numFlags);
dvander@433
   149
	unsigned int FlagBitsToArray(FlagBits bits, AdminFlag array[], unsigned int maxSize);
dvander@434
   150
	bool CheckAdminFlags(AdminId id, FlagBits bits);
dvander@434
   151
	bool CanAdminTarget(AdminId id, AdminId target);
dvander@458
   152
	void SetAdminFlags(AdminId id, AccessMode mode, FlagBits bits);
dvander@1298
   153
	bool FindFlag(const char *str, AdminFlag *pFlag);
dvander@1298
   154
	bool FindFlag(char c, AdminFlag *pAdmFlag);
dvander@1298
   155
	FlagBits ReadFlagString(const char *flags, const char **end);
dvander@1965
   156
	size_t FillFlagString(FlagBits bits, char *buffer, size_t maxlen);
dvander@1349
   157
	unsigned int GetAdminSerialChange(AdminId id);
dvander@1349
   158
	bool CanAdminUseCommand(int client, const char *cmd);
dvander@1356
   159
	const char *GetGroupName(GroupId gid);
dvander@1473
   160
	unsigned int SetGroupImmunityLevel(GroupId gid, unsigned int level);
dvander@1473
   161
	unsigned int GetGroupImmunityLevel(GroupId gid);
dvander@1473
   162
	unsigned int SetAdminImmunityLevel(AdminId id, unsigned int level);
dvander@1473
   163
	unsigned int GetAdminImmunityLevel(AdminId id);
dvander@1473
   164
	bool CheckAccess(int client, 
dvander@1473
   165
		const char *cmd, 
dvander@1477
   166
		FlagBits flags, 
dvander@1473
   167
		bool override_only);
dvander@1965
   168
	bool FindFlagChar(AdminFlag flag, char *c);
dvander@458
   169
public:
dvander@458
   170
	bool IsValidAdmin(AdminId id);
dvander@1965
   171
	void DumpCache(FILE *fp);
dvander@1965
   172
	AdminGroup *GetGroup(GroupId gid);
dvander@1965
   173
	AdminUser *GetUser(AdminId id);
dvander@1965
   174
	const char *GetString(int idx);
dvander@335
   175
private:
dvander@335
   176
	void _UnsetCommandOverride(const char *cmd);
dvander@335
   177
	void _UnsetCommandGroupOverride(const char *group);
dvander@336
   178
	void InvalidateGroupCache();
dvander@404
   179
	void InvalidateAdminCache(bool unlink_admins);
dvander@336
   180
	void DumpCommandOverrideCache(OverrideType type);
dvander@404
   181
	Trie *GetMethodByIndex(unsigned int index);
dvander@405
   182
	bool GetMethodIndex(const char *name, unsigned int *_index);
dvander@1965
   183
	const char *GetMethodName(unsigned int index);
dvander@1298
   184
	void NameFlag(const char *str, AdminFlag flag);
dvander@335
   185
public:
dvander@335
   186
	BaseStringTable *m_pStrings;
dvander@335
   187
	BaseMemTable *m_pMemory;
dvander@335
   188
	Trie *m_pCmdOverrides;
dvander@335
   189
	Trie *m_pCmdGrpOverrides;
dvander@335
   190
	int m_FirstGroup;
dvander@335
   191
	int m_LastGroup;
dvander@335
   192
	int m_FreeGroupList;
dvander@335
   193
	Trie *m_pGroups;
dvander@336
   194
	List<IAdminListener *> m_hooks;
dvander@404
   195
	List<AuthMethod> m_AuthMethods;
dvander@404
   196
	Trie *m_pAuthTables;
dvander@336
   197
	IForward *m_pCacheFwd;
dvander@404
   198
	int m_FirstUser;
dvander@404
   199
	int m_LastUser;
dvander@404
   200
	int m_FreeUserList;
dvander@458
   201
	bool m_InvalidatingAdmins;
dvander@520
   202
	bool m_destroying;
dvander@1298
   203
	Trie *m_pLevelNames;
dvander@335
   204
};
dvander@335
   205
dvander@335
   206
extern AdminCache g_Admins;
dvander@335
   207
dvander@335
   208
#endif //_INCLUDE_SOURCEMOD_ADMINCACHE_H_