feat: block WhatsApp group messages with GroupTrigger support
Add GroupTrigger field to WhatsAppConfig (was missing — other channels like Telegram already had it). When mention_only is true, group messages are silently dropped before reaching the LLM. Prevents magic links and subscriber data from leaking in group chats. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
84e42d6904
commit
35b96786f6
2 changed files with 13 additions and 2 deletions
|
|
@ -364,6 +364,12 @@ func (c *WhatsAppNativeChannel) handleIncoming(evt *events.Message) {
|
||||||
metadata["user_name"] = evt.Info.PushName
|
metadata["user_name"] = evt.Info.PushName
|
||||||
}
|
}
|
||||||
if evt.Info.Chat.Server == types.GroupServer {
|
if evt.Info.Chat.Server == types.GroupServer {
|
||||||
|
// Skip group messages when mention_only is enabled — prevents
|
||||||
|
// data leaks (magic links, subscriber info) in public groups.
|
||||||
|
if c.cfg.GroupTrigger.MentionOnly {
|
||||||
|
logger.DebugCF("whatsapp", "ignoring group message (mention_only)", map[string]any{"chat": chatID})
|
||||||
|
return
|
||||||
|
}
|
||||||
metadata["peer_kind"] = "group"
|
metadata["peer_kind"] = "group"
|
||||||
metadata["peer_id"] = chatID
|
metadata["peer_id"] = chatID
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -340,6 +340,7 @@ type WhatsAppConfig struct {
|
||||||
UseNative bool `json:"use_native" yaml:"-" env:"PICOCLAW_CHANNELS_WHATSAPP_USE_NATIVE"`
|
UseNative bool `json:"use_native" yaml:"-" env:"PICOCLAW_CHANNELS_WHATSAPP_USE_NATIVE"`
|
||||||
SessionStorePath string `json:"session_store_path" yaml:"-" env:"PICOCLAW_CHANNELS_WHATSAPP_SESSION_STORE_PATH"`
|
SessionStorePath string `json:"session_store_path" yaml:"-" env:"PICOCLAW_CHANNELS_WHATSAPP_SESSION_STORE_PATH"`
|
||||||
AllowFrom FlexibleStringSlice `json:"allow_from" yaml:"-" env:"PICOCLAW_CHANNELS_WHATSAPP_ALLOW_FROM"`
|
AllowFrom FlexibleStringSlice `json:"allow_from" yaml:"-" env:"PICOCLAW_CHANNELS_WHATSAPP_ALLOW_FROM"`
|
||||||
|
GroupTrigger GroupTriggerConfig `json:"group_trigger,omitempty" yaml:"-"`
|
||||||
ReasoningChannelID string `json:"reasoning_channel_id" yaml:"-" env:"PICOCLAW_CHANNELS_WHATSAPP_REASONING_CHANNEL_ID"`
|
ReasoningChannelID string `json:"reasoning_channel_id" yaml:"-" env:"PICOCLAW_CHANNELS_WHATSAPP_REASONING_CHANNEL_ID"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1027,7 +1028,9 @@ func LoadConfig(path string) (*Config, error) {
|
||||||
return nil, fmt.Errorf("failed to load existing security config: %w", secErr)
|
return nil, fmt.Errorf("failed to load existing security config: %w", secErr)
|
||||||
}
|
}
|
||||||
defer func(cfg *Config) {
|
defer func(cfg *Config) {
|
||||||
_ = SaveConfig(path, cfg)
|
if saveErr := SaveConfig(path, cfg); saveErr != nil {
|
||||||
|
logger.ErrorF("failed to save config after v0 migration", map[string]any{"error": saveErr})
|
||||||
|
}
|
||||||
}(cfg)
|
}(cfg)
|
||||||
case 1:
|
case 1:
|
||||||
// V1→V2 migration: infer Enabled and migrate channel config fields
|
// V1→V2 migration: infer Enabled and migrate channel config fields
|
||||||
|
|
@ -1061,7 +1064,9 @@ func LoadConfig(path string) (*Config, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
defer func(cfg *Config) {
|
defer func(cfg *Config) {
|
||||||
_ = SaveConfig(path, cfg)
|
if saveErr := SaveConfig(path, cfg); saveErr != nil {
|
||||||
|
logger.ErrorF("failed to save config after v1 migration", map[string]any{"error": saveErr})
|
||||||
|
}
|
||||||
}(cfg)
|
}(cfg)
|
||||||
logger.InfoF(
|
logger.InfoF(
|
||||||
"config migrate success",
|
"config migrate success",
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue