plugins/admin-flatfile/admin-groups.sp
author David Anderson <dvander@alliedmods.net>
Sat Dec 22 08:57:08 2007 +0000 (2007-12-22)
changeset 1813 372939c88bc7
parent 1432 d5001413aba7
child 1947 e73a1e51833b
permissions -rw-r--r--
fixed amb1305 by making OnClientPostAdminCheck() always occur after OnClientPutInServer(). this is now GUARANTEED. it was undefined before, however the usual case was opposite. if plugins were relying on this, they were written poorly and shouldn't have worked in the first place, especially with the threaded SQL plugin.
dvander@444
     1
/**
ds@1330
     2
 * vim: set ts=4 :
ds@1330
     3
 * =============================================================================
ds@1330
     4
 * SourceMod Admin File Reader Plugin
dvander@444
     5
 * Reads the admin_groups.cfg file.  Do not compile this directly.
ds@1330
     6
 *
ds@1330
     7
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
ds@1330
     8
 * =============================================================================
dvander@444
     9
 *
ds@1330
    10
 * This program is free software; you can redistribute it and/or modify it under
ds@1330
    11
 * the terms of the GNU General Public License, version 3.0, as published by the
ds@1330
    12
 * Free Software Foundation.
ds@1330
    13
 * 
ds@1330
    14
 * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1330
    15
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1330
    16
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ds@1330
    17
 * details.
dvander@444
    18
 *
ds@1330
    19
 * You should have received a copy of the GNU General Public License along with
ds@1330
    20
 * this program.  If not, see <http://www.gnu.org/licenses/>.
ds@1330
    21
 *
ds@1330
    22
 * As a special exception, AlliedModders LLC gives you permission to link the
ds@1330
    23
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1330
    24
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1330
    25
 * by the Valve Corporation.  You must obey the GNU General Public License in
ds@1330
    26
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ds@1330
    27
 * this exception to all derivative works.  AlliedModders LLC defines further
ds@1330
    28
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1330
    29
 * or <http://www.sourcemod.net/license.php>.
ds@908
    30
 *
ds@908
    31
 * Version: $Id$
dvander@444
    32
 */
dvander@444
    33
dvander@437
    34
#define GROUP_STATE_NONE		0
dvander@437
    35
#define GROUP_STATE_GROUPS		1
dvander@437
    36
#define GROUP_STATE_INGROUP		2
dvander@437
    37
#define GROUP_STATE_OVERRIDES	3
dvander@437
    38
#define GROUP_PASS_FIRST		1
dvander@437
    39
#define GROUP_PASS_SECOND		2
dvander@437
    40
dvander@437
    41
static Handle:g_hGroupParser = INVALID_HANDLE;
dvander@437
    42
static GroupId:g_CurGrp = INVALID_GROUP_ID;
dvander@437
    43
static g_GroupState = GROUP_STATE_NONE;
dvander@637
    44
static g_GroupPass = 0;
dvander@437
    45
static bool:g_NeedReparse = false;
dvander@437
    46
dvander@437
    47
public SMCResult:ReadGroups_NewSection(Handle:smc, const String:name[], bool:opt_quotes)
dvander@437
    48
{
dvander@442
    49
	if (g_IgnoreLevel)
dvander@442
    50
	{
dvander@442
    51
		g_IgnoreLevel++;
dvander@442
    52
		return SMCParse_Continue;
dvander@442
    53
	}
dvander@442
    54
	
dvander@437
    55
	if (g_GroupState == GROUP_STATE_NONE)
dvander@437
    56
	{
dvander@437
    57
		if (StrEqual(name, "Groups"))
dvander@437
    58
		{
dvander@437
    59
			g_GroupState = GROUP_STATE_GROUPS;
dvander@442
    60
		} else {
dvander@442
    61
			g_IgnoreLevel++;
dvander@437
    62
		}
dvander@437
    63
	} else if (g_GroupState == GROUP_STATE_GROUPS) {
dvander@437
    64
		if ((g_CurGrp = CreateAdmGroup(name)) == INVALID_GROUP_ID)
dvander@437
    65
		{
dvander@437
    66
			g_CurGrp = FindAdmGroup(name);
dvander@437
    67
		}
dvander@437
    68
		g_GroupState = GROUP_STATE_INGROUP;
dvander@437
    69
	} else if (g_GroupState == GROUP_STATE_INGROUP) {
dvander@437
    70
		if (StrEqual(name, "Overrides"))
dvander@437
    71
		{
dvander@437
    72
			g_GroupState = GROUP_STATE_OVERRIDES;
dvander@442
    73
		} else {
dvander@442
    74
			g_IgnoreLevel++;
dvander@437
    75
		}
dvander@442
    76
	} else {
dvander@442
    77
		g_IgnoreLevel++;
dvander@437
    78
	}
dvander@437
    79
	
dvander@437
    80
	return SMCParse_Continue;
dvander@437
    81
}
dvander@437
    82
dvander@437
    83
public SMCResult:ReadGroups_KeyValue(Handle:smc, 
dvander@437
    84
										const String:key[], 
dvander@437
    85
										const String:value[], 
dvander@437
    86
										bool:key_quotes, 
dvander@437
    87
										bool:value_quotes)
dvander@437
    88
{
dvander@442
    89
	if (g_CurGrp == INVALID_GROUP_ID
dvander@442
    90
		|| g_IgnoreLevel)
dvander@437
    91
	{
dvander@437
    92
		return SMCParse_Continue;
dvander@437
    93
	}
dvander@437
    94
	
dvander@437
    95
	new AdminFlag:flag;
dvander@437
    96
	
dvander@437
    97
	if (g_GroupPass == GROUP_PASS_FIRST)
dvander@437
    98
	{
dvander@437
    99
		if (g_GroupState == GROUP_STATE_INGROUP)
dvander@437
   100
		{
dvander@437
   101
			if (StrEqual(key, "flags"))
dvander@437
   102
			{
dvander@437
   103
				new len = strlen(value);
dvander@437
   104
				for (new i=0; i<len; i++)
dvander@437
   105
				{
dvander@1298
   106
					if (!FindFlagByChar(value[i], flag))
dvander@437
   107
					{
dvander@437
   108
						continue;
dvander@437
   109
					}
dvander@437
   110
					SetAdmGroupAddFlag(g_CurGrp, flag, true);
dvander@437
   111
				}
dvander@437
   112
			} else if (StrEqual(key, "immunity")) {
dvander@1403
   113
				g_NeedReparse = true;
dvander@437
   114
			}
dvander@437
   115
		} else if (g_GroupState == GROUP_STATE_OVERRIDES) {
dvander@437
   116
			new OverrideRule:rule = Command_Deny;
dvander@437
   117
			
dvander@437
   118
			if (StrEqual(value, "allow", false))
dvander@437
   119
			{
dvander@437
   120
				rule = Command_Allow;
dvander@437
   121
			}
dvander@437
   122
			
dvander@437
   123
			if (key[0] == '@')
dvander@437
   124
			{
dvander@437
   125
				AddAdmGroupCmdOverride(g_CurGrp, key[1], Override_CommandGroup, rule);
dvander@437
   126
			} else {
dvander@437
   127
				AddAdmGroupCmdOverride(g_CurGrp, key, Override_Command, rule);
dvander@437
   128
			}
dvander@437
   129
		}
dvander@437
   130
	} else if (g_GroupPass == GROUP_PASS_SECOND
dvander@437
   131
			   && g_GroupState == GROUP_STATE_INGROUP) {
dvander@437
   132
		/* Check for immunity again, core should handle double inserts */
dvander@437
   133
		if (StrEqual(key, "immunity"))
dvander@437
   134
		{
dvander@1403
   135
			/* If it's a value we know about, use it */
dvander@1403
   136
			if (StrEqual(value, "*"))
dvander@437
   137
			{
dvander@1403
   138
				SetAdmGroupImmunityLevel(g_CurGrp, 2);
dvander@1403
   139
			} else if (StrEqual(value, "$")) {
dvander@1403
   140
				SetAdmGroupImmunityLevel(g_CurGrp, 1);
dvander@437
   141
			} else {
dvander@1403
   142
				new level;
dvander@1403
   143
				if (StringToIntEx(value, level))
dvander@1279
   144
				{
dvander@1403
   145
					SetAdmGroupImmunityLevel(g_CurGrp, level);
dvander@1279
   146
				} else {
dvander@1403
   147
					new GroupId:id;
dvander@1403
   148
					if (value[0] == '@')
dvander@1403
   149
					{
dvander@1403
   150
						id = FindAdmGroup(value[1]);
dvander@1403
   151
					} else {
dvander@1403
   152
						id = FindAdmGroup(value);
dvander@1403
   153
					}
dvander@1403
   154
					if (id != INVALID_GROUP_ID)
dvander@1403
   155
					{
dvander@1403
   156
						SetAdmGroupImmuneFrom(g_CurGrp, id);
dvander@1403
   157
					} else {
dvander@1403
   158
						ParseError("Unable to find group: \"%s\"", value);
dvander@1403
   159
					}
dvander@1279
   160
				}
dvander@437
   161
			}
dvander@437
   162
		}
dvander@437
   163
	}
dvander@437
   164
	
dvander@437
   165
	return SMCParse_Continue;
dvander@437
   166
}
dvander@437
   167
dvander@437
   168
public SMCResult:ReadGroups_EndSection(Handle:smc)
dvander@437
   169
{
dvander@442
   170
	/* If we're ignoring, skip out */
dvander@442
   171
	if (g_IgnoreLevel)
dvander@442
   172
	{
dvander@442
   173
		g_IgnoreLevel--;
dvander@442
   174
		return SMCParse_Continue;
dvander@442
   175
	}
dvander@442
   176
	
dvander@437
   177
	if (g_GroupState == GROUP_STATE_OVERRIDES)
dvander@437
   178
	{
dvander@437
   179
		g_GroupState = GROUP_STATE_INGROUP;
dvander@437
   180
	} else if (g_GroupState == GROUP_STATE_INGROUP) {
dvander@437
   181
		g_GroupState = GROUP_STATE_GROUPS;
dvander@437
   182
		g_CurGrp = INVALID_GROUP_ID;
dvander@437
   183
	} else if (g_GroupState == GROUP_STATE_GROUPS) {
dvander@437
   184
		g_GroupState = GROUP_STATE_NONE;
dvander@437
   185
	}
dvander@437
   186
	
dvander@437
   187
	return SMCParse_Continue;
dvander@437
   188
}
dvander@437
   189
dvander@1432
   190
public SMCResult:ReadGroups_CurrentLine(Handle:smc, const String:line[], lineno)
dvander@1432
   191
{
dvander@1432
   192
	g_CurrentLine = lineno;
dvander@1432
   193
	
dvander@1432
   194
	return SMCParse_Continue;
dvander@1432
   195
}
dvander@1432
   196
dvander@437
   197
static InitializeGroupParser()
dvander@437
   198
{
dvander@437
   199
	if (g_hGroupParser == INVALID_HANDLE)
dvander@437
   200
	{
dvander@437
   201
		g_hGroupParser = SMC_CreateParser();
dvander@437
   202
		SMC_SetReaders(g_hGroupParser,
dvander@437
   203
					   ReadGroups_NewSection,
dvander@437
   204
					   ReadGroups_KeyValue,
dvander@437
   205
					   ReadGroups_EndSection);
dvander@1432
   206
		SMC_SetRawLine(g_hGroupParser, ReadGroups_CurrentLine);
dvander@437
   207
	}
dvander@437
   208
}
dvander@437
   209
dvander@444
   210
static InternalReadGroups(const String:path[], pass)
dvander@437
   211
{
dvander@437
   212
	/* Set states */
dvander@442
   213
	InitGlobalStates();
dvander@437
   214
	g_GroupState = GROUP_STATE_NONE;
dvander@437
   215
	g_CurGrp = INVALID_GROUP_ID;
dvander@442
   216
	g_GroupPass = pass;
dvander@437
   217
	g_NeedReparse = false;
dvander@437
   218
		
dvander@437
   219
	new SMCError:err = SMC_ParseFile(g_hGroupParser, path);
dvander@437
   220
	if (err != SMCError_Okay)
dvander@437
   221
	{
dvander@437
   222
		decl String:buffer[64];
dvander@437
   223
		if (SMC_GetErrorString(err, buffer, sizeof(buffer)))
dvander@437
   224
		{
dvander@442
   225
			ParseError("%s", buffer);
dvander@437
   226
		} else {
dvander@442
   227
			ParseError("Fatal parse error");
dvander@437
   228
		}
dvander@437
   229
	}
dvander@437
   230
}
dvander@437
   231
dvander@442
   232
ReadGroups()
dvander@442
   233
{
dvander@442
   234
	InitializeGroupParser();
dvander@442
   235
	
dvander@442
   236
	BuildPath(Path_SM, g_Filename, sizeof(g_Filename), "configs/admin_groups.cfg");
dvander@442
   237
	
dvander@442
   238
	InternalReadGroups(g_Filename, GROUP_PASS_FIRST);
dvander@442
   239
	if (g_NeedReparse)
dvander@442
   240
	{
dvander@442
   241
		InternalReadGroups(g_Filename, GROUP_PASS_SECOND);
dvander@442
   242
	}
dvander@442
   243
}
dvander@442
   244