Documentation
¶
Overview ¶
Package sensitive provides base types who's values should never be seen by the human eye.
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var (
FormatBoolFn = func(s Bool, f fmt.State, c rune) {} //nolint:gochecknoglobals // By design.
)
var (
FormatBytesFn = func(s Bytes, f fmt.State, c rune) {} //nolint:gochecknoglobals // By design.
)
var (
FormatDecimalFn = func(s Decimal, f fmt.State, c rune) {} //nolint:gochecknoglobals // By design.
)
var (
FormatFloat32Fn = func(s Float32, f fmt.State, c rune) {} //nolint:gochecknoglobals // By design.
)
var (
FormatFloat64Fn = func(s Float64, f fmt.State, c rune) {} //nolint:gochecknoglobals // By design.
)
var (
FormatInt16Fn = func(s Int16, f fmt.State, c rune) {} //nolint:gochecknoglobals // By design.
)
var (
FormatInt32Fn = func(s Int32, f fmt.State, c rune) {} //nolint:gochecknoglobals // By design.
)
var (
FormatInt64Fn = func(s Int64, f fmt.State, c rune) {} //nolint:gochecknoglobals // By design.
)
var (
FormatInt8Fn = func(s Int8, f fmt.State, c rune) {} //nolint:gochecknoglobals // By design.
)
var (
FormatIntFn = func(s Int, f fmt.State, c rune) {} //nolint:gochecknoglobals // By design.
)
var (
FormatStringFn = func(s String, f fmt.State, c rune) {} //nolint:gochecknoglobals // By design.
)
var (
FormatUint16Fn = func(s Uint16, f fmt.State, c rune) {} //nolint:gochecknoglobals // By design.
)
var (
FormatUint32Fn = func(s Uint32, f fmt.State, c rune) {} //nolint:gochecknoglobals // By design.
)
var (
FormatUint64Fn = func(s Uint64, f fmt.State, c rune) {} //nolint:gochecknoglobals // By design.
)
var (
FormatUint8Fn = func(s Uint8, f fmt.State, c rune) {} //nolint:gochecknoglobals // By design.
)
var (
FormatUintFn = func(s Uint, f fmt.State, c rune) {} //nolint:gochecknoglobals // By design.
)
Functions ¶
func Disable ¶ added in v0.0.6
func Disable()
Disable protection of sensitive values.
This is designed to be used only in tests to make it easier to compare got/want values. To make Disable actually works it's not enough to just call it, there are a couple of extra requirements to minimize a chance to get disabled sensitive in production:
- Current binary name should have ".test" suffix.
- Environment variable GO_TEST_DISABLE_SENSITIVE should not be empty.
It is recommended to call it from TestMain or non-Parallel tests because it is not safe to call from simultaneous goroutines.
Calling Redact after Disable will re-enable protection of sensitive values.
As an extra protection it's recommended to add this into your main():
os.Unsetenv("GO_TEST_DISABLE_SENSITIVE")
func Format ¶
Format outputs value accordingly to formatting options.
It is useful in case you'll redefine some Format<type>Fn to output redacted value using formatting applied to original value.
sensitive.FormatStringFn = func(s sensitive.String, f fmt.State, c rune) { sensitive.Format(f, c, "REDACTED") } sensitive.FormatBytesFn = func(s sensitive.Bytes, f fmt.State, c rune) { sensitive.Format(f, c, []byte{0xDE, 0xFA, 0xCE}) }
func Redact ¶ added in v0.0.4
func Redact()
Redact sets all Format<type>Fn to output visible, non-zero values:
Bool: FALSE (in upper case, unlike usual bool) Float*: NaN Int*: math.MinInt* (MinInt32 for Int) Uint*: math.MaxUint* (MaxUint32 for Uint) String: "REDACTED" Bytes: 0xDEFACE Decimal: NaN
Example ¶
package main import ( "encoding/json" "encoding/xml" "fmt" "os" "github.com/shopspring/decimal" "github.com/powerman/sensitive" ) func main() { var ( vBool sensitive.Bool = true //nolint:stylecheck // False positive. vFloat32 sensitive.Float32 = 4.2 vFloat64 sensitive.Float64 = 42.42 vInt8 sensitive.Int8 = -42 vInt16 sensitive.Int16 = -4242 vInt32 sensitive.Int32 = -424242 vInt64 sensitive.Int64 = -42424242 vInt sensitive.Int = -42424242 vUint8 sensitive.Uint8 = 42 vUint16 sensitive.Uint16 = 4242 vUint32 sensitive.Uint32 = 424242 vUint64 sensitive.Uint64 = 42424242 vUint sensitive.Uint = 42424242 vString sensitive.String = "secret" vBytes sensitive.Bytes = []byte("secret") vDecimal = sensitive.Decimal(decimal.NewFromFloat(42.42)) vs = []interface{}{ vBool, vFloat32, vFloat64, vInt8, vInt16, vInt32, vInt64, vInt, vUint8, vUint16, vUint32, vUint64, vUint, vString, vBytes, vDecimal, } imap = map[interface{}]interface{}{ vBool: vBool, vFloat32: vFloat32, vFloat64: vFloat64, vInt8: vInt8, vInt16: vInt16, vInt32: vInt32, vInt64: vInt64, vInt: vInt, vUint8: vUint8, vUint16: vUint16, vUint32: vUint32, vUint64: vUint64, vUint: vUint, vString: vString, // vBytes: vBytes, vDecimal: vDecimal, } vmap = map[string]interface{}{ "Bool": vBool, "Float32": vFloat32, "Float64": vFloat64, "Int8": vInt8, "Int16": vInt16, "Int32": vInt32, "Int64": vInt64, "Int": vInt, "Uint8": vUint8, "Uint16": vUint16, "Uint32": vUint32, "Uint64": vUint64, "Uint": vUint, "String": vString, "Bytes": vBytes, "Decimal": vDecimal, } exported = struct { VBool sensitive.Bool VFloat32 sensitive.Float32 VFloat64 sensitive.Float64 VInt8 sensitive.Int8 VInt16 sensitive.Int16 VInt32 sensitive.Int32 VInt64 sensitive.Int64 VInt sensitive.Int VUint8 sensitive.Uint8 VUint16 sensitive.Uint16 VUint32 sensitive.Uint32 VUint64 sensitive.Uint64 VUint sensitive.Uint VString sensitive.String VBytes sensitive.Bytes VDecimal sensitive.Decimal }{ VBool: vBool, VFloat32: vFloat32, VFloat64: vFloat64, VInt8: vInt8, VInt16: vInt16, VInt32: vInt32, VInt64: vInt64, VInt: vInt, VUint8: vUint8, VUint16: vUint16, VUint32: vUint32, VUint64: vUint64, VUint: vUint, VString: vString, VBytes: vBytes, VDecimal: vDecimal, } unexported = struct { vBool sensitive.Bool vFloat32 sensitive.Float32 vFloat64 sensitive.Float64 vInt8 sensitive.Int8 vInt16 sensitive.Int16 vInt32 sensitive.Int32 vInt64 sensitive.Int64 vInt sensitive.Int vUint8 sensitive.Uint8 vUint16 sensitive.Uint16 vUint32 sensitive.Uint32 vUint64 sensitive.Uint64 vUint sensitive.Uint vString sensitive.String vBytes sensitive.Bytes // vDecimal Decimal }{ vBool: vBool, vFloat32: vFloat32, vFloat64: vFloat64, vInt8: vInt8, vInt16: vInt16, vInt32: vInt32, vInt64: vInt64, vInt: vInt, vUint8: vUint8, vUint16: vUint16, vUint32: vUint32, vUint64: vUint64, vUint: vUint, vString: vString, vBytes: vBytes, // vDecimal: vDecimal, } ) // Outputs to stderr, not intercepted by testing package: // println: true +4.200000e+000 +4.242000e+001 -42 -4242 -424242 -42424242 -42424242 42 4242 424242 42424242 42424242 secret [6/6]0xc000216158 println("println:", vBool, vFloat32, vFloat64, vInt8, vInt16, vInt32, vInt64, vInt, vUint8, vUint16, vUint32, vUint64, vUint, vString, vBytes, // vDecimal, ) output := func() { fmt.Println(append(append([]interface{}{"fmt.Println(...):"}, vs...), "EOL")...) fmt.Printf("fmt.Printf: %t %e %E %c %b %o %x %d %c %b %O %X %U %q %X %v EOL\n", vs...) fmt.Printf("fmt.Printf(vs): %v\n", vs) fmt.Printf("fmt.Printf(imap): %v\n", imap) fmt.Printf("fmt.Printf(vmap): %v\n", vmap) fmt.Printf("fmt.Printf(exported): %v\n", exported) fmt.Printf("fmt.Printf(unexported): %v\n", unexported) json.NewEncoder(os.Stdout).Encode(vs) json.NewEncoder(os.Stdout).Encode(vmap) json.NewEncoder(os.Stdout).Encode(exported) xml.NewEncoder(os.Stdout).Encode(vs) fmt.Println() } output() sensitive.Redact() os.Unsetenv("GO_TEST_DISABLE_SENSITIVE") sensitive.Disable() output() os.Setenv("GO_TEST_DISABLE_SENSITIVE", "1") sensitive.Disable() output() }
Output: fmt.Println(...): EOL fmt.Printf: EOL fmt.Printf(vs): [ ] fmt.Printf(imap): map[: : : : : : : : : : : : : : :] fmt.Printf(vmap): map[Bool: Bytes: Decimal: Float32: Float64: Int: Int16: Int32: Int64: Int8: String: Uint: Uint16: Uint32: Uint64: Uint8:] fmt.Printf(exported): { } fmt.Printf(unexported): {true 4.2 42.42 -42 -4242 -424242 -42424242 -42424242 42 4242 424242 42424242 42424242 secret [115 101 99 114 101 116]} [null,null,null,null,null,null,null,null,null,null,null,null,null,"",null,null] {"Bool":null,"Bytes":null,"Decimal":null,"Float32":null,"Float64":null,"Int":null,"Int16":null,"Int32":null,"Int64":null,"Int8":null,"String":"","Uint":null,"Uint16":null,"Uint32":null,"Uint64":null,"Uint8":null} {"VBool":null,"VFloat32":null,"VFloat64":null,"VInt8":null,"VInt16":null,"VInt32":null,"VInt64":null,"VInt":null,"VUint8":null,"VUint16":null,"VUint32":null,"VUint64":null,"VUint":null,"VString":"","VBytes":null,"VDecimal":null} <Bool></Bool><Float32></Float32><Float64></Float64><Int8></Int8><Int16></Int16><Int32></Int32><Int64></Int64><Int></Int><Uint8></Uint8><Uint16></Uint16><Uint32></Uint32><Uint64></Uint64><Uint></Uint><String></String><Bytes></Bytes><Decimal></Decimal> fmt.Println(...): FALSE NaN NaN -128 -32768 -2147483648 -9223372036854775808 -2147483648 255 65535 4294967295 18446744073709551615 4294967295 REDACTED [222 250 206] NaN EOL fmt.Printf: FALSE NaN NaN � -1000000000000000 -20000000000 -8000000000000000 -2147483648 ÿ 1111111111111111 0o37777777777 FFFFFFFFFFFFFFFF U+FFFFFFFF "REDACTED" DEFACE NaN EOL fmt.Printf(vs): [FALSE NaN NaN -128 -32768 -2147483648 -9223372036854775808 -2147483648 255 65535 4294967295 18446744073709551615 4294967295 REDACTED [222 250 206] NaN] fmt.Printf(imap): map[FALSE:FALSE NaN:NaN NaN:NaN -2147483648:-2147483648 -32768:-32768 -2147483648:-2147483648 -9223372036854775808:-9223372036854775808 -128:-128 REDACTED:REDACTED 4294967295:4294967295 65535:65535 4294967295:4294967295 18446744073709551615:18446744073709551615 255:255 NaN:NaN] fmt.Printf(vmap): map[Bool:FALSE Bytes:[222 250 206] Decimal:NaN Float32:NaN Float64:NaN Int:-2147483648 Int16:-32768 Int32:-2147483648 Int64:-9223372036854775808 Int8:-128 String:REDACTED Uint:4294967295 Uint16:65535 Uint32:4294967295 Uint64:18446744073709551615 Uint8:255] fmt.Printf(exported): {FALSE NaN NaN -128 -32768 -2147483648 -9223372036854775808 -2147483648 255 65535 4294967295 18446744073709551615 4294967295 REDACTED [222 250 206] NaN} fmt.Printf(unexported): {true 4.2 42.42 -42 -4242 -424242 -42424242 -42424242 42 4242 424242 42424242 42424242 secret [115 101 99 114 101 116]} <Bool>FALSE</Bool><Float32>NaN</Float32><Float64>NaN</Float64><Int8>-128</Int8><Int16>-32768</Int16><Int32>-2147483648</Int32><Int64>-9223372036854775808</Int64><Int>-2147483648</Int><Uint8>255</Uint8><Uint16>65535</Uint16><Uint32>4294967295</Uint32><Uint64>18446744073709551615</Uint64><Uint>4294967295</Uint><String>REDACTED</String><Bytes>DEFACE</Bytes><Decimal>NaN</Decimal> fmt.Println(...): true 4.2 42.42 -42 -4242 -424242 -42424242 -42424242 42 4242 424242 42424242 42424242 secret [115 101 99 114 101 116] 42.42 EOL fmt.Printf: true 4.200000e+00 4.242000E+01 � -1000010010010 -1474462 -28757b2 -42424242 * 1000010010010 0o1474462 28757B2 U+28757B2 "secret" 736563726574 42.42 EOL fmt.Printf(vs): [true 4.2 42.42 -42 -4242 -424242 -42424242 -42424242 42 4242 424242 42424242 42424242 secret [115 101 99 114 101 116] 42.42] fmt.Printf(imap): map[true:true 4.2:4.2 42.42:42.42 -42424242:-42424242 -4242:-4242 -424242:-424242 -42424242:-42424242 -42:-42 secret:secret 42424242:42424242 4242:4242 424242:424242 42424242:42424242 42:42 42.42:42.42] fmt.Printf(vmap): map[Bool:true Bytes:[115 101 99 114 101 116] Decimal:42.42 Float32:4.2 Float64:42.42 Int:-42424242 Int16:-4242 Int32:-424242 Int64:-42424242 Int8:-42 String:secret Uint:42424242 Uint16:4242 Uint32:424242 Uint64:42424242 Uint8:42] fmt.Printf(exported): {true 4.2 42.42 -42 -4242 -424242 -42424242 -42424242 42 4242 424242 42424242 42424242 secret [115 101 99 114 101 116] 42.42} fmt.Printf(unexported): {true 4.2 42.42 -42 -4242 -424242 -42424242 -42424242 42 4242 424242 42424242 42424242 secret [115 101 99 114 101 116]} [true,4.2,42.42,-42,-4242,-424242,-42424242,-42424242,42,4242,424242,42424242,42424242,"secret","c2VjcmV0",42.42] {"Bool":true,"Bytes":"c2VjcmV0","Decimal":42.42,"Float32":4.2,"Float64":42.42,"Int":-42424242,"Int16":-4242,"Int32":-424242,"Int64":-42424242,"Int8":-42,"String":"secret","Uint":42424242,"Uint16":4242,"Uint32":424242,"Uint64":42424242,"Uint8":42} {"VBool":true,"VFloat32":4.2,"VFloat64":42.42,"VInt8":-42,"VInt16":-4242,"VInt32":-424242,"VInt64":-42424242,"VInt":-42424242,"VUint8":42,"VUint16":4242,"VUint32":424242,"VUint64":42424242,"VUint":42424242,"VString":"secret","VBytes":"c2VjcmV0","VDecimal":42.42} <Bool>true</Bool><Float32>4.2</Float32><Float64>42.42</Float64><Int8>-42</Int8><Int16>-4242</Int16><Int32>-424242</Int32><Int64>-42424242</Int64><Int>-42424242</Int><Uint8>42</Uint8><Uint16>4242</Uint16><Uint32>424242</Uint32><Uint64>42424242</Uint64><Uint>42424242</Uint><String>secret</String><Bytes>736563726574</Bytes><Decimal>42.42</Decimal>