Skip to content

Commit 8823290

Browse files
hfsweatybridge
andauthored
feat: add --name-id-format flag to sso add and sso update (#4477)
* feat: add `--name-id-format` flag to `sso add` and `sso update` * chore: use type constants --------- Co-authored-by: Qiao Han <qiao@supabase.io>
1 parent 08f546d commit 8823290

File tree

4 files changed

+41
-0
lines changed

4 files changed

+41
-0
lines changed

cmd/sso.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/supabase/cli/internal/sso/update"
1313
"github.com/supabase/cli/internal/utils"
1414
"github.com/supabase/cli/internal/utils/flags"
15+
"github.com/supabase/cli/pkg/api"
1516
)
1617

1718
var (
@@ -25,6 +26,16 @@ var (
2526
Allowed: []string{"saml"},
2627
// intentionally no default value so users have to specify --type saml explicitly
2728
}
29+
30+
ssoNameIDFormat = utils.EnumFlag{
31+
Allowed: []string{
32+
string(api.CreateProviderBodyNameIdFormatUrnOasisNamesTcSAML11NameidFormatEmailAddress),
33+
string(api.CreateProviderBodyNameIdFormatUrnOasisNamesTcSAML11NameidFormatUnspecified),
34+
string(api.CreateProviderBodyNameIdFormatUrnOasisNamesTcSAML20NameidFormatPersistent),
35+
string(api.CreateProviderBodyNameIdFormatUrnOasisNamesTcSAML20NameidFormatTransient),
36+
},
37+
}
38+
2839
ssoMetadataFile string
2940
ssoMetadataURL string
3041
ssoSkipURLValidation bool
@@ -48,6 +59,7 @@ var (
4859
MetadataURL: ssoMetadataURL,
4960
SkipURLValidation: ssoSkipURLValidation,
5061
AttributeMapping: ssoAttributeMappingFile,
62+
NameIDFormat: ssoNameIDFormat.String(),
5163
Domains: ssoDomains,
5264
})
5365
},
@@ -88,6 +100,7 @@ var (
88100
MetadataURL: ssoMetadataURL,
89101
SkipURLValidation: ssoSkipURLValidation,
90102
AttributeMapping: ssoAttributeMappingFile,
103+
NameIDFormat: ssoNameIDFormat.String(),
91104
Domains: ssoDomains,
92105
AddDomains: ssoAddDomains,
93106
RemoveDomains: ssoRemoveDomains,
@@ -146,6 +159,7 @@ func init() {
146159
ssoAddFlags.StringVar(&ssoMetadataURL, "metadata-url", "", "URL pointing to a SAML 2.0 Metadata XML document describing the identity provider.")
147160
ssoAddFlags.BoolVar(&ssoSkipURLValidation, "skip-url-validation", false, "Whether local validation of the SAML 2.0 Metadata URL should not be performed.")
148161
ssoAddFlags.StringVar(&ssoAttributeMappingFile, "attribute-mapping-file", "", "File containing a JSON mapping between SAML attributes to custom JWT claims.")
162+
ssoAddFlags.Var(&ssoNameIDFormat, "name-id-format", "URI reference representing the classification of string-based identifier information.")
149163
ssoAddCmd.MarkFlagsMutuallyExclusive("metadata-file", "metadata-url")
150164
cobra.CheckErr(ssoAddCmd.MarkFlagRequired("type"))
151165
cobra.CheckErr(ssoAddCmd.MarkFlagFilename("metadata-file", "xml"))
@@ -159,6 +173,7 @@ func init() {
159173
ssoUpdateFlags.StringVar(&ssoMetadataURL, "metadata-url", "", "URL pointing to a SAML 2.0 Metadata XML document describing the identity provider.")
160174
ssoUpdateFlags.BoolVar(&ssoSkipURLValidation, "skip-url-validation", false, "Whether local validation of the SAML 2.0 Metadata URL should not be performed.")
161175
ssoUpdateFlags.StringVar(&ssoAttributeMappingFile, "attribute-mapping-file", "", "File containing a JSON mapping between SAML attributes to custom JWT claims.")
176+
ssoUpdateFlags.Var(&ssoNameIDFormat, "name-id-format", "URI reference representing the classification of string-based identifier information.")
162177
ssoUpdateCmd.MarkFlagsMutuallyExclusive("metadata-file", "metadata-url")
163178
ssoUpdateCmd.MarkFlagsMutuallyExclusive("domains", "add-domains")
164179
ssoUpdateCmd.MarkFlagsMutuallyExclusive("domains", "remove-domains")

internal/sso/create/create.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/supabase/cli/internal/sso/internal/saml"
1212
"github.com/supabase/cli/internal/utils"
1313
"github.com/supabase/cli/pkg/api"
14+
"github.com/supabase/cli/pkg/cast"
1415
)
1516

1617
var Fs = afero.NewOsFs()
@@ -25,6 +26,7 @@ type RunParams struct {
2526
MetadataURL string
2627
SkipURLValidation bool
2728
AttributeMapping string
29+
NameIDFormat string
2830
}
2931

3032
func Run(ctx context.Context, params RunParams) error {
@@ -66,6 +68,10 @@ func Run(ctx context.Context, params RunParams) error {
6668
body.Domains = &params.Domains
6769
}
6870

71+
if params.NameIDFormat != "" {
72+
body.NameIdFormat = cast.Ptr(api.CreateProviderBodyNameIdFormat(params.NameIDFormat))
73+
}
74+
6975
resp, err := utils.GetSupabase().V1CreateASsoProviderWithResponse(ctx, params.ProjectRef, body)
7076
if err != nil {
7177
return errors.Errorf("failed to create sso provider: %w", err)

internal/sso/internal/render/render.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,15 @@ func formatEntityID(provider api.GetProviderResponse) string {
6565
return entityID
6666
}
6767

68+
func formatNameIDFormat(provider api.GetProviderResponse) string {
69+
nameIDFormat := "-"
70+
if provider.Saml != nil && provider.Saml.NameIdFormat != nil && *provider.Saml.NameIdFormat != "" {
71+
nameIDFormat = *provider.Saml.NameIdFormat
72+
}
73+
74+
return nameIDFormat
75+
}
76+
6877
func ListMarkdown(providers api.ListProvidersResponse) error {
6978
markdownTable := []string{
7079
"|TYPE|IDENTITY PROVIDER ID|DOMAINS|SAML 2.0 `EntityID`|CREATED AT (UTC)|UPDATED AT (UTC)|\n|-|-|-|-|-|-|\n",
@@ -116,6 +125,11 @@ func SingleMarkdown(provider api.GetProviderResponse) error {
116125
"|SAML 2.0 `EntityID`|`%s`|",
117126
formatEntityID(provider),
118127
))
128+
129+
markdownTable = append(markdownTable, fmt.Sprintf(
130+
"|NAMEID FORMAT|`%s`|",
131+
formatNameIDFormat(provider),
132+
))
119133
}
120134

121135
markdownTable = append(markdownTable, fmt.Sprintf(

internal/sso/update/update.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/supabase/cli/internal/sso/internal/saml"
1313
"github.com/supabase/cli/internal/utils"
1414
"github.com/supabase/cli/pkg/api"
15+
"github.com/supabase/cli/pkg/cast"
1516
)
1617

1718
var Fs = afero.NewOsFs()
@@ -25,6 +26,7 @@ type RunParams struct {
2526
MetadataURL string
2627
SkipURLValidation bool
2728
AttributeMapping string
29+
NameIDFormat string
2830

2931
Domains []string
3032
AddDomains []string
@@ -111,6 +113,10 @@ func Run(ctx context.Context, params RunParams) error {
111113
body.Domains = &domains
112114
}
113115

116+
if params.NameIDFormat != "" {
117+
body.NameIdFormat = cast.Ptr(api.UpdateProviderBodyNameIdFormat(params.NameIDFormat))
118+
}
119+
114120
putResp, err := utils.GetSupabase().V1UpdateASsoProviderWithResponse(ctx, params.ProjectRef, parsed, body)
115121
if err != nil {
116122
return errors.Errorf("failed to update sso provider: %w", err)

0 commit comments

Comments
 (0)