github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/pkg/auth/converter.go (about)

     1  package auth
     2  
     3  import (
     4  	"github.com/kyma-incubator/compass/components/director/internal/model"
     5  	"github.com/kyma-incubator/compass/components/director/pkg/graphql"
     6  	"github.com/kyma-incubator/compass/components/director/pkg/str"
     7  	"github.com/pkg/errors"
     8  )
     9  
    10  // ToGraphQLInput converts model.Auth to graphql.AuthInput
    11  func ToGraphQLInput(in *model.Auth) (*graphql.AuthInput, error) {
    12  	if in == nil {
    13  		return nil, errors.New("Missing system auth")
    14  	}
    15  	credentialDataInput := credentialDataToInput(in.Credential)
    16  
    17  	requestAuthInput, err := requestAuthToInput(in.RequestAuth)
    18  	if err != nil {
    19  		return nil, err
    20  	}
    21  
    22  	var headers graphql.HTTPHeaders
    23  	var headersSerialized *graphql.HTTPHeadersSerialized
    24  	if len(in.AdditionalHeaders) != 0 {
    25  		headers = in.AdditionalHeaders
    26  
    27  		serialized, err := graphql.NewHTTPHeadersSerialized(in.AdditionalHeaders)
    28  		if err != nil {
    29  			return nil, errors.Wrap(err, "while marshaling AdditionalHeaders")
    30  		}
    31  		headersSerialized = &serialized
    32  	}
    33  
    34  	var params graphql.QueryParams
    35  	var paramsSerialized *graphql.QueryParamsSerialized
    36  	if len(in.AdditionalQueryParams) != 0 {
    37  		params = in.AdditionalQueryParams
    38  
    39  		serialized, err := graphql.NewQueryParamsSerialized(in.AdditionalQueryParams)
    40  		if err != nil {
    41  			return nil, errors.Wrap(err, "while marshaling AdditionalQueryParams")
    42  		}
    43  		paramsSerialized = &serialized
    44  	}
    45  
    46  	return &graphql.AuthInput{
    47  		Credential:                      credentialDataInput,
    48  		AccessStrategy:                  in.AccessStrategy,
    49  		AdditionalHeaders:               headers,
    50  		AdditionalHeadersSerialized:     headersSerialized,
    51  		AdditionalQueryParamsSerialized: paramsSerialized,
    52  		AdditionalQueryParams:           params,
    53  		RequestAuth:                     requestAuthInput,
    54  	}, nil
    55  }
    56  
    57  func requestAuthToInput(in *model.CredentialRequestAuth) (*graphql.CredentialRequestAuthInput, error) {
    58  	if in == nil || in.Csrf == nil {
    59  		return nil, nil
    60  	}
    61  
    62  	var headers graphql.HTTPHeaders
    63  	var headersSerialized *graphql.HTTPHeadersSerialized
    64  	if len(in.Csrf.AdditionalHeaders) != 0 {
    65  		headers = in.Csrf.AdditionalHeaders
    66  
    67  		serialized, err := graphql.NewHTTPHeadersSerialized(in.Csrf.AdditionalHeaders)
    68  		if err != nil {
    69  			return nil, errors.Wrap(err, "while marshaling AdditionalHeaders")
    70  		}
    71  		headersSerialized = &serialized
    72  	}
    73  
    74  	var params graphql.QueryParams
    75  	var paramsSerialized *graphql.QueryParamsSerialized
    76  	if len(in.Csrf.AdditionalQueryParams) != 0 {
    77  		params = in.Csrf.AdditionalQueryParams
    78  
    79  		serialized, err := graphql.NewQueryParamsSerialized(in.Csrf.AdditionalQueryParams)
    80  		if err != nil {
    81  			return nil, errors.Wrap(err, "while marshaling AdditionalQueryParams")
    82  		}
    83  		paramsSerialized = &serialized
    84  	}
    85  
    86  	credentialDataInput := credentialDataToInput(in.Csrf.Credential)
    87  
    88  	requestAuth := &graphql.CredentialRequestAuthInput{
    89  		Csrf: &graphql.CSRFTokenCredentialRequestAuthInput{
    90  			TokenEndpointURL:                in.Csrf.TokenEndpointURL,
    91  			AdditionalHeaders:               headers,
    92  			AdditionalHeadersSerialized:     headersSerialized,
    93  			AdditionalQueryParams:           params,
    94  			AdditionalQueryParamsSerialized: paramsSerialized,
    95  			Credential:                      credentialDataInput,
    96  		},
    97  	}
    98  
    99  	return requestAuth, nil
   100  }
   101  
   102  func credentialDataToInput(in model.CredentialData) *graphql.CredentialDataInput {
   103  	var basicCredentials *model.BasicCredentialData
   104  	var oauthCredentials *model.OAuthCredentialData
   105  
   106  	if in.Basic != nil {
   107  		basicCredentials = in.Basic
   108  	}
   109  
   110  	if in.Oauth != nil {
   111  		oauthCredentials = in.Oauth
   112  	}
   113  
   114  	return &graphql.CredentialDataInput{
   115  		Basic: basicCredentialToInput(basicCredentials),
   116  		Oauth: oauthCredentialToInput(oauthCredentials),
   117  	}
   118  }
   119  
   120  func basicCredentialToInput(in *model.BasicCredentialData) *graphql.BasicCredentialDataInput {
   121  	if in == nil {
   122  		return nil
   123  	}
   124  
   125  	return &graphql.BasicCredentialDataInput{
   126  		Username: in.Username,
   127  		Password: in.Password,
   128  	}
   129  }
   130  
   131  func oauthCredentialToInput(in *model.OAuthCredentialData) *graphql.OAuthCredentialDataInput {
   132  	if in == nil {
   133  		return nil
   134  	}
   135  
   136  	return &graphql.OAuthCredentialDataInput{
   137  		ClientID:     in.ClientID,
   138  		ClientSecret: in.ClientSecret,
   139  		URL:          in.URL,
   140  	}
   141  }
   142  
   143  // ToModel converts graphql.Auth to model.Auth
   144  func ToModel(in *graphql.Auth) (*model.Auth, error) {
   145  	if in == nil {
   146  		return nil, nil
   147  	}
   148  
   149  	var headers map[string][]string
   150  	if len(in.AdditionalHeaders) != 0 {
   151  		if err := in.AdditionalHeaders.UnmarshalGQL(headers); err != nil {
   152  			return nil, err
   153  		}
   154  	}
   155  
   156  	var params map[string][]string
   157  	if len(in.AdditionalQueryParams) != 0 {
   158  		if err := in.AdditionalQueryParams.UnmarshalGQL(params); err != nil {
   159  			return nil, err
   160  		}
   161  	}
   162  
   163  	reqAuthModel, err := requestAuthToModel(in.RequestAuth)
   164  	if err != nil {
   165  		return nil, err
   166  	}
   167  
   168  	return &model.Auth{
   169  		Credential:            credentialToModel(in.Credential),
   170  		AccessStrategy:        in.AccessStrategy,
   171  		AdditionalHeaders:     headers,
   172  		AdditionalQueryParams: params,
   173  		RequestAuth:           reqAuthModel,
   174  		CertCommonName:        str.PtrStrToStr(in.CertCommonName),
   175  	}, nil
   176  }
   177  
   178  func requestAuthToModel(in *graphql.CredentialRequestAuth) (*model.CredentialRequestAuth, error) {
   179  	if in == nil {
   180  		return nil, nil
   181  	}
   182  
   183  	var csrf *model.CSRFTokenCredentialRequestAuth
   184  	if in.Csrf != nil {
   185  		var headers map[string][]string
   186  		if len(in.Csrf.AdditionalHeaders) != 0 {
   187  			if err := in.Csrf.AdditionalHeaders.UnmarshalGQL(headers); err != nil {
   188  				return nil, err
   189  			}
   190  		}
   191  
   192  		var params map[string][]string
   193  		if len(in.Csrf.AdditionalQueryParams) != 0 {
   194  			if err := in.Csrf.AdditionalQueryParams.UnmarshalGQL(params); err != nil {
   195  				return nil, err
   196  			}
   197  		}
   198  
   199  		csrf = &model.CSRFTokenCredentialRequestAuth{
   200  			TokenEndpointURL:      in.Csrf.TokenEndpointURL,
   201  			AdditionalQueryParams: params,
   202  			AdditionalHeaders:     headers,
   203  			Credential:            credentialToModel(in.Csrf.Credential),
   204  		}
   205  	}
   206  
   207  	return &model.CredentialRequestAuth{
   208  		Csrf: csrf,
   209  	}, nil
   210  }
   211  
   212  func credentialToModel(in graphql.CredentialData) model.CredentialData {
   213  	var basic *model.BasicCredentialData
   214  	var oauth *model.OAuthCredentialData
   215  
   216  	switch cred := in.(type) {
   217  	case graphql.BasicCredentialData:
   218  		basic = &model.BasicCredentialData{
   219  			Username: cred.Username,
   220  			Password: cred.Password,
   221  		}
   222  	case graphql.OAuthCredentialData:
   223  		oauth = &model.OAuthCredentialData{
   224  			ClientID:     cred.ClientID,
   225  			ClientSecret: cred.ClientSecret,
   226  			URL:          cred.URL,
   227  		}
   228  	}
   229  
   230  	switch cred := in.(type) {
   231  	case *graphql.BasicCredentialData:
   232  		if basic == nil {
   233  			basic = &model.BasicCredentialData{
   234  				Username: cred.Username,
   235  				Password: cred.Password,
   236  			}
   237  		}
   238  	case *graphql.OAuthCredentialData:
   239  		if oauth == nil {
   240  			oauth = &model.OAuthCredentialData{
   241  				ClientID:     cred.ClientID,
   242  				ClientSecret: cred.ClientSecret,
   243  				URL:          cred.URL,
   244  			}
   245  		}
   246  	}
   247  
   248  	return model.CredentialData{Basic: basic, Oauth: oauth}
   249  }