Parent Directory
|
Revision Log
Revision 44 - (view) (download)
1 : | ian | 1 | /* AMX Mod X script. |
2 : | * Admin Base Plugin | ||
3 : | * | ||
4 : | * by the AMX Mod X Development Team | ||
5 : | * originally developed by OLO | ||
6 : | * | ||
7 : | * This file is part of AMX Mod X. | ||
8 : | * | ||
9 : | * | ||
10 : | * This program is free software; you can redistribute it and/or modify it | ||
11 : | * under the terms of the GNU General Public License as published by the | ||
12 : | * Free Software Foundation; either version 2 of the License, or (at | ||
13 : | * your option) any later version. | ||
14 : | * | ||
15 : | * This program is distributed in the hope that it will be useful, but | ||
16 : | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
17 : | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
18 : | * General Public License for more details. | ||
19 : | * | ||
20 : | * You should have received a copy of the GNU General Public License | ||
21 : | * along with this program; if not, write to the Free Software Foundation, | ||
22 : | * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
23 : | * | ||
24 : | * In addition, as a special exception, the author gives permission to | ||
25 : | * link the code of this program with the Half-Life Game Engine ("HL | ||
26 : | * Engine") and Modified Game Libraries ("MODs") developed by Valve, | ||
27 : | * L.L.C ("Valve"). You must obey the GNU General Public License in all | ||
28 : | * respects for all of the code used other than the HL Engine and MODs | ||
29 : | * from Valve. If you modify this file, you may extend this exception | ||
30 : | * to your version of the file, but you are not obligated to do so. If | ||
31 : | * you do not wish to do so, delete this exception statement from your | ||
32 : | * version. | ||
33 : | */ | ||
34 : | |||
35 : | // Uncomment for SQL version | ||
36 : | ian | 17 | // #define USING_SQL |
37 : | ian | 1 | |
38 : | #include <amxmodx> | ||
39 : | #include <amxmisc> | ||
40 : | #if defined USING_SQL | ||
41 : | #include <sqlx> | ||
42 : | #endif | ||
43 : | |||
44 : | ian | 17 | //new Vector:AdminList; |
45 : | |||
46 : | new AdminCount; | ||
47 : | |||
48 : | ian | 1 | new PLUGINNAME[] = "AMX Mod X" |
49 : | |||
50 : | #define ADMIN_LOOKUP (1<<0) | ||
51 : | #define ADMIN_NORMAL (1<<1) | ||
52 : | #define ADMIN_STEAM (1<<2) | ||
53 : | #define ADMIN_IPADDR (1<<3) | ||
54 : | #define ADMIN_NAME (1<<4) | ||
55 : | |||
56 : | new g_cmdLoopback[16] | ||
57 : | ian | 44 | new bool:g_CaseSensitiveName[33]; |
58 : | ian | 1 | |
59 : | ian | 17 | // pcvars |
60 : | new amx_mode; | ||
61 : | new amx_password_field; | ||
62 : | new amx_default_access; | ||
63 : | |||
64 : | ian | 1 | public plugin_init() |
65 : | { | ||
66 : | #if defined USING_SQL | ||
67 : | register_plugin("Admin Base (SQL)", AMXX_VERSION_STR, "AMXX Dev Team") | ||
68 : | #else | ||
69 : | register_plugin("Admin Base", AMXX_VERSION_STR, "AMXX Dev Team") | ||
70 : | #endif | ||
71 : | register_dictionary("admin.txt") | ||
72 : | register_dictionary("common.txt") | ||
73 : | ian | 17 | amx_mode=register_cvar("amx_mode", "1") |
74 : | amx_password_field=register_cvar("amx_password_field", "_pw") | ||
75 : | amx_default_access=register_cvar("amx_default_access", "") | ||
76 : | ian | 1 | |
77 : | register_cvar("amx_vote_ratio", "0.02") | ||
78 : | register_cvar("amx_vote_time", "10") | ||
79 : | register_cvar("amx_vote_answers", "1") | ||
80 : | register_cvar("amx_vote_delay", "60") | ||
81 : | register_cvar("amx_last_voting", "0") | ||
82 : | register_cvar("amx_show_activity", "2") | ||
83 : | register_cvar("amx_votekick_ratio", "0.40") | ||
84 : | register_cvar("amx_voteban_ratio", "0.40") | ||
85 : | register_cvar("amx_votemap_ratio", "0.40") | ||
86 : | |||
87 : | set_cvar_float("amx_last_voting", 0.0) | ||
88 : | |||
89 : | #if defined USING_SQL | ||
90 : | register_srvcmd("amx_sqladmins", "adminSql") | ||
91 : | register_cvar("amx_sql_table", "admins") | ||
92 : | #endif | ||
93 : | register_cvar("amx_sql_host", "127.0.0.1") | ||
94 : | register_cvar("amx_sql_user", "root") | ||
95 : | register_cvar("amx_sql_pass", "") | ||
96 : | register_cvar("amx_sql_db", "amx") | ||
97 : | register_cvar("amx_sql_type", "mysql") | ||
98 : | |||
99 : | register_concmd("amx_reloadadmins", "cmdReload", ADMIN_CFG) | ||
100 : | register_concmd("amx_addadmin", "addadminfn", ADMIN_RCON, "<playername|auth> <accessflags> [password] [authtype] - add specified player as an admin to users.ini") | ||
101 : | |||
102 : | format(g_cmdLoopback, 15, "amxauth%c%c%c%c", random_num('A', 'Z'), random_num('A', 'Z'), random_num('A', 'Z'), random_num('A', 'Z')) | ||
103 : | |||
104 : | register_clcmd(g_cmdLoopback, "ackSignal") | ||
105 : | |||
106 : | remove_user_flags(0, read_flags("z")) // Remove 'user' flag from server rights | ||
107 : | |||
108 : | new configsDir[64] | ||
109 : | get_configsdir(configsDir, 63) | ||
110 : | |||
111 : | server_cmd("exec %s/amxx.cfg", configsDir) // Execute main configuration file | ||
112 : | server_cmd("exec %s/sql.cfg", configsDir) | ||
113 : | ian | 17 | |
114 : | // Create a vector of 5 cells to store the info. | ||
115 : | //AdminList=vector_create(5); | ||
116 : | |||
117 : | |||
118 : | ian | 1 | #if defined USING_SQL |
119 : | server_cmd("amx_sqladmins") | ||
120 : | #else | ||
121 : | format(configsDir, 63, "%s/users.ini", configsDir) | ||
122 : | loadSettings(configsDir) // Load admins accounts | ||
123 : | #endif | ||
124 : | } | ||
125 : | ian | 44 | public client_connect(id) |
126 : | { | ||
127 : | g_CaseSensitiveName[id] = false; | ||
128 : | } | ||
129 : | ian | 1 | public addadminfn(id, level, cid) |
130 : | { | ||
131 : | if (!cmd_access(id, level, cid, 3)) | ||
132 : | return PLUGIN_HANDLED | ||
133 : | |||
134 : | new idtype = ADMIN_STEAM | ADMIN_LOOKUP | ||
135 : | |||
136 : | if (read_argc() >= 5) | ||
137 : | { | ||
138 : | new t_arg[16] | ||
139 : | read_argv(4, t_arg, 15) | ||
140 : | |||
141 : | if (equali(t_arg, "steam") || equali(t_arg, "steamid") || equali(t_arg, "auth")) | ||
142 : | { | ||
143 : | idtype = ADMIN_STEAM | ||
144 : | } | ||
145 : | else if (equali(t_arg, "ip")) | ||
146 : | { | ||
147 : | idtype = ADMIN_IPADDR | ||
148 : | } | ||
149 : | else if (equali(t_arg, "name") || equali(t_arg, "nick")) | ||
150 : | { | ||
151 : | idtype = ADMIN_NAME | ||
152 : | |||
153 : | if (equali(t_arg, "name")) | ||
154 : | idtype |= ADMIN_LOOKUP | ||
155 : | } else { | ||
156 : | console_print(id, "[%s] Unknown id type ^"%s^", use one of: steamid, ip, name", PLUGINNAME, t_arg) | ||
157 : | return PLUGIN_HANDLED | ||
158 : | } | ||
159 : | } | ||
160 : | |||
161 : | new arg[33] | ||
162 : | read_argv(1, arg, 32) | ||
163 : | new player = -1 | ||
164 : | |||
165 : | if (idtype & ADMIN_STEAM) | ||
166 : | { | ||
167 : | if (containi(arg, "STEAM_0:") == -1) | ||
168 : | { | ||
169 : | idtype |= ADMIN_LOOKUP | ||
170 : | ian | 17 | player = cmd_target(id, arg, CMDTARGET_ALLOW_SELF | CMDTARGET_NO_BOTS) |
171 : | ian | 1 | } else { |
172 : | ian | 17 | new _steamid[44] |
173 : | ian | 1 | static _players[32], _num, _pv |
174 : | get_players(_players, _num) | ||
175 : | for (new _i=0; _i<_num; _i++) | ||
176 : | { | ||
177 : | _pv = _players[_i] | ||
178 : | ian | 17 | get_user_authid(_pv, _steamid, sizeof(_steamid)-1) |
179 : | ian | 1 | if (!_steamid[0]) |
180 : | continue | ||
181 : | if (equal(_steamid, arg)) | ||
182 : | { | ||
183 : | player = _pv | ||
184 : | break | ||
185 : | } | ||
186 : | } | ||
187 : | if (player < 1) | ||
188 : | { | ||
189 : | idtype &= ~ADMIN_LOOKUP | ||
190 : | } | ||
191 : | } | ||
192 : | } | ||
193 : | else if (idtype & ADMIN_NAME) | ||
194 : | { | ||
195 : | ian | 17 | player = cmd_target(id, arg, CMDTARGET_ALLOW_SELF | CMDTARGET_NO_BOTS) |
196 : | ian | 1 | |
197 : | if (player) | ||
198 : | idtype |= ADMIN_LOOKUP | ||
199 : | else | ||
200 : | idtype &= ~ADMIN_LOOKUP | ||
201 : | } | ||
202 : | else if (idtype & ADMIN_IPADDR) | ||
203 : | { | ||
204 : | new len = strlen(arg) | ||
205 : | new dots, chars | ||
206 : | |||
207 : | for (new i = 0; i < len; i++) | ||
208 : | { | ||
209 : | if (arg[i] == '.') | ||
210 : | { | ||
211 : | if (!chars || chars > 3) | ||
212 : | break | ||
213 : | |||
214 : | if (++dots > 3) | ||
215 : | break | ||
216 : | |||
217 : | chars = 0 | ||
218 : | } else { | ||
219 : | chars++ | ||
220 : | } | ||
221 : | |||
222 : | if (dots != 3 || !chars || chars > 3) | ||
223 : | { | ||
224 : | idtype |= ADMIN_LOOKUP | ||
225 : | player = find_player("dh", arg) | ||
226 : | } | ||
227 : | } | ||
228 : | } | ||
229 : | |||
230 : | if (idtype & ADMIN_LOOKUP && !player) | ||
231 : | { | ||
232 : | console_print(id, "%L", id, "CL_NOT_FOUND") | ||
233 : | return PLUGIN_HANDLED | ||
234 : | } | ||
235 : | |||
236 : | new flags[64] | ||
237 : | read_argv(2, flags, 63) | ||
238 : | |||
239 : | new password[64] | ||
240 : | if (read_argc() >= 4) | ||
241 : | read_argv(3, password, 63) | ||
242 : | |||
243 : | new auth[33] | ||
244 : | ian | 17 | new Comment[33]; // name of player to pass to comment field |
245 : | ian | 1 | if (idtype & ADMIN_LOOKUP) |
246 : | { | ||
247 : | ian | 17 | get_user_name(player, Comment, sizeof(Comment)-1) |
248 : | ian | 1 | if (idtype & ADMIN_STEAM) |
249 : | { | ||
250 : | get_user_authid(player, auth, 32) | ||
251 : | } | ||
252 : | else if (idtype & ADMIN_IPADDR) | ||
253 : | { | ||
254 : | get_user_ip(player, auth, 32) | ||
255 : | } | ||
256 : | else if (idtype & ADMIN_NAME) | ||
257 : | { | ||
258 : | get_user_name(player, auth, 32) | ||
259 : | } | ||
260 : | } else { | ||
261 : | copy(auth, 32, arg) | ||
262 : | } | ||
263 : | |||
264 : | new type[16], len | ||
265 : | |||
266 : | if (idtype & ADMIN_STEAM) | ||
267 : | len += format(type[len], 15-len, "c") | ||
268 : | else if (idtype & ADMIN_IPADDR) | ||
269 : | len += format(type[len], 15-len, "d") | ||
270 : | |||
271 : | if (strlen(password) > 0) | ||
272 : | len += format(type[len], 15-len, "a") | ||
273 : | else | ||
274 : | len += format(type[len], 15-len, "e") | ||
275 : | |||
276 : | ian | 17 | AddAdmin(id, auth, flags, password, type, Comment) |
277 : | ian | 1 | cmdReload(id, ADMIN_CFG, 0) |
278 : | |||
279 : | if (player > 0) | ||
280 : | { | ||
281 : | new name[32] | ||
282 : | get_user_info(player, "name", name, 31) | ||
283 : | accessUser(player, name) | ||
284 : | } | ||
285 : | |||
286 : | return PLUGIN_HANDLED | ||
287 : | } | ||
288 : | |||
289 : | ian | 17 | AddAdmin(id, auth[], accessflags[], password[], flags[], comment[]="") |
290 : | ian | 1 | { |
291 : | #if defined USING_SQL | ||
292 : | new error[128], errno | ||
293 : | |||
294 : | new Handle:info = SQL_MakeStdTuple() | ||
295 : | new Handle:sql = SQL_Connect(info, errno, error, 127) | ||
296 : | |||
297 : | if (sql == Empty_Handle) | ||
298 : | { | ||
299 : | server_print("[AMXX] %L", LANG_SERVER, "SQL_CANT_CON", error) | ||
300 : | //backup to users.ini | ||
301 : | #endif | ||
302 : | // Make sure that the users.ini file exists. | ||
303 : | new configsDir[64] | ||
304 : | get_configsdir(configsDir, 63) | ||
305 : | format(configsDir, 63, "%s/users.ini", configsDir) | ||
306 : | |||
307 : | if (!file_exists(configsDir)) | ||
308 : | { | ||
309 : | console_print(id, "[%s] File ^"%s^" doesn't exist.", PLUGINNAME, configsDir) | ||
310 : | return | ||
311 : | } | ||
312 : | |||
313 : | // Make sure steamid isn't already in file. | ||
314 : | new line = 0, textline[256], len | ||
315 : | const SIZE = 63 | ||
316 : | new line_steamid[SIZE + 1], line_password[SIZE + 1], line_accessflags[SIZE + 1], line_flags[SIZE + 1], parsedParams | ||
317 : | |||
318 : | // <name|ip|steamid> <password> <access flags> <account flags> | ||
319 : | while ((line = read_file(configsDir, line, textline, 255, len))) | ||
320 : | { | ||
321 : | if (len == 0 || equal(textline, ";", 1)) | ||
322 : | continue // comment line | ||
323 : | |||
324 : | parsedParams = parse(textline, line_steamid, SIZE, line_password, SIZE, line_accessflags, SIZE, line_flags, SIZE) | ||
325 : | |||
326 : | if (parsedParams != 4) | ||
327 : | continue // Send warning/error? | ||
328 : | |||
329 : | if (containi(line_flags, flags) != -1 && equal(line_steamid, auth)) | ||
330 : | { | ||
331 : | console_print(id, "[%s] %s already exists!", PLUGINNAME, auth) | ||
332 : | return | ||
333 : | } | ||
334 : | } | ||
335 : | |||
336 : | // If we came here, steamid doesn't exist in users.ini. Add it. | ||
337 : | new linetoadd[512] | ||
338 : | |||
339 : | ian | 17 | if (comment[0]==0) |
340 : | { | ||
341 : | formatex(linetoadd, 511, "^r^n^"%s^" ^"%s^" ^"%s^" ^"%s^"", auth, password, accessflags, flags) | ||
342 : | } | ||
343 : | else | ||
344 : | { | ||
345 : | formatex(linetoadd, 511, "^r^n^"%s^" ^"%s^" ^"%s^" ^"%s^" ; %s", auth, password, accessflags, flags, comment) | ||
346 : | } | ||
347 : | ian | 1 | console_print(id, "Adding:^n%s", linetoadd) |
348 : | |||
349 : | if (!write_file(configsDir, linetoadd)) | ||
350 : | console_print(id, "[%s] Failed writing to %s!", PLUGINNAME, configsDir) | ||
351 : | #if defined USING_SQL | ||
352 : | } | ||
353 : | |||
354 : | new table[32] | ||
355 : | |||
356 : | get_cvar_string("amx_sql_table", table, 31) | ||
357 : | |||
358 : | new Handle:query = SQL_PrepareQuery(sql, "SELECT * FROM `%s` WHERE (`auth` = '%s')", table, auth) | ||
359 : | |||
360 : | if (!SQL_Execute(query)) | ||
361 : | { | ||
362 : | SQL_QueryError(query, error, 127) | ||
363 : | server_print("[AMXX] %L", LANG_SERVER, "SQL_CANT_LOAD_ADMINS", error) | ||
364 : | console_print(id, "[AMXX] %L", LANG_SERVER, "SQL_CANT_LOAD_ADMINS", error) | ||
365 : | } else if (SQL_NumResults(query)) { | ||
366 : | console_print(id, "[%s] %s already exists!", PLUGINNAME, auth) | ||
367 : | } else { | ||
368 : | console_print(id, "Adding to database:^n^"%s^" ^"%s^" ^"%s^" ^"%s^"", auth, password, accessflags, flags) | ||
369 : | |||
370 : | SQL_QueryAndIgnore(sql, "REPLACE INTO `%s` (`auth`, `password`, `access`, `flags`) VALUES ('%s', '%s', '%s', '%s')", table, auth, password, accessflags, flags) | ||
371 : | } | ||
372 : | |||
373 : | SQL_FreeHandle(query) | ||
374 : | SQL_FreeHandle(sql) | ||
375 : | SQL_FreeHandle(info) | ||
376 : | #endif | ||
377 : | |||
378 : | } | ||
379 : | public plugin_cfg() | ||
380 : | { | ||
381 : | ian | 17 | set_task(6.1, "delayed_load") |
382 : | } | ||
383 : | ian | 1 | |
384 : | ian | 17 | public delayed_load() |
385 : | { | ||
386 : | new configFile[128], curMap[64], configDir[128] | ||
387 : | ian | 1 | |
388 : | ian | 17 | get_configsdir(configDir, sizeof(configDir)-1) |
389 : | get_mapname(curMap, sizeof(curMap)-1) | ||
390 : | ian | 1 | |
391 : | ian | 17 | new i=0; |
392 : | |||
393 : | while (curMap[i] != '_' && curMap[i++] != '^0') {/*do nothing*/} | ||
394 : | |||
395 : | if (curMap[i]=='_') | ||
396 : | { | ||
397 : | // this map has a prefix | ||
398 : | curMap[i]='^0'; | ||
399 : | formatex(configFile, sizeof(configFile)-1, "%s/maps/prefix_%s.cfg", configDir, curMap); | ||
400 : | |||
401 : | if (file_exists(configFile)) | ||
402 : | { | ||
403 : | server_cmd("exec %s", configFile); | ||
404 : | } | ||
405 : | } | ||
406 : | |||
407 : | get_mapname(curMap, sizeof(curMap)-1) | ||
408 : | |||
409 : | |||
410 : | formatex(configFile, sizeof(configFile)-1, "%s/maps/%s.cfg", configDir, curMap) | ||
411 : | |||
412 : | ian | 1 | if (file_exists(configFile)) |
413 : | ian | 17 | { |
414 : | server_cmd("exec %s", configFile) | ||
415 : | } | ||
416 : | |||
417 : | ian | 1 | } |
418 : | |||
419 : | loadSettings(szFilename[]) | ||
420 : | { | ||
421 : | ian | 17 | new File=fopen(szFilename,"r"); |
422 : | |||
423 : | if (File) | ||
424 : | { | ||
425 : | new Text[512]; | ||
426 : | new Flags[32]; | ||
427 : | new Access[32] | ||
428 : | new AuthData[44]; | ||
429 : | new Password[32]; | ||
430 : | |||
431 : | while (!feof(File)) | ||
432 : | { | ||
433 : | fgets(File,Text,sizeof(Text)-1); | ||
434 : | |||
435 : | trim(Text); | ||
436 : | |||
437 : | // comment | ||
438 : | if (Text[0]==';') | ||
439 : | { | ||
440 : | continue; | ||
441 : | } | ||
442 : | |||
443 : | Flags[0]=0; | ||
444 : | Access[0]=0; | ||
445 : | AuthData[0]=0; | ||
446 : | Password[0]=0; | ||
447 : | |||
448 : | // not enough parameters | ||
449 : | if (parse(Text,AuthData,sizeof(AuthData)-1,Password,sizeof(Password)-1,Access,sizeof(Access)-1,Flags,sizeof(Flags)-1) < 2) | ||
450 : | { | ||
451 : | continue; | ||
452 : | } | ||
453 : | |||
454 : | admins_push(AuthData,Password,read_flags(Access),read_flags(Flags)); | ||
455 : | ian | 1 | |
456 : | ian | 17 | AdminCount++; |
457 : | } | ||
458 : | |||
459 : | fclose(File); | ||
460 : | } | ||
461 : | ian | 1 | |
462 : | ian | 17 | if (AdminCount == 1) |
463 : | ian | 1 | { |
464 : | ian | 17 | server_print("[AMXX] %L", LANG_SERVER, "LOADED_ADMIN"); |
465 : | ian | 1 | } |
466 : | ian | 17 | else |
467 : | { | ||
468 : | server_print("[AMXX] %L", LANG_SERVER, "LOADED_ADMINS", AdminCount); | ||
469 : | } | ||
470 : | ian | 1 | |
471 : | ian | 17 | return 1; |
472 : | ian | 1 | } |
473 : | |||
474 : | #if defined USING_SQL | ||
475 : | public adminSql() | ||
476 : | { | ||
477 : | new table[32], error[128], type[12], errno | ||
478 : | |||
479 : | new Handle:info = SQL_MakeStdTuple() | ||
480 : | new Handle:sql = SQL_Connect(info, errno, error, 127) | ||
481 : | |||
482 : | get_cvar_string("amx_sql_table", table, 31) | ||
483 : | |||
484 : | SQL_GetAffinity(type, 11) | ||
485 : | |||
486 : | if (sql == Empty_Handle) | ||
487 : | { | ||
488 : | server_print("[AMXX] %L", LANG_SERVER, "SQL_CANT_CON", error) | ||
489 : | |||
490 : | //backup to users.ini | ||
491 : | new configsDir[64] | ||
492 : | |||
493 : | get_configsdir(configsDir, 63) | ||
494 : | format(configsDir, 63, "%s/users.ini", configsDir) | ||
495 : | loadSettings(configsDir) // Load admins accounts | ||
496 : | |||
497 : | return PLUGIN_HANDLED | ||
498 : | } | ||
499 : | |||
500 : | new Handle:query | ||
501 : | |||
502 : | if (equali(type, "sqlite")) | ||
503 : | { | ||
504 : | if (!sqlite_TableExists(sql, table)) | ||
505 : | { | ||
506 : | SQL_QueryAndIgnore(sql, "CREATE TABLE %s ( auth TEXT NOT NULL DEFAULT '', password TEXT NOT NULL DEFAULT '', access TEXT NOT NULL DEFAULT '', flags TEXT NOT NULL DEFAULT '' )", table) | ||
507 : | } | ||
508 : | |||
509 : | query = SQL_PrepareQuery(sql, "SELECT auth, password, access, flags FROM %s", table) | ||
510 : | } else { | ||
511 : | SQL_QueryAndIgnore(sql, "CREATE TABLE IF NOT EXISTS `%s` ( `auth` VARCHAR( 32 ) NOT NULL, `password` VARCHAR( 32 ) NOT NULL, `access` VARCHAR( 32 ) NOT NULL, `flags` VARCHAR( 32 ) NOT NULL ) COMMENT = 'AMX Mod X Admins'", table) | ||
512 : | query = SQL_PrepareQuery(sql,"SELECT `auth`,`password`,`access`,`flags` FROM `%s`", table) | ||
513 : | } | ||
514 : | |||
515 : | if (!SQL_Execute(query)) | ||
516 : | { | ||
517 : | SQL_QueryError(query, error, 127) | ||
518 : | server_print("[AMXX] %L", LANG_SERVER, "SQL_CANT_LOAD_ADMINS", error) | ||
519 : | } else if (!SQL_NumResults(query)) { | ||
520 : | server_print("[AMXX] %L", LANG_SERVER, "NO_ADMINS") | ||
521 : | } else { | ||
522 : | |||
523 : | ian | 17 | AdminCount = 0 |
524 : | ian | 1 | |
525 : | /** do this incase people change the query order and forget to modify below */ | ||
526 : | new qcolAuth = SQL_FieldNameToNum(query, "auth") | ||
527 : | new qcolPass = SQL_FieldNameToNum(query, "password") | ||
528 : | new qcolAccess = SQL_FieldNameToNum(query, "access") | ||
529 : | new qcolFlags = SQL_FieldNameToNum(query, "flags") | ||
530 : | |||
531 : | ian | 17 | new AuthData[44]; |
532 : | new Password[44]; | ||
533 : | new Access[32]; | ||
534 : | new Flags[32]; | ||
535 : | |||
536 : | while (SQL_MoreResults(query)) | ||
537 : | ian | 1 | { |
538 : | ian | 17 | SQL_ReadResult(query, qcolAuth, AuthData, sizeof(AuthData)-1); |
539 : | SQL_ReadResult(query, qcolPass, Password, sizeof(Password)-1); | ||
540 : | SQL_ReadResult(query, qcolAccess, Access, sizeof(Access)-1); | ||
541 : | SQL_ReadResult(query, qcolFlags, Flags, sizeof(Flags)-1); | ||
542 : | ian | 1 | |
543 : | ian | 17 | admins_push(AuthData,Password,read_flags(Access),read_flags(Flags)); |
544 : | ian | 1 | |
545 : | ian | 17 | ++AdminCount; |
546 : | ian | 1 | SQL_NextRow(query) |
547 : | } | ||
548 : | |||
549 : | ian | 17 | if (AdminCount == 1) |
550 : | { | ||
551 : | ian | 1 | server_print("[AMXX] %L", LANG_SERVER, "SQL_LOADED_ADMIN") |
552 : | ian | 17 | } |
553 : | ian | 1 | else |
554 : | ian | 17 | { |
555 : | server_print("[AMXX] %L", LANG_SERVER, "SQL_LOADED_ADMINS", AdminCount) | ||
556 : | } | ||
557 : | ian | 1 | |
558 : | SQL_FreeHandle(query) | ||
559 : | SQL_FreeHandle(sql) | ||
560 : | SQL_FreeHandle(info) | ||
561 : | } | ||
562 : | |||
563 : | return PLUGIN_HANDLED | ||
564 : | } | ||
565 : | #endif | ||
566 : | |||
567 : | public cmdReload(id, level, cid) | ||
568 : | { | ||
569 : | if (!cmd_access(id, level, cid, 1)) | ||
570 : | return PLUGIN_HANDLED | ||
571 : | |||
572 : | //strip original flags (patch submitted by mrhunt) | ||
573 : | remove_user_flags(0, read_flags("z")) | ||
574 : | ian | 17 | |
575 : | admins_flush(); | ||
576 : | ian | 1 | |
577 : | #if !defined USING_SQL | ||
578 : | new filename[128] | ||
579 : | |||
580 : | get_configsdir(filename, 127) | ||
581 : | format(filename, 63, "%s/users.ini", filename) | ||
582 : | |||
583 : | ian | 17 | AdminCount = 0; |
584 : | loadSettings(filename); // Re-Load admins accounts | ||
585 : | ian | 1 | |
586 : | if (id != 0) | ||
587 : | { | ||
588 : | ian | 17 | if (AdminCount == 1) |
589 : | { | ||
590 : | console_print(id, "[AMXX] %L", LANG_SERVER, "LOADED_ADMIN"); | ||
591 : | } | ||
592 : | ian | 1 | else |
593 : | ian | 17 | { |
594 : | console_print(id, "[AMXX] %L", LANG_SERVER, "LOADED_ADMINS", AdminCount); | ||
595 : | } | ||
596 : | ian | 1 | } |
597 : | #else | ||
598 : | ian | 17 | AdminCount = 0 |
599 : | ian | 1 | adminSql() |
600 : | |||
601 : | if (id != 0) | ||
602 : | { | ||
603 : | ian | 17 | if (AdminCount == 1) |
604 : | ian | 1 | console_print(id, "[AMXX] %L", LANG_SERVER, "SQL_LOADED_ADMIN") |
605 : | else | ||
606 : | ian | 17 | console_print(id, "[AMXX] %L", LANG_SERVER, "SQL_LOADED_ADMINS", AdminCount) |
607 : | ian | 1 | } |
608 : | #endif | ||
609 : | |||
610 : | new players[32], num, pv | ||
611 : | new name[32] | ||
612 : | get_players(players, num) | ||
613 : | for (new i=0; i<num; i++) | ||
614 : | { | ||
615 : | pv = players[i] | ||
616 : | get_user_name(pv, name, 31) | ||
617 : | accessUser(pv, name) | ||
618 : | } | ||
619 : | |||
620 : | return PLUGIN_HANDLED | ||
621 : | } | ||
622 : | |||
623 : | getAccess(id, name[], authid[], ip[], password[]) | ||
624 : | { | ||
625 : | new index = -1 | ||
626 : | new result = 0 | ||
627 : | |||
628 : | ian | 17 | static Count; |
629 : | static Flags; | ||
630 : | static Access; | ||
631 : | static AuthData[44]; | ||
632 : | static Password[32]; | ||
633 : | |||
634 : | ian | 44 | g_CaseSensitiveName[id] = false; |
635 : | |||
636 : | ian | 17 | Count=admins_num(); |
637 : | for (new i = 0; i < Count; ++i) | ||
638 : | ian | 1 | { |
639 : | ian | 17 | Flags=admins_lookup(i,AdminProp_Flags); |
640 : | admins_lookup(i,AdminProp_Auth,AuthData,sizeof(AuthData)-1); | ||
641 : | |||
642 : | if (Flags & FLAG_AUTHID) | ||
643 : | ian | 1 | { |
644 : | ian | 17 | if (equal(authid, AuthData)) |
645 : | ian | 1 | { |
646 : | index = i | ||
647 : | break | ||
648 : | } | ||
649 : | } | ||
650 : | ian | 17 | else if (Flags & FLAG_IP) |
651 : | ian | 1 | { |
652 : | ian | 17 | new c = strlen(AuthData) |
653 : | ian | 1 | |
654 : | ian | 17 | if (AuthData[c - 1] == '.') /* check if this is not a xxx.xxx. format */ |
655 : | ian | 1 | { |
656 : | ian | 17 | if (equal(AuthData, ip, c)) |
657 : | ian | 1 | { |
658 : | index = i | ||
659 : | break | ||
660 : | } | ||
661 : | } /* in other case an IP must just match */ | ||
662 : | ian | 17 | else if (equal(ip, AuthData)) |
663 : | ian | 1 | { |
664 : | index = i | ||
665 : | break | ||
666 : | } | ||
667 : | ian | 17 | } |
668 : | else | ||
669 : | { | ||
670 : | ian | 44 | if (Flags & FLAG_CASE_SENSITIVE) |
671 : | ian | 1 | { |
672 : | ian | 44 | if (Flags & FLAG_TAG) |
673 : | ian | 1 | { |
674 : | ian | 44 | if (contain(name, AuthData) != -1) |
675 : | { | ||
676 : | index = i | ||
677 : | g_CaseSensitiveName[id] = true | ||
678 : | break | ||
679 : | } | ||
680 : | } | ||
681 : | else if (equal(name, AuthData)) | ||
682 : | { | ||
683 : | ian | 1 | index = i |
684 : | ian | 44 | g_CaseSensitiveName[id] = true |
685 : | ian | 1 | break |
686 : | } | ||
687 : | } | ||
688 : | ian | 44 | else |
689 : | ian | 1 | { |
690 : | ian | 44 | if (Flags & FLAG_TAG) |
691 : | { | ||
692 : | if (containi(name, AuthData) != -1) | ||
693 : | { | ||
694 : | index = i | ||
695 : | break | ||
696 : | } | ||
697 : | } | ||
698 : | else if (equali(name, AuthData)) | ||
699 : | { | ||
700 : | index = i | ||
701 : | break | ||
702 : | } | ||
703 : | ian | 1 | } |
704 : | } | ||
705 : | } | ||
706 : | |||
707 : | if (index != -1) | ||
708 : | { | ||
709 : | ian | 17 | Access=admins_lookup(index,AdminProp_Access); |
710 : | |||
711 : | if (Flags & FLAG_NOPASS) | ||
712 : | ian | 1 | { |
713 : | result |= 8 | ||
714 : | new sflags[32] | ||
715 : | |||
716 : | ian | 17 | get_flags(Access, sflags, 31) |
717 : | set_user_flags(id, Access) | ||
718 : | ian | 1 | |
719 : | ian | 17 | log_amx("Login: ^"%s<%d><%s><>^" became an admin (account ^"%s^") (access ^"%s^") (address ^"%s^")", name, get_user_userid(id), authid, AuthData, sflags, ip) |
720 : | ian | 1 | } |
721 : | ian | 17 | else |
722 : | ian | 1 | { |
723 : | ian | 17 | |
724 : | admins_lookup(index,AdminProp_Password,Password,sizeof(Password)-1); | ||
725 : | |||
726 : | if (equal(password, Password)) | ||
727 : | ian | 1 | { |
728 : | ian | 17 | result |= 12 |
729 : | set_user_flags(id, Access) | ||
730 : | |||
731 : | new sflags[32] | ||
732 : | get_flags(Access, sflags, 31) | ||
733 : | |||
734 : | log_amx("Login: ^"%s<%d><%s><>^" became an admin (account ^"%s^") (access ^"%s^") (address ^"%s^")", name, get_user_userid(id), authid, AuthData, sflags, ip) | ||
735 : | } | ||
736 : | else | ||
737 : | { | ||
738 : | result |= 1 | ||
739 : | |||
740 : | if (Flags & FLAG_KICK) | ||
741 : | { | ||
742 : | result |= 2 | ||
743 : | log_amx("Login: ^"%s<%d><%s><>^" kicked due to invalid password (account ^"%s^") (address ^"%s^")", name, get_user_userid(id), authid, AuthData, ip) | ||
744 : | } | ||
745 : | ian | 1 | } |
746 : | } | ||
747 : | } | ||
748 : | ian | 17 | else if (get_pcvar_float(amx_mode) == 2.0) |
749 : | ian | 1 | { |
750 : | result |= 2 | ||
751 : | ian | 17 | } |
752 : | else | ||
753 : | { | ||
754 : | ian | 1 | new defaccess[32] |
755 : | |||
756 : | ian | 17 | get_pcvar_string(amx_default_access, defaccess, 31) |
757 : | ian | 1 | |
758 : | if (!strlen(defaccess)) | ||
759 : | ian | 17 | { |
760 : | ian | 1 | copy(defaccess, 32, "z") |
761 : | ian | 17 | } |
762 : | ian | 1 | |
763 : | new idefaccess = read_flags(defaccess) | ||
764 : | |||
765 : | if (idefaccess) | ||
766 : | { | ||
767 : | result |= 8 | ||
768 : | set_user_flags(id, idefaccess) | ||
769 : | } | ||
770 : | } | ||
771 : | |||
772 : | return result | ||
773 : | } | ||
774 : | |||
775 : | accessUser(id, name[] = "") | ||
776 : | { | ||
777 : | remove_user_flags(id) | ||
778 : | |||
779 : | new userip[32], userauthid[32], password[32], passfield[32], username[32] | ||
780 : | |||
781 : | get_user_ip(id, userip, 31, 1) | ||
782 : | get_user_authid(id, userauthid, 31) | ||
783 : | |||
784 : | if (name[0]) | ||
785 : | { | ||
786 : | copy(username, 31, name) | ||
787 : | } | ||
788 : | else | ||
789 : | { | ||
790 : | get_user_name(id, username, 31) | ||
791 : | } | ||
792 : | |||
793 : | ian | 17 | get_pcvar_string(amx_password_field, passfield, 31) |
794 : | ian | 1 | get_user_info(id, passfield, password, 31) |
795 : | |||
796 : | new result = getAccess(id, username, userauthid, userip, password) | ||
797 : | |||
798 : | if (result & 1) | ||
799 : | { | ||
800 : | client_cmd(id, "echo ^"* %L^"", id, "INV_PAS") | ||
801 : | } | ||
802 : | |||
803 : | if (result & 2) | ||
804 : | { | ||
805 : | client_cmd(id, "%s", g_cmdLoopback) | ||
806 : | return PLUGIN_HANDLED | ||
807 : | } | ||
808 : | |||
809 : | if (result & 4) | ||
810 : | { | ||
811 : | client_cmd(id, "echo ^"* %L^"", id, "PAS_ACC") | ||
812 : | } | ||
813 : | |||
814 : | if (result & 8) | ||
815 : | { | ||
816 : | client_cmd(id, "echo ^"* %L^"", id, "PRIV_SET") | ||
817 : | } | ||
818 : | |||
819 : | return PLUGIN_CONTINUE | ||
820 : | } | ||
821 : | |||
822 : | public client_infochanged(id) | ||
823 : | { | ||
824 : | ian | 17 | if (!is_user_connected(id) || !get_pcvar_num(amx_mode)) |
825 : | ian | 1 | { |
826 : | return PLUGIN_CONTINUE | ||
827 : | } | ||
828 : | |||
829 : | new newname[32], oldname[32] | ||
830 : | |||
831 : | get_user_name(id, oldname, 31) | ||
832 : | get_user_info(id, "name", newname, 31) | ||
833 : | |||
834 : | ian | 44 | if (g_CaseSensitiveName[id]) |
835 : | ian | 1 | { |
836 : | ian | 44 | if (!equal(newname, oldname)) |
837 : | { | ||
838 : | accessUser(id, newname) | ||
839 : | } | ||
840 : | ian | 1 | } |
841 : | ian | 44 | else |
842 : | { | ||
843 : | if (!equali(newname, oldname)) | ||
844 : | { | ||
845 : | accessUser(id, newname) | ||
846 : | } | ||
847 : | } | ||
848 : | ian | 1 | return PLUGIN_CONTINUE |
849 : | } | ||
850 : | |||
851 : | public ackSignal(id) | ||
852 : | { | ||
853 : | server_cmd("kick #%d ^"%L^"", get_user_userid(id), id, "NO_ENTRY") | ||
854 : | ian | 17 | return PLUGIN_HANDLED |
855 : | ian | 1 | } |
856 : | |||
857 : | public client_authorized(id) | ||
858 : | ian | 17 | return get_pcvar_num(amx_mode) ? accessUser(id) : PLUGIN_CONTINUE |
859 : | ian | 1 | |
860 : | public client_putinserver(id) | ||
861 : | { | ||
862 : | if (!is_dedicated_server() && id == 1) | ||
863 : | ian | 17 | return get_pcvar_num(amx_mode) ? accessUser(id) : PLUGIN_CONTINUE |
864 : | ian | 1 | |
865 : | return PLUGIN_CONTINUE | ||
866 : | } |
Contact | ViewVC Help |
Powered by ViewVC 1.0.4 |