Skip to content

Commit f6cde3d

Browse files
committed
fix: error code 100 (exceed max member)
1 parent 2c1fd56 commit f6cde3d

3 files changed

Lines changed: 44 additions & 4 deletions

File tree

pkg/connector/send_message_test.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,14 @@ func TestLineGroupE2EEFetchFailureErrorAllowsNoUsableGroupKeyFallback(t *testing
123123
}
124124
}
125125

126+
func TestLineGroupE2EEFetchFailureErrorAllowsOversizedGroupFallback(t *testing.T) {
127+
registerErr := errors.New(`registerE2EEGroupKey failed: API error 400: {"code":10051,"message":"RESPONSE_ERROR","data":{"name":"TalkException","message":"TalkException","code":100,"reason":"exceed max member","parameterMap":{}}}`)
128+
err := lineGroupE2EEFetchFailureError(fmt.Errorf("auto-register group key: %w", registerErr))
129+
if err != nil {
130+
t.Fatalf("err = %v, want nil to allow plaintext fallback", err)
131+
}
132+
}
133+
126134
func TestLineGroupE2EEFetchFailureErrorWrapsMissingPrivateKeyStatus(t *testing.T) {
127135
err := lineGroupE2EEFetchFailureError(fmt.Errorf("failed to unwrap group key: %w", e2ee.ErrMissingOwnPrivateKey))
128136
var status bridgev2.MessageStatus

pkg/line/errors.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,14 @@ func IsNoUsableE2EEGroupKey(err error) bool {
129129
return true
130130
}
131131
// Detect TalkException codes in raw API error strings (HTTP 400 with code 10051).
132-
// Code 98 = member has LS off; Code 1 = auth failed.
132+
// Code 98 = member has LS off; Code 1 = auth failed;
133+
// Code 100 "exceed max member" = the group is too large for key registration.
133134
// NOTE: Code 5 "not found" is handled by IsGroupKeyNotFound (auto-register), NOT here.
134-
if strings.Contains(msg, "\"code\":10051") && strings.Contains(msg, "talkexception") {
135+
if hasResponseErrorCode(msg) && strings.Contains(msg, "talkexception") {
135136
if strings.Contains(msg, "\"code\":98,") || strings.Contains(msg, "\"code\":98}") ||
136-
strings.Contains(msg, "\"code\":1,") || strings.Contains(msg, "\"code\":1}") {
137+
strings.Contains(msg, "\"code\":1,") || strings.Contains(msg, "\"code\":1}") ||
138+
(hasJSONCode(msg, 100) && (strings.Contains(msg, `"reason":"exceed max member"`) ||
139+
strings.Contains(msg, `"reason": "exceed max member"`))) {
137140
return true
138141
}
139142
}
@@ -222,8 +225,10 @@ func isNoUsableE2EEGroupKeyTalkException(message string, data talkExceptionData)
222225
}
223226
// Error 5 "not found" = no group shared key exists
224227
// Error 98 "member settings off" = at least one member has LS disabled
228+
// Error 100 "exceed max member" = the group is too large for key registration
225229
return (data.Code == 5 && strings.EqualFold(data.Reason, "not found")) ||
226-
(data.Code == 98 && strings.Contains(strings.ToLower(data.Reason), "member settings off"))
230+
(data.Code == 98 && strings.Contains(strings.ToLower(data.Reason), "member settings off")) ||
231+
(data.Code == 100 && strings.EqualFold(strings.TrimSpace(data.Reason), "exceed max member"))
227232
}
228233

229234
func parseTalkExceptionData(raw json.RawMessage) talkExceptionData {

pkg/line/errors_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,3 +121,30 @@ func TestIsTalkExceptionNotFound(t *testing.T) {
121121
t.Fatal("nil should not be classified as not-found")
122122
}
123123
}
124+
125+
func TestIsNoUsableE2EEGroupKeyExceedMaxMember(t *testing.T) {
126+
err := errors.New(`API error 400: {"code":10051,"message":"RESPONSE_ERROR","data":{"name":"TalkException","message":"TalkException","code":100,"reason":"exceed max member","parameterMap":{}}}`)
127+
if !IsNoUsableE2EEGroupKey(err) {
128+
t.Fatal("expected exceed max member to disable group E2EE")
129+
}
130+
131+
otherCode100 := errors.New(`API error 400: {"code":10051,"message":"RESPONSE_ERROR","data":{"name":"TalkException","message":"TalkException","code":100,"reason":"different reason","parameterMap":{}}}`)
132+
if IsNoUsableE2EEGroupKey(otherCode100) {
133+
t.Fatal("unrelated TalkException code 100 must not disable group E2EE")
134+
}
135+
136+
phraseOutsideReason := errors.New(`API error 400: {"code":10051,"message":"exceed max member","data":{"name":"TalkException","code":100,"reason":"different reason"}}`)
137+
if IsNoUsableE2EEGroupKey(phraseOutsideReason) {
138+
t.Fatal("exceed max member outside the reason field must not disable group E2EE")
139+
}
140+
}
141+
142+
func TestNoUsableE2EEGroupKeyTalkExceptionExceedMaxMember(t *testing.T) {
143+
if !isNoUsableE2EEGroupKeyTalkException("RESPONSE_ERROR", talkExceptionData{
144+
Name: "TalkException",
145+
Code: 100,
146+
Reason: "exceed max member",
147+
}) {
148+
t.Fatal("expected structured exceed max member response to disable group E2EE")
149+
}
150+
}

0 commit comments

Comments
 (0)