mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2025-10-06 11:56:50 +08:00
278 lines
8.2 KiB
Go
278 lines
8.2 KiB
Go
package cloudflare
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/goccy/go-json"
|
|
)
|
|
|
|
var (
|
|
ErrMissingDatasetID = errors.New("missing required dataset ID")
|
|
)
|
|
|
|
// DLPDatasetUpload represents a single upload version attached to a DLP dataset.
|
|
type DLPDatasetUpload struct {
|
|
NumCells int `json:"num_cells"`
|
|
Status string `json:"status,omitempty"`
|
|
Version int `json:"version"`
|
|
}
|
|
|
|
// DLPDataset represents a DLP Exact Data Match dataset or Custom Word List.
|
|
type DLPDataset struct {
|
|
CreatedAt *time.Time `json:"created_at,omitempty"`
|
|
Description string `json:"description,omitempty"`
|
|
ID string `json:"id,omitempty"`
|
|
Name string `json:"name,omitempty"`
|
|
NumCells int `json:"num_cells"`
|
|
Secret *bool `json:"secret,omitempty"`
|
|
Status string `json:"status,omitempty"`
|
|
UpdatedAt *time.Time `json:"updated_at,omitempty"`
|
|
Uploads []DLPDatasetUpload `json:"uploads"`
|
|
}
|
|
|
|
type ListDLPDatasetsParams struct{}
|
|
|
|
type DLPDatasetListResponse struct {
|
|
Result []DLPDataset `json:"result"`
|
|
Response
|
|
}
|
|
|
|
// ListDLPDatasets returns all the DLP datasets associated with an account.
|
|
//
|
|
// API reference: https://developers.cloudflare.com/api/operations/dlp-datasets-read-all
|
|
func (api *API) ListDLPDatasets(ctx context.Context, rc *ResourceContainer, params ListDLPDatasetsParams) ([]DLPDataset, error) {
|
|
if rc.Identifier == "" {
|
|
return nil, nil
|
|
}
|
|
|
|
uri := buildURI(fmt.Sprintf("/%s/%s/dlp/datasets", rc.Level, rc.Identifier), nil)
|
|
|
|
res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var dlpDatasetListResponse DLPDatasetListResponse
|
|
err = json.Unmarshal(res, &dlpDatasetListResponse)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
|
|
}
|
|
|
|
return dlpDatasetListResponse.Result, nil
|
|
}
|
|
|
|
type DLPDatasetGetResponse struct {
|
|
Result DLPDataset `json:"result"`
|
|
Response
|
|
}
|
|
|
|
// GetDLPDataset returns a DLP dataset based on the dataset ID.
|
|
//
|
|
// API reference: https://developers.cloudflare.com/api/operations/dlp-datasets-read
|
|
func (api *API) GetDLPDataset(ctx context.Context, rc *ResourceContainer, datasetID string) (DLPDataset, error) {
|
|
if rc.Identifier == "" {
|
|
return DLPDataset{}, nil
|
|
}
|
|
|
|
if datasetID == "" {
|
|
return DLPDataset{}, ErrMissingDatasetID
|
|
}
|
|
|
|
uri := buildURI(fmt.Sprintf("/%s/%s/dlp/datasets/%s", rc.Level, rc.Identifier, datasetID), nil)
|
|
|
|
res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
|
|
if err != nil {
|
|
return DLPDataset{}, err
|
|
}
|
|
|
|
var dlpDatasetGetResponse DLPDatasetGetResponse
|
|
err = json.Unmarshal(res, &dlpDatasetGetResponse)
|
|
if err != nil {
|
|
return DLPDataset{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
|
|
}
|
|
|
|
return dlpDatasetGetResponse.Result, nil
|
|
}
|
|
|
|
type CreateDLPDatasetParams struct {
|
|
Description string `json:"description,omitempty"`
|
|
Name string `json:"name"`
|
|
Secret *bool `json:"secret,omitempty"`
|
|
}
|
|
|
|
type CreateDLPDatasetResult struct {
|
|
MaxCells int `json:"max_cells"`
|
|
Secret string `json:"secret"`
|
|
Version int `json:"version"`
|
|
Dataset DLPDataset `json:"dataset"`
|
|
}
|
|
|
|
type CreateDLPDatasetResponse struct {
|
|
Result CreateDLPDatasetResult `json:"result"`
|
|
Response
|
|
}
|
|
|
|
// CreateDLPDataset creates a DLP dataset.
|
|
//
|
|
// API reference: https://developers.cloudflare.com/api/operations/dlp-datasets-create
|
|
func (api *API) CreateDLPDataset(ctx context.Context, rc *ResourceContainer, params CreateDLPDatasetParams) (CreateDLPDatasetResult, error) {
|
|
if rc.Identifier == "" {
|
|
return CreateDLPDatasetResult{}, nil
|
|
}
|
|
|
|
uri := buildURI(fmt.Sprintf("/%s/%s/dlp/datasets", rc.Level, rc.Identifier), nil)
|
|
|
|
res, err := api.makeRequestContext(ctx, http.MethodPost, uri, params)
|
|
if err != nil {
|
|
return CreateDLPDatasetResult{}, err
|
|
}
|
|
|
|
var CreateDLPDatasetResponse CreateDLPDatasetResponse
|
|
err = json.Unmarshal(res, &CreateDLPDatasetResponse)
|
|
if err != nil {
|
|
return CreateDLPDatasetResult{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
|
|
}
|
|
|
|
return CreateDLPDatasetResponse.Result, nil
|
|
}
|
|
|
|
// DeleteDLPDataset deletes a DLP dataset.
|
|
//
|
|
// API reference: https://developers.cloudflare.com/api/operations/dlp-datasets-delete
|
|
func (api *API) DeleteDLPDataset(ctx context.Context, rc *ResourceContainer, datasetID string) error {
|
|
if rc.Identifier == "" {
|
|
return ErrMissingResourceIdentifier
|
|
}
|
|
|
|
if datasetID == "" {
|
|
return ErrMissingDatasetID
|
|
}
|
|
|
|
uri := buildURI(fmt.Sprintf("/%s/%s/dlp/datasets/%s", rc.Level, rc.Identifier, datasetID), nil)
|
|
_, err := api.makeRequestContext(ctx, http.MethodDelete, uri, nil)
|
|
return err
|
|
}
|
|
|
|
type UpdateDLPDatasetParams struct {
|
|
DatasetID string
|
|
Description *string `json:"description,omitempty"` // nil to leave descrption as-is
|
|
Name *string `json:"name,omitempty"` // nil to leave name as-is
|
|
}
|
|
|
|
type UpdateDLPDatasetResponse struct {
|
|
Result DLPDataset `json:"result"`
|
|
Response
|
|
}
|
|
|
|
// UpdateDLPDataset updates the details of a DLP dataset.
|
|
//
|
|
// API reference: https://developers.cloudflare.com/api/operations/dlp-datasets-update
|
|
func (api *API) UpdateDLPDataset(ctx context.Context, rc *ResourceContainer, params UpdateDLPDatasetParams) (DLPDataset, error) {
|
|
if rc.Identifier == "" {
|
|
return DLPDataset{}, nil
|
|
}
|
|
|
|
if params.DatasetID == "" {
|
|
return DLPDataset{}, ErrMissingDatasetID
|
|
}
|
|
|
|
uri := buildURI(fmt.Sprintf("/%s/%s/dlp/datasets/%s", rc.Level, rc.Identifier, params.DatasetID), nil)
|
|
|
|
res, err := api.makeRequestContext(ctx, http.MethodPut, uri, params)
|
|
if err != nil {
|
|
return DLPDataset{}, err
|
|
}
|
|
|
|
var updateDLPDatasetResponse UpdateDLPDatasetResponse
|
|
err = json.Unmarshal(res, &updateDLPDatasetResponse)
|
|
if err != nil {
|
|
return DLPDataset{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
|
|
}
|
|
|
|
return updateDLPDatasetResponse.Result, nil
|
|
}
|
|
|
|
type CreateDLPDatasetUploadResult struct {
|
|
MaxCells int `json:"max_cells"`
|
|
Secret string `json:"secret"`
|
|
Version int `json:"version"`
|
|
}
|
|
|
|
type CreateDLPDatasetUploadResponse struct {
|
|
Result CreateDLPDatasetUploadResult `json:"result"`
|
|
Response
|
|
}
|
|
type CreateDLPDatasetUploadParams struct {
|
|
DatasetID string
|
|
}
|
|
|
|
// CreateDLPDatasetUpload creates a new upload version for the specified DLP dataset.
|
|
//
|
|
// API reference: https://developers.cloudflare.com/api/operations/dlp-datasets-create-version
|
|
func (api *API) CreateDLPDatasetUpload(ctx context.Context, rc *ResourceContainer, params CreateDLPDatasetUploadParams) (CreateDLPDatasetUploadResult, error) {
|
|
if rc.Identifier == "" {
|
|
return CreateDLPDatasetUploadResult{}, nil
|
|
}
|
|
|
|
if params.DatasetID == "" {
|
|
return CreateDLPDatasetUploadResult{}, ErrMissingDatasetID
|
|
}
|
|
|
|
uri := buildURI(fmt.Sprintf("/%s/%s/dlp/datasets/%s/upload", rc.Level, rc.Identifier, params.DatasetID), nil)
|
|
|
|
res, err := api.makeRequestContext(ctx, http.MethodPost, uri, nil)
|
|
if err != nil {
|
|
return CreateDLPDatasetUploadResult{}, err
|
|
}
|
|
|
|
var dlpDatasetCreateUploadResponse CreateDLPDatasetUploadResponse
|
|
err = json.Unmarshal(res, &dlpDatasetCreateUploadResponse)
|
|
if err != nil {
|
|
return CreateDLPDatasetUploadResult{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
|
|
}
|
|
|
|
return dlpDatasetCreateUploadResponse.Result, nil
|
|
}
|
|
|
|
type UploadDLPDatasetVersionParams struct {
|
|
DatasetID string
|
|
Version int
|
|
Body interface{}
|
|
}
|
|
|
|
type UploadDLPDatasetVersionResponse struct {
|
|
Result DLPDataset `json:"result"`
|
|
Response
|
|
}
|
|
|
|
// UploadDLPDatasetVersion uploads a new version of the specified DLP dataset.
|
|
//
|
|
// API reference: https://developers.cloudflare.com/api/operations/dlp-datasets-upload-version
|
|
func (api *API) UploadDLPDatasetVersion(ctx context.Context, rc *ResourceContainer, params UploadDLPDatasetVersionParams) (DLPDataset, error) {
|
|
if rc.Identifier == "" {
|
|
return DLPDataset{}, nil
|
|
}
|
|
|
|
if params.DatasetID == "" {
|
|
return DLPDataset{}, ErrMissingDatasetID
|
|
}
|
|
|
|
uri := buildURI(fmt.Sprintf("/%s/%s/dlp/datasets/%s/upload/%d", rc.Level, rc.Identifier, params.DatasetID, params.Version), nil)
|
|
|
|
res, err := api.makeRequestContext(ctx, http.MethodPost, uri, params.Body)
|
|
if err != nil {
|
|
return DLPDataset{}, err
|
|
}
|
|
|
|
var dlpDatasetUploadVersionResponse UploadDLPDatasetVersionResponse
|
|
err = json.Unmarshal(res, &dlpDatasetUploadVersionResponse)
|
|
if err != nil {
|
|
return DLPDataset{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
|
|
}
|
|
|
|
return dlpDatasetUploadVersionResponse.Result, nil
|
|
}
|