4
0
Эх сурвалжийг харах

move SQLite feedbag store to user package

Mike 2 жил өмнө
parent
commit
b0c17ca2c9

+ 1 - 1
cmd/main.go

@@ -18,7 +18,7 @@ func main() {
 		os.Exit(1)
 		os.Exit(1)
 	}
 	}
 
 
-	fm, err := server.NewFeedbagStore(cfg.DBPath)
+	fm, err := user.NewSQLiteFeedbagStore(cfg.DBPath)
 	if err != nil {
 	if err != nil {
 		_, _ = fmt.Fprintf(os.Stderr, "unable to create feedbag store: %s", err.Error())
 		_, _ = fmt.Fprintf(os.Stderr, "unable to create feedbag store: %s", err.Error())
 		os.Exit(1)
 		os.Exit(1)

+ 3 - 3
server/bucp.go

@@ -28,7 +28,7 @@ func routeBUCP(context.Context) error {
 	return ErrUnsupportedSubGroup
 	return ErrUnsupportedSubGroup
 }
 }
 
 
-func ReceiveAndSendAuthChallenge(cfg Config, fm *FeedbagStore, r io.Reader, w io.Writer, sequence *uint32, newUUID func() uuid.UUID) error {
+func ReceiveAndSendAuthChallenge(cfg Config, fm *user.SQLiteFeedbagStore, r io.Reader, w io.Writer, sequence *uint32, newUUID func() uuid.UUID) error {
 	flap := oscar.FlapFrame{}
 	flap := oscar.FlapFrame{}
 	if err := oscar.Unmarshal(&flap, r); err != nil {
 	if err := oscar.Unmarshal(&flap, r); err != nil {
 		return err
 		return err
@@ -85,7 +85,7 @@ func ReceiveAndSendAuthChallenge(cfg Config, fm *FeedbagStore, r io.Reader, w io
 	return writeOutSNAC(snac, snacFrameOut, snacPayloadOut, sequence, w)
 	return writeOutSNAC(snac, snacFrameOut, snacPayloadOut, sequence, w)
 }
 }
 
 
-func ReceiveAndSendBUCPLoginRequest(cfg Config, sm SessionManager, fm *FeedbagStore, r io.Reader, w io.Writer, sequence *uint32, newUUID func() uuid.UUID) error {
+func ReceiveAndSendBUCPLoginRequest(cfg Config, sm SessionManager, fm *user.SQLiteFeedbagStore, r io.Reader, w io.Writer, sequence *uint32, newUUID func() uuid.UUID) error {
 	flap := oscar.FlapFrame{}
 	flap := oscar.FlapFrame{}
 	if err := oscar.Unmarshal(&flap, r); err != nil {
 	if err := oscar.Unmarshal(&flap, r); err != nil {
 		return err
 		return err
@@ -124,7 +124,7 @@ func ReceiveAndSendBUCPLoginRequest(cfg Config, sm SessionManager, fm *FeedbagSt
 		loginOK = true
 		loginOK = true
 	case cfg.DisableAuth:
 	case cfg.DisableAuth:
 		// login failed but let them in anyway
 		// login failed but let them in anyway
-		newUser, err := NewStubUser(screenName)
+		newUser, err := user.NewStubUser(screenName)
 		if err != nil {
 		if err != nil {
 			return err
 			return err
 		}
 		}

+ 8 - 8
server/bucp_test.go

@@ -12,7 +12,7 @@ import (
 )
 )
 
 
 func TestReceiveAndSendBUCPLoginRequest(t *testing.T) {
 func TestReceiveAndSendBUCPLoginRequest(t *testing.T) {
-	userGoodPwd := User{
+	userGoodPwd := user.User{
 		ScreenName: "sn_user_a",
 		ScreenName: "sn_user_a",
 		AuthKey:    "auth_key_user",
 		AuthKey:    "auth_key_user",
 	}
 	}
@@ -23,7 +23,7 @@ func TestReceiveAndSendBUCPLoginRequest(t *testing.T) {
 	cases := []struct {
 	cases := []struct {
 		name            string
 		name            string
 		cfg             Config
 		cfg             Config
-		userInDB        User
+		userInDB        user.User
 		sessionUUID     uuid.UUID
 		sessionUUID     uuid.UUID
 		inputSNAC       oscar.SNAC_0x17_0x02_BUCPLoginRequest
 		inputSNAC       oscar.SNAC_0x17_0x02_BUCPLoginRequest
 		expectSnacFrame oscar.SnacFrame
 		expectSnacFrame oscar.SnacFrame
@@ -130,7 +130,7 @@ func TestReceiveAndSendBUCPLoginRequest(t *testing.T) {
 			defer func() {
 			defer func() {
 				assert.NoError(t, os.Remove(testFile))
 				assert.NoError(t, os.Remove(testFile))
 			}()
 			}()
-			fs, err := NewFeedbagStore(testFile)
+			fs, err := user.NewSQLiteFeedbagStore(testFile)
 			if err != nil {
 			if err != nil {
 				assert.NoError(t, err)
 				assert.NoError(t, err)
 			}
 			}
@@ -173,7 +173,7 @@ func TestReceiveAndSendAuthChallenge(t *testing.T) {
 	cases := []struct {
 	cases := []struct {
 		name            string
 		name            string
 		cfg             Config
 		cfg             Config
-		userInDB        User
+		userInDB        user.User
 		fnNewUUID       uuid.UUID
 		fnNewUUID       uuid.UUID
 		inputSNAC       oscar.SNAC_0x17_0x06_BUCPChallengeRequest
 		inputSNAC       oscar.SNAC_0x17_0x06_BUCPChallengeRequest
 		expectSnacFrame oscar.SnacFrame
 		expectSnacFrame oscar.SnacFrame
@@ -185,7 +185,7 @@ func TestReceiveAndSendAuthChallenge(t *testing.T) {
 				OSCARHost: "127.0.0.1",
 				OSCARHost: "127.0.0.1",
 				BOSPort:   1234,
 				BOSPort:   1234,
 			},
 			},
-			userInDB: User{
+			userInDB: user.User{
 				ScreenName: "sn_user_a",
 				ScreenName: "sn_user_a",
 				AuthKey:    "auth_key_user_a",
 				AuthKey:    "auth_key_user_a",
 			},
 			},
@@ -212,7 +212,7 @@ func TestReceiveAndSendAuthChallenge(t *testing.T) {
 				BOSPort:     1234,
 				BOSPort:     1234,
 				DisableAuth: true,
 				DisableAuth: true,
 			},
 			},
-			userInDB: User{
+			userInDB: user.User{
 				ScreenName: "sn_user_a",
 				ScreenName: "sn_user_a",
 				AuthKey:    "auth_key_user_a",
 				AuthKey:    "auth_key_user_a",
 			},
 			},
@@ -238,7 +238,7 @@ func TestReceiveAndSendAuthChallenge(t *testing.T) {
 				OSCARHost: "127.0.0.1",
 				OSCARHost: "127.0.0.1",
 				BOSPort:   1234,
 				BOSPort:   1234,
 			},
 			},
-			userInDB: User{
+			userInDB: user.User{
 				ScreenName: "sn_user_a",
 				ScreenName: "sn_user_a",
 				AuthKey:    "auth_key_user_a",
 				AuthKey:    "auth_key_user_a",
 			},
 			},
@@ -273,7 +273,7 @@ func TestReceiveAndSendAuthChallenge(t *testing.T) {
 			defer func() {
 			defer func() {
 				assert.NoError(t, os.Remove(testFile))
 				assert.NoError(t, os.Remove(testFile))
 			}()
 			}()
-			fs, err := NewFeedbagStore(testFile)
+			fs, err := user.NewSQLiteFeedbagStore(testFile)
 			if err != nil {
 			if err != nil {
 				assert.NoError(t, err)
 				assert.NoError(t, err)
 			}
 			}

+ 2 - 2
server/connection.go

@@ -159,7 +159,7 @@ func HandleChatConnection(ctx context.Context, cr *ChatRegistry, rw io.ReadWrite
 	dispatchIncomingMessages(ctx, chatSess, seq, rw, logger, fnClientReqHandler, fnAlertHandler)
 	dispatchIncomingMessages(ctx, chatSess, seq, rw, logger, fnClientReqHandler, fnAlertHandler)
 }
 }
 
 
-func HandleAuthConnection(cfg Config, sm *user.InMemorySessionManager, fm *FeedbagStore, conn net.Conn) {
+func HandleAuthConnection(cfg Config, sm *user.InMemorySessionManager, fm *user.SQLiteFeedbagStore, conn net.Conn) {
 	defer conn.Close()
 	defer conn.Close()
 	seq := uint32(100)
 	seq := uint32(100)
 	_, err := SendAndReceiveSignonFrame(conn, &seq)
 	_, err := SendAndReceiveSignonFrame(conn, &seq)
@@ -262,7 +262,7 @@ func ListenBOS(cfg Config, router BOSServiceRouter, logger *slog.Logger) {
 	}
 	}
 }
 }
 
 
-func ListenBUCPLogin(cfg Config, err error, logger *slog.Logger, sm *user.InMemorySessionManager, fm *FeedbagStore) {
+func ListenBUCPLogin(cfg Config, err error, logger *slog.Logger, sm *user.InMemorySessionManager, fm *user.SQLiteFeedbagStore) {
 	addr := Address("", cfg.OSCARPort)
 	addr := Address("", cfg.OSCARPort)
 	listener, err := net.Listen("tcp", addr)
 	listener, err := net.Listen("tcp", addr)
 	if err != nil {
 	if err != nil {

+ 9 - 7
server/feedbag_manager_mock.go

@@ -7,6 +7,8 @@ import (
 	mock "github.com/stretchr/testify/mock"
 	mock "github.com/stretchr/testify/mock"
 
 
 	time "time"
 	time "time"
+
+	user "github.com/mkaminski/goaim/user"
 )
 )
 
 
 // MockFeedbagManager is an autogenerated mock type for the FeedbagManager type
 // MockFeedbagManager is an autogenerated mock type for the FeedbagManager type
@@ -23,18 +25,18 @@ func (_m *MockFeedbagManager) EXPECT() *MockFeedbagManager_Expecter {
 }
 }
 
 
 // Blocked provides a mock function with given fields: sn1, sn2
 // Blocked provides a mock function with given fields: sn1, sn2
-func (_m *MockFeedbagManager) Blocked(sn1 string, sn2 string) (BlockedState, error) {
+func (_m *MockFeedbagManager) Blocked(sn1 string, sn2 string) (user.BlockedState, error) {
 	ret := _m.Called(sn1, sn2)
 	ret := _m.Called(sn1, sn2)
 
 
-	var r0 BlockedState
+	var r0 user.BlockedState
 	var r1 error
 	var r1 error
-	if rf, ok := ret.Get(0).(func(string, string) (BlockedState, error)); ok {
+	if rf, ok := ret.Get(0).(func(string, string) (user.BlockedState, error)); ok {
 		return rf(sn1, sn2)
 		return rf(sn1, sn2)
 	}
 	}
-	if rf, ok := ret.Get(0).(func(string, string) BlockedState); ok {
+	if rf, ok := ret.Get(0).(func(string, string) user.BlockedState); ok {
 		r0 = rf(sn1, sn2)
 		r0 = rf(sn1, sn2)
 	} else {
 	} else {
-		r0 = ret.Get(0).(BlockedState)
+		r0 = ret.Get(0).(user.BlockedState)
 	}
 	}
 
 
 	if rf, ok := ret.Get(1).(func(string, string) error); ok {
 	if rf, ok := ret.Get(1).(func(string, string) error); ok {
@@ -65,12 +67,12 @@ func (_c *MockFeedbagManager_Blocked_Call) Run(run func(sn1 string, sn2 string))
 	return _c
 	return _c
 }
 }
 
 
-func (_c *MockFeedbagManager_Blocked_Call) Return(_a0 BlockedState, _a1 error) *MockFeedbagManager_Blocked_Call {
+func (_c *MockFeedbagManager_Blocked_Call) Return(_a0 user.BlockedState, _a1 error) *MockFeedbagManager_Blocked_Call {
 	_c.Call.Return(_a0, _a1)
 	_c.Call.Return(_a0, _a1)
 	return _c
 	return _c
 }
 }
 
 
-func (_c *MockFeedbagManager_Blocked_Call) RunAndReturn(run func(string, string) (BlockedState, error)) *MockFeedbagManager_Blocked_Call {
+func (_c *MockFeedbagManager_Blocked_Call) RunAndReturn(run func(string, string) (user.BlockedState, error)) *MockFeedbagManager_Blocked_Call {
 	_c.Call.Return(run)
 	_c.Call.Return(run)
 	return _c
 	return _c
 }
 }

+ 4 - 4
server/icbm.go

@@ -115,9 +115,9 @@ func (s ICBMService) ChannelMsgToHostHandler(ctx context.Context, sess *user.Ses
 		return nil, err
 		return nil, err
 	}
 	}
 
 
-	if blocked != BlockedNo {
+	if blocked != user.BlockedNo {
 		code := oscar.ErrorCodeNotLoggedOn
 		code := oscar.ErrorCodeNotLoggedOn
-		if blocked == BlockedA {
+		if blocked == user.BlockedA {
 			code = oscar.ErrorCodeInLocalPermitDeny
 			code = oscar.ErrorCodeInLocalPermitDeny
 		}
 		}
 		return &oscar.XMessage{
 		return &oscar.XMessage{
@@ -198,7 +198,7 @@ func (s ICBMService) ClientEventHandler(ctx context.Context, sess *user.Session,
 	switch {
 	switch {
 	case err != nil:
 	case err != nil:
 		return err
 		return err
-	case blocked != BlockedNo:
+	case blocked != user.BlockedNo:
 		return nil
 		return nil
 	default:
 	default:
 		s.sm.SendToScreenName(ctx, snacPayloadIn.ScreenName, oscar.XMessage{
 		s.sm.SendToScreenName(ctx, snacPayloadIn.ScreenName, oscar.XMessage{
@@ -236,7 +236,7 @@ func (s ICBMService) EvilRequestHandler(ctx context.Context, sess *user.Session,
 	if err != nil {
 	if err != nil {
 		return oscar.XMessage{}, nil
 		return oscar.XMessage{}, nil
 	}
 	}
-	if blocked != BlockedNo {
+	if blocked != user.BlockedNo {
 		return oscar.XMessage{
 		return oscar.XMessage{
 			SnacFrame: oscar.SnacFrame{
 			SnacFrame: oscar.SnacFrame{
 				FoodGroup: oscar.ICBM,
 				FoodGroup: oscar.ICBM,

+ 15 - 15
server/icbm_test.go

@@ -15,7 +15,7 @@ func TestSendAndReceiveChannelMsgTohost(t *testing.T) {
 		// name is the unit test name
 		// name is the unit test name
 		name string
 		name string
 		// blockedState is the response to the sender/recipient block check
 		// blockedState is the response to the sender/recipient block check
-		blockedState BlockedState
+		blockedState user.BlockedState
 		// recipRetrieveErr is the error returned by the recipient session
 		// recipRetrieveErr is the error returned by the recipient session
 		// lookup
 		// lookup
 		recipRetrieveErr error
 		recipRetrieveErr error
@@ -32,7 +32,7 @@ func TestSendAndReceiveChannelMsgTohost(t *testing.T) {
 	}{
 	}{
 		{
 		{
 			name:             "transmit message from sender to recipient, ack message back to sender",
 			name:             "transmit message from sender to recipient, ack message back to sender",
-			blockedState:     BlockedNo,
+			blockedState:     user.BlockedNo,
 			senderSession:    newTestSession("sender-screen-name", sessOptWarning(10)),
 			senderSession:    newTestSession("sender-screen-name", sessOptWarning(10)),
 			recipientSession: newTestSession("recipient-screen-name", sessOptWarning(20)),
 			recipientSession: newTestSession("recipient-screen-name", sessOptWarning(20)),
 			inputSNAC: oscar.SNAC_0x04_0x06_ICBMChannelMsgToHost{
 			inputSNAC: oscar.SNAC_0x04_0x06_ICBMChannelMsgToHost{
@@ -82,7 +82,7 @@ func TestSendAndReceiveChannelMsgTohost(t *testing.T) {
 		},
 		},
 		{
 		{
 			name:             "transmit message from sender to recipient, don't ack message back to sender",
 			name:             "transmit message from sender to recipient, don't ack message back to sender",
-			blockedState:     BlockedNo,
+			blockedState:     user.BlockedNo,
 			senderSession:    newTestSession("sender-screen-name", sessOptWarning(10)),
 			senderSession:    newTestSession("sender-screen-name", sessOptWarning(10)),
 			recipientSession: newTestSession("recipient-screen-name", sessOptWarning(20)),
 			recipientSession: newTestSession("recipient-screen-name", sessOptWarning(20)),
 			inputSNAC: oscar.SNAC_0x04_0x06_ICBMChannelMsgToHost{
 			inputSNAC: oscar.SNAC_0x04_0x06_ICBMChannelMsgToHost{
@@ -115,7 +115,7 @@ func TestSendAndReceiveChannelMsgTohost(t *testing.T) {
 		},
 		},
 		{
 		{
 			name:             "don't transmit message from sender to recipient because sender has blocked recipient",
 			name:             "don't transmit message from sender to recipient because sender has blocked recipient",
-			blockedState:     BlockedA,
+			blockedState:     user.BlockedA,
 			senderSession:    newTestSession("sender-screen-name", sessOptWarning(10)),
 			senderSession:    newTestSession("sender-screen-name", sessOptWarning(10)),
 			recipientSession: newTestSession("recipient-screen-name", sessOptWarning(20)),
 			recipientSession: newTestSession("recipient-screen-name", sessOptWarning(20)),
 			inputSNAC: oscar.SNAC_0x04_0x06_ICBMChannelMsgToHost{
 			inputSNAC: oscar.SNAC_0x04_0x06_ICBMChannelMsgToHost{
@@ -141,7 +141,7 @@ func TestSendAndReceiveChannelMsgTohost(t *testing.T) {
 		},
 		},
 		{
 		{
 			name:             "don't transmit message from sender to recipient because recipient has blocked sender",
 			name:             "don't transmit message from sender to recipient because recipient has blocked sender",
-			blockedState:     BlockedB,
+			blockedState:     user.BlockedB,
 			senderSession:    newTestSession("sender-screen-name", sessOptWarning(10)),
 			senderSession:    newTestSession("sender-screen-name", sessOptWarning(10)),
 			recipientSession: newTestSession("recipient-screen-name", sessOptWarning(20)),
 			recipientSession: newTestSession("recipient-screen-name", sessOptWarning(20)),
 			inputSNAC: oscar.SNAC_0x04_0x06_ICBMChannelMsgToHost{
 			inputSNAC: oscar.SNAC_0x04_0x06_ICBMChannelMsgToHost{
@@ -167,7 +167,7 @@ func TestSendAndReceiveChannelMsgTohost(t *testing.T) {
 		},
 		},
 		{
 		{
 			name:             "don't transmit message from sender to recipient because recipient doesn't exist",
 			name:             "don't transmit message from sender to recipient because recipient doesn't exist",
-			blockedState:     BlockedNo,
+			blockedState:     user.BlockedNo,
 			senderSession:    newTestSession("sender-screen-name", sessOptWarning(10)),
 			senderSession:    newTestSession("sender-screen-name", sessOptWarning(10)),
 			recipientSession: nil,
 			recipientSession: nil,
 			inputSNAC: oscar.SNAC_0x04_0x06_ICBMChannelMsgToHost{
 			inputSNAC: oscar.SNAC_0x04_0x06_ICBMChannelMsgToHost{
@@ -235,7 +235,7 @@ func TestSendAndReceiveClientEvent(t *testing.T) {
 		// name is the unit test name
 		// name is the unit test name
 		name string
 		name string
 		// blockedState is the response to the sender/recipient block check
 		// blockedState is the response to the sender/recipient block check
-		blockedState BlockedState
+		blockedState user.BlockedState
 		// senderScreenName is the screen name of the user sending the event
 		// senderScreenName is the screen name of the user sending the event
 		senderScreenName string
 		senderScreenName string
 		// inputSNAC is the SNAC sent by the sender client
 		// inputSNAC is the SNAC sent by the sender client
@@ -246,7 +246,7 @@ func TestSendAndReceiveClientEvent(t *testing.T) {
 	}{
 	}{
 		{
 		{
 			name:             "transmit message from sender to recipient",
 			name:             "transmit message from sender to recipient",
-			blockedState:     BlockedNo,
+			blockedState:     user.BlockedNo,
 			senderScreenName: "sender-screen-name",
 			senderScreenName: "sender-screen-name",
 			inputSNAC: oscar.SNAC_0x04_0x14_ICBMClientEvent{
 			inputSNAC: oscar.SNAC_0x04_0x14_ICBMClientEvent{
 				Cookie:     [8]byte{1, 2, 3, 4, 5, 6, 7, 8},
 				Cookie:     [8]byte{1, 2, 3, 4, 5, 6, 7, 8},
@@ -269,7 +269,7 @@ func TestSendAndReceiveClientEvent(t *testing.T) {
 		},
 		},
 		{
 		{
 			name:             "don't transmit message from sender to recipient because sender has blocked recipient",
 			name:             "don't transmit message from sender to recipient because sender has blocked recipient",
-			blockedState:     BlockedA,
+			blockedState:     user.BlockedA,
 			senderScreenName: "sender-screen-name",
 			senderScreenName: "sender-screen-name",
 			inputSNAC: oscar.SNAC_0x04_0x14_ICBMClientEvent{
 			inputSNAC: oscar.SNAC_0x04_0x14_ICBMClientEvent{
 				ScreenName: "recipient-screen-name",
 				ScreenName: "recipient-screen-name",
@@ -288,7 +288,7 @@ func TestSendAndReceiveClientEvent(t *testing.T) {
 				Return(tc.blockedState, nil).
 				Return(tc.blockedState, nil).
 				Maybe()
 				Maybe()
 			sm := NewMockSessionManager(t)
 			sm := NewMockSessionManager(t)
-			if tc.blockedState == BlockedNo {
+			if tc.blockedState == user.BlockedNo {
 				sm.EXPECT().
 				sm.EXPECT().
 					SendToScreenName(mock.Anything, tc.inputSNAC.ScreenName, tc.expectSNACToClient)
 					SendToScreenName(mock.Anything, tc.inputSNAC.ScreenName, tc.expectSNACToClient)
 			}
 			}
@@ -310,7 +310,7 @@ func TestSendAndReceiveEvilRequest(t *testing.T) {
 		// name is the unit test name
 		// name is the unit test name
 		name string
 		name string
 		// blockedState is the response to the sender/recipient block check
 		// blockedState is the response to the sender/recipient block check
-		blockedState BlockedState
+		blockedState user.BlockedState
 		// recipRetrieveErr is the error returned by the recipient session
 		// recipRetrieveErr is the error returned by the recipient session
 		// lookup
 		// lookup
 		recipRetrieveErr error
 		recipRetrieveErr error
@@ -332,7 +332,7 @@ func TestSendAndReceiveEvilRequest(t *testing.T) {
 	}{
 	}{
 		{
 		{
 			name:                "transmit anonymous warning from sender to recipient",
 			name:                "transmit anonymous warning from sender to recipient",
-			blockedState:        BlockedNo,
+			blockedState:        user.BlockedNo,
 			senderSession:       newTestSession("sender-screen-name"),
 			senderSession:       newTestSession("sender-screen-name"),
 			recipientScreenName: "recipient-screen-name",
 			recipientScreenName: "recipient-screen-name",
 			broadcastMessage: oscar.XMessage{
 			broadcastMessage: oscar.XMessage{
@@ -377,7 +377,7 @@ func TestSendAndReceiveEvilRequest(t *testing.T) {
 		},
 		},
 		{
 		{
 			name:                "transmit non-anonymous warning from sender to recipient",
 			name:                "transmit non-anonymous warning from sender to recipient",
-			blockedState:        BlockedNo,
+			blockedState:        user.BlockedNo,
 			senderSession:       newTestSession("sender-screen-name"),
 			senderSession:       newTestSession("sender-screen-name"),
 			recipientScreenName: "recipient-screen-name",
 			recipientScreenName: "recipient-screen-name",
 			recipientBuddies:    []string{"buddy1", "buddy2"},
 			recipientBuddies:    []string{"buddy1", "buddy2"},
@@ -426,7 +426,7 @@ func TestSendAndReceiveEvilRequest(t *testing.T) {
 		},
 		},
 		{
 		{
 			name:                "don't transmit non-anonymous warning from sender to recipient because sender has blocked recipient",
 			name:                "don't transmit non-anonymous warning from sender to recipient because sender has blocked recipient",
-			blockedState:        BlockedA,
+			blockedState:        user.BlockedA,
 			senderSession:       newTestSession("sender-screen-name"),
 			senderSession:       newTestSession("sender-screen-name"),
 			recipientScreenName: "recipient-screen-name",
 			recipientScreenName: "recipient-screen-name",
 			recipientBuddies:    []string{"buddy1", "buddy2"},
 			recipientBuddies:    []string{"buddy1", "buddy2"},
@@ -446,7 +446,7 @@ func TestSendAndReceiveEvilRequest(t *testing.T) {
 		},
 		},
 		{
 		{
 			name:                "don't transmit non-anonymous warning from sender to recipient because recipient has blocked sender",
 			name:                "don't transmit non-anonymous warning from sender to recipient because recipient has blocked sender",
-			blockedState:        BlockedB,
+			blockedState:        user.BlockedB,
 			senderSession:       newTestSession("sender-screen-name"),
 			senderSession:       newTestSession("sender-screen-name"),
 			recipientScreenName: "recipient-screen-name",
 			recipientScreenName: "recipient-screen-name",
 			recipientBuddies:    []string{"buddy1", "buddy2"},
 			recipientBuddies:    []string{"buddy1", "buddy2"},

+ 1 - 1
server/locate.go

@@ -133,7 +133,7 @@ func (s LocateService) UserInfoQuery2Handler(_ context.Context, sess *user.Sessi
 	switch {
 	switch {
 	case err != nil:
 	case err != nil:
 		return oscar.XMessage{}, err
 		return oscar.XMessage{}, err
-	case blocked != BlockedNo:
+	case blocked != user.BlockedNo:
 		return oscar.XMessage{
 		return oscar.XMessage{
 			SnacFrame: oscar.SnacFrame{
 			SnacFrame: oscar.SnacFrame{
 				FoodGroup: oscar.LOCATE,
 				FoodGroup: oscar.LOCATE,

+ 7 - 7
server/locate_test.go

@@ -15,7 +15,7 @@ func TestSendAndReceiveUserInfoQuery2(t *testing.T) {
 		// name is the unit test name
 		// name is the unit test name
 		name string
 		name string
 		// blockedState is the response to the sender/recipient block check
 		// blockedState is the response to the sender/recipient block check
-		blockedState BlockedState
+		blockedState user.BlockedState
 		// screenNameLookups is the list of user session lookups
 		// screenNameLookups is the list of user session lookups
 		screenNameLookups map[string]struct {
 		screenNameLookups map[string]struct {
 			sess *user.Session
 			sess *user.Session
@@ -34,7 +34,7 @@ func TestSendAndReceiveUserInfoQuery2(t *testing.T) {
 	}{
 	}{
 		{
 		{
 			name:         "request user info, expect user info response",
 			name:         "request user info, expect user info response",
-			blockedState: BlockedNo,
+			blockedState: user.BlockedNo,
 			screenNameLookups: map[string]struct {
 			screenNameLookups: map[string]struct {
 				sess *user.Session
 				sess *user.Session
 				err  error
 				err  error
@@ -66,7 +66,7 @@ func TestSendAndReceiveUserInfoQuery2(t *testing.T) {
 		},
 		},
 		{
 		{
 			name:         "request user info + profile, expect user info response + profile",
 			name:         "request user info + profile, expect user info response + profile",
-			blockedState: BlockedNo,
+			blockedState: user.BlockedNo,
 			screenNameLookups: map[string]struct {
 			screenNameLookups: map[string]struct {
 				sess *user.Session
 				sess *user.Session
 				err  error
 				err  error
@@ -112,7 +112,7 @@ func TestSendAndReceiveUserInfoQuery2(t *testing.T) {
 		},
 		},
 		{
 		{
 			name:         "request user info + profile, expect user info response + profile",
 			name:         "request user info + profile, expect user info response + profile",
-			blockedState: BlockedNo,
+			blockedState: user.BlockedNo,
 			screenNameLookups: map[string]struct {
 			screenNameLookups: map[string]struct {
 				sess *user.Session
 				sess *user.Session
 				err  error
 				err  error
@@ -158,7 +158,7 @@ func TestSendAndReceiveUserInfoQuery2(t *testing.T) {
 		},
 		},
 		{
 		{
 			name:         "request user info + away message, expect user info response + away message",
 			name:         "request user info + away message, expect user info response + away message",
-			blockedState: BlockedNo,
+			blockedState: user.BlockedNo,
 			screenNameLookups: map[string]struct {
 			screenNameLookups: map[string]struct {
 				sess *user.Session
 				sess *user.Session
 				err  error
 				err  error
@@ -196,7 +196,7 @@ func TestSendAndReceiveUserInfoQuery2(t *testing.T) {
 		},
 		},
 		{
 		{
 			name:         "request user info of user who blocked requester, expect not logged in error",
 			name:         "request user info of user who blocked requester, expect not logged in error",
-			blockedState: BlockedB,
+			blockedState: user.BlockedB,
 			userSession:  newTestSession("user_screen_name"),
 			userSession:  newTestSession("user_screen_name"),
 			inputSNAC: oscar.SNAC_0x02_0x15_LocateUserInfoQuery2{
 			inputSNAC: oscar.SNAC_0x02_0x15_LocateUserInfoQuery2{
 				ScreenName: "requested-user",
 				ScreenName: "requested-user",
@@ -213,7 +213,7 @@ func TestSendAndReceiveUserInfoQuery2(t *testing.T) {
 		},
 		},
 		{
 		{
 			name:         "request user info of user who does not exist, expect not logged in error",
 			name:         "request user info of user who does not exist, expect not logged in error",
-			blockedState: BlockedNo,
+			blockedState: user.BlockedNo,
 			screenNameLookups: map[string]struct {
 			screenNameLookups: map[string]struct {
 				sess *user.Session
 				sess *user.Session
 				err  error
 				err  error

+ 5 - 4
server/mgmt_api.go

@@ -3,6 +3,7 @@ package server
 import (
 import (
 	"encoding/json"
 	"encoding/json"
 	"fmt"
 	"fmt"
+	"github.com/mkaminski/goaim/user"
 	"log/slog"
 	"log/slog"
 	"net"
 	"net"
 	"net/http"
 	"net/http"
@@ -11,7 +12,7 @@ import (
 	"github.com/google/uuid"
 	"github.com/google/uuid"
 )
 )
 
 
-func StartManagementAPI(fs *FeedbagStore, logger *slog.Logger) {
+func StartManagementAPI(fs *user.SQLiteFeedbagStore, logger *slog.Logger) {
 	http.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) {
 	http.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) {
 		switch r.Method {
 		switch r.Method {
 		case http.MethodGet:
 		case http.MethodGet:
@@ -37,7 +38,7 @@ func StartManagementAPI(fs *FeedbagStore, logger *slog.Logger) {
 }
 }
 
 
 // getUsers handles the GET /user endpoint.
 // getUsers handles the GET /user endpoint.
-func getUsers(fs *FeedbagStore, w http.ResponseWriter, r *http.Request) {
+func getUsers(fs *user.SQLiteFeedbagStore, w http.ResponseWriter, r *http.Request) {
 	w.Header().Set("Content-Type", "application/json")
 	w.Header().Set("Content-Type", "application/json")
 	users, err := fs.Users()
 	users, err := fs.Users()
 	if err != nil {
 	if err != nil {
@@ -51,12 +52,12 @@ func getUsers(fs *FeedbagStore, w http.ResponseWriter, r *http.Request) {
 }
 }
 
 
 type CreateUser struct {
 type CreateUser struct {
-	User
+	user.User
 	Password string `json:"password,omitempty"`
 	Password string `json:"password,omitempty"`
 }
 }
 
 
 // createUser handles the POST /user endpoint.
 // createUser handles the POST /user endpoint.
-func createUser(fs *FeedbagStore, w http.ResponseWriter, r *http.Request) {
+func createUser(fs *user.SQLiteFeedbagStore, w http.ResponseWriter, r *http.Request) {
 	var newUser CreateUser
 	var newUser CreateUser
 	if err := json.NewDecoder(r.Body).Decode(&newUser); err != nil {
 	if err := json.NewDecoder(r.Body).Decode(&newUser); err != nil {
 		http.Error(w, err.Error(), http.StatusBadRequest)
 		http.Error(w, err.Error(), http.StatusBadRequest)

+ 36 - 0
server/types.go

@@ -0,0 +1,36 @@
+package server
+
+import (
+	"context"
+	"github.com/mkaminski/goaim/oscar"
+	"github.com/mkaminski/goaim/user"
+	"time"
+)
+
+type FeedbagManager interface {
+	Blocked(sn1, sn2 string) (user.BlockedState, error)
+	Buddies(screenName string) ([]string, error)
+	Delete(screenName string, items []oscar.FeedbagItem) error
+	InterestedUsers(screenName string) ([]string, error)
+	LastModified(screenName string) (time.Time, error)
+	Retrieve(screenName string) ([]oscar.FeedbagItem, error)
+	Upsert(screenName string, items []oscar.FeedbagItem) error
+}
+
+type SessionManager interface {
+	Broadcast(ctx context.Context, msg oscar.XMessage)
+	BroadcastExcept(ctx context.Context, except *user.Session, msg oscar.XMessage)
+	BroadcastToScreenNames(ctx context.Context, screenNames []string, msg oscar.XMessage)
+	Empty() bool
+	NewSessionWithSN(sessID string, screenName string) *user.Session
+	Participants() []*user.Session
+	Remove(sess *user.Session)
+	Retrieve(ID string) (*user.Session, bool)
+	RetrieveByScreenName(screenName string) *user.Session
+	SendToScreenName(ctx context.Context, screenName string, msg oscar.XMessage)
+}
+
+type ProfileManager interface {
+	RetrieveProfile(screenName string) (string, error)
+	UpsertProfile(screenName string, body string) error
+}

+ 25 - 55
server/feedbag_store.go → user/feedbag_store.go

@@ -1,8 +1,7 @@
-package server
+package user
 
 
 import (
 import (
 	"bytes"
 	"bytes"
-	"context"
 	"crypto/md5"
 	"crypto/md5"
 	"database/sql"
 	"database/sql"
 	"errors"
 	"errors"
@@ -12,7 +11,6 @@ import (
 	"github.com/google/uuid"
 	"github.com/google/uuid"
 	_ "github.com/mattn/go-sqlite3"
 	_ "github.com/mattn/go-sqlite3"
 	"github.com/mkaminski/goaim/oscar"
 	"github.com/mkaminski/goaim/oscar"
-	"github.com/mkaminski/goaim/user"
 )
 )
 
 
 var feedbagDDL = `
 var feedbagDDL = `
@@ -40,7 +38,15 @@ var feedbagDDL = `
 	);
 	);
 `
 `
 
 
-func NewFeedbagStore(dbFile string) (*FeedbagStore, error) {
+type BlockedState int
+
+const (
+	BlockedNo BlockedState = iota
+	BlockedA
+	BlockedB
+)
+
+func NewSQLiteFeedbagStore(dbFile string) (*SQLiteFeedbagStore, error) {
 	db, err := sql.Open("sqlite3", dbFile)
 	db, err := sql.Open("sqlite3", dbFile)
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
@@ -48,7 +54,7 @@ func NewFeedbagStore(dbFile string) (*FeedbagStore, error) {
 	if _, err := db.Exec(feedbagDDL); err != nil {
 	if _, err := db.Exec(feedbagDDL); err != nil {
 		return nil, err
 		return nil, err
 	}
 	}
-	return &FeedbagStore{db: db}, nil
+	return &SQLiteFeedbagStore{db: db}, nil
 }
 }
 
 
 func NewStubUser(screenName string) (User, error) {
 func NewStubUser(screenName string) (User, error) {
@@ -91,11 +97,11 @@ func (u *User) HashPassword(passwd string) error {
 	return nil
 	return nil
 }
 }
 
 
-type FeedbagStore struct {
+type SQLiteFeedbagStore struct {
 	db *sql.DB
 	db *sql.DB
 }
 }
 
 
-func (f *FeedbagStore) Users() ([]*User, error) {
+func (f *SQLiteFeedbagStore) Users() ([]*User, error) {
 	q := `SELECT ScreenName FROM user`
 	q := `SELECT ScreenName FROM user`
 	rows, err := f.db.Query(q)
 	rows, err := f.db.Query(q)
 	if err != nil {
 	if err != nil {
@@ -119,7 +125,7 @@ func (f *FeedbagStore) Users() ([]*User, error) {
 	return users, nil
 	return users, nil
 }
 }
 
 
-func (f *FeedbagStore) GetUser(screenName string) (*User, error) {
+func (f *SQLiteFeedbagStore) GetUser(screenName string) (*User, error) {
 	q := `
 	q := `
 		SELECT 
 		SELECT 
 			ScreenName, 
 			ScreenName, 
@@ -136,7 +142,7 @@ func (f *FeedbagStore) GetUser(screenName string) (*User, error) {
 	return u, err
 	return u, err
 }
 }
 
 
-func (f *FeedbagStore) InsertUser(u User) error {
+func (f *SQLiteFeedbagStore) InsertUser(u User) error {
 	q := `
 	q := `
 		INSERT INTO user (ScreenName, authKey, passHash)
 		INSERT INTO user (ScreenName, authKey, passHash)
 		VALUES (?, ?, ?)
 		VALUES (?, ?, ?)
@@ -145,7 +151,7 @@ func (f *FeedbagStore) InsertUser(u User) error {
 	return err
 	return err
 }
 }
 
 
-func (f *FeedbagStore) UpsertUser(u User) error {
+func (f *SQLiteFeedbagStore) UpsertUser(u User) error {
 	q := `
 	q := `
 		INSERT INTO user (ScreenName, authKey, passHash)
 		INSERT INTO user (ScreenName, authKey, passHash)
 		VALUES (?, ?, ?)
 		VALUES (?, ?, ?)
@@ -155,7 +161,7 @@ func (f *FeedbagStore) UpsertUser(u User) error {
 	return err
 	return err
 }
 }
 
 
-func (f *FeedbagStore) Delete(screenName string, items []oscar.FeedbagItem) error {
+func (f *SQLiteFeedbagStore) Delete(screenName string, items []oscar.FeedbagItem) error {
 	// todo add transaction
 	// todo add transaction
 	q := `DELETE FROM feedbag WHERE ScreenName = ? AND itemID = ?`
 	q := `DELETE FROM feedbag WHERE ScreenName = ? AND itemID = ?`
 
 
@@ -168,7 +174,7 @@ func (f *FeedbagStore) Delete(screenName string, items []oscar.FeedbagItem) erro
 	return nil
 	return nil
 }
 }
 
 
-func (f *FeedbagStore) Retrieve(screenName string) ([]oscar.FeedbagItem, error) {
+func (f *SQLiteFeedbagStore) Retrieve(screenName string) ([]oscar.FeedbagItem, error) {
 	q := `
 	q := `
 		SELECT 
 		SELECT 
 			groupID,
 			groupID,
@@ -203,14 +209,14 @@ func (f *FeedbagStore) Retrieve(screenName string) ([]oscar.FeedbagItem, error)
 	return items, nil
 	return items, nil
 }
 }
 
 
-func (f *FeedbagStore) LastModified(screenName string) (time.Time, error) {
+func (f *SQLiteFeedbagStore) LastModified(screenName string) (time.Time, error) {
 	var lastModified sql.NullInt64
 	var lastModified sql.NullInt64
 	q := `SELECT MAX(lastModified) FROM feedbag WHERE ScreenName = ?`
 	q := `SELECT MAX(lastModified) FROM feedbag WHERE ScreenName = ?`
 	err := f.db.QueryRow(q, screenName).Scan(&lastModified)
 	err := f.db.QueryRow(q, screenName).Scan(&lastModified)
 	return time.Unix(lastModified.Int64, 0), err
 	return time.Unix(lastModified.Int64, 0), err
 }
 }
 
 
-func (f *FeedbagStore) Upsert(screenName string, items []oscar.FeedbagItem) error {
+func (f *SQLiteFeedbagStore) Upsert(screenName string, items []oscar.FeedbagItem) error {
 
 
 	q := `
 	q := `
 		INSERT INTO feedbag (ScreenName, groupID, itemID, classID, name, attributes, lastModified)
 		INSERT INTO feedbag (ScreenName, groupID, itemID, classID, name, attributes, lastModified)
@@ -246,7 +252,7 @@ func (f *FeedbagStore) Upsert(screenName string, items []oscar.FeedbagItem) erro
 
 
 // InterestedUsers returns all users who have screenName in their buddy list.
 // InterestedUsers returns all users who have screenName in their buddy list.
 // Exclude users who are on screenName's block list.
 // Exclude users who are on screenName's block list.
-func (f *FeedbagStore) InterestedUsers(screenName string) ([]string, error) {
+func (f *SQLiteFeedbagStore) InterestedUsers(screenName string) ([]string, error) {
 	q := `
 	q := `
 		SELECT f.ScreenName
 		SELECT f.ScreenName
 		FROM feedbag f
 		FROM feedbag f
@@ -278,7 +284,7 @@ func (f *FeedbagStore) InterestedUsers(screenName string) ([]string, error) {
 
 
 // Buddies returns all user's buddies. Don't return a buddy if screenName
 // Buddies returns all user's buddies. Don't return a buddy if screenName
 // blocked them.
 // blocked them.
-func (f *FeedbagStore) Buddies(screenName string) ([]string, error) {
+func (f *SQLiteFeedbagStore) Buddies(screenName string) ([]string, error) {
 	q := `
 	q := `
 		SELECT f.name
 		SELECT f.name
 		FROM feedbag f
 		FROM feedbag f
@@ -307,18 +313,10 @@ func (f *FeedbagStore) Buddies(screenName string) ([]string, error) {
 	return items, nil
 	return items, nil
 }
 }
 
 
-type BlockedState int
-
-const (
-	BlockedNo BlockedState = iota
-	BlockedA
-	BlockedB
-)
-
 // Blocked informs whether there is a blocking relationship between sn1 and
 // Blocked informs whether there is a blocking relationship between sn1 and
 // sn2. Return BlockedA if sn1 blocked sn2, BlockedB if sn2 blocked sn1, or
 // sn2. Return BlockedA if sn1 blocked sn2, BlockedB if sn2 blocked sn1, or
 // BlockedNo if neither screen name blocked the other.
 // BlockedNo if neither screen name blocked the other.
-func (f *FeedbagStore) Blocked(sn1, sn2 string) (BlockedState, error) {
+func (f *SQLiteFeedbagStore) Blocked(sn1, sn2 string) (BlockedState, error) {
 	q := `
 	q := `
 		SELECT EXISTS(SELECT 1
 		SELECT EXISTS(SELECT 1
 					  FROM feedbag f
 					  FROM feedbag f
@@ -365,7 +363,7 @@ func (f *FeedbagStore) Blocked(sn1, sn2 string) (BlockedState, error) {
 
 
 // RetrieveProfile fetches a user profile. Return empty string if the user
 // RetrieveProfile fetches a user profile. Return empty string if the user
 // does not exist or has no profile.
 // does not exist or has no profile.
-func (f *FeedbagStore) RetrieveProfile(screenName string) (string, error) {
+func (f *SQLiteFeedbagStore) RetrieveProfile(screenName string) (string, error) {
 	q := `
 	q := `
 		SELECT IFNULL(body, '')
 		SELECT IFNULL(body, '')
 		FROM profile
 		FROM profile
@@ -379,7 +377,7 @@ func (f *FeedbagStore) RetrieveProfile(screenName string) (string, error) {
 	return profile, nil
 	return profile, nil
 }
 }
 
 
-func (f *FeedbagStore) UpsertProfile(screenName string, body string) error {
+func (f *SQLiteFeedbagStore) UpsertProfile(screenName string, body string) error {
 	q := `
 	q := `
 		INSERT INTO profile (ScreenName, body)
 		INSERT INTO profile (ScreenName, body)
 		VALUES (?, ?)
 		VALUES (?, ?)
@@ -389,31 +387,3 @@ func (f *FeedbagStore) UpsertProfile(screenName string, body string) error {
 	_, err := f.db.Exec(q, screenName, body)
 	_, err := f.db.Exec(q, screenName, body)
 	return err
 	return err
 }
 }
-
-type FeedbagManager interface {
-	Blocked(sn1, sn2 string) (BlockedState, error)
-	Buddies(screenName string) ([]string, error)
-	Delete(screenName string, items []oscar.FeedbagItem) error
-	InterestedUsers(screenName string) ([]string, error)
-	LastModified(screenName string) (time.Time, error)
-	Retrieve(screenName string) ([]oscar.FeedbagItem, error)
-	Upsert(screenName string, items []oscar.FeedbagItem) error
-}
-
-type SessionManager interface {
-	BroadcastToScreenNames(ctx context.Context, screenNames []string, msg oscar.XMessage)
-	Empty() bool
-	NewSessionWithSN(sessID string, screenName string) *user.Session
-	Remove(sess *user.Session)
-	Retrieve(ID string) (*user.Session, bool)
-	RetrieveByScreenName(screenName string) *user.Session
-	SendToScreenName(ctx context.Context, screenName string, msg oscar.XMessage)
-	Broadcast(ctx context.Context, msg oscar.XMessage)
-	BroadcastExcept(ctx context.Context, except *user.Session, msg oscar.XMessage)
-	Participants() []*user.Session
-}
-
-type ProfileManager interface {
-	RetrieveProfile(screenName string) (string, error)
-	UpsertProfile(screenName string, body string) error
-}

+ 17 - 16
server/feedbag_store_test.go → user/feedbag_store_test.go

@@ -1,11 +1,12 @@
-package server
+package user
 
 
 import (
 import (
-	"github.com/mkaminski/goaim/oscar"
-	"github.com/stretchr/testify/assert"
 	"os"
 	"os"
 	"reflect"
 	"reflect"
 	"testing"
 	"testing"
+
+	"github.com/mkaminski/goaim/oscar"
+	"github.com/stretchr/testify/assert"
 )
 )
 
 
 func TestFeedbagStore(t *testing.T) {
 func TestFeedbagStore(t *testing.T) {
@@ -20,7 +21,7 @@ func TestFeedbagStore(t *testing.T) {
 		}
 		}
 	}()
 	}()
 
 
-	f, err := NewFeedbagStore(testFile)
+	f, err := NewSQLiteFeedbagStore(testFile)
 	if err != nil {
 	if err != nil {
 		t.Fatalf("failed to create new feedbag store: %s", err.Error())
 		t.Fatalf("failed to create new feedbag store: %s", err.Error())
 	}
 	}
@@ -66,7 +67,7 @@ func TestFeedbagDelete(t *testing.T) {
 		}
 		}
 	}()
 	}()
 
 
-	f, err := NewFeedbagStore(testFile)
+	f, err := NewSQLiteFeedbagStore(testFile)
 	if err != nil {
 	if err != nil {
 		t.Fatalf("failed to create new feedbag store: %s", err.Error())
 		t.Fatalf("failed to create new feedbag store: %s", err.Error())
 	}
 	}
@@ -129,7 +130,7 @@ func TestLastModifiedEmpty(t *testing.T) {
 		}
 		}
 	}()
 	}()
 
 
-	f, err := NewFeedbagStore(testFile)
+	f, err := NewSQLiteFeedbagStore(testFile)
 	if err != nil {
 	if err != nil {
 		t.Fatalf("failed to create new feedbag store: %s", err.Error())
 		t.Fatalf("failed to create new feedbag store: %s", err.Error())
 	}
 	}
@@ -153,7 +154,7 @@ func TestLastModifiedNotEmpty(t *testing.T) {
 		}
 		}
 	}()
 	}()
 
 
-	f, err := NewFeedbagStore(testFile)
+	f, err := NewSQLiteFeedbagStore(testFile)
 	if err != nil {
 	if err != nil {
 		t.Fatalf("failed to create new feedbag store: %s", err.Error())
 		t.Fatalf("failed to create new feedbag store: %s", err.Error())
 	}
 	}
@@ -189,7 +190,7 @@ func TestProfile(t *testing.T) {
 		}
 		}
 	}()
 	}()
 
 
-	f, err := NewFeedbagStore(testFile)
+	f, err := NewSQLiteFeedbagStore(testFile)
 	if err != nil {
 	if err != nil {
 		t.Fatalf("failed to create new feedbag store: %s", err.Error())
 		t.Fatalf("failed to create new feedbag store: %s", err.Error())
 	}
 	}
@@ -251,7 +252,7 @@ func TestProfileNonExistent(t *testing.T) {
 		}
 		}
 	}()
 	}()
 
 
-	f, err := NewFeedbagStore(testFile)
+	f, err := NewSQLiteFeedbagStore(testFile)
 	if err != nil {
 	if err != nil {
 		t.Fatalf("failed to create new feedbag store: %s", err.Error())
 		t.Fatalf("failed to create new feedbag store: %s", err.Error())
 	}
 	}
@@ -271,7 +272,7 @@ func TestInterestedUsers(t *testing.T) {
 		}
 		}
 	}()
 	}()
 
 
-	f, err := NewFeedbagStore(testFile)
+	f, err := NewSQLiteFeedbagStore(testFile)
 	if err != nil {
 	if err != nil {
 		t.Fatalf("failed to create new feedbag store: %s", err.Error())
 		t.Fatalf("failed to create new feedbag store: %s", err.Error())
 	}
 	}
@@ -301,7 +302,7 @@ func TestFeedbagStoreBuddiesBlockedUser(t *testing.T) {
 		}
 		}
 	}()
 	}()
 
 
-	f, err := NewFeedbagStore(testFile)
+	f, err := NewSQLiteFeedbagStore(testFile)
 	if err != nil {
 	if err != nil {
 		t.Fatalf("failed to create new feedbag store: %s", err.Error())
 		t.Fatalf("failed to create new feedbag store: %s", err.Error())
 	}
 	}
@@ -331,7 +332,7 @@ func TestFeedbagStoreBlockedA(t *testing.T) {
 		}
 		}
 	}()
 	}()
 
 
-	f, err := NewFeedbagStore(testFile)
+	f, err := NewSQLiteFeedbagStore(testFile)
 	if err != nil {
 	if err != nil {
 		t.Fatalf("failed to create new feedbag store: %s", err.Error())
 		t.Fatalf("failed to create new feedbag store: %s", err.Error())
 	}
 	}
@@ -361,7 +362,7 @@ func TestFeedbagStoreBlockedB(t *testing.T) {
 		}
 		}
 	}()
 	}()
 
 
-	f, err := NewFeedbagStore(testFile)
+	f, err := NewSQLiteFeedbagStore(testFile)
 	if err != nil {
 	if err != nil {
 		t.Fatalf("failed to create new feedbag store: %s", err.Error())
 		t.Fatalf("failed to create new feedbag store: %s", err.Error())
 	}
 	}
@@ -391,7 +392,7 @@ func TestFeedbagStoreBlockedNoBlocked(t *testing.T) {
 		}
 		}
 	}()
 	}()
 
 
-	f, err := NewFeedbagStore(testFile)
+	f, err := NewSQLiteFeedbagStore(testFile)
 	if err != nil {
 	if err != nil {
 		t.Fatalf("failed to create new feedbag store: %s", err.Error())
 		t.Fatalf("failed to create new feedbag store: %s", err.Error())
 	}
 	}
@@ -420,7 +421,7 @@ func TestGetUser(t *testing.T) {
 		}
 		}
 	}()
 	}()
 
 
-	f, err := NewFeedbagStore(testFile)
+	f, err := NewSQLiteFeedbagStore(testFile)
 	if err != nil {
 	if err != nil {
 		t.Fatalf("failed to create new feedbag store: %s", err.Error())
 		t.Fatalf("failed to create new feedbag store: %s", err.Error())
 	}
 	}
@@ -456,7 +457,7 @@ func TestGetUserNotFound(t *testing.T) {
 		}
 		}
 	}()
 	}()
 
 
-	f, err := NewFeedbagStore(testFile)
+	f, err := NewSQLiteFeedbagStore(testFile)
 	if err != nil {
 	if err != nil {
 		t.Fatalf("failed to create new feedbag store: %s", err.Error())
 		t.Fatalf("failed to create new feedbag store: %s", err.Error())
 	}
 	}