diff --git a/api/auth.go b/api/auth.go
index 56b76a334c8e83b48a9fb8afccb19d7fdb705df6..ef3c7bb624805152b106556e8dddf42fa7e624d3 100644
--- a/api/auth.go
+++ b/api/auth.go
@@ -12,6 +12,7 @@ import (
 type UserInfo struct {
 	UserId      string
 	AccessToken string
+	IsShared    bool
 }
 
 func AccessTokenRequiredRoute(next func(r *http.Request, log *logrus.Entry, user UserInfo) interface{}) func(*http.Request, *logrus.Entry) interface{} {
@@ -21,6 +22,11 @@ func AccessTokenRequiredRoute(next func(r *http.Request, log *logrus.Entry, user
 			log.Error("Error: no token provided (required)")
 			return InternalServerError("Error no token provided (required)")
 		}
+		if config.Get().SharedSecret.Enabled && accessToken == config.Get().SharedSecret.Token {
+			log = log.WithFields(logrus.Fields{"isRepoAdmin": true})
+			log.Info("User authed using shared secret")
+			return next(r, log, UserInfo{UserId: "@sharedsecret", AccessToken: accessToken, IsShared: true})
+		}
 		appserviceUserId := util.GetAppserviceUserIdFromRequest(r)
 		userId, err := matrix.GetUserIdFromToken(r.Context(), r.Host, accessToken, appserviceUserId, r.RemoteAddr)
 		if err != nil || userId == "" {
@@ -34,7 +40,7 @@ func AccessTokenRequiredRoute(next func(r *http.Request, log *logrus.Entry, user
 		}
 
 		log = log.WithFields(logrus.Fields{"authUserId": userId})
-		return next(r, log, UserInfo{userId, accessToken})
+		return next(r, log, UserInfo{userId, accessToken, false})
 	}
 }
 
@@ -42,7 +48,12 @@ func AccessTokenOptionalRoute(next func(r *http.Request, log *logrus.Entry, user
 	return func(r *http.Request, log *logrus.Entry) interface{} {
 		accessToken := util.GetAccessTokenFromRequest(r)
 		if accessToken == "" {
-			return next(r, log, UserInfo{"", ""})
+			return next(r, log, UserInfo{"", "", false})
+		}
+		if config.Get().SharedSecret.Enabled && accessToken == config.Get().SharedSecret.Token {
+			log = log.WithFields(logrus.Fields{"isRepoAdmin": true})
+			log.Info("User authed using shared secret")
+			return next(r, log, UserInfo{UserId: "@sharedsecret", AccessToken: accessToken, IsShared: true})
 		}
 		appserviceUserId := util.GetAppserviceUserIdFromRequest(r)
 		userId, err := matrix.GetUserIdFromToken(r.Context(), r.Host, accessToken, appserviceUserId, r.RemoteAddr)
@@ -57,7 +68,7 @@ func AccessTokenOptionalRoute(next func(r *http.Request, log *logrus.Entry, user
 		}
 
 		log = log.WithFields(logrus.Fields{"authUserId": userId})
-		return next(r, log, UserInfo{userId, accessToken})
+		return next(r, log, UserInfo{userId, accessToken, false})
 	}
 }
 
@@ -82,7 +93,7 @@ func RepoAdminRoute(next func(r *http.Request, log *logrus.Entry, user UserInfo)
 			if accessToken == config.Get().SharedSecret.Token {
 				log = log.WithFields(logrus.Fields{"isRepoAdmin": true})
 				log.Info("User authed using shared secret")
-				return next(r, log, UserInfo{UserId: "@sharedsecret", AccessToken: accessToken})
+				return next(r, log, UserInfo{UserId: "@sharedsecret", AccessToken: accessToken, IsShared: true})
 			}
 		}
 
diff --git a/api/custom/purge.go b/api/custom/purge.go
index 5bb507d8b95d99b7d0bf36512879fe7c3e3120d0..f3dcec695e70e3677204aed61a02f730e04859e0 100644
--- a/api/custom/purge.go
+++ b/api/custom/purge.go
@@ -121,7 +121,7 @@ func PurgeQurantined(r *http.Request, log *logrus.Entry, user api.UserInfo) inte
 }
 
 func getPurgeRequestInfo(r *http.Request, log *logrus.Entry, user api.UserInfo) (bool, bool) {
-	isGlobalAdmin := util.IsGlobalAdmin(user.UserId)
+	isGlobalAdmin := util.IsGlobalAdmin(user.UserId) || user.IsShared
 	isLocalAdmin, err := matrix.IsUserAdmin(r.Context(), r.Host, user.AccessToken, r.RemoteAddr)
 	if err != nil {
 		log.Error("Error verifying local admin: " + err.Error())
diff --git a/api/custom/quarantine.go b/api/custom/quarantine.go
index f28a5c01f03bb569370c697adb2b07f68df96140..d8d828ad9b0028ad7486b20d3e9908e84c4cd646 100644
--- a/api/custom/quarantine.go
+++ b/api/custom/quarantine.go
@@ -151,7 +151,7 @@ func setMediaQuarantined(media *types.Media, isQuarantined bool, allowOtherHosts
 }
 
 func getQuarantineRequestInfo(r *http.Request, log *logrus.Entry, user api.UserInfo) (bool, bool, bool) {
-	isGlobalAdmin := util.IsGlobalAdmin(user.UserId)
+	isGlobalAdmin := util.IsGlobalAdmin(user.UserId) || user.IsShared
 	canQuarantine := isGlobalAdmin
 	allowOtherHosts := isGlobalAdmin
 	isLocalAdmin := false