Merge pull request #5365 from Citadel-Station-13/upstream-merge-35399
[MIRROR] [s]Closes exploits in proc calling admin datum procs.
This commit is contained in:
@@ -27,6 +27,14 @@ GLOBAL_PROTECT(href_token)
|
|||||||
var/deadmined
|
var/deadmined
|
||||||
|
|
||||||
/datum/admins/New(datum/admin_rank/R, ckey, force_active = FALSE)
|
/datum/admins/New(datum/admin_rank/R, ckey, force_active = FALSE)
|
||||||
|
if(IsAdminAdvancedProcCall())
|
||||||
|
var/msg = " has tried to elevate permissions!"
|
||||||
|
message_admins("[key_name_admin(usr)][msg]")
|
||||||
|
log_admin("[key_name(usr)][msg]")
|
||||||
|
if (!target) //only del if this is a true creation (and not just a New() proc call), other wise trialmins/coders could abuse this to deadmin other admins
|
||||||
|
QDEL_IN(src, 0)
|
||||||
|
CRASH("Admin proc call creation of admin datum")
|
||||||
|
return
|
||||||
if(!ckey)
|
if(!ckey)
|
||||||
QDEL_IN(src, 0)
|
QDEL_IN(src, 0)
|
||||||
throw EXCEPTION("Admin datum created without a ckey")
|
throw EXCEPTION("Admin datum created without a ckey")
|
||||||
@@ -48,8 +56,20 @@ GLOBAL_PROTECT(href_token)
|
|||||||
else
|
else
|
||||||
deactivate()
|
deactivate()
|
||||||
|
|
||||||
|
/datum/admins/Destroy()
|
||||||
|
if(IsAdminAdvancedProcCall())
|
||||||
|
var/msg = " has tried to elevate permissions!"
|
||||||
|
message_admins("[key_name_admin(usr)][msg]")
|
||||||
|
log_admin("[key_name(usr)][msg]")
|
||||||
|
return QDEL_HINT_LETMELIVE
|
||||||
|
. = ..()
|
||||||
|
|
||||||
/datum/admins/proc/activate()
|
/datum/admins/proc/activate()
|
||||||
|
if(IsAdminAdvancedProcCall())
|
||||||
|
var/msg = " has tried to elevate permissions!"
|
||||||
|
message_admins("[key_name_admin(usr)][msg]")
|
||||||
|
log_admin("[key_name(usr)][msg]")
|
||||||
|
return
|
||||||
GLOB.deadmins -= target
|
GLOB.deadmins -= target
|
||||||
GLOB.admin_datums[target] = src
|
GLOB.admin_datums[target] = src
|
||||||
deadmined = FALSE
|
deadmined = FALSE
|
||||||
@@ -58,6 +78,11 @@ GLOBAL_PROTECT(href_token)
|
|||||||
|
|
||||||
|
|
||||||
/datum/admins/proc/deactivate()
|
/datum/admins/proc/deactivate()
|
||||||
|
if(IsAdminAdvancedProcCall())
|
||||||
|
var/msg = " has tried to elevate permissions!"
|
||||||
|
message_admins("[key_name_admin(usr)][msg]")
|
||||||
|
log_admin("[key_name(usr)][msg]")
|
||||||
|
return
|
||||||
GLOB.deadmins[target] = src
|
GLOB.deadmins[target] = src
|
||||||
GLOB.admin_datums -= target
|
GLOB.admin_datums -= target
|
||||||
deadmined = TRUE
|
deadmined = TRUE
|
||||||
@@ -70,14 +95,14 @@ GLOBAL_PROTECT(href_token)
|
|||||||
if(IsAdminAdvancedProcCall())
|
if(IsAdminAdvancedProcCall())
|
||||||
var/msg = " has tried to elevate permissions!"
|
var/msg = " has tried to elevate permissions!"
|
||||||
message_admins("[key_name_admin(usr)][msg]")
|
message_admins("[key_name_admin(usr)][msg]")
|
||||||
log_admin_private("[key_name(usr)][msg]")
|
log_admin("[key_name(usr)][msg]")
|
||||||
return
|
return
|
||||||
|
|
||||||
if(istype(C))
|
if(istype(C))
|
||||||
if(C.ckey != target)
|
if(C.ckey != target)
|
||||||
var/msg = " has attempted to associate with [target]'s admin datum"
|
var/msg = " has attempted to associate with [target]'s admin datum"
|
||||||
message_admins("[key_name_admin(C)][msg]")
|
message_admins("[key_name_admin(C)][msg]")
|
||||||
log_admin_private("[key_name(C)][msg]")
|
log_admin("[key_name(C)][msg]")
|
||||||
return
|
return
|
||||||
if (deadmined)
|
if (deadmined)
|
||||||
activate()
|
activate()
|
||||||
@@ -88,6 +113,11 @@ GLOBAL_PROTECT(href_token)
|
|||||||
GLOB.admins |= C
|
GLOB.admins |= C
|
||||||
|
|
||||||
/datum/admins/proc/disassociate()
|
/datum/admins/proc/disassociate()
|
||||||
|
if(IsAdminAdvancedProcCall())
|
||||||
|
var/msg = " has tried to elevate permissions!"
|
||||||
|
message_admins("[key_name_admin(usr)][msg]")
|
||||||
|
log_admin("[key_name(usr)][msg]")
|
||||||
|
return
|
||||||
if(owner)
|
if(owner)
|
||||||
GLOB.admins -= owner
|
GLOB.admins -= owner
|
||||||
owner.remove_admin_verbs()
|
owner.remove_admin_verbs()
|
||||||
@@ -173,4 +203,4 @@ you will have to do something like if(client.rights & R_ADMIN) yourself.
|
|||||||
return "admin_token=[RawHrefToken(forceGlobal)]"
|
return "admin_token=[RawHrefToken(forceGlobal)]"
|
||||||
|
|
||||||
/proc/HrefTokenFormField(forceGlobal = FALSE)
|
/proc/HrefTokenFormField(forceGlobal = FALSE)
|
||||||
return "<input type='hidden' name='admin_token' value='[RawHrefToken(forceGlobal)]'>"
|
return "<input type='hidden' name='admin_token' value='[RawHrefToken(forceGlobal)]'>"
|
||||||
|
|||||||
Reference in New Issue
Block a user