plugins/admin-flatfile/admin-users.sp
author Scott Ehlert <ds@alliedmods.net>
Tue May 01 05:29:37 2007 +0000 (2007-05-01)
changeset 714 93b19876407e
parent 460 0be67c5566c6
child 908 cd411e8827c4
permissions -rw-r--r--
- Removed GetConVarMin/Max() and replaced them with GetConVarBounds()
- Added SetConVarBounds() to set convar constraints after convar has already been created
dvander@444
     1
/**
dvander@444
     2
 * admin-users.sp
dvander@444
     3
 * Reads the admins.cfg file.  Do not compile this directly.
dvander@444
     4
 * This file is part of SourceMod, Copyright (C) 2004-2007 AlliedModders LLC
dvander@444
     5
 *
dvander@444
     6
 * This program is free software; you can redistribute it and/or
dvander@444
     7
 * modify it under the terms of the GNU General Public License
dvander@444
     8
 * as published by the Free Software Foundation; either version 2
dvander@444
     9
 * of the License, or (at your option) any later version.
dvander@444
    10
 *
dvander@444
    11
 * This program is distributed in the hope that it will be useful,
dvander@444
    12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
dvander@444
    13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
dvander@444
    14
 * GNU General Public License for more details.
dvander@444
    15
 * 
dvander@444
    16
 * You should have received a copy of the GNU General Public License
dvander@444
    17
 * along with this program; if not, write to the Free Software
dvander@444
    18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
dvander@444
    19
 */
dvander@444
    20
dvander@444
    21
#define USER_STATE_NONE			0
dvander@444
    22
#define USER_STATE_ADMINS		1
dvander@444
    23
#define USER_STATE_INADMIN		2
dvander@444
    24
dvander@444
    25
static Handle:g_hUserParser = INVALID_HANDLE;
dvander@444
    26
static AdminId:g_CurUser = INVALID_ADMIN_ID;
dvander@444
    27
static g_UserState = USER_STATE_NONE;
dvander@444
    28
static String:g_CurAuth[64];
dvander@444
    29
static String:g_CurIdent[64];
dvander@444
    30
dvander@444
    31
public SMCResult:ReadUsers_NewSection(Handle:smc, const String:name[], bool:opt_quotes)
dvander@444
    32
{
dvander@444
    33
	if (g_IgnoreLevel)
dvander@444
    34
	{
dvander@444
    35
		g_IgnoreLevel++;
dvander@444
    36
		return SMCParse_Continue;
dvander@444
    37
	}
dvander@444
    38
	
dvander@444
    39
	if (g_UserState == USER_STATE_NONE)
dvander@444
    40
	{
dvander@444
    41
		if (StrEqual(name, "Admins"))
dvander@444
    42
		{
dvander@444
    43
			g_UserState = USER_STATE_ADMINS;
dvander@444
    44
			g_CurUser = INVALID_ADMIN_ID;
dvander@444
    45
		} else {
dvander@444
    46
			g_IgnoreLevel++;
dvander@444
    47
		}
dvander@444
    48
	} else if (g_UserState == USER_STATE_ADMINS) {
dvander@444
    49
		g_UserState = USER_STATE_INADMIN;
dvander@444
    50
		g_CurUser = CreateAdmin(name);
dvander@444
    51
		g_CurAuth[0] = '\0';
dvander@444
    52
		g_CurIdent[0] = '\0';
dvander@444
    53
	} else {
dvander@444
    54
		g_IgnoreLevel++;
dvander@444
    55
	}
dvander@444
    56
	
dvander@444
    57
	return SMCParse_Continue;
dvander@444
    58
}
dvander@444
    59
dvander@444
    60
public SMCResult:ReadUsers_KeyValue(Handle:smc, 
dvander@444
    61
									const String:key[], 
dvander@444
    62
									const String:value[], 
dvander@444
    63
									bool:key_quotes, 
dvander@444
    64
									bool:value_quotes)
dvander@444
    65
{
dvander@444
    66
	if (g_UserState != USER_STATE_INADMIN
dvander@444
    67
		|| g_IgnoreLevel
dvander@444
    68
		|| g_CurUser == INVALID_ADMIN_ID)
dvander@444
    69
	{
dvander@444
    70
		return SMCParse_Continue;
dvander@444
    71
	}
dvander@444
    72
	
dvander@444
    73
	new bool:auth = false;
dvander@444
    74
	
dvander@444
    75
	if (StrEqual(key, "auth"))
dvander@444
    76
	{
dvander@444
    77
		auth = true;
dvander@444
    78
		StrCopy(g_CurAuth, sizeof(g_CurAuth), value);
dvander@460
    79
	} else if (StrEqual(key, "identity")) {
dvander@444
    80
		auth = true;
dvander@444
    81
		StrCopy(g_CurIdent, sizeof(g_CurIdent), value);
dvander@444
    82
	} else if (StrEqual(key, "password")) {
dvander@444
    83
		SetAdminPassword(g_CurUser, value);
dvander@444
    84
	} else if (StrEqual(key, "group")) {
dvander@444
    85
		new GroupId:id = FindAdmGroup(value);
dvander@444
    86
		if (id == INVALID_GROUP_ID)
dvander@444
    87
		{
dvander@444
    88
			ParseError("Unknown group \"%s\"", value);
dvander@444
    89
		} else if (!AdminInheritGroup(g_CurUser, id)) {
dvander@444
    90
			ParseError("Unable to inherit group \"%s\"", value);
dvander@444
    91
		}
dvander@444
    92
	} else if (StrEqual(key, "flags")) {
dvander@444
    93
		new len = strlen(value);
dvander@444
    94
		
dvander@444
    95
		for (new i=0; i<len; i++)
dvander@444
    96
		{
dvander@444
    97
			if (value[i] < 'a' || value[i] > 'z')
dvander@444
    98
			{
dvander@444
    99
				ParseError("Invalid flag detected: %c", value[i]);
dvander@444
   100
				continue;
dvander@444
   101
			}
dvander@444
   102
			new val = value[i] - 'a';
dvander@444
   103
			if (!g_FlagsSet[val])
dvander@444
   104
			{
dvander@444
   105
				ParseError("Invalid flag detected: %c", value[i]);
dvander@444
   106
				continue;
dvander@444
   107
			}
dvander@444
   108
			SetAdminFlag(g_CurUser, g_FlagLetters[val], true);
dvander@444
   109
		}
dvander@444
   110
	}
dvander@444
   111
dvander@444
   112
	if (auth && g_CurIdent[0] && g_CurAuth[0])
dvander@444
   113
	{
dvander@444
   114
		if (BindAdminIdentity(g_CurUser, g_CurAuth, g_CurIdent))
dvander@444
   115
		{
dvander@444
   116
			g_CurAuth[0] = '\0';
dvander@444
   117
			g_CurIdent[0] = '\0';
dvander@444
   118
		} else {
dvander@444
   119
			ParseError("Failed to bind auth \"%s\" to identity \"%s\"", g_CurAuth, g_CurIdent);
dvander@444
   120
		}
dvander@444
   121
	}
dvander@444
   122
	
dvander@444
   123
	return SMCParse_Continue;
dvander@444
   124
}
dvander@444
   125
dvander@444
   126
public SMCResult:ReadUsers_EndSection(Handle:smc)
dvander@444
   127
{
dvander@444
   128
	if (g_IgnoreLevel)
dvander@444
   129
	{
dvander@444
   130
		g_IgnoreLevel--;
dvander@444
   131
		return SMCParse_Continue;
dvander@444
   132
	}
dvander@444
   133
	
dvander@444
   134
	if (g_UserState == USER_STATE_INADMIN)
dvander@444
   135
	{
dvander@444
   136
		g_UserState = USER_STATE_ADMINS;
dvander@444
   137
		g_CurUser = INVALID_ADMIN_ID;
dvander@444
   138
	} else if (g_UserState == USER_STATE_ADMINS) {
dvander@444
   139
		g_UserState = USER_STATE_NONE;
dvander@444
   140
	}
dvander@444
   141
	
dvander@444
   142
	return SMCParse_Continue;
dvander@444
   143
}
dvander@444
   144
dvander@444
   145
static InitializeUserParser()
dvander@444
   146
{
dvander@444
   147
	if (g_hUserParser == INVALID_HANDLE)
dvander@444
   148
	{
dvander@444
   149
		g_hUserParser = SMC_CreateParser();
dvander@444
   150
		SMC_SetReaders(g_hUserParser,
dvander@444
   151
					   ReadUsers_NewSection,
dvander@444
   152
					   ReadUsers_KeyValue,
dvander@444
   153
					   ReadUsers_EndSection);
dvander@444
   154
	}
dvander@444
   155
}
dvander@444
   156
dvander@444
   157
ReadUsers()
dvander@444
   158
{
dvander@444
   159
	InitializeUserParser();
dvander@444
   160
	
dvander@446
   161
	BuildPath(Path_SM, g_Filename, sizeof(g_Filename), "configs/admins.cfg");
dvander@444
   162
dvander@444
   163
	/* Set states */
dvander@444
   164
	InitGlobalStates();
dvander@444
   165
	g_UserState = USER_STATE_NONE;
dvander@444
   166
		
dvander@444
   167
	new SMCError:err = SMC_ParseFile(g_hUserParser, g_Filename);
dvander@444
   168
	if (err != SMCError_Okay)
dvander@444
   169
	{
dvander@444
   170
		decl String:buffer[64];
dvander@444
   171
		if (SMC_GetErrorString(err, buffer, sizeof(buffer)))
dvander@444
   172
		{
dvander@444
   173
			ParseError("%s", buffer);
dvander@444
   174
		} else {
dvander@444
   175
			ParseError("Fatal parse error");
dvander@444
   176
		}
dvander@444
   177
	}
dvander@444
   178
}