Skip to content

Commit

Permalink
Merge pull request #126 from GreenmaskIO/fix/units_and_allowed_types
Browse files Browse the repository at this point in the history
Fix/units and allowed types
  • Loading branch information
wwoytenko authored May 17, 2024
2 parents 3627fea + 3fca5d7 commit 871c992
Show file tree
Hide file tree
Showing 8 changed files with 78 additions and 49 deletions.
2 changes: 1 addition & 1 deletion internal/db/postgres/transformers/email.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ var emailTransformerAllowedChars = []rune("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijk

var EmailTransformerDefinition = utils.NewTransformerDefinition(
utils.NewTransformerProperties(
"Email",
"RandomEmail",
"Generate random email",
),

Expand Down
28 changes: 0 additions & 28 deletions internal/db/postgres/transformers/random_faker.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,14 +50,6 @@ var FakerTransformersDes = map[string]*FakerTransformerDef{
Description: "Generates a random longitude value.",
},

// Faker Datetime
"RandomUnixTime": {
Generator: func(opts ...options.OptionFunc) string {
return fmt.Sprintf("%d", faker.UnixTime())
},
SupportedTypes: []string{"int4", "int8", "numeric"},
Description: "Generates a random Unix timestamp.",
},
"RandomMonthName": {
Generator: faker.MonthName,
SupportedTypes: []string{"text", "varchar"},
Expand Down Expand Up @@ -90,16 +82,6 @@ var FakerTransformersDes = map[string]*FakerTransformerDef{
},

// Faker Internet
"RandomEmail": {
Generator: faker.Email,
SupportedTypes: []string{"text", "varchar"},
Description: "Generates a random email address.",
},
"RandomMacAddress": {
Generator: faker.MacAddress,
SupportedTypes: []string{"text", "varchar", "macaddr", "macaddr8"},
Description: "Generates a random MAC address.",
},
"RandomDomainName": {
Generator: faker.DomainName,
SupportedTypes: []string{"text", "varchar"},
Expand All @@ -115,16 +97,6 @@ var FakerTransformersDes = map[string]*FakerTransformerDef{
SupportedTypes: []string{"text", "varchar"},
Description: "Generates a random username.",
},
"RandomIPv4": {
Generator: faker.IPv4,
SupportedTypes: []string{"text", "varchar", "inet"},
Description: "Generates a random IPv4 address.",
},
"RandomIPv6": {
Generator: faker.IPv6,
SupportedTypes: []string{"text", "varchar", "inet"},
Description: "Generates a random IPv6 address.",
},
"RandomPassword": {
Generator: faker.Password,
SupportedTypes: []string{"text", "varchar"},
Expand Down
6 changes: 3 additions & 3 deletions internal/db/postgres/transformers/random_ip.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ var RandomIpDefinition = utils.NewTransformerDefinition(
SetCastDbType("cidr").
SetDynamicMode(
toolkit.NewDynamicModeProperties().
SetCompatibleTypes("cidr", "text", "varchar"),
SetCompatibleTypes("text", "varchar", "cidr"),
),

engineParameterDefinition,
Expand Down Expand Up @@ -146,8 +146,8 @@ func (rbt *RandomIp) Transform(ctx context.Context, r *toolkit.Record) (*toolkit
return nil, fmt.Errorf("unable to transform value: %w", err)
}

newRawValue := toolkit.NewRawValue([]byte(ipVal.String()), false)
if err = r.SetRawColumnValueByIdx(rbt.columnIdx, newRawValue); err != nil {
newVal := toolkit.NewRawValue([]byte(ipVal.String()), false)
if err = r.SetRawColumnValueByIdx(rbt.columnIdx, newVal); err != nil {
return nil, fmt.Errorf("unable to set new value: %w", err)
}
return r, nil
Expand Down
22 changes: 20 additions & 2 deletions internal/db/postgres/transformers/random_ip_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ package transformers

import (
"context"
"testing"

"github.com/greenmaskio/greenmask/internal/db/postgres/transformers/utils"
"github.com/greenmaskio/greenmask/pkg/toolkit"
"github.com/stretchr/testify/require"
"testing"
)

func TestRandomIpTransformer_Transform_random_dynamic(t *testing.T) {
Expand All @@ -19,7 +20,24 @@ func TestRandomIpTransformer_Transform_random_dynamic(t *testing.T) {
expected string
}{
{
name: "IPv4 dynamic test",
name: "IPv4 dynamic test with strict types",
columnName: "ip_address",
record: map[string]*toolkit.RawValue{
"ip_address": toolkit.NewRawValue([]byte("192.168.1.10"), false),
"net_mask": toolkit.NewRawValue([]byte("192.168.1.0/30"), false),
},
params: map[string]toolkit.ParamsValue{
"engine": toolkit.ParamsValue("random"),
},
dynamicParams: map[string]*toolkit.DynamicParamValue{
"subnet": {
Column: "net_mask",
},
},
expected: "192.168.1.[1,2]",
},
{
name: "IPv4 dynamic test with strings",
columnName: "data",
record: map[string]*toolkit.RawValue{
"data": toolkit.NewRawValue([]byte("192.168.1.10"), false),
Expand Down
12 changes: 9 additions & 3 deletions internal/db/postgres/transformers/random_mac.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import (
"github.com/greenmaskio/greenmask/internal/db/postgres/transformers/utils"
"github.com/greenmaskio/greenmask/internal/generators/transformers"
"github.com/greenmaskio/greenmask/pkg/toolkit"
"github.com/jackc/pgx/v5/pgtype"
)

const (
Expand All @@ -46,7 +47,7 @@ var RandomMacAddressDefinition = utils.NewTransformerDefinition(
"Column name",
).SetIsColumn(toolkit.NewColumnProperties().
SetAffected(true).
SetAllowedColumnTypes("macaddr"),
SetAllowedColumnTypes("macaddr", "varchar", "text"),
).SetRequired(true),

toolkit.MustNewParameterDefinition(
Expand Down Expand Up @@ -172,7 +173,11 @@ func (rbt *RandomMac) Done(ctx context.Context) error {

func (rbt *RandomMac) Transform(ctx context.Context, r *toolkit.Record) (*toolkit.Record, error) {

_, err := r.ScanColumnValueByIdx(rbt.columnIdx, &rbt.originalMac)
rawVal, err := r.GetRawColumnValueByIdx(rbt.columnIdx)
if err != nil {
return nil, fmt.Errorf("unable to scan value: %w", err)
}
err = r.Driver.ScanValueByTypeOid(pgtype.MacaddrOID, rawVal.Data, &rbt.originalMac)
if err != nil {
return nil, fmt.Errorf("unable to scan value: %w", err)
}
Expand All @@ -182,7 +187,8 @@ func (rbt *RandomMac) Transform(ctx context.Context, r *toolkit.Record) (*toolki
return nil, fmt.Errorf("unable to transform value: %w", err)
}

if err = r.SetColumnValueByIdx(rbt.columnIdx, macAddr); err != nil {
newVal := toolkit.NewRawValue([]byte(macAddr.String()), false)
if err = r.SetRawColumnValueByIdx(rbt.columnIdx, newVal); err != nil {
return nil, fmt.Errorf("unable to set new value: %w", err)
}

Expand Down
24 changes: 18 additions & 6 deletions internal/db/postgres/transformers/random_mac_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,17 @@ func TestRandomMacTransformer_Transform_random(t *testing.T) {
managementType: managementTypeNameLocal,
castType: castTypeNameGroup,
},
{
name: "Random mac addr in text without keepOriginalVendor with Universal and Individual",
columnName: "data",
original: "03:1a:2b:3c:4d:5e",
params: map[string]toolkit.ParamsValue{
"engine": toolkit.ParamsValue("hash"),
"keep_original_vendor": toolkit.ParamsValue("false"),
},
managementType: managementTypeNameLocal,
castType: castTypeNameGroup,
},
}

for _, tt := range tests {
Expand Down Expand Up @@ -130,18 +141,19 @@ func TestRandomMacTransformer_Transform_random(t *testing.T) {
)
require.NoError(t, err)
var res net.HardwareAddr
isNull, err := r.ScanColumnValueByName(tt.columnName, &res)
rawVal, err := r.GetRawColumnValueByName(tt.columnName)
require.NoError(t, err)
require.False(t, rawVal.IsNull)
require.NotEmpty(t, rawVal.Data)
err = r.Driver.ScanValueByTypeName("macaddr", rawVal.Data, &res)
require.NoError(t, err)
require.False(t, isNull)

newMacAddrInfo, err := transformers.ExploreMacAddress(res)
require.NoError(t, err)

if string(tt.params["keep_original_vendor"]) == "true" {
require.Equal(t, tt.original[:8], res.String()[0:8])
}

if tt.castType != castTypeNameAny && tt.managementType != managementTypeNameAny {
require.Equal(t, tt.original[:8], res.String()[:8])
} else if tt.castType != castTypeNameAny && tt.managementType != managementTypeNameAny {
require.True(
t,
castTypeNameToIndex(tt.castType) == newMacAddrInfo.CastType && managementTypeNameToIndex(tt.managementType) == newMacAddrInfo.ManagementType,
Expand Down
17 changes: 11 additions & 6 deletions internal/db/postgres/transformers/random_unix_timestamp.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,16 @@ import (
)

const (
secondsUnit = "sec"
milliUnit = "milli"
microUnit = "micro"
nanoUnit = "nano"
secondsUnit = "second"
milliUnit = "millisecond"
microUnit = "microsecond"
nanoUnit = "nanosecond"
)

var timestampUnitValues = []string{
secondsUnit, milliUnit, microUnit, nanoUnit,
}

var unixTimestampTransformerDefinition = utils.NewTransformerDefinition(
utils.NewTransformerProperties(
"RandomUnixTimestamp",
Expand Down Expand Up @@ -219,12 +223,13 @@ func getUnixByUnit(v time.Time, unit string) int64 {

func validateDateUnitParameterValue(p *toolkit.ParameterDefinition, v toolkit.ParamsValue) (toolkit.ValidationWarnings, error) {

if !slices.Contains([]string{secondsUnit, milliUnit, microUnit, nanoUnit}, string(v)) {
if !slices.Contains(timestampUnitValues, string(v)) {
return toolkit.ValidationWarnings{
toolkit.NewValidationWarning().
SetSeverity(toolkit.ErrorValidationSeverity).
AddMeta("ParameterValue", string(v)).
SetMsg("wrong truncation part value: must be one of nano, second, minute, hour, day, month, year"),
AddMeta("AllowedValues", truncateParts).
SetMsg("wrong timestamp unit value"),
}, nil
}
return nil, nil
Expand Down
16 changes: 16 additions & 0 deletions pkg/toolkit/tesing_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,22 @@ var columnList = []*Column{
NotNull: false,
Length: -1,
},
{
Name: "ip_address",
TypeName: "inet",
TypeOid: pgtype.InetOID,
Num: 22,
NotNull: false,
Length: -1,
},
{
Name: "net_mask",
TypeName: "cidr",
TypeOid: pgtype.CIDROID,
Num: 23,
NotNull: false,
Length: -1,
},
}

// GetDriverAndRecord - return adhoc table for testing
Expand Down

0 comments on commit 871c992

Please sign in to comment.