1*1c12ee1eSDan Willemsen// Copyright 2019 The Go Authors. All rights reserved. 2*1c12ee1eSDan Willemsen// Use of this source code is governed by a BSD-style 3*1c12ee1eSDan Willemsen// license that can be found in the LICENSE file. 4*1c12ee1eSDan Willemsen 5*1c12ee1eSDan Willemsenpackage proto_test 6*1c12ee1eSDan Willemsen 7*1c12ee1eSDan Willemsenimport ( 8*1c12ee1eSDan Willemsen "reflect" 9*1c12ee1eSDan Willemsen 10*1c12ee1eSDan Willemsen "google.golang.org/protobuf/encoding/prototext" 11*1c12ee1eSDan Willemsen "google.golang.org/protobuf/internal/filedesc" 12*1c12ee1eSDan Willemsen "google.golang.org/protobuf/internal/flags" 13*1c12ee1eSDan Willemsen "google.golang.org/protobuf/proto" 14*1c12ee1eSDan Willemsen "google.golang.org/protobuf/reflect/protodesc" 15*1c12ee1eSDan Willemsen "google.golang.org/protobuf/reflect/protoreflect" 16*1c12ee1eSDan Willemsen "google.golang.org/protobuf/runtime/protoimpl" 17*1c12ee1eSDan Willemsen "google.golang.org/protobuf/testing/protopack" 18*1c12ee1eSDan Willemsen 19*1c12ee1eSDan Willemsen "google.golang.org/protobuf/types/descriptorpb" 20*1c12ee1eSDan Willemsen) 21*1c12ee1eSDan Willemsen 22*1c12ee1eSDan Willemsenfunc init() { 23*1c12ee1eSDan Willemsen if flags.ProtoLegacy { 24*1c12ee1eSDan Willemsen testValidMessages = append(testValidMessages, noEnforceUTF8TestProtos...) 25*1c12ee1eSDan Willemsen } else { 26*1c12ee1eSDan Willemsen testInvalidMessages = append(testInvalidMessages, noEnforceUTF8TestProtos...) 27*1c12ee1eSDan Willemsen } 28*1c12ee1eSDan Willemsen} 29*1c12ee1eSDan Willemsen 30*1c12ee1eSDan Willemsenvar noEnforceUTF8TestProtos = []testProto{ 31*1c12ee1eSDan Willemsen { 32*1c12ee1eSDan Willemsen desc: "invalid UTF-8 in optional string field", 33*1c12ee1eSDan Willemsen decodeTo: []proto.Message{&TestNoEnforceUTF8{ 34*1c12ee1eSDan Willemsen OptionalString: string("abc\xff"), 35*1c12ee1eSDan Willemsen }}, 36*1c12ee1eSDan Willemsen wire: protopack.Message{ 37*1c12ee1eSDan Willemsen protopack.Tag{1, protopack.BytesType}, protopack.String("abc\xff"), 38*1c12ee1eSDan Willemsen }.Marshal(), 39*1c12ee1eSDan Willemsen }, 40*1c12ee1eSDan Willemsen { 41*1c12ee1eSDan Willemsen desc: "invalid UTF-8 in optional string field of Go bytes", 42*1c12ee1eSDan Willemsen decodeTo: []proto.Message{&TestNoEnforceUTF8{ 43*1c12ee1eSDan Willemsen OptionalBytes: []byte("abc\xff"), 44*1c12ee1eSDan Willemsen }}, 45*1c12ee1eSDan Willemsen wire: protopack.Message{ 46*1c12ee1eSDan Willemsen protopack.Tag{2, protopack.BytesType}, protopack.String("abc\xff"), 47*1c12ee1eSDan Willemsen }.Marshal(), 48*1c12ee1eSDan Willemsen }, 49*1c12ee1eSDan Willemsen { 50*1c12ee1eSDan Willemsen desc: "invalid UTF-8 in repeated string field", 51*1c12ee1eSDan Willemsen decodeTo: []proto.Message{&TestNoEnforceUTF8{ 52*1c12ee1eSDan Willemsen RepeatedString: []string{string("foo"), string("abc\xff")}, 53*1c12ee1eSDan Willemsen }}, 54*1c12ee1eSDan Willemsen wire: protopack.Message{ 55*1c12ee1eSDan Willemsen protopack.Tag{3, protopack.BytesType}, protopack.String("foo"), 56*1c12ee1eSDan Willemsen protopack.Tag{3, protopack.BytesType}, protopack.String("abc\xff"), 57*1c12ee1eSDan Willemsen }.Marshal(), 58*1c12ee1eSDan Willemsen }, 59*1c12ee1eSDan Willemsen { 60*1c12ee1eSDan Willemsen desc: "invalid UTF-8 in repeated string field of Go bytes", 61*1c12ee1eSDan Willemsen decodeTo: []proto.Message{&TestNoEnforceUTF8{ 62*1c12ee1eSDan Willemsen RepeatedBytes: [][]byte{[]byte("foo"), []byte("abc\xff")}, 63*1c12ee1eSDan Willemsen }}, 64*1c12ee1eSDan Willemsen wire: protopack.Message{ 65*1c12ee1eSDan Willemsen protopack.Tag{4, protopack.BytesType}, protopack.String("foo"), 66*1c12ee1eSDan Willemsen protopack.Tag{4, protopack.BytesType}, protopack.String("abc\xff"), 67*1c12ee1eSDan Willemsen }.Marshal(), 68*1c12ee1eSDan Willemsen }, 69*1c12ee1eSDan Willemsen { 70*1c12ee1eSDan Willemsen desc: "invalid UTF-8 in oneof string field", 71*1c12ee1eSDan Willemsen decodeTo: []proto.Message{ 72*1c12ee1eSDan Willemsen &TestNoEnforceUTF8{OneofField: &TestNoEnforceUTF8_OneofString{string("abc\xff")}}, 73*1c12ee1eSDan Willemsen }, 74*1c12ee1eSDan Willemsen wire: protopack.Message{protopack.Tag{5, protopack.BytesType}, protopack.String("abc\xff")}.Marshal(), 75*1c12ee1eSDan Willemsen }, 76*1c12ee1eSDan Willemsen { 77*1c12ee1eSDan Willemsen desc: "invalid UTF-8 in oneof string field of Go bytes", 78*1c12ee1eSDan Willemsen decodeTo: []proto.Message{ 79*1c12ee1eSDan Willemsen &TestNoEnforceUTF8{OneofField: &TestNoEnforceUTF8_OneofBytes{[]byte("abc\xff")}}, 80*1c12ee1eSDan Willemsen }, 81*1c12ee1eSDan Willemsen wire: protopack.Message{protopack.Tag{6, protopack.BytesType}, protopack.String("abc\xff")}.Marshal(), 82*1c12ee1eSDan Willemsen }, 83*1c12ee1eSDan Willemsen} 84*1c12ee1eSDan Willemsen 85*1c12ee1eSDan Willemsentype TestNoEnforceUTF8 struct { 86*1c12ee1eSDan Willemsen OptionalString string `protobuf:"bytes,1,opt,name=optional_string"` 87*1c12ee1eSDan Willemsen OptionalBytes []byte `protobuf:"bytes,2,opt,name=optional_bytes"` 88*1c12ee1eSDan Willemsen RepeatedString []string `protobuf:"bytes,3,rep,name=repeated_string"` 89*1c12ee1eSDan Willemsen RepeatedBytes [][]byte `protobuf:"bytes,4,rep,name=repeated_bytes"` 90*1c12ee1eSDan Willemsen OneofField isOneofField `protobuf_oneof:"oneof_field"` 91*1c12ee1eSDan Willemsen} 92*1c12ee1eSDan Willemsen 93*1c12ee1eSDan Willemsentype isOneofField interface{ isOneofField() } 94*1c12ee1eSDan Willemsen 95*1c12ee1eSDan Willemsentype TestNoEnforceUTF8_OneofString struct { 96*1c12ee1eSDan Willemsen OneofString string `protobuf:"bytes,5,opt,name=oneof_string,oneof"` 97*1c12ee1eSDan Willemsen} 98*1c12ee1eSDan Willemsentype TestNoEnforceUTF8_OneofBytes struct { 99*1c12ee1eSDan Willemsen OneofBytes []byte `protobuf:"bytes,6,opt,name=oneof_bytes,oneof"` 100*1c12ee1eSDan Willemsen} 101*1c12ee1eSDan Willemsen 102*1c12ee1eSDan Willemsenfunc (*TestNoEnforceUTF8_OneofString) isOneofField() {} 103*1c12ee1eSDan Willemsenfunc (*TestNoEnforceUTF8_OneofBytes) isOneofField() {} 104*1c12ee1eSDan Willemsen 105*1c12ee1eSDan Willemsenfunc (m *TestNoEnforceUTF8) ProtoReflect() protoreflect.Message { 106*1c12ee1eSDan Willemsen return messageInfo_TestNoEnforceUTF8.MessageOf(m) 107*1c12ee1eSDan Willemsen} 108*1c12ee1eSDan Willemsen 109*1c12ee1eSDan Willemsenvar messageInfo_TestNoEnforceUTF8 = protoimpl.MessageInfo{ 110*1c12ee1eSDan Willemsen GoReflectType: reflect.TypeOf((*TestNoEnforceUTF8)(nil)), 111*1c12ee1eSDan Willemsen Desc: func() protoreflect.MessageDescriptor { 112*1c12ee1eSDan Willemsen pb := new(descriptorpb.FileDescriptorProto) 113*1c12ee1eSDan Willemsen if err := prototext.Unmarshal([]byte(` 114*1c12ee1eSDan Willemsen syntax: "proto3" 115*1c12ee1eSDan Willemsen name: "test.proto" 116*1c12ee1eSDan Willemsen message_type: [{ 117*1c12ee1eSDan Willemsen name: "TestNoEnforceUTF8" 118*1c12ee1eSDan Willemsen field: [ 119*1c12ee1eSDan Willemsen {name:"optional_string" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, 120*1c12ee1eSDan Willemsen {name:"optional_bytes" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}, 121*1c12ee1eSDan Willemsen {name:"repeated_string" number:3 label:LABEL_REPEATED type:TYPE_STRING}, 122*1c12ee1eSDan Willemsen {name:"repeated_bytes" number:4 label:LABEL_REPEATED type:TYPE_STRING}, 123*1c12ee1eSDan Willemsen {name:"oneof_string" number:5 label:LABEL_OPTIONAL type:TYPE_STRING, oneof_index:0}, 124*1c12ee1eSDan Willemsen {name:"oneof_bytes" number:6 label:LABEL_OPTIONAL type:TYPE_STRING, oneof_index:0} 125*1c12ee1eSDan Willemsen ] 126*1c12ee1eSDan Willemsen oneof_decl: [{name:"oneof_field"}] 127*1c12ee1eSDan Willemsen }] 128*1c12ee1eSDan Willemsen `), pb); err != nil { 129*1c12ee1eSDan Willemsen panic(err) 130*1c12ee1eSDan Willemsen } 131*1c12ee1eSDan Willemsen fd, err := protodesc.NewFile(pb, nil) 132*1c12ee1eSDan Willemsen if err != nil { 133*1c12ee1eSDan Willemsen panic(err) 134*1c12ee1eSDan Willemsen } 135*1c12ee1eSDan Willemsen md := fd.Messages().Get(0) 136*1c12ee1eSDan Willemsen for i := 0; i < md.Fields().Len(); i++ { 137*1c12ee1eSDan Willemsen md.Fields().Get(i).(*filedesc.Field).L1.HasEnforceUTF8 = true 138*1c12ee1eSDan Willemsen md.Fields().Get(i).(*filedesc.Field).L1.EnforceUTF8 = false 139*1c12ee1eSDan Willemsen } 140*1c12ee1eSDan Willemsen return md 141*1c12ee1eSDan Willemsen }(), 142*1c12ee1eSDan Willemsen OneofWrappers: []interface{}{ 143*1c12ee1eSDan Willemsen (*TestNoEnforceUTF8_OneofString)(nil), 144*1c12ee1eSDan Willemsen (*TestNoEnforceUTF8_OneofBytes)(nil), 145*1c12ee1eSDan Willemsen }, 146*1c12ee1eSDan Willemsen} 147