github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/chat/msgchecker/boxed_checker.go (about) 1 package msgchecker 2 3 import ( 4 "fmt" 5 6 "github.com/keybase/client/go/protocol/chat1" 7 ) 8 9 type MessageBoxedLengthExceedingError struct { 10 DescriptibleItemName string 11 ActualLength int 12 MaxLength int 13 } 14 15 func (e MessageBoxedLengthExceedingError) Error() string { 16 return fmt.Sprintf("%s exceeds the maximum length (%v > %v)", e.DescriptibleItemName, e.ActualLength, e.MaxLength) 17 } 18 19 func boxedFieldLengthChecker(descriptibleItemName string, actualLength int, maxLength int) error { 20 if actualLength > maxLength { 21 return MessageBoxedLengthExceedingError{ 22 DescriptibleItemName: descriptibleItemName, 23 ActualLength: actualLength, 24 MaxLength: maxLength, 25 } 26 } 27 return nil 28 } 29 30 func checkMessageBoxedLength(msg chat1.MessageBoxed) error { 31 textMsgLength := getBoxedMaxTextLength(msg.ClientHeader.Conv.TopicType) 32 switch msg.GetMessageType() { 33 case chat1.MessageType_ATTACHMENT, 34 chat1.MessageType_DELETE, 35 chat1.MessageType_NONE, 36 chat1.MessageType_TLFNAME, 37 chat1.MessageType_ATTACHMENTUPLOADED, 38 chat1.MessageType_PIN: 39 return boxedFieldLengthChecker("sanity check", len(msg.BodyCiphertext.E), BoxedSanityLength) 40 case chat1.MessageType_TEXT, chat1.MessageType_FLIP, chat1.MessageType_UNFURL: 41 return boxedFieldLengthChecker("TEXT message", len(msg.BodyCiphertext.E), textMsgLength) 42 case chat1.MessageType_EDIT: 43 return boxedFieldLengthChecker("EDIT message", len(msg.BodyCiphertext.E), textMsgLength) 44 case chat1.MessageType_REACTION: 45 return boxedFieldLengthChecker("REACTION message", len(msg.BodyCiphertext.E), BoxedReactionMessageBodyMaxLength) 46 case chat1.MessageType_HEADLINE: 47 return boxedFieldLengthChecker("HEADLINE message", len(msg.BodyCiphertext.E), BoxedHeadlineMessageBodyMaxLength) 48 case chat1.MessageType_METADATA: 49 return boxedFieldLengthChecker("METADATA message", len(msg.BodyCiphertext.E), BoxedMetadataMessageBodyMaxLength) 50 case chat1.MessageType_JOIN: 51 return boxedFieldLengthChecker("JOIN message", len(msg.BodyCiphertext.E), BoxedJoinMessageBodyMaxLength) 52 case chat1.MessageType_LEAVE: 53 return boxedFieldLengthChecker("LEAVE message", len(msg.BodyCiphertext.E), BoxedLeaveMessageBodyMaxLength) 54 case chat1.MessageType_SYSTEM: 55 return boxedFieldLengthChecker("SYSTEM message", len(msg.BodyCiphertext.E), 56 BoxedSystemMessageBodyMaxLength) 57 case chat1.MessageType_DELETEHISTORY: 58 return boxedFieldLengthChecker("DELETEHISTORY message", len(msg.BodyCiphertext.E), 59 BoxedDeleteHistoryMessageBodyMaxLength) 60 case chat1.MessageType_SENDPAYMENT: 61 return boxedFieldLengthChecker("SENDPAYMENT message", len(msg.BodyCiphertext.E), 62 BoxedSendPaymentMessageBodyMaxLength) 63 case chat1.MessageType_REQUESTPAYMENT: 64 return boxedFieldLengthChecker("REQUESTPAYMENT message", len(msg.BodyCiphertext.E), 65 BoxedRequestPaymentMessageBodyMaxLength) 66 default: 67 return fmt.Errorf("unknown message type: %v", msg.GetMessageType()) 68 } 69 } 70 71 func CheckMessageBoxed(msg chat1.MessageBoxed) error { 72 return checkMessageBoxedLength(msg) 73 }