plugins/admin-flatfile/admin-users.sp
author Michael McKoy <ferret99gt@gmail.com>
Fri Jul 27 00:24:15 2007 +0000 (2007-07-27)
changeset 1183 c8ff1fa5cf5c
parent 908 cd411e8827c4
child 1268 9360f5ea2289
permissions -rw-r--r--
Import of basetriggers
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.
ds@908
    19
 *
ds@908
    20
 * Version: $Id$
dvander@444
    21
 */
dvander@444
    22
dvander@444
    23
#define USER_STATE_NONE			0
dvander@444
    24
#define USER_STATE_ADMINS		1
dvander@444
    25
#define USER_STATE_INADMIN		2
dvander@444
    26
dvander@444
    27
static Handle:g_hUserParser = INVALID_HANDLE;
dvander@444
    28
static AdminId:g_CurUser = INVALID_ADMIN_ID;
dvander@444
    29
static g_UserState = USER_STATE_NONE;
dvander@444
    30
static String:g_CurAuth[64];
dvander@444
    31
static String:g_CurIdent[64];
dvander@444
    32
dvander@444
    33
public SMCResult:ReadUsers_NewSection(Handle:smc, const String:name[], bool:opt_quotes)
dvander@444
    34
{
dvander@444
    35
	if (g_IgnoreLevel)
dvander@444
    36
	{
dvander@444
    37
		g_IgnoreLevel++;
dvander@444
    38
		return SMCParse_Continue;
dvander@444
    39
	}
dvander@444
    40
	
dvander@444
    41
	if (g_UserState == USER_STATE_NONE)
dvander@444
    42
	{
dvander@444
    43
		if (StrEqual(name, "Admins"))
dvander@444
    44
		{
dvander@444
    45
			g_UserState = USER_STATE_ADMINS;
dvander@444
    46
			g_CurUser = INVALID_ADMIN_ID;
dvander@444
    47
		} else {
dvander@444
    48
			g_IgnoreLevel++;
dvander@444
    49
		}
dvander@444
    50
	} else if (g_UserState == USER_STATE_ADMINS) {
dvander@444
    51
		g_UserState = USER_STATE_INADMIN;
dvander@444
    52
		g_CurUser = CreateAdmin(name);
dvander@444
    53
		g_CurAuth[0] = '\0';
dvander@444
    54
		g_CurIdent[0] = '\0';
dvander@444
    55
	} else {
dvander@444
    56
		g_IgnoreLevel++;
dvander@444
    57
	}
dvander@444
    58
	
dvander@444
    59
	return SMCParse_Continue;
dvander@444
    60
}
dvander@444
    61
dvander@444
    62
public SMCResult:ReadUsers_KeyValue(Handle:smc, 
dvander@444
    63
									const String:key[], 
dvander@444
    64
									const String:value[], 
dvander@444
    65
									bool:key_quotes, 
dvander@444
    66
									bool:value_quotes)
dvander@444
    67
{
dvander@444
    68
	if (g_UserState != USER_STATE_INADMIN
dvander@444
    69
		|| g_IgnoreLevel
dvander@444
    70
		|| g_CurUser == INVALID_ADMIN_ID)
dvander@444
    71
	{
dvander@444
    72
		return SMCParse_Continue;
dvander@444
    73
	}
dvander@444
    74
	
dvander@444
    75
	new bool:auth = false;
dvander@444
    76
	
dvander@444
    77
	if (StrEqual(key, "auth"))
dvander@444
    78
	{
dvander@444
    79
		auth = true;
dvander@444
    80
		StrCopy(g_CurAuth, sizeof(g_CurAuth), value);
dvander@460
    81
	} else if (StrEqual(key, "identity")) {
dvander@444
    82
		auth = true;
dvander@444
    83
		StrCopy(g_CurIdent, sizeof(g_CurIdent), value);
dvander@444
    84
	} else if (StrEqual(key, "password")) {
dvander@444
    85
		SetAdminPassword(g_CurUser, value);
dvander@444
    86
	} else if (StrEqual(key, "group")) {
dvander@444
    87
		new GroupId:id = FindAdmGroup(value);
dvander@444
    88
		if (id == INVALID_GROUP_ID)
dvander@444
    89
		{
dvander@444
    90
			ParseError("Unknown group \"%s\"", value);
dvander@444
    91
		} else if (!AdminInheritGroup(g_CurUser, id)) {
dvander@444
    92
			ParseError("Unable to inherit group \"%s\"", value);
dvander@444
    93
		}
dvander@444
    94
	} else if (StrEqual(key, "flags")) {
dvander@444
    95
		new len = strlen(value);
dvander@444
    96
		
dvander@444
    97
		for (new i=0; i<len; i++)
dvander@444
    98
		{
dvander@444
    99
			if (value[i] < 'a' || value[i] > 'z')
dvander@444
   100
			{
dvander@444
   101
				ParseError("Invalid flag detected: %c", value[i]);
dvander@444
   102
				continue;
dvander@444
   103
			}
dvander@444
   104
			new val = value[i] - 'a';
dvander@444
   105
			if (!g_FlagsSet[val])
dvander@444
   106
			{
dvander@444
   107
				ParseError("Invalid flag detected: %c", value[i]);
dvander@444
   108
				continue;
dvander@444
   109
			}
dvander@444
   110
			SetAdminFlag(g_CurUser, g_FlagLetters[val], true);
dvander@444
   111
		}
dvander@444
   112
	}
dvander@444
   113
dvander@444
   114
	if (auth && g_CurIdent[0] && g_CurAuth[0])
dvander@444
   115
	{
dvander@444
   116
		if (BindAdminIdentity(g_CurUser, g_CurAuth, g_CurIdent))
dvander@444
   117
		{
dvander@444
   118
			g_CurAuth[0] = '\0';
dvander@444
   119
			g_CurIdent[0] = '\0';
dvander@444
   120
		} else {
dvander@444
   121
			ParseError("Failed to bind auth \"%s\" to identity \"%s\"", g_CurAuth, g_CurIdent);
dvander@444
   122
		}
dvander@444
   123
	}
dvander@444
   124
	
dvander@444
   125
	return SMCParse_Continue;
dvander@444
   126
}
dvander@444
   127
dvander@444
   128
public SMCResult:ReadUsers_EndSection(Handle:smc)
dvander@444
   129
{
dvander@444
   130
	if (g_IgnoreLevel)
dvander@444
   131
	{
dvander@444
   132
		g_IgnoreLevel--;
dvander@444
   133
		return SMCParse_Continue;
dvander@444
   134
	}
dvander@444
   135
	
dvander@444
   136
	if (g_UserState == USER_STATE_INADMIN)
dvander@444
   137
	{
dvander@444
   138
		g_UserState = USER_STATE_ADMINS;
dvander@444
   139
		g_CurUser = INVALID_ADMIN_ID;
dvander@444
   140
	} else if (g_UserState == USER_STATE_ADMINS) {
dvander@444
   141
		g_UserState = USER_STATE_NONE;
dvander@444
   142
	}
dvander@444
   143
	
dvander@444
   144
	return SMCParse_Continue;
dvander@444
   145
}
dvander@444
   146
dvander@444
   147
static InitializeUserParser()
dvander@444
   148
{
dvander@444
   149
	if (g_hUserParser == INVALID_HANDLE)
dvander@444
   150
	{
dvander@444
   151
		g_hUserParser = SMC_CreateParser();
dvander@444
   152
		SMC_SetReaders(g_hUserParser,
dvander@444
   153
					   ReadUsers_NewSection,
dvander@444
   154
					   ReadUsers_KeyValue,
dvander@444
   155
					   ReadUsers_EndSection);
dvander@444
   156
	}
dvander@444
   157
}
dvander@444
   158
dvander@444
   159
ReadUsers()
dvander@444
   160
{
dvander@444
   161
	InitializeUserParser();
dvander@444
   162
	
dvander@446
   163
	BuildPath(Path_SM, g_Filename, sizeof(g_Filename), "configs/admins.cfg");
dvander@444
   164
dvander@444
   165
	/* Set states */
dvander@444
   166
	InitGlobalStates();
dvander@444
   167
	g_UserState = USER_STATE_NONE;
dvander@444
   168
		
dvander@444
   169
	new SMCError:err = SMC_ParseFile(g_hUserParser, g_Filename);
dvander@444
   170
	if (err != SMCError_Okay)
dvander@444
   171
	{
dvander@444
   172
		decl String:buffer[64];
dvander@444
   173
		if (SMC_GetErrorString(err, buffer, sizeof(buffer)))
dvander@444
   174
		{
dvander@444
   175
			ParseError("%s", buffer);
dvander@444
   176
		} else {
dvander@444
   177
			ParseError("Fatal parse error");
dvander@444
   178
		}
dvander@444
   179
	}
dvander@444
   180
}