127 lines
3.1 KiB
Go
127 lines
3.1 KiB
Go
package update
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"os"
|
|
|
|
"github.com/go-errors/errors"
|
|
"github.com/spf13/afero"
|
|
"github.com/supabase/cli/internal/sso/internal/render"
|
|
"github.com/supabase/cli/internal/sso/internal/saml"
|
|
"github.com/supabase/cli/internal/utils"
|
|
"github.com/supabase/cli/pkg/api"
|
|
)
|
|
|
|
var Fs = afero.NewOsFs()
|
|
|
|
type RunParams struct {
|
|
ProjectRef string
|
|
ProviderID string
|
|
Format string
|
|
|
|
MetadataFile string
|
|
MetadataURL string
|
|
SkipURLValidation bool
|
|
AttributeMapping string
|
|
|
|
Domains []string
|
|
AddDomains []string
|
|
RemoveDomains []string
|
|
}
|
|
|
|
func Run(ctx context.Context, params RunParams) error {
|
|
getResp, err := utils.GetSupabase().V1GetASsoProviderWithResponse(ctx, params.ProjectRef, params.ProviderID)
|
|
if err != nil {
|
|
return errors.Errorf("failed to get sso provider: %w", err)
|
|
}
|
|
|
|
if getResp.JSON200 == nil {
|
|
if getResp.StatusCode() == http.StatusNotFound {
|
|
return errors.Errorf("An identity provider with ID %q could not be found.", params.ProviderID)
|
|
}
|
|
|
|
return errors.New("unexpected error fetching identity provider: " + string(getResp.Body))
|
|
}
|
|
|
|
var body api.V1UpdateASsoProviderJSONRequestBody
|
|
|
|
if params.MetadataFile != "" {
|
|
data, err := saml.ReadMetadataFile(Fs, params.MetadataFile)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
body.MetadataXml = &data
|
|
} else if params.MetadataURL != "" {
|
|
if !params.SkipURLValidation {
|
|
if err := saml.ValidateMetadataURL(ctx, params.MetadataURL); err != nil {
|
|
return errors.Errorf("%w Use --skip-url-validation to suppress this error.", err)
|
|
}
|
|
}
|
|
|
|
body.MetadataUrl = ¶ms.MetadataURL
|
|
}
|
|
|
|
if params.AttributeMapping != "" {
|
|
data, err := saml.ReadAttributeMappingFile(Fs, params.AttributeMapping)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
body.AttributeMapping = data
|
|
}
|
|
|
|
if len(params.Domains) != 0 {
|
|
body.Domains = ¶ms.Domains
|
|
} else if params.AddDomains != nil || params.RemoveDomains != nil {
|
|
domainsSet := make(map[string]bool)
|
|
|
|
if getResp.JSON200.Domains != nil {
|
|
for _, domain := range *getResp.JSON200.Domains {
|
|
if domain.Domain != nil {
|
|
domainsSet[*domain.Domain] = true
|
|
}
|
|
}
|
|
}
|
|
|
|
for _, rmDomain := range params.RemoveDomains {
|
|
delete(domainsSet, rmDomain)
|
|
}
|
|
|
|
for _, addDomain := range params.AddDomains {
|
|
domainsSet[addDomain] = true
|
|
}
|
|
|
|
domains := make([]string, 0)
|
|
for domain := range domainsSet {
|
|
domains = append(domains, domain)
|
|
}
|
|
|
|
body.Domains = &domains
|
|
}
|
|
|
|
putResp, err := utils.GetSupabase().V1UpdateASsoProviderWithResponse(ctx, params.ProjectRef, params.ProviderID, body)
|
|
if err != nil {
|
|
return errors.Errorf("failed to update sso provider: %w", err)
|
|
}
|
|
|
|
if putResp.JSON200 == nil {
|
|
return errors.New("unexpected error fetching identity provider: " + string(putResp.Body))
|
|
}
|
|
|
|
switch params.Format {
|
|
case utils.OutputPretty:
|
|
return render.SingleMarkdown(api.Provider{
|
|
Id: putResp.JSON200.Id,
|
|
Saml: putResp.JSON200.Saml,
|
|
Domains: putResp.JSON200.Domains,
|
|
CreatedAt: putResp.JSON200.CreatedAt,
|
|
UpdatedAt: putResp.JSON200.UpdatedAt,
|
|
})
|
|
|
|
default:
|
|
return utils.EncodeOutput(params.Format, os.Stdout, putResp.JSON200)
|
|
}
|
|
}
|