types.go 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package toc
  2. import (
  3. "context"
  4. "net/http"
  5. "time"
  6. "github.com/google/uuid"
  7. "github.com/mk6i/open-oscar-server/config"
  8. "github.com/mk6i/open-oscar-server/state"
  9. "github.com/mk6i/open-oscar-server/wire"
  10. )
  11. type BuddyService interface {
  12. AddBuddies(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x03_0x04_BuddyAddBuddies) (*wire.SNACMessage, error)
  13. BroadcastBuddyArrived(ctx context.Context, screenName state.IdentScreenName, userInfo wire.TLVUserInfo) error
  14. BroadcastBuddyDeparted(ctx context.Context, screenName state.IdentScreenName) error
  15. DelBuddies(ctx context.Context, instance *state.SessionInstance, inBody wire.SNAC_0x03_0x05_BuddyDelBuddies) error
  16. RightsQuery(ctx context.Context, inFrame wire.SNACFrame) wire.SNACMessage
  17. }
  18. type ChatService interface {
  19. ChannelMsgToHost(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x0E_0x05_ChatChannelMsgToHost) (*wire.SNACMessage, error)
  20. }
  21. type ChatNavService interface {
  22. CreateRoom(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x0E_0x02_ChatRoomInfoUpdate) (wire.SNACMessage, error)
  23. ExchangeInfo(ctx context.Context, inFrame wire.SNACFrame, inBody wire.SNAC_0x0D_0x03_ChatNavRequestExchangeInfo) (wire.SNACMessage, error)
  24. RequestChatRights(ctx context.Context, inFrame wire.SNACFrame) wire.SNACMessage
  25. RequestRoomInfo(ctx context.Context, inFrame wire.SNACFrame, inBody wire.SNAC_0x0D_0x04_ChatNavRequestRoomInfo) (wire.SNACMessage, error)
  26. }
  27. type ICBMService interface {
  28. ChannelMsgToHost(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x04_0x06_ICBMChannelMsgToHost) (*wire.SNACMessage, error)
  29. ClientEvent(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x04_0x14_ICBMClientEvent) error
  30. EvilRequest(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x04_0x08_ICBMEvilRequest) (wire.SNACMessage, error)
  31. ParameterQuery(ctx context.Context, inFrame wire.SNACFrame) wire.SNACMessage
  32. ClientErr(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x04_0x0B_ICBMClientErr) error
  33. }
  34. type OServiceService interface {
  35. ClientOnline(ctx context.Context, service uint16, inBody wire.SNAC_0x01_0x02_OServiceClientOnline, instance *state.SessionInstance) error
  36. IdleNotification(ctx context.Context, instance *state.SessionInstance, inBody wire.SNAC_0x01_0x11_OServiceIdleNotification) error
  37. MonitorRateLimits(ctx context.Context, session *state.Session)
  38. ServiceRequest(ctx context.Context, service uint16, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x01_0x04_OServiceServiceRequest, listenerGroup config.ListenerGroup) (wire.SNACMessage, error)
  39. }
  40. type AuthService interface {
  41. BUCPChallenge(ctx context.Context, inBody wire.SNAC_0x17_0x06_BUCPChallengeRequest, newUUID func() uuid.UUID) (wire.SNACMessage, error)
  42. BUCPLogin(ctx context.Context, inBody wire.SNAC_0x17_0x02_BUCPLoginRequest, endpointCfg config.Endpoint) (wire.SNACMessage, error)
  43. CrackCookie(authCookie []byte) (state.ServerCookie, time.Time, error)
  44. FLAPLogin(ctx context.Context, inFrame wire.FLAPSignonFrame, endpointCfg config.Endpoint) (wire.TLVRestBlock, error)
  45. RegisterBOSSession(ctx context.Context, authCookie state.ServerCookie, cfg func(*state.Session)) (*state.SessionInstance, error)
  46. RegisterChatSession(ctx context.Context, authCookie state.ServerCookie, cfg func(sess *state.Session)) (*state.SessionInstance, error)
  47. RetrieveBOSSession(ctx context.Context, authCookie state.ServerCookie) (*state.SessionInstance, error)
  48. Signout(ctx context.Context, session *state.Session)
  49. SignoutChat(ctx context.Context, sess *state.Session)
  50. }
  51. type LocateService interface {
  52. SetDirInfo(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x02_0x09_LocateSetDirInfo) (wire.SNACMessage, error)
  53. SetInfo(ctx context.Context, instance *state.SessionInstance, inBody wire.SNAC_0x02_0x04_LocateSetInfo) error
  54. UserInfoQuery(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x02_0x05_LocateUserInfoQuery) (wire.SNACMessage, error)
  55. DirInfo(ctx context.Context, inFrame wire.SNACFrame, inBody wire.SNAC_0x02_0x0B_LocateGetDirInfo) (wire.SNACMessage, error)
  56. }
  57. type DirSearchService interface {
  58. InfoQuery(ctx context.Context, inFrame wire.SNACFrame, inBody wire.SNAC_0x0F_0x02_InfoQuery) (wire.SNACMessage, error)
  59. }
  60. type PermitDenyService interface {
  61. AddDenyListEntries(ctx context.Context, instance *state.SessionInstance, inBody wire.SNAC_0x09_0x07_PermitDenyAddDenyListEntries) error
  62. AddPermListEntries(ctx context.Context, instance *state.SessionInstance, inBody wire.SNAC_0x09_0x05_PermitDenyAddPermListEntries) error
  63. DelDenyListEntries(ctx context.Context, instance *state.SessionInstance, inBody wire.SNAC_0x09_0x08_PermitDenyDelDenyListEntries) error
  64. DelPermListEntries(ctx context.Context, instance *state.SessionInstance, inBody wire.SNAC_0x09_0x06_PermitDenyDelPermListEntries) error
  65. RightsQuery(ctx context.Context, inFrame wire.SNACFrame) wire.SNACMessage
  66. }
  67. // BuddyListRegistry is the interface for keeping track of users with active
  68. // buddy lists. Once registered, a user becomes visible to other users' buddy
  69. // lists and vice versa.
  70. type BuddyListRegistry interface {
  71. RegisterBuddyList(ctx context.Context, user state.IdentScreenName) error
  72. UnregisterBuddyList(ctx context.Context, user state.IdentScreenName) error
  73. }
  74. type TOCConfigStore interface {
  75. // SetTOCConfig sets the user's TOC config. The TOC config is the server-side
  76. // buddy list functionality for TOC. This configuration is not available to
  77. // OSCAR clients.
  78. SetTOCConfig(ctx context.Context, user state.IdentScreenName, config string) error
  79. User(ctx context.Context, screenName state.IdentScreenName) (*state.User, error)
  80. }
  81. type FeedbagManager interface {
  82. // Feedbag fetches the contents of a user's feedbag for CONFIG2
  83. Feedbag(ctx context.Context, screenName state.IdentScreenName) ([]wire.FeedbagItem, error)
  84. UseFeedbag(ctx context.Context, screenName state.IdentScreenName) error
  85. }
  86. // FeedbagService defines the interface for managing server-side buddy lists
  87. // (feedbag) and related operations.
  88. type FeedbagService interface {
  89. DeleteItem(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x13_0x0A_FeedbagDeleteItem) (*wire.SNACMessage, error)
  90. Query(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame) (wire.SNACMessage, error)
  91. QueryIfModified(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x13_0x05_FeedbagQueryIfModified) (wire.SNACMessage, error)
  92. RespondAuthorizeToHost(ctx context.Context, instance state.IdentScreenName, inFrame wire.SNACFrame, inBody wire.SNAC_0x13_0x1A_FeedbagRespondAuthorizeToHost) error
  93. RightsQuery(ctx context.Context, inFrame wire.SNACFrame) wire.SNACMessage
  94. StartCluster(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x13_0x11_FeedbagStartCluster)
  95. EndCluster(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame) error
  96. UpsertItem(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, items []wire.FeedbagItem) (*wire.SNACMessage, error)
  97. Use(ctx context.Context, instance *state.SessionInstance) error
  98. }
  99. // CookieBaker defines methods for issuing and verifying AIM authentication tokens ("cookies").
  100. // These tokens are used for authenticating client sessions with AIM services.
  101. type CookieBaker interface {
  102. // Crack verifies and decodes a previously issued authentication token.
  103. // Returns the original payload and the token's expiry if it is valid.
  104. Crack(data []byte) ([]byte, time.Time, error)
  105. // Issue creates a new authentication token from the given payload that
  106. // stays valid for ttl. The resulting token can later be verified using
  107. // Crack.
  108. Issue(data []byte, ttl time.Duration) ([]byte, error)
  109. }
  110. type AdminService interface {
  111. InfoChangeRequest(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x07_0x04_AdminInfoChangeRequest) (wire.SNACMessage, error)
  112. }
  113. // SessionRetriever defines a method for retrieving an active session
  114. // associated with a given screen name.
  115. type SessionRetriever interface {
  116. // RetrieveSession returns the session associated with the given screen name,
  117. // or nil if no active session exists. Returns the Session object if there
  118. // are active instances with complete signon.
  119. RetrieveSession(screenName state.IdentScreenName) *state.Session
  120. }
  121. type OSCARProxyer interface {
  122. Signon(ctx context.Context, args []byte, isTOC1 bool) (*state.Session, []string)
  123. RecvBOS(ctx context.Context, sessBOS *state.Session, chatRegistry *ChatRegistry, msgCh chan<- []string) error
  124. RecvClientCmd(ctx context.Context, sessBOS *state.Session, chatRegistry *ChatRegistry, payload []byte, toCh chan<- []string, doAsync func(f func() error)) []string
  125. NewServeMux() http.Handler
  126. }
  127. // ChatSessionManager is the interface for closing chat sessions
  128. // when a client disconnects.
  129. type ChatSessionManager interface {
  130. RemoveUserFromAllChats(user state.IdentScreenName)
  131. }