Hunter0x7c7
2022-08-11 a82f9cb69f63aaeba40c024960deda7d75b9fece
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
package v4_test
 
import (
    "encoding/json"
    "reflect"
    "testing"
 
    "github.com/golang/protobuf/proto"
    "google.golang.org/protobuf/types/known/anypb"
 
    core "github.com/v2fly/v2ray-core/v5"
    "github.com/v2fly/v2ray-core/v5/app/dispatcher"
    "github.com/v2fly/v2ray-core/v5/app/log"
    "github.com/v2fly/v2ray-core/v5/app/proxyman"
    "github.com/v2fly/v2ray-core/v5/app/router"
    "github.com/v2fly/v2ray-core/v5/app/router/routercommon"
    "github.com/v2fly/v2ray-core/v5/common"
    clog "github.com/v2fly/v2ray-core/v5/common/log"
    "github.com/v2fly/v2ray-core/v5/common/net"
    "github.com/v2fly/v2ray-core/v5/common/protocol"
    "github.com/v2fly/v2ray-core/v5/common/serial"
    "github.com/v2fly/v2ray-core/v5/infra/conf/cfgcommon/muxcfg"
    "github.com/v2fly/v2ray-core/v5/infra/conf/cfgcommon/testassist"
    _ "github.com/v2fly/v2ray-core/v5/infra/conf/geodata/memconservative"
    _ "github.com/v2fly/v2ray-core/v5/infra/conf/geodata/standard"
    v4 "github.com/v2fly/v2ray-core/v5/infra/conf/v4"
    "github.com/v2fly/v2ray-core/v5/proxy/blackhole"
    dns_proxy "github.com/v2fly/v2ray-core/v5/proxy/dns"
    "github.com/v2fly/v2ray-core/v5/proxy/freedom"
    "github.com/v2fly/v2ray-core/v5/proxy/vmess"
    "github.com/v2fly/v2ray-core/v5/proxy/vmess/inbound"
    "github.com/v2fly/v2ray-core/v5/transport/internet"
    "github.com/v2fly/v2ray-core/v5/transport/internet/http"
    "github.com/v2fly/v2ray-core/v5/transport/internet/tls"
    "github.com/v2fly/v2ray-core/v5/transport/internet/websocket"
)
 
func TestV2RayConfig(t *testing.T) {
    createParser := func() func(string) (proto.Message, error) {
        return func(s string) (proto.Message, error) {
            config := new(v4.Config)
            if err := json.Unmarshal([]byte(s), config); err != nil {
                return nil, err
            }
            return config.Build()
        }
    }
 
    testassist.RunMultiTestCase(t, []testassist.TestCase{
        {
            Input: `{
                "outbound": {
                    "protocol": "freedom",
                    "settings": {}
                },
                "log": {
                    "access": "/var/log/v2ray/access.log",
                    "loglevel": "error",
                    "error": "/var/log/v2ray/error.log"
                },
                "inbound": {
                    "streamSettings": {
                        "network": "ws",
                        "wsSettings": {
                            "headers": {
                                "host": "example.domain"
                            },
                            "path": ""
                        },
                        "tlsSettings": {
                            "alpn": "h2"
                        },
                        "security": "tls"
                    },
                    "protocol": "vmess",
                    "port": 443,
                    "settings": {
                        "clients": [
                            {
                                "alterId": 100,
                                "security": "aes-128-gcm",
                                "id": "0cdf8a45-303d-4fed-9780-29aa7f54175e"
                            }
                        ]
                    }
                },
                "inbounds": [{
                    "streamSettings": {
                        "network": "ws",
                        "wsSettings": {
                            "headers": {
                                "host": "example.domain"
                            },
                            "path": ""
                        },
                        "tlsSettings": {
                            "alpn": "h2"
                        },
                        "security": "tls"
                    },
                    "protocol": "vmess",
                    "port": "443-500",
                    "allocate": {
                        "strategy": "random",
                        "concurrency": 3
                    },
                    "settings": {
                        "clients": [
                            {
                                "alterId": 100,
                                "security": "aes-128-gcm",
                                "id": "0cdf8a45-303d-4fed-9780-29aa7f54175e"
                            }
                        ]
                    }
                }],
                "outboundDetour": [
                    {
                        "tag": "blocked",
                        "protocol": "blackhole"
                    },
                    {
                        "protocol": "dns"
                    }
                ],
                "routing": {
                    "strategy": "rules",
                    "settings": {
                        "rules": [
                            {
                                "ip": [
                                    "10.0.0.0/8"
                                ],
                                "type": "field",
                                "outboundTag": "blocked"
                            }
                        ]
                    }
                },
                "transport": {
                    "httpSettings": {
                        "path": "/test"
                    }
                }
            }`,
            Parser: createParser(),
            Output: &core.Config{
                App: []*anypb.Any{
                    serial.ToTypedMessage(&log.Config{
                        Error: &log.LogSpecification{
                            Type:  log.LogType_File,
                            Level: clog.Severity_Error,
                            Path:  "/var/log/v2ray/error.log",
                        },
                        Access: &log.LogSpecification{
                            Type: log.LogType_File,
                            Path: "/var/log/v2ray/access.log",
                        },
                    }),
                    serial.ToTypedMessage(&dispatcher.Config{}),
                    serial.ToTypedMessage(&proxyman.InboundConfig{}),
                    serial.ToTypedMessage(&proxyman.OutboundConfig{}),
                    serial.ToTypedMessage(&router.Config{
                        DomainStrategy: router.DomainStrategy_AsIs,
                        Rule: []*router.RoutingRule{
                            {
                                Geoip: []*routercommon.GeoIP{
                                    {
                                        Cidr: []*routercommon.CIDR{
                                            {
                                                Ip:     []byte{10, 0, 0, 0},
                                                Prefix: 8,
                                            },
                                        },
                                    },
                                },
                                TargetTag: &router.RoutingRule_Tag{
                                    Tag: "blocked",
                                },
                            },
                        },
                    }),
                },
                Outbound: []*core.OutboundHandlerConfig{
                    {
                        SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
                            StreamSettings: &internet.StreamConfig{
                                ProtocolName: "tcp",
                                TransportSettings: []*internet.TransportConfig{
                                    {
                                        ProtocolName: "http",
                                        Settings: serial.ToTypedMessage(&http.Config{
                                            Path: "/test",
                                        }),
                                    },
                                },
                            },
                        }),
                        ProxySettings: serial.ToTypedMessage(&freedom.Config{
                            DomainStrategy: freedom.Config_AS_IS,
                            UserLevel:      0,
                        }),
                    },
                    {
                        Tag: "blocked",
                        SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
                            StreamSettings: &internet.StreamConfig{
                                ProtocolName: "tcp",
                                TransportSettings: []*internet.TransportConfig{
                                    {
                                        ProtocolName: "http",
                                        Settings: serial.ToTypedMessage(&http.Config{
                                            Path: "/test",
                                        }),
                                    },
                                },
                            },
                        }),
                        ProxySettings: serial.ToTypedMessage(&blackhole.Config{}),
                    },
                    {
                        SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
                            StreamSettings: &internet.StreamConfig{
                                ProtocolName: "tcp",
                                TransportSettings: []*internet.TransportConfig{
                                    {
                                        ProtocolName: "http",
                                        Settings: serial.ToTypedMessage(&http.Config{
                                            Path: "/test",
                                        }),
                                    },
                                },
                            },
                        }),
                        ProxySettings: serial.ToTypedMessage(&dns_proxy.Config{
                            Server: &net.Endpoint{},
                        }),
                    },
                },
                Inbound: []*core.InboundHandlerConfig{
                    {
                        ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
                            PortRange: &net.PortRange{
                                From: 443,
                                To:   443,
                            },
                            StreamSettings: &internet.StreamConfig{
                                ProtocolName: "websocket",
                                TransportSettings: []*internet.TransportConfig{
                                    {
                                        ProtocolName: "websocket",
                                        Settings: serial.ToTypedMessage(&websocket.Config{
                                            Header: []*websocket.Header{
                                                {
                                                    Key:   "host",
                                                    Value: "example.domain",
                                                },
                                            },
                                        }),
                                    },
                                    {
                                        ProtocolName: "http",
                                        Settings: serial.ToTypedMessage(&http.Config{
                                            Path: "/test",
                                        }),
                                    },
                                },
                                SecurityType: "v2ray.core.transport.internet.tls.Config",
                                SecuritySettings: []*anypb.Any{
                                    serial.ToTypedMessage(&tls.Config{
                                        NextProtocol: []string{"h2"},
                                    }),
                                },
                            },
                        }),
                        ProxySettings: serial.ToTypedMessage(&inbound.Config{
                            User: []*protocol.User{
                                {
                                    Level: 0,
                                    Account: serial.ToTypedMessage(&vmess.Account{
                                        Id:      "0cdf8a45-303d-4fed-9780-29aa7f54175e",
                                        AlterId: 100,
                                        SecuritySettings: &protocol.SecurityConfig{
                                            Type: protocol.SecurityType_AES128_GCM,
                                        },
                                    }),
                                },
                            },
                        }),
                    },
                    {
                        ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
                            PortRange: &net.PortRange{
                                From: 443,
                                To:   500,
                            },
                            AllocationStrategy: &proxyman.AllocationStrategy{
                                Type: proxyman.AllocationStrategy_Random,
                                Concurrency: &proxyman.AllocationStrategy_AllocationStrategyConcurrency{
                                    Value: 3,
                                },
                            },
                            StreamSettings: &internet.StreamConfig{
                                ProtocolName: "websocket",
                                TransportSettings: []*internet.TransportConfig{
                                    {
                                        ProtocolName: "websocket",
                                        Settings: serial.ToTypedMessage(&websocket.Config{
                                            Header: []*websocket.Header{
                                                {
                                                    Key:   "host",
                                                    Value: "example.domain",
                                                },
                                            },
                                        }),
                                    },
                                    {
                                        ProtocolName: "http",
                                        Settings: serial.ToTypedMessage(&http.Config{
                                            Path: "/test",
                                        }),
                                    },
                                },
                                SecurityType: "v2ray.core.transport.internet.tls.Config",
                                SecuritySettings: []*anypb.Any{
                                    serial.ToTypedMessage(&tls.Config{
                                        NextProtocol: []string{"h2"},
                                    }),
                                },
                            },
                        }),
                        ProxySettings: serial.ToTypedMessage(&inbound.Config{
                            User: []*protocol.User{
                                {
                                    Level: 0,
                                    Account: serial.ToTypedMessage(&vmess.Account{
                                        Id:      "0cdf8a45-303d-4fed-9780-29aa7f54175e",
                                        AlterId: 100,
                                        SecuritySettings: &protocol.SecurityConfig{
                                            Type: protocol.SecurityType_AES128_GCM,
                                        },
                                    }),
                                },
                            },
                        }),
                    },
                },
            },
        },
    })
}
 
func TestMuxConfig_Build(t *testing.T) {
    tests := []struct {
        name   string
        fields string
        want   *proxyman.MultiplexingConfig
    }{
        {"default", `{"enabled": true, "concurrency": 16}`, &proxyman.MultiplexingConfig{
            Enabled:     true,
            Concurrency: 16,
        }},
        {"empty def", `{}`, &proxyman.MultiplexingConfig{
            Enabled:     false,
            Concurrency: 8,
        }},
        {"not enable", `{"enabled": false, "concurrency": 4}`, &proxyman.MultiplexingConfig{
            Enabled:     false,
            Concurrency: 4,
        }},
        {"forbidden", `{"enabled": false, "concurrency": -1}`, nil},
    }
    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            m := &muxcfg.MuxConfig{}
            common.Must(json.Unmarshal([]byte(tt.fields), m))
            if got := m.Build(); !reflect.DeepEqual(got, tt.want) {
                t.Errorf("MuxConfig.Build() = %v, want %v", got, tt.want)
            }
        })
    }
}