package tokens import ( "context" customermodel "git.sendico.io/tech/sxchnge/product/customers/model" sessionmodel "git.sendico.io/tech/sxchnge/product/sessions/model" "net/http" "testing" "git.sendico.io/tech/sxchnge/product/sessions/store" "go.mongodb.org/mongo-driver/v2/bson" "go.uber.org/zap" ) type recordingRefreshTokenDB struct { refreshtokens.DB token *sessionmodel.RefreshToken } func (db *recordingRefreshTokenDB) Create(_ context.Context, token *sessionmodel.RefreshToken) error { db.token = token return nil } func TestPrepareRefreshTokenStoresResolvedClientIP(t *testing.T) { tests := []struct { name string remoteAddr string realIP string want string }{ { name: "proxied IPv4", remoteAddr: "172.19.0.37:45706", realIP: "203.0.113.10", want: "203.0.113.10", }, { name: "direct IPv4", remoteAddr: "203.0.113.11:45706", want: "203.0.113.11", }, { name: "proxied IPv6", remoteAddr: "172.19.0.37:45706", realIP: "2001:0db8:0000:0000:0000:0000:0000:0012", want: "2001:db8::12", }, { name: "direct IPv6", remoteAddr: "[2001:db8::13]:45706", want: "2001:db8::13", }, { name: "missing address", want: "", }, { name: "invalid address", remoteAddr: "not-an-address", realIP: "also-not-an-address", want: "", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { request := &http.Request{ RemoteAddr: tt.remoteAddr, Header: make(http.Header), } if tt.realIP != "" { request.Header.Set("X-Real-IP", tt.realIP) } account := &customermodel.Account{} account.SetID(bson.NewObjectID()) db := &recordingRefreshTokenDB{} _, err := PrepareRefreshToken( context.Background(), request, db, 32, 24, &sessionmodel.SessionIdentifier{ClientID: "client", DeviceID: "device"}, account, zap.NewNop(), ) if err != nil { t.Fatalf("prepare refresh token: %v", err) } if db.token == nil { t.Fatal("expected refresh token to be stored") } if db.token.IPAddress != tt.want { t.Fatalf("unexpected stored IP address: got %q, want %q", db.token.IPAddress, tt.want) } if db.token.SessionVersion == "" { t.Fatal("expected a server-generated session version") } }) } }