any2.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. package v2jsonpb
  2. import (
  3. "github.com/golang/protobuf/jsonpb"
  4. "github.com/v2fly/v2ray-core/v4/common/serial"
  5. "google.golang.org/protobuf/proto"
  6. "google.golang.org/protobuf/reflect/protoreflect"
  7. "google.golang.org/protobuf/types/dynamicpb"
  8. "google.golang.org/protobuf/types/known/anypb"
  9. )
  10. type resolver2 struct {
  11. backgroundResolver jsonpb.AnyResolver
  12. }
  13. func (r resolver2) FindMessageByName(message protoreflect.FullName) (protoreflect.MessageType, error) {
  14. panic("implement me")
  15. }
  16. func (r resolver2) FindMessageByURL(url string) (protoreflect.MessageType, error) {
  17. msg, err := r.backgroundResolver.Resolve(url)
  18. if err != nil {
  19. return nil, err
  20. }
  21. return msg.(proto.Message).ProtoReflect().Type(), nil
  22. }
  23. func (r resolver2) FindExtensionByName(field protoreflect.FullName) (protoreflect.ExtensionType, error) {
  24. panic("implement me")
  25. }
  26. func (r resolver2) FindExtensionByNumber(message protoreflect.FullName, field protoreflect.FieldNumber) (protoreflect.ExtensionType, error) {
  27. panic("implement me")
  28. }
  29. type V2JsonProtobufAnyTypeDescriptor struct {
  30. protoreflect.MessageDescriptor
  31. }
  32. func (v V2JsonProtobufAnyTypeDescriptor) FullName() protoreflect.FullName {
  33. return "org.v2fly.SynAny"
  34. }
  35. func (v V2JsonProtobufAnyTypeDescriptor) Fields() protoreflect.FieldDescriptors {
  36. return V2JsonProtobufAnyTypeFields{v.MessageDescriptor.Fields()}
  37. }
  38. type V2JsonProtobufAnyTypeFields struct {
  39. protoreflect.FieldDescriptors
  40. }
  41. func (v V2JsonProtobufAnyTypeFields) Len() int {
  42. panic("implement me")
  43. }
  44. func (v V2JsonProtobufAnyTypeFields) Get(i int) protoreflect.FieldDescriptor {
  45. panic("implement me")
  46. }
  47. func (v V2JsonProtobufAnyTypeFields) ByName(s protoreflect.Name) protoreflect.FieldDescriptor {
  48. panic("implement me")
  49. }
  50. func (v V2JsonProtobufAnyTypeFields) ByJSONName(s string) protoreflect.FieldDescriptor {
  51. switch s {
  52. case "type":
  53. return &V2JsonProtobufFollowerFieldDescriptor{v.FieldDescriptors.ByName("type_url")}
  54. default:
  55. return &V2JsonProtobufAnyValueField{v.FieldDescriptors.ByName("value"), "value"}
  56. }
  57. }
  58. func (v V2JsonProtobufAnyTypeFields) ByTextName(s string) protoreflect.FieldDescriptor {
  59. panic("implement me")
  60. }
  61. func (v V2JsonProtobufAnyTypeFields) ByNumber(n protoreflect.FieldNumber) protoreflect.FieldDescriptor {
  62. panic("implement me")
  63. }
  64. type V2JsonProtobufAnyType struct {
  65. originalType protoreflect.MessageType
  66. syntheticDescriptor V2JsonProtobufAnyTypeDescriptor
  67. }
  68. func (v V2JsonProtobufAnyType) New() protoreflect.Message {
  69. return dynamicpb.NewMessage(v.syntheticDescriptor)
  70. }
  71. func (v V2JsonProtobufAnyType) Zero() protoreflect.Message {
  72. return dynamicpb.NewMessage(v.syntheticDescriptor)
  73. }
  74. func (v V2JsonProtobufAnyType) Descriptor() protoreflect.MessageDescriptor {
  75. return v.syntheticDescriptor
  76. }
  77. type V2JsonProtobufFollowerFieldDescriptor struct {
  78. protoreflect.FieldDescriptor
  79. }
  80. type V2JsonProtobufAnyTypeFieldDescriptor struct {
  81. protoreflect.FieldDescriptor
  82. }
  83. func (v V2JsonProtobufAnyTypeFieldDescriptor) JSONName() string {
  84. return "type"
  85. }
  86. func (v V2JsonProtobufAnyTypeFieldDescriptor) TextName() string {
  87. return "type"
  88. }
  89. type V2JsonProtobufAnyValueField struct {
  90. protoreflect.FieldDescriptor
  91. name string
  92. }
  93. func (v *V2JsonProtobufAnyValueField) Kind() protoreflect.Kind {
  94. return protoreflect.MessageKind
  95. }
  96. func (v *V2JsonProtobufAnyValueField) JSONName() string {
  97. return v.name
  98. }
  99. func (v *V2JsonProtobufAnyValueField) TextName() string {
  100. return v.name
  101. }
  102. type V2JsonProtobufAnyFollower struct {
  103. protoreflect.Message
  104. }
  105. func (v *V2JsonProtobufAnyFollower) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) {
  106. v.Message.Range(func(descriptor protoreflect.FieldDescriptor, value protoreflect.Value) bool {
  107. return followValue(descriptor, value, f)
  108. })
  109. }
  110. type V2JsonProtobufFollower struct {
  111. protoreflect.Message
  112. }
  113. type V2JsonProtobufListFollower struct {
  114. protoreflect.List
  115. }
  116. func (v V2JsonProtobufListFollower) Len() int {
  117. return v.List.Len()
  118. }
  119. func (v V2JsonProtobufListFollower) Get(i int) protoreflect.Value {
  120. return protoreflect.ValueOfMessage(&V2JsonProtobufFollower{v.List.Get(i).Message()})
  121. }
  122. func (v V2JsonProtobufListFollower) Set(i int, value protoreflect.Value) {
  123. panic("implement me")
  124. }
  125. func (v V2JsonProtobufListFollower) Append(value protoreflect.Value) {
  126. v.List.Append(value)
  127. }
  128. func (v V2JsonProtobufListFollower) AppendMutable() protoreflect.Value {
  129. panic("implement me")
  130. }
  131. func (v V2JsonProtobufListFollower) Truncate(i int) {
  132. panic("implement me")
  133. }
  134. func (v V2JsonProtobufListFollower) NewElement() protoreflect.Value {
  135. newelement := v.List.NewElement()
  136. return protoreflect.ValueOfMessage(&V2JsonProtobufFollower{newelement.Message()})
  137. }
  138. func (v V2JsonProtobufListFollower) IsValid() bool {
  139. panic("implement me")
  140. }
  141. type V2JsonProtobufMapFollower struct {
  142. protoreflect.Map
  143. ValueKind protoreflect.FieldDescriptor
  144. }
  145. func (v V2JsonProtobufMapFollower) Len() int {
  146. panic("implement me")
  147. }
  148. func (v V2JsonProtobufMapFollower) Range(f func(protoreflect.MapKey, protoreflect.Value) bool) {
  149. v.Map.Range(func(key protoreflect.MapKey, value protoreflect.Value) bool {
  150. return followMapValue(v.ValueKind, value, key, f)
  151. })
  152. }
  153. func (v V2JsonProtobufMapFollower) Has(key protoreflect.MapKey) bool {
  154. return v.Map.Has(key)
  155. }
  156. func (v V2JsonProtobufMapFollower) Clear(key protoreflect.MapKey) {
  157. panic("implement me")
  158. }
  159. func (v V2JsonProtobufMapFollower) Get(key protoreflect.MapKey) protoreflect.Value {
  160. panic("implement me")
  161. }
  162. func (v V2JsonProtobufMapFollower) Set(key protoreflect.MapKey, value protoreflect.Value) {
  163. v.Map.Set(key, value)
  164. }
  165. func (v V2JsonProtobufMapFollower) Mutable(key protoreflect.MapKey) protoreflect.Value {
  166. panic("implement me")
  167. }
  168. func (v V2JsonProtobufMapFollower) NewValue() protoreflect.Value {
  169. newelement := v.Map.NewValue()
  170. return protoreflect.ValueOfMessage(&V2JsonProtobufFollower{newelement.Message()})
  171. }
  172. func (v V2JsonProtobufMapFollower) IsValid() bool {
  173. panic("implement me")
  174. }
  175. func (v *V2JsonProtobufFollower) Type() protoreflect.MessageType {
  176. panic("implement me")
  177. }
  178. func (v *V2JsonProtobufFollower) New() protoreflect.Message {
  179. panic("implement me")
  180. }
  181. func (v *V2JsonProtobufFollower) Interface() protoreflect.ProtoMessage {
  182. return v.Message.Interface()
  183. }
  184. func (v *V2JsonProtobufFollower) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) {
  185. v.Message.Range(func(descriptor protoreflect.FieldDescriptor, value protoreflect.Value) bool {
  186. name := descriptor.FullName()
  187. fullname := v.Message.Descriptor().FullName()
  188. if fullname == "google.protobuf.Any" {
  189. switch name {
  190. case "google.protobuf.Any.type_url":
  191. fd := V2JsonProtobufAnyTypeFieldDescriptor{descriptor}
  192. return f(fd, value)
  193. case "google.protobuf.Any.value":
  194. url := v.Message.Get(v.Message.Descriptor().Fields().ByName("type_url")).String()
  195. fd := &V2JsonProtobufAnyValueField{descriptor, url}
  196. bytesout := v.Message.Get(v.Message.Descriptor().Fields().Get(1)).Bytes()
  197. v2type := serial.V2TypeFromURL(url)
  198. instance, err := serial.GetInstance(v2type)
  199. if err != nil {
  200. panic(err)
  201. }
  202. unmarshaler := proto.UnmarshalOptions{AllowPartial: true, Resolver: resolver2{backgroundResolver: serial.GetResolver()}}
  203. err = unmarshaler.Unmarshal(bytesout, instance.(proto.Message))
  204. if err != nil {
  205. panic(err)
  206. }
  207. return f(fd, protoreflect.ValueOfMessage(&V2JsonProtobufFollower{instance.(proto.Message).ProtoReflect()}))
  208. default:
  209. panic("unexpected any value")
  210. }
  211. }
  212. return followValue(descriptor, value, f)
  213. })
  214. }
  215. func followValue(descriptor protoreflect.FieldDescriptor, value protoreflect.Value, f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) bool {
  216. fd := V2JsonProtobufFollowerFieldDescriptor{descriptor}
  217. if descriptor.Kind() == protoreflect.MessageKind {
  218. if descriptor.IsList() {
  219. value2 := protoreflect.ValueOfList(V2JsonProtobufListFollower{value.List()})
  220. return f(fd, value2)
  221. }
  222. if descriptor.IsMap() {
  223. value2 := protoreflect.ValueOfMap(V2JsonProtobufMapFollower{value.Map(), descriptor.MapValue()})
  224. return f(fd, value2)
  225. }
  226. value2 := protoreflect.ValueOfMessage(&V2JsonProtobufFollower{value.Message()})
  227. return f(fd, value2)
  228. }
  229. return f(fd, value)
  230. }
  231. func followMapValue(descriptor protoreflect.FieldDescriptor, value protoreflect.Value, mapkey protoreflect.MapKey, f func(protoreflect.MapKey, protoreflect.Value) bool) bool {
  232. if descriptor.Kind() == protoreflect.MessageKind {
  233. if descriptor.IsList() {
  234. value2 := protoreflect.ValueOfList(V2JsonProtobufListFollower{value.List()})
  235. return f(mapkey, value2)
  236. }
  237. if descriptor.IsMap() {
  238. value2 := protoreflect.ValueOfMap(V2JsonProtobufMapFollower{value.Map(), descriptor.MapValue()})
  239. return f(mapkey, value2)
  240. }
  241. value2 := protoreflect.ValueOfMessage(&V2JsonProtobufFollower{value.Message()})
  242. return f(mapkey, value2)
  243. }
  244. return f(mapkey, value)
  245. }
  246. func (v *V2JsonProtobufFollower) Has(descriptor protoreflect.FieldDescriptor) bool {
  247. panic("implement me")
  248. }
  249. func (v *V2JsonProtobufFollower) Clear(descriptor protoreflect.FieldDescriptor) {
  250. v.Message.Clear(descriptor)
  251. }
  252. func (v *V2JsonProtobufFollower) Set(descriptor protoreflect.FieldDescriptor, value protoreflect.Value) {
  253. switch descriptor.(type) {
  254. case V2JsonProtobufFollowerFieldDescriptor:
  255. v.Message.Set(descriptor.(V2JsonProtobufFollowerFieldDescriptor).FieldDescriptor, value)
  256. case *V2JsonProtobufFollowerFieldDescriptor:
  257. v.Message.Set(descriptor.(*V2JsonProtobufFollowerFieldDescriptor).FieldDescriptor, value)
  258. case *V2JsonProtobufAnyValueField:
  259. protodata := value.Message()
  260. bytesw, err := proto.MarshalOptions{AllowPartial: true}.Marshal(&V2JsonProtobufAnyValueFieldReturn{protodata})
  261. if err != nil {
  262. panic(err)
  263. }
  264. v.Message.Set(descriptor.(*V2JsonProtobufAnyValueField).FieldDescriptor, protoreflect.ValueOfBytes(bytesw))
  265. default:
  266. v.Message.Set(descriptor, value)
  267. }
  268. }
  269. type V2JsonProtobufAnyValueFieldReturn struct {
  270. protoreflect.Message
  271. }
  272. func (v *V2JsonProtobufAnyValueFieldReturn) ProtoReflect() protoreflect.Message {
  273. if bufFollow, ok := v.Message.(*V2JsonProtobufFollower); ok {
  274. return bufFollow.Message
  275. }
  276. return v.Message
  277. }
  278. func (v *V2JsonProtobufFollower) Mutable(descriptor protoreflect.FieldDescriptor) protoreflect.Value {
  279. value := v.Message.Mutable(descriptor.(V2JsonProtobufFollowerFieldDescriptor).FieldDescriptor)
  280. if descriptor.IsList() {
  281. return protoreflect.ValueOfList(&V2JsonProtobufListFollower{value.List()})
  282. }
  283. if descriptor.IsMap() {
  284. return protoreflect.ValueOfMap(&V2JsonProtobufMapFollower{value.Map(), descriptor})
  285. }
  286. if descriptor.Kind() == protoreflect.MessageKind {
  287. return protoreflect.ValueOfMessage(&V2JsonProtobufFollower{value.Message()})
  288. }
  289. return value
  290. }
  291. func (v *V2JsonProtobufFollower) NewField(descriptor protoreflect.FieldDescriptor) protoreflect.Value {
  292. if _, ok := descriptor.(*V2JsonProtobufAnyValueField); ok {
  293. url := v.Message.Get(v.Message.Descriptor().Fields().ByName("type_url")).String()
  294. v2type := serial.V2TypeFromURL(url)
  295. instance, err := serial.GetInstance(v2type)
  296. if err != nil {
  297. panic(err)
  298. }
  299. newvalue := protoreflect.ValueOfMessage(&V2JsonProtobufFollower{instance.(proto.Message).ProtoReflect()})
  300. return newvalue
  301. }
  302. value := v.Message.NewField(descriptor.(V2JsonProtobufFollowerFieldDescriptor).FieldDescriptor)
  303. newvalue := protoreflect.ValueOfMessage(&V2JsonProtobufFollower{value.Message()})
  304. return newvalue
  305. }
  306. func (v *V2JsonProtobufFollower) WhichOneof(descriptor protoreflect.OneofDescriptor) protoreflect.FieldDescriptor {
  307. panic("implement me")
  308. }
  309. func (v *V2JsonProtobufFollower) GetUnknown() protoreflect.RawFields {
  310. panic("implement me")
  311. }
  312. func (v *V2JsonProtobufFollower) SetUnknown(fields protoreflect.RawFields) {
  313. v.Message.SetUnknown(fields)
  314. }
  315. func (v *V2JsonProtobufFollower) IsValid() bool {
  316. return v.Message.IsValid()
  317. }
  318. func (v *V2JsonProtobufFollower) ProtoReflect() protoreflect.Message {
  319. return v
  320. }
  321. func (v *V2JsonProtobufFollower) Descriptor() protoreflect.MessageDescriptor {
  322. fullname := v.Message.Descriptor().FullName()
  323. if fullname == "google.protobuf.Any" {
  324. //desc := &V2JsonProtobufAnyType{v.Message.Type(), V2JsonProtobufAnyTypeDescriptor{(&anypb.Any{}).ProtoReflect().Descriptor()}}
  325. desc := &V2JsonProtobufAnyTypeDescriptor{(&anypb.Any{}).ProtoReflect().Descriptor()}
  326. return desc
  327. }
  328. return &V2JsonProtobufFollowerDescriptor{v.Message.Descriptor()}
  329. }
  330. func (v *V2JsonProtobufFollower) Get(fd protoreflect.FieldDescriptor) protoreflect.Value {
  331. panic("implement me")
  332. }
  333. type V2JsonProtobufFollowerDescriptor struct {
  334. protoreflect.MessageDescriptor
  335. }
  336. func (v *V2JsonProtobufFollowerDescriptor) Fields() protoreflect.FieldDescriptors {
  337. return &V2JsonProtobufFollowerFields{v.MessageDescriptor.Fields()}
  338. }
  339. type V2JsonProtobufFollowerFields struct {
  340. protoreflect.FieldDescriptors
  341. }
  342. func (v *V2JsonProtobufFollowerFields) ByJSONName(s string) protoreflect.FieldDescriptor {
  343. return V2JsonProtobufFollowerFieldDescriptor{v.FieldDescriptors.ByJSONName(s)}
  344. }
  345. func (v *V2JsonProtobufFollowerFields) ByTextName(s string) protoreflect.FieldDescriptor {
  346. return V2JsonProtobufFollowerFieldDescriptor{v.FieldDescriptors.ByTextName(s)}
  347. }