Updated license headers on virtually all files with extremely minor changes in the name of some sort of strange consistency.
All plugin and include file headers also have been changed to say about GPL3 instead of GPL2.
(This day shall henceforth be known as the Eighty Column Massacre of '07)
3 * =============================================================================
4 * SourceMod SQL Admins Plugin (Prefetch)
5 * Prefetches admins from an SQL database without threading.
7 * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
8 * =============================================================================
10 * This program is free software; you can redistribute it and/or modify it under
11 * the terms of the GNU General Public License, version 3.0, as published by the
12 * Free Software Foundation.
14 * This program is distributed in the hope that it will be useful, but WITHOUT
15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
19 * You should have received a copy of the GNU General Public License along with
20 * this program. If not, see <http://www.gnu.org/licenses/>.
22 * As a special exception, AlliedModders LLC gives you permission to link the
23 * code of this program (as well as its derivative works) to "Half-Life 2," the
24 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
25 * by the Valve Corporation. You must obey the GNU General Public License in
26 * all respects for all other code used. Additionally, AlliedModders LLC grants
27 * this exception to all derivative works. AlliedModders LLC defines further
28 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
29 * or <http://www.sourcemod.net/license.php>.
34 /* We like semicolons */
39 public Plugin:myinfo =
41 name = "SQL Admins (Prefetch)",
42 author = "AlliedModders LLC",
43 description = "Reads all admins from SQL",
44 version = SOURCEMOD_VERSION,
45 url = "http://www.sourcemod.net/"
48 public OnRebuildAdminCache(AdminCachePart:part)
50 /* First try to get a database connection */
51 decl String:error[255];
54 if (SQL_CheckConfig("admins"))
56 db = SQL_Connect("admins", true, error, sizeof(error));
58 db = SQL_Connect("default", true, error, sizeof(error));
61 if (db == INVALID_HANDLE)
63 LogError("Could not connect to database \"default\": %s", error);
67 if (part == AdminCache_Overrides)
70 } else if (part == AdminCache_Groups) {
72 } else if (part == AdminCache_Admins) {
79 FetchUserGroups(Handle:hQuery, AdminId:adm, id)
81 SQL_BindParamInt(hQuery, 0, id);
82 if (!SQL_Execute(hQuery))
84 decl String:error[255];
85 SQL_GetError(hQuery, error, sizeof(error));
86 LogError("FetchUserGroups() statement execute failed: %s", error);
92 while (SQL_FetchRow(hQuery))
94 SQL_FetchString(hQuery, 0, name, sizeof(name));
96 if ((gid = FindAdmGroup(name)) == INVALID_GROUP_ID)
98 /* Group wasn't found, don't bother with it. */
103 PrintToServer("Found admin group (%d, %d, %d)", id, gid, adm);
106 AdminInheritGroup(adm, gid);
110 FetchUsers(Handle:db)
112 decl String:query[255], String:error[255];
113 new Handle:hQuery, Handle:hGroupQuery;
115 Format(query, sizeof(query), "SELECT id, authtype, identity, password, flags, name FROM sm_admins");
116 if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE)
118 SQL_GetError(db, error, sizeof(error));
119 LogError("FetchUsers() query failed: %s", query);
120 LogError("Query error: %s", error);
124 /* If this fails it's non-fatal */
127 "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");
128 if ((hGroupQuery = SQL_PrepareQuery(db, query, error, sizeof(error))) == INVALID_HANDLE)
130 LogError("FetchUsers() group query preparation failed: %s", query);
131 LogError("Query error: %s", error);
134 decl String:authtype[16];
135 decl String:identity[80];
136 decl String:password[80];
137 decl String:flags[32];
138 decl String:name[80];
141 while (SQL_FetchRow(hQuery))
143 id = SQL_FetchInt(hQuery, 0);
144 SQL_FetchString(hQuery, 1, authtype, sizeof(authtype));
145 SQL_FetchString(hQuery, 2, identity, sizeof(identity));
146 SQL_FetchString(hQuery, 3, password, sizeof(password));
147 SQL_FetchString(hQuery, 4, flags, sizeof(flags));
148 SQL_FetchString(hQuery, 5, name, sizeof(name));
150 /* Use a pre-existing admin if we can */
151 if ((adm = FindAdminByIdentity(authtype, identity)) == INVALID_ADMIN_ID)
153 adm = CreateAdmin(name);
154 if (!BindAdminIdentity(adm, authtype, identity))
156 LogError("Could not bind prefetched SQL admin (authtype \"%s\") (identity \"%s\")", authtype, identity);
162 PrintToServer("Found SQL admin (%d,%s,%s,%s,%s,%s):%d", id, authtype, identity, password, flags, name, adm);
165 /* See if this admin wants a password */
166 if (password[0] != '\0')
168 SetAdminPassword(adm, password);
171 /* Apply each flag */
172 new len = strlen(flags);
174 for (new i=0; i<len; i++)
176 if (!FindFlagByChar(flags[i], flag))
180 SetAdminFlag(adm, flag, true);
184 if (hGroupQuery != INVALID_HANDLE)
186 FetchUserGroups(hGroupQuery, adm, id);
190 CloseHandle(hGroupQuery);
194 FetchGroups(Handle:db)
196 decl String:query[255];
199 Format(query, sizeof(query), "SELECT immunity, flags, name FROM sm_groups");
201 if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE)
203 decl String:error[255];
204 SQL_GetError(db, error, sizeof(error));
205 LogError("FetchGroups() query failed: %s", query);
206 LogError("Query error: %s", error);
210 /* Now start fetching groups */
211 decl String:immunity[16];
212 decl String:flags[32];
213 decl String:name[128];
214 while (SQL_FetchRow(hQuery))
216 SQL_FetchString(hQuery, 0, immunity, sizeof(immunity));
217 SQL_FetchString(hQuery, 1, flags, sizeof(flags));
218 SQL_FetchString(hQuery, 2, name, sizeof(name));
221 PrintToServer("Adding group (%s, %s, %s)", immunity, flags, name);
224 /* Find or create the group */
226 if ((gid = FindAdmGroup(name)) == INVALID_GROUP_ID)
228 gid = CreateAdmGroup(name);
231 /* Add flags from the database to the group */
232 new num_flag_chars = strlen(flags);
233 for (new i=0; i<num_flag_chars; i++)
236 if (!FindFlagByChar(flags[i], flag))
240 SetAdmGroupAddFlag(gid, flag, true);
243 /* Set the immunity level this group has */
244 if (StrEqual(immunity, "all"))
246 SetAdmGroupImmunity(gid, Immunity_Default, true);
247 SetAdmGroupImmunity(gid, Immunity_Global, true);
248 } else if (StrEqual(immunity, "default")) {
249 SetAdmGroupImmunity(gid, Immunity_Default, true);
250 } else if (StrEqual(immunity, "global")) {
251 SetAdmGroupImmunity(gid, Immunity_Global, true);
258 * Get immunity in a big lump. This is a nasty query but it gets the job done.
261 len += Format(query[len], sizeof(query)-len, "SELECT g1.name, g2.name FROM sm_group_immunity gi");
262 len += Format(query[len], sizeof(query)-len, " LEFT JOIN sm_groups g1 ON g1.id = gi.group_id ");
263 len += Format(query[len], sizeof(query)-len, " LEFT JOIN sm_groups g2 ON g2.id = gi.other_id");
265 if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE)
267 decl String:error[255];
268 SQL_GetError(db, error, sizeof(error));
269 LogError("FetchGroups() query failed: %s", query);
270 LogError("Query error: %s", error);
274 while (SQL_FetchRow(hQuery))
276 decl String:group1[80];
277 decl String:group2[80];
278 new GroupId:gid1, GroupId:gid2;
280 SQL_FetchString(hQuery, 0, group1, sizeof(group1));
281 SQL_FetchString(hQuery, 1, group2, sizeof(group2));
283 if (((gid1 = FindAdmGroup(group1)) == INVALID_GROUP_ID)
284 || (gid2 = FindAdmGroup(group2)) == INVALID_GROUP_ID)
289 SetAdmGroupImmuneFrom(gid1, gid2);
291 PrintToServer("SetAdmGroupImmuneFrom(%d, %d)", gid1, gid2);
298 * Fetch overrides in a lump query.
300 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");
302 if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE)
304 decl String:error[255];
305 SQL_GetError(db, error, sizeof(error));
306 LogError("FetchGroups() query failed: %s", query);
307 LogError("Query error: %s", error);
311 decl String:type[16];
313 decl String:access[16];
314 while (SQL_FetchRow(hQuery))
316 SQL_FetchString(hQuery, 0, name, sizeof(name));
317 SQL_FetchString(hQuery, 1, type, sizeof(type));
318 SQL_FetchString(hQuery, 2, cmd, sizeof(cmd));
319 SQL_FetchString(hQuery, 3, access, sizeof(access));
322 if ((gid = FindAdmGroup(name)) == INVALID_GROUP_ID)
327 new OverrideType:o_type = Override_Command;
328 if (StrEqual(type, "group"))
330 o_type = Override_CommandGroup;
333 new OverrideRule:o_rule = Command_Deny;
334 if (StrEqual(access, "allow"))
336 o_rule = Command_Allow;
340 PrintToServer("AddAdmGroupCmdOverride(%d, %s, %d, %d)", gid, cmd, o_type, o_rule);
343 AddAdmGroupCmdOverride(gid, cmd, o_type, o_rule);
349 FetchOverrides(Handle:db)
351 decl String:query[255];
354 Format(query, sizeof(query), "SELECT type, name, flags FROM sm_overrides");
356 if ((hQuery = SQL_Query(db, query)) == INVALID_HANDLE)
358 decl String:error[255];
359 SQL_GetError(db, error, sizeof(error));
360 LogError("FetchOverrides() query failed: %s", query);
361 LogError("Query error: %s", error);
365 decl String:type[64];
366 decl String:name[64];
367 decl String:flags[32];
369 while (SQL_FetchRow(hQuery))
371 SQL_FetchString(hQuery, 0, type, sizeof(type));
372 SQL_FetchString(hQuery, 1, name, sizeof(name));
373 SQL_FetchString(hQuery, 2, flags, sizeof(flags));
376 PrintToServer("Adding override (%s, %s, %s)", type, name, flags);
379 flag_bits = ReadFlagString(flags);
380 if (StrEqual(type, "command"))
382 AddCommandOverride(name, Override_Command, flag_bits);
383 } else if (StrEqual(type, "group")) {
384 AddCommandOverride(name, Override_CommandGroup, flag_bits);