ScuttleBot
add audit support for user join and part events - Add support for auditing IRC JOIN and PART events - Record user.join and user.part events in audit log - Apply audit type filtering for consistency - Improve structured logging in write()
Commit
a146d2cfa49504749ff8850558405d0808b83e617273717934dc57bc780581a6
Parent
94d9bef464f37c9…
1 file changed
+46
-1
+46
-1
| --- internal/bots/auditbot/auditbot.go | ||
| +++ internal/bots/auditbot/auditbot.go | ||
| @@ -154,11 +154,50 @@ | ||
| 154 | 154 | Nick: nick, |
| 155 | 155 | MessageType: env.Type, |
| 156 | 156 | MessageID: env.ID, |
| 157 | 157 | }) |
| 158 | 158 | }) |
| 159 | + c.Handlers.AddBg(girc.JOIN, func(_ *girc.Client, e girc.Event) { | |
| 160 | + if len(e.Params) == 0 { | |
| 161 | + return | |
| 162 | + } | |
| 163 | + | |
| 164 | + | |
| 165 | + if !b.shouldAudit(EventUserJoin) { | |
| 166 | + return | |
| 167 | + } | |
| 168 | + | |
| 169 | + channel := e.Params[0] | |
| 170 | + nick := extractNick(e) | |
| 171 | + | |
| 172 | + b.write(Entry{ | |
| 173 | + Kind: KindIRC, | |
| 174 | + Channel: channel, | |
| 175 | + Nick: nick, | |
| 176 | + MessageType: EventUserJoin, | |
| 177 | + }) | |
| 178 | +}) | |
| 179 | + | |
| 180 | +c.Handlers.AddBg(girc.PART, func(_ *girc.Client, e girc.Event) { | |
| 181 | + if len(e.Params) == 0 { | |
| 182 | + return | |
| 183 | + } | |
| 184 | + if !b.shouldAudit(EventUserPart) { | |
| 185 | + return | |
| 186 | + channel := e.Params[0] | |
| 187 | + nick := "" | |
| 188 | + if e.Source != nil { | |
| 189 | + nick = e.Source.Name | |
| 190 | + } | |
| 159 | 191 | |
| 192 | + b.write(Entry{ | |
| 193 | + Kind: KindIRC, | |
| 194 | + Channel: channel, | |
| 195 | + Nick: nick, | |
| 196 | + MessageType: "user.part", | |
| 197 | + }) | |
| 198 | +}) | |
| 160 | 199 | b.client = c |
| 161 | 200 | |
| 162 | 201 | errCh := make(chan error, 1) |
| 163 | 202 | go func() { |
| 164 | 203 | if err := c.Connect(); err != nil && ctx.Err() == nil { |
| @@ -191,11 +230,17 @@ | ||
| 191 | 230 | } |
| 192 | 231 | |
| 193 | 232 | func (b *Bot) write(e Entry) { |
| 194 | 233 | e.At = time.Now() |
| 195 | 234 | if err := b.store.Append(e); err != nil { |
| 196 | - b.log.Error("auditbot: failed to write entry", "type", e.MessageType, "err", err) | |
| 235 | + b.log.Error("failed to write audit entry", | |
| 236 | + "type", e.MessageType, | |
| 237 | + "nick", e.Nick, | |
| 238 | + "channel", e.Channel, | |
| 239 | + "kind", e.Kind, | |
| 240 | + "err", err, | |
| 241 | +) | |
| 197 | 242 | } |
| 198 | 243 | } |
| 199 | 244 | |
| 200 | 245 | func (b *Bot) auditTypesList() []string { |
| 201 | 246 | if len(b.auditTypes) == 0 { |
| 202 | 247 |
| --- internal/bots/auditbot/auditbot.go | |
| +++ internal/bots/auditbot/auditbot.go | |
| @@ -154,11 +154,50 @@ | |
| 154 | Nick: nick, |
| 155 | MessageType: env.Type, |
| 156 | MessageID: env.ID, |
| 157 | }) |
| 158 | }) |
| 159 | |
| 160 | b.client = c |
| 161 | |
| 162 | errCh := make(chan error, 1) |
| 163 | go func() { |
| 164 | if err := c.Connect(); err != nil && ctx.Err() == nil { |
| @@ -191,11 +230,17 @@ | |
| 191 | } |
| 192 | |
| 193 | func (b *Bot) write(e Entry) { |
| 194 | e.At = time.Now() |
| 195 | if err := b.store.Append(e); err != nil { |
| 196 | b.log.Error("auditbot: failed to write entry", "type", e.MessageType, "err", err) |
| 197 | } |
| 198 | } |
| 199 | |
| 200 | func (b *Bot) auditTypesList() []string { |
| 201 | if len(b.auditTypes) == 0 { |
| 202 |
| --- internal/bots/auditbot/auditbot.go | |
| +++ internal/bots/auditbot/auditbot.go | |
| @@ -154,11 +154,50 @@ | |
| 154 | Nick: nick, |
| 155 | MessageType: env.Type, |
| 156 | MessageID: env.ID, |
| 157 | }) |
| 158 | }) |
| 159 | c.Handlers.AddBg(girc.JOIN, func(_ *girc.Client, e girc.Event) { |
| 160 | if len(e.Params) == 0 { |
| 161 | return |
| 162 | } |
| 163 | |
| 164 | |
| 165 | if !b.shouldAudit(EventUserJoin) { |
| 166 | return |
| 167 | } |
| 168 | |
| 169 | channel := e.Params[0] |
| 170 | nick := extractNick(e) |
| 171 | |
| 172 | b.write(Entry{ |
| 173 | Kind: KindIRC, |
| 174 | Channel: channel, |
| 175 | Nick: nick, |
| 176 | MessageType: EventUserJoin, |
| 177 | }) |
| 178 | }) |
| 179 | |
| 180 | c.Handlers.AddBg(girc.PART, func(_ *girc.Client, e girc.Event) { |
| 181 | if len(e.Params) == 0 { |
| 182 | return |
| 183 | } |
| 184 | if !b.shouldAudit(EventUserPart) { |
| 185 | return |
| 186 | channel := e.Params[0] |
| 187 | nick := "" |
| 188 | if e.Source != nil { |
| 189 | nick = e.Source.Name |
| 190 | } |
| 191 | |
| 192 | b.write(Entry{ |
| 193 | Kind: KindIRC, |
| 194 | Channel: channel, |
| 195 | Nick: nick, |
| 196 | MessageType: "user.part", |
| 197 | }) |
| 198 | }) |
| 199 | b.client = c |
| 200 | |
| 201 | errCh := make(chan error, 1) |
| 202 | go func() { |
| 203 | if err := c.Connect(); err != nil && ctx.Err() == nil { |
| @@ -191,11 +230,17 @@ | |
| 230 | } |
| 231 | |
| 232 | func (b *Bot) write(e Entry) { |
| 233 | e.At = time.Now() |
| 234 | if err := b.store.Append(e); err != nil { |
| 235 | b.log.Error("failed to write audit entry", |
| 236 | "type", e.MessageType, |
| 237 | "nick", e.Nick, |
| 238 | "channel", e.Channel, |
| 239 | "kind", e.Kind, |
| 240 | "err", err, |
| 241 | ) |
| 242 | } |
| 243 | } |
| 244 | |
| 245 | func (b *Bot) auditTypesList() []string { |
| 246 | if len(b.auditTypes) == 0 { |
| 247 |