From 44ed0b7a38466bfc4c812ad26a0428e38de283fd Mon Sep 17 00:00:00 2001 From: Shivaram Lingamneni Date: Thu, 11 Mar 2021 00:34:53 -0500 Subject: [PATCH] fix #1565 Allow chanops to delete channel messages from history --- irc/histserv.go | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/irc/histserv.go b/irc/histserv.go index 4c686737..c7c13257 100644 --- a/irc/histserv.go +++ b/irc/histserv.go @@ -13,6 +13,7 @@ import ( "time" "github.com/oragono/oragono/irc/history" + "github.com/oragono/oragono/irc/modes" "github.com/oragono/oragono/irc/utils" ) @@ -102,21 +103,31 @@ func histservDeleteHandler(service *ircService, server *Server, client *Client, target, msgid = params[0], params[1] } + // operators can delete; if individual delete is allowed, a chanop or + // the message author can delete accountName := "*" - hasPrivs := client.HasRoleCapabs("history") - if !hasPrivs { - accountName = client.AccountName() - if !(server.Config().History.Retention.AllowIndividualDelete && accountName != "*") { - service.Notice(rb, client.t("Insufficient privileges")) - return + isChanop := false + isOper := client.HasRoleCapabs("history") + if !isOper { + if server.Config().History.Retention.AllowIndividualDelete { + channel := server.channels.Get(target) + if channel != nil && channel.ClientIsAtLeast(client, modes.Operator) { + isChanop = true + } else { + accountName = client.AccountName() + } } } + if !isOper && !isChanop && accountName == "*" { + service.Notice(rb, client.t("Insufficient privileges")) + return + } err := server.DeleteMessage(target, msgid, accountName) if err == nil { service.Notice(rb, client.t("Successfully deleted message")) } else { - if hasPrivs { + if isOper { service.Notice(rb, fmt.Sprintf(client.t("Error deleting message: %v"), err)) } else { service.Notice(rb, client.t("Could not delete message"))