plugins/admin-flatfile/admin-simple.sp
author David Anderson <dvander@alliedmods.net>
Sat Dec 22 08:57:08 2007 +0000 (2007-12-22)
changeset 1813 372939c88bc7
parent 1607 66b03a0e6ba7
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@637
     1
/**
ds@1330
     2
 * vim: set ts=4 :
ds@1330
     3
 * =============================================================================
ds@1330
     4
 * SourceMod Admin File Reader Plugin
dvander@637
     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@637
     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@637
    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@637
    32
 */
ds@1330
    33
dvander@639
    34
public ReadSimpleUsers()
dvander@637
    35
{
dvander@637
    36
	BuildPath(Path_SM, g_Filename, sizeof(g_Filename), "configs/admins_simple.ini");
dvander@637
    37
	
dvander@637
    38
	new Handle:file = OpenFile(g_Filename, "rt");
dvander@637
    39
	if (file == INVALID_HANDLE)
dvander@637
    40
	{
dvander@637
    41
		ParseError("Could not open file!");
dvander@637
    42
		return;
dvander@637
    43
	}
dvander@637
    44
	
dvander@637
    45
	while (!IsEndOfFile(file))
dvander@637
    46
	{
dvander@637
    47
		decl String:line[255];
dvander@639
    48
		if (!ReadFileLine(file, line, sizeof(line)))
dvander@639
    49
		{
dvander@639
    50
			break;
dvander@639
    51
		}
dvander@637
    52
		
dvander@1107
    53
		/* Trim comments */
dvander@1107
    54
		new len = strlen(line);
dvander@1107
    55
		new bool:ignoring = false;
dvander@1107
    56
		for (new i=0; i<len; i++)
dvander@1107
    57
		{
dvander@1107
    58
			if (ignoring)
dvander@1107
    59
			{
dvander@1107
    60
				if (line[i] == '"')
dvander@1107
    61
				{
dvander@1107
    62
					ignoring = false;
dvander@1107
    63
				}
dvander@1107
    64
			} else {
dvander@1107
    65
				if (line[i] == '"')
dvander@1107
    66
				{
dvander@1107
    67
					ignoring = true;
dvander@1107
    68
				} else if (line[i] == ';') {
dvander@1107
    69
					line[i] = '\0';
dvander@1107
    70
					break;
dvander@1107
    71
				} else if (line[i] == '/'
dvander@1107
    72
							&& i != len - 1
dvander@1107
    73
							&& line[i+1] == '/')
dvander@1107
    74
				{
dvander@1107
    75
					line[i] = '\0';
dvander@1107
    76
					break;
dvander@1107
    77
				}
dvander@1107
    78
			}
dvander@1107
    79
		}
dvander@1107
    80
		
dvander@1107
    81
		TrimString(line);
dvander@1107
    82
		
dvander@637
    83
		if ((line[0] == '/' && line[1] == '/')
dvander@637
    84
			|| (line[0] == ';' || line[0] == '\0'))
dvander@637
    85
		{
dvander@637
    86
			continue;
dvander@637
    87
		}
dvander@637
    88
	
dvander@637
    89
		ReadAdminLine(line);
dvander@637
    90
	}
dvander@637
    91
	
dvander@637
    92
	CloseHandle(file);
dvander@637
    93
}
dvander@637
    94
dvander@637
    95
ReadAdminLine(const String:line[])
dvander@637
    96
{
dvander@637
    97
	new String:auth[64];
ds@1268
    98
	new cur_idx = BreakString(line, auth, sizeof(auth));
dvander@637
    99
	new idx = cur_idx;
dvander@637
   100
	
dvander@637
   101
	if (cur_idx == -1)
dvander@637
   102
	{
dvander@637
   103
		/* This line is bad... we need at least two parameters */
dvander@637
   104
		return;
dvander@637
   105
	}
dvander@637
   106
	
dvander@637
   107
	/* Create the admin */
dvander@1607
   108
	new AdminId:admin = CreateAdmin();
dvander@637
   109
	
dvander@637
   110
	/* Read flags */
dvander@637
   111
	new String:flags[64];	
ds@1268
   112
	cur_idx = BreakString(line[idx], flags, sizeof(flags));
dvander@637
   113
	idx += cur_idx;
dvander@1403
   114
dvander@1403
   115
	/* Read immunity level, if any */
dvander@1403
   116
	new level, flag_idx;
dvander@1403
   117
dvander@1403
   118
	if ((flag_idx = StringToIntEx(flags, level)) > 0)
dvander@637
   119
	{
dvander@1403
   120
		SetAdminImmunityLevel(admin, level);
dvander@1403
   121
		if (flags[flag_idx] == ':')
dvander@1403
   122
		{
dvander@1403
   123
			flag_idx++;
dvander@1403
   124
		}
dvander@1403
   125
	}
dvander@1403
   126
dvander@1403
   127
	if (flags[flag_idx] == '@')
dvander@1403
   128
	{
dvander@1403
   129
		new GroupId:gid = FindAdmGroup(flags[flag_idx + 1]);
dvander@637
   130
		if (gid == INVALID_GROUP_ID)
dvander@637
   131
		{
dvander@1403
   132
			ParseError("Invalid group detected: %s", flags[flag_idx + 1]);
dvander@637
   133
			return;
dvander@637
   134
		}
dvander@637
   135
		AdminInheritGroup(admin, gid);
dvander@637
   136
	} else {
dvander@1403
   137
		new len = strlen(flags[flag_idx]);
dvander@637
   138
		new bool:is_default = false;
dvander@637
   139
		for (new i=0; i<len; i++)
dvander@637
   140
		{
dvander@1403
   141
			if (!level && flags[flag_idx + i] == '$')
dvander@637
   142
			{
dvander@1403
   143
				SetAdminImmunityLevel(admin, 1);
dvander@1298
   144
			} else {
dvander@1298
   145
				new AdminFlag:flag;
dvander@1298
   146
				
dvander@1403
   147
				if (!FindFlagByChar(flags[flag_idx + i], flag))
dvander@637
   148
				{
dvander@1403
   149
					ParseError("Invalid flag detected: %c", flags[flag_idx + i]);
dvander@1298
   150
					continue;
dvander@637
   151
				}
dvander@1298
   152
				SetAdminFlag(admin, flag, true);
dvander@637
   153
			}
dvander@637
   154
		}
dvander@637
   155
		
dvander@637
   156
		if (is_default)
dvander@637
   157
		{
dvander@637
   158
			new GroupId:gid = FindAdmGroup("Default");
dvander@637
   159
			if (gid != INVALID_GROUP_ID)
dvander@637
   160
			{
dvander@637
   161
				AdminInheritGroup(admin, gid);
dvander@637
   162
			}
dvander@637
   163
		}
dvander@637
   164
	}
dvander@637
   165
	
dvander@637
   166
	/* Lastly, is there a password? */
dvander@637
   167
	if (cur_idx != -1)
dvander@637
   168
	{
dvander@637
   169
		decl String:password[64];
ds@1268
   170
		BreakString(line[idx], password, sizeof(password));
dvander@637
   171
		SetAdminPassword(admin, password);
dvander@637
   172
	}
dvander@637
   173
	
dvander@637
   174
	/* Now, bind the identity to something */
dvander@637
   175
	if (StrContains(auth, "STEAM_") == 0)
dvander@637
   176
	{
dvander@637
   177
		BindAdminIdentity(admin, AUTHMETHOD_STEAM, auth);
dvander@637
   178
	} else {
dvander@637
   179
		if (auth[0] == '!')
dvander@637
   180
		{
dvander@637
   181
			BindAdminIdentity(admin, AUTHMETHOD_IP, auth[1]);
dvander@637
   182
		} else {
dvander@637
   183
			BindAdminIdentity(admin, AUTHMETHOD_NAME, auth);
dvander@637
   184
		}
dvander@637
   185
	}
dvander@637
   186
}
dvander@1403
   187