package handler import ( "strings" "testing" "github.com/Wei-Shaw/sub2api/internal/config" "github.com/stretchr/testify/require" ) func TestSanitizeFrontendRedirectPath(t *testing.T) { require.Equal(t, "/dashboard", sanitizeFrontendRedirectPath("/dashboard")) require.Equal(t, "/dashboard", sanitizeFrontendRedirectPath(" /dashboard ")) require.Equal(t, "", sanitizeFrontendRedirectPath("dashboard")) require.Equal(t, "", sanitizeFrontendRedirectPath("//evil.com")) require.Equal(t, "", sanitizeFrontendRedirectPath("https://evil.com")) require.Equal(t, "", sanitizeFrontendRedirectPath("/\nfoo")) long := "/" + strings.Repeat("a", linuxDoOAuthMaxRedirectLen) require.Equal(t, "", sanitizeFrontendRedirectPath(long)) } func TestBuildBearerAuthorization(t *testing.T) { auth, err := buildBearerAuthorization("", "token123") require.NoError(t, err) require.Equal(t, "Bearer token123", auth) auth, err = buildBearerAuthorization("bearer", "token123") require.NoError(t, err) require.Equal(t, "Bearer token123", auth) _, err = buildBearerAuthorization("MAC", "token123") require.Error(t, err) _, err = buildBearerAuthorization("Bearer", "token 123") require.Error(t, err) } func TestLinuxDoParseUserInfoParsesIDAndUsername(t *testing.T) { cfg := config.LinuxDoConnectConfig{ UserInfoURL: "https://connect.linux.do/api/user", } email, username, subject, err := linuxDoParseUserInfo(`{"id":123,"username":"alice"}`, cfg) require.NoError(t, err) require.Equal(t, "123", subject) require.Equal(t, "alice", username) require.Equal(t, "linuxdo-123@linuxdo-connect.invalid", email) } func TestLinuxDoParseUserInfoDefaultsUsername(t *testing.T) { cfg := config.LinuxDoConnectConfig{ UserInfoURL: "https://connect.linux.do/api/user", } email, username, subject, err := linuxDoParseUserInfo(`{"id":"123"}`, cfg) require.NoError(t, err) require.Equal(t, "123", subject) require.Equal(t, "linuxdo_123", username) require.Equal(t, "linuxdo-123@linuxdo-connect.invalid", email) } func TestLinuxDoParseUserInfoRejectsUnsafeSubject(t *testing.T) { cfg := config.LinuxDoConnectConfig{ UserInfoURL: "https://connect.linux.do/api/user", } _, _, _, err := linuxDoParseUserInfo(`{"id":"123@456"}`, cfg) require.Error(t, err) tooLong := strings.Repeat("a", linuxDoOAuthMaxSubjectLen+1) _, _, _, err = linuxDoParseUserInfo(`{"id":"`+tooLong+`"}`, cfg) require.Error(t, err) }