Skip to content

Commit a4604bc

Browse files
committed
fix broken QIP login sequence
On first login, QIP sends a FeedbagClassIdPdinfo feedbag item without setting FeedbagAttributesPdMode. Login fails because FeedbagUpsert returns an error when this occurrs. Now let's just set a default mode and move on in order to avoid a runtime error.
1 parent 65ef0fe commit a4604bc

File tree

2 files changed

+103
-33
lines changed

2 files changed

+103
-33
lines changed

state/user_store.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -745,7 +745,8 @@ func (f SQLiteUserStore) FeedbagUpsert(screenName IdentScreenName, items []wire.
745745
var hasMode bool
746746
pdMode, hasMode = item.Uint8(wire.FeedbagAttributesPdMode)
747747
if !hasMode {
748-
return fmt.Errorf("pd info doesn't have mode")
748+
// by default, QIP sends a PD info item entry with no mode
749+
pdMode = uint8(wire.FeedbagPDModePermitAll)
749750
}
750751
}
751752
_, err := f.db.Exec(q,

state/user_store_test.go

Lines changed: 101 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -16,44 +16,113 @@ import (
1616

1717
const testFile string = "aim_test.db"
1818

19-
func TestUserStore(t *testing.T) {
19+
func TestSQLiteUserStore_FeedbagUpsert(t *testing.T) {
20+
t.Run("buddy screen name is converted to ident screen name", func(t *testing.T) {
21+
defer func() {
22+
assert.NoError(t, os.Remove(testFile))
23+
}()
2024

21-
screenName := NewIdentScreenName("sn2day")
25+
f, err := NewSQLiteUserStore(testFile)
26+
assert.NoError(t, err)
2227

23-
defer func() {
24-
assert.NoError(t, os.Remove(testFile))
25-
}()
28+
given := []wire.FeedbagItem{
29+
{
30+
GroupID: 0,
31+
ItemID: 1805,
32+
ClassID: wire.FeedbagClassIdBuddy,
33+
Name: "my Friend Bill",
34+
TLVLBlock: wire.TLVLBlock{},
35+
},
36+
{
37+
GroupID: 0x0A,
38+
ItemID: 0,
39+
ClassID: wire.FeedbagClassIdGroup,
40+
Name: "Friends",
41+
},
42+
}
43+
expect := []wire.FeedbagItem{
44+
{
45+
GroupID: 0,
46+
ItemID: 1805,
47+
ClassID: wire.FeedbagClassIdBuddy,
48+
Name: "myfriendbill",
49+
TLVLBlock: wire.TLVLBlock{},
50+
},
51+
{
52+
GroupID: 0x0A,
53+
ItemID: 0,
54+
ClassID: wire.FeedbagClassIdGroup,
55+
Name: "Friends",
56+
},
57+
}
2658

27-
f, err := NewSQLiteUserStore(testFile)
28-
assert.NoError(t, err)
59+
me := NewIdentScreenName("me")
60+
if err := f.FeedbagUpsert(me, given); err != nil {
61+
t.Fatalf("failed to upsert: %s", err.Error())
62+
}
2963

30-
itemsIn := []wire.FeedbagItem{
31-
{
32-
GroupID: 0,
33-
ItemID: 1805,
34-
ClassID: 3,
35-
Name: "spimmer1234",
36-
TLVLBlock: wire.TLVLBlock{},
37-
},
38-
{
39-
GroupID: 0x0A,
40-
ItemID: 0,
41-
ClassID: 1,
42-
Name: "Friends",
43-
},
44-
}
45-
if err := f.FeedbagUpsert(screenName, itemsIn); err != nil {
46-
t.Fatalf("failed to upsert: %s", err.Error())
47-
}
64+
have, err := f.Feedbag(me)
65+
assert.NoError(t, err)
66+
assert.ElementsMatch(t, expect, have)
67+
})
4868

49-
itemsOut, err := f.Feedbag(screenName)
50-
if err != nil {
51-
t.Fatalf("failed to retrieve: %s", err.Error())
52-
}
69+
t.Run("upsert PD info with mode", func(t *testing.T) {
70+
defer func() {
71+
assert.NoError(t, os.Remove(testFile))
72+
}()
5373

54-
if !reflect.DeepEqual(itemsIn, itemsOut) {
55-
t.Fatalf("items did not match:\n in: %v\n out: %v", itemsIn, itemsOut)
56-
}
74+
f, err := NewSQLiteUserStore(testFile)
75+
assert.NoError(t, err)
76+
77+
given := []wire.FeedbagItem{
78+
{
79+
GroupID: 0x0A,
80+
ItemID: 0,
81+
ClassID: wire.FeedbagClassIdPdinfo,
82+
TLVLBlock: wire.TLVLBlock{
83+
TLVList: wire.TLVList{
84+
wire.NewTLVBE(wire.FeedbagAttributesPdMode, wire.FeedbagPDModePermitSome),
85+
},
86+
},
87+
},
88+
}
89+
90+
me := NewIdentScreenName("me")
91+
err = f.FeedbagUpsert(me, given)
92+
assert.NoError(t, err)
93+
94+
var pdMode uint8
95+
err = f.db.QueryRow(`SELECT pdMode from feedbag WHERE screenName = ?`, me.String()).Scan(&pdMode)
96+
assert.NoError(t, err)
97+
assert.Equal(t, wire.FeedbagPDMode(pdMode), wire.FeedbagPDModePermitSome)
98+
})
99+
100+
t.Run("upsert PD info without mode (QIP behavior)", func(t *testing.T) {
101+
defer func() {
102+
assert.NoError(t, os.Remove(testFile))
103+
}()
104+
105+
f, err := NewSQLiteUserStore(testFile)
106+
assert.NoError(t, err)
107+
108+
given := []wire.FeedbagItem{
109+
{
110+
GroupID: 0x0A,
111+
ItemID: 0,
112+
ClassID: wire.FeedbagClassIdPdinfo,
113+
TLVLBlock: wire.TLVLBlock{},
114+
},
115+
}
116+
117+
me := NewIdentScreenName("me")
118+
err = f.FeedbagUpsert(me, given)
119+
assert.NoError(t, err)
120+
121+
var pdMode uint8
122+
err = f.db.QueryRow(`SELECT pdMode from feedbag WHERE screenName = ?`, me.String()).Scan(&pdMode)
123+
assert.NoError(t, err)
124+
assert.Equal(t, wire.FeedbagPDMode(pdMode), wire.FeedbagPDModePermitAll)
125+
})
57126
}
58127

59128
func TestFeedbagDelete(t *testing.T) {

0 commit comments

Comments
 (0)