BadVPN – Blame information for rev 1
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
1 | office | 1 | include_guard "network_control_server" |
2 | |||
3 | template network_control_server { |
||
4 | alias("_arg0") socket_path; |
||
5 | alias("_arg1") template_list_port_forwardings; |
||
6 | alias("_arg2") template_add_port_forwarding; |
||
7 | alias("_arg3") template_remove_port_forwarding; |
||
8 | |||
9 | # Start request server. |
||
10 | sys.request_server({"unix", socket_path}, "network_control_server__request_handler", {}); |
||
11 | } |
||
12 | |||
13 | template network_control_server__request_handler { |
||
14 | alias("_caller") server; |
||
15 | |||
16 | value(_request.data) data; |
||
17 | |||
18 | try("network_control_server__try", {}); |
||
19 | |||
20 | _request->reply({"error", "Bad request."}); |
||
21 | _request->finish(); |
||
22 | } |
||
23 | |||
24 | template network_control_server__try { |
||
25 | alias("_caller._request") request; |
||
26 | alias("_caller.server") server; |
||
27 | alias("_caller.data") data; |
||
28 | |||
29 | val_equal(data.type, "list") a1; |
||
30 | _try->assert(a1); |
||
31 | |||
32 | num_greater_equal(data.length, "1") a2; |
||
33 | _try->assert(a2); |
||
34 | |||
35 | data->get("0") request_cmd; |
||
36 | |||
37 | val_equal(request_cmd, "list-port-forwardings") is_list_port_forwardings; |
||
38 | val_equal(request_cmd, "add-port-forwarding") is_add_port_forwarding; |
||
39 | val_equal(request_cmd, "remove-port-forwarding") is_remove_port_forwarding; |
||
40 | or(is_add_port_forwarding, is_remove_port_forwarding) is_add_remove_port_forwarding; |
||
41 | |||
42 | If (is_list_port_forwardings) { |
||
43 | num_equal(data.length, "1") a3; |
||
44 | _try->assert(a3); |
||
45 | |||
46 | call_with_caller_target(server.template_list_port_forwardings, {}, "server._caller") call; |
||
47 | request->reply({"ok", call.port_forwardings}); |
||
48 | } |
||
49 | Elif (is_add_remove_port_forwarding) { |
||
50 | num_equal(data.length, "5") a4; |
||
51 | _try->assert(a4); |
||
52 | |||
53 | data->get("1") req_protocol; |
||
54 | data->get("2") req_port_start; |
||
55 | data->get("3") req_port_end; |
||
56 | data->get("4") req_dest_addr; |
||
57 | |||
58 | val_equal(req_protocol, "tcp") is_tcp; |
||
59 | val_equal(req_protocol, "udp") is_udp; |
||
60 | or(is_tcp, is_udp) a5; |
||
61 | _try->assert(a5); |
||
62 | |||
63 | parse_number(req_port_start) port_start; |
||
64 | _try->assert(port_start.succeeded); |
||
65 | |||
66 | parse_number(req_port_end) port_end; |
||
67 | _try->assert(port_end.succeeded); |
||
68 | |||
69 | num_lesser_equal(port_start, port_end) a6; |
||
70 | _try->assert(a6); |
||
71 | |||
72 | parse_ipv4_addr(req_dest_addr) dest_addr; |
||
73 | _try->assert(dest_addr.succeeded); |
||
74 | |||
75 | If (is_add_port_forwarding) { |
||
76 | call_with_caller_target(server.template_add_port_forwarding, {req_protocol, port_start, port_end, dest_addr}, "server._caller") call; |
||
77 | If (call.succeeded) { |
||
78 | request->reply({"ok", "Port forwarding added."}); |
||
79 | } Else { |
||
80 | request->reply({"error", call.error_text}); |
||
81 | }; |
||
82 | } Else { |
||
83 | call_with_caller_target(server.template_remove_port_forwarding, {req_protocol, port_start, port_end, dest_addr}, "server._caller") call; |
||
84 | If (call.succeeded) { |
||
85 | request->reply({"ok", "Port forwarding removed."}); |
||
86 | } Else { |
||
87 | request->reply({"error", call.error_text}); |
||
88 | }; |
||
89 | }; |
||
90 | } |
||
91 | Else { |
||
92 | _try->assert("false"); |
||
93 | }; |
||
94 | |||
95 | request->finish(); |
||
96 | } |