@@ -90,6 +90,47 @@ func TestNormalizeProviderInputProtectsSuperAdminDefaultRole(t *testing.T) {
9090 }
9191}
9292
93+ func TestNormalizeProviderInputValidatesLogoURL (t * testing.T ) {
94+ service := NewService (config.Config {JWTSecret : "test-secret" }, & providerLoginRepo {}, nil )
95+
96+ cases := []struct {
97+ name string
98+ logoURL string
99+ wantErr bool
100+ }{
101+ {name : "https url" , logoURL : "https://example.com/logo.svg" },
102+ {name : "http url" , logoURL : "http://example.com/logo.svg" },
103+ {name : "absolute path" , logoURL : "/identity-providers/acme.svg" },
104+ {name : "protocol relative url" , logoURL : "//example.com/logo.svg" , wantErr : true },
105+ {name : "data url" , logoURL : "data:image/svg+xml,<svg/>" , wantErr : true },
106+ {name : "javascript url" , logoURL : "javascript:alert(1)" , wantErr : true },
107+ {name : "relative path" , logoURL : "identity-providers/acme.svg" , wantErr : true },
108+ {name : "backslash path" , logoURL : `/\example.svg` , wantErr : true },
109+ }
110+
111+ for _ , tc := range cases {
112+ t .Run (tc .name , func (t * testing.T ) {
113+ _ , err := service .normalizeProviderInput (UpsertIdentityProviderInput {
114+ ActorRole : domainuser .RoleAdmin ,
115+ Type : domainuser .IdentityProviderTypeOIDC ,
116+ Name : "Acme SSO" ,
117+ LogoURL : tc .logoURL ,
118+ ClientID : "client" ,
119+ ClientSecret : "secret" ,
120+ DiscoveryURL : "https://example.com/.well-known/openid-configuration" ,
121+ RegistrationEnabled : boolPtr (true ),
122+ DefaultRole : domainuser .RoleUser ,
123+ }, nil )
124+ if tc .wantErr && err == nil {
125+ t .Fatalf ("expected logo URL %q to be rejected" , tc .logoURL )
126+ }
127+ if ! tc .wantErr && err != nil {
128+ t .Fatalf ("expected logo URL %q to be accepted, got %v" , tc .logoURL , err )
129+ }
130+ })
131+ }
132+ }
133+
93134func TestResolveProviderUserAutoRegistrationAddsUsernameSuffixOnCollision (t * testing.T ) {
94135 repo := & providerLoginRepo {duplicateUsernameAttempts : 1 }
95136 service := NewService (config.Config {JWTSecret : "test-secret" }, repo , nil )
0 commit comments