91 lines
2.2 KiB
Go
91 lines
2.2 KiB
Go
package create
|
|
|
|
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
|
|
Format string
|
|
|
|
Type string
|
|
Domains []string
|
|
MetadataFile string
|
|
MetadataURL string
|
|
SkipURLValidation bool
|
|
AttributeMapping string
|
|
}
|
|
|
|
func Run(ctx context.Context, params RunParams) error {
|
|
var body api.V1CreateASsoProviderJSONRequestBody
|
|
body.Type = api.CreateProviderBodyType(params.Type)
|
|
|
|
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 params.Domains != nil {
|
|
body.Domains = ¶ms.Domains
|
|
}
|
|
|
|
resp, err := utils.GetSupabase().V1CreateASsoProviderWithResponse(ctx, params.ProjectRef, body)
|
|
if err != nil {
|
|
return errors.Errorf("failed to create sso provider: %w", err)
|
|
}
|
|
|
|
if resp.JSON201 == nil {
|
|
if resp.StatusCode() == http.StatusNotFound {
|
|
return errors.New("SAML 2.0 support is not enabled for this project. Please enable it through the dashboard")
|
|
}
|
|
|
|
return errors.New("Unexpected error adding identity provider: " + string(resp.Body))
|
|
}
|
|
|
|
switch params.Format {
|
|
case utils.OutputPretty:
|
|
return render.SingleMarkdown(api.Provider{
|
|
Id: resp.JSON201.Id,
|
|
Saml: resp.JSON201.Saml,
|
|
Domains: resp.JSON201.Domains,
|
|
CreatedAt: resp.JSON201.CreatedAt,
|
|
UpdatedAt: resp.JSON201.UpdatedAt,
|
|
})
|
|
|
|
default:
|
|
return utils.EncodeOutput(params.Format, os.Stdout, resp.JSON201)
|
|
}
|
|
}
|