core/AdminCache.h
author David Anderson <dvander@alliedmods.net>
Sat Apr 07 03:58:20 2007 +0000 (2007-04-07)
changeset 673 fc1d50579d06
parent 520 7676d61cde2d
child 729 110c14c99545
permissions -rw-r--r--
added some levelchange functions to SMGlobalClass to get rid of some messy crap
dvander@370
     1
/**
dvander@407
     2
 * vim: set ts=4 :
dvander@370
     3
 * ===============================================================
dvander@370
     4
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
dvander@370
     5
 * ===============================================================
dvander@370
     6
 *
dvander@370
     7
 * This file is not open source and may not be copied without explicit
dvander@370
     8
 * written permission of AlliedModders LLC.  This file may not be redistributed 
dvander@370
     9
 * in whole or significant part.
dvander@370
    10
 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
dvander@370
    11
 *
dvander@370
    12
 * Version: $Id$
dvander@370
    13
 */
dvander@370
    14
dvander@335
    15
#ifndef _INCLUDE_SOURCEMOD_ADMINCACHE_H_
dvander@335
    16
#define _INCLUDE_SOURCEMOD_ADMINCACHE_H_
dvander@335
    17
dvander@335
    18
#include "sm_memtable.h"
dvander@335
    19
#include <sm_trie.h>
dvander@336
    20
#include <sh_list.h>
dvander@404
    21
#include <sh_string.h>
dvander@335
    22
#include <IAdminSystem.h>
dvander@335
    23
#include "sm_globals.h"
dvander@336
    24
#include <IForwardSys.h>
dvander@336
    25
dvander@336
    26
using namespace SourceHook;
dvander@335
    27
dvander@335
    28
#define GRP_MAGIC_SET		0xDEADFADE
dvander@335
    29
#define GRP_MAGIC_UNSET		0xFACEFACE
dvander@404
    30
#define USR_MAGIC_SET		0xDEADFACE
dvander@404
    31
#define USR_MAGIC_UNSET		0xFADEDEAD
dvander@335
    32
dvander@335
    33
struct AdminGroup
dvander@335
    34
{
dvander@335
    35
	uint32_t magic;					/* Magic flag, for memory validation (ugh) */
dvander@335
    36
	bool immune_global;				/* Global immunity? */
dvander@335
    37
	bool immune_default;			/* Default immunity? */
dvander@335
    38
	/* Immune from target table (-1 = nonexistant)
dvander@335
    39
	 * [0] = number of entries
dvander@335
    40
	 * [1...N] = immune targets
dvander@335
    41
	 */
dvander@335
    42
	int immune_table;			
dvander@335
    43
	Trie *pCmdTable;				/* Command override table (can be NULL) */
dvander@335
    44
	Trie *pCmdGrpTable;				/* Command group override table (can be NULL) */
dvander@335
    45
	int next_grp;					/* Next group in the chain */
dvander@335
    46
	int prev_grp;					/* Previous group in the chain */
dvander@335
    47
	int nameidx;					/* Name */
dvander@433
    48
	FlagBits addflags;				/* Additive flags */
dvander@335
    49
};
dvander@335
    50
dvander@404
    51
struct AuthMethod
dvander@404
    52
{
dvander@404
    53
	String name;
dvander@404
    54
	Trie *table;
dvander@404
    55
};
dvander@404
    56
dvander@404
    57
struct UserAuth
dvander@404
    58
{
dvander@404
    59
	unsigned int index;				/* Index into auth table */
dvander@404
    60
	int identidx;					/* Index into the string table */
dvander@404
    61
};
dvander@404
    62
dvander@404
    63
struct AdminUser
dvander@404
    64
{
dvander@433
    65
	uint32_t magic;					/* Magic flag, for memory validation */
dvander@433
    66
	FlagBits flags;					/* Flags */
dvander@433
    67
	FlagBits eflags;				/* Effective flags */
dvander@404
    68
	int nameidx;					/* Name index */
dvander@404
    69
	int password;					/* Password index */
dvander@404
    70
	unsigned int grp_count;			/* Number of groups */
dvander@404
    71
	unsigned int grp_size;			/* Size of groups table */
dvander@404
    72
	int grp_table;					/* Group table itself */
dvander@404
    73
	int next_user;					/* Next user in ze list */
dvander@404
    74
	int prev_user;					/* Prev user in the list */
dvander@405
    75
	UserAuth auth;					/* Auth method for this user */
dvander@434
    76
	bool immune_global;				/* Whether globally immune */
dvander@434
    77
	bool immune_default;			/* Whether defaultly immune */
dvander@404
    78
};
dvander@404
    79
dvander@335
    80
class AdminCache : 
dvander@335
    81
	public IAdminSystem,
dvander@335
    82
	public SMGlobalClass
dvander@335
    83
{
dvander@335
    84
public:
dvander@335
    85
	AdminCache();
dvander@335
    86
	~AdminCache();
dvander@335
    87
public: //SMGlobalClass
dvander@404
    88
	void OnSourceModStartup(bool late);
dvander@335
    89
	void OnSourceModAllInitialized();
dvander@336
    90
	void OnSourceModShutdown();
dvander@673
    91
	void OnSourceModPluginsLoaded();
dvander@335
    92
public: //IAdminSystem
dvander@335
    93
	/** Command cache stuff */
dvander@433
    94
	void AddCommandOverride(const char *cmd, OverrideType type, FlagBits flags);
dvander@433
    95
	bool GetCommandOverride(const char *cmd, OverrideType type, FlagBits *flags);
dvander@335
    96
	void UnsetCommandOverride(const char *cmd, OverrideType type);
dvander@335
    97
	/** Group cache stuff */
dvander@335
    98
	GroupId AddGroup(const char *group_name);
dvander@335
    99
	GroupId FindGroupByName(const char *group_name);
dvander@335
   100
	void SetGroupAddFlag(GroupId id, AdminFlag flag, bool enabled);
dvander@335
   101
	bool GetGroupAddFlag(GroupId id, AdminFlag flag);
dvander@433
   102
	FlagBits GetGroupAddFlags(GroupId id);
dvander@335
   103
	void SetGroupGenericImmunity(GroupId id, ImmunityType type, bool enabled);
dvander@335
   104
	bool GetGroupGenericImmunity(GroupId id, ImmunityType type);
dvander@335
   105
	void InvalidateGroup(GroupId id);
dvander@335
   106
	void AddGroupImmunity(GroupId id, GroupId other_id);
dvander@335
   107
	unsigned int GetGroupImmunityCount(GroupId id);
dvander@335
   108
	GroupId GetGroupImmunity(GroupId id, unsigned int number);
dvander@335
   109
	void AddGroupCommandOverride(GroupId id, const char *name, OverrideType type, OverrideRule rule);
dvander@335
   110
	bool GetGroupCommandOverride(GroupId id, const char *name, OverrideType type, OverrideRule *pRule);
dvander@438
   111
	void DumpAdminCache(AdminCachePart part, bool rebuild);
dvander@336
   112
	void AddAdminListener(IAdminListener *pListener);
dvander@336
   113
	void RemoveAdminListener(IAdminListener *pListener);
dvander@404
   114
	/** User stuff */
dvander@404
   115
	void RegisterAuthIdentType(const char *name);
dvander@404
   116
	AdminId CreateAdmin(const char *name);
dvander@404
   117
	const char *GetAdminName(AdminId id);
dvander@404
   118
	bool BindAdminIdentity(AdminId id, const char *auth, const char *ident);
dvander@404
   119
	virtual void SetAdminFlag(AdminId id, AdminFlag flag, bool enabled);
dvander@404
   120
	bool GetAdminFlag(AdminId id, AdminFlag flag, AccessMode mode);
dvander@433
   121
	FlagBits GetAdminFlags(AdminId id, AccessMode mode);
dvander@404
   122
	bool AdminInheritGroup(AdminId id, GroupId gid);
dvander@404
   123
	unsigned int GetAdminGroupCount(AdminId id);
dvander@404
   124
	GroupId GetAdminGroup(AdminId id, unsigned int index, const char **name);
dvander@404
   125
	void SetAdminPassword(AdminId id, const char *password);
dvander@404
   126
	const char *GetAdminPassword(AdminId id);
dvander@404
   127
	AdminId FindAdminByIdentity(const char *auth, const char *identity);
dvander@404
   128
	bool InvalidateAdmin(AdminId id);
dvander@433
   129
	unsigned int FlagBitsToBitArray(FlagBits bits, bool array[], unsigned int maxSize);
dvander@433
   130
	FlagBits FlagBitArrayToBits(const bool array[], unsigned int maxSize);
dvander@433
   131
	FlagBits FlagArrayToBits(const AdminFlag array[], unsigned int numFlags);
dvander@433
   132
	unsigned int FlagBitsToArray(FlagBits bits, AdminFlag array[], unsigned int maxSize);
dvander@434
   133
	bool CheckAdminFlags(AdminId id, FlagBits bits);
dvander@434
   134
	bool CanAdminTarget(AdminId id, AdminId target);
dvander@458
   135
	void SetAdminFlags(AdminId id, AccessMode mode, FlagBits bits);
dvander@458
   136
public:
dvander@458
   137
	bool IsValidAdmin(AdminId id);
dvander@335
   138
private:
dvander@335
   139
	void _UnsetCommandOverride(const char *cmd);
dvander@335
   140
	void _UnsetCommandGroupOverride(const char *group);
dvander@336
   141
	void InvalidateGroupCache();
dvander@404
   142
	void InvalidateAdminCache(bool unlink_admins);
dvander@336
   143
	void DumpCommandOverrideCache(OverrideType type);
dvander@404
   144
	Trie *GetMethodByIndex(unsigned int index);
dvander@405
   145
	bool GetMethodIndex(const char *name, unsigned int *_index);
dvander@335
   146
public:
dvander@335
   147
	BaseStringTable *m_pStrings;
dvander@335
   148
	BaseMemTable *m_pMemory;
dvander@335
   149
	Trie *m_pCmdOverrides;
dvander@335
   150
	Trie *m_pCmdGrpOverrides;
dvander@335
   151
	int m_FirstGroup;
dvander@335
   152
	int m_LastGroup;
dvander@335
   153
	int m_FreeGroupList;
dvander@335
   154
	Trie *m_pGroups;
dvander@336
   155
	List<IAdminListener *> m_hooks;
dvander@404
   156
	List<AuthMethod> m_AuthMethods;
dvander@404
   157
	Trie *m_pAuthTables;
dvander@336
   158
	IForward *m_pCacheFwd;
dvander@404
   159
	int m_FirstUser;
dvander@404
   160
	int m_LastUser;
dvander@404
   161
	int m_FreeUserList;
dvander@458
   162
	bool m_InvalidatingAdmins;
dvander@520
   163
	bool m_destroying;
dvander@335
   164
};
dvander@335
   165
dvander@335
   166
extern AdminCache g_Admins;
dvander@335
   167
dvander@335
   168
#endif //_INCLUDE_SOURCEMOD_ADMINCACHE_H_