core/AdminCache.h
author Phong Dang <teame06@gmail.com>
Wed Aug 01 07:29:40 2007 +0000 (2007-08-01)
changeset 1241 2e8046793bc9
parent 1231 17badaf66ce4
child 1298 9cddbed74581
permissions -rw-r--r--
Added check to make sure player are alive to perform sm_slap, sm_burn, sm_slay.
dvander@370
     1
/**
dvander@407
     2
 * vim: set ts=4 :
dvander@1231
     3
 * ================================================================
dvander@1231
     4
 * SourceMod
dvander@1231
     5
 * Copyright (C) 2004-2007 AlliedModders LLC.  All rights reserved.
dvander@1231
     6
 * ================================================================
dvander@370
     7
 *
dvander@1231
     8
 * This program is free software; you can redistribute it and/or 
dvander@1231
     9
 * modify it under the terms of the GNU General Public License, 
dvander@1231
    10
 * version 3.0, as published by the Free Software Foundation.
dvander@1231
    11
 * 
dvander@1231
    12
 * This program is distributed in the hope that it will be useful,
dvander@1231
    13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
dvander@1231
    14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
dvander@1231
    15
 * GNU General Public License for more details.
dvander@1231
    16
 *
dvander@1231
    17
 * You should have received a copy of the GNU General Public License
dvander@1231
    18
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@1231
    19
 *
dvander@1231
    20
 * As a special exception, AlliedModders LLC gives you permission to 
dvander@1231
    21
 * link the code of this program (as well as its derivative works) to 
dvander@1231
    22
 * "Half-Life 2," the "Source Engine," the "SourcePawn JIT," and any 
dvander@1231
    23
 * Game MODs that run on software by the Valve Corporation.  You must 
dvander@1231
    24
 * obey the GNU General Public License in all respects for all other 
dvander@1231
    25
 * code used. Additionally, AlliedModders LLC grants this exception 
dvander@1231
    26
 * to all derivative works. AlliedModders LLC defines further 
dvander@1231
    27
 * exceptions, found in LICENSE.txt (as of this writing, version 
dvander@1231
    28
 * JULY-31-2007), or <http://www.sourcemod.net/license.php>.
dvander@370
    29
 *
dvander@370
    30
 * Version: $Id$
dvander@370
    31
 */
dvander@370
    32
dvander@335
    33
#ifndef _INCLUDE_SOURCEMOD_ADMINCACHE_H_
dvander@335
    34
#define _INCLUDE_SOURCEMOD_ADMINCACHE_H_
dvander@335
    35
dvander@335
    36
#include "sm_memtable.h"
dvander@335
    37
#include <sm_trie.h>
dvander@336
    38
#include <sh_list.h>
dvander@404
    39
#include <sh_string.h>
dvander@335
    40
#include <IAdminSystem.h>
dvander@335
    41
#include "sm_globals.h"
dvander@336
    42
#include <IForwardSys.h>
dvander@336
    43
dvander@336
    44
using namespace SourceHook;
dvander@335
    45
dvander@335
    46
#define GRP_MAGIC_SET		0xDEADFADE
dvander@335
    47
#define GRP_MAGIC_UNSET		0xFACEFACE
dvander@404
    48
#define USR_MAGIC_SET		0xDEADFACE
dvander@404
    49
#define USR_MAGIC_UNSET		0xFADEDEAD
dvander@335
    50
dvander@335
    51
struct AdminGroup
dvander@335
    52
{
dvander@335
    53
	uint32_t magic;					/* Magic flag, for memory validation (ugh) */
dvander@335
    54
	bool immune_global;				/* Global immunity? */
dvander@335
    55
	bool immune_default;			/* Default immunity? */
ds@729
    56
	/* Immune from target table (-1 = nonexistent)
dvander@335
    57
	 * [0] = number of entries
dvander@335
    58
	 * [1...N] = immune targets
dvander@335
    59
	 */
dvander@335
    60
	int immune_table;			
dvander@335
    61
	Trie *pCmdTable;				/* Command override table (can be NULL) */
dvander@335
    62
	Trie *pCmdGrpTable;				/* Command group override table (can be NULL) */
dvander@335
    63
	int next_grp;					/* Next group in the chain */
dvander@335
    64
	int prev_grp;					/* Previous group in the chain */
dvander@335
    65
	int nameidx;					/* Name */
dvander@433
    66
	FlagBits addflags;				/* Additive flags */
dvander@335
    67
};
dvander@335
    68
dvander@404
    69
struct AuthMethod
dvander@404
    70
{
dvander@404
    71
	String name;
dvander@404
    72
	Trie *table;
dvander@404
    73
};
dvander@404
    74
dvander@404
    75
struct UserAuth
dvander@404
    76
{
dvander@404
    77
	unsigned int index;				/* Index into auth table */
dvander@404
    78
	int identidx;					/* Index into the string table */
dvander@404
    79
};
dvander@404
    80
dvander@404
    81
struct AdminUser
dvander@404
    82
{
dvander@433
    83
	uint32_t magic;					/* Magic flag, for memory validation */
dvander@433
    84
	FlagBits flags;					/* Flags */
dvander@433
    85
	FlagBits eflags;				/* Effective flags */
dvander@404
    86
	int nameidx;					/* Name index */
dvander@404
    87
	int password;					/* Password index */
dvander@404
    88
	unsigned int grp_count;			/* Number of groups */
dvander@404
    89
	unsigned int grp_size;			/* Size of groups table */
dvander@404
    90
	int grp_table;					/* Group table itself */
ds@729
    91
	int next_user;					/* Next user in the list */
ds@729
    92
	int prev_user;					/* Previous user in the list */
dvander@405
    93
	UserAuth auth;					/* Auth method for this user */
dvander@434
    94
	bool immune_global;				/* Whether globally immune */
dvander@434
    95
	bool immune_default;			/* Whether defaultly immune */
dvander@404
    96
};
dvander@404
    97
dvander@335
    98
class AdminCache : 
dvander@335
    99
	public IAdminSystem,
dvander@335
   100
	public SMGlobalClass
dvander@335
   101
{
dvander@335
   102
public:
dvander@335
   103
	AdminCache();
dvander@335
   104
	~AdminCache();
dvander@335
   105
public: //SMGlobalClass
dvander@404
   106
	void OnSourceModStartup(bool late);
dvander@335
   107
	void OnSourceModAllInitialized();
dvander@336
   108
	void OnSourceModShutdown();
dvander@673
   109
	void OnSourceModPluginsLoaded();
dvander@335
   110
public: //IAdminSystem
dvander@335
   111
	/** Command cache stuff */
dvander@433
   112
	void AddCommandOverride(const char *cmd, OverrideType type, FlagBits flags);
dvander@433
   113
	bool GetCommandOverride(const char *cmd, OverrideType type, FlagBits *flags);
dvander@335
   114
	void UnsetCommandOverride(const char *cmd, OverrideType type);
dvander@335
   115
	/** Group cache stuff */
dvander@335
   116
	GroupId AddGroup(const char *group_name);
dvander@335
   117
	GroupId FindGroupByName(const char *group_name);
dvander@335
   118
	void SetGroupAddFlag(GroupId id, AdminFlag flag, bool enabled);
dvander@335
   119
	bool GetGroupAddFlag(GroupId id, AdminFlag flag);
dvander@433
   120
	FlagBits GetGroupAddFlags(GroupId id);
dvander@335
   121
	void SetGroupGenericImmunity(GroupId id, ImmunityType type, bool enabled);
dvander@335
   122
	bool GetGroupGenericImmunity(GroupId id, ImmunityType type);
dvander@335
   123
	void InvalidateGroup(GroupId id);
dvander@335
   124
	void AddGroupImmunity(GroupId id, GroupId other_id);
dvander@335
   125
	unsigned int GetGroupImmunityCount(GroupId id);
dvander@335
   126
	GroupId GetGroupImmunity(GroupId id, unsigned int number);
dvander@335
   127
	void AddGroupCommandOverride(GroupId id, const char *name, OverrideType type, OverrideRule rule);
dvander@335
   128
	bool GetGroupCommandOverride(GroupId id, const char *name, OverrideType type, OverrideRule *pRule);
dvander@438
   129
	void DumpAdminCache(AdminCachePart part, bool rebuild);
dvander@336
   130
	void AddAdminListener(IAdminListener *pListener);
dvander@336
   131
	void RemoveAdminListener(IAdminListener *pListener);
dvander@404
   132
	/** User stuff */
dvander@404
   133
	void RegisterAuthIdentType(const char *name);
dvander@404
   134
	AdminId CreateAdmin(const char *name);
dvander@404
   135
	const char *GetAdminName(AdminId id);
dvander@404
   136
	bool BindAdminIdentity(AdminId id, const char *auth, const char *ident);
dvander@404
   137
	virtual void SetAdminFlag(AdminId id, AdminFlag flag, bool enabled);
dvander@404
   138
	bool GetAdminFlag(AdminId id, AdminFlag flag, AccessMode mode);
dvander@433
   139
	FlagBits GetAdminFlags(AdminId id, AccessMode mode);
dvander@404
   140
	bool AdminInheritGroup(AdminId id, GroupId gid);
dvander@404
   141
	unsigned int GetAdminGroupCount(AdminId id);
dvander@404
   142
	GroupId GetAdminGroup(AdminId id, unsigned int index, const char **name);
dvander@404
   143
	void SetAdminPassword(AdminId id, const char *password);
dvander@404
   144
	const char *GetAdminPassword(AdminId id);
dvander@404
   145
	AdminId FindAdminByIdentity(const char *auth, const char *identity);
dvander@404
   146
	bool InvalidateAdmin(AdminId id);
dvander@433
   147
	unsigned int FlagBitsToBitArray(FlagBits bits, bool array[], unsigned int maxSize);
dvander@433
   148
	FlagBits FlagBitArrayToBits(const bool array[], unsigned int maxSize);
dvander@433
   149
	FlagBits FlagArrayToBits(const AdminFlag array[], unsigned int numFlags);
dvander@433
   150
	unsigned int FlagBitsToArray(FlagBits bits, AdminFlag array[], unsigned int maxSize);
dvander@434
   151
	bool CheckAdminFlags(AdminId id, FlagBits bits);
dvander@434
   152
	bool CanAdminTarget(AdminId id, AdminId target);
dvander@458
   153
	void SetAdminFlags(AdminId id, AccessMode mode, FlagBits bits);
dvander@458
   154
public:
dvander@458
   155
	bool IsValidAdmin(AdminId id);
dvander@335
   156
private:
dvander@335
   157
	void _UnsetCommandOverride(const char *cmd);
dvander@335
   158
	void _UnsetCommandGroupOverride(const char *group);
dvander@336
   159
	void InvalidateGroupCache();
dvander@404
   160
	void InvalidateAdminCache(bool unlink_admins);
dvander@336
   161
	void DumpCommandOverrideCache(OverrideType type);
dvander@404
   162
	Trie *GetMethodByIndex(unsigned int index);
dvander@405
   163
	bool GetMethodIndex(const char *name, unsigned int *_index);
dvander@335
   164
public:
dvander@335
   165
	BaseStringTable *m_pStrings;
dvander@335
   166
	BaseMemTable *m_pMemory;
dvander@335
   167
	Trie *m_pCmdOverrides;
dvander@335
   168
	Trie *m_pCmdGrpOverrides;
dvander@335
   169
	int m_FirstGroup;
dvander@335
   170
	int m_LastGroup;
dvander@335
   171
	int m_FreeGroupList;
dvander@335
   172
	Trie *m_pGroups;
dvander@336
   173
	List<IAdminListener *> m_hooks;
dvander@404
   174
	List<AuthMethod> m_AuthMethods;
dvander@404
   175
	Trie *m_pAuthTables;
dvander@336
   176
	IForward *m_pCacheFwd;
dvander@404
   177
	int m_FirstUser;
dvander@404
   178
	int m_LastUser;
dvander@404
   179
	int m_FreeUserList;
dvander@458
   180
	bool m_InvalidatingAdmins;
dvander@520
   181
	bool m_destroying;
dvander@335
   182
};
dvander@335
   183
dvander@335
   184
extern AdminCache g_Admins;
dvander@335
   185
dvander@335
   186
#endif //_INCLUDE_SOURCEMOD_ADMINCACHE_H_