| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- package mtglib
-
- import (
- "net"
- "time"
- )
-
- type eventBase struct {
- streamID string
- timestamp time.Time
- }
-
- // StreamID returns a ID of the stream this event belongs to.
- func (e eventBase) StreamID() string {
- return e.streamID
- }
-
- // Timestamp return a time when this event was generated.
- func (e eventBase) Timestamp() time.Time {
- return e.timestamp
- }
-
- // EventStart is emitted when mtg proxy starts to process a new
- // connection.
- type EventStart struct {
- eventBase
-
- // RemoteIP is an IP address of the client.
- RemoteIP net.IP
- }
-
- // EventConnectedToDC is emitted when mtg proxy has connected to a
- // Telegram server.
- type EventConnectedToDC struct {
- eventBase
-
- // RemoteIP is an IP address of the Telegram server proxy has been
- // connected to.
- RemoteIP net.IP
-
- // DC is an index of the datacenter proxy has been connected to.
- DC int
- }
-
- // EventTraffic is emitted when we read/write some bytes on a connection.
- type EventTraffic struct {
- eventBase
-
- // Traffic is a count of bytes which were transmitted.
- Traffic uint
-
- // IsRead defines if we _read_ or _write_ to connection. A rule of
- // thumb is simple: EventTraffic is bound to a remote connection. Not
- // to a client one, but either to Telegram or front domain one.
- //
- // In the case of Telegram, isRead means that we've fetched some bytes
- // from Telegram to send it to a client.
- //
- // In the case of the front domain, it means that we've fetched some
- // bytes from this domain to send it to a client.
- IsRead bool
- }
-
- // EventFinish is emitted when we stop to manage a connection.
- type EventFinish struct {
- eventBase
- }
-
- // EventDomainFronting is emitted when we connect to a front domain
- // instead of Telegram server.
- type EventDomainFronting struct {
- eventBase
- }
-
- // EventConcurrencyLimited is emitted when connection was declined
- // because of the concurrency limit of the worker pool.
- type EventConcurrencyLimited struct {
- eventBase
- }
-
- // EventIPBlocklisted is emitted when connection was declined because
- // IP address was found in IP blocklist.
- type EventIPBlocklisted struct {
- eventBase
-
- RemoteIP net.IP
- IsBlockList bool
- }
-
- // EventReplayAttack is emitted when mtg detects a replay attack on a
- // connection.
- type EventReplayAttack struct {
- eventBase
- }
-
- // EventIPListSize is emitted when mtg updates a contents of the ip lists:
- // allowlist or blocklist.
- type EventIPListSize struct {
- eventBase
-
- Size int
- IsBlockList bool
- }
-
- // NewEventStart creates a new EventStart event.
- func NewEventStart(streamID string, remoteIP net.IP) EventStart {
- return EventStart{
- eventBase: eventBase{
- timestamp: time.Now(),
- streamID: streamID,
- },
- RemoteIP: remoteIP,
- }
- }
-
- // NewEventConnectedToDC creates a new EventConnectedToDC event.
- func NewEventConnectedToDC(streamID string, remoteIP net.IP, dc int) EventConnectedToDC {
- return EventConnectedToDC{
- eventBase: eventBase{
- timestamp: time.Now(),
- streamID: streamID,
- },
- RemoteIP: remoteIP,
- DC: dc,
- }
- }
-
- // NewEventTraffic creates a new EventTraffic event.
- func NewEventTraffic(streamID string, traffic uint, isRead bool) EventTraffic {
- return EventTraffic{
- eventBase: eventBase{
- timestamp: time.Now(),
- streamID: streamID,
- },
- Traffic: traffic,
- IsRead: isRead,
- }
- }
-
- // NewEventFinish creates a new EventFinish event.
- func NewEventFinish(streamID string) EventFinish {
- return EventFinish{
- eventBase: eventBase{
- timestamp: time.Now(),
- streamID: streamID,
- },
- }
- }
-
- // NewEventDomainFronting creates a new EventDomainFronting event.
- func NewEventDomainFronting(streamID string) EventDomainFronting {
- return EventDomainFronting{
- eventBase: eventBase{
- timestamp: time.Now(),
- streamID: streamID,
- },
- }
- }
-
- // NewEventConcurrencyLimited creates a new EventConcurrencyLimited
- // event.
- func NewEventConcurrencyLimited() EventConcurrencyLimited {
- return EventConcurrencyLimited{
- eventBase: eventBase{
- timestamp: time.Now(),
- },
- }
- }
-
- // NewEventIPBlocklisted creates a new EventIPBlocklisted event.
- func NewEventIPBlocklisted(remoteIP net.IP) EventIPBlocklisted {
- return EventIPBlocklisted{
- eventBase: eventBase{
- timestamp: time.Now(),
- },
- RemoteIP: remoteIP,
- IsBlockList: true,
- }
- }
-
- // NewEventIPAllowlisted creates a NewEventIPBlocklisted event with a mark that
- // it is supposed to be for allow list.
- func NewEventIPAllowlisted(remoteIP net.IP) EventIPBlocklisted {
- return EventIPBlocklisted{
- eventBase: eventBase{
- timestamp: time.Now(),
- },
- RemoteIP: remoteIP,
- IsBlockList: false,
- }
- }
-
- // NewEventReplayAttack creates a new EventReplayAttack event.
- func NewEventReplayAttack(streamID string) EventReplayAttack {
- return EventReplayAttack{
- eventBase: eventBase{
- timestamp: time.Now(),
- streamID: streamID,
- },
- }
- }
-
- // NewEventIPListSize creates a new EventIPListSize event.
- func NewEventIPListSize(size int, isBlockList bool) EventIPListSize {
- return EventIPListSize{
- eventBase: eventBase{
- timestamp: time.Now(),
- },
- Size: size,
- IsBlockList: isBlockList,
- }
- }
|