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 = &params.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 = &params.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  }