|
|
@@ -16,8 +16,9 @@ import (
|
|
|
|
|
|
func TestAuthService_BUCPLoginRequest(t *testing.T) {
|
|
|
user := state.User{
|
|
|
- IdentScreenName: state.NewIdentScreenName("screen_name"),
|
|
|
- AuthKey: "auth_key",
|
|
|
+ IdentScreenName: state.NewIdentScreenName("screen_name"),
|
|
|
+ DisplayScreenName: "screen_name",
|
|
|
+ AuthKey: "auth_key",
|
|
|
}
|
|
|
assert.NoError(t, user.HashPassword("the_password"))
|
|
|
|
|
|
@@ -39,7 +40,7 @@ func TestAuthService_BUCPLoginRequest(t *testing.T) {
|
|
|
wantErr error
|
|
|
}{
|
|
|
{
|
|
|
- name: "user provides valid credentials and logs in successfully",
|
|
|
+ name: "AIM account exists, correct password, login OK",
|
|
|
cfg: config.Config{
|
|
|
OSCARHost: "127.0.0.1",
|
|
|
BOSPort: "1234",
|
|
|
@@ -63,7 +64,14 @@ func TestAuthService_BUCPLoginRequest(t *testing.T) {
|
|
|
},
|
|
|
cookieIssuerParams: cookieIssuerParams{
|
|
|
{
|
|
|
- data: []byte(user.IdentScreenName.String()),
|
|
|
+ data: func() []byte {
|
|
|
+ loginCookie := bosCookie{
|
|
|
+ ScreenName: user.DisplayScreenName,
|
|
|
+ }
|
|
|
+ buf := &bytes.Buffer{}
|
|
|
+ assert.NoError(t, wire.MarshalBE(loginCookie, buf))
|
|
|
+ return buf.Bytes()
|
|
|
+ }(),
|
|
|
cookie: []byte("the-cookie"),
|
|
|
},
|
|
|
},
|
|
|
@@ -85,15 +93,15 @@ func TestAuthService_BUCPLoginRequest(t *testing.T) {
|
|
|
},
|
|
|
},
|
|
|
{
|
|
|
- name: "user logs in with non-existent screen name--account is created and logged in successfully",
|
|
|
+ name: "ICQ account exists, correct password, login OK",
|
|
|
cfg: config.Config{
|
|
|
- OSCARHost: "127.0.0.1",
|
|
|
- BOSPort: "1234",
|
|
|
- DisableAuth: true,
|
|
|
+ OSCARHost: "127.0.0.1",
|
|
|
+ BOSPort: "1234",
|
|
|
},
|
|
|
inputSNAC: wire.SNAC_0x17_0x02_BUCPLoginRequest{
|
|
|
TLVRestBlock: wire.TLVRestBlock{
|
|
|
TLVList: wire.TLVList{
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsClientIdentity, "ICQ 2000b"),
|
|
|
wire.NewTLV(wire.LoginTLVTagsPasswordHash, user.StrongMD5Pass),
|
|
|
wire.NewTLV(wire.LoginTLVTagsScreenName, user.IdentScreenName),
|
|
|
},
|
|
|
@@ -104,25 +112,25 @@ func TestAuthService_BUCPLoginRequest(t *testing.T) {
|
|
|
getUserParams: getUserParams{
|
|
|
{
|
|
|
screenName: user.IdentScreenName,
|
|
|
- result: nil,
|
|
|
- },
|
|
|
- },
|
|
|
- insertUserParams: insertUserParams{
|
|
|
- {
|
|
|
- user: user,
|
|
|
+ result: &user,
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
cookieIssuerParams: cookieIssuerParams{
|
|
|
{
|
|
|
- data: []byte(user.IdentScreenName.String()),
|
|
|
+ data: func() []byte {
|
|
|
+ loginCookie := bosCookie{
|
|
|
+ ScreenName: user.DisplayScreenName,
|
|
|
+ ICQ: 1,
|
|
|
+ }
|
|
|
+ buf := &bytes.Buffer{}
|
|
|
+ assert.NoError(t, wire.MarshalBE(loginCookie, buf))
|
|
|
+ return buf.Bytes()
|
|
|
+ }(),
|
|
|
cookie: []byte("the-cookie"),
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
- newUserFn: func(screenName state.DisplayScreenName) (state.User, error) {
|
|
|
- return user, nil
|
|
|
- },
|
|
|
expectOutput: wire.SNACMessage{
|
|
|
Frame: wire.SNACFrame{
|
|
|
FoodGroup: wire.BUCP,
|
|
|
@@ -140,16 +148,15 @@ func TestAuthService_BUCPLoginRequest(t *testing.T) {
|
|
|
},
|
|
|
},
|
|
|
{
|
|
|
- name: "user logs in with invalid password--account is created and logged in successfully",
|
|
|
+ name: "AIM account exists, incorrect password, login fails",
|
|
|
cfg: config.Config{
|
|
|
- OSCARHost: "127.0.0.1",
|
|
|
- BOSPort: "1234",
|
|
|
- DisableAuth: true,
|
|
|
+ OSCARHost: "127.0.0.1",
|
|
|
+ BOSPort: "1234",
|
|
|
},
|
|
|
inputSNAC: wire.SNAC_0x17_0x02_BUCPLoginRequest{
|
|
|
TLVRestBlock: wire.TLVRestBlock{
|
|
|
TLVList: wire.TLVList{
|
|
|
- wire.NewTLV(wire.LoginTLVTagsPasswordHash, []byte("bad-password-hash")),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsPasswordHash, []byte("bad_password")),
|
|
|
wire.NewTLV(wire.LoginTLVTagsScreenName, user.IdentScreenName),
|
|
|
},
|
|
|
},
|
|
|
@@ -162,22 +169,8 @@ func TestAuthService_BUCPLoginRequest(t *testing.T) {
|
|
|
result: &user,
|
|
|
},
|
|
|
},
|
|
|
- insertUserParams: insertUserParams{
|
|
|
- {
|
|
|
- user: user,
|
|
|
- },
|
|
|
- },
|
|
|
- },
|
|
|
- cookieIssuerParams: cookieIssuerParams{
|
|
|
- {
|
|
|
- data: []byte(user.IdentScreenName.String()),
|
|
|
- cookie: []byte("the-cookie"),
|
|
|
- },
|
|
|
},
|
|
|
},
|
|
|
- newUserFn: func(screenName state.DisplayScreenName) (state.User, error) {
|
|
|
- return user, nil
|
|
|
- },
|
|
|
expectOutput: wire.SNACMessage{
|
|
|
Frame: wire.SNACFrame{
|
|
|
FoodGroup: wire.BUCP,
|
|
|
@@ -185,27 +178,25 @@ func TestAuthService_BUCPLoginRequest(t *testing.T) {
|
|
|
},
|
|
|
Body: wire.SNAC_0x17_0x03_BUCPLoginResponse{
|
|
|
TLVRestBlock: wire.TLVRestBlock{
|
|
|
- TLVList: wire.TLVList{
|
|
|
+ TLVList: []wire.TLV{
|
|
|
wire.NewTLV(wire.LoginTLVTagsScreenName, user.IdentScreenName),
|
|
|
- wire.NewTLV(wire.LoginTLVTagsReconnectHere, "127.0.0.1:1234"),
|
|
|
- wire.NewTLV(wire.LoginTLVTagsAuthorizationCookie, []byte("the-cookie")),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsErrorSubcode, wire.LoginErrInvalidPassword),
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
{
|
|
|
- name: "user logs in with invalid password--account already exists and logged in successfully",
|
|
|
+ name: "AIM account doesn't exist, login fails",
|
|
|
cfg: config.Config{
|
|
|
- OSCARHost: "127.0.0.1",
|
|
|
- BOSPort: "1234",
|
|
|
- DisableAuth: true,
|
|
|
+ OSCARHost: "127.0.0.1",
|
|
|
+ BOSPort: "1234",
|
|
|
},
|
|
|
inputSNAC: wire.SNAC_0x17_0x02_BUCPLoginRequest{
|
|
|
TLVRestBlock: wire.TLVRestBlock{
|
|
|
TLVList: wire.TLVList{
|
|
|
- wire.NewTLV(wire.LoginTLVTagsPasswordHash, []byte("bad-password-hash")),
|
|
|
- wire.NewTLV(wire.LoginTLVTagsScreenName, user.IdentScreenName),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsPasswordHash, []byte("password")),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsScreenName, []byte("non_existent_screen_name")),
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
@@ -213,26 +204,11 @@ func TestAuthService_BUCPLoginRequest(t *testing.T) {
|
|
|
userManagerParams: userManagerParams{
|
|
|
getUserParams: getUserParams{
|
|
|
{
|
|
|
- screenName: user.IdentScreenName,
|
|
|
- result: &user,
|
|
|
- },
|
|
|
- },
|
|
|
- insertUserParams: insertUserParams{
|
|
|
- {
|
|
|
- user: user,
|
|
|
- err: state.ErrDupUser,
|
|
|
+ screenName: state.NewIdentScreenName("non_existent_screen_name"),
|
|
|
+ result: nil,
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
- cookieIssuerParams: cookieIssuerParams{
|
|
|
- {
|
|
|
- data: []byte(user.IdentScreenName.String()),
|
|
|
- cookie: []byte("the-cookie"),
|
|
|
- },
|
|
|
- },
|
|
|
- },
|
|
|
- newUserFn: func(screenName state.DisplayScreenName) (state.User, error) {
|
|
|
- return user, nil
|
|
|
},
|
|
|
expectOutput: wire.SNACMessage{
|
|
|
Frame: wire.SNACFrame{
|
|
|
@@ -241,25 +217,26 @@ func TestAuthService_BUCPLoginRequest(t *testing.T) {
|
|
|
},
|
|
|
Body: wire.SNAC_0x17_0x03_BUCPLoginResponse{
|
|
|
TLVRestBlock: wire.TLVRestBlock{
|
|
|
- TLVList: wire.TLVList{
|
|
|
- wire.NewTLV(wire.LoginTLVTagsScreenName, user.IdentScreenName),
|
|
|
- wire.NewTLV(wire.LoginTLVTagsReconnectHere, "127.0.0.1:1234"),
|
|
|
- wire.NewTLV(wire.LoginTLVTagsAuthorizationCookie, []byte("the-cookie")),
|
|
|
+ TLVList: []wire.TLV{
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsScreenName, state.NewIdentScreenName("non_existent_screen_name")),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsErrorSubcode, wire.LoginErrInvalidUsernameOrPassword),
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
{
|
|
|
- name: "user provides invalid password--account creation fails due to user creation runtime error",
|
|
|
+ name: "ICQ account doesn't exist, login fails",
|
|
|
cfg: config.Config{
|
|
|
- DisableAuth: true,
|
|
|
+ OSCARHost: "127.0.0.1",
|
|
|
+ BOSPort: "1234",
|
|
|
},
|
|
|
inputSNAC: wire.SNAC_0x17_0x02_BUCPLoginRequest{
|
|
|
TLVRestBlock: wire.TLVRestBlock{
|
|
|
TLVList: wire.TLVList{
|
|
|
- wire.NewTLV(wire.LoginTLVTagsPasswordHash, []byte("bad-password-hash")),
|
|
|
- wire.NewTLV(wire.LoginTLVTagsScreenName, user.IdentScreenName),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsClientIdentity, "ICQ 2000b"),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsPasswordHash, []byte("password")),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsScreenName, []byte("non_existent_uin")),
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
@@ -267,26 +244,38 @@ func TestAuthService_BUCPLoginRequest(t *testing.T) {
|
|
|
userManagerParams: userManagerParams{
|
|
|
getUserParams: getUserParams{
|
|
|
{
|
|
|
- screenName: user.IdentScreenName,
|
|
|
- result: &user,
|
|
|
+ screenName: state.NewIdentScreenName("non_existent_uin"),
|
|
|
+ result: nil,
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
- newUserFn: func(screenName state.DisplayScreenName) (state.User, error) {
|
|
|
- return user, io.EOF
|
|
|
+ expectOutput: wire.SNACMessage{
|
|
|
+ Frame: wire.SNACFrame{
|
|
|
+ FoodGroup: wire.BUCP,
|
|
|
+ SubGroup: wire.BUCPLoginResponse,
|
|
|
+ },
|
|
|
+ Body: wire.SNAC_0x17_0x03_BUCPLoginResponse{
|
|
|
+ TLVRestBlock: wire.TLVRestBlock{
|
|
|
+ TLVList: []wire.TLV{
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsScreenName, state.NewIdentScreenName("non_existent_uin")),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsErrorSubcode, wire.LoginErrICQUserErr),
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
},
|
|
|
- wantErr: io.EOF,
|
|
|
},
|
|
|
{
|
|
|
- name: "user provides invalid password--account creation fails due to user upsert runtime error",
|
|
|
+ name: "account doesn't exist, authentication is disabled, account is created, login succeeds",
|
|
|
cfg: config.Config{
|
|
|
+ OSCARHost: "127.0.0.1",
|
|
|
+ BOSPort: "1234",
|
|
|
DisableAuth: true,
|
|
|
},
|
|
|
inputSNAC: wire.SNAC_0x17_0x02_BUCPLoginRequest{
|
|
|
TLVRestBlock: wire.TLVRestBlock{
|
|
|
TLVList: wire.TLVList{
|
|
|
- wire.NewTLV(wire.LoginTLVTagsPasswordHash, []byte("bad-password-hash")),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsPasswordHash, user.StrongMD5Pass),
|
|
|
wire.NewTLV(wire.LoginTLVTagsScreenName, user.IdentScreenName),
|
|
|
},
|
|
|
},
|
|
|
@@ -296,32 +285,59 @@ func TestAuthService_BUCPLoginRequest(t *testing.T) {
|
|
|
getUserParams: getUserParams{
|
|
|
{
|
|
|
screenName: user.IdentScreenName,
|
|
|
- result: &user,
|
|
|
+ result: nil,
|
|
|
},
|
|
|
},
|
|
|
insertUserParams: insertUserParams{
|
|
|
{
|
|
|
user: user,
|
|
|
- err: io.EOF,
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
+ cookieIssuerParams: cookieIssuerParams{
|
|
|
+ {
|
|
|
+ data: func() []byte {
|
|
|
+ loginCookie := bosCookie{
|
|
|
+ ScreenName: user.DisplayScreenName,
|
|
|
+ }
|
|
|
+ buf := &bytes.Buffer{}
|
|
|
+ assert.NoError(t, wire.MarshalBE(loginCookie, buf))
|
|
|
+ return buf.Bytes()
|
|
|
+ }(),
|
|
|
+ cookie: []byte("the-cookie"),
|
|
|
+ },
|
|
|
+ },
|
|
|
},
|
|
|
newUserFn: func(screenName state.DisplayScreenName) (state.User, error) {
|
|
|
return user, nil
|
|
|
},
|
|
|
- wantErr: io.EOF,
|
|
|
+ expectOutput: wire.SNACMessage{
|
|
|
+ Frame: wire.SNACFrame{
|
|
|
+ FoodGroup: wire.BUCP,
|
|
|
+ SubGroup: wire.BUCPLoginResponse,
|
|
|
+ },
|
|
|
+ Body: wire.SNAC_0x17_0x03_BUCPLoginResponse{
|
|
|
+ TLVRestBlock: wire.TLVRestBlock{
|
|
|
+ TLVList: wire.TLVList{
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsScreenName, user.IdentScreenName),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsReconnectHere, "127.0.0.1:1234"),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsAuthorizationCookie, []byte("the-cookie")),
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
},
|
|
|
{
|
|
|
- name: "user provides invalid password and receives invalid login response",
|
|
|
+ name: "account exists, password is invalid, authentication is disabled, login succeeds",
|
|
|
cfg: config.Config{
|
|
|
- OSCARHost: "127.0.0.1",
|
|
|
- BOSPort: "1234",
|
|
|
+ OSCARHost: "127.0.0.1",
|
|
|
+ BOSPort: "1234",
|
|
|
+ DisableAuth: true,
|
|
|
},
|
|
|
inputSNAC: wire.SNAC_0x17_0x02_BUCPLoginRequest{
|
|
|
TLVRestBlock: wire.TLVRestBlock{
|
|
|
TLVList: wire.TLVList{
|
|
|
- wire.NewTLV(wire.LoginTLVTagsPasswordHash, []byte("bad_password")),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsPasswordHash, []byte("bad-password-hash")),
|
|
|
wire.NewTLV(wire.LoginTLVTagsScreenName, user.IdentScreenName),
|
|
|
},
|
|
|
},
|
|
|
@@ -331,10 +347,26 @@ func TestAuthService_BUCPLoginRequest(t *testing.T) {
|
|
|
getUserParams: getUserParams{
|
|
|
{
|
|
|
screenName: user.IdentScreenName,
|
|
|
- result: nil,
|
|
|
+ result: &user,
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
+ cookieIssuerParams: cookieIssuerParams{
|
|
|
+ {
|
|
|
+ data: func() []byte {
|
|
|
+ loginCookie := bosCookie{
|
|
|
+ ScreenName: user.DisplayScreenName,
|
|
|
+ }
|
|
|
+ buf := &bytes.Buffer{}
|
|
|
+ assert.NoError(t, wire.MarshalBE(loginCookie, buf))
|
|
|
+ return buf.Bytes()
|
|
|
+ }(),
|
|
|
+ cookie: []byte("the-cookie"),
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ newUserFn: func(screenName state.DisplayScreenName) (state.User, error) {
|
|
|
+ return user, nil
|
|
|
},
|
|
|
expectOutput: wire.SNACMessage{
|
|
|
Frame: wire.SNACFrame{
|
|
|
@@ -345,7 +377,8 @@ func TestAuthService_BUCPLoginRequest(t *testing.T) {
|
|
|
TLVRestBlock: wire.TLVRestBlock{
|
|
|
TLVList: wire.TLVList{
|
|
|
wire.NewTLV(wire.LoginTLVTagsScreenName, user.IdentScreenName),
|
|
|
- wire.NewTLV(wire.LoginTLVTagsErrorSubcode, uint16(0x01)),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsReconnectHere, "127.0.0.1:1234"),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsAuthorizationCookie, []byte("the-cookie")),
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
@@ -411,12 +444,13 @@ func TestAuthService_BUCPLoginRequest(t *testing.T) {
|
|
|
|
|
|
func TestAuthService_FLAPLoginResponse(t *testing.T) {
|
|
|
user := state.User{
|
|
|
- IdentScreenName: state.NewIdentScreenName("screen_name"),
|
|
|
- AuthKey: "auth_key",
|
|
|
+ AuthKey: "auth_key",
|
|
|
+ DisplayScreenName: "screen_name",
|
|
|
+ IdentScreenName: state.NewIdentScreenName("screen_name"),
|
|
|
}
|
|
|
assert.NoError(t, user.HashPassword("the_password"))
|
|
|
|
|
|
- // obfuscated password value: "the_password"
|
|
|
+ // roastedPassword the roasted form of "the_password"
|
|
|
roastedPassword := []byte{0x87, 0x4E, 0xE4, 0x9B, 0x49, 0xE7, 0xA8, 0xE1, 0x06, 0xCC, 0xCB, 0x82}
|
|
|
|
|
|
cases := []struct {
|
|
|
@@ -437,7 +471,7 @@ func TestAuthService_FLAPLoginResponse(t *testing.T) {
|
|
|
wantErr error
|
|
|
}{
|
|
|
{
|
|
|
- name: "user provides valid credentials and logs in successfully",
|
|
|
+ name: "AIM account exists, correct password, login OK",
|
|
|
cfg: config.Config{
|
|
|
OSCARHost: "127.0.0.1",
|
|
|
BOSPort: "1234",
|
|
|
@@ -461,7 +495,14 @@ func TestAuthService_FLAPLoginResponse(t *testing.T) {
|
|
|
},
|
|
|
cookieIssuerParams: cookieIssuerParams{
|
|
|
{
|
|
|
- data: []byte(user.IdentScreenName.String()),
|
|
|
+ data: func() []byte {
|
|
|
+ loginCookie := bosCookie{
|
|
|
+ ScreenName: user.DisplayScreenName,
|
|
|
+ }
|
|
|
+ buf := &bytes.Buffer{}
|
|
|
+ assert.NoError(t, wire.MarshalBE(loginCookie, buf))
|
|
|
+ return buf.Bytes()
|
|
|
+ }(),
|
|
|
cookie: []byte("the-cookie"),
|
|
|
},
|
|
|
},
|
|
|
@@ -475,15 +516,15 @@ func TestAuthService_FLAPLoginResponse(t *testing.T) {
|
|
|
},
|
|
|
},
|
|
|
{
|
|
|
- name: "user logs in with non-existent screen name--account is created and logged in successfully",
|
|
|
+ name: "ICQ account exists, correct password, login OK",
|
|
|
cfg: config.Config{
|
|
|
- OSCARHost: "127.0.0.1",
|
|
|
- BOSPort: "1234",
|
|
|
- DisableAuth: true,
|
|
|
+ OSCARHost: "127.0.0.1",
|
|
|
+ BOSPort: "1234",
|
|
|
},
|
|
|
inputSNAC: wire.FLAPSignonFrame{
|
|
|
TLVRestBlock: wire.TLVRestBlock{
|
|
|
TLVList: wire.TLVList{
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsClientIdentity, "ICQ 2000b"),
|
|
|
wire.NewTLV(wire.LoginTLVTagsRoastedPassword, roastedPassword),
|
|
|
wire.NewTLV(wire.LoginTLVTagsScreenName, user.IdentScreenName),
|
|
|
},
|
|
|
@@ -494,25 +535,25 @@ func TestAuthService_FLAPLoginResponse(t *testing.T) {
|
|
|
getUserParams: getUserParams{
|
|
|
{
|
|
|
screenName: user.IdentScreenName,
|
|
|
- result: nil,
|
|
|
- },
|
|
|
- },
|
|
|
- insertUserParams: insertUserParams{
|
|
|
- {
|
|
|
- user: user,
|
|
|
+ result: &user,
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
cookieIssuerParams: cookieIssuerParams{
|
|
|
{
|
|
|
- data: []byte(user.IdentScreenName.String()),
|
|
|
+ data: func() []byte {
|
|
|
+ loginCookie := bosCookie{
|
|
|
+ ScreenName: user.DisplayScreenName,
|
|
|
+ ICQ: 1,
|
|
|
+ }
|
|
|
+ buf := &bytes.Buffer{}
|
|
|
+ assert.NoError(t, wire.MarshalBE(loginCookie, buf))
|
|
|
+ return buf.Bytes()
|
|
|
+ }(),
|
|
|
cookie: []byte("the-cookie"),
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
- newUserFn: func(screenName state.DisplayScreenName) (state.User, error) {
|
|
|
- return user, nil
|
|
|
- },
|
|
|
expectOutput: wire.TLVRestBlock{
|
|
|
TLVList: wire.TLVList{
|
|
|
wire.NewTLV(wire.LoginTLVTagsScreenName, user.IdentScreenName),
|
|
|
@@ -522,16 +563,15 @@ func TestAuthService_FLAPLoginResponse(t *testing.T) {
|
|
|
},
|
|
|
},
|
|
|
{
|
|
|
- name: "user logs in with invalid password--account is created and logged in successfully",
|
|
|
+ name: "AIM account exists, incorrect password, login fails",
|
|
|
cfg: config.Config{
|
|
|
- OSCARHost: "127.0.0.1",
|
|
|
- BOSPort: "1234",
|
|
|
- DisableAuth: true,
|
|
|
+ OSCARHost: "127.0.0.1",
|
|
|
+ BOSPort: "1234",
|
|
|
},
|
|
|
inputSNAC: wire.FLAPSignonFrame{
|
|
|
TLVRestBlock: wire.TLVRestBlock{
|
|
|
TLVList: wire.TLVList{
|
|
|
- wire.NewTLV(wire.LoginTLVTagsPasswordHash, []byte("bad-roasted-password")),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsRoastedPassword, []byte("bad_roasted_password")),
|
|
|
wire.NewTLV(wire.LoginTLVTagsScreenName, user.IdentScreenName),
|
|
|
},
|
|
|
},
|
|
|
@@ -544,42 +584,26 @@ func TestAuthService_FLAPLoginResponse(t *testing.T) {
|
|
|
result: &user,
|
|
|
},
|
|
|
},
|
|
|
- insertUserParams: insertUserParams{
|
|
|
- {
|
|
|
- user: user,
|
|
|
- },
|
|
|
- },
|
|
|
- },
|
|
|
- cookieIssuerParams: cookieIssuerParams{
|
|
|
- {
|
|
|
- data: []byte(user.IdentScreenName.String()),
|
|
|
- cookie: []byte("the-cookie"),
|
|
|
- },
|
|
|
},
|
|
|
},
|
|
|
- newUserFn: func(screenName state.DisplayScreenName) (state.User, error) {
|
|
|
- return user, nil
|
|
|
- },
|
|
|
expectOutput: wire.TLVRestBlock{
|
|
|
- TLVList: wire.TLVList{
|
|
|
+ TLVList: []wire.TLV{
|
|
|
wire.NewTLV(wire.LoginTLVTagsScreenName, user.IdentScreenName),
|
|
|
- wire.NewTLV(wire.LoginTLVTagsReconnectHere, "127.0.0.1:1234"),
|
|
|
- wire.NewTLV(wire.LoginTLVTagsAuthorizationCookie, []byte("the-cookie")),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsErrorSubcode, wire.LoginErrInvalidPassword),
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
{
|
|
|
- name: "user logs in with invalid password--account already exists and logged in successfully",
|
|
|
+ name: "AIM account doesn't exist, login fails",
|
|
|
cfg: config.Config{
|
|
|
- OSCARHost: "127.0.0.1",
|
|
|
- BOSPort: "1234",
|
|
|
- DisableAuth: true,
|
|
|
+ OSCARHost: "127.0.0.1",
|
|
|
+ BOSPort: "1234",
|
|
|
},
|
|
|
inputSNAC: wire.FLAPSignonFrame{
|
|
|
TLVRestBlock: wire.TLVRestBlock{
|
|
|
TLVList: wire.TLVList{
|
|
|
- wire.NewTLV(wire.LoginTLVTagsPasswordHash, []byte("bad-roasted-password")),
|
|
|
- wire.NewTLV(wire.LoginTLVTagsScreenName, user.IdentScreenName),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsRoastedPassword, roastedPassword),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsScreenName, []byte("non_existent_screen_name")),
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
@@ -587,45 +611,31 @@ func TestAuthService_FLAPLoginResponse(t *testing.T) {
|
|
|
userManagerParams: userManagerParams{
|
|
|
getUserParams: getUserParams{
|
|
|
{
|
|
|
- screenName: user.IdentScreenName,
|
|
|
- result: &user,
|
|
|
- },
|
|
|
- },
|
|
|
- insertUserParams: insertUserParams{
|
|
|
- {
|
|
|
- user: user,
|
|
|
- err: state.ErrDupUser,
|
|
|
+ screenName: state.NewIdentScreenName("non_existent_screen_name"),
|
|
|
+ result: nil,
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
- cookieIssuerParams: cookieIssuerParams{
|
|
|
- {
|
|
|
- data: []byte(user.IdentScreenName.String()),
|
|
|
- cookie: []byte("the-cookie"),
|
|
|
- },
|
|
|
- },
|
|
|
- },
|
|
|
- newUserFn: func(screenName state.DisplayScreenName) (state.User, error) {
|
|
|
- return user, nil
|
|
|
},
|
|
|
expectOutput: wire.TLVRestBlock{
|
|
|
- TLVList: wire.TLVList{
|
|
|
- wire.NewTLV(wire.LoginTLVTagsScreenName, user.IdentScreenName),
|
|
|
- wire.NewTLV(wire.LoginTLVTagsReconnectHere, "127.0.0.1:1234"),
|
|
|
- wire.NewTLV(wire.LoginTLVTagsAuthorizationCookie, []byte("the-cookie")),
|
|
|
+ TLVList: []wire.TLV{
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsScreenName, state.NewIdentScreenName("non_existent_screen_name")),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsErrorSubcode, wire.LoginErrInvalidUsernameOrPassword),
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
{
|
|
|
- name: "user provides invalid password--account creation fails due to user creation runtime error",
|
|
|
+ name: "ICQ account doesn't exist, login fails",
|
|
|
cfg: config.Config{
|
|
|
- DisableAuth: true,
|
|
|
+ OSCARHost: "127.0.0.1",
|
|
|
+ BOSPort: "1234",
|
|
|
},
|
|
|
inputSNAC: wire.FLAPSignonFrame{
|
|
|
TLVRestBlock: wire.TLVRestBlock{
|
|
|
TLVList: wire.TLVList{
|
|
|
- wire.NewTLV(wire.LoginTLVTagsPasswordHash, []byte("bad-roasted-password")),
|
|
|
- wire.NewTLV(wire.LoginTLVTagsScreenName, user.IdentScreenName),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsClientIdentity, "ICQ 2000b"),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsRoastedPassword, roastedPassword),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsScreenName, []byte("non_existent_uin")),
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
@@ -633,26 +643,30 @@ func TestAuthService_FLAPLoginResponse(t *testing.T) {
|
|
|
userManagerParams: userManagerParams{
|
|
|
getUserParams: getUserParams{
|
|
|
{
|
|
|
- screenName: user.IdentScreenName,
|
|
|
- result: &user,
|
|
|
+ screenName: state.NewIdentScreenName("non_existent_uin"),
|
|
|
+ result: nil,
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
- newUserFn: func(screenName state.DisplayScreenName) (state.User, error) {
|
|
|
- return user, io.EOF
|
|
|
+ expectOutput: wire.TLVRestBlock{
|
|
|
+ TLVList: []wire.TLV{
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsScreenName, state.NewIdentScreenName("non_existent_uin")),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsErrorSubcode, wire.LoginErrICQUserErr),
|
|
|
+ },
|
|
|
},
|
|
|
- wantErr: io.EOF,
|
|
|
},
|
|
|
{
|
|
|
- name: "user provides invalid password--account creation fails due to user upsert runtime error",
|
|
|
+ name: "account doesn't exist, authentication is disabled, account is created, login succeeds",
|
|
|
cfg: config.Config{
|
|
|
+ OSCARHost: "127.0.0.1",
|
|
|
+ BOSPort: "1234",
|
|
|
DisableAuth: true,
|
|
|
},
|
|
|
inputSNAC: wire.FLAPSignonFrame{
|
|
|
TLVRestBlock: wire.TLVRestBlock{
|
|
|
TLVList: wire.TLVList{
|
|
|
- wire.NewTLV(wire.LoginTLVTagsPasswordHash, []byte("bad-roasted-password")),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsRoastedPassword, roastedPassword),
|
|
|
wire.NewTLV(wire.LoginTLVTagsScreenName, user.IdentScreenName),
|
|
|
},
|
|
|
},
|
|
|
@@ -662,32 +676,51 @@ func TestAuthService_FLAPLoginResponse(t *testing.T) {
|
|
|
getUserParams: getUserParams{
|
|
|
{
|
|
|
screenName: user.IdentScreenName,
|
|
|
- result: &user,
|
|
|
+ result: nil,
|
|
|
},
|
|
|
},
|
|
|
insertUserParams: insertUserParams{
|
|
|
{
|
|
|
user: user,
|
|
|
- err: io.EOF,
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
+ cookieIssuerParams: cookieIssuerParams{
|
|
|
+ {
|
|
|
+ data: func() []byte {
|
|
|
+ loginCookie := bosCookie{
|
|
|
+ ScreenName: user.DisplayScreenName,
|
|
|
+ }
|
|
|
+ buf := &bytes.Buffer{}
|
|
|
+ assert.NoError(t, wire.MarshalBE(loginCookie, buf))
|
|
|
+ return buf.Bytes()
|
|
|
+ }(),
|
|
|
+ cookie: []byte("the-cookie"),
|
|
|
+ },
|
|
|
+ },
|
|
|
},
|
|
|
newUserFn: func(screenName state.DisplayScreenName) (state.User, error) {
|
|
|
return user, nil
|
|
|
},
|
|
|
- wantErr: io.EOF,
|
|
|
+ expectOutput: wire.TLVRestBlock{
|
|
|
+ TLVList: wire.TLVList{
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsScreenName, user.IdentScreenName),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsReconnectHere, "127.0.0.1:1234"),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsAuthorizationCookie, []byte("the-cookie")),
|
|
|
+ },
|
|
|
+ },
|
|
|
},
|
|
|
{
|
|
|
- name: "user provides invalid password and receives invalid login response",
|
|
|
+ name: "account exists, password is invalid, authentication is disabled, login succeeds",
|
|
|
cfg: config.Config{
|
|
|
- OSCARHost: "127.0.0.1",
|
|
|
- BOSPort: "1234",
|
|
|
+ OSCARHost: "127.0.0.1",
|
|
|
+ BOSPort: "1234",
|
|
|
+ DisableAuth: true,
|
|
|
},
|
|
|
inputSNAC: wire.FLAPSignonFrame{
|
|
|
TLVRestBlock: wire.TLVRestBlock{
|
|
|
TLVList: wire.TLVList{
|
|
|
- wire.NewTLV(wire.LoginTLVTagsPasswordHash, []byte("bad-roasted-password")),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsRoastedPassword, "bad-roasted-password"),
|
|
|
wire.NewTLV(wire.LoginTLVTagsScreenName, user.IdentScreenName),
|
|
|
},
|
|
|
},
|
|
|
@@ -697,15 +730,32 @@ func TestAuthService_FLAPLoginResponse(t *testing.T) {
|
|
|
getUserParams: getUserParams{
|
|
|
{
|
|
|
screenName: user.IdentScreenName,
|
|
|
- result: nil,
|
|
|
+ result: &user,
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
+ cookieIssuerParams: cookieIssuerParams{
|
|
|
+ {
|
|
|
+ data: func() []byte {
|
|
|
+ loginCookie := bosCookie{
|
|
|
+ ScreenName: user.DisplayScreenName,
|
|
|
+ }
|
|
|
+ buf := &bytes.Buffer{}
|
|
|
+ assert.NoError(t, wire.MarshalBE(loginCookie, buf))
|
|
|
+ return buf.Bytes()
|
|
|
+ }(),
|
|
|
+ cookie: []byte("the-cookie"),
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ newUserFn: func(screenName state.DisplayScreenName) (state.User, error) {
|
|
|
+ return user, nil
|
|
|
},
|
|
|
expectOutput: wire.TLVRestBlock{
|
|
|
TLVList: wire.TLVList{
|
|
|
wire.NewTLV(wire.LoginTLVTagsScreenName, user.IdentScreenName),
|
|
|
- wire.NewTLV(wire.LoginTLVTagsErrorSubcode, uint16(0x01)),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsReconnectHere, "127.0.0.1:1234"),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsAuthorizationCookie, []byte("the-cookie")),
|
|
|
},
|
|
|
},
|
|
|
},
|
|
|
@@ -714,7 +764,7 @@ func TestAuthService_FLAPLoginResponse(t *testing.T) {
|
|
|
inputSNAC: wire.FLAPSignonFrame{
|
|
|
TLVRestBlock: wire.TLVRestBlock{
|
|
|
TLVList: wire.TLVList{
|
|
|
- wire.NewTLV(wire.LoginTLVTagsPasswordHash, user.StrongMD5Pass),
|
|
|
+ wire.NewTLV(wire.LoginTLVTagsRoastedPassword, roastedPassword),
|
|
|
wire.NewTLV(wire.LoginTLVTagsScreenName, user.IdentScreenName),
|
|
|
},
|
|
|
},
|
|
|
@@ -972,12 +1022,16 @@ func TestAuthService_RegisterBOSSession_HappyPath(t *testing.T) {
|
|
|
AddSession(sess.DisplayScreenName()).
|
|
|
Return(sess)
|
|
|
|
|
|
- authCookie := []byte(`the-auth-cookie`)
|
|
|
+ authCookie := bosCookie{
|
|
|
+ ScreenName: sess.DisplayScreenName(),
|
|
|
+ }
|
|
|
+ cookieBuf := &bytes.Buffer{}
|
|
|
+ assert.NoError(t, wire.MarshalBE(authCookie, cookieBuf))
|
|
|
|
|
|
cookieBaker := newMockCookieBaker(t)
|
|
|
cookieBaker.EXPECT().
|
|
|
- Crack(authCookie).
|
|
|
- Return([]byte("screen-name"), nil)
|
|
|
+ Crack(cookieBuf.Bytes()).
|
|
|
+ Return(cookieBuf.Bytes(), nil)
|
|
|
|
|
|
userManager := newMockUserManager(t)
|
|
|
userManager.EXPECT().
|
|
|
@@ -991,7 +1045,7 @@ func TestAuthService_RegisterBOSSession_HappyPath(t *testing.T) {
|
|
|
|
|
|
svc := NewAuthService(config.Config{}, sessionManager, nil, userManager, nil, cookieBaker, nil, nil, nil, accountManager)
|
|
|
|
|
|
- have, err := svc.RegisterBOSSession(authCookie)
|
|
|
+ have, err := svc.RegisterBOSSession(cookieBuf.Bytes())
|
|
|
assert.NoError(t, err)
|
|
|
assert.Equal(t, sess, have)
|
|
|
}
|