Skip to content

Commit

Permalink
implement SNAC 01,1E SetUserInfoFields
Browse files Browse the repository at this point in the history
This commit fixes the INVALID SNAC error that appears upon successful
login on 2.0.1 & 4.0.9 for macOS.
  • Loading branch information
mk6i committed May 18, 2024
1 parent 34e7946 commit 2aca469
Show file tree
Hide file tree
Showing 12 changed files with 324 additions and 0 deletions.
16 changes: 16 additions & 0 deletions foodgroup/oservice.go
Original file line number Diff line number Diff line change
Expand Up @@ -465,6 +465,22 @@ func (s OServiceService) IdleNotification(ctx context.Context, sess *state.Sessi
return broadcastArrival(ctx, sess, s.messageRelayer, s.feedbagManager, s.legacyBuddyListManager)
}

// SetPrivacyFlags sets client privacy settings. Currently, there's no action
// to take when these flags are set. This method simply logs the flags set by
// the client.
func (s OServiceService) SetPrivacyFlags(ctx context.Context, bodyIn wire.SNAC_0x01_0x14_OServiceSetPrivacyFlags) {
attrs := slog.Group("request",
slog.String("food_group", wire.FoodGroupName(wire.OService)),
slog.String("sub_group", wire.SubGroupName(wire.OService, wire.OServiceSetPrivacyFlags)))

if bodyIn.MemberFlag() {
s.logger.LogAttrs(ctx, slog.LevelDebug, "client set member privacy flag, but we're not going to do anything", attrs)
}
if bodyIn.IdleFlag() {
s.logger.LogAttrs(ctx, slog.LevelDebug, "client set idle privacy flag, but we're not going to do anything", attrs)
}
}

// RateParamsSubAdd exists to capture the SNAC input in unit tests to
// verify it's correctly unmarshalled.
func (s OServiceService) RateParamsSubAdd(context.Context, wire.SNAC_0x01_0x08_OServiceRateParamsSubAdd) {
Expand Down
9 changes: 9 additions & 0 deletions foodgroup/oservice_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package foodgroup

import (
"context"
"log/slog"
"testing"
"time"
Expand Down Expand Up @@ -1936,3 +1937,11 @@ func TestOServiceServiceForAlert_HostOnline(t *testing.T) {
have := svc.HostOnline()
assert.Equal(t, want, have)
}

func TestOServiceService_SetPrivacyFlags(t *testing.T) {
svc := NewOServiceServiceForAlert(*NewOServiceService(config.Config{}, nil, nil, nil, slog.Default()))
body := wire.SNAC_0x01_0x14_OServiceSetPrivacyFlags{
PrivacyFlags: wire.OServicePrivacyFlagMember | wire.OServicePrivacyFlagIdle,
}
svc.SetPrivacyFlags(context.Background(), body)
}
34 changes: 34 additions & 0 deletions server/oscar/handler/mock_oservice_alert_service_test.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

34 changes: 34 additions & 0 deletions server/oscar/handler/mock_oservice_bos_test.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

34 changes: 34 additions & 0 deletions server/oscar/handler/mock_oservice_chat_nav_test.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

34 changes: 34 additions & 0 deletions server/oscar/handler/mock_oservice_chat_test.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

34 changes: 34 additions & 0 deletions server/oscar/handler/mock_oservice_test.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions server/oscar/handler/oservice.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ type OServiceService interface {
IdleNotification(ctx context.Context, sess *state.Session, bodyIn wire.SNAC_0x01_0x11_OServiceIdleNotification) error
RateParamsQuery(ctx context.Context, frame wire.SNACFrame) wire.SNACMessage
RateParamsSubAdd(context.Context, wire.SNAC_0x01_0x08_OServiceRateParamsSubAdd)
SetPrivacyFlags(ctx context.Context, bodyIn wire.SNAC_0x01_0x14_OServiceSetPrivacyFlags)
SetUserInfoFields(ctx context.Context, sess *state.Session, frame wire.SNACFrame, bodyIn wire.SNAC_0x01_0x1E_OServiceSetUserInfoFields) (wire.SNACMessage, error)
UserInfoQuery(ctx context.Context, sess *state.Session, frame wire.SNACFrame) wire.SNACMessage
}
Expand Down Expand Up @@ -109,6 +110,16 @@ func (h OServiceHandler) Noop(ctx context.Context, sess *state.Session, inFrame
return nil
}

func (h OServiceHandler) SetPrivacyFlags(ctx context.Context, sess *state.Session, inFrame wire.SNACFrame, r io.Reader, _ oscar.ResponseWriter) error {
inBody := wire.SNAC_0x01_0x14_OServiceSetPrivacyFlags{}
if err := wire.Unmarshal(&inBody, r); err != nil {
return err
}
h.OServiceService.SetPrivacyFlags(ctx, inBody)
h.LogRequest(ctx, inFrame, inBody)
return nil
}

func NewOServiceHandlerForBOS(logger *slog.Logger, oServiceService OServiceService, oServiceBOSService OServiceBOSService) OServiceBOSHandler {
return OServiceBOSHandler{
OServiceHandler: OServiceHandler{
Expand Down
30 changes: 30 additions & 0 deletions server/oscar/handler/oservice_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -401,6 +401,36 @@ func TestOServiceHandler_Noop(t *testing.T) {
assert.NoError(t, h.Noop(nil, nil, input.Frame, buf, responseWriter))
}

func TestOServiceHandler_SetPrivacyFlags(t *testing.T) {
input := wire.SNACMessage{
Frame: wire.SNACFrame{
FoodGroup: wire.OService,
SubGroup: wire.OServiceSetPrivacyFlags,
},
Body: wire.SNAC_0x01_0x14_OServiceSetPrivacyFlags{
PrivacyFlags: wire.OServicePrivacyFlagMember,
},
}

svc := newMockOServiceService(t)
svc.EXPECT().
SetPrivacyFlags(mock.Anything, input.Body)

h := OServiceHandler{
OServiceService: svc,
RouteLogger: middleware.RouteLogger{
Logger: slog.Default(),
},
}

responseWriter := newMockResponseWriter(t)

buf := &bytes.Buffer{}
assert.NoError(t, wire.Marshal(input.Body, buf))

assert.NoError(t, h.SetPrivacyFlags(nil, nil, input.Frame, buf, responseWriter))
}

func TestOServiceChatNavHandler_ClientOnline(t *testing.T) {
input := wire.SNACMessage{
Frame: wire.SNACFrame{
Expand Down
1 change: 1 addition & 0 deletions server/oscar/handler/routes.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ func NewBOSRouter(h Handlers) oscar.Router {
router.Register(wire.OService, wire.OServiceServiceRequest, h.OServiceBOSHandler.ServiceRequest)
router.Register(wire.OService, wire.OServiceSetUserInfoFields, h.OServiceBOSHandler.OServiceHandler.SetUserInfoFields)
router.Register(wire.OService, wire.OServiceUserInfoQuery, h.OServiceBOSHandler.OServiceHandler.UserInfoQuery)
router.Register(wire.OService, wire.OServiceSetPrivacyFlags, h.OServiceBOSHandler.OServiceHandler.SetPrivacyFlags)

return router
}
Expand Down
19 changes: 19 additions & 0 deletions wire/snacs.go
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,9 @@ const (
OServiceUserFlagLunch uint32 = 0x00002001 // user is having a lunch
OServiceUserFlagBirthday uint32 = 0x00080000 // user is having a birthday :DDD

OServicePrivacyFlagIdle uint32 = 0x00000001
OServicePrivacyFlagMember uint32 = 0x00000002

OServiceStatusWebAware uint32 = 0x00010000
OServiceStatusHideIP uint32 = 0x00020000
OServiceStatusICQHomePage uint32 = 0x00200000
Expand Down Expand Up @@ -265,6 +268,22 @@ type SNAC_0x01_0x11_OServiceIdleNotification struct {
IdleTime uint32
}

type SNAC_0x01_0x14_OServiceSetPrivacyFlags struct {
PrivacyFlags uint32
}

// IdleFlag returns whether other AIM users can see how long the user has been
// idle.
func (s SNAC_0x01_0x14_OServiceSetPrivacyFlags) IdleFlag() bool {
return s.PrivacyFlags&OServicePrivacyFlagIdle == OServicePrivacyFlagIdle
}

// MemberFlag returns whether other AIM users can see how long the user has been
// a member.
func (s SNAC_0x01_0x14_OServiceSetPrivacyFlags) MemberFlag() bool {
return s.PrivacyFlags&OServicePrivacyFlagMember == OServicePrivacyFlagMember
}

type SNAC_0x01_0x17_OServiceClientVersions struct {
Versions []uint16
}
Expand Down
Loading

0 comments on commit 2aca469

Please sign in to comment.