Skip to content

Commit

Permalink
Merge pull request #206 from zscaler/zia-#206-dlp-engine-web-rule-att…
Browse files Browse the repository at this point in the history
…ribute

(fix): Added missing dlp engine and web dlp rule attributes
  • Loading branch information
willguibr authored Dec 16, 2023
2 parents 44260d4 + d77966c commit f3f49be
Show file tree
Hide file tree
Showing 6 changed files with 232 additions and 8 deletions.
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,16 @@
# Changelog

# 2.3.2 (December 16, 2023)

## Notes
- Golang: **v1.19**

### Enhacements

- [PR #206](https://github.com/zscaler/zscaler-sdk-go/pull/206) - Added missing Web DLP rule attribute `userRiskScoreLevels`: Supported values: `LOW`, `MEDIUM`, `HIGH`, `CRITICAL`

- [PR #206](https://github.com/zscaler/zscaler-sdk-go/pull/206) - Added DLP Engine Lite endpoint to `/dlpEngines/lite`

# 2.3.1 (December 15, 2023)

## Notes
Expand Down
13 changes: 12 additions & 1 deletion docs/guides/release-notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,21 @@ Track all Zscaler SDK GO releases. New resources, features, and bug fixes will b

---

``Last updated: v2.3.1``
``Last updated: v2.3.2``

---

# 2.3.2 (December 16, 2023)

## Notes
- Golang: **v1.19**

### Enhacements

- [PR #206](https://github.com/zscaler/zscaler-sdk-go/pull/206) - Added missing Web DLP rule attribute `userRiskScoreLevels`: Supported values: `LOW`, `MEDIUM`, `HIGH`, `CRITICAL`

- [PR #206](https://github.com/zscaler/zscaler-sdk-go/pull/206) - Added DLP Engine Lite endpoint to `/dlpEngines/lite`

# 2.3.1 (December 15, 2023)

## Notes
Expand Down
151 changes: 151 additions & 0 deletions zia/services/dlp/dlp_engines/dlp_engine_lite_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
package dlp_engines

import (
"strings"
"testing"

"github.com/zscaler/zscaler-sdk-go/v2/tests"
"golang.org/x/text/cases"
"golang.org/x/text/language"
)

func TestDLPEngineLite_data(t *testing.T) {
client, err := tests.NewZiaClient()
if err != nil {
t.Errorf("Error creating client: %v", err)
return
}

service := New(client)

engines, err := service.GetAll()
if err != nil {
t.Errorf("Error getting predefined engine name: %v", err)
return
}
if len(engines) == 0 {
t.Errorf("No predefined engine name found")
return
}
name := engines[0].PredefinedEngineName
t.Log("Getting predefined engine name by name:" + name)
engine, err := service.GetByPredefinedEngine(name)
if err != nil {
t.Errorf("Error getting predefined engine by name: %v", err)
return
}
if engine.PredefinedEngineName != name {
t.Errorf("predefined engine name does not match: expected %s, got %s", name, engine.PredefinedEngineName)
return
}
// Negative Test: Try to retrieve an predefined engine name with a non-existent name
nonExistentName := "ThisPredefinedEngineDoesNotExist"
_, err = service.GetByPredefinedEngine(nonExistentName)
if err == nil {
t.Errorf("Expected error when getting by non-existent name, got nil")
return
}
}

func TestGetById(t *testing.T) {
client, err := tests.NewZiaClient()
if err != nil {
t.Fatalf("Error creating client: %v", err)
}

service := New(client)

// Get all engines to find a valid ID
engines, err := service.GetAll()
if err != nil {
t.Fatalf("Error getting all dlp predefined engine: %v", err)
}
if len(engines) == 0 {
t.Fatalf("No dlp predefined engines found for testing")
}

// Choose the first engines's ID for testing
testID := engines[0].ID

// Retrieve the engine by ID
engine, err := service.Get(testID)
if err != nil {
t.Errorf("Error retrieving dlp predefined engine with ID %d: %v", testID, err)
return
}

// Verify the retrieved engine
if engine == nil {
t.Errorf("No engine returned for ID %d", testID)
return
}

if engine.ID != testID {
t.Errorf("Retrieved engine ID mismatch: expected %d, got %d", testID, engine.ID)
}
}

func TestResponseFormatValidation(t *testing.T) {
client, err := tests.NewZiaClient()
if err != nil {
t.Errorf("Error creating client: %v", err)
return
}

service := New(client)

engines, err := service.GetAll()
if err != nil {
t.Errorf("Error getting predefined engine: %v", err)
return
}
if len(engines) == 0 {
t.Errorf("No predefined engine found")
return
}

// Validate predefined engine
for _, engine := range engines {
// Checking if essential fields are not empty
if engine.ID == 0 {
t.Errorf("predefined engine ID is empty")
}
if !engine.CustomDlpEngine && engine.PredefinedEngineName == "" {
t.Errorf("predefined engine Name is empty for predefined engine with ID: %d", engine.ID)
}
}
}

func TestCaseSensitivityOfGetByName(t *testing.T) {
client, err := tests.NewZiaClient()
if err != nil {
t.Errorf("Error creating client: %v", err)
return
}

service := New(client)

// Assuming a group with the name "EXTERNAL" exists
knownName := "EXTERNAL"

// Case variations to test
variations := []string{
strings.ToUpper(knownName),
strings.ToLower(knownName),
cases.Title(language.English).String(knownName),
}

for _, variation := range variations {
t.Logf("Attempting to retrieve group with name variation: %s", variation)
engine, err := service.GetByPredefinedEngine(variation)
if err != nil {
t.Errorf("Error getting predefined engine with name variation '%s': %v", variation, err)
continue
}

// Check if the group's actual name matches the known name
if engine.PredefinedEngineName != knownName {
t.Errorf("Expected group name to be '%s' for variation '%s', but got '%s'", knownName, variation, engine.PredefinedEngineName)
}
}
}
39 changes: 34 additions & 5 deletions zia/services/dlp/dlp_engines/dlp_engines.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ import (
)

const (
dlpEnginesEndpoint = "/dlpEngines"
dlpEnginesEndpoint = "/dlpEngines"
dlpEngineLiteEndpoint = "/dlpEngines/lite"
)

type DLPEngines struct {
Expand Down Expand Up @@ -95,10 +96,38 @@ func (service *Service) Delete(engineID int) (*http.Response, error) {
func (service *Service) GetAll() ([]DLPEngines, error) {
var dlpEngines []DLPEngines
err := common.ReadAllPages(service.Client, dlpEnginesEndpoint, &dlpEngines)
for i := range dlpEngines {
if dlpEngines[i].Name == "" && dlpEngines[i].PredefinedEngineName != "" {
dlpEngines[i].Name = dlpEngines[i].PredefinedEngineName
return dlpEngines, err
}

// Functions to for DLP Engine Lite query
func (service *Service) GetEngineLiteID(engineID int) (*DLPEngines, error) {
dlpEngines, err := service.GetAllEngineLite()
if err != nil {
return nil, err
}
for _, engine := range dlpEngines {
if engine.ID == engineID {
return &engine, nil
}
}
return dlpEngines, err
return nil, fmt.Errorf("no dlp engine found with ID: %d", engineID)
}

func (service *Service) GetByPredefinedEngine(engineName string) (*DLPEngines, error) {
dlpEngines, err := service.GetAllEngineLite()
if err != nil {
return nil, err
}
for _, engine := range dlpEngines {
if strings.EqualFold(engine.PredefinedEngineName, engineName) {
return &engine, nil
}
}
return nil, fmt.Errorf("no predefined dlp engine found with name: %s", engineName)
}

func (service *Service) GetAllEngineLite() ([]DLPEngines, error) {
var engines []DLPEngines
err := common.ReadAllPages(service.Client, dlpEngineLiteEndpoint, &engines)
return engines, err
}
2 changes: 2 additions & 0 deletions zia/services/dlp/dlp_web_rules/dlp_web_rules.go
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,8 @@ type WebDLPRules struct {
// All attributes within the WebDlpRule model are applicable to the sub-rules.
// Values for each rule are specified by using the WebDlpRule object.
SubRules []string `json:"subRules,omitempty"`

UserRiskScoreLevels []string `json:"userRiskScoreLevels,omitempty"`
}

func (service *Service) Get(ruleID int) (*WebDLPRules, error) {
Expand Down
24 changes: 22 additions & 2 deletions zia/services/dlp/dlp_web_rules/dlp_web_rules_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import (

"github.com/hashicorp/terraform-plugin-sdk/helper/acctest"
"github.com/zscaler/zscaler-sdk-go/v2/tests"
"github.com/zscaler/zscaler-sdk-go/v2/zia/services/common"
"github.com/zscaler/zscaler-sdk-go/v2/zia/services/dlp/dlp_engines"
)

const (
Expand Down Expand Up @@ -97,6 +99,18 @@ func TestDLPWebRule(t *testing.T) {
t.Fatalf("Error creating client: %v", err)
}

dlpEngine := dlp_engines.New(client)
engineList, err := dlpEngine.GetByPredefinedEngine("EXTERNAL")
if err != nil {
t.Errorf("Error getting saml attributes: %v", err)
return
}

// Check if engineList is not nil and contains elements
if engineList == nil || len(engineList.PredefinedEngineName) == 0 {
t.Error("Expected retrieved saml attributes to be non-empty, but got empty or nil")
}

service := New(client)
rule := WebDLPRules{
Name: name,
Expand All @@ -109,9 +123,15 @@ func TestDLPWebRule(t *testing.T) {
WithoutContentInspection: false,
DLPDownloadScanEnabled: true,
Severity: "RULE_SEVERITY_HIGH",
Protocols: []string{"FTP_RULE", "HTTPS_RULE", "HTTP_RULE"},
Protocols: []string{"HTTPS_RULE", "HTTP_RULE"},
CloudApplications: []string{"WINDOWS_LIVE_HOTMAIL"},
// FileTypes: []string{"WINDOWS_META_FORMAT", "BITMAP", "JPEG", "PNG", "TIFF"},
UserRiskScoreLevels: []string{"LOW", "MEDIUM", "HIGH", "CRITICAL"},
FileTypes: []string{"ALL_OUTBOUND"},
DLPEngines: []common.IDNameExtensions{
{
ID: engineList.ID,
},
},
}

var createdResource *WebDLPRules
Expand Down

0 comments on commit f3f49be

Please sign in to comment.