types.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. package webapi
  2. import (
  3. "context"
  4. "github.com/google/uuid"
  5. "github.com/mk6i/open-oscar-server/config"
  6. "github.com/mk6i/open-oscar-server/state"
  7. "github.com/mk6i/open-oscar-server/wire"
  8. )
  9. type BuddyService interface {
  10. AddBuddies(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x03_0x04_BuddyAddBuddies) (*wire.SNACMessage, error)
  11. BroadcastBuddyDeparted(ctx context.Context, screenName state.IdentScreenName) error
  12. DelBuddies(ctx context.Context, instance *state.SessionInstance, inBody wire.SNAC_0x03_0x05_BuddyDelBuddies) error
  13. RightsQuery(ctx context.Context, inFrame wire.SNACFrame) wire.SNACMessage
  14. }
  15. type ChatService interface {
  16. ChannelMsgToHost(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x0E_0x05_ChatChannelMsgToHost) (*wire.SNACMessage, error)
  17. }
  18. type ChatNavService interface {
  19. CreateRoom(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x0E_0x02_ChatRoomInfoUpdate) (wire.SNACMessage, error)
  20. ExchangeInfo(ctx context.Context, inFrame wire.SNACFrame, inBody wire.SNAC_0x0D_0x03_ChatNavRequestExchangeInfo) (wire.SNACMessage, error)
  21. RequestChatRights(ctx context.Context, inFrame wire.SNACFrame) wire.SNACMessage
  22. RequestRoomInfo(ctx context.Context, inFrame wire.SNACFrame, inBody wire.SNAC_0x0D_0x04_ChatNavRequestRoomInfo) (wire.SNACMessage, error)
  23. }
  24. type ICBMService interface {
  25. ChannelMsgToHost(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x04_0x06_ICBMChannelMsgToHost) (*wire.SNACMessage, error)
  26. ClientEvent(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x04_0x14_ICBMClientEvent) error
  27. EvilRequest(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x04_0x08_ICBMEvilRequest) (wire.SNACMessage, error)
  28. ParameterQuery(ctx context.Context, inFrame wire.SNACFrame) wire.SNACMessage
  29. ClientErr(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x04_0x0B_ICBMClientErr) error
  30. }
  31. type OServiceService interface {
  32. ClientOnline(ctx context.Context, service uint16, inBody wire.SNAC_0x01_0x02_OServiceClientOnline, instance *state.SessionInstance) error
  33. IdleNotification(ctx context.Context, instance *state.SessionInstance, inBody wire.SNAC_0x01_0x11_OServiceIdleNotification) error
  34. ServiceRequest(ctx context.Context, service uint16, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x01_0x04_OServiceServiceRequest, listener config.Listener) (wire.SNACMessage, error)
  35. }
  36. type AuthService interface {
  37. BUCPChallenge(ctx context.Context, inBody wire.SNAC_0x17_0x06_BUCPChallengeRequest, newUUID func() uuid.UUID) (wire.SNACMessage, error)
  38. BUCPLogin(ctx context.Context, inBody wire.SNAC_0x17_0x02_BUCPLoginRequest, advertisedHost string) (wire.SNACMessage, error)
  39. CrackCookie(authCookie []byte) (state.ServerCookie, error)
  40. FLAPLogin(ctx context.Context, inFrame wire.FLAPSignonFrame, advertisedHost string) (wire.TLVRestBlock, error)
  41. RegisterBOSSession(ctx context.Context, authCookie state.ServerCookie, conf func(sess *state.Session)) (*state.SessionInstance, error)
  42. RegisterChatSession(ctx context.Context, authCookie state.ServerCookie, cfg func(sess *state.Session)) (*state.SessionInstance, error)
  43. RetrieveBOSSession(ctx context.Context, authCookie state.ServerCookie) (*state.SessionInstance, error)
  44. Signout(ctx context.Context, session *state.Session)
  45. SignoutChat(ctx context.Context, sess *state.Session)
  46. }
  47. type LocateService interface {
  48. SetDirInfo(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x02_0x09_LocateSetDirInfo) (wire.SNACMessage, error)
  49. SetInfo(ctx context.Context, instance *state.SessionInstance, inBody wire.SNAC_0x02_0x04_LocateSetInfo) error
  50. UserInfoQuery(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x02_0x05_LocateUserInfoQuery) (wire.SNACMessage, error)
  51. DirInfo(ctx context.Context, inFrame wire.SNACFrame, inBody wire.SNAC_0x02_0x0B_LocateGetDirInfo) (wire.SNACMessage, error)
  52. }
  53. type DirSearchService interface {
  54. InfoQuery(ctx context.Context, inFrame wire.SNACFrame, inBody wire.SNAC_0x0F_0x02_InfoQuery) (wire.SNACMessage, error)
  55. }
  56. type PermitDenyService interface {
  57. AddDenyListEntries(ctx context.Context, instance *state.SessionInstance, inBody wire.SNAC_0x09_0x07_PermitDenyAddDenyListEntries) error
  58. AddPermListEntries(ctx context.Context, instance *state.SessionInstance, inBody wire.SNAC_0x09_0x05_PermitDenyAddPermListEntries) error
  59. DelDenyListEntries(ctx context.Context, instance *state.SessionInstance, inBody wire.SNAC_0x09_0x08_PermitDenyDelDenyListEntries) error
  60. DelPermListEntries(ctx context.Context, instance *state.SessionInstance, inBody wire.SNAC_0x09_0x06_PermitDenyDelPermListEntries) error
  61. RightsQuery(ctx context.Context, inFrame wire.SNACFrame) wire.SNACMessage
  62. }
  63. // BuddyListRegistry is the interface for keeping track of users with active
  64. // buddy lists. Once registered, a user becomes visible to other users' buddy
  65. // lists and vice versa.
  66. type BuddyListRegistry interface {
  67. RegisterBuddyList(ctx context.Context, user state.IdentScreenName) error
  68. UnregisterBuddyList(ctx context.Context, user state.IdentScreenName) error
  69. }
  70. type TOCConfigStore interface {
  71. // SetTOCConfig sets the user's TOC config. The TOC config is the server-side
  72. // buddy list functionality for TOC. This configuration is not available to
  73. // OSCAR clients.
  74. SetTOCConfig(ctx context.Context, user state.IdentScreenName, config string) error
  75. User(ctx context.Context, screenName state.IdentScreenName) (*state.User, error)
  76. }
  77. // CookieBaker defines methods for issuing and verifying AIM authentication tokens ("cookies").
  78. // These tokens are used for authenticating client sessions with AIM services.
  79. type CookieBaker interface {
  80. // Crack verifies and decodes a previously issued authentication token.
  81. // Returns the original payload if the token is valid.
  82. Crack(data []byte) ([]byte, error)
  83. // Issue creates a new authentication token from the given payload.
  84. // The resulting token can later be verified using Crack.
  85. Issue(data []byte) ([]byte, error)
  86. }
  87. type AdminService interface {
  88. InfoChangeRequest(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x07_0x04_AdminInfoChangeRequest) (wire.SNACMessage, error)
  89. }
  90. // SessionRetriever provides methods to retrieve OSCAR sessions.
  91. type SessionRetriever interface {
  92. AllSessions() []*state.Session
  93. RetrieveSession(screenName state.IdentScreenName) *state.Session
  94. }
  95. // FeedbagRetriever provides methods to retrieve buddy list data.
  96. type FeedbagRetriever interface {
  97. RetrieveFeedbag(ctx context.Context, screenName state.IdentScreenName) ([]wire.FeedbagItem, error)
  98. RelationshipsByUser(ctx context.Context, screenName state.IdentScreenName) ([]state.IdentScreenName, error)
  99. }
  100. // FeedbagManager provides methods to manage buddy lists.
  101. type FeedbagManager interface {
  102. RetrieveFeedbag(ctx context.Context, screenName state.IdentScreenName) ([]wire.FeedbagItem, error)
  103. InsertItem(ctx context.Context, screenName state.IdentScreenName, item wire.FeedbagItem) error
  104. UpdateItem(ctx context.Context, screenName state.IdentScreenName, item wire.FeedbagItem) error
  105. DeleteItem(ctx context.Context, screenName state.IdentScreenName, item wire.FeedbagItem) error
  106. }
  107. type FeedbagService interface {
  108. DeleteItem(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x13_0x0A_FeedbagDeleteItem) (*wire.SNACMessage, error)
  109. Query(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame) (wire.SNACMessage, error)
  110. QueryIfModified(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x13_0x05_FeedbagQueryIfModified) (wire.SNACMessage, error)
  111. RespondAuthorizeToHost(ctx context.Context, instance state.IdentScreenName, inFrame wire.SNACFrame, inBody wire.SNAC_0x13_0x1A_FeedbagRespondAuthorizeToHost) error
  112. RightsQuery(ctx context.Context, inFrame wire.SNACFrame) wire.SNACMessage
  113. StartCluster(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x13_0x11_FeedbagStartCluster)
  114. EndCluster(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame) error
  115. UpsertItem(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, items []wire.FeedbagItem) (*wire.SNACMessage, error)
  116. Use(ctx context.Context, instance *state.SessionInstance) error
  117. }
  118. // Phase 2: Additional interfaces for messaging and presence
  119. // MessageRelayer relays messages between users
  120. type MessageRelayer interface {
  121. RelayToScreenName(ctx context.Context, recipient state.IdentScreenName, msg wire.SNACMessage)
  122. }
  123. // OfflineMessageManager manages offline message storage and retrieval
  124. type OfflineMessageManager interface {
  125. SaveMessage(ctx context.Context, msg state.OfflineMessage) (int, error)
  126. RetrieveMessages(ctx context.Context, recipient state.IdentScreenName) ([]state.OfflineMessage, error)
  127. DeleteMessages(ctx context.Context, recipient state.IdentScreenName) error
  128. }
  129. // BuddyBroadcaster broadcasts buddy presence updates
  130. type BuddyBroadcaster interface {
  131. BroadcastBuddyArrived(ctx context.Context, screenName state.IdentScreenName, userInfo wire.TLVUserInfo) error
  132. BroadcastBuddyDeparted(ctx context.Context, screenName state.IdentScreenName) error
  133. }
  134. // ProfileManager manages user profiles
  135. type ProfileManager interface {
  136. SetProfile(ctx context.Context, screenName state.IdentScreenName, profile state.UserProfile) error
  137. Profile(ctx context.Context, screenName state.IdentScreenName) (state.UserProfile, error)
  138. }
  139. // Phase 3: Preference interfaces
  140. // PreferenceManager provides methods to manage user preferences.
  141. type PreferenceManager interface {
  142. SetPreferences(ctx context.Context, screenName state.IdentScreenName, prefs map[string]interface{}) error
  143. GetPreferences(ctx context.Context, screenName state.IdentScreenName) (map[string]interface{}, error)
  144. }
  145. // PermitDenyManager provides methods to manage permit/deny lists.
  146. type PermitDenyManager interface {
  147. SetPDMode(ctx context.Context, screenName state.IdentScreenName, mode wire.FeedbagPDMode) error
  148. GetPDMode(ctx context.Context, screenName state.IdentScreenName) (wire.FeedbagPDMode, error)
  149. GetPermitList(ctx context.Context, screenName state.IdentScreenName) ([]state.IdentScreenName, error)
  150. GetDenyList(ctx context.Context, screenName state.IdentScreenName) ([]state.IdentScreenName, error)
  151. AddPermitBuddy(ctx context.Context, me state.IdentScreenName, them state.IdentScreenName) error
  152. RemovePermitBuddy(ctx context.Context, me state.IdentScreenName, them state.IdentScreenName) error
  153. AddDenyBuddy(ctx context.Context, me state.IdentScreenName, them state.IdentScreenName) error
  154. RemoveDenyBuddy(ctx context.Context, me state.IdentScreenName, them state.IdentScreenName) error
  155. }
  156. // Phase 4: OSCAR Bridge interfaces
  157. // OSCARBridgeStore manages the persistence of OSCAR bridge sessions.
  158. type OSCARBridgeStore interface {
  159. SaveBridgeSession(ctx context.Context, webSessionID string, oscarCookie []byte, bosHost string, bosPort int) error
  160. SaveBridgeSessionWithDetails(ctx context.Context, session *state.OSCARBridgeSession) error
  161. GetBridgeSession(ctx context.Context, webSessionID string) (*state.OSCARBridgeSession, error)
  162. DeleteBridgeSession(ctx context.Context, webSessionID string) error
  163. }
  164. // OSCARConfig provides configuration for OSCAR services.
  165. type OSCARConfig interface {
  166. GetBOSAddress() (host string, port int)
  167. GetSSLBOSAddress() (host string, port int)
  168. IsSSLAvailable() bool
  169. IsAuthDisabled() bool
  170. }
  171. type ChatSessionManager interface {
  172. RemoveUserFromAllChats(user state.IdentScreenName)
  173. }