bitbucket.org/Aishee/synsec@v0.0.0-20210414005726-236fc01a153d/pkg/metabase/api.go (about)

     1  package metabase
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"net/http"
     7  	"time"
     8  
     9  	"bitbucket.org/Aishee/synsec/pkg/cwversion"
    10  	"github.com/dghubble/sling"
    11  	log "github.com/sirupsen/logrus"
    12  )
    13  
    14  type APIClient struct {
    15  	CTX    *sling.Sling
    16  	Client *http.Client
    17  }
    18  
    19  const (
    20  	sessionEndpoint       = "login"
    21  	scanEndpoint          = "scan"
    22  	resetPasswordEndpoint = "reset_password"
    23  	userEndpoint          = "user"
    24  	databaseEndpoint      = "database"
    25  )
    26  
    27  var (
    28  	routes = map[string]string{
    29  		sessionEndpoint:       "api/session",
    30  		scanEndpoint:          "api/database/2/rescan_values",
    31  		resetPasswordEndpoint: "api/user/1/password",
    32  		userEndpoint:          "api/user/1",
    33  		databaseEndpoint:      "api/database/2",
    34  	}
    35  )
    36  
    37  func NewAPIClient(url string) (*APIClient, error) {
    38  	httpClient := &http.Client{Timeout: 20 * time.Second}
    39  	return &APIClient{
    40  		CTX:    sling.New().Client(httpClient).Base(url).Set("User-Agent", fmt.Sprintf("synsec/%s", cwversion.VersionStr())),
    41  		Client: httpClient,
    42  	}, nil
    43  }
    44  
    45  func (h *APIClient) Do(method string, route string, body interface{}) (interface{}, interface{}, error) {
    46  	var Success interface{}
    47  	var Error interface{}
    48  	var resp *http.Response
    49  	var err error
    50  	var data []byte
    51  	if body != nil {
    52  		data, _ = json.Marshal(body)
    53  	}
    54  
    55  	switch method {
    56  	case "POST":
    57  		log.Debugf("POST /%s", route)
    58  		log.Debugf("%s", string(data))
    59  		resp, err = h.CTX.New().Post(route).BodyJSON(body).Receive(&Success, &Error)
    60  	case "GET":
    61  		log.Debugf("GET /%s", route)
    62  		resp, err = h.CTX.New().Get(route).Receive(&Success, &Error)
    63  	case "PUT":
    64  		log.Debugf("PUT /%s", route)
    65  		log.Debugf("%s", string(data))
    66  		resp, err = h.CTX.New().Put(route).BodyJSON(body).Receive(&Success, &Error)
    67  	case "DELETE":
    68  	default:
    69  		return nil, nil, fmt.Errorf("unsupported method '%s'", method)
    70  	}
    71  	if Error != nil {
    72  		return Success, Error, fmt.Errorf("http error: %v", Error)
    73  	}
    74  
    75  	if resp != nil && resp.StatusCode != 200 && resp.StatusCode != 202 {
    76  		return Success, Error, fmt.Errorf("bad status code '%d': (success: %+v) | (error: %+v)", resp.StatusCode, Success, Error)
    77  	}
    78  	return Success, Error, err
    79  }
    80  
    81  // Set set headers as key:value
    82  func (h *APIClient) Set(key string, value string) {
    83  	h.CTX = h.CTX.Set(key, value)
    84  }