Forráskód Böngészése

Add better errors for rejected edits

Tulir Asokan 2 éve
szülő
commit
5ffd92731b
4 módosított fájl, 32 hozzáadás és 6 törlés
  1. 1 1
      go.mod
  2. 2 2
      go.sum
  3. 12 1
      messagetracking.go
  4. 17 2
      portal.go

+ 1 - 1
go.mod

@@ -11,7 +11,7 @@ require (
 	github.com/prometheus/client_golang v1.14.0
 	github.com/prometheus/client_golang v1.14.0
 	github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
 	github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
 	github.com/tidwall/gjson v1.14.4
 	github.com/tidwall/gjson v1.14.4
-	go.mau.fi/whatsmeow v0.0.0-20230406104207-886f40e6f4f2
+	go.mau.fi/whatsmeow v0.0.0-20230406111517-0120a5e3f989
 	golang.org/x/image v0.6.0
 	golang.org/x/image v0.6.0
 	golang.org/x/net v0.8.0
 	golang.org/x/net v0.8.0
 	google.golang.org/protobuf v1.28.1
 	google.golang.org/protobuf v1.28.1

+ 2 - 2
go.sum

@@ -67,8 +67,8 @@ github.com/yuin/goldmark v1.5.4 h1:2uY/xC0roWy8IBEGLgB1ywIoEJFGmRrX21YQcvGZzjU=
 github.com/yuin/goldmark v1.5.4/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 github.com/yuin/goldmark v1.5.4/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 go.mau.fi/libsignal v0.1.0 h1:vAKI/nJ5tMhdzke4cTK1fb0idJzz1JuEIpmjprueC+c=
 go.mau.fi/libsignal v0.1.0 h1:vAKI/nJ5tMhdzke4cTK1fb0idJzz1JuEIpmjprueC+c=
 go.mau.fi/libsignal v0.1.0/go.mod h1:R8ovrTezxtUNzCQE5PH30StOQWWeBskBsWE55vMfY9I=
 go.mau.fi/libsignal v0.1.0/go.mod h1:R8ovrTezxtUNzCQE5PH30StOQWWeBskBsWE55vMfY9I=
-go.mau.fi/whatsmeow v0.0.0-20230406104207-886f40e6f4f2 h1:A5KW5iiMn8e2JOntwbwLTbyaMHBEQYnibaKiOqvba1c=
-go.mau.fi/whatsmeow v0.0.0-20230406104207-886f40e6f4f2/go.mod h1:zoTtv1CupGEyTew7TOwnBmTbHB4pVad2OzjTf5CVwa0=
+go.mau.fi/whatsmeow v0.0.0-20230406111517-0120a5e3f989 h1:fa9OHOLT/+bhRSThxGLQ7Qeyb5ayghsJke/Naage/zM=
+go.mau.fi/whatsmeow v0.0.0-20230406111517-0120a5e3f989/go.mod h1:zoTtv1CupGEyTew7TOwnBmTbHB4pVad2OzjTf5CVwa0=
 go.mau.fi/zeroconfig v0.1.2 h1:DKOydWnhPMn65GbXZOafgkPm11BvFashZWLct0dGFto=
 go.mau.fi/zeroconfig v0.1.2 h1:DKOydWnhPMn65GbXZOafgkPm11BvFashZWLct0dGFto=
 go.mau.fi/zeroconfig v0.1.2/go.mod h1:NcSJkf180JT+1IId76PcMuLTNa1CzsFFZ0nBygIQM70=
 go.mau.fi/zeroconfig v0.1.2/go.mod h1:NcSJkf180JT+1IId76PcMuLTNa1CzsFFZ0nBygIQM70=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=

+ 12 - 1
messagetracking.go

@@ -55,6 +55,11 @@ var (
 	errPollMissingQuestion         = errors.New("poll message is missing question")
 	errPollMissingQuestion         = errors.New("poll message is missing question")
 	errPollDuplicateOption         = errors.New("poll options must be unique")
 	errPollDuplicateOption         = errors.New("poll options must be unique")
 
 
+	errEditUnknownTarget     = errors.New("unknown edit target message")
+	errEditUnknownTargetType = errors.New("unsupported edited message type")
+	errEditDifferentSender   = errors.New("can't edit message sent by another user")
+	errEditTooOld            = errors.New("message is too old to be edited")
+
 	errBroadcastReactionNotSupported = errors.New("reacting to status messages is not currently supported")
 	errBroadcastReactionNotSupported = errors.New("reacting to status messages is not currently supported")
 	errBroadcastSendDisabled         = errors.New("sending status messages is disabled")
 	errBroadcastSendDisabled         = errors.New("sending status messages is disabled")
 
 
@@ -78,7 +83,13 @@ func errorToStatusReason(err error) (reason event.MessageStatusReason, status ev
 		return event.MessageStatusUnsupported, event.MessageStatusFail, true, true, ""
 		return event.MessageStatusUnsupported, event.MessageStatusFail, true, true, ""
 	case errors.Is(err, errMNoticeDisabled):
 	case errors.Is(err, errMNoticeDisabled):
 		return event.MessageStatusUnsupported, event.MessageStatusFail, true, false, ""
 		return event.MessageStatusUnsupported, event.MessageStatusFail, true, false, ""
-	case errors.Is(err, errMediaUnsupportedType), errors.Is(err, errPollMissingQuestion), errors.Is(err, errPollDuplicateOption):
+	case errors.Is(err, errMediaUnsupportedType),
+		errors.Is(err, errPollMissingQuestion),
+		errors.Is(err, errPollDuplicateOption),
+		errors.Is(err, errEditDifferentSender),
+		errors.Is(err, errEditTooOld),
+		errors.Is(err, errEditUnknownTarget),
+		errors.Is(err, errEditUnknownTargetType):
 		return event.MessageStatusUnsupported, event.MessageStatusFail, true, true, err.Error()
 		return event.MessageStatusUnsupported, event.MessageStatusFail, true, true, err.Error()
 	case errors.Is(err, errTimeoutBeforeHandling):
 	case errors.Is(err, errTimeoutBeforeHandling):
 		return event.MessageStatusTooOld, event.MessageStatusRetriable, true, true, "the message was too old when it reached the bridge, so it was not handled"
 		return event.MessageStatusTooOld, event.MessageStatusRetriable, true, true, "the message was too old when it reached the bridge, so it was not handled"

+ 17 - 2
portal.go

@@ -3774,6 +3774,21 @@ type extraConvertMeta struct {
 	EditRootMsg *database.Message
 	EditRootMsg *database.Message
 }
 }
 
 
+func getEditError(rootMsg *database.Message, editer *User) error {
+	switch {
+	case rootMsg == nil:
+		return errEditUnknownTarget
+	case rootMsg.Type != database.MsgNormal || rootMsg.IsFakeJID():
+		return errEditUnknownTargetType
+	case rootMsg.Sender.User != editer.JID.User:
+		return errEditDifferentSender
+	case time.Since(rootMsg.Timestamp) > whatsmeow.EditWindow:
+		return errEditTooOld
+	default:
+		return nil
+	}
+}
+
 func (portal *Portal) convertMatrixMessage(ctx context.Context, sender *User, evt *event.Event) (*waProto.Message, *User, *extraConvertMeta, error) {
 func (portal *Portal) convertMatrixMessage(ctx context.Context, sender *User, evt *event.Event) (*waProto.Message, *User, *extraConvertMeta, error) {
 	if evt.Type == TypeMSC3381PollResponse || evt.Type == TypeMSC3381V2PollResponse {
 	if evt.Type == TypeMSC3381PollResponse || evt.Type == TypeMSC3381V2PollResponse {
 		return portal.convertMatrixPollVote(ctx, sender, evt)
 		return portal.convertMatrixPollVote(ctx, sender, evt)
@@ -3788,8 +3803,8 @@ func (portal *Portal) convertMatrixMessage(ctx context.Context, sender *User, ev
 	var editRootMsg *database.Message
 	var editRootMsg *database.Message
 	if editEventID := content.RelatesTo.GetReplaceID(); editEventID != "" && portal.bridge.Config.Bridge.SendWhatsAppEdits {
 	if editEventID := content.RelatesTo.GetReplaceID(); editEventID != "" && portal.bridge.Config.Bridge.SendWhatsAppEdits {
 		editRootMsg = portal.bridge.DB.Message.GetByMXID(editEventID)
 		editRootMsg = portal.bridge.DB.Message.GetByMXID(editEventID)
-		if editRootMsg == nil || editRootMsg.Type != database.MsgNormal || editRootMsg.IsFakeJID() || editRootMsg.Sender.User != sender.JID.User {
-			return nil, sender, extraMeta, fmt.Errorf("edit rejected") // TODO more specific error message
+		if editErr := getEditError(editRootMsg, sender); editErr != nil {
+			return nil, sender, extraMeta, editErr
 		}
 		}
 		extraMeta.EditRootMsg = editRootMsg
 		extraMeta.EditRootMsg = editRootMsg
 		if content.NewContent != nil {
 		if content.NewContent != nil {