4
0

types.go 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  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. type FeedbagService interface {
  96. DeleteItem(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x13_0x0A_FeedbagDeleteItem) (*wire.SNACMessage, error)
  97. Query(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame) (wire.SNACMessage, error)
  98. QueryIfModified(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x13_0x05_FeedbagQueryIfModified) (wire.SNACMessage, error)
  99. RespondAuthorizeToHost(ctx context.Context, instance state.IdentScreenName, inFrame wire.SNACFrame, inBody wire.SNAC_0x13_0x1A_FeedbagRespondAuthorizeToHost) error
  100. RightsQuery(ctx context.Context, inFrame wire.SNACFrame) wire.SNACMessage
  101. StartCluster(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x13_0x11_FeedbagStartCluster)
  102. EndCluster(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame) error
  103. UpsertItem(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, items []wire.FeedbagItem) (*wire.SNACMessage, error)
  104. Use(ctx context.Context, instance *state.SessionInstance) error
  105. }
  106. // Phase 2: Additional interfaces for messaging and presence
  107. // MessageRelayer relays messages between users
  108. type MessageRelayer interface {
  109. RelayToScreenName(ctx context.Context, recipient state.IdentScreenName, msg wire.SNACMessage)
  110. }
  111. // OfflineMessageManager manages offline message storage and retrieval
  112. type OfflineMessageManager interface {
  113. SaveMessage(ctx context.Context, msg state.OfflineMessage) (int, error)
  114. RetrieveMessages(ctx context.Context, recipient state.IdentScreenName) ([]state.OfflineMessage, error)
  115. DeleteMessages(ctx context.Context, recipient state.IdentScreenName) error
  116. }
  117. // BuddyBroadcaster broadcasts buddy presence updates
  118. type BuddyBroadcaster interface {
  119. BroadcastBuddyArrived(ctx context.Context, screenName state.IdentScreenName, userInfo wire.TLVUserInfo) error
  120. BroadcastBuddyDeparted(ctx context.Context, screenName state.IdentScreenName) error
  121. }
  122. // ProfileManager manages user profiles
  123. type ProfileManager interface {
  124. SetProfile(ctx context.Context, screenName state.IdentScreenName, profile state.UserProfile) error
  125. Profile(ctx context.Context, screenName state.IdentScreenName) (state.UserProfile, error)
  126. }
  127. // Phase 3: Preference interfaces
  128. // PreferenceManager provides methods to manage user preferences.
  129. type PreferenceManager interface {
  130. SetPreferences(ctx context.Context, screenName state.IdentScreenName, prefs map[string]interface{}) error
  131. GetPreferences(ctx context.Context, screenName state.IdentScreenName) (map[string]interface{}, error)
  132. }
  133. // Phase 4: OSCAR Bridge interfaces
  134. // OSCARBridgeStore manages the persistence of OSCAR bridge sessions.
  135. type OSCARBridgeStore interface {
  136. SaveBridgeSession(ctx context.Context, webSessionID string, oscarCookie []byte, bosHost string, bosPort int) error
  137. SaveBridgeSessionWithDetails(ctx context.Context, session *state.OSCARBridgeSession) error
  138. GetBridgeSession(ctx context.Context, webSessionID string) (*state.OSCARBridgeSession, error)
  139. DeleteBridgeSession(ctx context.Context, webSessionID string) error
  140. }
  141. // OSCARConfig provides configuration for OSCAR services.
  142. type OSCARConfig interface {
  143. GetBOSAddress() (host string, port int)
  144. GetSSLBOSAddress() (host string, port int)
  145. IsSSLAvailable() bool
  146. IsAuthDisabled() bool
  147. }
  148. type ChatSessionManager interface {
  149. RemoveUserFromAllChats(user state.IdentScreenName)
  150. }