diff --git a/SQL/admin_import_2018-02-03.py b/SQL/admin_import_2018-02-03.py
index 19efc2fc44..6bd8892b5e 100644
--- a/SQL/admin_import_2018-02-03.py
+++ b/SQL/admin_import_2018-02-03.py
@@ -18,6 +18,7 @@ import MySQLdb
import argparse
import re
import sys
+import string
def parse_text_flags(text, previous):
flag_values = {"BUILDMODE":1, "BUILD":1, "ADMIN":2, "REJUVINATE":2, "REJUV":2, "BAN":4, "FUN":8, "SERVER":16, "DEBUG":32, "POSSESS":64, "PERMISSIONS":128, "RIGHTS":128, "STEALTH":256, "POLL":512, "VAREDIT":1024, "SOUNDS":2048, "SOUND":2048, "SPAWN":4096, "CREATE":4096, "AUTOLOGIN":8192, "AUTOADMIN":8192, "DBRANKS":16384}
@@ -70,6 +71,7 @@ db=MySQLdb.connect(host=args.address, user=args.username, passwd=args.password,
cursor=db.cursor()
ranks_table = args.rankstable
admin_table = args.admintable
+ckeyExformat = re.sub("@|-|_", " ", string.punctuation)
with open("..\\config\\admin_ranks.txt") as rank_file:
previous = 0
for line in rank_file:
@@ -77,17 +79,21 @@ with open("..\\config\\admin_ranks.txt") as rank_file:
if line.startswith("#"):
continue
matches = re.match("(.+)\\b\\s+=\\s*(.*)", line)
+ rank = "".join((c for c in matches.group(1) if c not in ckeyExformat))
flags = parse_text_flags(matches.group(2), previous)
previous = flags
- cursor.execute("INSERT INTO {0} (rank, flags, exclude_flags, can_edit_flags) VALUES ('{1}', {2}, {3}, {4})".format(ranks_table, matches.group(1), flags[0], flags[1], flags[2]))
+ cursor.execute("INSERT INTO {0} (rank, flags, exclude_flags, can_edit_flags) VALUES ('{1}', {2}, {3}, {4})".format(ranks_table, rank, flags[0], flags[1], flags[2]))
with open("..\\config\\admins.txt") as admins_file:
previous = 0
+ ckeyformat = string.punctuation.replace("@", " ")
for line in admins_file:
if line.strip():
if line.startswith("#"):
continue
matches = re.match("(.+)\\b\\s+=\\s+(.+)", line)
- cursor.execute("INSERT INTO {0} (ckey, rank) VALUES ('{1}', '{2}')".format(admin_table, matches.group(1).lower(), matches.group(2)))
+ ckey = "".join((c for c in matches.group(1) if c not in ckeyformat)).lower()
+ rank = "".join((c for c in matches.group(2) if c not in ckeyExformat))
+ cursor.execute("INSERT INTO {0} (ckey, rank) VALUES ('{1}', '{2}')".format(admin_table, ckey, rank))
db.commit()
cursor.close()
print("Import complete.")
diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm
index dee4787753..eee3ff0edc 100644
--- a/code/modules/admin/admin_ranks.dm
+++ b/code/modules/admin/admin_ranks.dm
@@ -156,7 +156,7 @@ GLOBAL_PROTECT(protected_ranks)
else
while(query_load_admin_ranks.NextRow())
var/skip
- var/rank_name = query_load_admin_ranks.item[1]
+ var/rank_name = ckeyEx(query_load_admin_ranks.item[1])
for(var/datum/admin_rank/R in GLOB.admin_ranks)
if(R.name == rank_name) //this rank was already loaded from txt override
skip = 1
diff --git a/code/modules/admin/permissionedit.dm b/code/modules/admin/permissionedit.dm
index f7bb770079..961c20e1c9 100644
--- a/code/modules/admin/permissionedit.dm
+++ b/code/modules/admin/permissionedit.dm
@@ -9,6 +9,7 @@
/datum/admins/proc/edit_admin_permissions()
if(!check_rights(R_PERMISSIONS))
return
+<<<<<<< HEAD
var/list/output = list({"
@@ -56,6 +57,108 @@
"}
usr << browse(jointext(output, ""),"window=editrights;size=1000x650")
+=======
+ var/list/output = list("\[Permissions\]")
+ if(action)
+ output += " | \[Log\] | \[Management\]
"
+ else
+ output += "
\[Log\]
\[Management\]"
+ if(action == 1)
+ var/list/searchlist = list(" WHERE ")
+ if(target)
+ searchlist += "ckey = '[sanitizeSQL(target)]'"
+ if(operation)
+ if(target)
+ searchlist += " AND "
+ searchlist += "operation = '[sanitizeSQL(operation)]'"
+ var/search
+ if(searchlist.len > 1)
+ search = searchlist.Join("")
+ var/logcount = 0
+ var/logssperpage = 20
+ var/pagecount = 0
+ page = text2num(page)
+ var/datum/DBQuery/query_count_admin_logs = SSdbcore.NewQuery("SELECT COUNT(id) FROM [format_table_name("admin_log")][search]")
+ if(!query_count_admin_logs.warn_execute())
+ return
+ if(query_count_admin_logs.NextRow())
+ logcount = text2num(query_count_admin_logs.item[1])
+ if(logcount > logssperpage)
+ output += "
Page: "
+ while(logcount > 0)
+ output += "|[pagecount == page ? "\[[pagecount]\]" : "\[[pagecount]\]"]"
+ logcount -= logssperpage
+ pagecount++
+ output += "|"
+ var/limit = " LIMIT [logssperpage * page], [logssperpage]"
+ var/datum/DBQuery/query_search_admin_logs = SSdbcore.NewQuery("SELECT datetime, round_id, adminckey, operation, target, log FROM [format_table_name("admin_log")][search] ORDER BY datetime DESC[limit]")
+ if(!query_search_admin_logs.warn_execute())
+ return
+ while(query_search_admin_logs.NextRow())
+ var/datetime = query_search_admin_logs.item[1]
+ var/round_id = query_search_admin_logs.item[2]
+ var/admin_ckey = query_search_admin_logs.item[3]
+ operation = query_search_admin_logs.item[4]
+ target = query_search_admin_logs.item[5]
+ var/log = query_search_admin_logs.item[6]
+ output += "[datetime] | Round ID [round_id] | Admin [admin_ckey] | Operation [operation] on [target]
[log]
"
+ if(action == 2)
+ output += "Admin ckeys with invalid ranks
"
+ var/datum/DBQuery/query_check_admin_errors = SSdbcore.NewQuery("SELECT ckey, [format_table_name("admin")].rank FROM [format_table_name("admin")] LEFT JOIN [format_table_name("admin_ranks")] ON [format_table_name("admin_ranks")].rank = [format_table_name("admin")].rank WHERE [format_table_name("admin_ranks")].rank IS NULL")
+ if(!query_check_admin_errors.warn_execute())
+ return
+ while(query_check_admin_errors.NextRow())
+ var/admin_ckey = query_check_admin_errors.item[1]
+ var/admin_rank = query_check_admin_errors.item[2]
+ output += "[admin_ckey] has non-existant rank [admin_rank] | \[Change Rank\] | \[Remove\]"
+ output += "
"
+ output += "Unused ranks
"
+ var/datum/DBQuery/query_check_unused_rank = SSdbcore.NewQuery("SELECT [format_table_name("admin_ranks")].rank, flags, exclude_flags, can_edit_flags FROM [format_table_name("admin_ranks")] LEFT JOIN [format_table_name("admin")] ON [format_table_name("admin")].rank = [format_table_name("admin_ranks")].rank WHERE [format_table_name("admin")].rank IS NULL")
+ if(!query_check_unused_rank.warn_execute())
+ return
+ while(query_check_unused_rank.NextRow())
+ var/admin_rank = query_check_unused_rank.item[1]
+ output += {"Rank [admin_rank] is not held by any admin | \[Remove\]
+
Permissions: [rights2text(text2num(query_check_unused_rank.item[2])," ")]
+
Denied: [rights2text(text2num(query_check_unused_rank.item[3])," ", "-")]
+
Allowed to edit: [rights2text(text2num(query_check_unused_rank.item[4])," ", "*")]
+
"}
+ else if(!action)
+ output += {"
+ Permissions Panel
+
+
+
+ Search:
"
+ usr << browse("[jointext(output, "")]","window=editrights;size=1000x650")
+>>>>>>> e44298a... some dbadmin fixes (#37623)
/datum/admins/proc/edit_rights_topic(list/href_list)
if(!check_rights(R_PERMISSIONS))
@@ -142,6 +245,16 @@
return FALSE
if(use_db)
. = sanitizeSQL(.)
+<<<<<<< HEAD
+=======
+ //if an admin exists without a datum they won't be caught by the above
+ var/datum/DBQuery/query_admin_in_db = SSdbcore.NewQuery("SELECT 1 FROM [format_table_name("admin")] WHERE ckey = '[.]'")
+ if(!query_admin_in_db.warn_execute())
+ return FALSE
+ if(query_admin_in_db.NextRow())
+ to_chat(usr, "[.] already listed in admin database. Check the Management tab if they don't appear in the list of admins.")
+ return FALSE
+>>>>>>> e44298a... some dbadmin fixes (#37623)
var/datum/DBQuery/query_add_admin = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin")] (ckey, rank) VALUES ('[.]', 'NEW ADMIN')")
if(!query_add_admin.warn_execute())
return FALSE
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 95dae05c09..2fb35e9c45 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -821,8 +821,8 @@
var/isbanned_dept = jobban_isbanned(M, ROLE_SYNDICATE)
dat += "