schema/field: support for sensitive json fields (#2701)

Closed https://github.com/ent/ent/issues/2596
This commit is contained in:
Ariel Mashraki
2022-06-29 11:27:10 +03:00
committed by GitHub
parent 5dbfa24b46
commit 6793d74da7
5 changed files with 17 additions and 3 deletions

View File

@@ -42,6 +42,7 @@ func (User) Fields() []ent.Field {
field.Strings("strings"). field.Strings("strings").
Optional(), Optional(),
field.JSON("addr", Addr{}). field.JSON("addr", Addr{}).
Sensitive().
Optional(), Optional(),
} }
} }

View File

@@ -38,7 +38,7 @@ type User struct {
// Strings holds the value of the "strings" field. // Strings holds the value of the "strings" field.
Strings []string `json:"strings,omitempty"` Strings []string `json:"strings,omitempty"`
// Addr holds the value of the "addr" field. // Addr holds the value of the "addr" field.
Addr schema.Addr `json:"addr,omitempty"` Addr schema.Addr `json:"-"`
} }
// scanValues returns the types for scanning values from sql.Rows. // scanValues returns the types for scanning values from sql.Rows.
@@ -184,8 +184,7 @@ func (u *User) String() string {
builder.WriteString("strings=") builder.WriteString("strings=")
builder.WriteString(fmt.Sprintf("%v", u.Strings)) builder.WriteString(fmt.Sprintf("%v", u.Strings))
builder.WriteString(", ") builder.WriteString(", ")
builder.WriteString("addr=") builder.WriteString("addr=<sensitive>")
builder.WriteString(fmt.Sprintf("%v", u.Addr))
builder.WriteByte(')') builder.WriteByte(')')
return builder.String() return builder.String()
} }

View File

@@ -11,6 +11,7 @@ import (
"net" "net"
"net/http" "net/http"
"net/url" "net/url"
"reflect"
"testing" "testing"
"entgo.io/ent/dialect" "entgo.io/ent/dialect"
@@ -199,6 +200,11 @@ func NetAddr(t *testing.T, client *ent.Client) {
require.Equal(t, "127.0.0.1:80", client.User.GetX(ctx, usr.ID).Addr.String()) require.Equal(t, "127.0.0.1:80", client.User.GetX(ctx, usr.ID).Addr.String())
usr.Update().SetAddr(schema.Addr{Addr: &net.UDPAddr{IP: ip, Port: 1812}}).ExecX(ctx) usr.Update().SetAddr(schema.Addr{Addr: &net.UDPAddr{IP: ip, Port: 1812}}).ExecX(ctx)
require.Equal(t, "127.0.0.1:1812", client.User.GetX(ctx, usr.ID).Addr.String()) require.Equal(t, "127.0.0.1:1812", client.User.GetX(ctx, usr.ID).Addr.String())
// Ensure sensitive fields are not marshalled.
f, ok := reflect.TypeOf(ent.User{}).FieldByName("Addr")
require.True(t, ok)
require.Equal(t, "-", f.Tag.Get("json"))
} }
func Dirs(t *testing.T, client *ent.Client) { func Dirs(t *testing.T, client *ent.Client) {

View File

@@ -716,6 +716,12 @@ func (b *jsonBuilder) Comment(c string) *jsonBuilder {
return b return b
} }
// Sensitive fields not printable and not serializable.
func (b *jsonBuilder) Sensitive() *jsonBuilder {
b.desc.Sensitive = true
return b
}
// StructTag sets the struct tag of the field. // StructTag sets the struct tag of the field.
func (b *jsonBuilder) StructTag(s string) *jsonBuilder { func (b *jsonBuilder) StructTag(s string) *jsonBuilder {
b.desc.Tag = s b.desc.Tag = s

View File

@@ -474,9 +474,11 @@ func TestJSON(t *testing.T) {
fd = field.Strings("strings"). fd = field.Strings("strings").
Optional(). Optional().
Default([]string{"a", "b"}). Default([]string{"a", "b"}).
Sensitive().
Descriptor() Descriptor()
assert.NoError(t, fd.Err) assert.NoError(t, fd.Err)
assert.True(t, fd.Optional) assert.True(t, fd.Optional)
assert.True(t, fd.Sensitive)
assert.Empty(t, fd.Info.PkgPath) assert.Empty(t, fd.Info.PkgPath)
assert.Equal(t, "strings", fd.Name) assert.Equal(t, "strings", fd.Name)
assert.Equal(t, []string{"a", "b"}, fd.Default) assert.Equal(t, []string{"a", "b"}, fd.Default)