github.com/supabase/cli@v1.168.1/internal/sso/create/create.go (about) 1 package create 2 3 import ( 4 "context" 5 "net/http" 6 "os" 7 8 "github.com/go-errors/errors" 9 "github.com/spf13/afero" 10 "github.com/supabase/cli/internal/sso/internal/render" 11 "github.com/supabase/cli/internal/sso/internal/saml" 12 "github.com/supabase/cli/internal/utils" 13 "github.com/supabase/cli/pkg/api" 14 ) 15 16 var Fs = afero.NewOsFs() 17 18 type RunParams struct { 19 ProjectRef string 20 Format string 21 22 Type string 23 Domains []string 24 MetadataFile string 25 MetadataURL string 26 SkipURLValidation bool 27 AttributeMapping string 28 } 29 30 func Run(ctx context.Context, params RunParams) error { 31 var body api.CreateProviderForProjectJSONRequestBody 32 body.Type = api.CreateProviderBodyType(params.Type) 33 34 if params.MetadataFile != "" { 35 data, err := saml.ReadMetadataFile(Fs, params.MetadataFile) 36 if err != nil { 37 return err 38 } 39 40 body.MetadataXml = &data 41 } else if params.MetadataURL != "" { 42 if !params.SkipURLValidation { 43 if err := saml.ValidateMetadataURL(ctx, params.MetadataURL); err != nil { 44 return errors.Errorf("%w Use --skip-url-validation to suppress this error", err) 45 } 46 } 47 48 body.MetadataUrl = ¶ms.MetadataURL 49 } 50 51 if params.AttributeMapping != "" { 52 data, err := saml.ReadAttributeMappingFile(Fs, params.AttributeMapping) 53 if err != nil { 54 return err 55 } 56 57 body.AttributeMapping = data 58 } 59 60 if params.Domains != nil { 61 body.Domains = ¶ms.Domains 62 } 63 64 resp, err := utils.GetSupabase().CreateProviderForProjectWithResponse(ctx, params.ProjectRef, body) 65 if err != nil { 66 return errors.Errorf("failed to create sso provider: %w", err) 67 } 68 69 if resp.JSON201 == nil { 70 if resp.StatusCode() == http.StatusNotFound { 71 return errors.New("SAML 2.0 support is not enabled for this project. Please enable it through the dashboard") 72 } 73 74 return errors.New("Unexpected error adding identity provider: " + string(resp.Body)) 75 } 76 77 switch params.Format { 78 case utils.OutputPretty: 79 return render.SingleMarkdown(api.Provider{ 80 Id: resp.JSON201.Id, 81 Saml: resp.JSON201.Saml, 82 Domains: resp.JSON201.Domains, 83 CreatedAt: resp.JSON201.CreatedAt, 84 UpdatedAt: resp.JSON201.UpdatedAt, 85 }) 86 87 default: 88 return utils.EncodeOutput(params.Format, os.Stdout, resp.JSON201) 89 } 90 }