From c187b6fb3e35e5cb60ef39cd2f37fadd3506b28f Mon Sep 17 00:00:00 2001 From: Shelikhoo Date: Sat, 19 Jun 2021 20:40:48 +0100 Subject: [PATCH] v2jsonpb full dump --- infra/conf/v2jsonpb/any2.go | 41 +++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/infra/conf/v2jsonpb/any2.go b/infra/conf/v2jsonpb/any2.go index a2a6d915b..c61245f1f 100644 --- a/infra/conf/v2jsonpb/any2.go +++ b/infra/conf/v2jsonpb/any2.go @@ -2,6 +2,7 @@ package v2jsonpb import ( "github.com/golang/protobuf/jsonpb" + "github.com/v2fly/v2ray-core/v4/common/serial" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/types/dynamicpb" @@ -143,6 +144,7 @@ func (v V2JsonProtobufListFollower) IsValid() bool { type V2JsonProtobufMapFollower struct { protoreflect.Map + ValueKind protoreflect.FieldDescriptor } func (v V2JsonProtobufMapFollower) Len() int { @@ -150,7 +152,9 @@ func (v V2JsonProtobufMapFollower) Len() int { } func (v V2JsonProtobufMapFollower) Range(f func(protoreflect.MapKey, protoreflect.Value) bool) { - panic("implement me") + v.Map.Range(func(key protoreflect.MapKey, value protoreflect.Value) bool { + return followMapValue(v.ValueKind, value, key, f) + }) } func (v V2JsonProtobufMapFollower) Has(key protoreflect.MapKey) bool { @@ -206,8 +210,20 @@ func (v *V2JsonProtobufFollower) Range(f func(protoreflect.FieldDescriptor, prot case "google.protobuf.Any.value": url := v.Message.Get(v.Message.Descriptor().Fields().ByName("type_url")).String() fd := &V2JsonProtobufAnyValueField{descriptor, url} - follow := &V2JsonProtobufAnyFollower{v.Message} - return f(fd, protoreflect.ValueOfMessage(follow)) + + bytesout := v.Message.Get(v.Message.Descriptor().Fields().Get(1)).Bytes() + v2type := serial.V2TypeFromURL(url) + instance, err := serial.GetInstance(v2type) + if err != nil { + panic(err) + } + unmarshaler := proto.UnmarshalOptions{AllowPartial: true, Resolver: resolver2{backgroundResolver: serial.GetResolver()}} + err = unmarshaler.Unmarshal(bytesout, instance.(proto.Message)) + if err != nil { + panic(err) + } + + return f(fd, protoreflect.ValueOfMessage(&V2JsonProtobufFollower{instance.(proto.Message).ProtoReflect()})) default: panic("unexpected any value") } @@ -225,7 +241,7 @@ func followValue(descriptor protoreflect.FieldDescriptor, value protoreflect.Val return f(fd, value2) } if descriptor.IsMap() { - value2 := protoreflect.ValueOfMap(V2JsonProtobufMapFollower{value.Map()}) + value2 := protoreflect.ValueOfMap(V2JsonProtobufMapFollower{value.Map(), descriptor.MapValue()}) return f(fd, value2) } value2 := protoreflect.ValueOfMessage(&V2JsonProtobufFollower{value.Message()}) @@ -235,6 +251,23 @@ func followValue(descriptor protoreflect.FieldDescriptor, value protoreflect.Val return f(fd, value) } +func followMapValue(descriptor protoreflect.FieldDescriptor, value protoreflect.Value, mapkey protoreflect.MapKey, f func(protoreflect.MapKey, protoreflect.Value) bool) bool { + if descriptor.Kind() == protoreflect.MessageKind { + if descriptor.IsList() { + value2 := protoreflect.ValueOfList(V2JsonProtobufListFollower{value.List()}) + return f(mapkey, value2) + } + if descriptor.IsMap() { + value2 := protoreflect.ValueOfMap(V2JsonProtobufMapFollower{value.Map(), descriptor.MapValue()}) + return f(mapkey, value2) + } + value2 := protoreflect.ValueOfMessage(&V2JsonProtobufFollower{value.Message()}) + return f(mapkey, value2) + } + + return f(mapkey, value) +} + func (v *V2JsonProtobufFollower) Has(descriptor protoreflect.FieldDescriptor) bool { panic("implement me") }