1.1 --- a/plugins/admin-sql-prefetch.sp Fri Jul 11 06:51:21 2008 +0000
1.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1.3 @@ -1,386 +0,0 @@
1.4 -/**
1.5 - * vim: set ts=4 :
1.6 - * =============================================================================
1.7 - * SourceMod SQL Admins Plugin (Prefetch)
1.8 - * Prefetches admins from an SQL database without threading.
1.9 - *
1.10 - * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved.
1.11 - * =============================================================================
1.12 - *
1.13 - * This program is free software; you can redistribute it and/or modify it under
1.14 - * the terms of the GNU General Public License, version 3.0, as published by the
1.15 - * Free Software Foundation.
1.16 - *
1.17 - * This program is distributed in the hope that it will be useful, but WITHOUT
1.18 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
1.19 - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
1.20 - * details.
1.21 - *
1.22 - * You should have received a copy of the GNU General Public License along with
1.23 - * this program. If not, see <http://www.gnu.org/licenses/>.
1.24 - *
1.25 - * As a special exception, AlliedModders LLC gives you permission to link the
1.26 - * code of this program (as well as its derivative works) to "Half-Life 2," the
1.27 - * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
1.28 - * by the Valve Corporation. You must obey the GNU General Public License in
1.29 - * all respects for all other code used. Additionally, AlliedModders LLC grants
1.30 - * this exception to all derivative works. AlliedModders LLC defines further
1.31 - * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
1.32 - * or <http://www.sourcemod.net/license.php>.
1.33 - *
1.34 - * Version: $Id$
1.35 - */
1.36 -
1.37 -/* We like semicolons */
1.38 -#pragma semicolon 1
1.39 -
1.40 -#include <sourcemod>
1.41 -
1.42 -public Plugin:myinfo =
1.43 -{
1.44 - name = "SQL Admins (Prefetch)",
1.45 - author = "AlliedModders LLC",
1.46 - description = "Reads all admins from SQL",
1.47 - version = SOURCEMOD_VERSION,
1.48 - url = "http://www.sourcemod.net/"
1.49 -};
1.50 -
1.51 -public OnRebuildAdminCache(AdminCachePart:part)
1.52 -{
1.53 - /* First try to get a database connection */
1.54 - decl String:error[255];
1.55 - new Handle:db;
1.56 -
1.57 - if (SQL_CheckConfig("admins"))
1.58 - {
1.59 - db = SQL_Connect("admins", true, error, sizeof(error));
1.60 - } else {
1.61 - db = SQL_Connect("default", true, error, sizeof(error));
1.62 - }
1.63 -
1.64 - if (db == INVALID_HANDLE)
1.65 - {
1.66 - LogError("Could not connect to database \"default\": %s", error);
1.67 - return;
1.68 - }
1.69 -
1.70 - if (part == AdminCache_Overrides)
1.71 - {
1.72 - FetchOverrides(db);
1.73 - } else if (part == AdminCache_Groups) {
1.74 - FetchGroups(db);
1.75 - } else if (part == AdminCache_Admins) {
1.76 - FetchUsers(db);
1.77 - }
1.78 -
1.79 - CloseHandle(db);
1.80 -}
1.81 -
1.82 -FetchUserGroups(Handle:hQuery, AdminId:adm, id)
1.83 -{
1.84 - SQL_BindParamInt(hQuery, 0, id);
1.85 - if (!SQL_Execute(hQuery))
1.86 - {
1.87 - decl String:error[255];
1.88 - SQL_GetError(hQuery, error, sizeof(error));
1.89 - LogError("FetchUserGroups() statement execute failed: %s", error);
1.90 - return;
1.91 - }
1.92 -
1.93 - decl String:name[80];
1.94 - new GroupId:gid;
1.95 - while (SQL_FetchRow(hQuery))
1.96 - {
1.97 - SQL_FetchString(hQuery, 0, name, sizeof(name));
1.98 -
1.99 - if ((gid = FindAdmGroup(name)) == INVALID_GROUP_ID)
1.100 - {
1.101 - /* Group wasn't found, don't bother with it. */
1.102 - continue;
1.103 - }
1.104 -
1.105 - #if defined _DEBUG
1.106 - PrintToServer("Found admin group (%d, %d, %d)", id, gid, adm);
1.107 - #endif
1.108 -
1.109 - AdminInheritGroup(adm, gid);
1.110 - }
1.111 -}
1.112 -
1.113 -FetchUsers(Handle:db)
1.114 -{
1.115 - decl String:query[255], String:error[255];
1.116 - new Handle:hQuery, Handle:hGroupQuery;
1.117 -
1.118 - Format(query, sizeof(query), "SELECT id, authtype, identity, password, flags, name, immunity FROM sm_admins");
1.119 - if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE)
1.120 - {
1.121 - SQL_GetError(db, error, sizeof(error));
1.122 - LogError("FetchUsers() query failed: %s", query);
1.123 - LogError("Query error: %s", error);
1.124 - return;
1.125 - }
1.126 -
1.127 - /* If this fails it's non-fatal */
1.128 - Format(query,
1.129 - sizeof(query),
1.130 - "SELECT g.name FROM sm_admins_groups ag JOIN sm_groups g ON ag.group_id = g.id WHERE ag.admin_id = ? ORDER BY inherit_order ASC");
1.131 - if ((hGroupQuery = SQL_PrepareQuery(db, query, error, sizeof(error))) == INVALID_HANDLE)
1.132 - {
1.133 - LogError("FetchUsers() group query preparation failed: %s", query);
1.134 - LogError("Query error: %s", error);
1.135 - }
1.136 -
1.137 - decl String:authtype[16];
1.138 - decl String:identity[80];
1.139 - decl String:password[80];
1.140 - decl String:flags[32];
1.141 - decl String:name[80];
1.142 - new immunity;
1.143 - new AdminId:adm, id;
1.144 -
1.145 - while (SQL_FetchRow(hQuery))
1.146 - {
1.147 - id = SQL_FetchInt(hQuery, 0);
1.148 - SQL_FetchString(hQuery, 1, authtype, sizeof(authtype));
1.149 - SQL_FetchString(hQuery, 2, identity, sizeof(identity));
1.150 - SQL_FetchString(hQuery, 3, password, sizeof(password));
1.151 - SQL_FetchString(hQuery, 4, flags, sizeof(flags));
1.152 - SQL_FetchString(hQuery, 5, name, sizeof(name));
1.153 - immunity = SQL_FetchInt(hQuery, 6);
1.154 -
1.155 - /* Use a pre-existing admin if we can */
1.156 - if ((adm = FindAdminByIdentity(authtype, identity)) == INVALID_ADMIN_ID)
1.157 - {
1.158 - adm = CreateAdmin(name);
1.159 - if (!BindAdminIdentity(adm, authtype, identity))
1.160 - {
1.161 - LogError("Could not bind prefetched SQL admin (authtype \"%s\") (identity \"%s\")", authtype, identity);
1.162 - continue;
1.163 - }
1.164 - }
1.165 -
1.166 - #if defined _DEBUG
1.167 - PrintToServer("Found SQL admin (%d,%s,%s,%s,%s,%s,%d):%d", id, authtype, identity, password, flags, name, immunity, adm);
1.168 - #endif
1.169 -
1.170 - /* See if this admin wants a password */
1.171 - if (password[0] != '\0')
1.172 - {
1.173 - SetAdminPassword(adm, password);
1.174 - }
1.175 -
1.176 - /* Apply each flag */
1.177 - new len = strlen(flags);
1.178 - new AdminFlag:flag;
1.179 - for (new i=0; i<len; i++)
1.180 - {
1.181 - if (!FindFlagByChar(flags[i], flag))
1.182 - {
1.183 - continue;
1.184 - }
1.185 - SetAdminFlag(adm, flag, true);
1.186 - }
1.187 -
1.188 - SetAdminImmunityLevel(adm, immunity);
1.189 -
1.190 - /* Look up groups */
1.191 - if (hGroupQuery != INVALID_HANDLE)
1.192 - {
1.193 - FetchUserGroups(hGroupQuery, adm, id);
1.194 - }
1.195 - }
1.196 -
1.197 - CloseHandle(hGroupQuery);
1.198 - CloseHandle(hQuery);
1.199 -}
1.200 -
1.201 -FetchGroups(Handle:db)
1.202 -{
1.203 - decl String:query[255];
1.204 - new Handle:hQuery;
1.205 -
1.206 - Format(query, sizeof(query), "SELECT flags, name, immunity_level FROM sm_groups");
1.207 -
1.208 - if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE)
1.209 - {
1.210 - decl String:error[255];
1.211 - SQL_GetError(db, error, sizeof(error));
1.212 - LogError("FetchGroups() query failed: %s", query);
1.213 - LogError("Query error: %s", error);
1.214 - return;
1.215 - }
1.216 -
1.217 - /* Now start fetching groups */
1.218 - decl String:flags[32];
1.219 - decl String:name[128];
1.220 - new immunity;
1.221 - while (SQL_FetchRow(hQuery))
1.222 - {
1.223 - SQL_FetchString(hQuery, 0, flags, sizeof(flags));
1.224 - SQL_FetchString(hQuery, 1, name, sizeof(name));
1.225 - immunity = SQL_FetchInt(hQuery, 2);
1.226 -
1.227 -#if defined _DEBUG
1.228 - PrintToServer("Adding group (%d, %s, %s)", immunity, flags, name);
1.229 -#endif
1.230 -
1.231 - /* Find or create the group */
1.232 - new GroupId:gid;
1.233 - if ((gid = FindAdmGroup(name)) == INVALID_GROUP_ID)
1.234 - {
1.235 - gid = CreateAdmGroup(name);
1.236 - }
1.237 -
1.238 - /* Add flags from the database to the group */
1.239 - new num_flag_chars = strlen(flags);
1.240 - for (new i=0; i<num_flag_chars; i++)
1.241 - {
1.242 - decl AdminFlag:flag;
1.243 - if (!FindFlagByChar(flags[i], flag))
1.244 - {
1.245 - continue;
1.246 - }
1.247 - SetAdmGroupAddFlag(gid, flag, true);
1.248 - }
1.249 -
1.250 - /* Set the immunity level this group has */
1.251 - SetAdmGroupImmunityLevel(gid, immunity);
1.252 - }
1.253 -
1.254 - CloseHandle(hQuery);
1.255 -
1.256 - /**
1.257 - * Get immunity in a big lump. This is a nasty query but it gets the job done.
1.258 - */
1.259 - new len = 0;
1.260 - len += Format(query[len], sizeof(query)-len, "SELECT g1.name, g2.name FROM sm_group_immunity gi");
1.261 - len += Format(query[len], sizeof(query)-len, " LEFT JOIN sm_groups g1 ON g1.id = gi.group_id ");
1.262 - len += Format(query[len], sizeof(query)-len, " LEFT JOIN sm_groups g2 ON g2.id = gi.other_id");
1.263 -
1.264 - if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE)
1.265 - {
1.266 - decl String:error[255];
1.267 - SQL_GetError(db, error, sizeof(error));
1.268 - LogError("FetchGroups() query failed: %s", query);
1.269 - LogError("Query error: %s", error);
1.270 - return;
1.271 - }
1.272 -
1.273 - while (SQL_FetchRow(hQuery))
1.274 - {
1.275 - decl String:group1[80];
1.276 - decl String:group2[80];
1.277 - new GroupId:gid1, GroupId:gid2;
1.278 -
1.279 - SQL_FetchString(hQuery, 0, group1, sizeof(group1));
1.280 - SQL_FetchString(hQuery, 1, group2, sizeof(group2));
1.281 -
1.282 - if (((gid1 = FindAdmGroup(group1)) == INVALID_GROUP_ID)
1.283 - || (gid2 = FindAdmGroup(group2)) == INVALID_GROUP_ID)
1.284 - {
1.285 - continue;
1.286 - }
1.287 -
1.288 - SetAdmGroupImmuneFrom(gid1, gid2);
1.289 -#if defined _DEBUG
1.290 - PrintToServer("SetAdmGroupImmuneFrom(%d, %d)", gid1, gid2);
1.291 -#endif
1.292 - }
1.293 -
1.294 - CloseHandle(hQuery);
1.295 -
1.296 - /**
1.297 - * Fetch overrides in a lump query.
1.298 - */
1.299 - Format(query, sizeof(query), "SELECT g.name, go.type, go.name, go.access FROM sm_group_overrides go LEFT JOIN sm_groups g ON go.group_id = g.id");
1.300 -
1.301 - if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE)
1.302 - {
1.303 - decl String:error[255];
1.304 - SQL_GetError(db, error, sizeof(error));
1.305 - LogError("FetchGroups() query failed: %s", query);
1.306 - LogError("Query error: %s", error);
1.307 - return;
1.308 - }
1.309 -
1.310 - decl String:type[16];
1.311 - decl String:cmd[64];
1.312 - decl String:access[16];
1.313 - while (SQL_FetchRow(hQuery))
1.314 - {
1.315 - SQL_FetchString(hQuery, 0, name, sizeof(name));
1.316 - SQL_FetchString(hQuery, 1, type, sizeof(type));
1.317 - SQL_FetchString(hQuery, 2, cmd, sizeof(cmd));
1.318 - SQL_FetchString(hQuery, 3, access, sizeof(access));
1.319 -
1.320 - new GroupId:gid;
1.321 - if ((gid = FindAdmGroup(name)) == INVALID_GROUP_ID)
1.322 - {
1.323 - continue;
1.324 - }
1.325 -
1.326 - new OverrideType:o_type = Override_Command;
1.327 - if (StrEqual(type, "group"))
1.328 - {
1.329 - o_type = Override_CommandGroup;
1.330 - }
1.331 -
1.332 - new OverrideRule:o_rule = Command_Deny;
1.333 - if (StrEqual(access, "allow"))
1.334 - {
1.335 - o_rule = Command_Allow;
1.336 - }
1.337 -
1.338 - #if defined _DEBUG
1.339 - PrintToServer("AddAdmGroupCmdOverride(%d, %s, %d, %d)", gid, cmd, o_type, o_rule);
1.340 - #endif
1.341 -
1.342 - AddAdmGroupCmdOverride(gid, cmd, o_type, o_rule);
1.343 - }
1.344 -
1.345 - CloseHandle(hQuery);
1.346 -}
1.347 -
1.348 -FetchOverrides(Handle:db)
1.349 -{
1.350 - decl String:query[255];
1.351 - new Handle:hQuery;
1.352 -
1.353 - Format(query, sizeof(query), "SELECT type, name, flags FROM sm_overrides");
1.354 -
1.355 - if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE)
1.356 - {
1.357 - decl String:error[255];
1.358 - SQL_GetError(db, error, sizeof(error));
1.359 - LogError("FetchOverrides() query failed: %s", query);
1.360 - LogError("Query error: %s", error);
1.361 - return;
1.362 - }
1.363 -
1.364 - decl String:type[64];
1.365 - decl String:name[64];
1.366 - decl String:flags[32];
1.367 - new flag_bits;
1.368 - while (SQL_FetchRow(hQuery))
1.369 - {
1.370 - SQL_FetchString(hQuery, 0, type, sizeof(type));
1.371 - SQL_FetchString(hQuery, 1, name, sizeof(name));
1.372 - SQL_FetchString(hQuery, 2, flags, sizeof(flags));
1.373 -
1.374 -#if defined _DEBUG
1.375 - PrintToServer("Adding override (%s, %s, %s)", type, name, flags);
1.376 -#endif
1.377 -
1.378 - flag_bits = ReadFlagString(flags);
1.379 - if (StrEqual(type, "command"))
1.380 - {
1.381 - AddCommandOverride(name, Override_Command, flag_bits);
1.382 - } else if (StrEqual(type, "group")) {
1.383 - AddCommandOverride(name, Override_CommandGroup, flag_bits);
1.384 - }
1.385 - }
1.386 -
1.387 - CloseHandle(hQuery);
1.388 -}
1.389 -