onNewSession registers a CLIProxyAPI session as a C2 implant session.
(sess *sessions.Session)
| 13 | |
| 14 | // onNewSession registers a CLIProxyAPI session as a C2 implant session. |
| 15 | func (b *Bridge) onNewSession(sess *sessions.Session) { |
| 16 | if _, loaded := b.registered.LoadOrStore(sess.ID, true); loaded { |
| 17 | return |
| 18 | } |
| 19 | |
| 20 | info := parseUserAgentFull(sess.UserAgent) |
| 21 | if err := b.registerSessionRPC(sess, info); err != nil { |
| 22 | log.Errorf("[bridge] failed to register session %s: %v", sess.ID, err) |
| 23 | b.registered.Delete(sess.ID) |
| 24 | return |
| 25 | } |
| 26 | |
| 27 | // Pin session so the local session manager won't garbage collect it. |
| 28 | sessions.Global().PinSession(sess.ID) |
| 29 | |
| 30 | // Notify any goroutines waiting for this session (e.g. modules dispatched |
| 31 | // before the session was registered). |
| 32 | b.notifySessionReady(sess.ID) |
| 33 | |
| 34 | // Start observing this session's events. |
| 35 | go b.observeSession(sess.ID) |
| 36 | } |
| 37 | |
| 38 | func (b *Bridge) registerSessionRPC(sess *sessions.Session, info agentInfo) error { |
| 39 | // Use detected agent type as name if available (more accurate than UA parsing). |