plugins/admin-flatfile/admin-users.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 admins.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@444
    34
#define USER_STATE_NONE			0
dvander@444
    35
#define USER_STATE_ADMINS		1
dvander@444
    36
#define USER_STATE_INADMIN		2
dvander@444
    37
dvander@444
    38
static Handle:g_hUserParser = INVALID_HANDLE;
dvander@444
    39
static AdminId:g_CurUser = INVALID_ADMIN_ID;
dvander@444
    40
static g_UserState = USER_STATE_NONE;
dvander@444
    41
static String:g_CurAuth[64];
dvander@444
    42
static String:g_CurIdent[64];
dvander@444
    43
dvander@444
    44
public SMCResult:ReadUsers_NewSection(Handle:smc, const String:name[], bool:opt_quotes)
dvander@444
    45
{
dvander@444
    46
	if (g_IgnoreLevel)
dvander@444
    47
	{
dvander@444
    48
		g_IgnoreLevel++;
dvander@444
    49
		return SMCParse_Continue;
dvander@444
    50
	}
dvander@444
    51
	
dvander@444
    52
	if (g_UserState == USER_STATE_NONE)
dvander@444
    53
	{
dvander@444
    54
		if (StrEqual(name, "Admins"))
dvander@444
    55
		{
dvander@444
    56
			g_UserState = USER_STATE_ADMINS;
dvander@444
    57
			g_CurUser = INVALID_ADMIN_ID;
dvander@444
    58
		} else {
dvander@444
    59
			g_IgnoreLevel++;
dvander@444
    60
		}
dvander@444
    61
	} else if (g_UserState == USER_STATE_ADMINS) {
dvander@444
    62
		g_UserState = USER_STATE_INADMIN;
dvander@444
    63
		g_CurUser = CreateAdmin(name);
dvander@444
    64
		g_CurAuth[0] = '\0';
dvander@444
    65
		g_CurIdent[0] = '\0';
dvander@444
    66
	} else {
dvander@444
    67
		g_IgnoreLevel++;
dvander@444
    68
	}
dvander@444
    69
	
dvander@444
    70
	return SMCParse_Continue;
dvander@444
    71
}
dvander@444
    72
dvander@444
    73
public SMCResult:ReadUsers_KeyValue(Handle:smc, 
dvander@444
    74
									const String:key[], 
dvander@444
    75
									const String:value[], 
dvander@444
    76
									bool:key_quotes, 
dvander@444
    77
									bool:value_quotes)
dvander@444
    78
{
dvander@444
    79
	if (g_UserState != USER_STATE_INADMIN
dvander@444
    80
		|| g_IgnoreLevel
dvander@444
    81
		|| g_CurUser == INVALID_ADMIN_ID)
dvander@444
    82
	{
dvander@444
    83
		return SMCParse_Continue;
dvander@444
    84
	}
dvander@444
    85
	
dvander@444
    86
	new bool:auth = false;
dvander@444
    87
	
dvander@444
    88
	if (StrEqual(key, "auth"))
dvander@444
    89
	{
dvander@444
    90
		auth = true;
ds@1268
    91
		strcopy(g_CurAuth, sizeof(g_CurAuth), value);
dvander@1403
    92
	}
dvander@1403
    93
	else if (StrEqual(key, "identity"))
dvander@1403
    94
	{
dvander@444
    95
		auth = true;
ds@1268
    96
		strcopy(g_CurIdent, sizeof(g_CurIdent), value);
dvander@1403
    97
	}
dvander@1403
    98
	else if (StrEqual(key, "password")) 
dvander@1403
    99
	{
dvander@444
   100
		SetAdminPassword(g_CurUser, value);
dvander@1403
   101
	} 
dvander@1403
   102
	else if (StrEqual(key, "group")) 
dvander@1403
   103
	{
dvander@444
   104
		new GroupId:id = FindAdmGroup(value);
dvander@444
   105
		if (id == INVALID_GROUP_ID)
dvander@444
   106
		{
dvander@444
   107
			ParseError("Unknown group \"%s\"", value);
dvander@444
   108
		} else if (!AdminInheritGroup(g_CurUser, id)) {
dvander@444
   109
			ParseError("Unable to inherit group \"%s\"", value);
dvander@444
   110
		}
dvander@1403
   111
	} 
dvander@1403
   112
	else if (StrEqual(key, "flags")) 
dvander@1403
   113
	{
dvander@444
   114
		new len = strlen(value);
dvander@1298
   115
		new AdminFlag:flag;
dvander@444
   116
		
dvander@444
   117
		for (new i=0; i<len; i++)
dvander@444
   118
		{
dvander@1298
   119
			if (!FindFlagByChar(value[i], flag))
dvander@444
   120
			{
dvander@444
   121
				ParseError("Invalid flag detected: %c", value[i]);
dvander@444
   122
			}
dvander@1298
   123
			SetAdminFlag(g_CurUser, flag, true);
dvander@444
   124
		}
dvander@1403
   125
	} 
dvander@1403
   126
	else if (StrEqual(key, "immunity")) 
dvander@1403
   127
	{
dvander@1403
   128
		new level = StringToInt(value);
dvander@1403
   129
		SetAdminImmunityLevel(g_CurUser, level);
dvander@444
   130
	}
dvander@444
   131
dvander@444
   132
	if (auth && g_CurIdent[0] && g_CurAuth[0])
dvander@444
   133
	{
dvander@444
   134
		if (BindAdminIdentity(g_CurUser, g_CurAuth, g_CurIdent))
dvander@444
   135
		{
dvander@444
   136
			g_CurAuth[0] = '\0';
dvander@444
   137
			g_CurIdent[0] = '\0';
dvander@444
   138
		} else {
dvander@444
   139
			ParseError("Failed to bind auth \"%s\" to identity \"%s\"", g_CurAuth, g_CurIdent);
dvander@444
   140
		}
dvander@444
   141
	}
dvander@444
   142
	
dvander@444
   143
	return SMCParse_Continue;
dvander@444
   144
}
dvander@444
   145
dvander@444
   146
public SMCResult:ReadUsers_EndSection(Handle:smc)
dvander@444
   147
{
dvander@444
   148
	if (g_IgnoreLevel)
dvander@444
   149
	{
dvander@444
   150
		g_IgnoreLevel--;
dvander@444
   151
		return SMCParse_Continue;
dvander@444
   152
	}
dvander@444
   153
	
dvander@444
   154
	if (g_UserState == USER_STATE_INADMIN)
dvander@444
   155
	{
dvander@444
   156
		g_UserState = USER_STATE_ADMINS;
dvander@444
   157
		g_CurUser = INVALID_ADMIN_ID;
dvander@444
   158
	} else if (g_UserState == USER_STATE_ADMINS) {
dvander@444
   159
		g_UserState = USER_STATE_NONE;
dvander@444
   160
	}
dvander@444
   161
	
dvander@444
   162
	return SMCParse_Continue;
dvander@444
   163
}
dvander@444
   164
dvander@1432
   165
public SMCResult:ReadUsers_CurrentLine(Handle:smc, const String:line[], lineno)
dvander@1432
   166
{
dvander@1432
   167
	g_CurrentLine = lineno;
dvander@1432
   168
	
dvander@1432
   169
	return SMCParse_Continue;
dvander@1432
   170
}
dvander@1432
   171
dvander@444
   172
static InitializeUserParser()
dvander@444
   173
{
dvander@444
   174
	if (g_hUserParser == INVALID_HANDLE)
dvander@444
   175
	{
dvander@444
   176
		g_hUserParser = SMC_CreateParser();
dvander@444
   177
		SMC_SetReaders(g_hUserParser,
dvander@444
   178
					   ReadUsers_NewSection,
dvander@444
   179
					   ReadUsers_KeyValue,
dvander@444
   180
					   ReadUsers_EndSection);
dvander@1432
   181
		SMC_SetRawLine(g_hUserParser, ReadUsers_CurrentLine);
dvander@444
   182
	}
dvander@444
   183
}
dvander@444
   184
dvander@444
   185
ReadUsers()
dvander@444
   186
{
dvander@444
   187
	InitializeUserParser();
dvander@444
   188
	
dvander@446
   189
	BuildPath(Path_SM, g_Filename, sizeof(g_Filename), "configs/admins.cfg");
dvander@444
   190
dvander@444
   191
	/* Set states */
dvander@444
   192
	InitGlobalStates();
dvander@444
   193
	g_UserState = USER_STATE_NONE;
dvander@444
   194
		
dvander@444
   195
	new SMCError:err = SMC_ParseFile(g_hUserParser, g_Filename);
dvander@444
   196
	if (err != SMCError_Okay)
dvander@444
   197
	{
dvander@444
   198
		decl String:buffer[64];
dvander@444
   199
		if (SMC_GetErrorString(err, buffer, sizeof(buffer)))
dvander@444
   200
		{
dvander@444
   201
			ParseError("%s", buffer);
dvander@444
   202
		} else {
dvander@444
   203
			ParseError("Fatal parse error");
dvander@444
   204
		}
dvander@444
   205
	}
dvander@444
   206
}