permit_deny.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package handler
  2. import (
  3. "context"
  4. "io"
  5. "log/slog"
  6. "github.com/mk6i/retro-aim-server/server/oscar"
  7. "github.com/mk6i/retro-aim-server/server/oscar/middleware"
  8. "github.com/mk6i/retro-aim-server/state"
  9. "github.com/mk6i/retro-aim-server/wire"
  10. )
  11. type PermitDenyService interface {
  12. AddDenyListEntries(ctx context.Context, sess *state.Session, body wire.SNAC_0x09_0x07_PermitDenyAddDenyListEntries) error
  13. AddPermListEntries(ctx context.Context, sess *state.Session, body wire.SNAC_0x09_0x05_PermitDenyAddPermListEntries) error
  14. DelDenyListEntries(ctx context.Context, sess *state.Session, body wire.SNAC_0x09_0x08_PermitDenyDelDenyListEntries) error
  15. DelPermListEntries(ctx context.Context, sess *state.Session, body wire.SNAC_0x09_0x06_PermitDenyDelPermListEntries) error
  16. RightsQuery(_ context.Context, frame wire.SNACFrame) wire.SNACMessage
  17. }
  18. func NewPermitDenyHandler(logger *slog.Logger, permitDenyService PermitDenyService) PermitDenyHandler {
  19. return PermitDenyHandler{
  20. RouteLogger: middleware.RouteLogger{
  21. Logger: logger,
  22. },
  23. PermitDenyService: permitDenyService,
  24. }
  25. }
  26. type PermitDenyHandler struct {
  27. PermitDenyService
  28. middleware.RouteLogger
  29. }
  30. func (rt PermitDenyHandler) RightsQuery(ctx context.Context, _ *state.Session, inFrame wire.SNACFrame, _ io.Reader, rw oscar.ResponseWriter) error {
  31. outSNAC := rt.PermitDenyService.RightsQuery(ctx, inFrame)
  32. rt.LogRequestAndResponse(ctx, inFrame, nil, outSNAC.Frame, outSNAC.Body)
  33. return rw.SendSNAC(outSNAC.Frame, outSNAC.Body)
  34. }
  35. func (rt PermitDenyHandler) AddDenyListEntries(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  36. inBody := wire.SNAC_0x09_0x07_PermitDenyAddDenyListEntries{}
  37. if err := wire.UnmarshalBE(&inBody, r); err != nil {
  38. return err
  39. }
  40. rt.LogRequest(ctx, inFrame, inBody)
  41. return rt.PermitDenyService.AddDenyListEntries(ctx, sess, inBody)
  42. }
  43. func (rt PermitDenyHandler) DelDenyListEntries(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  44. inBody := wire.SNAC_0x09_0x08_PermitDenyDelDenyListEntries{}
  45. if err := wire.UnmarshalBE(&inBody, r); err != nil {
  46. return err
  47. }
  48. rt.LogRequest(ctx, inFrame, inBody)
  49. return rt.PermitDenyService.DelDenyListEntries(ctx, sess, inBody)
  50. }
  51. func (rt PermitDenyHandler) AddPermListEntries(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  52. inBody := wire.SNAC_0x09_0x05_PermitDenyAddPermListEntries{}
  53. if err := wire.UnmarshalBE(&inBody, r); err != nil {
  54. return err
  55. }
  56. rt.LogRequest(ctx, inFrame, inBody)
  57. return rt.PermitDenyService.AddPermListEntries(ctx, sess, inBody)
  58. }
  59. func (rt PermitDenyHandler) DelPermListEntries(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  60. inBody := wire.SNAC_0x09_0x06_PermitDenyDelPermListEntries{}
  61. if err := wire.UnmarshalBE(&inBody, r); err != nil {
  62. return err
  63. }
  64. rt.LogRequest(ctx, inFrame, inBody)
  65. return rt.PermitDenyService.DelPermListEntries(ctx, sess, inBody)
  66. }
  67. // SetGroupPermitMask sets the classes of users I can interact with. We don't
  68. // apply any of these settings to the privacy mechanism, so just log them for
  69. // now.
  70. func (rt PermitDenyHandler) SetGroupPermitMask(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, rw oscar.ResponseWriter) error {
  71. inBody := wire.SNAC_0x09_0x04_PermitDenySetGroupPermitMask{}
  72. if err := wire.UnmarshalBE(&inBody, r); err != nil {
  73. return err
  74. }
  75. var flags []string
  76. if inBody.IsFlagSet(wire.OServiceUserFlagUnconfirmed) {
  77. flags = append(flags, "wire.OServiceUserFlagUnconfirmed")
  78. }
  79. if inBody.IsFlagSet(wire.OServiceUserFlagAdministrator) {
  80. flags = append(flags, "wire.OServiceUserFlagAdministrator")
  81. }
  82. if inBody.IsFlagSet(wire.OServiceUserFlagAOL) {
  83. flags = append(flags, "wire.OServiceUserFlagAOL")
  84. }
  85. if inBody.IsFlagSet(wire.OServiceUserFlagOSCARPay) {
  86. flags = append(flags, "wire.OServiceUserFlagOSCARPay")
  87. }
  88. if inBody.IsFlagSet(wire.OServiceUserFlagOSCARFree) {
  89. flags = append(flags, "wire.OServiceUserFlagOSCARFree")
  90. }
  91. if inBody.IsFlagSet(wire.OServiceUserFlagUnavailable) {
  92. flags = append(flags, "wire.OServiceUserFlagUnavailable")
  93. }
  94. if inBody.IsFlagSet(wire.OServiceUserFlagICQ) {
  95. flags = append(flags, "wire.OServiceUserFlagICQ")
  96. }
  97. if inBody.IsFlagSet(wire.OServiceUserFlagWireless) {
  98. flags = append(flags, "wire.OServiceUserFlagWireless")
  99. }
  100. if inBody.IsFlagSet(wire.OServiceUserFlagInternal) {
  101. flags = append(flags, "wire.OServiceUserFlagInternal")
  102. }
  103. if inBody.IsFlagSet(wire.OServiceUserFlagFish) {
  104. flags = append(flags, "wire.OServiceUserFlagFish")
  105. }
  106. if inBody.IsFlagSet(wire.OServiceUserFlagBot) {
  107. flags = append(flags, "wire.OServiceUserFlagBot")
  108. }
  109. if inBody.IsFlagSet(wire.OServiceUserFlagBeast) {
  110. flags = append(flags, "wire.OServiceUserFlagBeast")
  111. }
  112. if inBody.IsFlagSet(wire.OServiceUserFlagOneWayWireless) {
  113. flags = append(flags, "wire.OServiceUserFlagOneWayWireless")
  114. }
  115. if inBody.IsFlagSet(wire.OServiceUserFlagOfficial) {
  116. flags = append(flags, "wire.OServiceUserFlagOfficial")
  117. }
  118. rt.Logger.Info("set pd group mask", "flags", flags)
  119. rt.LogRequest(ctx, inFrame, inBody)
  120. return nil
  121. }