Skip to content

Commit 992caa6

Browse files
committed
implement SNAC(15,02)/07D0/04BA - short user info
1 parent 784cdac commit 992caa6

6 files changed

Lines changed: 258 additions & 0 deletions

File tree

foodgroup/icq.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,37 @@ func (s ICQService) SetWorkInfo(ctx context.Context, sess *state.Session, req wi
456456
return s.reqAck(ctx, sess, seq, wire.ICQDBQueryMetaReplySetWorkInfo)
457457
}
458458

459+
func (s ICQService) ShortUserInfo(ctx context.Context, sess *state.Session, req wire.ICQ_0x07D0_0x04BA_DBQueryMetaReqShortInfo, seq uint16) error {
460+
user, err := s.userFinder.FindByUIN(req.UIN)
461+
if err != nil {
462+
return err
463+
}
464+
465+
info := wire.ICQ_0x07DA_0x0104_DBQueryMetaReplyShortInfo{
466+
ICQMetadata: wire.ICQMetadata{
467+
UIN: sess.UIN(),
468+
ReqType: wire.ICQDBQueryMetaReply,
469+
Seq: seq,
470+
},
471+
ReqSubType: wire.ICQDBQueryMetaReplyShortInfo,
472+
Success: wire.ICQStatusCodeOK,
473+
Nickname: user.ICQBasicInfo.Nickname,
474+
FirstName: user.ICQBasicInfo.FirstName,
475+
LastName: user.ICQBasicInfo.LastName,
476+
Email: user.ICQBasicInfo.EmailAddress,
477+
Gender: uint8(user.ICQMoreInfo.Gender),
478+
}
479+
if user.ICQPermissions.AuthRequired {
480+
info.Authorization = 1
481+
}
482+
483+
msg := wire.ICQMessageReplyEnvelope{
484+
Message: info,
485+
}
486+
487+
return s.reply(ctx, sess, msg)
488+
}
489+
459490
func (s ICQService) XMLReqData(ctx context.Context, sess *state.Session, req wire.ICQ_0x07D0_0x0898_DBQueryMetaReqXMLReq, seq uint16) error {
460491
msg := wire.ICQMessageReplyEnvelope{
461492
Message: wire.ICQ_0x07DA_0x08A2_DBQueryMetaReplyXMLData{

foodgroup/icq_test.go

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2183,6 +2183,121 @@ func TestICQService_SetWorkInfo(t *testing.T) {
21832183
}
21842184
}
21852185

2186+
func TestICQService_ShortUserInfo(t *testing.T) {
2187+
tests := []struct {
2188+
name string
2189+
timeNow func() time.Time
2190+
seq uint16
2191+
sess *state.Session
2192+
req wire.ICQ_0x07D0_0x04BA_DBQueryMetaReqShortInfo
2193+
mockParams mockParams
2194+
wantErr error
2195+
}{
2196+
{
2197+
name: "happy path",
2198+
timeNow: func() time.Time {
2199+
return time.Date(2020, time.August, 1, 0, 0, 0, 0, time.UTC)
2200+
},
2201+
seq: 1,
2202+
sess: newTestSession("11111111", sessOptUIN(11111111)),
2203+
req: wire.ICQ_0x07D0_0x04BA_DBQueryMetaReqShortInfo{
2204+
UIN: 123456789,
2205+
},
2206+
mockParams: mockParams{
2207+
icqUserFinderParams: icqUserFinderParams{
2208+
findByUINParams: findByUINParams{
2209+
{
2210+
UIN: 123456789,
2211+
result: state.User{
2212+
IdentScreenName: state.NewIdentScreenName("123456789"),
2213+
ICQPermissions: state.ICQPermissions{
2214+
AuthRequired: true,
2215+
},
2216+
ICQMoreInfo: state.ICQMoreInfo{
2217+
Gender: 2,
2218+
},
2219+
ICQBasicInfo: state.ICQBasicInfo{
2220+
EmailAddress: "john.doe@example.com",
2221+
FirstName: "John",
2222+
LastName: "Doe",
2223+
Nickname: "CoolUser123",
2224+
},
2225+
},
2226+
},
2227+
},
2228+
},
2229+
messageRelayerParams: messageRelayerParams{
2230+
relayToScreenNameParams: relayToScreenNameParams{
2231+
{
2232+
screenName: state.NewIdentScreenName("11111111"),
2233+
message: wire.SNACMessage{
2234+
Frame: wire.SNACFrame{
2235+
FoodGroup: wire.ICQ,
2236+
SubGroup: wire.ICQDBReply,
2237+
},
2238+
Body: wire.SNAC_0x0F_0x02_DBReply{
2239+
TLVRestBlock: wire.TLVRestBlock{
2240+
TLVList: wire.TLVList{
2241+
wire.NewTLV(wire.ICQTLVTagsMetadata, wire.ICQMessageReplyEnvelope{
2242+
Message: wire.ICQ_0x07DA_0x0104_DBQueryMetaReplyShortInfo{
2243+
ICQMetadata: wire.ICQMetadata{
2244+
UIN: 11111111,
2245+
ReqType: wire.ICQDBQueryMetaReply,
2246+
Seq: 1,
2247+
},
2248+
Success: wire.ICQStatusCodeOK,
2249+
ReqSubType: wire.ICQDBQueryMetaReplyShortInfo,
2250+
Nickname: "CoolUser123",
2251+
FirstName: "John",
2252+
LastName: "Doe",
2253+
Email: "john.doe@example.com",
2254+
Authorization: 1,
2255+
Gender: 2,
2256+
},
2257+
}),
2258+
},
2259+
},
2260+
},
2261+
},
2262+
},
2263+
},
2264+
},
2265+
sessionRetrieverParams: sessionRetrieverParams{
2266+
retrieveSessionParams{
2267+
{
2268+
screenName: state.NewIdentScreenName("123456789"),
2269+
result: &state.Session{},
2270+
},
2271+
},
2272+
},
2273+
},
2274+
},
2275+
}
2276+
for _, tt := range tests {
2277+
t.Run(tt.name, func(t *testing.T) {
2278+
userFinder := newMockICQUserFinder(t)
2279+
for _, params := range tt.mockParams.findByUINParams {
2280+
userFinder.EXPECT().
2281+
FindByUIN(params.UIN).
2282+
Return(params.result, params.err)
2283+
}
2284+
2285+
messageRelayer := newMockMessageRelayer(t)
2286+
for _, params := range tt.mockParams.relayToScreenNameParams {
2287+
messageRelayer.EXPECT().RelayToScreenName(mock.Anything, params.screenName, params.message)
2288+
}
2289+
2290+
s := ICQService{
2291+
messageRelayer: messageRelayer,
2292+
timeNow: tt.timeNow,
2293+
userFinder: userFinder,
2294+
}
2295+
err := s.ShortUserInfo(nil, tt.sess, tt.req, tt.seq)
2296+
assert.NoError(t, err)
2297+
})
2298+
}
2299+
}
2300+
21862301
func TestICQService_XMLReqData(t *testing.T) {
21872302
tests := []struct {
21882303
name string

server/oscar/handler/icq.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ type ICQService interface {
3131
SetPermissions(ctx context.Context, sess *state.Session, req wire.ICQ_0x07D0_0x0424_DBQueryMetaReqSetPermissions, seq uint16) error
3232
SetUserNotes(ctx context.Context, sess *state.Session, req wire.ICQ_0x07D0_0x0406_DBQueryMetaReqSetNotes, seq uint16) error
3333
SetWorkInfo(ctx context.Context, sess *state.Session, req wire.ICQ_0x07D0_0x03F3_DBQueryMetaReqSetWorkInfo, seq uint16) error
34+
ShortUserInfo(ctx context.Context, sess *state.Session, req wire.ICQ_0x07D0_0x04BA_DBQueryMetaReqShortInfo, seq uint16) error
3435
XMLReqData(ctx context.Context, sess *state.Session, req wire.ICQ_0x07D0_0x0898_DBQueryMetaReqXMLReq, seq uint16) error
3536
}
3637

@@ -89,6 +90,12 @@ func (rt ICQHandler) DBQuery(ctx context.Context, sess *state.Session, inFrame w
8990
"uin", sess.UIN())
9091

9192
switch icqMD.Optional.ReqSubType {
93+
case wire.ICQDBQueryMetaReqShortInfo:
94+
userInfo := wire.ICQ_0x07D0_0x04BA_DBQueryMetaReqShortInfo{}
95+
if err := binary.Read(buf, binary.LittleEndian, &userInfo); err != nil {
96+
return nil
97+
}
98+
return rt.ICQService.ShortUserInfo(ctx, sess, userInfo, icqMD.Seq)
9299
case wire.ICQDBQueryMetaReqFullInfo, wire.ICQDBQueryMetaReqFullInfo2:
93100
userInfo := wire.ICQ_0x07D0_0x051F_DBQueryMetaReqSearchByUIN{}
94101
if err := binary.Read(buf, binary.LittleEndian, &userInfo); err != nil {

server/oscar/handler/icq_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ func TestICQHandler_DBQuery(t *testing.T) {
4949
setPermissions *mockParam
5050
setUserNotes *mockParam
5151
setWorkInfo *mockParam
52+
shortUserInfo *mockParam
5253
xmlReqData *mockParam
5354
}
5455
tests := []struct {
@@ -88,6 +89,38 @@ func TestICQHandler_DBQuery(t *testing.T) {
8889
},
8990
},
9091
},
92+
{
93+
name: "MetaReqShortInfo - happy path",
94+
reqParams: reqParams{
95+
sess: &state.Session{},
96+
inBody: wire.SNAC_0x0F_0x02_BQuery{
97+
TLVRestBlock: wire.TLVRestBlock{
98+
TLVList: wire.TLVList{
99+
wire.NewTLV(wire.ICQTLVTagsMetadata, wire.ICQMessageReplyEnvelope{
100+
Message: ICQMetaRequest{
101+
ICQMetadata: wire.ICQMetadata{
102+
ReqType: wire.ICQDBQueryMetaReq,
103+
Seq: 1,
104+
},
105+
ReqSubType: wire.ICQDBQueryMetaReqShortInfo,
106+
MetaRequest: wire.ICQ_0x07D0_0x04BA_DBQueryMetaReqShortInfo{
107+
UIN: 123456789,
108+
},
109+
},
110+
}),
111+
},
112+
},
113+
},
114+
seq: 1,
115+
},
116+
allMockParams: allMockParams{
117+
shortUserInfo: &mockParam{
118+
req: wire.ICQ_0x07D0_0x04BA_DBQueryMetaReqShortInfo{
119+
UIN: 123456789,
120+
},
121+
},
122+
},
123+
},
91124
{
92125
name: "MetaReqFullInfo2 - happy path",
93126
reqParams: reqParams{
@@ -723,6 +756,10 @@ func TestICQHandler_DBQuery(t *testing.T) {
723756
icqService.EXPECT().
724757
FullUserInfo(mock.Anything, tt.reqParams.sess, tt.allMockParams.fullUserInfo.req, tt.reqParams.seq).
725758
Return(tt.allMockParams.fullUserInfo.wantErr)
759+
case tt.allMockParams.shortUserInfo != nil:
760+
icqService.EXPECT().
761+
ShortUserInfo(mock.Anything, tt.reqParams.sess, tt.allMockParams.shortUserInfo.req, tt.reqParams.seq).
762+
Return(tt.allMockParams.shortUserInfo.wantErr)
726763
case tt.allMockParams.xmlReqData != nil:
727764
icqService.EXPECT().
728765
XMLReqData(mock.Anything, tt.reqParams.sess, tt.allMockParams.xmlReqData.req, tt.reqParams.seq).

server/oscar/handler/mock_icq_service_test.go

Lines changed: 49 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

wire/snacs.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -997,6 +997,7 @@ const (
997997
ICQDBQueryMetaReqSetInterests uint16 = 0x0410
998998
ICQDBQueryMetaReqSetAffiliations uint16 = 0x041A
999999
ICQDBQueryMetaReqSetPermissions uint16 = 0x0424
1000+
ICQDBQueryMetaReqShortInfo uint16 = 0x04BA
10001001
ICQDBQueryMetaReqFullInfo uint16 = 0x04B2
10011002
ICQDBQueryMetaReqFullInfo2 uint16 = 0x04D0
10021003
ICQDBQueryMetaReqSearchByDetails uint16 = 0x0515
@@ -1031,6 +1032,7 @@ const (
10311032
ICQDBQueryMetaReplyExtEmailInfo uint16 = 0x00EB
10321033
ICQDBQueryMetaReplyInterests uint16 = 0x00F0
10331034
ICQDBQueryMetaReplyAffiliations uint16 = 0x00FA
1035+
ICQDBQueryMetaReplyShortInfo uint16 = 0x0104
10341036
ICQDBQueryMetaReplyHomePageCat uint16 = 0x010E
10351037
ICQDBQueryMetaReplyUserFound uint16 = 0x01A4
10361038
ICQDBQueryMetaReplyLastUserFound uint16 = 0x01AE
@@ -1041,6 +1043,10 @@ type SNAC_0x0F_0x02_BQuery struct {
10411043
TLVRestBlock
10421044
}
10431045

1046+
type ICQ_0x07D0_0x04BA_DBQueryMetaReqShortInfo struct {
1047+
UIN uint32
1048+
}
1049+
10441050
type ICQ_0x07D0_0x0898_DBQueryMetaReqXMLReq struct {
10451051
XMLRequest string `oscar:"len_prefix=uint16,nullterm"`
10461052
}
@@ -1284,6 +1290,19 @@ func (s *ICQ_0x07DA_0x01AE_DBQueryMetaReplyLastUserFound) LastResult() {
12841290
}
12851291
}
12861292

1293+
type ICQ_0x07DA_0x0104_DBQueryMetaReplyShortInfo struct {
1294+
ICQMetadata
1295+
ReqSubType uint16
1296+
Success uint8
1297+
Nickname string `oscar:"len_prefix=uint16,nullterm"`
1298+
FirstName string `oscar:"len_prefix=uint16,nullterm"`
1299+
LastName string `oscar:"len_prefix=uint16,nullterm"`
1300+
Email string `oscar:"len_prefix=uint16,nullterm"`
1301+
Authorization uint8
1302+
Unknown uint8
1303+
Gender uint8
1304+
}
1305+
12871306
type ICQ_0x0041_DBQueryOfflineMsgReply struct {
12881307
ICQMetadata
12891308
SenderUIN uint32

0 commit comments

Comments
 (0)