github.com/cobalt77/jfrog-client-go@v0.14.5/bintray/services/accesskeys/accesskeys.go (about)

     1  package accesskeys
     2  
     3  import (
     4  	"encoding/json"
     5  	"errors"
     6  	"github.com/cobalt77/jfrog-client-go/bintray/auth"
     7  	"github.com/cobalt77/jfrog-client-go/httpclient"
     8  	clientutils "github.com/cobalt77/jfrog-client-go/utils"
     9  	"github.com/cobalt77/jfrog-client-go/utils/errorutils"
    10  	"github.com/cobalt77/jfrog-client-go/utils/log"
    11  	"net/http"
    12  	"path"
    13  	"strings"
    14  )
    15  
    16  func NewService(client *httpclient.HttpClient) *AccessKeysService {
    17  	us := &AccessKeysService{client: client}
    18  	return us
    19  }
    20  
    21  func NewAccessKeysParams() *Params {
    22  	return &Params{}
    23  }
    24  
    25  type AccessKeysService struct {
    26  	client         *httpclient.HttpClient
    27  	BintrayDetails auth.BintrayDetails
    28  }
    29  
    30  type Params struct {
    31  	Id                  string
    32  	Password            string
    33  	Org                 string
    34  	Expiry              int64
    35  	ExistenceCheckUrl   string
    36  	ExistenceCheckCache int
    37  	WhiteCidrs          string
    38  	BlackCidrs          string
    39  	ApiOnly             bool
    40  }
    41  
    42  func (aks *AccessKeysService) ShowAll(org string) error {
    43  	path := getAccessKeysPath(aks.BintrayDetails, org)
    44  	httpClientsDetails := aks.BintrayDetails.CreateHttpClientDetails()
    45  	log.Info("Getting access keys...")
    46  	client, err := httpclient.ClientBuilder().Build()
    47  	if err != nil {
    48  		return err
    49  	}
    50  	resp, body, _, _ := client.SendGet(path, true, httpClientsDetails)
    51  	if resp.StatusCode != http.StatusOK {
    52  		return errorutils.CheckError(errors.New("Bintray response: " + resp.Status + "\n" + clientutils.IndentJson(body)))
    53  	}
    54  
    55  	log.Debug("Bintray response:", resp.Status)
    56  	log.Output(clientutils.IndentJson(body))
    57  	return nil
    58  }
    59  
    60  func (aks *AccessKeysService) Show(org, id string) error {
    61  	url := getAccessKeyPath(aks.BintrayDetails, id, org)
    62  	httpClientsDetails := aks.BintrayDetails.CreateHttpClientDetails()
    63  	log.Info("Getting access key...")
    64  	client, err := httpclient.ClientBuilder().Build()
    65  	if err != nil {
    66  		return err
    67  	}
    68  	resp, body, _, _ := client.SendGet(url, true, httpClientsDetails)
    69  	if resp.StatusCode != http.StatusOK {
    70  		return errorutils.CheckError(errors.New("Bintray response: " + resp.Status + "\n" + clientutils.IndentJson(body)))
    71  	}
    72  
    73  	log.Debug("Bintray response:", resp.Status)
    74  	log.Output(clientutils.IndentJson(body))
    75  	return nil
    76  }
    77  
    78  func (aks *AccessKeysService) Create(params *Params) error {
    79  	data, err := buildAccessKeyJson(params)
    80  	if err != nil {
    81  		return err
    82  	}
    83  	url := getAccessKeysPath(aks.BintrayDetails, params.Org)
    84  	httpClientsDetails := aks.BintrayDetails.CreateHttpClientDetails()
    85  	log.Info("Creating access key...")
    86  	client, err := httpclient.ClientBuilder().Build()
    87  	if err != nil {
    88  		return err
    89  	}
    90  	resp, body, err := client.SendPost(url, []byte(data), httpClientsDetails)
    91  	if err != nil {
    92  		return err
    93  	}
    94  	if resp.StatusCode != http.StatusCreated {
    95  		return errorutils.CheckError(errors.New("Bintray response: " + resp.Status + "\n" + clientutils.IndentJson(body)))
    96  	}
    97  
    98  	log.Debug("Bintray response:", resp.Status)
    99  	log.Output(clientutils.IndentJson(body))
   100  	return nil
   101  }
   102  
   103  func (aks *AccessKeysService) Update(params *Params) error {
   104  	data, err := buildAccessKeyJson(params)
   105  	if err != nil {
   106  		return err
   107  	}
   108  	url := getAccessKeyPath(aks.BintrayDetails, params.Id, params.Org)
   109  	httpClientsDetails := aks.BintrayDetails.CreateHttpClientDetails()
   110  	log.Info("Updating access key...")
   111  	client, err := httpclient.ClientBuilder().Build()
   112  	if err != nil {
   113  		return err
   114  	}
   115  	resp, body, err := client.SendPatch(url, []byte(data), httpClientsDetails)
   116  	if err != nil {
   117  		return err
   118  	}
   119  	if resp.StatusCode != http.StatusOK {
   120  		return errorutils.CheckError(errors.New("Bintray response: " + resp.Status + "\n" + clientutils.IndentJson(body)))
   121  	}
   122  
   123  	log.Debug("Bintray response:", resp.Status)
   124  	log.Output(clientutils.IndentJson(body))
   125  	return nil
   126  }
   127  
   128  func (aks *AccessKeysService) Delete(org, id string) error {
   129  	url := getAccessKeyPath(aks.BintrayDetails, id, org)
   130  	httpClientsDetails := aks.BintrayDetails.CreateHttpClientDetails()
   131  	log.Info("Deleting access key...")
   132  	client, err := httpclient.ClientBuilder().Build()
   133  	if err != nil {
   134  		return err
   135  	}
   136  	resp, body, err := client.SendDelete(url, nil, httpClientsDetails)
   137  	if err != nil {
   138  		return err
   139  	}
   140  	if resp.StatusCode != http.StatusOK {
   141  		return errorutils.CheckError(errors.New("Bintray response: " + resp.Status + "\n" + clientutils.IndentJson(body)))
   142  	}
   143  
   144  	log.Debug("Bintray response:", resp.Status)
   145  	log.Info("Deleted access key.")
   146  	return nil
   147  }
   148  
   149  func buildAccessKeyJson(params *Params) ([]byte, error) {
   150  	var whiteCidrs []string
   151  	if params.WhiteCidrs != "" {
   152  		whiteCidrs = strings.Split(params.WhiteCidrs, ",")
   153  	}
   154  
   155  	var blackCidrs []string
   156  	if params.BlackCidrs != "" {
   157  		blackCidrs = strings.Split(params.BlackCidrs, ",")
   158  	}
   159  
   160  	data := AccessKeyContent{
   161  		Id:         params.Id,
   162  		Expiry:     params.Expiry,
   163  		WhiteCidrs: whiteCidrs,
   164  		BlackCidrs: blackCidrs,
   165  		ApiOnly:    params.ApiOnly,
   166  		ExistenceCheck: ExistenceCheckContent{
   167  			Url:            params.ExistenceCheckUrl,
   168  			Cache_for_secs: params.ExistenceCheckCache},
   169  	}
   170  	content, err := json.Marshal(data)
   171  	if err != nil {
   172  		return []byte{}, errorutils.CheckError(errors.New("Failed to execute request."))
   173  	}
   174  	return content, nil
   175  }
   176  
   177  func getAccessKeyPath(bintrayDetails auth.BintrayDetails, id, org string) string {
   178  	return getAccessKeysPath(bintrayDetails, org) + "/" + id
   179  }
   180  
   181  func getAccessKeysPath(bintrayDetails auth.BintrayDetails, org string) string {
   182  	if org == "" {
   183  		return bintrayDetails.GetApiUrl() + path.Join("users", bintrayDetails.GetUser(), "access_keys")
   184  	}
   185  	return bintrayDetails.GetApiUrl() + path.Join("orgs", org, "access_keys")
   186  }
   187  
   188  type AccessKeyContent struct {
   189  	Id             string                `json:"id,omitempty"`
   190  	Expiry         int64                 `json:"expiry,omitempty"`
   191  	ExistenceCheck ExistenceCheckContent `json:"existence_check,omitempty"`
   192  	WhiteCidrs     []string              `json:"white_cidrs,omitempty"`
   193  	BlackCidrs     []string              `json:"black_cidrs,omitempty"`
   194  	ApiOnly        bool                  `json:"api_only"`
   195  }
   196  
   197  type ExistenceCheckContent struct {
   198  	Url            string `json:"url,omitempty"`
   199  	Cache_for_secs int    `json:"cache_for_secs,omitempty"`
   200  }