core/AdminCache.h
author Borja Ferrer <faluco@alliedmods.net>
Sun Feb 04 22:41:44 2007 +0000 (2007-02-04)
changeset 430 ed37e9767ed4
parent 407 37435e7656ad
child 433 d699e31199ad
permissions -rw-r--r--
Optimized forwards, now paused functions are stored in a temp list so we dont have to check if they're runnable on each function execution.
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@335
    48
	bool addflags[AdminFlags_TOTAL];	/* 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@407
    65
	uint32_t magic;						/* Magic flag, for memory validation */
dvander@404
    66
	bool flags[AdminFlags_TOTAL];	/* Base flags */
dvander@404
    67
	bool eflags[AdminFlags_TOTAL];	/* 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@404
    76
};
dvander@404
    77
dvander@335
    78
class AdminCache : 
dvander@335
    79
	public IAdminSystem,
dvander@335
    80
	public SMGlobalClass
dvander@335
    81
{
dvander@335
    82
public:
dvander@335
    83
	AdminCache();
dvander@335
    84
	~AdminCache();
dvander@335
    85
public: //SMGlobalClass
dvander@404
    86
	void OnSourceModStartup(bool late);
dvander@335
    87
	void OnSourceModAllInitialized();
dvander@336
    88
	void OnSourceModShutdown();
dvander@335
    89
public: //IAdminSystem
dvander@335
    90
	/** Command cache stuff */
dvander@335
    91
	void AddCommandOverride(const char *cmd, OverrideType type, AdminFlag flag);
dvander@335
    92
	bool GetCommandOverride(const char *cmd, OverrideType type, AdminFlag *pFlag);
dvander@335
    93
	void UnsetCommandOverride(const char *cmd, OverrideType type);
dvander@335
    94
	/** Group cache stuff */
dvander@335
    95
	GroupId AddGroup(const char *group_name);
dvander@335
    96
	GroupId FindGroupByName(const char *group_name);
dvander@335
    97
	void SetGroupAddFlag(GroupId id, AdminFlag flag, bool enabled);
dvander@335
    98
	bool GetGroupAddFlag(GroupId id, AdminFlag flag);
dvander@336
    99
	unsigned int GetGroupAddFlagBits(GroupId id, bool flags[], unsigned int total);
dvander@335
   100
	void SetGroupGenericImmunity(GroupId id, ImmunityType type, bool enabled);
dvander@335
   101
	bool GetGroupGenericImmunity(GroupId id, ImmunityType type);
dvander@335
   102
	void InvalidateGroup(GroupId id);
dvander@335
   103
	void AddGroupImmunity(GroupId id, GroupId other_id);
dvander@335
   104
	unsigned int GetGroupImmunityCount(GroupId id);
dvander@335
   105
	GroupId GetGroupImmunity(GroupId id, unsigned int number);
dvander@335
   106
	void AddGroupCommandOverride(GroupId id, const char *name, OverrideType type, OverrideRule rule);
dvander@335
   107
	bool GetGroupCommandOverride(GroupId id, const char *name, OverrideType type, OverrideRule *pRule);
dvander@336
   108
	void DumpAdminCache(int cache_flags, bool rebuild);
dvander@336
   109
	void AddAdminListener(IAdminListener *pListener);
dvander@336
   110
	void RemoveAdminListener(IAdminListener *pListener);
dvander@404
   111
	/** User stuff */
dvander@404
   112
	void RegisterAuthIdentType(const char *name);
dvander@404
   113
	AdminId CreateAdmin(const char *name);
dvander@404
   114
	const char *GetAdminName(AdminId id);
dvander@404
   115
	bool BindAdminIdentity(AdminId id, const char *auth, const char *ident);
dvander@404
   116
	virtual void SetAdminFlag(AdminId id, AdminFlag flag, bool enabled);
dvander@404
   117
	bool GetAdminFlag(AdminId id, AdminFlag flag, AccessMode mode);
dvander@404
   118
	unsigned int GetAdminFlags(AdminId id, bool flags[], unsigned int total, AccessMode mode);
dvander@404
   119
	bool AdminInheritGroup(AdminId id, GroupId gid);
dvander@404
   120
	unsigned int GetAdminGroupCount(AdminId id);
dvander@404
   121
	GroupId GetAdminGroup(AdminId id, unsigned int index, const char **name);
dvander@404
   122
	void SetAdminPassword(AdminId id, const char *password);
dvander@404
   123
	const char *GetAdminPassword(AdminId id);
dvander@404
   124
	AdminId FindAdminByIdentity(const char *auth, const char *identity);
dvander@404
   125
	bool InvalidateAdmin(AdminId id);
dvander@335
   126
private:
dvander@335
   127
	void _AddCommandOverride(const char *cmd, AdminFlag flag);
dvander@335
   128
	void _AddCommandGroupOverride(const char *group, AdminFlag flag);
dvander@335
   129
	bool _GetCommandOverride(const char *cmd, AdminFlag *pFlag);
dvander@335
   130
	bool _GetCommandGroupOverride(const char *group, AdminFlag *pFlag);
dvander@335
   131
	void _UnsetCommandOverride(const char *cmd);
dvander@335
   132
	void _UnsetCommandGroupOverride(const char *group);
dvander@336
   133
	void InvalidateGroupCache();
dvander@404
   134
	void InvalidateAdminCache(bool unlink_admins);
dvander@336
   135
	void DumpCommandOverrideCache(OverrideType type);
dvander@404
   136
	Trie *GetMethodByIndex(unsigned int index);
dvander@405
   137
	bool GetMethodIndex(const char *name, unsigned int *_index);
dvander@335
   138
public:
dvander@335
   139
	BaseStringTable *m_pStrings;
dvander@335
   140
	BaseMemTable *m_pMemory;
dvander@335
   141
	Trie *m_pCmdOverrides;
dvander@335
   142
	Trie *m_pCmdGrpOverrides;
dvander@335
   143
	int m_FirstGroup;
dvander@335
   144
	int m_LastGroup;
dvander@335
   145
	int m_FreeGroupList;
dvander@335
   146
	Trie *m_pGroups;
dvander@336
   147
	List<IAdminListener *> m_hooks;
dvander@404
   148
	List<AuthMethod> m_AuthMethods;
dvander@404
   149
	Trie *m_pAuthTables;
dvander@336
   150
	IForward *m_pCacheFwd;
dvander@404
   151
	int m_FirstUser;
dvander@404
   152
	int m_LastUser;
dvander@404
   153
	int m_FreeUserList;
dvander@335
   154
};
dvander@335
   155
dvander@335
   156
extern AdminCache g_Admins;
dvander@335
   157
dvander@335
   158
#endif //_INCLUDE_SOURCEMOD_ADMINCACHE_H_