Advertisement
Guest User

Untitled

a guest
Mar 24th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.71 KB | None | 0 0
  1. /**
  2. * vim: set ts=4 :
  3. * =============================================================================
  4. * SourceMod SQL Admins Plugin (Prefetch)
  5. * Prefetches admins from an SQL database without threading.
  6. *
  7. * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved.
  8. * =============================================================================
  9. *
  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.
  13. *
  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
  17. * details.
  18. *
  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/>.
  21. *
  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>.
  30. *
  31. * Version: $Id$
  32. */
  33.  
  34. /* We like semicolons */
  35. #pragma semicolon 1
  36.  
  37. #include <sourcemod>
  38.  
  39. #pragma newdecls required
  40.  
  41. public Plugin myinfo =
  42. {
  43. name = "SQL Admins (Prefetch)",
  44. author = "AlliedModders LLC",
  45. description = "Reads all admins from SQL",
  46. version = SOURCEMOD_VERSION,
  47. url = "http://www.sourcemod.net/"
  48. };
  49.  
  50. public void OnRebuildAdminCache(AdminCachePart part)
  51. {
  52. /* First try to get a database connection */
  53. char error[255];
  54. Database db;
  55.  
  56. if (SQL_CheckConfig("admins"))
  57. {
  58. db = SQL_Connect("admins", true, error, sizeof(error));
  59. } else {
  60. db = SQL_Connect("default", true, error, sizeof(error));
  61. }
  62.  
  63. if (db == null)
  64. {
  65. LogError("Could not connect to database \"default\": %s", error);
  66. return;
  67. }
  68.  
  69. if (part == AdminCache_Overrides)
  70. {
  71. FetchOverrides(db);
  72. } else if (part == AdminCache_Groups) {
  73. FetchGroups(db);
  74. } else if (part == AdminCache_Admins) {
  75. FetchUsers(db);
  76. }
  77.  
  78. delete db;
  79. }
  80.  
  81. void FetchUsers(Database db)
  82. {
  83. char query[255], error[255];
  84. DBResultSet rs;
  85.  
  86. Format(query, sizeof(query), "SELECT id, authtype, identity, password, flags, name, immunity FROM sm_admins WHERE dateend >= NOW() AND sm_admins.server='oldmaps' OR sm_admins.server IS NULL");
  87. if ((rs = SQL_Query(db, query)) == null)
  88. {
  89. SQL_GetError(db, error, sizeof(error));
  90. LogError("FetchUsers() query failed: %s", query);
  91. LogError("Query error: %s", error);
  92. return;
  93. }
  94.  
  95. char authtype[16];
  96. char identity[80];
  97. char password[80];
  98. char flags[32];
  99. char name[80];
  100. int immunity;
  101. AdminId adm;
  102. GroupId grp;
  103. int id;
  104.  
  105. /* Keep track of a mapping from admin DB IDs to internal AdminIds to
  106. * enable group lookups en masse */
  107. StringMap htAdmins = new StringMap();
  108. char key[16];
  109.  
  110. while (rs.FetchRow())
  111. {
  112. id = rs.FetchInt(0);
  113. IntToString(id, key, sizeof(key));
  114. rs.FetchString(1, authtype, sizeof(authtype));
  115. rs.FetchString(2, identity, sizeof(identity));
  116. rs.FetchString(3, password, sizeof(password));
  117. rs.FetchString(4, flags, sizeof(flags));
  118. rs.FetchString(5, name, sizeof(name));
  119. immunity = rs.FetchInt(6);
  120.  
  121. /* Use a pre-existing admin if we can */
  122. if ((adm = FindAdminByIdentity(authtype, identity)) == INVALID_ADMIN_ID)
  123. {
  124. adm = CreateAdmin(name);
  125. if (!adm.BindIdentity(authtype, identity))
  126. {
  127. LogError("Could not bind prefetched SQL admin (authtype \"%s\") (identity \"%s\")", authtype, identity);
  128. continue;
  129. }
  130. }
  131.  
  132. htAdmins.SetValue(key, adm);
  133.  
  134. #if defined _DEBUG
  135. PrintToServer("Found SQL admin (%d,%s,%s,%s,%s,%s,%d):%d", id, authtype, identity, password, flags, name, immunity, adm);
  136. #endif
  137.  
  138. /* See if this admin wants a password */
  139. if (password[0] != '\0')
  140. {
  141. adm.SetPassword(password);
  142. }
  143.  
  144. /* Apply each flag */
  145. int len = strlen(flags);
  146. AdminFlag flag;
  147. for (int i=0; i<len; i++)
  148. {
  149. if (!FindFlagByChar(flags[i], flag))
  150. {
  151. continue;
  152. }
  153. adm.SetFlag(flag, true);
  154. }
  155.  
  156. adm.ImmunityLevel = immunity;
  157. }
  158.  
  159. delete rs;
  160.  
  161. Format(query, sizeof(query), "SELECT ag.admin_id AS id, g.name FROM sm_admins_groups ag JOIN sm_groups g ON ag.group_id = g.id ORDER BY id, inherit_order ASC");
  162. if ((rs = SQL_Query(db, query)) == null)
  163. {
  164. SQL_GetError(db, error, sizeof(error));
  165. LogError("FetchUsers() query failed: %s", query);
  166. LogError("Query error: %s", error);
  167. return;
  168. }
  169.  
  170. char group[80];
  171. while (rs.FetchRow())
  172. {
  173. IntToString(rs.FetchInt(0), key, sizeof(key));
  174. rs.FetchString(1, group, sizeof(group));
  175.  
  176. if (htAdmins.GetValue(key, adm))
  177. {
  178. if ((grp = FindAdmGroup(group)) == INVALID_GROUP_ID)
  179. {
  180. /* Group wasn't found, don't bother with it. */
  181. continue;
  182. }
  183.  
  184. adm.InheritGroup(grp);
  185. }
  186. }
  187.  
  188. delete rs;
  189. delete htAdmins;
  190. }
  191.  
  192. void FetchGroups(Database db)
  193. {
  194. char query[255];
  195. DBResultSet rs;
  196.  
  197. Format(query, sizeof(query), "SELECT flags, name, immunity_level FROM sm_groups");
  198.  
  199. if ((rs = SQL_Query(db, query)) == null)
  200. {
  201. char error[255];
  202. SQL_GetError(db, error, sizeof(error));
  203. LogError("FetchGroups() query failed: %s", query);
  204. LogError("Query error: %s", error);
  205. return;
  206. }
  207.  
  208. /* Now start fetching groups */
  209. char flags[32];
  210. char name[128];
  211. int immunity;
  212. while (rs.FetchRow())
  213. {
  214. rs.FetchString(0, flags, sizeof(flags));
  215. rs.FetchString(1, name, sizeof(name));
  216. immunity = rs.FetchInt(2);
  217.  
  218. #if defined _DEBUG
  219. PrintToServer("Adding group (%d, %s, %s)", immunity, flags, name);
  220. #endif
  221.  
  222. /* Find or create the group */
  223. GroupId grp;
  224. if ((grp = FindAdmGroup(name)) == INVALID_GROUP_ID)
  225. {
  226. grp = CreateAdmGroup(name);
  227. }
  228.  
  229. /* Add flags from the database to the group */
  230. int num_flag_chars = strlen(flags);
  231. for (int i=0; i<num_flag_chars; i++)
  232. {
  233. AdminFlag flag;
  234. if (!FindFlagByChar(flags[i], flag))
  235. {
  236. continue;
  237. }
  238. grp.SetFlag(flag, true);
  239. }
  240.  
  241. /* Set the immunity level this group has */
  242. grp.ImmunityLevel = immunity;
  243. }
  244.  
  245. delete rs;
  246.  
  247. /**
  248. * Get immunity in a big lump. This is a nasty query but it gets the job done.
  249. */
  250. int len = 0;
  251. len += Format(query[len], sizeof(query)-len, "SELECT g1.name, g2.name FROM sm_group_immunity gi");
  252. len += Format(query[len], sizeof(query)-len, " LEFT JOIN sm_groups g1 ON g1.id = gi.group_id ");
  253. len += Format(query[len], sizeof(query)-len, " LEFT JOIN sm_groups g2 ON g2.id = gi.other_id");
  254.  
  255. if ((rs = SQL_Query(db, query)) == null)
  256. {
  257. char error[255];
  258. SQL_GetError(db, error, sizeof(error));
  259. LogError("FetchGroups() query failed: %s", query);
  260. LogError("Query error: %s", error);
  261. return;
  262. }
  263.  
  264. while (rs.FetchRow())
  265. {
  266. char group1[80];
  267. char group2[80];
  268. GroupId grp, other;
  269.  
  270. rs.FetchString(0, group1, sizeof(group1));
  271. rs.FetchString(1, group2, sizeof(group2));
  272.  
  273. if (((grp = FindAdmGroup(group1)) == INVALID_GROUP_ID)
  274. || (other = FindAdmGroup(group2)) == INVALID_GROUP_ID)
  275. {
  276. continue;
  277. }
  278.  
  279. grp.AddGroupImmunity(other);
  280. #if defined _DEBUG
  281. PrintToServer("SetAdmGroupImmuneFrom(%d, %d)", grp, other);
  282. #endif
  283. }
  284.  
  285. delete rs;
  286.  
  287. /**
  288. * Fetch overrides in a lump query.
  289. */
  290. 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");
  291.  
  292. if ((rs = SQL_Query(db, query)) == null)
  293. {
  294. char error[255];
  295. SQL_GetError(db, error, sizeof(error));
  296. LogError("FetchGroups() query failed: %s", query);
  297. LogError("Query error: %s", error);
  298. return;
  299. }
  300.  
  301. char type[16];
  302. char cmd[64];
  303. char access[16];
  304. while (rs.FetchRow())
  305. {
  306. rs.FetchString(0, name, sizeof(name));
  307. rs.FetchString(1, type, sizeof(type));
  308. rs.FetchString(2, cmd, sizeof(cmd));
  309. rs.FetchString(3, access, sizeof(access));
  310.  
  311. GroupId grp;
  312. if ((grp = FindAdmGroup(name)) == INVALID_GROUP_ID)
  313. {
  314. continue;
  315. }
  316.  
  317. OverrideType o_type = Override_Command;
  318. if (StrEqual(type, "group"))
  319. {
  320. o_type = Override_CommandGroup;
  321. }
  322.  
  323. OverrideRule o_rule = Command_Deny;
  324. if (StrEqual(access, "allow"))
  325. {
  326. o_rule = Command_Allow;
  327. }
  328.  
  329. #if defined _DEBUG
  330. PrintToServer("AddAdmGroupCmdOverride(%d, %s, %d, %d)", grp, cmd, o_type, o_rule);
  331. #endif
  332.  
  333. grp.AddCommandOverride(cmd, o_type, o_rule);
  334. }
  335.  
  336. delete rs;
  337. }
  338.  
  339. void FetchOverrides(Database db)
  340. {
  341. char query[255];
  342. DBResultSet rs;
  343.  
  344. Format(query, sizeof(query), "SELECT type, name, flags FROM sm_overrides");
  345.  
  346. if ((rs = SQL_Query(db, query)) == null)
  347. {
  348. char error[255];
  349. SQL_GetError(db, error, sizeof(error));
  350. LogError("FetchOverrides() query failed: %s", query);
  351. LogError("Query error: %s", error);
  352. return;
  353. }
  354.  
  355. char type[64];
  356. char name[64];
  357. char flags[32];
  358. int flag_bits;
  359. while (rs.FetchRow())
  360. {
  361. rs.FetchString(0, type, sizeof(type));
  362. rs.FetchString(1, name, sizeof(name));
  363. rs.FetchString(2, flags, sizeof(flags));
  364.  
  365. #if defined _DEBUG
  366. PrintToServer("Adding override (%s, %s, %s)", type, name, flags);
  367. #endif
  368.  
  369. flag_bits = ReadFlagString(flags);
  370. if (StrEqual(type, "command"))
  371. {
  372. AddCommandOverride(name, Override_Command, flag_bits);
  373. } else if (StrEqual(type, "group")) {
  374. AddCommandOverride(name, Override_CommandGroup, flag_bits);
  375. }
  376. }
  377.  
  378. delete rs;
  379. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement