103 lines
2.2 KiB
Go
103 lines
2.2 KiB
Go
package tokens
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"testing"
|
|
|
|
"git.sendico.io/tech/sxchnge/bff/edge/shared/storage/refreshtokens"
|
|
"git.sendico.io/tech/sxchnge/bff/pkg/model"
|
|
"go.mongodb.org/mongo-driver/v2/bson"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
type recordingRefreshTokenDB struct {
|
|
refreshtokens.DB
|
|
token *model.RefreshToken
|
|
}
|
|
|
|
func (db *recordingRefreshTokenDB) Create(_ context.Context, token *model.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 := &model.Account{}
|
|
account.SetID(bson.NewObjectID())
|
|
db := &recordingRefreshTokenDB{}
|
|
_, err := PrepareRefreshToken(
|
|
context.Background(),
|
|
request,
|
|
db,
|
|
32,
|
|
24,
|
|
&model.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")
|
|
}
|
|
})
|
|
}
|
|
}
|