types.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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 ICBMService interface {
  10. ChannelMsgToHost(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x04_0x06_ICBMChannelMsgToHost) (*wire.SNACMessage, error)
  11. ClientEvent(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x04_0x14_ICBMClientEvent) error
  12. EvilRequest(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x04_0x08_ICBMEvilRequest) (wire.SNACMessage, error)
  13. ParameterQuery(ctx context.Context, inFrame wire.SNACFrame) wire.SNACMessage
  14. ClientErr(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x04_0x0B_ICBMClientErr) error
  15. }
  16. type OServiceService interface {
  17. ClientOnline(ctx context.Context, service uint16, inBody wire.SNAC_0x01_0x02_OServiceClientOnline, instance *state.SessionInstance) error
  18. IdleNotification(ctx context.Context, instance *state.SessionInstance, inBody wire.SNAC_0x01_0x11_OServiceIdleNotification) error
  19. ServiceRequest(ctx context.Context, service uint16, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x01_0x04_OServiceServiceRequest, listener config.Listener) (wire.SNACMessage, error)
  20. }
  21. // ChatService relays messages to chat room participants. Backed by
  22. // foodgroup.ChatService, the same instance BOS and TOC use, so web users share
  23. // rooms with native clients.
  24. type ChatService interface {
  25. ChannelMsgToHost(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x0E_0x05_ChatChannelMsgToHost) (*wire.SNACMessage, error)
  26. }
  27. // ChatNavService creates chat rooms and serves chat room metadata. Backed by
  28. // foodgroup.ChatNavService.
  29. type ChatNavService interface {
  30. CreateRoom(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x0E_0x02_ChatRoomInfoUpdate) (wire.SNACMessage, error)
  31. RequestRoomInfo(ctx context.Context, inFrame wire.SNACFrame, inBody wire.SNAC_0x0D_0x04_ChatNavRequestRoomInfo) (wire.SNACMessage, error)
  32. }
  33. type AuthService interface {
  34. BUCPChallenge(ctx context.Context, inBody wire.SNAC_0x17_0x06_BUCPChallengeRequest, newUUID func() uuid.UUID) (wire.SNACMessage, error)
  35. BUCPLogin(ctx context.Context, inBody wire.SNAC_0x17_0x02_BUCPLoginRequest, advertisedHost string) (wire.SNACMessage, error)
  36. CrackCookie(authCookie []byte) (state.ServerCookie, error)
  37. FLAPLogin(ctx context.Context, inFrame wire.FLAPSignonFrame, advertisedHost string) (wire.TLVRestBlock, error)
  38. RegisterBOSSession(ctx context.Context, authCookie state.ServerCookie, conf func(sess *state.Session)) (*state.SessionInstance, error)
  39. RegisterChatSession(ctx context.Context, authCookie state.ServerCookie, cfg func(sess *state.Session)) (*state.SessionInstance, error)
  40. RetrieveBOSSession(ctx context.Context, authCookie state.ServerCookie) (*state.SessionInstance, error)
  41. Signout(ctx context.Context, session *state.Session)
  42. SignoutChat(ctx context.Context, sess *state.Session)
  43. }
  44. type LocateService interface {
  45. SetDirInfo(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x02_0x09_LocateSetDirInfo) (wire.SNACMessage, error)
  46. SetInfo(ctx context.Context, instance *state.SessionInstance, inBody wire.SNAC_0x02_0x04_LocateSetInfo) error
  47. UserInfoQuery(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x02_0x05_LocateUserInfoQuery) (wire.SNACMessage, error)
  48. DirInfo(ctx context.Context, inFrame wire.SNACFrame, inBody wire.SNAC_0x02_0x0B_LocateGetDirInfo) (wire.SNACMessage, error)
  49. }
  50. // DirSearchService issues OSCAR ODir directory searches on behalf of the Web
  51. // AIM member-directory endpoints.
  52. type DirSearchService interface {
  53. InfoQuery(ctx context.Context, inFrame wire.SNACFrame, inBody wire.SNAC_0x0F_0x02_InfoQuery) (wire.SNACMessage, error)
  54. }
  55. // BuddyListRegistry is the interface for keeping track of users with active
  56. // buddy lists. Once registered, a user becomes visible to other users' buddy
  57. // lists and vice versa.
  58. type BuddyListRegistry interface {
  59. RegisterBuddyList(ctx context.Context, user state.IdentScreenName) error
  60. UnregisterBuddyList(ctx context.Context, user state.IdentScreenName) error
  61. }
  62. // CookieBaker defines methods for issuing and verifying AIM authentication tokens ("cookies").
  63. // These tokens are used for authenticating client sessions with AIM services.
  64. type CookieBaker interface {
  65. // Crack verifies and decodes a previously issued authentication token.
  66. // Returns the original payload if the token is valid.
  67. Crack(data []byte) ([]byte, error)
  68. // Issue creates a new authentication token from the given payload.
  69. // The resulting token can later be verified using Crack.
  70. Issue(data []byte) ([]byte, error)
  71. }
  72. // SessionRetriever provides methods to retrieve OSCAR sessions.
  73. type SessionRetriever interface {
  74. AllSessions() []*state.Session
  75. RetrieveSession(screenName state.IdentScreenName) *state.Session
  76. }
  77. type FeedbagService interface {
  78. DeleteItem(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x13_0x0A_FeedbagDeleteItem) (*wire.SNACMessage, error)
  79. Query(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame) (wire.SNACMessage, error)
  80. QueryIfModified(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x13_0x05_FeedbagQueryIfModified) (wire.SNACMessage, error)
  81. RespondAuthorizeToHost(ctx context.Context, instance state.IdentScreenName, inFrame wire.SNACFrame, inBody wire.SNAC_0x13_0x1A_FeedbagRespondAuthorizeToHost) error
  82. RightsQuery(ctx context.Context, inFrame wire.SNACFrame) wire.SNACMessage
  83. StartCluster(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, inBody wire.SNAC_0x13_0x11_FeedbagStartCluster)
  84. EndCluster(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame) error
  85. UpsertItem(ctx context.Context, instance *state.SessionInstance, inFrame wire.SNACFrame, items []wire.FeedbagItem) (*wire.SNACMessage, error)
  86. Use(ctx context.Context, instance *state.SessionInstance) error
  87. }
  88. // BuddyBroadcaster broadcasts buddy presence updates
  89. type BuddyBroadcaster interface {
  90. BroadcastBuddyArrived(ctx context.Context, screenName state.IdentScreenName, userInfo wire.TLVUserInfo) error
  91. BroadcastBuddyDeparted(ctx context.Context, screenName state.IdentScreenName) error
  92. }
  93. // OSCARConfig provides configuration for OSCAR services.
  94. type OSCARConfig interface {
  95. GetBOSAddress() (host string, port int)
  96. GetSSLBOSAddress() (host string, port int)
  97. IsSSLAvailable() bool
  98. IsAuthDisabled() bool
  99. }
  100. type ChatSessionManager interface {
  101. RemoveUserFromAllChats(user state.IdentScreenName)
  102. // AllSessions returns the participants of the chat room identified by
  103. // chatCookie, used to serve imserv/getMembers.
  104. AllSessions(chatCookie string) []*state.Session
  105. }