From 2182b1da69ceaafad30859e45be0645d6c915b2c Mon Sep 17 00:00:00 2001 From: Val Lorentz Date: Fri, 26 May 2023 16:12:07 +0000 Subject: [PATCH 01/10] Makefile: Add dependencies between targets --- Makefile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 0a6bcf0e..f04b64ac 100644 --- a/Makefile +++ b/Makefile @@ -11,19 +11,19 @@ capdef_file = ./irc/caps/defs.go all: build -install: +install: build go install -v -ldflags "-X main.commit=$(GIT_COMMIT) -X main.version=$(GIT_TAG)" -build: +build: ${capdef_file} go build -v -ldflags "-X main.commit=$(GIT_COMMIT) -X main.version=$(GIT_TAG)" -release: +release: build goreleaser --skip-publish --rm-dist -capdefs: +${capdef_file}: ./gencapdefs.py python3 ./gencapdefs.py > ${capdef_file} -test: +test: ${capdef_file} python3 ./gencapdefs.py | diff - ${capdef_file} go test ./... go vet ./... From 96c24405cd619551a30eb6e21a396cbe4f9949c8 Mon Sep 17 00:00:00 2001 From: Val Lorentz Date: Fri, 26 May 2023 16:16:43 +0000 Subject: [PATCH 02/10] Implement draft/message-redaction for channels Permission to use REDACT mirrors permission for 'HistServ DELETE' --- gencapdefs.py | 6 +++++ irc/caps/defs.go | 9 +++++-- irc/commands.go | 4 +++ irc/handlers.go | 65 ++++++++++++++++++++++++++++++++++++++++++++++++ irc/help.go | 6 +++++ irc/histserv.go | 49 +++++++++++++++++++++++++++--------- 6 files changed, 125 insertions(+), 14 deletions(-) diff --git a/gencapdefs.py b/gencapdefs.py index 19ca4baa..00ba435e 100644 --- a/gencapdefs.py +++ b/gencapdefs.py @@ -87,6 +87,12 @@ url="https://gist.github.com/DanielOaks/8126122f74b26012a3de37db80e4e0c6", standard="proposed IRCv3", ), + CapDef( + identifier="MessageRedaction", + name="draft/message-redaction", + url="https://github.com/progval/ircv3-specifications/blob/redaction/extensions/message-redaction.md", + standard="proposed IRCv3", + ), CapDef( identifier="MessageTags", name="message-tags", diff --git a/irc/caps/defs.go b/irc/caps/defs.go index 8339660a..aa48a649 100644 --- a/irc/caps/defs.go +++ b/irc/caps/defs.go @@ -7,9 +7,9 @@ package caps const ( // number of recognized capabilities: - numCapabs = 32 + numCapabs = 33 // length of the uint32 array that represents the bitset: - bitsetLen = 1 + bitsetLen = 2 ) const ( @@ -57,6 +57,10 @@ const ( // https://gist.github.com/DanielOaks/8126122f74b26012a3de37db80e4e0c6 Languages Capability = iota + // MessageRedaction is the proposed IRCv3 capability named "draft/message-redaction": + // https://github.com/progval/ircv3-specifications/blob/redaction/extensions/message-redaction.md + MessageRedaction Capability = iota + // Multiline is the proposed IRCv3 capability named "draft/multiline": // https://github.com/ircv3/ircv3-specifications/pull/398 Multiline Capability = iota @@ -156,6 +160,7 @@ var ( "draft/chathistory", "draft/event-playback", "draft/languages", + "draft/message-redaction", "draft/multiline", "draft/persistence", "draft/pre-away", diff --git a/irc/commands.go b/irc/commands.go index d3f828b6..ccbec383 100644 --- a/irc/commands.go +++ b/irc/commands.go @@ -301,6 +301,10 @@ func init() { usablePreReg: true, minParams: 0, }, + "REDACT": { + handler: redactHandler, + minParams: 2, + }, "REHASH": { handler: rehashHandler, minParams: 0, diff --git a/irc/handlers.go b/irc/handlers.go index 043519de..a2e5f716 100644 --- a/irc/handlers.go +++ b/irc/handlers.go @@ -2663,6 +2663,71 @@ fail: return false } +// REDACT [:] +func redactHandler(server *Server, client *Client, msg ircmsg.Message, rb *ResponseBuffer) bool { + target := msg.Params[0]; + targetmsgid := msg.Params[1]; + //clientOnlyTags := msg.ClientOnlyTags() + var reason string + if len(msg.Params) > 2 { + reason = msg.Params[2] + } + + msgid := utils.GenerateSecretToken() + time := time.Now().UTC().Round(0) + details := client.Details() + isBot := client.HasMode(modes.Bot) + + if target[0] == '#' { + channel := server.channels.Get(target) + if channel == nil { + rb.Add(nil, server.name, ERR_NOSUCHCHANNEL, client.Nick(), utils.SafeErrorParam(target), client.t("No such channel")) + return false + } + + canDelete := canDelete(server, client, target) + if canDelete == canDeleteNone { + rb.Add(nil, server.name, "FAIL", "REDACT", "REDACT_FORBIDDEN", utils.SafeErrorParam(target), utils.SafeErrorParam(targetmsgid), client.t("You are not authorized to delete messages")) + return false + } + accountName := "*" + if canDelete == canDeleteSelf { + accountName = client.AccountName() + if accountName == "*" { + rb.Add(nil, server.name, "FAIL", "REDACT", "REDACT_FORBIDDEN", utils.SafeErrorParam(target), utils.SafeErrorParam(targetmsgid), client.t("You are not authorized to delete because you are logged out")) + return false + } + } + + err := server.DeleteMessage(target, targetmsgid, accountName) + if err == errNoop { + // Chat history is disabled; but this shouldn't be an error because we + // are going to relay the REDACT to other clients + } else if err != nil { + isOper := client.HasRoleCapabs("history") + if isOper || true{ + rb.Add(nil, server.name, "FAIL", "REDACT", "REDACT_FORBIDDEN", utils.SafeErrorParam(target), utils.SafeErrorParam(targetmsgid), fmt.Sprintf(client.t("Error deleting message: %v"), err)) + } else { + rb.Add(nil, server.name, "FAIL", "REDACT", "REDACT_FORBIDDEN", utils.SafeErrorParam(target), utils.SafeErrorParam(targetmsgid), client.t("Could not delete message")) + } + return false + } + + for _, member := range channel.Members() { + for _, session := range member.Sessions() { + if session.capabilities.Has(caps.MessageRedaction) { + session.sendFromClientInternal(false, time, msgid, details.nickMask, details.accountName, isBot, nil, "REDACT", target, targetmsgid, reason) + } else { + // TODO: add configurable fallback + } + } + } + } else { + // TODO + } + return false +} + func reportPersistenceStatus(client *Client, rb *ResponseBuffer, broadcast bool) { settings := client.AccountSettings() serverSetting := client.server.Config().Accounts.Multiclient.AlwaysOn diff --git a/irc/help.go b/irc/help.go index 2d972aa8..343bd717 100644 --- a/irc/help.go +++ b/irc/help.go @@ -435,6 +435,12 @@ Replies to a PING. Used to check link connectivity.`, text: `PRIVMSG {,} Sends the text to the given targets as a PRIVMSG.`, + }, + "redact": { + text: `REDACT [] + +Removes the message of the target msgid from the chat history of a channel +or target user.`, }, "relaymsg": { text: `RELAYMSG : diff --git a/irc/histserv.go b/irc/histserv.go index 3416cd6d..e49c22a8 100644 --- a/irc/histserv.go +++ b/irc/histserv.go @@ -15,6 +15,12 @@ import ( "github.com/ergochat/ergo/irc/utils" ) +const ( + canDeleteAny = iota // User is allowed to delete any message (for a given channel/PM) + canDeleteSelf // User is allowed to delete their own messages (ditto) + canDeleteNone // User is not allowed to delete any message (ditto) +) + const ( histservHelp = `HistServ provides commands related to history.` ) @@ -92,33 +98,52 @@ func histservForgetHandler(service *ircService, server *Server, client *Client, service.Notice(rb, fmt.Sprintf(client.t("Enqueued account %s for message deletion"), accountName)) } -func histservDeleteHandler(service *ircService, server *Server, client *Client, command string, params []string, rb *ResponseBuffer) { - target, msgid := params[0], params[1] // Fix #1881 2 params are required - - // operators can delete; if individual delete is allowed, a chanop or - // the message author can delete - accountName := "*" - isChanop := false +// Returns: +// +// 1. `canDeleteAny` if the client allowed to delete other users' messages from the target, ie.: +// * the client is a channel operator, or +// * the client is an operator with "history" capability +// 2. `canDeleteSelf` if the client is allowed to delete their own messages from the target +// 3. `canDeleteNone` otherwise +func canDelete(server *Server, client *Client, target string) int { isOper := client.HasRoleCapabs("history") - if !isOper { + if isOper { + return canDeleteAny + } else { if server.Config().History.Retention.AllowIndividualDelete { channel := server.channels.Get(target) if channel != nil && channel.ClientIsAtLeast(client, modes.Operator) { - isChanop = true + return canDeleteAny } else { - accountName = client.AccountName() + return canDeleteSelf } - } + } else { + return canDeleteNone + } } - if !isOper && !isChanop && accountName == "*" { +} + +func histservDeleteHandler(service *ircService, server *Server, client *Client, command string, params []string, rb *ResponseBuffer) { + target, msgid := params[0], params[1] // Fix #1881 2 params are required + + canDelete := canDelete(server, client, target) + accountName := "*" + if canDelete == canDeleteNone { service.Notice(rb, client.t("Insufficient privileges")) return + } else if canDelete == canDeleteSelf { + accountName = client.AccountName() + if 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 { + isOper := client.HasRoleCapabs("history") if isOper { service.Notice(rb, fmt.Sprintf(client.t("Error deleting message: %v"), err)) } else { From 9fb2cff877af22c479730d90cade47daca5af92d Mon Sep 17 00:00:00 2001 From: Val Lorentz Date: Fri, 26 May 2023 16:50:21 +0000 Subject: [PATCH 03/10] Error when the given targetmsg does not exist --- irc/handlers.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/irc/handlers.go b/irc/handlers.go index a2e5f716..23c58b12 100644 --- a/irc/handlers.go +++ b/irc/handlers.go @@ -2701,8 +2701,8 @@ func redactHandler(server *Server, client *Client, msg ircmsg.Message, rb *Respo err := server.DeleteMessage(target, targetmsgid, accountName) if err == errNoop { - // Chat history is disabled; but this shouldn't be an error because we - // are going to relay the REDACT to other clients + rb.Add(nil, server.name, "FAIL", "REDACT", "UNKNOWN_MSGID", utils.SafeErrorParam(target), utils.SafeErrorParam(targetmsgid), client.t("This message does not exist or is too old")) + return false } else if err != nil { isOper := client.HasRoleCapabs("history") if isOper || true{ From 78cd9c9e12ed75d8dcee01785f2ad74ce668072a Mon Sep 17 00:00:00 2001 From: Val Lorentz Date: Fri, 26 May 2023 18:38:52 +0000 Subject: [PATCH 04/10] gofmt --- irc/handlers.go | 6 +++--- irc/histserv.go | 21 +++++++++++---------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/irc/handlers.go b/irc/handlers.go index 23c58b12..75a2bab9 100644 --- a/irc/handlers.go +++ b/irc/handlers.go @@ -2665,8 +2665,8 @@ fail: // REDACT [:] func redactHandler(server *Server, client *Client, msg ircmsg.Message, rb *ResponseBuffer) bool { - target := msg.Params[0]; - targetmsgid := msg.Params[1]; + target := msg.Params[0] + targetmsgid := msg.Params[1] //clientOnlyTags := msg.ClientOnlyTags() var reason string if len(msg.Params) > 2 { @@ -2705,7 +2705,7 @@ func redactHandler(server *Server, client *Client, msg ircmsg.Message, rb *Respo return false } else if err != nil { isOper := client.HasRoleCapabs("history") - if isOper || true{ + if isOper || true { rb.Add(nil, server.name, "FAIL", "REDACT", "REDACT_FORBIDDEN", utils.SafeErrorParam(target), utils.SafeErrorParam(targetmsgid), fmt.Sprintf(client.t("Error deleting message: %v"), err)) } else { rb.Add(nil, server.name, "FAIL", "REDACT", "REDACT_FORBIDDEN", utils.SafeErrorParam(target), utils.SafeErrorParam(targetmsgid), client.t("Could not delete message")) diff --git a/irc/histserv.go b/irc/histserv.go index e49c22a8..5d3b312b 100644 --- a/irc/histserv.go +++ b/irc/histserv.go @@ -16,9 +16,9 @@ import ( ) const ( - canDeleteAny = iota // User is allowed to delete any message (for a given channel/PM) - canDeleteSelf // User is allowed to delete their own messages (ditto) - canDeleteNone // User is not allowed to delete any message (ditto) + canDeleteAny = iota // User is allowed to delete any message (for a given channel/PM) + canDeleteSelf // User is allowed to delete their own messages (ditto) + canDeleteNone // User is not allowed to delete any message (ditto) ) const ( @@ -101,25 +101,26 @@ func histservForgetHandler(service *ircService, server *Server, client *Client, // Returns: // // 1. `canDeleteAny` if the client allowed to delete other users' messages from the target, ie.: -// * the client is a channel operator, or -// * the client is an operator with "history" capability +// - the client is a channel operator, or +// - the client is an operator with "history" capability +// // 2. `canDeleteSelf` if the client is allowed to delete their own messages from the target // 3. `canDeleteNone` otherwise func canDelete(server *Server, client *Client, target string) int { isOper := client.HasRoleCapabs("history") if isOper { - return canDeleteAny - } else { + return canDeleteAny + } else { if server.Config().History.Retention.AllowIndividualDelete { channel := server.channels.Get(target) if channel != nil && channel.ClientIsAtLeast(client, modes.Operator) { return canDeleteAny } else { - return canDeleteSelf + return canDeleteSelf } } else { - return canDeleteNone - } + return canDeleteNone + } } } From 80395860a2da1981204bc77026ff272985a52d35 Mon Sep 17 00:00:00 2001 From: Val Lorentz Date: Mon, 29 May 2023 13:54:13 +0000 Subject: [PATCH 05/10] Add CanDelete enum type --- irc/histserv.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/irc/histserv.go b/irc/histserv.go index 5d3b312b..b1a778ee 100644 --- a/irc/histserv.go +++ b/irc/histserv.go @@ -15,10 +15,12 @@ import ( "github.com/ergochat/ergo/irc/utils" ) +type CanDelete uint + const ( - canDeleteAny = iota // User is allowed to delete any message (for a given channel/PM) - canDeleteSelf // User is allowed to delete their own messages (ditto) - canDeleteNone // User is not allowed to delete any message (ditto) + canDeleteAny CanDelete = iota // User is allowed to delete any message (for a given channel/PM) + canDeleteSelf // User is allowed to delete their own messages (ditto) + canDeleteNone // User is not allowed to delete any message (ditto) ) const ( @@ -106,7 +108,7 @@ func histservForgetHandler(service *ircService, server *Server, client *Client, // // 2. `canDeleteSelf` if the client is allowed to delete their own messages from the target // 3. `canDeleteNone` otherwise -func canDelete(server *Server, client *Client, target string) int { +func canDelete(server *Server, client *Client, target string) CanDelete { isOper := client.HasRoleCapabs("history") if isOper { return canDeleteAny From cc11d0fb21ce17526b7c73c182f3ebe39ab8df02 Mon Sep 17 00:00:00 2001 From: Val Lorentz Date: Mon, 29 May 2023 13:58:13 +0000 Subject: [PATCH 06/10] gofmt --- irc/histserv.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/irc/histserv.go b/irc/histserv.go index b1a778ee..c6732113 100644 --- a/irc/histserv.go +++ b/irc/histserv.go @@ -18,9 +18,9 @@ import ( type CanDelete uint const ( - canDeleteAny CanDelete = iota // User is allowed to delete any message (for a given channel/PM) - canDeleteSelf // User is allowed to delete their own messages (ditto) - canDeleteNone // User is not allowed to delete any message (ditto) + canDeleteAny CanDelete = iota // User is allowed to delete any message (for a given channel/PM) + canDeleteSelf // User is allowed to delete their own messages (ditto) + canDeleteNone // User is not allowed to delete any message (ditto) ) const ( From f0c8989397a847fc9bdf64da95f97b4612b10859 Mon Sep 17 00:00:00 2001 From: Val Lorentz Date: Mon, 29 May 2023 16:34:16 +0000 Subject: [PATCH 07/10] Add support for PMs --- irc/handlers.go | 79 ++++++++++++++++++++++++++++++++----------------- irc/histserv.go | 4 +-- 2 files changed, 54 insertions(+), 29 deletions(-) diff --git a/irc/handlers.go b/irc/handlers.go index 75a2bab9..aa8ab714 100644 --- a/irc/handlers.go +++ b/irc/handlers.go @@ -2672,6 +2672,8 @@ func redactHandler(server *Server, client *Client, msg ircmsg.Message, rb *Respo if len(msg.Params) > 2 { reason = msg.Params[2] } + var members []*Client // members of a channel, or both parties of a PM + var canDelete CanDelete msgid := utils.GenerateSecretToken() time := time.Now().UTC().Round(0) @@ -2684,46 +2686,69 @@ func redactHandler(server *Server, client *Client, msg ircmsg.Message, rb *Respo rb.Add(nil, server.name, ERR_NOSUCHCHANNEL, client.Nick(), utils.SafeErrorParam(target), client.t("No such channel")) return false } + members = channel.Members() + canDelete = deletionPolicy(server, client, target) + } else { + targetClient := server.clients.Get(target) + if targetClient == nil { + rb.Add(nil, server.name, ERR_NOSUCHNICK, client.Nick(), target, "No such nick") + return false + } + members = []*Client{client, targetClient} + canDelete = canDeleteSelf + } - canDelete := canDelete(server, client, target) - if canDelete == canDeleteNone { - rb.Add(nil, server.name, "FAIL", "REDACT", "REDACT_FORBIDDEN", utils.SafeErrorParam(target), utils.SafeErrorParam(targetmsgid), client.t("You are not authorized to delete messages")) + if canDelete == canDeleteNone { + rb.Add(nil, server.name, "FAIL", "REDACT", "REDACT_FORBIDDEN", utils.SafeErrorParam(target), utils.SafeErrorParam(targetmsgid), client.t("You are not authorized to delete messages")) + return false + } + accountName := "*" + if canDelete == canDeleteSelf { + accountName = client.AccountName() + if accountName == "*" { + rb.Add(nil, server.name, "FAIL", "REDACT", "REDACT_FORBIDDEN", utils.SafeErrorParam(target), utils.SafeErrorParam(targetmsgid), client.t("You are not authorized to delete because you are logged out")) return false } - accountName := "*" - if canDelete == canDeleteSelf { - accountName = client.AccountName() - if accountName == "*" { - rb.Add(nil, server.name, "FAIL", "REDACT", "REDACT_FORBIDDEN", utils.SafeErrorParam(target), utils.SafeErrorParam(targetmsgid), client.t("You are not authorized to delete because you are logged out")) - return false - } + } + + err := server.DeleteMessage(target, targetmsgid, accountName) + if err == errNoop { + rb.Add(nil, server.name, "FAIL", "REDACT", "UNKNOWN_MSGID", utils.SafeErrorParam(target), utils.SafeErrorParam(targetmsgid), client.t("This message does not exist or is too old")) + return false + } else if err != nil { + isOper := client.HasRoleCapabs("history") + if isOper { + rb.Add(nil, server.name, "FAIL", "REDACT", "REDACT_FORBIDDEN", utils.SafeErrorParam(target), utils.SafeErrorParam(targetmsgid), fmt.Sprintf(client.t("Error deleting message: %v"), err)) + } else { + rb.Add(nil, server.name, "FAIL", "REDACT", "REDACT_FORBIDDEN", utils.SafeErrorParam(target), utils.SafeErrorParam(targetmsgid), client.t("Could not delete message")) } + return false + } - err := server.DeleteMessage(target, targetmsgid, accountName) - if err == errNoop { - rb.Add(nil, server.name, "FAIL", "REDACT", "UNKNOWN_MSGID", utils.SafeErrorParam(target), utils.SafeErrorParam(targetmsgid), client.t("This message does not exist or is too old")) - return false - } else if err != nil { + if target[0] != '#' { + // If this is a PM, we just removed the message from the buffer of the other party; + // now we have to remove it from the buffer of the client who sent the REDACT command + err := server.DeleteMessage(client.Nick(), targetmsgid, accountName) + + if err != nil { + client.server.logger.Error("internal", fmt.Sprintf("Private message %s is not deletable by %s from their own buffer's even though we just deleted it from %s's. This is a bug, please report it in details.", targetmsgid, client.Nick(), target), client.Nick()) isOper := client.HasRoleCapabs("history") - if isOper || true { + if isOper { rb.Add(nil, server.name, "FAIL", "REDACT", "REDACT_FORBIDDEN", utils.SafeErrorParam(target), utils.SafeErrorParam(targetmsgid), fmt.Sprintf(client.t("Error deleting message: %v"), err)) } else { - rb.Add(nil, server.name, "FAIL", "REDACT", "REDACT_FORBIDDEN", utils.SafeErrorParam(target), utils.SafeErrorParam(targetmsgid), client.t("Could not delete message")) + rb.Add(nil, server.name, "FAIL", "REDACT", "REDACT_FORBIDDEN", utils.SafeErrorParam(target), utils.SafeErrorParam(targetmsgid), client.t("Error deleting message")) } - return false } + } - for _, member := range channel.Members() { - for _, session := range member.Sessions() { - if session.capabilities.Has(caps.MessageRedaction) { - session.sendFromClientInternal(false, time, msgid, details.nickMask, details.accountName, isBot, nil, "REDACT", target, targetmsgid, reason) - } else { - // TODO: add configurable fallback - } + for _, member := range members { + for _, session := range member.Sessions() { + if session.capabilities.Has(caps.MessageRedaction) { + session.sendFromClientInternal(false, time, msgid, details.nickMask, details.accountName, isBot, nil, "REDACT", target, targetmsgid, reason) + } else { + // TODO: add configurable fallback } } - } else { - // TODO } return false } diff --git a/irc/histserv.go b/irc/histserv.go index c6732113..f0cb2285 100644 --- a/irc/histserv.go +++ b/irc/histserv.go @@ -108,7 +108,7 @@ func histservForgetHandler(service *ircService, server *Server, client *Client, // // 2. `canDeleteSelf` if the client is allowed to delete their own messages from the target // 3. `canDeleteNone` otherwise -func canDelete(server *Server, client *Client, target string) CanDelete { +func deletionPolicy(server *Server, client *Client, target string) CanDelete { isOper := client.HasRoleCapabs("history") if isOper { return canDeleteAny @@ -129,7 +129,7 @@ func canDelete(server *Server, client *Client, target string) CanDelete { func histservDeleteHandler(service *ircService, server *Server, client *Client, command string, params []string, rb *ResponseBuffer) { target, msgid := params[0], params[1] // Fix #1881 2 params are required - canDelete := canDelete(server, client, target) + canDelete := deletionPolicy(server, client, target) accountName := "*" if canDelete == canDeleteNone { service.Notice(rb, client.t("Insufficient privileges")) From e84a92db957b374b19a3b40a2b248982abec270d Mon Sep 17 00:00:00 2001 From: Val Lorentz Date: Mon, 29 May 2023 18:58:56 +0000 Subject: [PATCH 08/10] Fix documentation of allow-individual-delete. --- default.yaml | 3 ++- traditional.yaml | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/default.yaml b/default.yaml index 23573f6c..93cef8df 100644 --- a/default.yaml +++ b/default.yaml @@ -982,7 +982,8 @@ history: # options to control how messages are stored and deleted: retention: - # allow users to delete their own messages from history? + # allow users to delete their own messages from history, + # and channel operators to delete messages in their channel? allow-individual-delete: false # if persistent history is enabled, create additional index tables, diff --git a/traditional.yaml b/traditional.yaml index df5e8cfa..1291771c 100644 --- a/traditional.yaml +++ b/traditional.yaml @@ -954,7 +954,8 @@ history: # options to control how messages are stored and deleted: retention: - # allow users to delete their own messages from history? + # allow users to delete their own messages from history, + # and channel operators to delete messages in their channel? allow-individual-delete: false # if persistent history is enabled, create additional index tables, From fd2f5b76d99b2e50a4c0d0f0368703e8cf031d51 Mon Sep 17 00:00:00 2001 From: Val Lorentz Date: Mon, 29 May 2023 19:00:12 +0000 Subject: [PATCH 09/10] Remove 'TODO: add configurable fallback' slingamn says it's probably not desirable, and I'm on the fence. Out of laziness, let's omit it for now, as it's not a regression compared to '/msg HistServ DELETE'. --- irc/handlers.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/irc/handlers.go b/irc/handlers.go index aa8ab714..b256bb80 100644 --- a/irc/handlers.go +++ b/irc/handlers.go @@ -2746,7 +2746,8 @@ func redactHandler(server *Server, client *Client, msg ircmsg.Message, rb *Respo if session.capabilities.Has(caps.MessageRedaction) { session.sendFromClientInternal(false, time, msgid, details.nickMask, details.accountName, isBot, nil, "REDACT", target, targetmsgid, reason) } else { - // TODO: add configurable fallback + // If we wanted to send a fallback to clients which do not support + // draft/message-redaction, we would do it from here. } } } From 5707ed740751e41a0d1bb9a80b205875870fa472 Mon Sep 17 00:00:00 2001 From: Val Lorentz Date: Wed, 31 May 2023 05:06:09 +0000 Subject: [PATCH 10/10] Revert "Makefile: Add dependencies between targets" This reverts commit 2182b1da69ceaafad30859e45be0645d6c915b2c. --- Makefile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index f04b64ac..0a6bcf0e 100644 --- a/Makefile +++ b/Makefile @@ -11,19 +11,19 @@ capdef_file = ./irc/caps/defs.go all: build -install: build +install: go install -v -ldflags "-X main.commit=$(GIT_COMMIT) -X main.version=$(GIT_TAG)" -build: ${capdef_file} +build: go build -v -ldflags "-X main.commit=$(GIT_COMMIT) -X main.version=$(GIT_TAG)" -release: build +release: goreleaser --skip-publish --rm-dist -${capdef_file}: ./gencapdefs.py +capdefs: python3 ./gencapdefs.py > ${capdef_file} -test: ${capdef_file} +test: python3 ./gencapdefs.py | diff - ${capdef_file} go test ./... go vet ./...