mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-09 16:14:13 +00:00
206 lines
5.2 KiB
Plaintext
206 lines
5.2 KiB
Plaintext
var/list/admin_ranks = list() //list of all ranks with associated rights
|
|
|
|
//load our rank - > rights associations
|
|
/proc/load_admin_ranks()
|
|
admin_ranks.len = 0
|
|
|
|
var/previous_rights = 0
|
|
|
|
//load text from file
|
|
var/list/Lines = file2list("config/admin_ranks.txt")
|
|
|
|
//process each line seperately
|
|
for(var/line in Lines)
|
|
if(!length(line))
|
|
continue
|
|
if(copytext(line,1,2) == "#")
|
|
continue
|
|
|
|
var/list/List = splittext(line,"+")
|
|
if(!List.len)
|
|
continue
|
|
|
|
var/rank = ckeyEx(List[1])
|
|
switch(rank)
|
|
if(null,"")
|
|
continue
|
|
if("Removed")
|
|
continue //Reserved
|
|
|
|
var/rights = 0
|
|
for(var/i=2, i<=List.len, i++)
|
|
switch(ckey(List[i]))
|
|
if("@","prev")
|
|
rights |= previous_rights
|
|
if("buildmode","build")
|
|
rights |= R_BUILDMODE
|
|
if("admin")
|
|
rights |= R_ADMIN
|
|
if("ban")
|
|
rights |= R_BAN
|
|
if("fun")
|
|
rights |= R_FUN
|
|
if("server")
|
|
rights |= R_SERVER
|
|
if("debug")
|
|
rights |= R_DEBUG
|
|
if("permissions","rights")
|
|
rights |= R_PERMISSIONS
|
|
if("polling", "poll")
|
|
rights |= R_POLLING
|
|
if("possess")
|
|
rights |= R_POSSESS
|
|
if("stealth")
|
|
rights |= R_STEALTH
|
|
if("rejuv","rejuvenate")
|
|
rights |= R_REJUVENATE
|
|
if("varedit")
|
|
rights |= R_VAREDIT
|
|
if("everything","host","all")
|
|
rights |= R_HOST
|
|
if("sound","sounds")
|
|
rights |= R_SOUNDS
|
|
if("spawn","create")
|
|
rights |= R_SPAWN
|
|
if("mod")
|
|
rights |= R_MOD
|
|
if("adminbus","bus")
|
|
rights |= R_ADMINBUS
|
|
|
|
admin_ranks[rank] = rights
|
|
previous_rights = rights
|
|
|
|
#ifdef TESTING
|
|
var/msg = "Permission Sets Built:\n"
|
|
for(var/rank in admin_ranks)
|
|
msg += "\t[rank] - [admin_ranks[rank]]\n"
|
|
//testing(msg)
|
|
#endif
|
|
|
|
|
|
/proc/load_admins()
|
|
//clear the datums references
|
|
admin_datums.len = 0
|
|
for(var/client/C in admins)
|
|
C.remove_admin_verbs()
|
|
C.holder = null
|
|
admins.len = 0
|
|
|
|
// Clear profiler and debug access.
|
|
for(var/A in world.GetConfig("admin"))
|
|
world.SetConfig("APP/admin", A, null)
|
|
|
|
if(config.admin_legacy_system)
|
|
load_admin_ranks()
|
|
|
|
//load text from file
|
|
var/list/Lines = file2list("config/admins.txt")
|
|
|
|
//process each line seperately
|
|
for(var/line in Lines)
|
|
if(!length(line))
|
|
continue
|
|
if(copytext(line,1,2) == "#")
|
|
continue
|
|
|
|
//Split the line at every "-"
|
|
var/list/List = splittext(line, "-")
|
|
if(!List.len)
|
|
continue
|
|
|
|
//ckey is before the first "-"
|
|
var/ckey = ckey(List[1])
|
|
if(!ckey)
|
|
continue
|
|
|
|
//rank follows the first "-"
|
|
var/rank = ""
|
|
if(List.len >= 2)
|
|
rank = ckeyEx(List[2])
|
|
|
|
//load permissions associated with this rank
|
|
var/rights = admin_ranks[rank]
|
|
|
|
//create the admin datum and store it for later use
|
|
var/datum/admins/D = new /datum/admins(rank, rights, ckey)
|
|
|
|
//find the client for a ckey if they are connected and associate them with the new admin datum
|
|
D.associate(directory[ckey])
|
|
|
|
if(D.rights & (R_DEBUG|R_SERVER)) // Grant profile/reboot access
|
|
world.SetConfig("APP/admin", ckey, "role=admin")
|
|
else
|
|
//The current admin system uses SQL
|
|
if(!SSdbcore.Connect())
|
|
world.log << "Failed to connect to database in load_admins(). Reverting to legacy system."
|
|
diary << "Failed to connect to database in load_admins(). Reverting to legacy system."
|
|
config.admin_legacy_system = 1
|
|
load_admins()
|
|
return
|
|
|
|
var/datum/DBQuery/query = SSdbcore.NewQuery("SELECT ckey, rank, level, flags FROM erro_admin")
|
|
if(!query.Execute(FALSE))
|
|
message_admins("Error: [query.ErrorMsg()]")
|
|
log_sql("Error: [query.ErrorMsg()]")
|
|
qdel(query)
|
|
return
|
|
while(query.NextRow())
|
|
var/ckey = query.item[1]
|
|
var/rank = query.item[2]
|
|
if(rank == "Removed")
|
|
continue //This person was de-adminned. They are only in the admin list for archive purposes.
|
|
|
|
var/rights = query.item[4]
|
|
if(istext(rights))
|
|
rights = text2num(rights)
|
|
var/datum/admins/D = new /datum/admins(rank, rights, ckey)
|
|
|
|
//find the client for a ckey if they are connected and associate them with the new admin datum
|
|
D.associate(directory[ckey])
|
|
|
|
if(D.rights & (R_DEBUG|R_SERVER)) // Grant profile/reboot access
|
|
world.SetConfig("APP/admin", ckey, "role=admin")
|
|
qdel(query)
|
|
if(!admin_datums)
|
|
world.log << "The database query in load_admins() resulted in no admins being added to the list. Reverting to legacy system."
|
|
diary << "The database query in load_admins() resulted in no admins being added to the list. Reverting to legacy system."
|
|
config.admin_legacy_system = 1
|
|
load_admins()
|
|
return
|
|
#ifdef TESTING
|
|
var/msg = "Admins Built:\n"
|
|
for(var/ckey in admin_datums)
|
|
var/rank
|
|
var/datum/admins/D = admin_datums[ckey]
|
|
if(D)
|
|
rank = D.rank
|
|
msg += "\t[ckey] - [rank]\n"
|
|
testing(msg)
|
|
#endif
|
|
|
|
#ifdef TESTING
|
|
/client/verb/changerank(newrank in admin_ranks)
|
|
if(holder)
|
|
holder.rank = newrank
|
|
holder.rights = admin_ranks[newrank]
|
|
else
|
|
holder = new /datum/admins(newrank,admin_ranks[newrank],ckey)
|
|
remove_admin_verbs()
|
|
holder.associate(src)
|
|
|
|
/client/verb/changerights(newrights as num)
|
|
if(holder)
|
|
holder.rights = newrights
|
|
else
|
|
holder = new /datum/admins("testing",newrights,ckey)
|
|
remove_admin_verbs()
|
|
holder.associate(src)
|
|
|
|
#endif
|
|
|
|
/proc/update_byond_admin(var/ckey)
|
|
var/datum/admins/D = admin_datums[ckey]
|
|
world.SetConfig("APP/admin", ckey, null)
|
|
if (D && D.rights & (R_SERVER|R_DEBUG))
|
|
world.SetConfig("APP/admin", ckey, "role=admin")
|