1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/core/smn_admin.cpp Sun Mar 30 07:00:22 2008 +0000
1.3 @@ -0,0 +1,572 @@
1.4 +/**
1.5 + * vim: set ts=4 :
1.6 + * =============================================================================
1.7 + * SourceMod
1.8 + * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
1.9 + * =============================================================================
1.10 + *
1.11 + * This program is free software; you can redistribute it and/or modify it under
1.12 + * the terms of the GNU General Public License, version 3.0, as published by the
1.13 + * Free Software Foundation.
1.14 + *
1.15 + * This program is distributed in the hope that it will be useful, but WITHOUT
1.16 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
1.17 + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
1.18 + * details.
1.19 + *
1.20 + * You should have received a copy of the GNU General Public License along with
1.21 + * this program. If not, see <http://www.gnu.org/licenses/>.
1.22 + *
1.23 + * As a special exception, AlliedModders LLC gives you permission to link the
1.24 + * code of this program (as well as its derivative works) to "Half-Life 2," the
1.25 + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
1.26 + * by the Valve Corporation. You must obey the GNU General Public License in
1.27 + * all respects for all other code used. Additionally, AlliedModders LLC grants
1.28 + * this exception to all derivative works. AlliedModders LLC defines further
1.29 + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
1.30 + * or <http://www.sourcemod.net/license.php>.
1.31 + *
1.32 + * Version: $Id$
1.33 + */
1.34 +
1.35 +#include "sm_globals.h"
1.36 +#include "AdminCache.h"
1.37 +#include "ForwardSys.h"
1.38 +
1.39 +static cell_t DumpAdminCache(IPluginContext *pContext, const cell_t *params)
1.40 +{
1.41 + g_Admins.DumpAdminCache((AdminCachePart)params[1], (params[2] == 1) ? true : false);
1.42 + return 1;
1.43 +}
1.44 +
1.45 +static cell_t AddCommandOverride(IPluginContext *pContext, const cell_t *params)
1.46 +{
1.47 + char *str;
1.48 +
1.49 + pContext->LocalToString(params[1], &str);
1.50 + g_Admins.AddCommandOverride(str, (OverrideType)params[2], (AdminFlag)params[3]);
1.51 +
1.52 + return 1;
1.53 +}
1.54 +
1.55 +static cell_t GetCommandOverride(IPluginContext *pContext, const cell_t *params)
1.56 +{
1.57 + char *cmd;
1.58 + FlagBits flags;
1.59 +
1.60 + pContext->LocalToString(params[1], &cmd);
1.61 +
1.62 + if (!g_Admins.GetCommandOverride(cmd, (OverrideType)params[2], &flags))
1.63 + {
1.64 + return 0;
1.65 + }
1.66 +
1.67 + cell_t *addr;
1.68 + pContext->LocalToPhysAddr(params[3], &addr);
1.69 +
1.70 + *addr = (cell_t)flags;
1.71 +
1.72 + return 1;
1.73 +}
1.74 +
1.75 +static cell_t UnsetCommandOverride(IPluginContext *pContext, const cell_t *params)
1.76 +{
1.77 + char *cmd;
1.78 +
1.79 + pContext->LocalToString(params[1], &cmd);
1.80 +
1.81 + g_Admins.UnsetCommandOverride(cmd, (OverrideType)params[2]);
1.82 +
1.83 + return 1;
1.84 +}
1.85 +
1.86 +static cell_t CreateAdmGroup(IPluginContext *pContext, const cell_t *params)
1.87 +{
1.88 + char *str;
1.89 +
1.90 + pContext->LocalToString(params[1], &str);
1.91 +
1.92 + return g_Admins.AddGroup(str);
1.93 +}
1.94 +
1.95 +static cell_t FindAdmGroup(IPluginContext *pContext, const cell_t *params)
1.96 +{
1.97 + char *str;
1.98 +
1.99 + pContext->LocalToString(params[1], &str);
1.100 +
1.101 + return g_Admins.FindGroupByName(str);
1.102 +}
1.103 +
1.104 +static cell_t SetAdmGroupAddFlag(IPluginContext *pContext, const cell_t *params)
1.105 +{
1.106 + GroupId id = (GroupId)params[1];
1.107 + AdminFlag flag = (AdminFlag)params[2];
1.108 + bool enabled = params[3] ? 1 : 0;
1.109 +
1.110 + g_Admins.SetGroupAddFlag(id, flag, enabled);
1.111 +
1.112 + return 1;
1.113 +}
1.114 +
1.115 +static cell_t GetAdmGroupAddFlag(IPluginContext *pContext, const cell_t *params)
1.116 +{
1.117 + GroupId id = (GroupId)params[1];
1.118 + AdminFlag flag = (AdminFlag)params[2];
1.119 +
1.120 + return g_Admins.GetGroupAddFlag(id, flag) ? 1 : 0;
1.121 +}
1.122 +
1.123 +static cell_t SetAdmGroupImmunity(IPluginContext *pContext, const cell_t *params)
1.124 +{
1.125 + GroupId id = (GroupId)params[1];
1.126 + ImmunityType type = (ImmunityType)params[2];
1.127 + bool enabled = params[3] ? 1 : 0;
1.128 +
1.129 + g_Admins.SetGroupGenericImmunity(id, type, enabled);
1.130 +
1.131 + return 1;
1.132 +}
1.133 +
1.134 +static cell_t GetAdmGroupImmunity(IPluginContext *pContext, const cell_t *params)
1.135 +{
1.136 + GroupId id = (GroupId)params[1];
1.137 + ImmunityType type = (ImmunityType)params[2];
1.138 +
1.139 + return g_Admins.GetGroupGenericImmunity(id, type) ? 1 : 0;
1.140 +}
1.141 +
1.142 +static cell_t SetAdmGroupImmuneFrom(IPluginContext *pContext, const cell_t *params)
1.143 +{
1.144 + GroupId id = (GroupId)params[1];
1.145 + GroupId other_id = (GroupId)params[2];
1.146 +
1.147 + g_Admins.AddGroupImmunity(id, other_id);
1.148 +
1.149 + return 1;
1.150 +}
1.151 +
1.152 +static cell_t GetAdmGroupImmuneCount(IPluginContext *pContext, const cell_t *params)
1.153 +{
1.154 + GroupId id = (GroupId)params[1];
1.155 +
1.156 + return g_Admins.GetGroupImmunityCount(id);
1.157 +}
1.158 +
1.159 +static cell_t GetAdmGroupImmuneFrom(IPluginContext *pContext, const cell_t *params)
1.160 +{
1.161 + GroupId id = (GroupId)params[1];
1.162 +
1.163 + return g_Admins.GetGroupImmunity(id, params[2]);
1.164 +}
1.165 +
1.166 +static cell_t AddAdmGroupCmdOverride(IPluginContext *pContext, const cell_t *params)
1.167 +{
1.168 + GroupId id = (GroupId)params[1];
1.169 + OverrideType type = (OverrideType)params[3];
1.170 + OverrideRule rule = (OverrideRule)params[4];
1.171 + char *cmd;
1.172 +
1.173 + pContext->LocalToString(params[2], &cmd);
1.174 +
1.175 + g_Admins.AddGroupCommandOverride(id, cmd, type, rule);
1.176 +
1.177 + return 1;
1.178 +}
1.179 +
1.180 +static cell_t GetAdmGroupCmdOverride(IPluginContext *pContext, const cell_t *params)
1.181 +{
1.182 + GroupId id = (GroupId)params[1];
1.183 + OverrideType type = (OverrideType)params[3];
1.184 + OverrideRule rule;
1.185 + char *cmd;
1.186 +
1.187 + pContext->LocalToString(params[2], &cmd);
1.188 +
1.189 + if (!g_Admins.GetGroupCommandOverride(id, cmd, type, &rule))
1.190 + {
1.191 + return 0;
1.192 + }
1.193 +
1.194 + cell_t *addr;
1.195 + pContext->LocalToPhysAddr(params[4], &addr);
1.196 + *addr = (cell_t)rule;
1.197 +
1.198 + return 1;
1.199 +}
1.200 +
1.201 +static cell_t GetAdmGroupAddFlags(IPluginContext *pContext, const cell_t *params)
1.202 +{
1.203 + GroupId id = (GroupId)params[1];
1.204 + return g_Admins.GetGroupAddFlags(id);
1.205 +}
1.206 +
1.207 +static cell_t RegisterAuthIdentType(IPluginContext *pContext, const cell_t *params)
1.208 +{
1.209 + char *type;
1.210 + pContext->LocalToString(params[1], &type);
1.211 +
1.212 + g_Admins.RegisterAuthIdentType(type);
1.213 +
1.214 + return 1;
1.215 +}
1.216 +
1.217 +static cell_t CreateAdmin(IPluginContext *pContext, const cell_t *params)
1.218 +{
1.219 + char *admin;
1.220 + pContext->LocalToString(params[1], &admin);
1.221 +
1.222 + if (admin[0] == '\0')
1.223 + {
1.224 + admin = NULL;
1.225 + }
1.226 +
1.227 + return g_Admins.CreateAdmin(admin);
1.228 +}
1.229 +
1.230 +static cell_t GetAdminUsername(IPluginContext *pContext, const cell_t *params)
1.231 +{
1.232 + AdminId id = params[1];
1.233 + size_t written;
1.234 + const char *name = g_Admins.GetAdminName(id);
1.235 +
1.236 + if (!name)
1.237 + {
1.238 + return 0;
1.239 + }
1.240 +
1.241 + pContext->StringToLocalUTF8(params[2], params[3], name, &written);
1.242 +
1.243 + return written;
1.244 +}
1.245 +
1.246 +static cell_t BindAdminIdentity(IPluginContext *pContext, const cell_t *params)
1.247 +{
1.248 + AdminId id = params[1];
1.249 + char *auth, *ident;
1.250 +
1.251 + pContext->LocalToString(params[2], &auth);
1.252 + pContext->LocalToString(params[3], &ident);
1.253 +
1.254 + return g_Admins.BindAdminIdentity(id, auth, ident);
1.255 +}
1.256 +
1.257 +static cell_t SetAdminFlag(IPluginContext *pContext, const cell_t *params)
1.258 +{
1.259 + AdminId id = params[1];
1.260 + AdminFlag flag = (AdminFlag)params[2];
1.261 + bool enabled = params[3] ? true : false;
1.262 +
1.263 + g_Admins.SetAdminFlag(id, flag, enabled);
1.264 +
1.265 + return 1;
1.266 +}
1.267 +
1.268 +static cell_t GetAdminFlag(IPluginContext *pContext, const cell_t *params)
1.269 +{
1.270 + AdminId id = params[1];
1.271 + AdminFlag flag = (AdminFlag)params[2];
1.272 + AccessMode mode = (AccessMode)params[3];
1.273 +
1.274 + return g_Admins.GetAdminFlag(id, flag, mode);
1.275 +}
1.276 +
1.277 +static cell_t GetAdminFlags(IPluginContext *pContext, const cell_t *params)
1.278 +{
1.279 + AdminId id = params[1];
1.280 + AccessMode mode = (AccessMode)params[2];
1.281 +
1.282 + return g_Admins.GetAdminFlags(id, mode);
1.283 +}
1.284 +
1.285 +static cell_t AdminInheritGroup(IPluginContext *pContext, const cell_t *params)
1.286 +{
1.287 + AdminId id = params[1];
1.288 + GroupId gid = params[2];
1.289 +
1.290 + return g_Admins.AdminInheritGroup(id, gid);
1.291 +}
1.292 +
1.293 +static cell_t GetAdminGroupCount(IPluginContext *pContext, const cell_t *params)
1.294 +{
1.295 + AdminId id = params[1];
1.296 +
1.297 + return g_Admins.GetAdminGroupCount(id);
1.298 +}
1.299 +
1.300 +static cell_t GetAdminGroup(IPluginContext *pContext, const cell_t *params)
1.301 +{
1.302 + AdminId id = params[1];
1.303 + unsigned int index = params[2];
1.304 + const char *name;
1.305 + GroupId gid;
1.306 +
1.307 + if ((gid=g_Admins.GetAdminGroup(id, index, &name)) == INVALID_GROUP_ID)
1.308 + {
1.309 + return gid;
1.310 + }
1.311 +
1.312 + if (name == NULL)
1.313 + {
1.314 + name = "";
1.315 + }
1.316 +
1.317 + pContext->StringToLocalUTF8(params[3], params[4], name, NULL);
1.318 +
1.319 + return gid;
1.320 +}
1.321 +
1.322 +static cell_t SetAdminPassword(IPluginContext *pContext, const cell_t *params)
1.323 +{
1.324 + AdminId id = params[1];
1.325 + char *password;
1.326 +
1.327 + pContext->LocalToString(params[2], &password);
1.328 +
1.329 + g_Admins.SetAdminPassword(id, password);
1.330 +
1.331 + return 1;
1.332 +}
1.333 +
1.334 +static cell_t GetAdminPassword(IPluginContext *pContext, const cell_t *params)
1.335 +{
1.336 + AdminId id = params[1];
1.337 + const char *password = g_Admins.GetAdminPassword(id);
1.338 +
1.339 + if (!password)
1.340 + {
1.341 + return 0;
1.342 + }
1.343 +
1.344 + pContext->StringToLocalUTF8(params[2], params[3], password, NULL);
1.345 +
1.346 + return 1;
1.347 +}
1.348 +
1.349 +static cell_t FindAdminByIdentity(IPluginContext *pContext, const cell_t *params)
1.350 +{
1.351 + char *auth, *ident;
1.352 +
1.353 + pContext->LocalToString(params[1], &auth);
1.354 + pContext->LocalToString(params[2], &ident);
1.355 +
1.356 + return g_Admins.FindAdminByIdentity(auth, ident);
1.357 +}
1.358 +
1.359 +static cell_t RemoveAdmin(IPluginContext *pContext, const cell_t *params)
1.360 +{
1.361 + AdminId id = params[1];
1.362 +
1.363 + return g_Admins.InvalidateAdmin(id);
1.364 +}
1.365 +
1.366 +static cell_t FlagBitsToBitArray(IPluginContext *pContext, const cell_t *params)
1.367 +{
1.368 + FlagBits bits = (FlagBits)params[1];
1.369 + bool array[AdminFlags_TOTAL];
1.370 + cell_t *addr;
1.371 + unsigned int numWr = g_Admins.FlagBitsToBitArray(bits, array, AdminFlags_TOTAL);
1.372 +
1.373 + pContext->LocalToPhysAddr(params[2], &addr);
1.374 +
1.375 + unsigned int i;
1.376 + for (i=0; i<numWr && i<(unsigned int)params[3]; i++)
1.377 + {
1.378 + addr[i] = array[i] ? 1 : 0;
1.379 + }
1.380 +
1.381 + return i;
1.382 +}
1.383 +
1.384 +static cell_t FlagBitArrayToBits(IPluginContext *pContext, const cell_t *params)
1.385 +{
1.386 + bool array[AdminFlags_TOTAL];
1.387 + unsigned int num = ((unsigned int)params[2] > AdminFlags_TOTAL ? params[2] : AdminFlags_TOTAL);
1.388 + cell_t *addr;
1.389 +
1.390 + pContext->LocalToPhysAddr(params[1], &addr);
1.391 +
1.392 + for (unsigned int i=0; i<num; i++)
1.393 + {
1.394 + array[i] = addr[i] ? true : false;
1.395 + }
1.396 +
1.397 + return g_Admins.FlagBitArrayToBits(array, num);
1.398 +}
1.399 +
1.400 +static cell_t FlagArrayToBits(IPluginContext *pContext, const cell_t *params)
1.401 +{
1.402 + cell_t *addr;
1.403 + pContext->LocalToPhysAddr(params[1], &addr);
1.404 +
1.405 + if (sizeof(AdminFlag) == sizeof(cell_t))
1.406 + {
1.407 + return g_Admins.FlagArrayToBits((const AdminFlag *)addr, params[2]);
1.408 + } else {
1.409 + AdminFlag flags[AdminFlags_TOTAL];
1.410 + unsigned int num = ((unsigned)params[2] > AdminFlags_TOTAL ? AdminFlags_TOTAL : params[2]);
1.411 +
1.412 + for (unsigned int i=0; i<num; i++)
1.413 + {
1.414 + flags[i] = (AdminFlag)addr[i];
1.415 + }
1.416 + return g_Admins.FlagArrayToBits(flags, num);
1.417 + }
1.418 +}
1.419 +
1.420 +static cell_t FlagBitsToArray(IPluginContext *pContext, const cell_t *params)
1.421 +{
1.422 + cell_t *addr;
1.423 + pContext->LocalToPhysAddr(params[2], &addr);
1.424 +
1.425 + if (sizeof(AdminFlag) == sizeof(cell_t))
1.426 + {
1.427 + return g_Admins.FlagBitsToArray(params[1], (AdminFlag *)addr, params[3]);
1.428 + } else {
1.429 + AdminFlag flags[AdminFlags_TOTAL];
1.430 + unsigned int num = ((unsigned)params[2] > AdminFlags_TOTAL ? AdminFlags_TOTAL : params[2]);
1.431 + num = g_Admins.FlagBitsToArray(params[1], flags, num);
1.432 +
1.433 + for (unsigned int i=0; i<num; i++)
1.434 + {
1.435 + addr[i] = flags[i];
1.436 + }
1.437 +
1.438 + return num;
1.439 + }
1.440 +}
1.441 +
1.442 +static cell_t CanAdminTarget(IPluginContext *pContext, const cell_t *params)
1.443 +{
1.444 + return g_Admins.CanAdminTarget(params[1], params[2]) ? 1 : 0;
1.445 +}
1.446 +
1.447 +static cell_t CreateAuthMethod(IPluginContext *pContext, const cell_t *params)
1.448 +{
1.449 + char *name;
1.450 + pContext->LocalToString(params[1], &name);
1.451 + g_Admins.RegisterAuthIdentType(name);
1.452 +
1.453 + return 1;
1.454 +}
1.455 +
1.456 +static cell_t SetAdmGroupImmunityLevel(IPluginContext *pContext, const cell_t *params)
1.457 +{
1.458 + return g_Admins.SetGroupImmunityLevel(params[1], params[2]);
1.459 +}
1.460 +
1.461 +static cell_t GetAdmGroupImmunityLevel(IPluginContext *pContext, const cell_t *params)
1.462 +{
1.463 + return g_Admins.GetGroupImmunityLevel(params[1]);
1.464 +}
1.465 +
1.466 +static cell_t SetAdminImmunityLevel(IPluginContext *pContext, const cell_t *params)
1.467 +{
1.468 + return g_Admins.SetAdminImmunityLevel(params[1], params[2]);
1.469 +}
1.470 +
1.471 +static cell_t GetAdminImmunityLevel(IPluginContext *pContext, const cell_t *params)
1.472 +{
1.473 + return g_Admins.GetAdminImmunityLevel(params[1]);
1.474 +}
1.475 +
1.476 +static cell_t FindFlagByName(IPluginContext *pContext, const cell_t *params)
1.477 +{
1.478 + char *flag;
1.479 + pContext->LocalToString(params[1], &flag);
1.480 +
1.481 + cell_t *addr;
1.482 + pContext->LocalToPhysAddr(params[2], &addr);
1.483 +
1.484 + AdminFlag admflag;
1.485 + if (!g_Admins.FindFlag(flag, &admflag))
1.486 + {
1.487 + return 0;
1.488 + }
1.489 +
1.490 + *addr = (cell_t)admflag;
1.491 +
1.492 + return 1;
1.493 +}
1.494 +
1.495 +static cell_t FindFlagByChar(IPluginContext *pContext, const cell_t *params)
1.496 +{
1.497 + cell_t *addr;
1.498 + pContext->LocalToPhysAddr(params[2], &addr);
1.499 +
1.500 + AdminFlag admflag;
1.501 + if (!g_Admins.FindFlag((char)params[1], &admflag))
1.502 + {
1.503 + return 0;
1.504 + }
1.505 +
1.506 + *addr = (cell_t)admflag;
1.507 +
1.508 + return 1;
1.509 +}
1.510 +
1.511 +static cell_t ReadFlagString(IPluginContext *pContext, const cell_t *params)
1.512 +{
1.513 + char *flag;
1.514 + pContext->LocalToString(params[1], &flag);
1.515 +
1.516 + cell_t *addr;
1.517 + pContext->LocalToPhysAddr(params[2], &addr);
1.518 +
1.519 + const char *end = flag;
1.520 + FlagBits bits = g_Admins.ReadFlagString(flag, &end);
1.521 +
1.522 + *addr = end - flag;
1.523 +
1.524 + return bits;
1.525 +}
1.526 +
1.527 +REGISTER_NATIVES(adminNatives)
1.528 +{
1.529 + {"DumpAdminCache", DumpAdminCache},
1.530 + {"AddCommandOverride", AddCommandOverride},
1.531 + {"GetCommandOverride", GetCommandOverride},
1.532 + {"UnsetCommandOverride", UnsetCommandOverride},
1.533 + {"CreateAdmGroup", CreateAdmGroup},
1.534 + {"FindAdmGroup", FindAdmGroup},
1.535 + {"SetAdmGroupAddFlag", SetAdmGroupAddFlag},
1.536 + {"GetAdmGroupAddFlag", GetAdmGroupAddFlag},
1.537 + {"SetAdmGroupImmunity", SetAdmGroupImmunity},
1.538 + {"GetAdmGroupImmunity", GetAdmGroupImmunity},
1.539 + {"SetAdmGroupImmuneFrom", SetAdmGroupImmuneFrom},
1.540 + {"GetAdmGroupImmuneFrom", GetAdmGroupImmuneFrom},
1.541 + {"GetAdmGroupImmuneCount", GetAdmGroupImmuneCount},
1.542 + {"AddAdmGroupCmdOverride", AddAdmGroupCmdOverride},
1.543 + {"GetAdmGroupCmdOverride", GetAdmGroupCmdOverride},
1.544 + {"GetAdmGroupAddFlags", GetAdmGroupAddFlags},
1.545 + {"RegisterAuthIdentType", RegisterAuthIdentType},
1.546 + {"CreateAdmin", CreateAdmin},
1.547 + {"GetAdminUsername", GetAdminUsername},
1.548 + {"BindAdminIdentity", BindAdminIdentity},
1.549 + {"SetAdminFlag", SetAdminFlag},
1.550 + {"GetAdminFlag", GetAdminFlag},
1.551 + {"GetAdminFlags", GetAdminFlags},
1.552 + {"AdminInheritGroup", AdminInheritGroup},
1.553 + {"GetAdminGroupCount", GetAdminGroupCount},
1.554 + {"GetAdminGroup", GetAdminGroup},
1.555 + {"SetAdminPassword", SetAdminPassword},
1.556 + {"GetAdminPassword", GetAdminPassword},
1.557 + {"FindAdminByIdentity", FindAdminByIdentity},
1.558 + {"RemoveAdmin", RemoveAdmin},
1.559 + {"FlagBitsToBitArray", FlagBitsToBitArray},
1.560 + {"FlagBitArrayToBits", FlagBitArrayToBits},
1.561 + {"FlagArrayToBits", FlagArrayToBits},
1.562 + {"FlagBitsToArray", FlagBitsToArray},
1.563 + {"CanAdminTarget", CanAdminTarget},
1.564 + {"CreateAuthMethod", CreateAuthMethod},
1.565 + {"FindFlagByName", FindFlagByName},
1.566 + {"FindFlagByChar", FindFlagByChar},
1.567 + {"ReadFlagString", ReadFlagString},
1.568 + {"GetAdmGroupImmunityLevel",GetAdmGroupImmunityLevel},
1.569 + {"SetAdmGroupImmunityLevel",SetAdmGroupImmunityLevel},
1.570 + {"GetAdminImmunityLevel", GetAdminImmunityLevel},
1.571 + {"SetAdminImmunityLevel", SetAdminImmunityLevel},
1.572 + /* -------------------------------------------------- */
1.573 + {NULL, NULL},
1.574 +};
1.575 +